Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
c9dd35d
docs: retroactive DCO signoff for cliffhall's unsigned commits (#2617)
cliffhall Oct 7, 2026
8cbb07a
Merge branch 'v2/main' into v2/docs/2617-dco-retroactive-signoffs
cliffhall Oct 7, 2026
094847a
fix: bump open to v11 and restrict openUrl to http(s)
cliffhall Oct 19, 2026
8bee8cd
test(cli): isolate the suite's OAuth state from ~/.mcp-inspector (#2719)
cliffhall Oct 20, 2026
756318c
fix: resolve a request's Protocol entry when its send fails
cliffhall Oct 20, 2026
6fcbefe
ci: install pinned npm 11 before every dependency install
cliffhall Oct 20, 2026
b54eb82
feat(web): optional TLS for the web UI listener
cliffhall Oct 20, 2026
9365059
fix(subscriptions): stop retrying a subscriptions/listen refused over…
cliffhall Oct 20, 2026
26a1b67
fix(auth): carry a superseded namespace's client secret across a back…
cliffhall Oct 20, 2026
43afcdb
fix(web): reject empty TLS PEM files; isolate the env-reading TLS test
cliffhall Oct 20, 2026
619b620
fix: let a folded JSON-RPC error body replace a failed send's clientE…
cliffhall Oct 20, 2026
b4c352f
fix(auth): record a credential's owner when written, and harden the c…
cliffhall Oct 20, 2026
b37c6f6
fix(auth): trust the keychain's owner, stop at a failed carry, record…
cliffhall Oct 20, 2026
cde08e2
fix(auth): record owners only for held values, and skip ambiguous han…
cliffhall Oct 20, 2026
f9ae106
Merge pull request #2728 from modelcontextprotocol/v2/fix/2719-cli-te…
cliffhall Oct 20, 2026
455a1c1
Merge pull request #2733 from modelcontextprotocol/v2/fix/2721-protoc…
cliffhall Oct 20, 2026
57ee659
docs: retroactive DCO signoff for olaservo's unsigned commits (#2617)
olaservo Oct 20, 2026
17993dd
fix(auth): carry once per namespace before purging any location it co…
cliffhall Oct 20, 2026
8c5ef64
Merge pull request #2730 from modelcontextprotocol/v2/fix/2722-listen…
cliffhall Oct 20, 2026
e5479fe
Merge pull request #2732 from modelcontextprotocol/v2/feat/2446-web-tls
cliffhall Oct 20, 2026
44a41d2
Merge pull request #2729 from modelcontextprotocol/v2/chore/2715-ci-n…
cliffhall Oct 20, 2026
d0714d5
Merge pull request #2731 from modelcontextprotocol/v2/fix/2672-carry-…
cliffhall Oct 20, 2026
24952c5
fix(auth): carry a client credential only for the client its store st…
cliffhall Oct 20, 2026
d43559b
test(tui): pin MCP_INSPECTOR_LOG_DIR to a per-file temp dir
cliffhall Oct 20, 2026
a781eb3
ci: scan v2/main with a committed CodeQL advanced-setup workflow
cliffhall Oct 20, 2026
b089515
fix(ema): allow a public resource-AS client in leg 3
cliffhall Oct 20, 2026
b24f44c
Merge pull request #2735 from modelcontextprotocol/v2/fix/2723-tui-te…
cliffhall Oct 20, 2026
c640056
feat(core): recognize HTTP 429 and surface the server's Retry-After
cliffhall Oct 20, 2026
5642739
Merge pull request #2736 from modelcontextprotocol/v2/fix/2725-ema-pu…
cliffhall Oct 20, 2026
1a536d0
fix(oauth): refresh an expired token behind an insufficient_scope cha…
cliffhall Oct 20, 2026
ea35ae3
fix(core): correlate each 429's Retry-After by JSON-RPC id, not by time
cliffhall Oct 20, 2026
9285a96
fix(auth): write a carried credential's stamp before its value
cliffhall Oct 20, 2026
f7e0377
fix: open the URL that was checked, not the raw input
cliffhall Oct 20, 2026
fa11e43
Merge pull request #2741 from modelcontextprotocol/v2/chore/2545-code…
cliffhall Oct 20, 2026
0934e38
fix(oauth): judge step-up refresh coverage against persisted scope
cliffhall Oct 20, 2026
3fbf2a9
fix(auth): key in-flight PKCE verifiers by flow, not server URL
cliffhall Oct 20, 2026
36e251c
Merge pull request #2618 from modelcontextprotocol/v2/docs/2617-dco-r…
cliffhall Oct 20, 2026
4c02f4b
fix(core): annotate 429s on the raw-wire path; reject impossible dates
cliffhall Oct 20, 2026
3fd5b5b
test(auth): keep one storage area in the cross-server flow-store test
cliffhall Oct 20, 2026
fd82b10
Merge pull request #2738 from modelcontextprotocol/v2/fix/2724-insuff…
cliffhall Oct 20, 2026
95ea670
Merge pull request #2737 from modelcontextprotocol/v2/feat/2442-rate-…
cliffhall Oct 20, 2026
844a14d
Merge branch 'v2/main' into v2/fix/2726-per-flow-pkce-verifier
cliffhall Oct 20, 2026
15de439
fix(auth): bind an owner stamp with an HMAC keyed by the credential
cliffhall Oct 20, 2026
25e5a26
feat(cli): add --load mode for load-testing a tool
cliffhall Oct 20, 2026
c136514
Merge pull request #2742 from modelcontextprotocol/v2/fix/2726-per-fl…
cliffhall Oct 20, 2026
9649799
fix(cli): drop missed --load-rate slots and recheck the deadline afte…
cliffhall Oct 20, 2026
1b4d4ec
Merge pull request #2739 from modelcontextprotocol/v2/fix/2734-handof…
cliffhall Oct 20, 2026
bc6db3e
fix(cli): claim a --load-rate slot only after waking
cliffhall Oct 20, 2026
4e13034
fix(cli): one timer per --load-rate slot, and hold the average rate
cliffhall Oct 20, 2026
721d314
fix(skills): require ttlMs and cacheScope on modern resources/directo…
olaservo Oct 20, 2026
3e06c0c
Merge pull request #2743 from modelcontextprotocol/v2/feat/2439-cli-l…
cliffhall Oct 20, 2026
fefe074
Merge pull request #2747 from modelcontextprotocol/v2/fix/2740-direct…
olaservo Oct 20, 2026
1239983
fix(web): validate the Host header on the production web server
cliffhall Oct 21, 2026
4c31c6b
fix(web): restrict Host names to hostname characters, punycode allowe…
cliffhall Oct 21, 2026
3d701a0
fix(web): cap the /api/fetch response body
cliffhall Oct 21, 2026
53d1c62
fix(web): relay an error status whose /api/fetch body is over the cap
cliffhall Oct 21, 2026
28eda4c
docs(web): state the IP forms the Host allow-list accepts
cliffhall Oct 21, 2026
73f3cf8
Merge commit from fork
cliffhall Oct 21, 2026
8d74f7a
Merge commit from fork
cliffhall Oct 21, 2026
4862b74
Merge commit from fork
cliffhall Oct 21, 2026
51c7ffe
chore: bump version to 2.12.0
cliffhall Oct 21, 2026
7e20e38
Merge pull request #2763 from modelcontextprotocol/v2/chore/2762-bump…
cliffhall Oct 21, 2026
b861af2
chore: merge v2/main into main for the v2.12.0 release
cliffhall Oct 21, 2026
9edc173
fix(cli): link https in --print-handoff when the web UI is served ove…
cliffhall Oct 21, 2026
cbb3c65
fix(web): drop the dropped body's framing headers from an oversize er…
cliffhall Oct 21, 2026
20287a6
Merge pull request #2773 from modelcontextprotocol/v2/fix/2770-handof…
cliffhall Oct 21, 2026
360f3c6
Merge pull request #2774 from modelcontextprotocol/v2/fix/2771-oversi…
cliffhall Oct 21, 2026
bd7e9c7
chore: merge v2/main into the v2.12.0 milestone merge (#2770, #2771)
cliffhall Oct 21, 2026
3a174cb
fix(mcpdo): give resources/directory/read a URI and a cursor
cliffhall Oct 21, 2026
63c5a06
Merge pull request #2775 from modelcontextprotocol/v2/fix/2767-mcpdo-…
cliffhall Oct 21, 2026
c2834cb
chore: merge v2/main into the v2.12.0 milestone merge (#2767)
cliffhall Oct 21, 2026
6b108c3
fix(core): keep the connection up when a request POST is HTTP-refused
cliffhall Oct 21, 2026
3cdde6c
Merge pull request #2777 from modelcontextprotocol/v2/fix/2776-listen…
cliffhall Oct 21, 2026
50c0b25
chore: merge v2/main into the v2.12.0 milestone merge (#2776)
cliffhall Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# CodeQL code scanning, as an advanced-setup workflow (#2545).
#
# Replaces CodeQL DEFAULT setup, which analyzes only the default branch
# (`main`) and PRs into it. We develop on `v2/main` and reach `main` only by
# milestone merge, so under default setup no v2 work was scanned until the
# release PR: the v2.9.0 ReDoS (#2540) surfaced on the milestone-merge PR and
# held the release, when it should have landed on the PR that introduced it.
#
# Same languages (`actions`, `javascript-typescript`) and the same default
# query suite as default setup had; what changes is only which refs run.
#
# - `push` to `main` and `v2/main` — the baseline each branch's alerts are
# tracked against.
# - `pull_request` into `main` and `v2/main` — a finding lands on the PR
# that introduced it. Runs from the PR's own ref, so this file is live the
# moment it is on `v2/main`, as `dco.yml` is.
# - the weekly `schedule`, which GitHub runs from the DEFAULT branch only —
# so it starts once a milestone merge carries this file to `main`.
#
# ⚠️ Default setup must be OFF (a repository setting — Settings → Code
# security → CodeQL analysis — not a file). GitHub refuses an advanced-setup
# upload while it is on, and with both on the two would double-report.
#
# `security-events: write` is the scope that uploads results — and therefore
# the scope that could suppress them — so `verify:action-pins` counts this job
# as credentialed and every action it runs is SHA-pinned (#2484). Pins are
# resolved with `npm run action:resolve-pin`.
name: CodeQL

on:
push:
branches: [main, v2/main]
pull_request:
branches: [main, v2/main]
schedule:
- cron: "23 16 * * 6" # 16:23 UTC Saturday, default setup's old slot

permissions:
contents: read

jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
# A newer push to the same PR or branch supersedes the analysis.
concurrency:
group: codeql-${{ github.ref }}-${{ matrix.language }}
cancel-in-progress: true
# Observed under default setup over 30 runs (2026-09-02 – 2026-10-17):
# `actions` ~40s, `javascript-typescript` 1.5–4.7 min. Twice the slowest,
# rounded up to the next five minutes (#2333).
timeout-minutes: 10
permissions:
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [actions, javascript-typescript]

steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Initialize CodeQL
uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
languages: ${{ matrix.language }}
# Neither language needs a build; this is what default setup used.
build-mode: none

- name: Analyze
uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
category: "/language:${{ matrix.language }}"
7 changes: 7 additions & 0 deletions .github/workflows/dependency-refresh.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ jobs:
node-version: '22.x'
cache: 'npm'

- name: Install the pinned npm CLI (allowScripts needs >= 11.19)
# Node 22's bundled npm 10.x ignores each install's `allowScripts`, so
# the install below would still run the denied esbuild/fsevents
# scripts (#2715). Keep this version equal to CI_NPM_VERSION in
# main.yml, which states the full reasoning.
run: npm install -g --ignore-scripts [email protected]

- name: Install dependencies (root + all clients)
run: npm install

Expand Down
34 changes: 32 additions & 2 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,23 @@ concurrency:
group: ${{ github.event_name == 'release' && 'release-npm' || format('run-{0}', github.run_id) }}
cancel-in-progress: false

# The npm the jobs below install before running npm, pinned EXACTLY and
# stated once (#2715). Node 22's bundled npm is 10.x, and two things here
# need 11.x: `publish`'s OIDC
# trusted publishing (>= 11.5.1, #2483) and the `allowScripts` denials in each
# install's package.json (>= 11.19, #2712) — npm 10 ignores that field, so on
# the bundled npm CI would still run the `esbuild` and `fsevents` install
# scripts the review decided against. (`verify:install-scripts` reads the
# lockfiles, so it enforces the DECISION on any npm; only npm >= 11.19 does
# the BLOCKING.) Exact rather than a range for the reason `publish` gives: a
# range would let whatever 11.x is current into `package`, which builds what
# the credentialed job ships (#2484). Every job that installs dependencies
# installs this npm first, with `--ignore-scripts` so even npm's own lifecycle
# scripts stay out. Bump deliberately, here and in dependency-refresh.yml
# together; stay on 11.x until 12's Node floor is checked against Node 22.
env:
CI_NPM_VERSION: '11.20.0'

# The `package`, `publish` and `publish-github-container-registry` jobs pin
# every action to a commit SHA with a `# vX.Y.Z` comment; `build` and
# `coverage` stay on moving major tags (#2235). A job holding a credential — or
Expand Down Expand Up @@ -70,6 +87,10 @@ jobs:
node-version: '22.x'
cache: 'npm'

- name: Install the pinned npm CLI (allowScripts needs >= 11.19)
# See CI_NPM_VERSION at the top of this file (#2715).
run: npm install -g --ignore-scripts "npm@$CI_NPM_VERSION"

- name: Install dependencies (root + all clients)
# The root postinstall (scripts/install-clients.mjs) cascades
# `npm install` into clients/web, clients/cli, clients/tui, and
Expand Down Expand Up @@ -203,6 +224,10 @@ jobs:
node-version: '22.x'
cache: 'npm'

- name: Install the pinned npm CLI (allowScripts needs >= 11.19)
# See CI_NPM_VERSION at the top of this file (#2715).
run: npm install -g --ignore-scripts "npm@$CI_NPM_VERSION"

- name: Install dependencies (root + all clients)
run: npm install

Expand Down Expand Up @@ -260,6 +285,10 @@ jobs:
node-version: '22.x'
cache: 'npm'

- name: Install the pinned npm CLI (allowScripts needs >= 11.19)
# See CI_NPM_VERSION at the top of this file (#2715).
run: npm install -g --ignore-scripts "npm@$CI_NPM_VERSION"

- name: Assert release tag matches package version
# `npm publish` ships whatever `version` is in the root package.json,
# regardless of the release's tag. Fail fast (before the heavy install /
Expand Down Expand Up @@ -355,9 +384,10 @@ jobs:
# holds `id-token: write`, so it is the one package this job trusts, and
# a range would let whatever 11.x is current at release time into it.
# `--ignore-scripts` keeps even that package's lifecycle scripts out.
# Bump deliberately; stay on 11.x until 12's Node floor is checked.
# The version is CI_NPM_VERSION at the top of this file, shared with
# every job that installs dependencies (#2715) — bump it there.
- name: Install the pinned npm CLI (OIDC trusted publishing)
run: npm install -g --ignore-scripts npm@11.20.0
run: npm install -g --ignore-scripts "npm@$CI_NPM_VERSION"

- name: Download the tarball built by the package job
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,15 @@ Each client has its own README with client-specific detail:
| [Writing a skill](./docs/skill-authoring.md) | How to write a skill description that actually fires, and eval cases that measure it — the case shapes that work, and the tuning loop |
| [Test servers](./docs/test-servers.md) | The composable test servers and the showcase config for every feature — what to run, what to click, and what the broken build did |
| [Publishing](./docs/publishing.md) | What ships in the tarball, the packaging invariants, and `pack:verify` |
| [Serving the web UI over HTTPS](./docs/tls.md) | `INSPECTOR_TLS_KEY_PATH` / `INSPECTOR_TLS_CERT_PATH`, a trusted local mkcert setup, custom hostnames and `ALLOWED_ORIGINS`, and `NODE_EXTRA_CA_CERTS` for outbound private-CA servers |
| [Docker](./docs/docker.md) | Running the container image — ports, volumes, and making secrets durable in a container |
| [Where secrets are stored](./docs/secret-storage.md) | How the secret store is chosen on every runtime — OS keychain, `secrets.json` or memory — plus file encryption, locking, and moving back to a keychain |
| [Migrating from v1 to v2](./docs/v1-to-v2-migration.md) | CLI flag mapping, `--config` vs. `--catalog`, the Node engine bump, env-var renames |
| [Environment variables](./docs/environment-variables.md) | Every variable that changes runtime behavior — auth, ports, storage, the secret store, logging, proxies — plus the Node TLS variables for a self-signed server |
| [MCP server configuration](./docs/mcp-server-configuration.md) | Which server(s) the Inspector connects to, and the config file format |
| [Reviewing an MCP App](./docs/mcp-app-review.md) | The CLI-first → one-shot-web recipe for automated App-tool review |
| [Smoke-testing an MCP server](./docs/cli-smoke-testing.md) | The connect → list → call → assert workflow for a shell or CI job: `--format json` + `jq`, the exit-code map, and keeping OAuth non-interactive |
| [Retroactive DCO signoffs](./docs/dco-retroactive-signoffs.md) | The ten commits that merged without a `Signed-off-by:` while no DCO check ran, and each author's signed-off certification of them |
| [Launcher and config consolidation](./docs/launcher-config-consolidation-plan.md) | Why the launcher runs a client in-process rather than spawning it |
| [Roadmap, Aug 2026 → Feb 2027](./docs/inspector-roadmap-2026-h2.md) | The six-month plan: spec-following work aligned to the published MCP roadmap, official extension support, and the experience work we choose |
| [MCP Inspector: Our AI Software Factory](./docs/ai-software-factory.md) | How contributions actually happen since v2.0.0 — issue-driven work end to end, the rules/skills split, the sweeps that replaced Dependabot, the quality gate, and where it's headed |
Expand Down
Loading
Loading