Quickstart: Publish an MCP Server to the MCP Registry changedregistry/quickstart
Nearest release: v2.1.323, published 7 hours after upstream edited the page. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.
Upstream edited this page at 12 Nov 2026 13:28 UTC, give or take a minute or two: the time comes from Anthropic’s own sitemap rather than from a commit. This site recorded the change at 12 Nov 2026 13:37 UTC.
Upstream edited
Recorded here
Lines+50added
Lines−13removed
From line
6
where the diff opens
First seen
14 Aug 2026
this site's first read of the page
Recorded edits6to this page, all time
## Remote-only servers
The whole hunk
from line 6, old and new numbered
/
from line 6
66
77This tutorial will show you how to publish an MCP server written in TypeScript to the MCP Registry using the official `mcp-publisher` CLI tool.
88
9> [!NOTE]
10>
11> If you are publishing a non-npm package (PyPI, NuGet, OCI, MCPB), the overall flow is identical, but the ownership-verification step in [Step 1](#step-1-add-verification-information-to-the-package) is different per package type. See [Package Types](https://modelcontextprotocol.io/registry/package-types.md) for the verification mechanism that applies to your package, then return here and follow the remaining steps.
12
13## Remote-only servers
14
15If your MCP server is available only at a public remote endpoint, you can publish its metadata without a package. Skip the Node.js and npm prerequisites and Steps 1–2, then continue with [Step 3](#step-3-install-mcp-publisher). Your `server.json` must include a `remotes` entry and can omit `packages`:
16
17```json server.json theme={null}
18{
19 "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
20 "name": "io.github.my-username/weather",
21 "title": "Weather",
22 "description": "A remote MCP server for weather information.",
23 "repository": {
24 "url": "https://github.com/my-username/mcp-weather-server",
25 "source": "github"
26 },
27 "version": "1.0.0",
28 "remotes": [
29 {
30 "type": "streamable-http",
31 "url": "https://weather.example.com/mcp"
32 }
33 ]
34}
35```
36
37The remote URL must be publicly accessible. See [Publishing Remote Servers](https://modelcontextprotocol.io/registry/remote-servers.md) for transport, URL variable, and header options.
38
39With any authentication method, the Registry verifies that you control the namespace in `name`; it does not verify that you control the remote URL. See [Ownership Verification](https://modelcontextprotocol.io/registry/remote-servers.md#ownership-verification) for details.
40
941## Prerequisites
1042
1143* **Node.js** — This tutorial assumes the MCP server is written in TypeScript.
12* **npm account** — The MCP Registry only hosts metadata, not artifacts. Before publishing to the MCP Registry, we will publish the MCP server's package to npm, so you will need an [npm](https://www.npmjs.com) account.
44* **npm account (package-based servers only)** — The MCP Registry only hosts metadata, not artifacts. Before publishing a package-based MCP server to the MCP Registry, we will publish the package to npm, so you will need an [npm](https://www.npmjs.com) account.
1345* **GitHub account** — The MCP Registry supports [multiple authentication methods](https://modelcontextprotocol.io/registry/authentication.md). For simplicity, this tutorial will use GitHub-based authentication, so you will need a [GitHub](https://github.com/) account.
1446
1547If you do not have an MCP server written in TypeScript, you can copy the `weather-server-typescript` server from the [`modelcontextprotocol/quickstart-resources` repository](https://github.com/modelcontextprotocol/quickstart-resources) to follow along with this tutorial:
1648
1749```bash theme={null}
18git clone --depth 1 [email protected]:modelcontextprotocol/quickstart-resources.git
50git clone --depth 1 https://github.com/modelcontextprotocol/quickstart-resources.git
1951cp -r quickstart-resources/weather-server-typescript .
2052rm -rf quickstart-resources
2153cd weather-server-typescript
from line 98
6698Ensure the distribution files are built:
6799
68100```bash theme={null}
69# Navigate to project directory
70cd weather-server-typescript
71
72101# Install dependencies
73102npm install
74103
from line 130
101130# Move mcp-publisher.exe to a directory in your PATH
102131```
103132
104```bash theme={null}
133```bash Homebrew theme={null}
105134brew install mcp-publisher
106135```
107136
from line 153
124153 login Authenticate with the registry
125154 logout Clear saved authentication
126155 publish Publish server.json to the registry
156 status Update the status of a server version
157 validate Validate server.json without publishing
158
159Use 'mcp-publisher <command> --help' for more information about a command.
127160```
128161
129162## Step 4: Create `server.json`
from line 163
130163
131164The `mcp-publisher init` command can generate a `server.json` template file with some information derived from your project.
132165
166The Registry limits the `description` field to 100 characters. Keep the description focused on what the server does; longer descriptions fail validation.
167
133168In your server project directory, run `mcp-publisher init`:
134169
135170```bash theme={null}
from line 182
147182 "url": "https://github.com/my-username/mcp-weather-server",
148183 "source": "github"
149184 },
150 "version": "1.0.0",
185 "version": "1.0.1",
151186 "packages": [
152187 {
153188 "registryType": "npm",
154189 "identifier": "@my-username/mcp-weather-server",
155 "version": "1.0.0",
190 "version": "1.0.1",
156191 "transport": {
157192 "type": "stdio"
158193 },
from line 216
181216 "url": "https://github.com/my-username/mcp-weather-server",
182217 "source": "github"
183218 },
184- "version": "1.0.0",
185+ "version": "1.0.1",
219 "version": "1.0.1",
186220 "packages": [
187221 {
188222 "registryType": "npm",
189223 "identifier": "@my-username/mcp-weather-server",
190- "version": "1.0.0",
191+ "version": "1.0.1",
224 "version": "1.0.1",
192225 "transport": {
193226 "type": "stdio"
194227- },
from line 242
209242
210243The `name` property in `server.json` **must** match the `mcpName` property in `package.json`.
211244
245> [!NOTE]
246>
247> For a [remote-only server](#remote-only-servers), `mcp-publisher init` still generates a `packages` entry. Replace the `packages` array with a `remotes` array, as shown in the remote-only example above.
248
212249## Step 5: Authenticate with the MCP Registry
213250
214251For this tutorial, we will authenticate with the MCP Registry using GitHub-based authentication.
from line 307
270307
271308| Error Message | Action |
272309| - | - |
273| "Registry validation failed for package" | Ensure your package includes the required validation information (e.g, `mcpName` property in `package.json`). |
310| "Registry validation failed for package" | Ensure your package includes the required ownership-verification marker for its package type. For npm this is `mcpName` in `package.json`; for PyPI and NuGet it is an `mcp-name: <server-name>` line (or HTML comment) in the package README; for other types see [Package Types](https://modelcontextprotocol.io/registry/package-types.md). |
274311| "Invalid or expired Registry JWT token" | Re-authenticate by running `mcp-publisher login github`. |
275312| "You do not have permission to publish this server" | Your authentication method doesn't match your server's namespace format. With GitHub auth, your server name must start with `io.github.your-username/`. |
276313
No line in this hunk matches that.