Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
406 commits
Select commit Hold shift + click to select a range
2daa141
test(everything): mark the tests that pin known bugs
cliffhall Oct 4, 2026
004608f
test(everything): cite the newly filed issues in KNOWN BUG markers
cliffhall Oct 4, 2026
f149a2a
ci(coverage): enforce the TypeScript per-file coverage gate in CI and…
cliffhall Oct 4, 2026
0223d22
docs(project-structure): describe the createServer() factories the se…
cliffhall Oct 4, 2026
f227824
docs(testing): match the harness text to the four server PRs as merged
cliffhall Oct 4, 2026
0645252
docs(testing): the KNOWN BUG marker for tests that pin a bug
cliffhall Oct 4, 2026
fc478d1
Merge pull request #4969 from modelcontextprotocol/v2/chore/4854-ts-c…
cliffhall Oct 4, 2026
02740b3
test(fetch): drive serve() through the protocol and reach 100% coverage
cliffhall Oct 4, 2026
bf2f167
test(fetch): wire-level isError, bounded pagination walk, proxy-free …
cliffhall Oct 4, 2026
7d381c7
docs(fetch): purpose headers for new test files; coverage target wording
cliffhall Oct 4, 2026
cd22b5c
test(fetch): mark the tests that pin known bugs
cliffhall Oct 4, 2026
281257c
test(fetch): cite the newly filed issues in KNOWN BUG markers
cliffhall Oct 4, 2026
0cc1baf
test(git): close the fixture repository before removing it
cliffhall Oct 4, 2026
8170cb6
refactor(git): remove the unreachable list_repos helper
cliffhall Oct 4, 2026
5ac07dc
test(git): characterize serve() through the protocol, gate coverage p…
cliffhall Oct 4, 2026
2b4df17
test(git): mark the tests that pin known bugs
cliffhall Oct 4, 2026
908a530
test(git): cite the newly filed issues in KNOWN BUG markers
cliffhall Oct 4, 2026
86042c1
test(time): characterize serve() through the protocol, per-file coverage
cliffhall Oct 4, 2026
003618a
docs(testing): describe time's in-process harness and coverage command
cliffhall Oct 4, 2026
d8938ed
test(time): mark the tests that pin known bugs
cliffhall Oct 4, 2026
d051608
test(time): cite the newly filed issues in KNOWN BUG markers
cliffhall Oct 4, 2026
1cdd4a7
chore(python): per-file coverage gate in CI and local:gate
cliffhall Oct 4, 2026
f9a66a7
docs(project-structure): tests/ in every Python server, coverage conf…
cliffhall Oct 4, 2026
38f9e6d
fix(coverage-py): refuse a report measured without branch coverage
cliffhall Oct 4, 2026
571e2b3
Merge pull request #4976 from modelcontextprotocol/v2/chore/4855-py-c…
cliffhall Oct 4, 2026
342a3fa
fix(everything): scope session resources to server
Tiancheng-Xu Sep 15, 2026
da7f05d
fix(everything): keep server instructions in step with capability-gat…
aton-of-data Sep 21, 2026
d4fb2f4
test(everything): assert per-session resources for #4808, drop KNOWN …
cliffhall Oct 4, 2026
131d912
fix(everything): replay streamable HTTP events by stream
cyphercodes May 4, 2026
63dc92f
fix(everything): label dynamic blob resources application/octet-stream
cliffhall Oct 4, 2026
1b01ea6
fix(memory): preserve memory file permissions across atomic save
BlueX888 Sep 19, 2026
6bed4c5
fix(everything): gate trigger-elicitation-request on form-mode elicit…
cliffhall Oct 4, 2026
8ea5e05
fix(everything): keep async task tools within their client task
cliffhall Oct 4, 2026
dbd1b2e
fix(everything): Streamable HTTP 404 for unknown sessions, close sess…
cliffhall Oct 4, 2026
9112039
fix(memory): report entities that create_entities skipped
yotambraun Sep 28, 2026
6619ca8
docs(everything): note the event store module and the 404 for unknown…
cliffhall Oct 4, 2026
fd4dff7
fix(filesystem): admit paths under a UNC share root allowed directory
cliffhall Oct 4, 2026
819ae90
fix(memory): refuse a read-only graph file and set the mode before th…
cliffhall Oct 4, 2026
215fd76
fix(memory): keep unreadable lines when saving the graph
yotambraun Sep 28, 2026
2b1305f
test(memory): assert unreadable lines survive the next write (#4885)
cliffhall Oct 4, 2026
bb8aa6f
fix(memory): say in create_entities' description that existing names …
cliffhall Oct 4, 2026
f621c75
fix(filesystem): resolve paths that differ from disk only in Unicode …
cliffhall Oct 4, 2026
d95dd2f
fix(filesystem): keep line endings and indentation in edit_file
cliffhall Oct 4, 2026
4731e3b
fix(sequentialthinking): no "undefined" in log headers, border sized …
cliffhall Oct 4, 2026
b5c5ccc
fix(sequentialthinking): accept any branchId and leave state unchange…
cliffhall Oct 4, 2026
f7af617
fix(everything): answer unknown and duplicate SSE sessions
cliffhall Oct 4, 2026
8a4139c
fix(sequentialthinking): set readOnlyHint/idempotentHint to false
cliffhall Oct 4, 2026
d8ebdbe
docs(filesystem): changeset and README note for edit_file line ending…
cliffhall Oct 4, 2026
63ddfd7
fix(fetch): reject unknown tool and prompt names
cliffhall Oct 4, 2026
62407ee
fix(fetch): emit inclusive minimum/maximum for max_length (#1624)
cliffhall Oct 4, 2026
4721f93
fix(fetch): report an empty page without Node as a simplification fai…
cliffhall Oct 4, 2026
bc52d0e
chore(sequentialthinking): add a patch changeset for the thought log fix
cliffhall Oct 4, 2026
38166ee
fix(fetch,git,time): report the package version in serverInfo
cliffhall Oct 4, 2026
6df2727
test(git): cover git_show with blob and tree object specs
jayzhou2309 Sep 27, 2026
15eabc8
fix(git): show blobs and trees for object specs in git_show
jayzhou2309 Sep 27, 2026
9121b98
fix(git): report a detached HEAD from git_checkout
CryoThrust Sep 15, 2026
0cb2630
test(git): pin non-branch checkout revisions the reply must not call …
CryoThrust Sep 16, 2026
c0be919
fix(time): report an empty convert_time timezone as a missing argument
cliffhall Oct 4, 2026
7dc802f
fix(filesystem): overwrite existing files in place (#4512, #3199)
cliffhall Oct 4, 2026
6bc2f92
test(git): assert git_checkout reports a detached HEAD (#4804)
cliffhall Oct 4, 2026
b259074
fix(fetch): support SOCKS proxies and report bad proxy settings as to…
cliffhall Oct 4, 2026
a25a409
fix(git): report unknown branch_type and existing branch names as errors
cliffhall Oct 4, 2026
2309e08
fix(filesystem): wait for initial roots; fail visibly with no directo…
cliffhall Oct 4, 2026
cb2cd0d
fix(git): refuse to commit when nothing is staged (#4762)
cliffhall Oct 4, 2026
315ad50
fix(fetch): refuse private, loopback and metadata addresses by defaul…
cliffhall Oct 4, 2026
c998563
fix(git): report unknown tools and flag-injection rejections as written
cliffhall Oct 4, 2026
7be08e9
fix(memory): lock the graph file across processes for each mutation (…
cliffhall Oct 4, 2026
7bcb802
fix(time): reject a nonexistent local time in convert_time
cliffhall Oct 4, 2026
b09395c
fix(git): stop reporting staged files when nothing was staged (#4763)
cliffhall Oct 4, 2026
529e8f1
fix(everything): keep the gated-tools section short enough to arrive …
cliffhall Oct 4, 2026
01075ca
fix(git): resolve --repository to the repo root; log a missing path
cliffhall Oct 4, 2026
9a81d42
fix(git): print git_show in git's format and decode non-UTF-8 patches
cliffhall Oct 4, 2026
5c04d74
fix(filesystem): declare JSON Schema 2020-12 on every tool schema (#4…
cliffhall Oct 4, 2026
2189a3d
fix(time): exit with one line on an invalid --local-timezone (#5001)
cliffhall Oct 4, 2026
5fef755
docs(git): note git_commit's merge exception in the README
cliffhall Oct 4, 2026
8de1add
test(memory): put create-reporting.test.ts's purpose header above its…
cliffhall Oct 4, 2026
4e24322
Merge remote-tracking branch 'origin/v2/fix/1970-filesystem-unicode-p…
cliffhall Oct 4, 2026
5d9242e
Merge remote-tracking branch 'origin/v2/fix/3527-filesystem-unc-paths…
cliffhall Oct 4, 2026
801a2c3
Merge remote-tracking branch 'origin/v2/fix/4512-filesystem-in-place-…
cliffhall Oct 4, 2026
e21b233
Merge remote-tracking branch 'origin/v2/fix/4991-filesystem-edit-line…
cliffhall Oct 4, 2026
5a9b1a8
Merge remote-tracking branch 'origin/v2/fix/3204-filesystem-initial-r…
cliffhall Oct 4, 2026
7a24a11
docs(sequentialthinking): say branch state changes only on branch calls
cliffhall Oct 4, 2026
03bc908
Merge branch 'v2/fix/4841-filesystem-schema-dialect' into v2/fix/5004…
cliffhall Oct 4, 2026
c584a4d
fix(smoke): start fetch with --allow-private-ips for its loopback pag…
cliffhall Oct 4, 2026
463c402
fix(memory): create the temp graph file with the preserved mode
cliffhall Oct 4, 2026
43b8a1c
test(memory): cast the replaced-lock readFile mock through unknown
cliffhall Oct 4, 2026
7d82461
fix(everything): measure the elicitation poll deadline monotonically
cliffhall Oct 5, 2026
fd00af1
fix(time): neutral wording for a skipped local time
cliffhall Oct 5, 2026
8602098
test(git): compare git_show blob output with the file's raw bytes
cliffhall Oct 5, 2026
6a36cac
fix(everything): event store rejects an unknown id; kebab-case module…
cliffhall Oct 5, 2026
6af4d0d
fix(fetch): list special-purpose ranges explicitly, not only via is_g…
cliffhall Oct 5, 2026
91ced1e
docs(fetch): name the special-purpose ranges the guard refuses (#4838)
cliffhall Oct 5, 2026
63c1d4d
fix(sequentialthinking): write the log box before recording the thought
cliffhall Oct 5, 2026
fc7a9be
fix(memory): refresh a held lock and remove one that failed to initia…
cliffhall Oct 5, 2026
eba9588
fix(everything): take a refused POST's id only from a JSON-RPC request
cliffhall Oct 5, 2026
ffb7a76
fix(git): compare head names in git_create_branch's existence check
cliffhall Oct 5, 2026
3140924
docs(everything): say the request-id body cap counts bytes
cliffhall Oct 5, 2026
67b744a
fix(fetch): add 6to4 2002::/16 to the explicit non-public ranges (#4838)
cliffhall Oct 5, 2026
4ddd6ce
fix(memory): serialize stale-lock breaking behind a guard file
cliffhall Oct 5, 2026
52545ee
docs(memory): mention the stale-lock breaking guard file
cliffhall Oct 5, 2026
89334d4
fix(fetch): allow the global exceptions inside refused special-purpos…
cliffhall Oct 5, 2026
8c2cedb
fix(everything): keep an elicitation task's status message from creation
cliffhall Oct 5, 2026
59f5661
fix(everything): gate trigger-elicitation-request-async on form-mode …
cliffhall Oct 5, 2026
88ae87f
fix(everything): justify the new partial-mock casts; align task docs
cliffhall Oct 5, 2026
aa67a7a
chore(ci): run the test suites on Windows runners (#1149)
cliffhall Oct 5, 2026
0dbc48f
test: make the filesystem and git suites pass on Windows (#1149)
cliffhall Oct 5, 2026
4393f9b
test(git): write LF fixtures with newline="\n" so Windows keeps LF (#…
cliffhall Oct 5, 2026
e0bf956
fix(filesystem): reindent across tab and space styles by level (#4990)
cliffhall Oct 5, 2026
b3310ab
docs(filesystem): read-only files are refused by the in-place write (…
cliffhall Oct 5, 2026
499f3e5
Merge pull request #5009 from modelcontextprotocol/v2/fix/1970-filesy…
cliffhall Oct 5, 2026
0f1bdac
Merge pull request #5010 from modelcontextprotocol/v2/fix/3527-filesy…
cliffhall Oct 5, 2026
6df46d9
Merge pull request #5025 from modelcontextprotocol/v2/fix/3204-filesy…
cliffhall Oct 5, 2026
f6f23d3
Merge pull request #5030 from modelcontextprotocol/v2/fix/4841-filesy…
cliffhall Oct 5, 2026
8decb40
Merge pull request #5022 from modelcontextprotocol/v2/fix/4512-filesy…
cliffhall Oct 5, 2026
59da46e
Merge remote-tracking branch 'origin/v2/main' into v2/fix/4991-filesy…
cliffhall Oct 5, 2026
87a395a
Merge pull request #5011 from modelcontextprotocol/v2/fix/4991-filesy…
cliffhall Oct 5, 2026
57d37ac
Merge remote-tracking branch 'origin/v2/main' into v2/chore/1149-wind…
cliffhall Oct 5, 2026
acfbdd3
Merge pull request #5047 from modelcontextprotocol/v2/chore/1149-wind…
cliffhall Oct 5, 2026
539346a
Merge pull request #5005 from modelcontextprotocol/v2/fix/4984-everyt…
cliffhall Oct 5, 2026
c2f796b
Merge pull request #5020 from modelcontextprotocol/v2/fix/4981-everyt…
cliffhall Oct 5, 2026
8696907
Merge pull request #5032 from modelcontextprotocol/v2/fix/4808-everyt…
cliffhall Oct 5, 2026
2ffc55c
Merge pull request #5034 from modelcontextprotocol/v2/fix/4792-everyt…
cliffhall Oct 5, 2026
0c98518
Merge pull request #5014 from modelcontextprotocol/v2/fix/4986-everyt…
cliffhall Oct 5, 2026
90f85b7
Merge pull request #5006 from modelcontextprotocol/v2/fix/4087-everyt…
cliffhall Oct 5, 2026
bfe912b
Merge origin/v2/main into v2/fix/4887-memory-report-skipped-entities
cliffhall Oct 5, 2026
253fd97
Merge origin/v2/main into v2/fix/4885-memory-keep-unreadable-lines
cliffhall Oct 5, 2026
ca465a1
Merge origin/v2/main into v2/fix/4797-memory-cross-process-lock
cliffhall Oct 5, 2026
59a1ff0
Merge origin/v2/main into v2/fix/4827-memory-preserve-file-mode
cliffhall Oct 5, 2026
272d7f6
Merge pull request #5035 from modelcontextprotocol/v2/fix/4885-memory…
cliffhall Oct 5, 2026
1520a8b
Merge pull request #5008 from modelcontextprotocol/v2/fix/4887-memory…
cliffhall Oct 5, 2026
072505d
Merge origin/v2/main into v2/fix/4797-memory-cross-process-lock
cliffhall Oct 5, 2026
68ed229
ci: run Python and TypeScript workflows on push only (#5048)
cliffhall Oct 5, 2026
a6c2682
fix(memory): wait on a lock file Windows is still deleting (#4797)
cliffhall Oct 5, 2026
06e6bf9
fix(memory): treat only EPERM as a lock being deleted on Windows
cliffhall Oct 5, 2026
786fd24
Merge pull request #5037 from modelcontextprotocol/v2/fix/4797-memory…
cliffhall Oct 5, 2026
b477346
Merge origin/v2/main into v2/fix/4827-memory-preserve-file-mode
cliffhall Oct 5, 2026
382aff5
test(memory): drop the known-bug note from persistence.test.ts's header
cliffhall Oct 5, 2026
15563b3
Merge pull request #5013 from modelcontextprotocol/v2/fix/4827-memory…
cliffhall Oct 5, 2026
05c3d67
Merge pull request #5015 from modelcontextprotocol/v2/fix/4721-sequen…
cliffhall Oct 5, 2026
568cdea
Merge pull request #5036 from modelcontextprotocol/v2/fix/4813-sequen…
cliffhall Oct 5, 2026
b556150
Merge pull request #5031 from modelcontextprotocol/v2/fix/5000-sequen…
cliffhall Oct 5, 2026
ba61613
Merge pull request #5019 from modelcontextprotocol/v2/fix/360-python-…
cliffhall Oct 5, 2026
11bd9c8
Merge pull request #5017 from modelcontextprotocol/v2/fix/1624-fetch-…
cliffhall Oct 5, 2026
e0c54ef
Merge pull request #5016 from modelcontextprotocol/v2/fix/4988-fetch-…
cliffhall Oct 5, 2026
9acf431
Merge pull request #5018 from modelcontextprotocol/v2/fix/4989-fetch-…
cliffhall Oct 5, 2026
36f57bc
Merge origin/v2/main into v2/fix/767-fetch-socks-proxy
cliffhall Oct 5, 2026
8def287
Merge pull request #5049 from modelcontextprotocol/v2/chore/5048-ci-p…
cliffhall Oct 5, 2026
08314e7
Merge pull request #5024 from modelcontextprotocol/v2/fix/767-fetch-s…
cliffhall Oct 5, 2026
e577bb0
Merge origin/v2/main into v2/fix/4838-fetch-ssrf-guard
cliffhall Oct 5, 2026
a837007
Merge pull request #5033 from modelcontextprotocol/v2/fix/4838-fetch-…
cliffhall Oct 5, 2026
d3b2af9
fix(git): conclude a merge in git_commit with both parents (#5012)
cliffhall Oct 5, 2026
0e729d3
Merge pull request #5007 from modelcontextprotocol/v2/fix/4762-git-co…
cliffhall Oct 5, 2026
9dc29d1
Merge pull request #5023 from modelcontextprotocol/v2/fix/4804-git-ch…
cliffhall Oct 5, 2026
b39888c
Merge pull request #5026 from modelcontextprotocol/v2/fix/4995-git-br…
cliffhall Oct 5, 2026
2afe47e
Merge pull request #5029 from modelcontextprotocol/v2/fix/4998-git-sh…
cliffhall Oct 5, 2026
608a365
Merge pull request #5039 from modelcontextprotocol/v2/fix/4993-git-re…
cliffhall Oct 5, 2026
74c0c6f
Merge remote-tracking branch 'origin/v2/main' into HEAD
cliffhall Oct 5, 2026
0e51df4
Merge pull request #5038 from modelcontextprotocol/v2/fix/4999-git-er…
cliffhall Oct 5, 2026
73db339
Merge remote-tracking branch 'origin/v2/main' into v2/fix/5001-time-i…
cliffhall Oct 5, 2026
8b2d58b
Merge remote-tracking branch 'origin/v2/main' into v2/fix/5002-time-n…
cliffhall Oct 5, 2026
b9afbfb
Merge remote-tracking branch 'origin/v2/main' into v2/fix/5003-time-e…
cliffhall Oct 5, 2026
be004b1
Merge pull request #5027 from modelcontextprotocol/v2/fix/5001-time-i…
cliffhall Oct 5, 2026
953290e
Merge pull request #5028 from modelcontextprotocol/v2/fix/5002-time-n…
cliffhall Oct 5, 2026
b0d865d
Merge pull request #5021 from modelcontextprotocol/v2/fix/5003-time-e…
cliffhall Oct 5, 2026
fc1307d
docs(agents): state the dep-lockstep rule the guard enforces
cliffhall Oct 5, 2026
35becbd
fix(git): reapply a merge autostash when git_commit concludes a merge
cliffhall Oct 5, 2026
4daf4a7
fix(scripts): verify:action-pins matches contexts and job ids case-in…
cliffhall Oct 5, 2026
c63255a
chore(everything): keep compiled tests and vitest config out of dist
cliffhall Oct 5, 2026
45d059d
Add a DCO signoff check to CI and the gate (#4919)
cliffhall Oct 5, 2026
988aa91
verify-dco: read signoffs from git's trailer block, not the whole mes…
cliffhall Oct 5, 2026
f6f3686
Merge pull request #5051 from modelcontextprotocol/v2/docs/4924-agent…
cliffhall Oct 5, 2026
d7db257
Merge pull request #5053 from modelcontextprotocol/v2/chore/4930-ever…
cliffhall Oct 5, 2026
088b0de
Merge pull request #5052 from modelcontextprotocol/v2/fix/4934-action…
cliffhall Oct 5, 2026
88c4037
Merge pull request #5054 from modelcontextprotocol/v2/fix/5050-git-co…
cliffhall Oct 5, 2026
b5cea9d
Merge pull request #5055 from modelcontextprotocol/v2/chore/4919-dco-…
cliffhall Oct 5, 2026
b1df103
chore(scripts): script per-server release notes with a reporter Thank…
cliffhall Oct 7, 2026
abb1c90
Replace Dependabot PRs with issue-filing sweeps; add the SDK watch an…
cliffhall Oct 7, 2026
d3bd74d
chore(scripts): one release-wide Thanks section, as the Inspector's; …
cliffhall Oct 7, 2026
2b728ec
Route sweep warnings through an injectable sink, so tests keep them o…
cliffhall Oct 7, 2026
138d1ed
Map npm's workspace spelling either way; dispatch a sweep rather than…
cliffhall Oct 7, 2026
93c8df4
Read an empty automated-security-fixes success as enabled; analyze fr…
cliffhall Oct 7, 2026
715bde0
Apply PEP 440's exclusive-bound rules; preview the supersession note …
cliffhall Oct 7, 2026
fbfea0c
File the monthly issue when unranked SHA pins are its only finding
cliffhall Oct 7, 2026
c47051a
Treat npm outdated's exit 1 without a payload as a failure; compare e…
cliffhall Oct 7, 2026
7e751ec
Merge pull request #5064 from modelcontextprotocol/v2/chore/5056-rele…
cliffhall Oct 7, 2026
1b5f6ae
Match a workspace's own npm copy to its own manifest; report every lo…
cliffhall Oct 7, 2026
129a0a0
Verify an alert issue's target against every applicable range; scope …
cliffhall Oct 7, 2026
04e22ef
Describe the alert target as pickTarget chooses it, in AGENTS.md and …
cliffhall Oct 7, 2026
21eb81b
Pin nothing in an alert issue's fix when no listed patch clears every…
cliffhall Oct 7, 2026
f227e79
Never target below an affected copy; rank a SHA pin only by an exact …
cliffhall Oct 7, 2026
53d6971
Name the jobs pinned by propagation beside the credentialed-job list
cliffhall Oct 7, 2026
acbae35
Order PEP 440 local version labels, and ignore them in specifier matc…
cliffhall Oct 7, 2026
24d7ed5
Merge remote-tracking branch 'origin/v2/main' into v2/feat/4874-issue…
cliffhall Oct 7, 2026
5090add
Scope npm alert issues by the workspaces their vulnerable copies belo…
cliffhall Oct 7, 2026
83b2fb9
Name the version actually checked when an alert target is unverified,…
cliffhall Oct 7, 2026
a969a9d
Keep the unverified advisory comment from naming the unsafe version; …
cliffhall Oct 7, 2026
2b65349
Warn about vulnerable intervals above an alert target, and ask for th…
cliffhall Oct 7, 2026
371190b
Merge pull request #5065 from modelcontextprotocol/v2/feat/4874-issue…
cliffhall Oct 7, 2026
473c531
Record the SDK watch's accepted credential-channel risk (#5069)
cliffhall Oct 7, 2026
d812043
Merge pull request #5070 from modelcontextprotocol/v2/chore/5069-sdk-…
cliffhall Oct 7, 2026
ea2219d
time: accept only exact IANA timezone keys on every platform
cliffhall Oct 10, 2026
aa870b4
test(memory): expect Node 26's path-suffixed EISDIR message
cliffhall Oct 10, 2026
96ec9ea
test(time): use SDK 1.x's McpError in the #5060 test
cliffhall Oct 10, 2026
0033d80
chore(deps): pin proxy-addr to ^2.0.8 (GHSA-jqcg-44mw-7w3h)
cliffhall Oct 10, 2026
4e9978e
chore(deps): pin ip-address to ^10.7.1 (GHSA-mwp4-54f8-5fhr and six m…
cliffhall Oct 10, 2026
dc2c3cb
chore(deps): pin brace-expansion to ^5.0.12 (GHSA-rgw5-rvv9-x895 and …
cliffhall Oct 10, 2026
9cac34b
chore(deps): raise the hono override to >=4.13.7 (GHSA-8j4g-w8fx-2239…
cliffhall Oct 10, 2026
ad25cd8
chore(deps): raise the qs override to >=6.16.0 (GHSA-x5fp-wj9c-mxmx, …
cliffhall Oct 10, 2026
a83e890
chore(deps): pin fast-uri to ^3.1.8
cliffhall Oct 10, 2026
e99641c
chore(deps): pin nanoid to ^3.3.18 (GHSA-2v37-7h3g-55p8)
cliffhall Oct 10, 2026
e54f613
chore(deps): pin source-map-js to ^1.2.2 (GHSA-68fv-2mgg-jv7q)
cliffhall Oct 10, 2026
09edf63
chore(deps): require @modelcontextprotocol/sdk ^1.31.0 (GHSA-6qxp-vcc…
cliffhall Oct 10, 2026
ce10953
chore(deps): bump vitest and @vitest/coverage-v8 to ^4.1.11 (GHSA-82f…
cliffhall Oct 10, 2026
4063558
chore(fetch): require protego>=0.6.2 (PYSEC-2026-3906)
cliffhall Oct 10, 2026
ddf0804
chore(git): require gitpython>=3.1.60 (PYSEC-2026-3783 and fourteen m…
cliffhall Oct 10, 2026
b79d134
chore(python): lock anyio 4.15 (anyio advisory fixed in 4.14.2)
cliffhall Oct 10, 2026
0bcb08c
chore(python): lock cryptography 50 (PYSEC-2026-3552)
cliffhall Oct 10, 2026
2a72d5e
chore(python): lock pyjwt 2.15 (PYSEC-2026-4140 and twelve more)
cliffhall Oct 10, 2026
dac4e70
chore(fetch): lock urllib3 2.8 (PYSEC-2026-4175, -4176, -4177)
cliffhall Oct 10, 2026
7926782
chore(fetch): lock soupsieve 2.10 (PYSEC-2026-4170, -4171)
cliffhall Oct 10, 2026
3f5e9ea
Merge pull request #5086 from modelcontextprotocol/v2/chore/5080-rele…
cliffhall Oct 10, 2026
dd1e437
Merge branch 'v2/release/1.0.0' into v2/chore/5080-release-1.0.0-audit
cliffhall Oct 10, 2026
2bec4cd
Merge pull request #5087 from modelcontextprotocol/v2/chore/5080-rele…
cliffhall Oct 10, 2026
cc89b34
chore: fold the pending changesets into a 1.0.0 CHANGELOG entry per T…
cliffhall Oct 10, 2026
c38bd86
Merge pull request #5088 from modelcontextprotocol/v2/chore/5080-rele…
cliffhall Oct 10, 2026
1f8b6eb
chore: stamp Python CalVer versions for 2026.10.10
cliffhall Oct 10, 2026
8e4c8c0
Merge pull request #5089 from modelcontextprotocol/v2/chore/5080-pyth…
cliffhall Oct 10, 2026
bea1c9a
fix(filesystem): revoke access when a roots update leaves no valid root
cliffhall Oct 10, 2026
fc005f7
chore(filesystem): fold the #5094 changeset into the 1.0.0 CHANGELOG
cliffhall Oct 10, 2026
2b74b00
fix(filesystem): say the client exposes no valid roots, not none
cliffhall Oct 10, 2026
a13e809
fix(filesystem): apply only the newest roots refresh's answer
cliffhall Oct 10, 2026
be9a555
chore(filesystem): fold the #5097 changeset into the 1.0.0 CHANGELOG
cliffhall Oct 10, 2026
cebc963
Merge pull request #5096 from modelcontextprotocol/v2/fix/5094-releas…
cliffhall Oct 10, 2026
b503c69
fix(filesystem): keep tool calls waiting for the update that overtook…
cliffhall Oct 10, 2026
0f8bfe3
test(filesystem): expect SDK 1.x's wrapped roots/list error in the #5…
cliffhall Oct 10, 2026
c88c3bf
test(filesystem): assert waiting calls are released before the initia…
cliffhall Oct 10, 2026
ee1ad25
test(filesystem): wait for the stale initial answer before teardown
cliffhall Oct 10, 2026
29db105
Merge pull request #5099 from modelcontextprotocol/v2/fix/5097-releas…
cliffhall Oct 10, 2026
3f6aaf4
fix(filesystem): hold tool calls while any roots refresh is pending
cliffhall Oct 10, 2026
9f3197e
chore(filesystem): fold the #5101 changeset into the 1.0.0 CHANGELOG
cliffhall Oct 10, 2026
3836cf8
fix(filesystem): install each roots refresh barrier before its roots/…
cliffhall Oct 10, 2026
4d2d9e5
fix(filesystem): claim the initial roots load's generation before def…
cliffhall Oct 10, 2026
c6f2dda
fix(filesystem): wake calls waiting on a replaced roots refresh
cliffhall Oct 10, 2026
6e93db0
Merge pull request #5103 from modelcontextprotocol/v2/fix/5101-releas…
cliffhall Oct 10, 2026
0a174e9
ci(release): publish with Node 24's bundled npm instead of installing…
cliffhall Oct 10, 2026
77e9a3c
test(release): pin the publish job's npm floor check and its no-insta…
cliffhall Oct 10, 2026
dd4826a
test(release): pin the ./ tarball path npm publish needs
cliffhall Oct 10, 2026
db5e5de
Merge pull request #5106 from modelcontextprotocol/v2/chore/5104-rele…
cliffhall Oct 10, 2026
01c274f
fix(fetch): annotate the fetch tool
cliffhall Oct 10, 2026
89701af
Merge pull request #5113 from modelcontextprotocol/v2/fix/3572-releas…
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
34 changes: 34 additions & 0 deletions .changeset/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Changesets

The four TypeScript servers (`everything`, `filesystem`, `memory`,
`sequentialthinking`) are versioned with
[changesets](https://github.com/changesets/changesets). This directory holds the
pending ones: one small Markdown file per change, each naming the packages it
bumps, the bump type, and the line that becomes the CHANGELOG entry. The whole
release flow is in [`RELEASING.md`](../RELEASING.md).

A PR that changes what a TypeScript server publishes adds one:

```sh
npm run changeset
```

Pick the affected package or packages, choose the bump type, and write a
one-line summary for a user of the server. Commit the generated file with the
PR.

| Bump | When |
| --- | --- |
| **patch** | A bug fix |
| **minor** | A new tool, prompt, resource or option |
| **major** | A breaking change: a tool removed or renamed, a schema change that breaks clients, a protocol or Node floor bump |

A change that does not alter a published TypeScript package needs none: docs,
skills, workflows, the gate's scripts, tests, and anything in a Python server.
The Python servers (`fetch`, `git`, `time`) use CalVer and are stamped by the
**Prepare Python Release** workflow instead.

Merged changesets accumulate on `v2/main`. The **Version Packages** workflow
keeps one rolling PR open that consumes them: merging it applies the version
bumps, writes each package's `CHANGELOG.md`, and deletes the consumed files.
Nothing is published until a maintainer publishes a GitHub Release.
14 changes: 14 additions & 0 deletions .changeset/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"$schema": "https://unpkg.com/@changesets/config@4.0.1/schema.json",
"changelog": [
"@changesets/changelog-github",
{ "repo": "modelcontextprotocol/servers" }
],
"commit": false,
"fixed": [],
"linked": [],
"access": "public",
"baseBranch": "v2/main",
"updateInternalDependencies": "patch",
"ignore": []
}
461 changes: 461 additions & 0 deletions .claude/skills/board-ops/SKILL.md

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions .claude/skills/board-ops/evals/evals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
[
{
"prompt": "Move the board card for issue 4810 to In Review.",
"expect": "board-ops"
},
{
"prompt": "How do I set the Priority field on an issue's card on the Servers V2 board?",
"expect": "board-ops"
},
{
"prompt": "The project board rejected my Status option ID. How do I get the current one?",
"expect": "board-ops"
},
{
"prompt": "I'm about to add an option to one of the board's single-select fields. Should I do anything first?",
"expect": "board-ops"
},
{
"prompt": "Several cards lost their Status value after someone edited the field. How do I put it back?",
"expect": "board-ops"
},
{
"prompt": "Write out every command I need to run to file an issue, start to finish, for: the time server returns the wrong UTC offset for Australia/Lord_Howe during daylight saving. I'll run them myself.",
"chain": ["issue-create", "board-ops"]
},
{
"prompt": "My fix for issue 4810 is committed and the gate is green. Write out every command I need to run from here until the PR is open and tracked, start to finish. I'll run them myself.",
"chain": ["pr-flow", "board-ops"]
},
{
"prompt": "Explain the difference between TCP and UDP.",
"expect": null
},
{
"prompt": "What year was the first Moon landing?",
"expect": null
}
]
271 changes: 271 additions & 0 deletions .claude/skills/client-smoke/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
---
name: client-smoke
description: "Drive a locally built server with a real client: the Inspector CLI (scripted), the Inspector web UI (by hand) and an LLM client. Use when smoke-testing a server change; when calling a tool, reading a resource or getting a prompt from the command line; when choosing a protocol era; or when the Inspector CLI will not connect to, or misreads, a server command."
disable-model-invocation: false
---

# Client smoke

A server change is checked against real clients before its PR opens: the MCP
Inspector and an LLM client. This skill is how to run each one against a server
built from this checkout, and what the output means. What the PR must then
record is in `/pr-flow` (client evidence); building and starting the server is
`/local-dev`; automated tests are `/testing`.

Three clients, in the order to reach for them:

| Client | Driven by | Use it for |
| --- | --- | --- |
| Inspector **CLI** | A command. This is the **scripted path**, and the one an agent runs | One request, one JSON result: the evidence that goes in a PR |
| Inspector **web** UI | A person, by hand. Nothing in this repo automates a browser | What only a UI shows: notifications arriving, elicitation and sampling prompts, a long-running tool's progress |
| An **LLM client** | A prompt | Whether a model picks the tool and uses its result, which the PR checklist asks for |

Build first (`npm run build -w src/<server>`). Every command below runs the
last build of a TypeScript server, not your edit.

## The Inspector CLI

```sh
npx -y @modelcontextprotocol/inspector --cli <server command> [-- ] <inspector options>
```

It starts the server command over stdio (or connects to a URL), sends one
request, prints the result and exits. Pin the Inspector version in anything you
keep (`@modelcontextprotocol/inspector@<version>`); the commands here were run
on 2.9.0. `--cli --help` is the reference for the options.

```sh
INSPECT="npx -y @modelcontextprotocol/inspector --cli"

# List, then call, on a TypeScript server
$INSPECT node src/everything/dist/index.js stdio --method tools/list --format json
$INSPECT node src/everything/dist/index.js stdio \
--method tools/call --tool-name echo --tool-arg message=hello --format json
# → {"result":{"content":[{"type":"text","text":"Echo: hello"}]}}

# Arguments that are not strings: pass them as JSON
$INSPECT node src/everything/dist/index.js stdio \
--method tools/call --tool-name get-sum --tool-args-json '{"a":2,"b":3}' --format json

# Resources and prompts
$INSPECT node src/everything/dist/index.js stdio \
--method resources/read --uri demo://resource/dynamic/text/1 --format json
$INSPECT node src/everything/dist/index.js stdio \
--method prompts/get --prompt-name args-prompt --prompt-args city=Paris --format json

# A server that takes a positional argument
$INSPECT node src/filesystem/dist/index.js /abs/dir \
--method tools/call --tool-name list_allowed_directories --format json

# A Python server: note the `--` (see below)
$INSPECT uv --directory src/time run mcp-server-time -- \
--method tools/call --tool-name get_current_time --tool-arg timezone=UTC --format json
$INSPECT uv --directory src/git run mcp-server-git --repository "$PWD" -- \
--method tools/list --format json
```

`--format json` prints a result as one JSON object, `{"result": …}`, on
**stdout**, and a failure as `{"error": …}` on **stderr**. The server's own
stderr (its startup banner) passes through on stderr too. So capture stdout
alone for the result, never `2>&1` into a JSON parser: a tool error produces
both objects, one on each stream (see the table below).

### How the command line is split

The server command comes **first** and the Inspector's options **after** it.
With no `--`, the server command ends at the first word that starts with `-`.
That rule produces the three failures people actually hit:

- **A server command with its own flags needs `--` before the Inspector's
options.** `uv --directory …` and `mcp-server-git --repository …` both have
one. Without the separator the command is cut at `--directory`, and what runs
is a bare `uv`, which prints its help and exits. With it, everything before
`--` is the server command and everything after is the Inspector's.
- **Putting an Inspector option before the server command loses the command.**
`--cli -e KEY=VALUE node …` leaves no server command at all, and the CLI
falls back to your personal catalog (`~/.mcp-inspector/mcp.json`). With
several servers in it that fails with `Multiple servers found in config
file. Please specify one with --server`. Either way it is no longer talking
to your build, so move the option after the command.
- **`Method is required`** means the options ended up on the wrong side of a
`--`.

### Environment variables

The spawned server gets only the SDK's default safelist from your shell
(`PATH`, `HOME`, `USER` and the like), not the variables you set. Setting
`MEMORY_FILE_PATH=… npx …` has no effect on the server; pass it with `-e`:

```sh
$INSPECT node src/memory/dist/index.js \
-e MEMORY_FILE_PATH=/abs/tmp/graph.jsonl \
--method tools/call --tool-name read_graph --format json
```

### Exit codes and errors

The exit code is the verdict, so check it rather than reading the text:

| Outcome | stdout | stderr | Exit |
| --- | --- | --- | --- |
| The request succeeded | `{"result": …}` | | 0 |
| The tool ran and returned `isError: true` | `{"result":{"content": …, "isError": true}}` | `{"error":{"code":"tool_is_error", …}}` | 5 |
| No such tool | | `{"error":{"code":"tool_not_found", …}}` | 5 |
| An HTTP server could not be reached (refused, DNS, timeout) | | `{"error":{"code":"unreachable", …}}` | 4 |
| Bad arguments, a failed version negotiation, or a stdio server that exited | | `{"error":{"code":"error", …}}` | 1 |

These are the codes observed on 2.9.0 for the cases this repo's servers
produce; the CLI defines others (schema and skill checks, authentication)
that its `--help` describes.

A tool error is a **successful protocol exchange**: the result object is still
printed on stdout, and it is what to quote when the change is about an error a
tool returns.

### `everything` over HTTP

Start the transport in one terminal (or in the background), then give the CLI
the URL. The transport is inferred from the path: `/mcp` is Streamable HTTP,
`/sse` is HTTP+SSE.

```sh
(
URL=http://localhost:3917/mcp
# Refuse a port something already answers on: it would be tested instead of this build.
curl -s -m 2 -o /dev/null "$URL" && { echo "port 3917 is already in use" >&2; exit 1; }
PORT=3917 node src/everything/dist/index.js streamableHttp >/dev/null 2>&1 &
SERVER_PID=$!
trap 'kill "$SERVER_PID" 2>/dev/null' EXIT # stops it however the subshell ends
READY=
for _ in $(seq 50); do # at most ten seconds
kill -0 "$SERVER_PID" 2>/dev/null || { echo "server exited before listening" >&2; exit 1; }
curl -s -m 2 -o /dev/null "$URL" && { READY=1; break; }
sleep 0.2
done
[ -n "$READY" ] || { echo "server did not listen within ten seconds" >&2; exit 1; }
$INSPECT "$URL" --method tools/call --tool-name echo --tool-arg message=over-http --format json
)
```

Each part of that is there for a failure it prevents. The first check refuses
a port that already answers, because a stale listener there would be the
server under test. Without the wait, the CLI can reach the port before the
server is listening and exit 4. The wait is bounded and checks that this
server is still alive, so one that fails to bind (the build is missing, the
port was taken in between) ends the run instead of hanging it. The subshell's `EXIT` trap stops the server by pid even when the CLI call
fails; a listener left on the port makes the next run talk to the old build.
By hand in two terminals, the equivalent is waiting for the `listening on
port` line and stopping the server with Ctrl-C.

A change to a tool, resource or prompt of `everything` is checked over stdio
and Streamable HTTP. Check HTTP+SSE as well when the change touches transport
or session code; it is deprecated but must keep working.

## Protocol eras

The Inspector connects in one of three eras, chosen with `--protocol-era` (the
CLI) or **Server Settings → Protocol Era** (the web UI):

| Era | What the Inspector does |
| --- | --- |
| `legacy` (the default) | A plain `initialize`. Negotiates 2025-11-25 or older |
| `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:

- `--protocol-era modern` fails, by design, with `Version negotiation failed:
the server did not offer pinned protocol version 2026-07-28 via
server/discover (no fallback in pin mode)` and exit 1. That is the expected
result for an unmigrated server, not a regression in your change.
- `--protocol-era auto` succeeds, but through the fallback, so it is a legacy
connection and proves nothing about 2026-07-28.

The both-eras check that `/pr-flow` asks for (#4857) therefore has one half
that can pass today. For a server that does not yet serve the modern era,
record the legacy run, and say in the PR that the server does not yet speak
2026-07-28 rather than leaving the modern era unmentioned. Moving a server to
a v2 SDK (#4856 for TypeScript, #4851 for Python) does not change that by
itself: those keep the legacy wire behavior. Modern-era support arrives with
#4852 (TypeScript) and #4853 (Python). Once a server has it, run every command
twice, with `--protocol-era legacy` and `--protocol-era modern`, and expect
both to succeed. Do not use `auto` for evidence in either case: it
does not say which era answered.

## The Inspector web UI

The web client is the hand-driven path. It needs a person at a browser; this
repo configures no browser automation, so an agent prepares the command and
the steps and asks for what was observed.

```sh
npx -y @modelcontextprotocol/inspector node src/everything/dist/index.js stdio
npx -y @modelcontextprotocol/inspector -- uv --directory src/time run mcp-server-time
npx -y @modelcontextprotocol/inspector --transport http --server-url http://localhost:3001/mcp
```

⚠️ **The web launcher reads `--` the other way round from the CLI.** Here the
Inspector's own options come **before** `--` and the server command **after**
it; in `--cli` mode the server command is before `--` and the options after.
A line copied from one mode to the other starts the wrong thing. Pass a
server's environment with `-e KEY=VALUE` before the `--`.

Use the web UI for what a single request cannot show: `toggle-simulated-logging` and
`toggle-subscriber-updates` (notifications over time),
`trigger-elicitation-request` and `trigger-sampling-request` (the client is
asked something), `trigger-long-running-operation` (progress), and a
filesystem server's response to a Roots change.

Evidence from the web UI is what was clicked and what appeared, in words. This
repo does not attach screenshots.

## An LLM client

The PR checklist asks whether the change was tested with an LLM client. Any
client that can launch a stdio server works; each server's `README.md` has the
config blocks for Claude Desktop and VS Code, and `/local-dev` shows how to
point one at the local build.

Claude Code can do it in one headless command, which makes it the scriptable
option. Write a config that names the local build with an **absolute** path:

```json
{
"mcpServers": {
"everything": {
"command": "node",
"args": ["/abs/path/to/servers/src/everything/dist/index.js", "stdio"]
}
}
}
```

```sh
printf '%s' "Call the echo tool of the everything server with the message 'llm-smoke' and reply with exactly the text it returned." \
| claude -p --mcp-config /abs/path/to/config.json --strict-mcp-config \
--allowedTools "mcp__everything__echo" --max-turns 3
# → Echo: llm-smoke
```

`--strict-mcp-config` makes the file the only source of servers, so the answer
cannot have come from a published copy configured elsewhere. A tool is
addressed as `mcp__<server name in the config>__<tool name>`, and only the
tools listed in `--allowedTools` can be called without a prompt. Keep the
config file outside the worktree.

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
whatever the client prefers, for the reason given under Protocol eras.

## What to write down

For each client: the command or the prompt, and the result trimmed to what
shows the change. For a bug fix, run the same CLI command against `v2/main`
and against the branch, and keep both outputs. Where the evidence goes in the
PR, and what a change with no client-visible surface records instead, is
`/pr-flow`.
34 changes: 34 additions & 0 deletions .claude/skills/client-smoke/evals/evals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
[
{
"prompt": "Smoke-test my change to the time server with the Inspector CLI.",
"expect": "client-smoke"
},
{
"prompt": "How do I call a tool on my locally built server from the command line and get JSON back?",
"expect": "client-smoke"
},
{
"prompt": "The Inspector CLI says 'Multiple servers found in config file' when I pass it my server command. How do I fix it?",
"expect": "client-smoke"
},
{
"prompt": "How do I check my server change against a 2026-07-28 client?",
"expect": "client-smoke"
},
{
"prompt": "How do I get Claude Code to call a tool on my local build of the everything server in one headless command?",
"expect": "client-smoke"
},
{
"prompt": "How do I open the Inspector web UI against my local build of the git server?",
"expect": "client-smoke"
},
{
"prompt": "Summarize the plot of Hamlet in two sentences.",
"expect": null
},
{
"prompt": "Convert 5 kilometers to miles.",
"expect": null
}
]
Loading
Loading