Skip to content

Commit f1cd60b

Browse files
authored
feat: add server.schema.json for MCP registry schema versioning (#1)
Add JSON schema file for MCP server.json format to enable schema versioning and IDE support. This schema will be served at https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json to support the $schema property added in modelcontextprotocol/registry#308. The hosted schema enables: - Self-describing server.json files - IDE validation and autocomplete - Version tracking for schema evolution - Better tooling integration Supports modelcontextprotocol/registry#308
1 parent 4c3c434 commit f1cd60b

File tree

1 file changed

+368
-0
lines changed

1 file changed

+368
-0
lines changed
Lines changed: 368 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,368 @@
1+
{
2+
"$schema": "https://json-schema.org/draft/2020-12/schema",
3+
"$id": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json",
4+
"title": "MCP Server Detail",
5+
"$ref": "#/$defs/ServerDetail",
6+
"$defs": {
7+
"Repository": {
8+
"type": "object",
9+
"required": [
10+
"url",
11+
"source"
12+
],
13+
"properties": {
14+
"url": {
15+
"type": "string",
16+
"format": "uri",
17+
"example": "https://github.com/modelcontextprotocol/servers"
18+
},
19+
"source": {
20+
"type": "string",
21+
"description": "Repository hosting service",
22+
"example": "github"
23+
},
24+
"id": {
25+
"type": "string",
26+
"example": "b94b5f7e-c7c6-d760-2c78-a5e9b8a5b8c9"
27+
}
28+
}
29+
},
30+
"VersionDetail": {
31+
"type": "object",
32+
"description": "Version information for this server. Defined as an object to allow for downstream extensibility (e.g. release_date)",
33+
"required": [
34+
"version"
35+
],
36+
"properties": {
37+
"version": {
38+
"type": "string",
39+
"maxLength": 255,
40+
"example": "1.0.2",
41+
"description": "Version string for this server. SHOULD follow semantic versioning (e.g., '1.0.2', '2.1.0-alpha'). Equivalent of Implementation.version in MCP specification. Non-semantic versions are allowed but may not sort predictably."
42+
}
43+
}
44+
},
45+
"Server": {
46+
"type": "object",
47+
"required": [
48+
"name",
49+
"description",
50+
"version_detail"
51+
],
52+
"properties": {
53+
"name": {
54+
"type": "string",
55+
"description": "Server name/identifier",
56+
"example": "io.modelcontextprotocol/filesystem"
57+
},
58+
"description": {
59+
"type": "string",
60+
"description": "Human-readable description of the server's functionality",
61+
"example": "Node.js server implementing Model Context Protocol (MCP) for filesystem operations."
62+
},
63+
"status": {
64+
"type": "string",
65+
"enum": ["active", "deprecated"],
66+
"default": "active",
67+
"description": "Server lifecycle status. 'deprecated' indicates the server is no longer recommended for new usage."
68+
},
69+
"repository": {
70+
"$ref": "#/$defs/Repository"
71+
},
72+
"version_detail": {
73+
"$ref": "#/$defs/VersionDetail"
74+
}
75+
}
76+
},
77+
"Package": {
78+
"type": "object",
79+
"required": [
80+
"registry_name",
81+
"name",
82+
"version"
83+
],
84+
"properties": {
85+
"registry_name": {
86+
"type": "string",
87+
"description": "Package registry type",
88+
"example": "npm"
89+
},
90+
"name": {
91+
"type": "string",
92+
"description": "Package name in the registry",
93+
"example": "io.modelcontextprotocol/filesystem"
94+
},
95+
"version": {
96+
"type": "string",
97+
"description": "Package version",
98+
"example": "1.0.2"
99+
},
100+
"runtime_hint": {
101+
"type": "string",
102+
"description": "A hint to help clients determine the appropriate runtime for the package. This field should be provided when `runtime_arguments` are present.",
103+
"examples": [
104+
"npx",
105+
"uvx",
106+
"dnx"
107+
]
108+
},
109+
"runtime_arguments": {
110+
"type": "array",
111+
"description": "A list of arguments to be passed to the package's runtime command (such as docker or npx). The `runtime_hint` field should be provided when `runtime_arguments` are present.",
112+
"items": {
113+
"$ref": "#/$defs/Argument"
114+
}
115+
},
116+
"package_arguments": {
117+
"type": "array",
118+
"description": "A list of arguments to be passed to the package's binary.",
119+
"items": {
120+
"$ref": "#/$defs/Argument"
121+
}
122+
},
123+
"environment_variables": {
124+
"type": "array",
125+
"description": "A mapping of environment variables to be set when running the package.",
126+
"items": {
127+
"$ref": "#/$defs/KeyValueInput"
128+
}
129+
}
130+
}
131+
},
132+
"Input": {
133+
"type": "object",
134+
"properties": {
135+
"description": {
136+
"description": "A description of the input, which clients can use to provide context to the user.",
137+
"type": "string"
138+
},
139+
"is_required": {
140+
"type": "boolean",
141+
"default": false
142+
},
143+
"format": {
144+
"type": "string",
145+
"description": "Specifies the input format. Supported values include `filepath`, which should be interpreted as a file on the user's filesystem.\n\nWhen the input is converted to a string, booleans should be represented by the strings \"true\" and \"false\", and numbers should be represented as decimal values.",
146+
"enum": [
147+
"string",
148+
"number",
149+
"boolean",
150+
"filepath"
151+
],
152+
"default": "string"
153+
},
154+
"value": {
155+
"type": "string",
156+
"description": "The default value for the input. If this is not set, the user may be prompted to provide a value. If a value is set, it should not be configurable by end users.\n\nIdentifiers wrapped in `{curly_braces}` will be replaced with the corresponding properties from the input `variables` map. If an identifier in braces is not found in `variables`, or if `variables` is not provided, the `{curly_braces}` substring should remain unchanged.\n"
157+
},
158+
"is_secret": {
159+
"type": "boolean",
160+
"description": "Indicates whether the input is a secret value (e.g., password, token). If true, clients should handle the value securely.",
161+
"default": false
162+
},
163+
"default": {
164+
"type": "string",
165+
"description": "The default value for the input."
166+
},
167+
"choices": {
168+
"type": "array",
169+
"description": "A list of possible values for the input. If provided, the user must select one of these values.",
170+
"items": {
171+
"type": "string"
172+
},
173+
"example": []
174+
}
175+
}
176+
},
177+
"InputWithVariables": {
178+
"allOf": [
179+
{
180+
"$ref": "#/$defs/Input"
181+
},
182+
{
183+
"type": "object",
184+
"properties": {
185+
"variables": {
186+
"type": "object",
187+
"description": "A map of variable names to their values. Keys in the input `value` that are wrapped in `{curly_braces}` will be replaced with the corresponding variable values.",
188+
"additionalProperties": {
189+
"$ref": "#/$defs/Input"
190+
}
191+
}
192+
}
193+
}
194+
]
195+
},
196+
"PositionalArgument": {
197+
"description": "A positional input is a value inserted verbatim into the command line.",
198+
"allOf": [
199+
{
200+
"$ref": "#/$defs/InputWithVariables"
201+
},
202+
{
203+
"type": "object",
204+
"required": [
205+
"type"
206+
],
207+
"properties": {
208+
"type": {
209+
"type": "string",
210+
"enum": [
211+
"positional"
212+
],
213+
"example": "positional"
214+
},
215+
"value_hint": {
216+
"type": "string",
217+
"description": "An identifier-like hint for the value. This is not part of the command line, but can be used by client configuration and to provide hints to users.",
218+
"example": "file_path"
219+
},
220+
"is_repeated": {
221+
"type": "boolean",
222+
"description": "Whether the argument can be repeated multiple times in the command line.",
223+
"default": false
224+
}
225+
},
226+
"anyOf": [
227+
{
228+
"required": [
229+
"value_hint"
230+
]
231+
},
232+
{
233+
"required": [
234+
"value"
235+
]
236+
}
237+
]
238+
}
239+
]
240+
},
241+
"NamedArgument": {
242+
"description": "A command-line `--flag={value}`.",
243+
"allOf": [
244+
{
245+
"$ref": "#/$defs/InputWithVariables"
246+
},
247+
{
248+
"type": "object",
249+
"required": [
250+
"type",
251+
"name"
252+
],
253+
"properties": {
254+
"type": {
255+
"type": "string",
256+
"enum": [
257+
"named"
258+
],
259+
"example": "named"
260+
},
261+
"name": {
262+
"type": "string",
263+
"description": "The flag name, including any leading dashes.",
264+
"example": "--port"
265+
},
266+
"is_repeated": {
267+
"type": "boolean",
268+
"description": "Whether the argument can be repeated multiple times.",
269+
"default": false
270+
}
271+
}
272+
}
273+
]
274+
},
275+
"KeyValueInput": {
276+
"allOf": [
277+
{
278+
"$ref": "#/$defs/InputWithVariables"
279+
},
280+
{
281+
"type": "object",
282+
"required": [
283+
"name"
284+
],
285+
"properties": {
286+
"name": {
287+
"type": "string",
288+
"description": "Name of the header or environment variable.",
289+
"example": "SOME_VARIABLE"
290+
}
291+
}
292+
}
293+
]
294+
},
295+
"Argument": {
296+
"anyOf": [
297+
{
298+
"$ref": "#/$defs/PositionalArgument"
299+
},
300+
{
301+
"$ref": "#/$defs/NamedArgument"
302+
}
303+
]
304+
},
305+
"Remote": {
306+
"type": "object",
307+
"required": [
308+
"transport_type",
309+
"url"
310+
],
311+
"properties": {
312+
"transport_type": {
313+
"type": "string",
314+
"enum": [
315+
"streamable",
316+
"sse"
317+
],
318+
"description": "Transport protocol type",
319+
"example": "sse"
320+
},
321+
"url": {
322+
"type": "string",
323+
"format": "uri",
324+
"description": "Remote server URL",
325+
"example": "https://mcp-fs.example.com/sse"
326+
},
327+
"headers": {
328+
"type": "array",
329+
"description": "HTTP headers to include",
330+
"items": {
331+
"$ref": "#/$defs/KeyValueInput"
332+
}
333+
}
334+
}
335+
},
336+
"ServerDetail": {
337+
"description": "Schema for a static representation of an MCP server. Used in various contexts related to discovery, installation, and configuration.",
338+
"allOf": [
339+
{
340+
"$ref": "#/$defs/Server"
341+
},
342+
{
343+
"type": "object",
344+
"properties": {
345+
"$schema": {
346+
"type": "string",
347+
"format": "uri",
348+
"description": "JSON Schema URI for this server.json format",
349+
"example": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json"
350+
},
351+
"packages": {
352+
"type": "array",
353+
"items": {
354+
"$ref": "#/$defs/Package"
355+
}
356+
},
357+
"remotes": {
358+
"type": "array",
359+
"items": {
360+
"$ref": "#/$defs/Remote"
361+
}
362+
}
363+
}
364+
}
365+
]
366+
}
367+
}
368+
}

0 commit comments

Comments
 (0)