One read of Model Context Protocolmcp-20261020T200724Z
306 pages moved out of 357 read.
Pages moved
306
significant first
Pages read
357
in this capture
Captured
20:07 UTC
Corpus hash
077a51951f96
corpus-hash
What this read moved
126-150 of 306, page 6 of 13This capture is too large to show at once. Changes 126-150 of 306 are below, significant first; the rest are on the following screens.
extensions/skills/overview Changed · +15 / -15 lines
from line 12
1212[implementations list](https://github.com/modelcontextprotocol/ext-skills/blob/main/docs/implementations.md)
1313for current coverage.
1414
15<Card title="modelcontextprotocol/ext-skills" icon="github" href="https://github.com/modelcontextprotocol/ext-skills">
16 Specification and documentation for Skills over MCP.
17</Card>
15> **[modelcontextprotocol/ext-skills](https://github.com/modelcontextprotocol/ext-skills)**
16>
17> Specification and documentation for Skills over MCP.
1818
1919The Skills extension allows MCP servers to expose workflow instructions and
2020supporting files to clients. Clients can discover available skills, retrieve
from line 68
6868indicates support without directory reading. Clients issue `skills/list` and
6969`skills/get` only after observing the server's declaration.
7070
71<Note>
72 These examples use protocol revision `2026-07-28` or later. For brevity, the
73 request examples omit `_meta`. Every request **MUST** include the required
74 [request metadata](/specification/draft/basic/index#_meta).
75</Note>
71> [!NOTE]
72>
73> These examples use protocol revision `2026-07-28` or later. For brevity, the
74> request examples omit `_meta`. Every request **MUST** include the required
75> [request metadata](/specification/draft/basic/index#_meta).
7676
7777## Protocol Messages
7878
from line 372
372372files from filesystem-skill discovery paths and preserve their MCP origin,
373373including after a restart.
374374
375<Note>
376 Digests establish consistency with the server's manifest, not trust in its
377 content. For generated content without stable digests, an entry uses
378 `"resources": "dynamic"`. Hosts **MAY** decline these skills. If accepted,
379 hosts **MUST** still verify frontmatter and **MUST NOT** treat persisted
380 approval as covering arbitrary future content.
381</Note>
375> [!NOTE]
376>
377> Digests establish consistency with the server's manifest, not trust in its
378> content. For generated content without stable digests, an entry uses
379> `"resources": "dynamic"`. Hosts **MAY** decline these skills. If accepted,
380> hosts **MUST** still verify frontmatter and **MUST NOT** treat persisted
381> approval as covering arbitrary future content.
382382
383383## Implementation Requirements
384384
extensions/tasks/overview Changed · +92 / -96 lines
from line 4
44
55The [ext-tasks repository](https://github.com/modelcontextprotocol/ext-tasks) contains the full specification and documentation for MCP Tasks.
66
7<Card title="modelcontextprotocol/ext-tasks" icon="github" href="https://github.com/modelcontextprotocol/ext-tasks">
8 Full specification and documentation for MCP Tasks.
9</Card>
7> **[modelcontextprotocol/ext-tasks](https://github.com/modelcontextprotocol/ext-tasks)**
8>
9> Full specification and documentation for MCP Tasks.
1010
1111Not every tool call returns instantly. Some operations — CI pipelines, batch
1212processing, human approvals — take seconds, minutes, or longer. MCP Tasks let
from line 144
144144
145145To consume task-augmented responses, your client must:
146146
147<Steps>
148 <Step title="Declare support">
149 Include the extension in its per-request capabilities:
147**1. Declare support**
150148
151 ```jsonc theme={null}
152 {
153 "jsonrpc": "2.0",
154 "id": 1,
155 "method": "...",
156 "params": {
157 // Other fields...
158 "_meta": {
159 // Other fields...
160 "io.modelcontextprotocol/clientCapabilities": {
161 "extensions": {
162 "io.modelcontextprotocol/tasks": {},
163 },
164 },
149Include the extension in its per-request capabilities:
150
151```jsonc theme={null}
152{
153 "jsonrpc": "2.0",
154 "id": 1,
155 "method": "...",
156 "params": {
157 // Other fields...
158 "_meta": {
159 // Other fields...
160 "io.modelcontextprotocol/clientCapabilities": {
161 "extensions": {
162 "io.modelcontextprotocol/tasks": {},
165163 },
166164 },
167 }
168 ```
169 </Step>
165 },
166 },
167}
168```
170169
171 <Step title="Handle polymorphic results">
172 When issuing a supported request (e.g., `tools/call`), be prepared to receive
173 either the standard result or a `CreateTaskResult` with `resultType: "task"`.
174 </Step>
170**2. Handle polymorphic results**
175171
176 <Step title="Poll for completion">
177 Call `tasks/get` with the returned `taskId`, respecting the `pollIntervalMs`
178 value. Continue polling until the task reaches a terminal status (`completed`,
179 `failed`, or `cancelled`).
180 </Step>
172When issuing a supported request (e.g., `tools/call`), be prepared to receive
173either the standard result or a `CreateTaskResult` with `resultType: "task"`.
181174
182 <Step title="Handle input requests">
183 If the task status is `input_required`, read the `inputRequests` map, present
184 the requests to the user or model, and submit responses via `tasks/update`.
185 </Step>
175**3. Poll for completion**
186176
187 <Step title="Persist task IDs">
188 Store task IDs durably so polling can resume after a client crash or restart.
189 </Step>
190</Steps>
177Call `tasks/get` with the returned `taskId`, respecting the `pollIntervalMs`
178value. Continue polling until the task reaches a terminal status (`completed`,
179`failed`, or `cancelled`).
191180
181**4. Handle input requests**
182
183If the task status is `input_required`, read the `inputRequests` map, present
184the requests to the user or model, and submit responses via `tasks/update`.
185
186**5. Persist task IDs**
187
188Store task IDs durably so polling can resume after a client crash or restart.
189
192190### For MCP servers
193191
194192To return tasks from your server:
195193
196<Steps>
197 <Step title="Advertise support">
198 Include the extension in your `server/discover` capabilities:
194**1. Advertise support**
199195
200 ```jsonc theme={null}
201 {
202 "jsonrpc": "2.0",
203 "id": 1,
204 "result": {
205 // Other fields...
206 "capabilities": {
207 "extensions": {
208 "io.modelcontextprotocol/tasks": {},
209 },
210 },
196Include the extension in your `server/discover` capabilities:
197
198```jsonc theme={null}
199{
200 "jsonrpc": "2.0",
201 "id": 1,
202 "result": {
203 // Other fields...
204 "capabilities": {
205 "extensions": {
206 "io.modelcontextprotocol/tasks": {},
211207 },
212 }
213 ```
214 </Step>
208 },
209 },
210}
211```
215212
216 <Step title="Check client capabilities">
217 Before returning a `CreateTaskResult`, verify that the client included the
218 extension in its per-request capabilities. Never return a task to a client that
219 did not declare support.
220 </Step>
213**2. Check client capabilities**
221214
222 <Step title="Return CreateTaskResult">
223 When a request will be long-running, respond with `resultType: "task"` and a
224 `Task` object containing a unique `taskId`, initial status, `ttlMs`, and
225 `pollIntervalMs`. The task must be durably created before sending the response.
226 </Step>
215Before returning a `CreateTaskResult`, verify that the client included the
216extension in its per-request capabilities. Never return a task to a client that
217did not declare support.
227218
228 <Step title="Serve tasks/get">
229 Return the current task state on each poll. For terminal states, include the
230 `result` (on `completed`) or `error` (on `failed`) field.
231 </Step>
219**3. Return CreateTaskResult**
232220
233 <Step title="Handle tasks/update">
234 Accept `inputResponses` keyed to outstanding `inputRequests`. Acknowledge with
235 an empty result. Ignore responses for unknown or already-satisfied keys.
236 </Step>
221When a request will be long-running, respond with `resultType: "task"` and a
222`Task` object containing a unique `taskId`, initial status, `ttlMs`, and
223`pollIntervalMs`. The task must be durably created before sending the response.
237224
238 <Step title="Handle tasks/cancel">
239 Acknowledge cancellation requests with an empty result. Honor them when
240 possible, but cancellation is cooperative — the task may still reach a
241 non-`cancelled` terminal status.
242 </Step>
243</Steps>
225**4. Serve tasks/get**
244226
227Return the current task state on each poll. For terminal states, include the
228`result` (on `completed`) or `error` (on `failed`) field.
229
230**5. Handle tasks/update**
231
232Accept `inputResponses` keyed to outstanding `inputRequests`. Acknowledge with
233an empty result. Ignore responses for unknown or already-satisfied keys.
234
235**6. Handle tasks/cancel**
236
237Acknowledge cancellation requests with an empty result. Honor them when
238possible, but cancellation is cooperative — the task may still reach a
239non-`cancelled` terminal status.
240
245241## Client support
246242
247<Note>
248 MCP Tasks is an extension to the [core MCP specification](/specification/latest). Host
249 support varies by client.
250</Note>
243> [!NOTE]
244>
245> MCP Tasks is an extension to the [core MCP specification](/specification/latest). Host
246> support varies by client.
251247
252248See the [client matrix](/extensions/client-matrix) for extension support across
253249clients. Task support requires explicit opt-in from both client and server.
registry/about Changed · +4 / -4 lines
from line 1
11# The MCP Registry
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77The MCP Registry is the official centralized metadata repository for publicly accessible MCP servers, backed by major trusted contributors to the MCP ecosystem such as Anthropic, GitHub, PulseMCP, and Microsoft.
88
from line 24
2424
2525The MCP Registry is part of an ecosystem that looks something like:
2626
27<img src="https://mintcdn.com/mcp/jWyXLg8iLYJ-g6Lo/registry/ecosystem-diagram.excalidraw.svg?fit=max&auto=format&n=jWyXLg8iLYJ-g6Lo&q=85&s=06fcebbf5a33d3ef1fed72279f01f321" alt="The MCP Registry ecosystem" width="2787" height="1811" data-path="registry/ecosystem-diagram.excalidraw.svg" />
27
2828
2929### Relationship with Package Registries
3030
registry/authentication Changed · +213 / -221 lines
from line 1
11# How to Authenticate When Publishing to the Official MCP Registry
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77You must authenticate before publishing to the official MCP Registry. The MCP Registry supports different authentication methods. Which authentication method you choose determines the namespace of your server's name.
88
from line 50
5050
5151To perform DNS authentication using the `mcp-publisher` CLI tool, run the following commands in your server project directory to generate a TXT record based on a public/private key pair:
5252
53<CodeGroup>
54 ```bash Ed25519 theme={null}
55 MY_DOMAIN="example.com"
53```bash Ed25519 theme={null}
54MY_DOMAIN="example.com"
5655
57 # Generate public/private key pair using Ed25519
58 openssl genpkey -algorithm Ed25519 -out key.pem
56# Generate public/private key pair using Ed25519
57openssl genpkey -algorithm Ed25519 -out key.pem
5958
60 # Generate TXT record
61 PUBLIC_KEY="$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)"
62 echo "${MY_DOMAIN}. IN TXT \"v=MCPv1; k=ed25519; p=${PUBLIC_KEY}\""
63 ```
59# Generate TXT record
60PUBLIC_KEY="$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)"
61echo "${MY_DOMAIN}. IN TXT \"v=MCPv1; k=ed25519; p=${PUBLIC_KEY}\""
62```
6463
65 ```bash ECDSA P-384 theme={null}
66 MY_DOMAIN="example.com"
64```bash ECDSA P-384 theme={null}
65MY_DOMAIN="example.com"
6766
68 # Generate public/private key pair using ECDSA P-384
69 openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out key.pem
67# Generate public/private key pair using ECDSA P-384
68openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out key.pem
7069
71 # Generate TXT record
72 PUBLIC_KEY="$(openssl ec -in key.pem -text -noout -conv_form compressed | grep -A4 "pub:" | tail -n +2 | tr -d ' :\n' | xxd -r -p | base64)"
73 echo "${MY_DOMAIN}. IN TXT \"v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}\""
74 ```
70# Generate TXT record
71PUBLIC_KEY="$(openssl ec -in key.pem -text -noout -conv_form compressed | grep -A4 "pub:" | tail -n +2 | tr -d ' :\n' | xxd -r -p | base64)"
72echo "${MY_DOMAIN}. IN TXT \"v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}\""
73```
7574
76 ```bash Google KMS theme={null}
77 MY_DOMAIN="example.com"
78 MY_PROJECT="myproject"
79 MY_KEYRING="mykeyring"
80 MY_KEY_NAME="mykey"
75```bash Google KMS theme={null}
76MY_DOMAIN="example.com"
77MY_PROJECT="myproject"
78MY_KEYRING="mykeyring"
79MY_KEY_NAME="mykey"
8180
82 # Log in using gcloud CLI (https://cloud.google.com/sdk/docs/install)
83 gcloud auth login
81# Log in using gcloud CLI (https://cloud.google.com/sdk/docs/install)
82gcloud auth login
8483
85 # Set default project
86 gcloud config set project "${MY_PROJECT}"
84# Set default project
85gcloud config set project "${MY_PROJECT}"
8786
88 # Create a keyring in your project
89 gcloud kms keyrings create "${MY_KEYRING}" --location global
87# Create a keyring in your project
88gcloud kms keyrings create "${MY_KEYRING}" --location global
9089
91 # Create an Ed25519 signing key
92 gcloud kms keys create "${MY_KEY_NAME}" --default-algorithm=ec-sign-ed25519 --purpose=asymmetric-signing --keyring="${MY_KEYRING}" --location=global
90# Create an Ed25519 signing key
91gcloud kms keys create "${MY_KEY_NAME}" --default-algorithm=ec-sign-ed25519 --purpose=asymmetric-signing --keyring="${MY_KEYRING}" --location=global
9392
94 # Enable Application Default Credentials (ADC) so the publisher tool can sign
95 gcloud auth application-default login
93# Enable Application Default Credentials (ADC) so the publisher tool can sign
94gcloud auth application-default login
9695
97 # Attempt login to show the public key
98 mcp-publisher login dns google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
96# Attempt login to show the public key
97mcp-publisher login dns google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
9998
100 # Copy the "Expected proof record":
101 # ${MY_DOMAIN}. IN TXT "v=MCPv1; k=ed25519; p=${PUBLIC_KEY}"
102 ```
99# Copy the "Expected proof record":
100# ${MY_DOMAIN}. IN TXT "v=MCPv1; k=ed25519; p=${PUBLIC_KEY}"
101```
103102
104 ```bash Azure Key Vault theme={null}
105 MY_DOMAIN="example.com"
106 MY_SUBSCRIPTION="subscription name or ID"
107 MY_RESOURCE_GROUP="MyResourceGroup"
108 MY_KEY_VAULT="MyKeyVault"
109 MY_KEY_NAME="MyKey"
103```bash Azure Key Vault theme={null}
104MY_DOMAIN="example.com"
105MY_SUBSCRIPTION="subscription name or ID"
106MY_RESOURCE_GROUP="MyResourceGroup"
107MY_KEY_VAULT="MyKeyVault"
108MY_KEY_NAME="MyKey"
110109
111 # Log in using Azure CLI (https://learn.microsoft.com/en-us/cli/azure/install-azure-cli)
112 az login
110# Log in using Azure CLI (https://learn.microsoft.com/en-us/cli/azure/install-azure-cli)
111az login
113112
114 # Set default subscription
115 az account set --subscription "${MY_SUBSCRIPTION}"
113# Set default subscription
114az account set --subscription "${MY_SUBSCRIPTION}"
116115
117 # Create a resource group
118 az group create --location westus --resource-group "${MY_RESOURCE_GROUP}"
116# Create a resource group
117az group create --location westus --resource-group "${MY_RESOURCE_GROUP}"
119118
120 # Create a key vault
121 az keyvault create --name "${MY_KEY_VAULT}" --location westus --resource-group "${MY_RESOURCE_GROUP}"
119# Create a key vault
120az keyvault create --name "${MY_KEY_VAULT}" --location westus --resource-group "${MY_RESOURCE_GROUP}"
122121
123 # Create an ECDSA P-384 signing key
124 az keyvault key create --name "${MY_KEY_NAME}" --vault-name "${MY_KEY_VAULT}" --curve P-384
122# Create an ECDSA P-384 signing key
123az keyvault key create --name "${MY_KEY_NAME}" --vault-name "${MY_KEY_VAULT}" --curve P-384
125124
126 # Attempt login to show the public key
127 mcp-publisher login dns azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
125# Attempt login to show the public key
126mcp-publisher login dns azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
128127
129 # Copy the "Expected proof record":
130 # ${MY_DOMAIN}. IN TXT "v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}"
131 ```
132</CodeGroup>
128# Copy the "Expected proof record":
129# ${MY_DOMAIN}. IN TXT "v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}"
130```
133131
134132Then add the TXT record using your DNS provider's control panel. It may take several minutes for the TXT record to propagate. After the TXT record has propagated, log in using the `mcp-publisher login` command:
135133
136<CodeGroup>
137 ```bash Ed25519 theme={null}
138 MY_DOMAIN="example.com"
134```bash Ed25519 theme={null}
135MY_DOMAIN="example.com"
139136
140 PRIVATE_KEY="$(openssl pkey -in key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')"
141 mcp-publisher login dns --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
142 ```
137PRIVATE_KEY="$(openssl pkey -in key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')"
138mcp-publisher login dns --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
139```
143140
144 ```bash ECDSA P-384 theme={null}
145 MY_DOMAIN="example.com"
141```bash ECDSA P-384 theme={null}
142MY_DOMAIN="example.com"
146143
147 PRIVATE_KEY="$(openssl ec -in key.pem -noout -text | grep -A4 "priv:" | tail -n +2 | tr -d ' :\n')"
148 mcp-publisher login dns --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
149 ```
144PRIVATE_KEY="$(openssl ec -in key.pem -noout -text | grep -A4 "priv:" | tail -n +2 | tr -d ' :\n')"
145mcp-publisher login dns --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
146```
150147
151 ```bash Google KMS theme={null}
152 MY_DOMAIN="example.com"
153 MY_PROJECT="myproject"
154 MY_KEYRING="mykeyring"
155 MY_KEY_NAME="mykey"
148```bash Google KMS theme={null}
149MY_DOMAIN="example.com"
150MY_PROJECT="myproject"
151MY_KEYRING="mykeyring"
152MY_KEY_NAME="mykey"
156153
157 mcp-publisher login dns google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
158 ```
154mcp-publisher login dns google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
155```
159156
160 ```bash Azure Key Vault theme={null}
161 MY_DOMAIN="example.com"
162 MY_KEY_VAULT="MyKeyVault"
163 MY_KEY_NAME="MyKey"
157```bash Azure Key Vault theme={null}
158MY_DOMAIN="example.com"
159MY_KEY_VAULT="MyKeyVault"
160MY_KEY_NAME="MyKey"
164161
165 mcp-publisher login dns azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
166 ```
167</CodeGroup>
162mcp-publisher login dns azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
163```
168164
169165## HTTP Authentication
170166
from line 168
172168
173169To perform HTTP authentication using the `mcp-publisher` CLI tool, run the following commands in your server project directory to generate an `mcp-registry-auth` file based on a public/private key pair:
174170
175<CodeGroup>
176 ```bash Ed25519 theme={null}
177 # Generate public/private key pair using Ed25519
178 openssl genpkey -algorithm Ed25519 -out key.pem
171```bash Ed25519 theme={null}
172# Generate public/private key pair using Ed25519
173openssl genpkey -algorithm Ed25519 -out key.pem
179174
180 # Generate mcp-registry-auth file
181 PUBLIC_KEY="$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)"
182 echo "v=MCPv1; k=ed25519; p=${PUBLIC_KEY}" > mcp-registry-auth
183 ```
175# Generate mcp-registry-auth file
176PUBLIC_KEY="$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)"
177echo "v=MCPv1; k=ed25519; p=${PUBLIC_KEY}" > mcp-registry-auth
178```
184179
185 ```bash ECDSA P-384 theme={null}
186 # Generate public/private key pair using ECDSA P-384
187 openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out key.pem
180```bash ECDSA P-384 theme={null}
181# Generate public/private key pair using ECDSA P-384
182openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out key.pem
188183
189 # Generate mcp-registry-auth file
190 PUBLIC_KEY="$(openssl ec -in key.pem -text -noout -conv_form compressed | grep -A4 "pub:" | tail -n +2 | tr -d ' :\n' | xxd -r -p | base64)"
191 echo "v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}" > mcp-registry-auth
192 ```
184# Generate mcp-registry-auth file
185PUBLIC_KEY="$(openssl ec -in key.pem -text -noout -conv_form compressed | grep -A4 "pub:" | tail -n +2 | tr -d ' :\n' | xxd -r -p | base64)"
186echo "v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}" > mcp-registry-auth
187```
193188
194 ```bash Google KMS theme={null}
195 MY_DOMAIN="example.com"
196 MY_PROJECT="myproject"
197 MY_KEYRING="mykeyring"
198 MY_KEY_NAME="mykey"
189```bash Google KMS theme={null}
190MY_DOMAIN="example.com"
191MY_PROJECT="myproject"
192MY_KEYRING="mykeyring"
193MY_KEY_NAME="mykey"
199194
200 # Log in using gcloud CLI (https://cloud.google.com/sdk/docs/install)
201 gcloud auth login
195# Log in using gcloud CLI (https://cloud.google.com/sdk/docs/install)
196gcloud auth login
202197
203 # Set default project
204 gcloud config set project "${MY_PROJECT}"
198# Set default project
199gcloud config set project "${MY_PROJECT}"
205200
206 # Create a keyring in your project
207 gcloud kms keyrings create "${MY_KEYRING}" --location global
201# Create a keyring in your project
202gcloud kms keyrings create "${MY_KEYRING}" --location global
208203
209 # Create an Ed25519 signing key
210 gcloud kms keys create "${MY_KEY_NAME}" --default-algorithm=ec-sign-ed25519 --purpose=asymmetric-signing --keyring="${MY_KEYRING}" --location=global
204# Create an Ed25519 signing key
205gcloud kms keys create "${MY_KEY_NAME}" --default-algorithm=ec-sign-ed25519 --purpose=asymmetric-signing --keyring="${MY_KEYRING}" --location=global
211206
212 # Enable Application Default Credentials (ADC) so the publisher tool can sign
213 gcloud auth application-default login
207# Enable Application Default Credentials (ADC) so the publisher tool can sign
208gcloud auth application-default login
214209
215 # Attempt login to show the public key
216 mcp-publisher login http google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
210# Attempt login to show the public key
211mcp-publisher login http google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
217212
218 # Copy the "Expected proof record" to `./mcp-registry-auth`:
219 # v=MCPv1; k=ed25519; p=${PUBLIC_KEY}
220 ```
213# Copy the "Expected proof record" to `./mcp-registry-auth`:
214# v=MCPv1; k=ed25519; p=${PUBLIC_KEY}
215```
221216
222 ```bash Azure Key Vault theme={null}
223 MY_DOMAIN="example.com"
224 MY_SUBSCRIPTION="subscription name or ID"
225 MY_RESOURCE_GROUP="MyResourceGroup"
226 MY_KEY_VAULT="MyKeyVault"
227 MY_KEY_NAME="MyKey"
217```bash Azure Key Vault theme={null}
218MY_DOMAIN="example.com"
219MY_SUBSCRIPTION="subscription name or ID"
220MY_RESOURCE_GROUP="MyResourceGroup"
221MY_KEY_VAULT="MyKeyVault"
222MY_KEY_NAME="MyKey"
228223
229 # Log in using Azure CLI (https://learn.microsoft.com/en-us/cli/azure/install-azure-cli)
230 az login
224# Log in using Azure CLI (https://learn.microsoft.com/en-us/cli/azure/install-azure-cli)
225az login
231226
232 # Set default subscription
233 az account set --subscription "${MY_SUBSCRIPTION}"
227# Set default subscription
228az account set --subscription "${MY_SUBSCRIPTION}"
234229
235 # Create a resource group
236 az group create --location westus --resource-group "${MY_RESOURCE_GROUP}"
230# Create a resource group
231az group create --location westus --resource-group "${MY_RESOURCE_GROUP}"
237232
238 # Create a key vault
239 az keyvault create --name "${MY_KEY_VAULT}" --location westus --resource-group "${MY_RESOURCE_GROUP}"
233# Create a key vault
234az keyvault create --name "${MY_KEY_VAULT}" --location westus --resource-group "${MY_RESOURCE_GROUP}"
240235
241 # Create an ECDSA P-384 signing key
242 az keyvault key create --name "${MY_KEY_NAME}" --vault-name "${MY_KEY_VAULT}" --curve P-384
236# Create an ECDSA P-384 signing key
237az keyvault key create --name "${MY_KEY_NAME}" --vault-name "${MY_KEY_VAULT}" --curve P-384
243238
244 # Attempt login to show the public key
245 mcp-publisher login http azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
239# Attempt login to show the public key
240mcp-publisher login http azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
246241
247 # Copy the "Expected proof record" to `./mcp-registry-auth`:
248 # v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}
249 ```
250</CodeGroup>
242# Copy the "Expected proof record" to `./mcp-registry-auth`:
243# v=MCPv1; k=ecdsap384; p=${PUBLIC_KEY}
244```
251245
252246Then host the `mcp-registry-auth` file at `/.well-known/mcp-registry-auth` on your domain. After the file is hosted, log in using the `mcp-publisher login` command:
253247
254<CodeGroup>
255 ```bash Ed25519 theme={null}
256 MY_DOMAIN="example.com"
257 PRIVATE_KEY="$(openssl pkey -in key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')"
258 mcp-publisher login http --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
259 ```
248```bash Ed25519 theme={null}
249MY_DOMAIN="example.com"
250PRIVATE_KEY="$(openssl pkey -in key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')"
251mcp-publisher login http --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
252```
260253
261 ```bash ECDSA P-384 theme={null}
262 MY_DOMAIN="example.com"
263 PRIVATE_KEY="$(openssl ec -in key.pem -noout -text | grep -A4 "priv:" | tail -n +2 | tr -d ' :\n')"
264 mcp-publisher login http --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
265 ```
254```bash ECDSA P-384 theme={null}
255MY_DOMAIN="example.com"
256PRIVATE_KEY="$(openssl ec -in key.pem -noout -text | grep -A4 "priv:" | tail -n +2 | tr -d ' :\n')"
257mcp-publisher login http --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"
258```
266259
267 ```bash Google KMS theme={null}
268 MY_DOMAIN="example.com"
269 MY_PROJECT="myproject"
270 MY_KEYRING="mykeyring"
271 MY_KEY_NAME="mykey"
260```bash Google KMS theme={null}
261MY_DOMAIN="example.com"
262MY_PROJECT="myproject"
263MY_KEYRING="mykeyring"
264MY_KEY_NAME="mykey"
272265
273 mcp-publisher login http google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
274 ```
266mcp-publisher login http google-kms --domain="${MY_DOMAIN}" --resource="projects/${MY_PROJECT}/locations/global/keyRings/${MY_KEYRING}/cryptoKeys/${MY_KEY_NAME}/cryptoKeyVersions/1"
267```
275268
276 ```bash Azure Key Vault theme={null}
277 MY_DOMAIN="example.com"
278 MY_KEY_VAULT="MyKeyVault"
279 MY_KEY_NAME="MyKey"
269```bash Azure Key Vault theme={null}
270MY_DOMAIN="example.com"
271MY_KEY_VAULT="MyKeyVault"
272MY_KEY_NAME="MyKey"
280273
281 mcp-publisher login http azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
282 ```
283</CodeGroup>
274mcp-publisher login http azure-key-vault --domain="${MY_DOMAIN}" --vault "${MY_KEY_VAULT}" --key "${MY_KEY_NAME}"
275```
284276
registry/faq Changed · +6 / -6 lines
from line 1
11# Frequently Asked Questions
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77## General
88
from line 25
2525
2626Yes, custom metadata under `_meta.io.modelcontextprotocol.registry/publisher-provided` is preserved when publishing to the registry. This allows you to include custom metadata specific to your publishing process.
2727
28<Warning>
29 There is a 4KB size limit (4096 bytes of JSON). Publishing will fail if this limit is exceeded.
30</Warning>
28> [!WARNING]
29>
30> There is a 4KB size limit (4096 bytes of JSON). Publishing will fail if this limit is exceeded.
3131
3232## Reporting Issues
3333
registry/github-actions Changed · +177 / -179 lines
from line 1
11# How to Automate Publishing with GitHub Actions
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77## Step 1: Create a Workflow File
88
99In your server project directory, create a `.github/workflows/publish-mcp.yml` file. Here is an example for npm-based local server, but the MCP Registry publishing steps are the same for all package types:
1010
11<CodeGroup>
12 ```yaml OIDC authentication (recommended) theme={null}
13 name: Publish to MCP Registry
11```yaml OIDC authentication (recommended) theme={null}
12name: Publish to MCP Registry
1413
15 on:
16 push:
17 tags: ["v*"] # Triggers on version tags like v1.0.0
14on:
15 push:
16 tags: ["v*"] # Triggers on version tags like v1.0.0
1817
19 jobs:
20 publish:
21 runs-on: ubuntu-latest
22 permissions:
23 id-token: write # Required for OIDC authentication
24 contents: read
18jobs:
19 publish:
20 runs-on: ubuntu-latest
21 permissions:
22 id-token: write # Required for OIDC authentication
23 contents: read
2524
26 steps:
27 - name: Checkout code
28 uses: actions/checkout@v5
25 steps:
26 - name: Checkout code
27 uses: actions/checkout@v5
2928
30 ### Publish underlying npm package:
29 ### Publish underlying npm package:
3130
32 - name: Set up Node.js
33 uses: actions/setup-node@v5
34 with:
35 node-version: "lts/*"
31 - name: Set up Node.js
32 uses: actions/setup-node@v5
33 with:
34 node-version: "lts/*"
3635
37 - name: Install dependencies
38 run: npm ci
36 - name: Install dependencies
37 run: npm ci
3938
40 - name: Run tests
41 run: npm run test --if-present
39 - name: Run tests
40 run: npm run test --if-present
4241
43 - name: Build package
44 run: npm run build --if-present
42 - name: Build package
43 run: npm run build --if-present
4544
46 - name: Publish package to npm
47 run: npm publish
48 env:
49 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
45 - name: Publish package to npm
46 run: npm publish
47 env:
48 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
5049
51 ### Publish MCP server:
50 ### Publish MCP server:
5251
53 - name: Install mcp-publisher
54 run: |
55 curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
52 - name: Install mcp-publisher
53 run: |
54 curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
5655
57 - name: Authenticate to MCP Registry
58 run: ./mcp-publisher login github-oidc
56 - name: Authenticate to MCP Registry
57 run: ./mcp-publisher login github-oidc
5958
60 # Optional:
61 # - name: Set version in server.json
62 # run: |
63 # VERSION=${GITHUB_REF#refs/tags/v}
64 # jq --arg v "$VERSION" '.version = $v' server.json > server.tmp && mv server.tmp server.json
59 # Optional:
60 # - name: Set version in server.json
61 # run: |
62 # VERSION=${GITHUB_REF#refs/tags/v}
63 # jq --arg v "$VERSION" '.version = $v' server.json > server.tmp && mv server.tmp server.json
6564
66 - name: Publish server to MCP Registry
67 run: ./mcp-publisher publish
68 ```
65 - name: Publish server to MCP Registry
66 run: ./mcp-publisher publish
67```
6968
70 ```yaml PAT authentication theme={null}
71 name: Publish to MCP Registry
69```yaml PAT authentication theme={null}
70name: Publish to MCP Registry
7271
73 on:
74 push:
75 tags: ["v*"] # Triggers on version tags like v1.0.0
72on:
73 push:
74 tags: ["v*"] # Triggers on version tags like v1.0.0
7675
77 jobs:
78 publish:
79 runs-on: ubuntu-latest
80 permissions:
81 contents: read
76jobs:
77 publish:
78 runs-on: ubuntu-latest
79 permissions:
80 contents: read
8281
83 steps:
84 - name: Checkout code
85 uses: actions/checkout@v5
82 steps:
83 - name: Checkout code
84 uses: actions/checkout@v5
8685
87 ### Publish underlying npm package:
86 ### Publish underlying npm package:
8887
89 - name: Set up Node.js
90 uses: actions/setup-node@v5
91 with:
92 node-version: "lts/*"
88 - name: Set up Node.js
89 uses: actions/setup-node@v5
90 with:
91 node-version: "lts/*"
9392
94 - name: Install dependencies
95 run: npm ci
93 - name: Install dependencies
94 run: npm ci
9695
97 - name: Run tests
98 run: npm run test --if-present
96 - name: Run tests
97 run: npm run test --if-present
9998
100 - name: Build package
101 run: npm run build --if-present
99 - name: Build package
100 run: npm run build --if-present
102101
103 - name: Publish package to npm
104 run: npm publish
105 env:
106 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
102 - name: Publish package to npm
103 run: npm publish
104 env:
105 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
107106
108 ### Publish MCP server:
107 ### Publish MCP server:
109108
110 - name: Install mcp-publisher
111 run: |
112 curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
109 - name: Install mcp-publisher
110 run: |
111 curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
113112
114 - name: Authenticate to MCP Registry
115 run: ./mcp-publisher login github --token ${{ secrets.MCP_GITHUB_TOKEN }}
113 - name: Authenticate to MCP Registry
114 run: ./mcp-publisher login github --token ${{ secrets.MCP_GITHUB_TOKEN }}
116115
117 # Optional:
118 # - name: Set version in server.json
119 # run: |
120 # VERSION=${GITHUB_REF#refs/tags/v}
121 # jq --arg v "$VERSION" '.version = $v' server.json > server.tmp && mv server.tmp server.json
116 # Optional:
117 # - name: Set version in server.json
118 # run: |
119 # VERSION=${GITHUB_REF#refs/tags/v}
120 # jq --arg v "$VERSION" '.version = $v' server.json > server.tmp && mv server.tmp server.json
122121
123 - name: Publish server to MCP Registry
124 run: ./mcp-publisher publish
125 ```
122 - name: Publish server to MCP Registry
123 run: ./mcp-publisher publish
124```
126125
127 ```yaml DNS authentication theme={null}
128 name: Publish to MCP Registry
126```yaml DNS authentication theme={null}
127name: Publish to MCP Registry
129128
130 on:
131 push:
132 tags: ["v*"] # Triggers on version tags like v1.0.0
129on:
130 push:
131 tags: ["v*"] # Triggers on version tags like v1.0.0
133132
134 jobs:
135 publish:
136 runs-on: ubuntu-latest
137 permissions:
138 contents: read
133jobs:
134 publish:
135 runs-on: ubuntu-latest
136 permissions:
137 contents: read
139138
140 steps:
141 - name: Checkout code
142 uses: actions/checkout@v5
139 steps:
140 - name: Checkout code
141 uses: actions/checkout@v5
143142
144 ### Publish underlying npm package:
143 ### Publish underlying npm package:
145144
146 - name: Set up Node.js
147 uses: actions/setup-node@v5
148 with:
149 node-version: "lts/*"
145 - name: Set up Node.js
146 uses: actions/setup-node@v5
147 with:
148 node-version: "lts/*"
150149
151 - name: Install dependencies
152 run: npm ci
150 - name: Install dependencies
151 run: npm ci
153152
154 - name: Run tests
155 run: npm run test --if-present
153 - name: Run tests
154 run: npm run test --if-present
156155
157 - name: Build package
158 run: npm run build --if-present
156 - name: Build package
157 run: npm run build --if-present
159158
160 - name: Publish package to npm
161 run: npm publish
162 env:
163 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
159 - name: Publish package to npm
160 run: npm publish
161 env:
162 NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
164163
165 ### Publish MCP server:
164 ### Publish MCP server:
166165
167 - name: Install mcp-publisher
168 run: |
169 curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
166 - name: Install mcp-publisher
167 run: |
168 curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
170169
171 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
172 # TODO: Replace `example.com` with your domain name
173 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
174 - name: Authenticate to MCP Registry
175 run: ./mcp-publisher login dns --domain example.com --private-key ${{ secrets.MCP_PRIVATE_KEY }}
170 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
171 # TODO: Replace `example.com` with your domain name
172 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
173 - name: Authenticate to MCP Registry
174 run: ./mcp-publisher login dns --domain example.com --private-key ${{ secrets.MCP_PRIVATE_KEY }}
176175
177 # Optional:
178 # - name: Set version in server.json
179 # run: |
180 # VERSION=${GITHUB_REF#refs/tags/v}
181 # jq --arg v "$VERSION" '.version = $v' server.json > server.tmp && mv server.tmp server.json
176 # Optional:
177 # - name: Set version in server.json
178 # run: |
179 # VERSION=${GITHUB_REF#refs/tags/v}
180 # jq --arg v "$VERSION" '.version = $v' server.json > server.tmp && mv server.tmp server.json
182181
183 - name: Publish server to MCP Registry
184 run: ./mcp-publisher publish
185 ```
186</CodeGroup>
182 - name: Publish server to MCP Registry
183 run: ./mcp-publisher publish
184```
187185
188186## Step 2: Add Secrets
189187
registry/moderation-policy Changed · +3 / -3 lines
from line 1
11# The MCP Registry Moderation Policy
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77**TL;DR**: The MCP Registry is quite permissive! We only remove illegal content, malware, spam, and completely broken servers.
88
registry/package-types Changed · +3 / -3 lines
from line 1
11# MCP Registry Supported Package Types
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77# Package Types
88
registry/quickstart Changed · +15 / -17 lines
from line 1
11# Quickstart: Publish an MCP Server to the MCP Registry
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
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
from line 92
9292
9393Install the `mcp-publisher` CLI tool using a pre-built binary or [Homebrew](https://brew.sh):
9494
95<CodeGroup>
96 ```bash macOS/Linux theme={null}
97 curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/
98 ```
95```bash macOS/Linux theme={null}
96curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/
97```
9998
100 ```powershell Windows theme={null}
101 $arch = if ([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture -eq "Arm64") { "arm64" } else { "amd64" }; Invoke-WebRequest -Uri "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_windows_$arch.tar.gz" -OutFile "mcp-publisher.tar.gz"; tar xf mcp-publisher.tar.gz mcp-publisher.exe; rm mcp-publisher.tar.gz
102 # Move mcp-publisher.exe to a directory in your PATH
103 ```
99```powershell Windows theme={null}
100$arch = if ([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture -eq "Arm64") { "arm64" } else { "amd64" }; Invoke-WebRequest -Uri "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_windows_$arch.tar.gz" -OutFile "mcp-publisher.tar.gz"; tar xf mcp-publisher.tar.gz mcp-publisher.exe; rm mcp-publisher.tar.gz
101# Move mcp-publisher.exe to a directory in your PATH
102```
104103
105 ```bash theme={null}
106 brew install mcp-publisher
107 ```
108</CodeGroup>
104```bash theme={null}
105brew install mcp-publisher
106```
109107
110108Verify that `mcp-publisher` is correctly installed by running:
111109
registry/registry-aggregators Changed · +6 / -6 lines
from line 1
11# MCP Registry Aggregators
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77Aggregators are downstream consumers of the MCP Registry that provide additional value. For example, a server marketplace that provides user ratings and security scanning.
88
from line 16
1616* [`GET /v0.1/servers/{serverName}/versions`](https://registry.modelcontextprotocol.io/docs#/operations/get-server-versions-v0.1) — List all versions of a server.
1717* [`GET /v0.1/servers/{serverName}/versions/{version}`](https://registry.modelcontextprotocol.io/docs#/operations/get-server-version-v0.1) — Get a specific version of a server. Use the special version `latest` to get the latest version of the server.
1818
19<Warning>
20 URL path parameters such as `serverName` and `version` **must** be URL-encoded. For example, `io.modelcontextprotocol/everything` must be encoded as `io.modelcontextprotocol%2Feverything`.
21</Warning>
19> [!WARNING]
20>
21> URL path parameters such as `serverName` and `version` **must** be URL-encoded. For example, `io.modelcontextprotocol/everything` must be encoded as `io.modelcontextprotocol%2Feverything`.
2222
2323Aggregators will most likely scrape the `GET /v0.1/servers` endpoint.
2424
registry/remote-servers Changed · +3 / -3 lines
from line 1
11# Publishing Remote Servers
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77The MCP Registry supports remote MCP servers via the `remotes` property in `server.json`:
88
registry/terms-of-service Changed · +3 / -3 lines
from line 1
11# Official MCP Registry Terms of Service
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77**Effective date: 2025-09-02**
88
registry/versioning Changed · +9 / -9 lines
from line 1
11# Versioning Published MCP Servers
22
3<Note>
4 The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
5</Note>
3> [!NOTE]
4>
5> The MCP Registry is currently in preview. Breaking changes or data resets may occur before general availability. If you encounter any issues, please report them on [GitHub](https://github.com/modelcontextprotocol/registry/issues).
66
77MCP servers **MUST** define a version string in `server.json`. For example:
88
from line 32
3232
3333The MCP Registry recommends [semantic versioning](https://semver.org/), but supports any version string format. When a server is published, the MCP Registry will attempt to parse its version as a semantic version string for sorting purposes, and will mark the version as "latest" if appropriate. If parsing fails, the version will always be marked as "latest".
3434
35<Warning>
36 If a server uses semantic version strings but publishes a new version that does *not* conform to semantic versioning, the new version will be marked as "latest" even if it would otherwise be sorted before the semantic version strings.
37</Warning>
35> [!WARNING]
36>
37> If a server uses semantic version strings but publishes a new version that does *not* conform to semantic versioning, the new version will be marked as "latest" even if it would otherwise be sorted before the semantic version strings.
3838
3939As an error prevention mechanism, the MCP Registry prohibits version strings that appear to refer to ranges of versions.
4040
from line 148
148148}
149149```
150150
151<Warning>
152 According to semantic versioning, prerelease versions such as `1.2.3-1` are sorted before regular semantic versions such as `1.2.3`. Therefore, if you publish a prerelease version *after* its corresponding regular version, the prerelease version will **not** be marked as "latest".
153</Warning>
151> [!WARNING]
152>
153> According to semantic versioning, prerelease versions such as `1.2.3-1` are sorted before regular semantic versions such as `1.2.3`. Therefore, if you publish a prerelease version *after* its corresponding regular version, the prerelease version will **not** be marked as "latest".
154154
155155## Aggregator Recommendations
156156
seps/1024-mcp-client-security-requirements-for-local-server- Changed · +9 / -15 lines
from line 2
22
33> MCP Client Security Requirements for Local Server Installation
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1034--support-default-values-for-all-primitive-types-in Changed · +9 / -15 lines
from line 2
22
33> Support default values for all primitive types in elicitation schemas
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1036-url-mode-elicitation-for-secure-out-of-band-intera Changed · +11 / -17 lines
from line 2
22
33> URL Mode Elicitation for secure out-of-band interactions
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1046-support-oauth-client-credentials-flow-in-authoriza Changed · +9 / -15 lines
from line 2
22
33> Support OAuth client credentials flow in authorization
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1302-formalize-working-groups-and-interest-groups-in-mc Changed · +11 / -17 lines
from line 2
22
33> Formalize Working Groups and Interest Groups in MCP Governance
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1303-input-validation-errors-as-tool-execution-errors Changed · +9 / -15 lines
from line 2
22
33> Input Validation Errors as Tool Execution Errors
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1319-decouple-request-payload-from-rpc-methods-definiti Changed · +9 / -15 lines
from line 2
22
33> Decouple Request Payload from RPC Methods Definition
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1330-elicitation-enum-schema-improvements-and-standards Changed · +11 / -17 lines
from line 2
22
33> Elicitation Enum Schema Improvements and Standards Compliance
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1577--sampling-with-tools Changed · +11 / -17 lines
from line 2
22
33> Sampling With Tools
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1613-establish-json-schema-2020-12-as-default-dialect-f Changed · +9 / -15 lines
from line 2
22
33> Establish JSON Schema 2020-12 as Default Dialect for MCP
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1686-tasks Changed · +11 / -17 lines
from line 2
22
33> Tasks
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |
seps/1699-support-sse-polling-via-server-side-disconnect Changed · +9 / -15 lines
from line 2
22
33> Support SSE polling via server-side disconnect
44
5<div className="flex items-center gap-2 mb-4">
6 <Badge color="green" shape="pill">
7 Final
8 </Badge>
5Final
96
10 <Badge color="gray" shape="pill">
11 Standards Track
12 </Badge>
13</div>
7Standards Track
148
15<Note>
16 This SEP has reached Final status and is preserved as a historical record of
17 the design as accepted. Changes made to the protocol after finalization are
18 not reflected here. Refer to the [current
19 specification](/specification/latest) and its changelog for authoritative
20 requirements.
21</Note>
9> [!NOTE]
10>
11> This SEP has reached Final status and is preserved as a historical record of
12> the design as accepted. Changes made to the protocol after finalization are
13> not reflected here. Refer to the [current
14> specification](/specification/latest) and its changelog for authoritative
15> requirements.
2216
2317| Field | Value |
2418| - | - |