How to submit an MCP server to ToolSDK MCP Registry

By Jonah EasePublished Last checked
You add one JSON file. A script checks it against a strict schema, a reviewer reads the diff, and the file is merged. The contributing guide is blunt that it is the source of truth, and that the README and the generated indexes are outputs you must not edit to add a server[1]. Most of the work is picking the right shape for the file.
Where the file goes
- Directly inside
packages/<category>/, with a lowercase kebab-case name such asexample-mcp.json. Nested folders are not supported. When no category fits,packages/uncategorizedis there[1]. - One server per pull request is preferred. Several from the same publisher are allowed. Anything else in the diff, such as workflows, lockfiles or the README, is out of scope[1].
- Link the official package or documentation in the description, because the reviewer checks your metadata against it[1].
A package people install
{
"type": "mcp-server",
"name": "Example MCP Server",
"packageName": "example-mcp-server",
"description": "Provides example operations for MCP clients.",
"url": "https://github.com/example/example-mcp-server",
"runtime": "node",
"license": "MIT",
"env": {
"EXAMPLE_API_KEY": { "description": "API key for the Example service.", "required": true, "secret": true }
}
}A local entry needs a public package or Docker image whose name and command can be verified. For Node, leave bin out and the gateway reads the package's own manifest. For Docker, put the image in packageName, set runtime to docker, and write the complete argument list in binArgs. The image and tag must exist[1]. runtime takes one of node, python, java, go or docker.
A server you host
{
"type": "mcp-server",
"name": "Example Remote MCP",
"packageName": "@toolsdk-remote/example-mcp",
"description": "Connects to the hosted Example MCP endpoint.",
"runtime": "node",
"env": {},
"remotes": [{ "type": "streamable-http", "url": "https://example.com/mcp" }]
}- The
packageNamestarts with@toolsdk-remote/, and a name with that prefix must have at least one remote[1]. - The endpoint is HTTPS, Streamable HTTP, and cannot point at localhost or a private network. Do not set a custom
key[1]. runtime: "remote"is not valid. Use the implementation's runtime, ornodefor a hosted-only server[1].
| Your endpoint uses | In the registry |
|---|---|
| OAuth 2.1 | An auth object of type oauth2, with optional scopes. |
| An API key or a bearer token in a header | Not supported. Do not model it as OAuth, and do not add an environment variable expecting the transport to inject it. |
| Nothing for part of the tools | List it without auth, and say in the description what needs sign-in. |
Run the registry's own validator
git fetch origin main
node scripts/validate-registry.mjs --base origin/mainIt uses only Node's built-ins, checks the files your branch changed, and compares identities with the current base. The guide warns against make build as a check, because that installs and runs registry packages[1].
What fails the check
- An unknown field. The package JSON is strict, and unknown fields are rejected[1].
- An identity that already exists. A new file cannot reuse a
key, or apackageNamewhen there is no key, that is onmain. Deleting the old file in the same pull request does not help[1]. - A secret with a default. A variable marked
secretcannot define one[1]. - Extra files in the diff. Mixing package JSON with documentation, source, workflow or generated files fails with
OUT_OF_SCOPE_CHANGEand goes to manual review[2].
The review, and the route by hand
Review is deterministic JSON validation against main. The reviewer never installs or runs a submitted package or probes a remote service, so your metadata has to be right on its face[2][1]. By hand, that is one fork, one file, one validator run and one pull request that links your docs. Merges are squashed[2].
Current status,
On the registry had 80 open pull requests[4], and its last push was dated [3].
How long merges took
In the 90 days to , 110 outside pull requests merged here; the typical one was merged 14 days after it was opened. The middle half took 6.4 days to 23 days.
| Window ending | Rolling median | Merges in window |
|---|---|---|
| 27 Feb 2026 | 4.4 days | 3 |
| 6 Mar 2026 | 1.8 days | 12 |
| 13 Mar 2026 | 1.1 days | 22 |
| 20 Mar 2026 | 19 h | 28 |
| 27 Mar 2026 | 16 h | 29 |
| 3 Apr 2026 | 16 h | 26 |
| 10 Apr 2026 | 12 h | 24 |
| 17 Apr 2026 | 12 h | 23 |
| 24 Apr 2026 | 13 h | 19 |
| 1 May 2026 | 16 h | 24 |
| 8 May 2026 | 23 h | 13 |
| 15 May 2026 | 2.1 days | 10 |
| 22 May 2026 | 2.4 days | 16 |
| 29 May 2026 | 7.0 days | 8 |
| 5 June 2026 | 6.4 days | 17 |
| 12 June 2026 | 6.2 days | 16 |
| 19 June 2026 | 6.5 days | 20 |
| 26 June 2026 | 6.5 days | 20 |
| 3 July 2026 | 6.4 days | 21 |
| 10 July 2026 | 6.3 days | 12 |
| 31 July 2026 | 17 days | 49 |
| 7 Aug 2026 | 18 days | 48 |
| 14 Aug 2026 | 17 days | 49 |
| 21 Aug 2026 | 17 days | 49 |
| 28 Aug 2026 | 13 days | 36 |
| 4 Sept 2026 | 13 days | 36 |
| 11 Sept 2026 | 14 days | 35 |
| 18 Sept 2026 | 12 days | 61 |
| 25 Sept 2026 | 12 days | 61 |
| 2 Oct 2026 | 9.7 days | 26 |
Measured . Pull requests merged on each list's GitHub repo, timed from opened to merged, read from GitHub's REST pulls list. Bot accounts ([bot]), the repo's owners, members and collaborators, and pull requests from a branch inside the list's own repo are left out. A past figure, not a promise. All 10 directories side by side: how long MCP directories take to merge.
Sources
- ToolSDK MCP Registry: docs/CONTRIBUTING.md · checked
- ToolSDK MCP Registry: docs/PR_REVIEW.md · checked
- ToolSDK MCP Registry: the repository · checked
- ToolSDK MCP Registry: open pull requests · checked
ManyCP is not affiliated with, endorsed by or sponsored by any directory, Docker, OpenAI, Anthropic or GitHub named here. Names are used to say which service a fact is about.
Or skip all of that
Or let ManyCP do it in one click
ManyCP forks toolsdk-ai/toolsdk-mcp-registry, adds your entry in the exact format, and opens the pull request from your GitHub account. It tracks the PR until it is merged.