|
| 1 | +# Adding a new package registry |
| 2 | + |
| 3 | +The MCP Registry project is a **metaregistry**, meaning that it hosts metadata for MCP servers but does not host the code for the servers directly. |
| 4 | + |
| 5 | +For local MCP servers, the MCP Registry has pointers in the `packages` node of the [`server.json`](server-json/README.md) schema that refer to packages in supported package managers. |
| 6 | + |
| 7 | +The list of supported package managers for hosting MCP servers is defined by the `properties.packages[N].properties.registry_name` string enum in the [`server.json` schema](server-json/schema.json). For example, this could be "npm" (for npmjs.com packages) or "pypi" (for PyPI packages). |
| 8 | + |
| 9 | +For remote MCP servers, the package registry is not relevant. The MCP client consumes the server via a URL instead of by downloading and running a package. In other words, this document only applies to local MCP servers. |
| 10 | + |
| 11 | +For the sake of illustration, this document will use npm (the Node.js package manager) as an example at each step. |
| 12 | + |
| 13 | +## Prerequisites |
| 14 | + |
| 15 | +The package registry must meet the following requirements: |
| 16 | + |
| 17 | +1. The package registry supports packaging and executing CLI apps. Local MCP servers use the [stdio transport](https://modelcontextprotocol.io/docs/concepts/transports#standard-input%2Foutput-stdio). |
| 18 | + - npm CLI tools typically express their CLI commands in the [`bin` property of the package.json](https://docs.npmjs.com/cli/v11/configuring-npm/package-json#bin) |
| 19 | +1. The package registry (or associated client tooling) has a widely accepted **single-shot** CLI command. |
| 20 | + - npm's `npx` tool executes CLI commands using a [documented execution heuristic](https://docs.npmjs.com/cli/v11/commands/npx#description) |
| 21 | + - For example, the MCP client can map the `server.json` metadata to an `npx` CLI execution, with args and environment variables populated via user input. |
| 22 | +1. The package registry supports anonymous package downloads. This allows the MCP client software to use the metadata found in the MCP registry to discover, download, and execute package-based local MCP servers with minimal user intervention. |
| 23 | + - `npx` by default connects to the public npmjs.com registry, allowing simple consumption of public npm packages. |
| 24 | + |
| 25 | +## Steps |
| 26 | + |
| 27 | +These steps are currently very brief because the MCP Registry service is not yet deployed to production. These steps may evolve as additional validations or details are discovered and mandated. |
| 28 | + |
| 29 | +1. [Create a feature request issue](https://github.com/modelcontextprotocol/registry/issues/new?template=feature_request.md) on the MCP Registry repository to begin the discussion about adding the package registry. |
| 30 | + - Example for NuGet: https://github.com/modelcontextprotocol/registry/issues/126 |
| 31 | +1. Open a PR with the following changes: |
| 32 | + - Update the [`server.json` schema](server-json/schema.json) |
| 33 | + - Add your package registry name to the `registry_name` enum value array. |
| 34 | + - Add the single-shot CLI command name to the `runtime_hint` example value array. |
| 35 | + - Update the [`openapi.yaml`](openapi.yaml) |
| 36 | + - Add your package registry name to the `registry_name` enum value array. |
| 37 | + - Add the single-shot CLI command name to the `runtime_hint` example value array. |
| 38 | + - This duplicates the previous step and will be improved with [issue #159](https://github.com/modelcontextprotocol/registry/issues/159). |
| 39 | + - Add a sample, minimal `server.json` to the [`server.json` examples](server-json/examples.md). |
0 commit comments