Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions .changeset/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Changesets

The four TypeScript servers (`everything`, `filesystem`, `memory`,
`sequentialthinking`) are versioned with
The three TypeScript servers (`everything`, `filesystem`, `memory`)
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
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/client-smoke/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ CLI) or **Server Settings → Protocol Era** (the web UI):
| `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
six 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:
Expand Down
1 change: 0 additions & 1 deletion .claude/skills/issue-create/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ to "not a bug", at which point filtering by it stops telling you anything.
| `src/everything/` | `server-everything` |
| `src/filesystem/` | `server-filesystem` |
| `src/memory/` | `server-memory` |
| `src/sequentialthinking/` | `server-sequentialthinking` |
| `src/fetch/` | `server-fetch` |
| `src/git/` | `server-git` |
| `src/time/` | `server-time` |
Expand Down
10 changes: 5 additions & 5 deletions .claude/skills/issue-triage/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ labels. A security report is never closed by triage.
| **SDK or specification** | Reproduces against the SDK directly, or asks for a protocol change | Close, `not planned` | [Elsewhere](#elsewhere) |
| **Duplicate** | An open or closed issue already reports it (search all states, as in `issue-create` step 0) | Close as `duplicate` (the `board-ops` API call); delete its card if it has one | [Duplicate](#duplicate) |
| **Spam or empty** | No content, unrelated or generated content | Close, `not planned` | None |
| **Security report** | Describes a vulnerability in one of the seven servers | **Stop. A maintainer decides** | [Security reports](#security-reports) |
| **Security report** | Describes a vulnerability in one of the six servers | **Stop. A maintainer decides** | [Security reports](#security-reports) |
| **Everything else** | A bug, a usability problem, an enhancement, a question about these servers | [Pass 1](#pass-1--sweep-onto-the-board-no-approval-implied) | None; the score comment |

When a class is a judgment call (a feature a maintainer might still take, a
Expand Down Expand Up @@ -266,7 +266,7 @@ that lists it shows the approval semantics were misapplied.

## Security reports

A vulnerability in one of the seven servers is reported privately, through the
A vulnerability in one of the six servers is reported privately, through the
[advisory form](https://github.com/modelcontextprotocol/servers/security/advisories/new),
and worked in the `security-advisory` flow (#4870). When one arrives as a public
issue or a public PR anyway:
Expand Down Expand Up @@ -341,12 +341,12 @@ RAW=$(gh api "repos/$R/collaborators?per_page=100" --paginate --slurp) \
# never the manifest: a "server change" can be a no-op, a racing duplicate or a
# security fix, and only reading the diff tells which.
jq -r --slurpfile m "$D/maintainers.json" '
["everything","filesystem","memory","sequentialthinking","fetch","git","time"] as $seven
["everything","filesystem","memory","fetch","git","time"] as $six
| .[] | .author.login as $a | [.files[].path] as $p
| (if $a == "app/dependabot" then "dependabot"
elif ($m[0] | index($a)) then "maintainer"
elif ($p | length) > 0 and ($p | all(. == "README.md" or . == "ADDITIONAL.md")) then "listing?"
elif ($p | any(startswith("src/") and ((split("/")[1]) as $d | $seven | index($d) | not))) then "new-server?"
elif ($p | any(startswith("src/") and ((split("/")[1]) as $d | $six | index($d) | not))) then "new-server?"
elif ($p | any(startswith("src/"))) then "server-change?"
else "repo-level?" end) as $c
| [.number, $c, ([.closingIssuesReferences[].number] | map("#\(.)") | join(" ")), .title[0:70]]
Expand Down Expand Up @@ -376,7 +376,7 @@ into the issue column.
| **No-op or spam** | `no-op` | No effective change (a rename to the same name, whitespace, a README "rename" to itself), or unrelated or generated content | No | [General, PR](#general-pr), without a tracking issue |
| **Duplicate** | `duplicate` | Races another open PR, or an existing issue, for the same fix | Once per group, through its best member | [General, PR](#general-pr), naming the group's issue |
| **Security fix** | `security` | Fixes a vulnerability: path traversal, symlink or Roots escape, SSRF, injection, a vulnerable dependency | See [Security reports](#security-reports) first | **Not by the loop**: a maintainer's call |
| **Fix or enhancement to keep** | `keep` | A bug fix, or an in-scope enhancement (`CONTRIBUTING.md`, "What we act on"), to one of the seven servers or the repository | Yes, unless an open issue already covers it | [General, PR](#general-pr), naming the issue |
| **Fix or enhancement to keep** | `keep` | A bug fix, or an in-scope enhancement (`CONTRIBUTING.md`, "What we act on"), to one of the six servers or the repository | Yes, unless an open issue already covers it | [General, PR](#general-pr), naming the issue |
| **Out of scope** | `out-of-scope` | A feature `CONTRIBUTING.md` is selective about and a maintainer would not take, or a fix for behavior already gone on `v2/main` | No | [General, PR](#general-pr), without a tracking issue |

**Finding duplicate groups.** Racing PRs usually share a linked issue or the
Expand Down
5 changes: 2 additions & 3 deletions .claude/skills/local-dev/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Driving a running server with a client is `/client-smoke`; tests are
Node 22 for the TypeScript servers, and `uv` for the Python ones.

```sh
npm install # at the repo root: all four TypeScript workspaces
npm install # at the repo root: all three TypeScript workspaces
npm run build # every workspace; or: npm run build -w src/<server>
```

Expand Down Expand Up @@ -47,7 +47,6 @@ terminal is a running server, not a hung one.
| `everything` | `node src/everything/dist/index.js stdio` | First argument picks the transport: `stdio` (the default), `sse`, `streamableHttp` |
| `filesystem` | `node src/filesystem/dist/index.js <dir> [<dir>…]` | The allowed directories. A client that supports Roots can supply them instead |
| `memory` | `node src/memory/dist/index.js` | `MEMORY_FILE_PATH` sets the graph file |
| `sequentialthinking` | `node src/sequentialthinking/dist/index.js` | None required |
| `fetch` | `uv --directory src/fetch run mcp-server-fetch` | `--user-agent`, `--ignore-robots-txt`, `--proxy-url` |
| `git` | `uv --directory src/git run mcp-server-git` | `--repository <path>` |
| `time` | `uv --directory src/time run mcp-server-time` | `--local-timezone <IANA name>` |
Expand Down Expand Up @@ -84,7 +83,7 @@ the published name, which exercises the package's `bin` or console script
rather than a file path:

```sh
npx -y ./src/sequentialthinking # the workspace's bin, from its dist/
npx -y ./src/memory # the workspace's bin, from its dist/
uvx --from ./src/time mcp-server-time # builds the project, runs its script
```

Expand Down
9 changes: 4 additions & 5 deletions .claude/skills/project-structure/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: project-structure
description: "Find where code lives in this repo's seven servers and decide where a new file goes. Use when choosing the file or directory for a new tool, resource, prompt, transport, helper module, command-line flag or root script; when a server's layout is unclear; or when asking whether code belongs in a server's entry file or a module of its own."
description: "Find where code lives in this repo's six servers and decide where a new file goes. Use when choosing the file or directory for a new tool, resource, prompt, transport, helper module, command-line flag or root script; when a server's layout is unclear; or when asking whether code belongs in a server's entry file or a module of its own."
disable-model-invocation: false
---

Expand All @@ -19,7 +19,7 @@ servers need is written in both (`expandHome` exists in `filesystem` and in

## The TypeScript servers

All four are npm workspaces of the root `package.json` and share one shape: the
All three are npm workspaces of the root `package.json` and share one shape: the
entry point is `index.ts`, sources sit at the workspace root (there is no
`src/` inside a server), tests are in `__tests__/`, and `tsc` writes `dist/`.
Each has the same four config files: `package.json`, `tsconfig.json` (the
Expand All @@ -31,7 +31,6 @@ includes the tests) and `vitest.config.ts`.
| `everything` | `index.ts` picks a transport from `argv`; `server/` holds the factory; `tools/`, `resources/`, `prompts/` hold one file per feature plus an `index.ts`; `transports/` holds one file per transport; `version.ts` reads the package version; `docs/` is shipped | Each feature file exports a `register…` function, wired into its area's `index.ts` (`registerTools`, `registerResources`, `registerPrompts`), which `server/index.ts` calls from `createServer()` |
| `filesystem` | `index.ts` is the stdio entry point (argv → allowed directories, `main()`); `server.ts` exports `createServer(allowedDirectories)`; `lib.ts` holds the file operations and path validation, with the allow-list passed in rather than held globally; `path-utils.ts`, `path-validation.ts` and `roots-utils.ts` are focused helpers; `version.ts` reads the package version | Inline in `createServer()` in `server.ts`, with `server.registerTool(...)` |
| `memory` | `index.ts` holds the `KnowledgeGraphManager`, `createServer(memoryFilePath)` and the stdio `main()`; `version.ts` reads the package version | Inline in `createServer()`; the resource and its subscription handlers are exported `register…` functions in the same file |
| `sequentialthinking` | `index.ts` holds `createServer()` and the stdio `main()`; `lib.ts` holds `SequentialThinkingServer`, the logic; `version.ts` reads the package version | Inline in `createServer()` |

Three things about `everything` that the table cannot hold:

Expand Down Expand Up @@ -90,9 +89,9 @@ importable.
| --- | --- |
| A tool, resource or prompt for `everything` | Its own kebab-case file in `tools/`, `resources/` or `prompts/`, exporting a `register…` function, wired into that directory's `index.ts` |
| A transport for `everything` | `src/everything/transports/`, plus a `case` in `src/everything/index.ts` and a `start:…` script |
| A tool for `filesystem`, `memory` or `sequentialthinking` | A `server.registerTool(...)` call inside that server's `createServer()` (`server.ts` in `filesystem`, `index.ts` in the other two); the logic it calls goes in `lib.ts` (or the class it extends) |
| A tool for `filesystem` or `memory` | A `server.registerTool(...)` call inside that server's `createServer()` (`server.ts` in `filesystem`, `index.ts` in `memory`); the logic it calls goes in `lib.ts` (or the class it extends) |
| A helper module for `everything` | A kebab-case `.ts` file in the feature area it supports, beside its users (`server/logging.ts`, `server/roots.ts`, `resources/session.ts`), imported with the `.js` extension |
| A helper module for `filesystem`, `memory` or `sequentialthinking` | A kebab-case `.ts` file at the workspace root, imported with the `.js` extension |
| A helper module for `filesystem` or `memory` | A kebab-case `.ts` file at the workspace root, imported with the `.js` extension |
| A tool for a Python server | `server.py`: the tool-name enum member (`git`, `time`), the model, the `list_tools` entry, the `call_tool` branch |
| A command-line flag for a Python server | `__init__.py`, passed into `serve()` |
| A test | `/testing` |
Expand Down
14 changes: 7 additions & 7 deletions .claude/skills/release/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Audit first, so the version bumps sit on a tree that was just checked.
git fetch origin v2/main
git switch -c "v2/chore/$N-release-audit" origin/v2/main

# npm: one lockfile covers the root and all four TypeScript workspaces.
# npm: one lockfile covers the root and all three TypeScript workspaces.
npm audit --audit-level=high

# Python: each server has its own lockfile. `uv` has no audit of its own in the
Expand Down Expand Up @@ -157,7 +157,7 @@ git ls-tree -r --name-only origin/v2/main .changeset/ | grep '\.md$' | grep -vx
# sort into release order (see 5a).
PREV=$(gh release view --repo modelcontextprotocol/servers --json tagName --jq .tagName)
git log --oneline "$PREV"..origin/v2/main -- \
src/everything src/filesystem src/memory src/sequentialthinking
src/everything src/filesystem src/memory
```

If the second command lists changes to what a server publishes and the first
Expand Down Expand Up @@ -466,7 +466,7 @@ The target is the SHA, so the tag lands on the commit the ledger verified,
whatever has reached `main` since. `release.yml` only checks that the tagged
commit is on `main`; it cannot know which commit was verified.

- **The tag is a label, not a version.** Seven packages publish at seven
- **The tag is a label, not a version.** Six packages publish at six
versions; none is compared with the tag. Naming it for the milestone is what
ties the Release to the board.
- **Editing a published Release's notes is safe.** `release.yml` runs on
Expand All @@ -485,7 +485,7 @@ not hold the others back; that package is handled as a failed publish

```sh
# Each npm package at the version on main.
for s in everything filesystem memory sequentialthinking; do
for s in everything filesystem memory; do
node scripts/npm-publish-guard.mjs "src/$s" # "already on npm" is the pass
done
# Each Python package: 200 means published.
Expand All @@ -509,10 +509,10 @@ package went. This is done **once**, after the release that first publishes
⚠️ **Only after `latest` has moved.** The range covers the version users were
getting before the release. Deprecating it while it is still `latest` warns
every `npx` user toward a version that does not exist yet. Check first, and
go on only when all four lines show a `1.x` `latest` and no deprecation:
go on only when all three lines show a `1.x` `latest` and no deprecation:

```sh
for p in everything filesystem memory sequential-thinking; do
for p in everything filesystem memory; do
n="@modelcontextprotocol/server-$p"
echo "$n latest=$(npm view "$n" dist-tags.latest) deprecated=$(npm view "$n@2026.8.31" deprecated)"
done
Expand All @@ -526,7 +526,7 @@ do not attempt the login.

```sh
MSG="Date-based versions are no longer published. This package has resumed semantic versioning at 1.0.0: install the latest version."
for p in everything filesystem memory sequential-thinking; do
for p in everything filesystem memory; do
npm deprecate "@modelcontextprotocol/server-$p@>=2025.0.0 <2027.0.0" "$MSG"
done
```
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/security-advisory/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ gh api --paginate repos/modelcontextprotocol/servers/security-advisories \
Before assessing severity, establish that the vulnerable code is **ours**, in
this order:

1. **Is it one of the seven servers under `src/`?** Many servers once lived in
1. **Is it one of the six servers under `src/`?** Many servers once lived in
this repository and were moved to
[`servers-archived`](https://github.com/modelcontextprotocol/servers-archived),
which is unmaintained and read-only. A report against one of those is
Expand Down Expand Up @@ -176,7 +176,7 @@ names the symptom rather than the class:
| `git` | Runs git against repository paths it is given | **Path traversal** and **symlink escape** out of the configured repository; **Roots bypass**; **argument injection** (a value that starts with `-` read by git as an option) |
| `fetch` | Makes outbound HTTP requests to URLs it is given | **SSRF** (loopback, private and link-local addresses, cloud metadata endpoints, a redirect or a DNS answer that lands on one); **robots bypass** (`robots.txt` not honored, or not re-checked after a redirect, when the server claims to honor it) |

`everything`, `memory`, `sequentialthinking` and `time` reach much less:
`everything`, `memory` and `time` reach much less:
`memory` writes one file at a configured path, and `everything`'s HTTP
transports are mostly SDK code (see ownership, above).

Expand Down
Loading
Loading