Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
15c8b0c
Port fetch, git and time to the MCP Python SDK v2
cliffhall Oct 7, 2026
b5af226
chore: migrate the TypeScript servers to TS SDK v2 (#4856)
cliffhall Oct 7, 2026
ccab68c
docs(skills): the TypeScript servers are on SDK v2 but still legacy-e…
cliffhall Oct 7, 2026
d13408d
Serve only the legacy era from the Python servers
cliffhall Oct 7, 2026
b614ecc
fix: address Copilot round 1 on #5063
cliffhall Oct 7, 2026
019d40c
Add purpose headers and rename two tests after the SDK v2 port
cliffhall Oct 7, 2026
2ca5de7
chore(changeset): drop pending notes for the task tools #4856 removes
cliffhall Oct 7, 2026
92eca9c
chore(changeset): match the conditional-tools note to its one remaini…
cliffhall Oct 7, 2026
623a8df
Call out the unknown-method error code change from SDK v2
cliffhall Oct 7, 2026
4f39a54
fix: address Copilot round 3 on #5063
cliffhall Oct 7, 2026
701c2aa
chore(changeset): record SDK v2's 10 MiB stdio message cap (#4856)
cliffhall Oct 7, 2026
ff6d4e1
docs(everything): name the v2 transports in structure.md (#4856)
cliffhall Oct 7, 2026
6246e0f
Merge branch 'v2/main' into v2/chore/4856-ts-sdk-v2
cliffhall Oct 7, 2026
0d61612
Merge pull request #5063 from modelcontextprotocol/v2/chore/4856-ts-s…
cliffhall Oct 7, 2026
41a154d
Merge branch 'v2/main' into v2/chore/4851-python-sdk-v2
cliffhall Oct 7, 2026
0763da6
Merge pull request #5062 from modelcontextprotocol/v2/chore/4851-pyth…
cliffhall Oct 7, 2026
d0d81b1
ci: add MCP interface diff workflow for Everything server
SamMorrowDrums Jan 28, 2026
4948cdc
fix: update mcp-server-diff to v2.3.5
SamMorrowDrums Jan 28, 2026
e245576
fix: use full paths instead of working-directory
SamMorrowDrums Jan 28, 2026
9f05f49
ci: add concurrency group and fix mcp-server-diff SHA pin
inexistenzz Jun 10, 2026
124b28f
ci: post sticky PR comment with MCP diff report
inexistenzz Jun 10, 2026
afc0711
ci: also run MCP diff on TypeScript release tags
inexistenzz Jun 10, 2026
e5ca90c
ci(everything): run the interface diff as an npm script on v2/main (#…
cliffhall Oct 4, 2026
dde6224
docs: record the interface diff as a gate stage (#4860)
cliffhall Oct 4, 2026
b35e29d
ci(everything): diff a Release against the previous Release (#4860)
cliffhall Oct 4, 2026
f242458
fix(interface-diff): check out the event's SHA; report the CLI's stde…
cliffhall Oct 4, 2026
0c2a61d
fix(interface-diff): diff a Release against its own predecessor (#4860)
cliffhall Oct 4, 2026
a793ed4
fix(interface-diff): Dependabot, root tsconfig, Windows quoting (#4860)
cliffhall Oct 4, 2026
b15cf21
fix(interface-diff): give each push and release run its own group (#4…
cliffhall Oct 4, 2026
fe4cef3
fix(interface-diff): never pass a report without a verdict (#4860)
cliffhall Oct 4, 2026
ff19179
fix(interface-diff): bound the job summary; watch the Windows helper …
cliffhall Oct 4, 2026
9d7128c
fix(interface-diff): drop target_ref; keep both streams in errors (#4…
cliffhall Oct 4, 2026
6eebb0c
chore(interface-diff): refresh the lockfile after rebasing onto v2/ma…
cliffhall Oct 10, 2026
d52c223
time: accept only exact IANA timezone keys on every platform
cliffhall Oct 10, 2026
d7388c6
test(memory): expect Node 26's path-suffixed EISDIR message
cliffhall Oct 10, 2026
8efea13
Merge pull request #5077 from modelcontextprotocol/v2/fix/5060-time-c…
cliffhall Oct 10, 2026
4423f2c
Merge pull request #5078 from modelcontextprotocol/v2/fix/5076-memory…
cliffhall Oct 10, 2026
4d0fcbe
Merge branch 'v2/main' into v2/chore/4860-everything-interface-diff
cliffhall Oct 10, 2026
1a9554d
Merge pull request #4975 from modelcontextprotocol/v2/chore/4860-ever…
cliffhall Oct 10, 2026
cd34c3b
chore(deps): pin proxy-addr to ^2.0.8 (GHSA-jqcg-44mw-7w3h)
cliffhall Oct 10, 2026
916ccca
chore(deps): pin ip-address to ^10.7.1 (GHSA-mwp4-54f8-5fhr and six m…
cliffhall Oct 10, 2026
5f0b9b9
chore(deps): pin brace-expansion to ^5.0.12 (GHSA-rgw5-rvv9-x895 and …
cliffhall Oct 10, 2026
ed640a1
chore(deps): raise the hono override to >=4.13.7 (GHSA-8j4g-w8fx-2239…
cliffhall Oct 10, 2026
c88aa6d
chore(deps): raise the qs override to >=6.16.0 (GHSA-x5fp-wj9c-mxmx, …
cliffhall Oct 10, 2026
d261885
chore(deps): pin nanoid to ^3.3.18 (GHSA-2v37-7h3g-55p8)
cliffhall Oct 10, 2026
fb942ea
chore(deps): pin source-map-js to ^1.2.2 (GHSA-68fv-2mgg-jv7q)
cliffhall Oct 10, 2026
12efa9b
chore(deps): bump vitest and @vitest/coverage-v8 to ^4.1.11 (GHSA-82f…
cliffhall Oct 10, 2026
73fe328
chore(fetch): require protego>=0.6.2 (PYSEC-2026-3906)
cliffhall Oct 10, 2026
c8cee71
chore(git): require gitpython>=3.1.60 (PYSEC-2026-3783 and fourteen m…
cliffhall Oct 10, 2026
ce54c89
chore(python): lock cryptography 50 (PYSEC-2026-3552)
cliffhall Oct 10, 2026
ac259b6
chore(python): lock pyjwt 2.15 (PYSEC-2026-4140 and twelve more)
cliffhall Oct 10, 2026
ef6bffb
chore(fetch): lock urllib3 2.8 (PYSEC-2026-4175, -4176, -4177)
cliffhall Oct 10, 2026
478a08e
chore(fetch): lock soupsieve 2.10 (PYSEC-2026-4170, -4171)
cliffhall Oct 10, 2026
0c505a6
chore: fold the pending changesets into a 1.0.0 CHANGELOG entry per T…
cliffhall Oct 10, 2026
34d715a
Merge pull request #5082 from modelcontextprotocol/v2/chore/5080-rele…
cliffhall Oct 10, 2026
eb991bd
chore: credit @cliffhall without the Thanks prefix in the 1.0.0 chang…
cliffhall Oct 10, 2026
7327e89
Merge pull request #5083 from modelcontextprotocol/v2/chore/5080-type…
cliffhall Oct 10, 2026
3423e57
chore: stamp Python CalVer versions for 2026.10.10
cliffhall Oct 10, 2026
207fa99
Merge pull request #5084 from modelcontextprotocol/v2/chore/5080-pyth…
cliffhall Oct 10, 2026
211aa1e
docs(release): warn against Update branch on the milestone merge PR
cliffhall Oct 10, 2026
aa7fa78
docs(release): reset to the update merge's first parent, not origin/v…
cliffhall Oct 10, 2026
5ea217b
fix(filesystem): revoke access when a roots update leaves no valid root
cliffhall Oct 10, 2026
de49bdd
fix(filesystem): say the client exposes no valid roots, not none
cliffhall Oct 10, 2026
423fe6b
fix(filesystem): apply only the newest roots refresh's answer
cliffhall Oct 10, 2026
3e005bb
Merge pull request #5095 from modelcontextprotocol/v2/fix/5094-filesy…
cliffhall Oct 10, 2026
564e84d
fix(filesystem): keep tool calls waiting for the update that overtook…
cliffhall Oct 10, 2026
11394a4
test(filesystem): assert waiting calls are released before the initia…
cliffhall Oct 10, 2026
fc5e9c9
test(filesystem): wait for the stale initial answer before teardown
cliffhall Oct 10, 2026
c9fdf34
Merge pull request #5098 from modelcontextprotocol/v2/fix/5097-filesy…
cliffhall Oct 10, 2026
92f9558
fix(filesystem): hold tool calls while any roots refresh is pending
cliffhall Oct 10, 2026
dcaa6fe
fix(filesystem): install each roots refresh barrier before its roots/…
cliffhall Oct 10, 2026
43980dc
fix(filesystem): claim the initial roots load's generation before def…
cliffhall Oct 10, 2026
3e41913
fix(filesystem): wake calls waiting on a replaced roots refresh
cliffhall Oct 10, 2026
5429925
Merge pull request #5102 from modelcontextprotocol/v2/fix/5101-filesy…
cliffhall Oct 10, 2026
b4d3a6f
ci(release): publish with Node 24's bundled npm instead of installing…
cliffhall Oct 10, 2026
4d13264
test(release): pin the publish job's npm floor check and its no-insta…
cliffhall Oct 10, 2026
28b468e
test(release): pin the ./ tarball path npm publish needs
cliffhall Oct 10, 2026
c6f0cf7
Merge pull request #5093 from modelcontextprotocol/v2/docs/5092-relea…
cliffhall Oct 10, 2026
e718eca
Merge pull request #5105 from modelcontextprotocol/v2/chore/5104-rele…
cliffhall Oct 10, 2026
eda4646
fix(fetch): annotate the fetch tool
cliffhall Oct 10, 2026
0cfc5c7
Merge pull request #5112 from modelcontextprotocol/v2/fix/3572-fetch-…
cliffhall Oct 11, 2026
5ecca0c
Merge v2/release/1.0.0 into v2/main
cliffhall Oct 11, 2026
5b400a6
chore(changeset): restore the SDK v2 majors, drop fixes shipped in 1.0.0
cliffhall Oct 11, 2026
9245b93
Merge pull request #5118 from modelcontextprotocol/v2/chore/5117-reco…
cliffhall Oct 11, 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
5 changes: 5 additions & 0 deletions .changeset/everything-sdk-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@modelcontextprotocol/server-everything": major
---

Move to the TypeScript SDK v2 packages (`@modelcontextprotocol/server`, `@modelcontextprotocol/node`, and `@modelcontextprotocol/server-legacy` for the deprecated HTTP+SSE transport) from `@modelcontextprotocol/sdk` 1.x (#4856). The task tools `simulate-research-query`, `trigger-sampling-request-async` and `trigger-elicitation-request-async` are removed, and the server no longer advertises the `tasks` capability, because SDK v2 dropped the experimental tasks layer they were built on; they return on the tasks extension in #4852. Breaking for clients: the server now requires Node.js 20 or later; over stdio, a single incoming JSON-RPC message larger than 10 MiB now closes the connection (the SDK v2 default read-buffer cap; SDK 1.x buffered without a limit); an unknown tool name is rejected with JSON-RPC error `-32602` instead of returning an `isError` result; error messages no longer carry the `MCP error <code>: ` prefix, and input-validation messages name the field first (`field: message`); tool schemas in `tools/list` declare JSON Schema 2020-12 instead of draft-07; and tools no longer advertise `execution.taskSupport`. The optional `state` argument of `args-prompt` now carries its description.
5 changes: 5 additions & 0 deletions .changeset/filesystem-sdk-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@modelcontextprotocol/server-filesystem": major
---

Move to the TypeScript SDK v2 packages (`@modelcontextprotocol/server`) from `@modelcontextprotocol/sdk` 1.x (#4856). Breaking for clients: the server now requires Node.js 20 or later; over stdio, a single incoming JSON-RPC message larger than 10 MiB now closes the connection (the SDK v2 default read-buffer cap; SDK 1.x buffered without a limit); an unknown tool name is rejected with JSON-RPC error `-32602` instead of returning an `isError` result; error messages no longer carry the `MCP error <code>: ` prefix, and input-validation messages name the field first (`field: message`); and tools no longer advertise `execution.taskSupport`.
5 changes: 5 additions & 0 deletions .changeset/memory-sdk-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@modelcontextprotocol/server-memory": major
---

Move to the TypeScript SDK v2 packages (`@modelcontextprotocol/server`) from `@modelcontextprotocol/sdk` 1.x (#4856). Breaking for clients: the server now requires Node.js 20 or later; over stdio, a single incoming JSON-RPC message larger than 10 MiB now closes the connection (the SDK v2 default read-buffer cap; SDK 1.x buffered without a limit); an unknown tool name is rejected with JSON-RPC error `-32602` instead of returning an `isError` result; error messages no longer carry the `MCP error <code>: ` prefix, and input-validation messages name the field first (`field: message`); tool schemas in `tools/list` declare JSON Schema 2020-12 instead of draft-07; and tools no longer advertise `execution.taskSupport`.
5 changes: 5 additions & 0 deletions .changeset/sequentialthinking-sdk-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@modelcontextprotocol/server-sequential-thinking": major
---

Move to the TypeScript SDK v2 packages (`@modelcontextprotocol/server`) from `@modelcontextprotocol/sdk` 1.x (#4856). Breaking for clients: the server now requires Node.js 20 or later; over stdio, a single incoming JSON-RPC message larger than 10 MiB now closes the connection (the SDK v2 default read-buffer cap; SDK 1.x buffered without a limit); an unknown tool name is rejected with JSON-RPC error `-32602` instead of returning an `isError` result; error messages no longer carry the `MCP error <code>: ` prefix, and input-validation messages name the field first (`field: message`); tool schemas in `tools/list` declare JSON Schema 2020-12 instead of draft-07; and tools no longer advertise `execution.taskSupport`.
9 changes: 5 additions & 4 deletions .claude/skills/client-smoke/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,10 @@ CLI) or **Server Settings → Protocol Era** (the web UI):
| `modern` | Pins 2026-07-28 through `server/discover`, with no fallback |
| `auto` | Probes `server/discover`, and falls back to `initialize` |

⚠️ **Only the legacy era can be exercised against these servers today.** All
seven are on a v1 SDK (`@modelcontextprotocol/sdk` 1.x, `mcp` 1.x), whose
newest protocol version is 2025-11-25. None implements `server/discover`. So:
⚠️ **Only the legacy era can be exercised against these servers today.** The
Python servers are on `mcp` 1.x, whose newest protocol version is 2025-11-25.
The TypeScript servers are on the TS SDK v2 packages (#4856) but still serve
only the `initialize` handshake. None implements `server/discover`. So:

- `--protocol-era modern` fails, by design, with `Version negotiation failed:
the server did not offer pinned protocol version 2026-07-28 via
Expand Down Expand Up @@ -259,7 +260,7 @@ Claude Code, run this way, has no era switch and does not print the protocol
version it negotiated. `/pr-flow` asks for the LLM client in both eras as well;
where the client gives no way to choose, record the client and its version and
say that the era could not be selected, rather than labelling the run with an
era it was not shown to use. Against a v1-SDK server the connection is legacy
era it was not shown to use. Against a server without modern-era support the connection is legacy
whatever the client prefers, for the reason given under Protocol eras.

## What to write down
Expand Down
25 changes: 25 additions & 0 deletions .claude/skills/pre-push-gate/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,31 @@ of the server's stderr. Re-run a subset with
- **A new server fails `test:scripts`** with "every server directory in the
repo has a smoke entry": add it to `SERVERS` in `scripts/smoke-servers.mjs`.

### `interface-diff`

The last stage diffs the `everything` server's MCP interface (capabilities,
tools, prompts, resources, resource templates) in this checkout's build
against the same server built from the merge-base with `origin/v2/main`, and
prints the report. **A changed interface does not fail it**: the report is
what the PR's sticky comment will show, so read it, and if a change is not
one you meant, that is the finding. It fails only when the diff cannot run,
with `❌ The interface diff could not run` and the reason:

- **"origin/v2/main is not available"**: `git fetch origin v2/main`.
- **"src/everything/dist/index.js does not exist"**: you ran it on its own
before building: `npm run build -w src/everything`.
- **An `npm ci` or `npm run build` failure**: the _base_ did not install or
build. Offline with a cold npm cache is the usual cause; otherwise name a
base that builds with `npm run interface-diff -- --base <ref>`.
- **"Base server probe failed" / "Target probe failed"**: a server did not
answer the probe. A target failure is this checkout's server and is the
real defect; the smoke stage before it usually fails first.

Re-run it on its own with `npm run interface-diff` (about ten seconds). What
it compares against in CI, and why it is a script rather than an action, is
in [`docs/quality-gate.md`](../../../docs/quality-gate.md) and the header of
`scripts/interface-diff.mjs`.

## Waiting on the lease

A gate that starts with
Expand Down
18 changes: 18 additions & 0 deletions .claude/skills/release/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,24 @@ squash writes one new commit that `v2/main` does not contain, so the two
branches stop sharing history and the next milestone merge conflicts with
itself.

⚠️ **Do not click "Update branch" on the merge PR.** GitHub always offers it
here, because `main` always holds commits the merge branch lacks (its own
earlier merge commits), so it does not mean the PR is out of date. Clicking it
merges `main` into the merge branch: the PR gains a commit of its own, `main`
receives two merge commits, and the branch head is no longer the commit the
ledger names. If it was clicked, put the branch back on its head from before
the click: the update merge's **first parent**, which is the commit the ledger
verified. Not `origin/v2/main`, which may have moved on to a commit nothing has
verified. Then repeat the `git merge-tree` check above:

```sh
B="v2/chore/$N-release-$MILESTONE"
git fetch origin
UPDATE=$(git rev-parse "origin/$B")
git log -1 --format='%s' "$UPDATE" # must be "Merge branch 'main' into …"
git push --force-with-lease="$B:$UPDATE" origin "$UPDATE^1:refs/heads/$B"
```

⚠️ **Never merge `main` back into `v2/main`** to "sync" them. Everything
reaches `main` through `v2/main`, so there is nothing on `main` to bring back
except the merge commits themselves. `v2/main` ahead of `main` means a release
Expand Down
3 changes: 2 additions & 1 deletion .claude/skills/security-advisory/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ this order:
Servers listed in the README or the Registry are third-party; their reports
go to their own maintainers.
2. **Is the code path the server's, or an SDK's?** The TypeScript servers are
built on `@modelcontextprotocol/sdk`
built on the TypeScript SDK's v2 packages (`@modelcontextprotocol/server`,
`@modelcontextprotocol/node` and the frozen `@modelcontextprotocol/server-legacy`)
([typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)),
the Python servers on `mcp`
([python-sdk](https://github.com/modelcontextprotocol/python-sdk)). Transport
Expand Down
8 changes: 4 additions & 4 deletions .claude/skills/testing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ per-session setup and teardown the server needs.

| Server | Factory | Harness | `connect(…)` takes |
| --- | --- | --- | --- |
| `everything` | `createServer()` in `server/index.ts`, returns `{ server, cleanup }` | `__tests__/harness.ts` | `{ capabilities, taskStore, setup, sessionId }`, all optional |
| `everything` | `createServer()` in `server/index.ts`, returns `{ server, cleanup }` | `__tests__/harness.ts` | `{ capabilities, setup, sessionId }`, all optional |
| `filesystem` | `createServer(allowedDirectories)` in `server.ts` | `__tests__/helpers.ts` | the allowed directories, then `{ capabilities, listRoots }` |
| `memory` | `createServer(memoryFilePath)` in `index.ts` | `__tests__/helpers.ts` | the graph file's path (`makeTempGraph()` makes one) |
| `sequentialthinking` | `createServer()` in `index.ts` | `__tests__/helpers.ts` | `{ disableThoughtLogging }`, defaulting to `"true"` |
Expand All @@ -83,7 +83,7 @@ Each `connect` returns the `client` and a `close()`; call `close()` in

```ts
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
import type { Client } from "@modelcontextprotocol/client";
import { connect, contentOf, textOf, type Session } from "./harness.js";

describe("echo, over the protocol", () => {
Expand Down Expand Up @@ -123,12 +123,12 @@ What `everything`'s harness does that a hand-rolled connection would miss:
next test. `connect()` sets a fresh `sessionId` on the server transport
(`sessionId: null` keeps it undefined, as stdio does), and `close()` runs the
server's `cleanup(sessionId)`, which also stops the timers `createServer()`
starts (the roots sync, the task store).
starts (the roots sync).
- **Capabilities.** A tool `everything` registers in `registerConditionalTools`
appears only when the client declares the matching capability: pass
`capabilities` (`ALL_CAPABILITIES` declares every one), with `setup` to
install the client's handlers for the requests the server sends back
(sampling, elicitation, roots) and `taskStore` for the task-augmented ones.
(sampling, elicitation, roots).
- **Notifications.** `session.notifications` collects every notification no
specific handler consumed; `ofMethod(notifications, method)` filters it.

Expand Down
Loading
Loading