{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$defs": { "Icon": { "description": "An optionally-sized icon that can be displayed in a user interface.", "properties": { "mimeType": { "description": "Optional MIME type override if the source MIME type is missing or generic.\nFor example: `\"image/png\"`, `\"image/jpeg\"`, or `\"image/svg+xml\"`.", "type": "string" }, "sizes": { "description": "Optional array of strings that specify sizes at which the icon can be used.\nEach string should be in WxH format (e.g., `\"48x48\"`, `\"96x96\"`) or `\"any\"` for scalable formats like SVG.\n\nIf not provided, the client should assume that the icon can be used at any size.", "items": { "type": "string" }, "type": "array" }, "src": { "description": "A standard URI pointing to an icon resource. May be an HTTP/HTTPS URL or a\n`data:` URI with Base64-encoded image data.\n\nConsumers SHOULD take steps to ensure URLs serving icons are from the\nsame domain as the client/server or a trusted domain.\n\nConsumers SHOULD take appropriate precautions when consuming SVGs as they can contain\nexecutable JavaScript.", "format": "uri", "type": "string" }, "theme": { "description": "Optional specifier for the theme this icon is designed for. `\"light\"` indicates\nthe icon is designed to be used with a light background, and `\"dark\"` indicates\nthe icon is designed to be used with a dark background.\n\nIf not provided, the client should assume the icon can be used with any theme.", "enum": ["dark", "light"], "type": "string" } }, "required": ["src"], "type": "object" }, "Input": { "description": "A user-supplied or pre-set input value, used for {@link Remote} URL\nvariables and header values.", "properties": { "choices": { "description": "Allowed values for the input. If provided, the user must select one.", "items": { "type": "string" }, "type": "array" }, "default": { "description": "Default value for the input. SHOULD be a valid value for the input.", "type": "string" }, "description": { "description": "Human-readable explanation of the input. Clients can use this to provide\ncontext to the user.", "type": "string" }, "format": { "description": "Specifies the input format. `\"filepath\"` should be interpreted as a file\non the user's filesystem. When the input is converted to a string,\nbooleans should be represented by `\"true\"`/`\"false\"`, and numbers by\ndecimal values.", "enum": ["boolean", "filepath", "number", "string"], "type": "string" }, "isRequired": { "description": "Whether the input must be supplied for the connection to succeed.", "type": "boolean" }, "isSecret": { "description": "Whether the input is a secret value (e.g., password, token). If true,\nclients should handle the value securely.", "type": "boolean" }, "placeholder": { "description": "Placeholder displayed during configuration to provide examples or\nguidance about the expected form of the input.", "type": "string" }, "value": { "description": "Pre-set value for the input. If set, the value should not be configurable\nby end users. Identifiers wrapped in `{curly_braces}` will be replaced\nwith the corresponding entries from the input's `variables` map (if any).", "type": "string" } }, "type": "object" }, "KeyValueInput": { "description": "A named {@link Input} — used for HTTP headers — whose `value` may reference\nvariables for substitution.", "properties": { "choices": { "description": "Allowed values for the input. If provided, the user must select one.", "items": { "type": "string" }, "type": "array" }, "default": { "description": "Default value for the input. SHOULD be a valid value for the input.", "type": "string" }, "description": { "description": "Human-readable explanation of the input. Clients can use this to provide\ncontext to the user.", "type": "string" }, "format": { "description": "Specifies the input format. `\"filepath\"` should be interpreted as a file\non the user's filesystem. When the input is converted to a string,\nbooleans should be represented by `\"true\"`/`\"false\"`, and numbers by\ndecimal values.", "enum": ["boolean", "filepath", "number", "string"], "type": "string" }, "isRequired": { "description": "Whether the input must be supplied for the connection to succeed.", "type": "boolean" }, "isSecret": { "description": "Whether the input is a secret value (e.g., password, token). If true,\nclients should handle the value securely.", "type": "boolean" }, "name": { "description": "Name of the header.", "type": "string" }, "placeholder": { "description": "Placeholder displayed during configuration to provide examples or\nguidance about the expected form of the input.", "type": "string" }, "value": { "description": "Pre-set value for the input. If set, the value should not be configurable\nby end users. Identifiers wrapped in `{curly_braces}` will be replaced\nwith the corresponding entries from the input's `variables` map (if any).", "type": "string" }, "variables": { "additionalProperties": { "$ref": "#/$defs/Input" }, "description": "Variables referenced by `{curly_braces}` identifiers in `value`. The map\nkey is the variable name; the value defines the variable's properties.", "type": "object" } }, "required": ["name"], "type": "object" }, "MetaObject": { "additionalProperties": {}, "description": "Represents the contents of a `_meta` field, which clients and servers use to attach additional metadata to their interactions.\n\nCertain key names are reserved by MCP for protocol-level metadata; implementations MUST NOT make assumptions about values at these keys. Additionally, specific schema definitions may reserve particular names for purpose-specific metadata, as declared in those definitions.\n\nValid keys have two segments:\n\n**Prefix:**\n- Optional — if specified, MUST be a series of _labels_ separated by dots (`.`), followed by a slash (`/`).\n- Labels MUST start with a letter and end with a letter or digit. Interior characters may be letters, digits, or hyphens (`-`).\n- Any prefix consisting of zero or more labels, followed by `modelcontextprotocol` or `mcp`, followed by any label, is **reserved** for MCP use. For example: `modelcontextprotocol.io/`, `mcp.dev/`, `api.modelcontextprotocol.org/`, and `tools.mcp.com/` are all reserved.\n\n**Name:**\n- Unless empty, MUST start and end with an alphanumeric character (`[a-z0-9A-Z]`).\n- Interior characters may be alphanumeric, hyphens (`-`), underscores (`_`), or dots (`.`).", "type": "object" }, "Remote": { "description": "Metadata for connecting to a remote (HTTP-based) MCP server endpoint.", "properties": { "headers": { "description": "HTTP headers required or accepted when connecting to this remote\nendpoint. Each header is described as a {@link KeyValueInput} so that\nclients can prompt users for required values, mark secrets, surface\ndefaults, and constrain to a list of choices.", "items": { "$ref": "#/$defs/KeyValueInput" }, "type": "array" }, "supportedProtocolVersions": { "description": "MCP protocol versions actively supported by this remote endpoint. Allows\nclients to select a compatible protocol version before connecting.", "items": { "type": "string" }, "type": "array" }, "type": { "description": "The transport type for this remote endpoint.", "enum": ["sse", "streamable-http"], "type": "string" }, "url": { "description": "URL template for the remote endpoint. Must start with `http://`,\n`https://`, or a `{template-variable}`. Variables in `{curly_braces}`\nare substituted from the {@link Remote.variables} map before the\nclient connects.", "pattern": "^(https?://[^\\s]+|\\{[a-zA-Z_][a-zA-Z0-9_]*\\}[^\\s]*)$", "type": "string" }, "variables": { "additionalProperties": { "$ref": "#/$defs/Input" }, "description": "Configuration variables that can be referenced as `{curly_braces}`\nplaceholders in `url` (and inside header values via\n{@link KeyValueInput.variables}). The map key is the variable\nname; the value defines the variable's properties (e.g., human-readable\ndescription, default, whether it is required or secret).", "type": "object" } }, "required": ["type", "url"], "type": "object" }, "Repository": { "description": "Repository metadata for the MCP server source code. Enables users and\nsecurity experts to inspect the code, improving transparency.", "properties": { "id": { "description": "Repository identifier from the hosting service (e.g., GitHub repo ID).\nOwned and determined by the source forge. Should remain stable across\nrepository renames and may be used to detect repository resurrection\nattacks — if a repository is deleted and recreated, the ID should change.", "type": "string" }, "source": { "description": "Repository hosting service identifier (e.g., `\"github\"`). Used by registries\nto determine validation and API access methods.", "type": "string" }, "subfolder": { "description": "Optional relative path from repository root to the server location within a\nmonorepo or nested package structure. Must be a clean relative path.", "type": "string" }, "url": { "description": "Repository URL for browsing source code. Should support both web browsing\nand `git clone` operations.", "format": "uri", "type": "string" } }, "required": ["source", "url"], "type": "object" }, "ServerCard": { "description": "A static metadata document describing a remote MCP server, suitable for\npre-connection discovery. A Server Card may be hosted at any unreserved URI;\nMCP reserves `GET /server-card` as the recommended\nlocation. Clients learn a card's URL from an [AI Catalog](https://github.com/Agent-Card/ai-catalog)\nrather than guessing it.\n\nServer Cards describe only what is needed to discover and connect to a remote server:\nidentity, transport, and protocol versions.\n\nThey do not enumerate primitives (tools, resources, prompts) — those remain\nsubject to runtime listing via the protocol's standard list operations.\n\nThe fields a Server Card does declare (identity, transport, protocol\nversions) are advisory, not authoritative: they should be consistent with\nthe server's `server/discover` response, and clients must not treat them as\nauthoritative for security decisions. See \"Consistency with Runtime\nBehavior\" in docs/discovery.md for the normative requirement.", "properties": { "$schema": { "description": "The Server Card JSON Schema URI that this document conforms to. Required.\n\nMust be the `/v1/` Server Card schema URL under\n`static.modelcontextprotocol.io/schemas/` (i.e.,\n`https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json`).\nSchema URLs are versioned by the `vN` segment rather than by date; a\nbreaking revision of the Server Card shape publishes a new `vN` family.", "format": "uri", "pattern": "^https://static\\.modelcontextprotocol\\.io/schemas/v1/server-card\\.schema\\.json$", "type": "string" }, "_meta": { "$ref": "#/$defs/MetaObject", "description": "Extension metadata using reverse-DNS namespacing for vendor-specific data.\n\nFollows the protocol's standard `_meta` definition." }, "description": { "description": "Clear human-readable explanation of server functionality. Should focus on\ncapabilities, not implementation details.", "maxLength": 100, "minLength": 1, "type": "string" }, "icons": { "description": "Optional set of sized icons that the client can display in a user interface.\n\nClients that support rendering icons MUST support at least the following\nMIME types: `image/png` and `image/jpeg` (safe, universal compatibility).\nClients SHOULD also support: `image/svg+xml` (scalable but requires security\nprecautions) and `image/webp` (modern, efficient format).", "items": { "$ref": "#/$defs/Icon" }, "type": "array" }, "name": { "description": "Server name in reverse-DNS format. Must contain exactly one forward slash\nseparating namespace from server name.", "maxLength": 200, "minLength": 3, "pattern": "^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$", "type": "string" }, "remotes": { "description": "Metadata helpful for making HTTP-based connections to this MCP server.", "items": { "$ref": "#/$defs/Remote" }, "type": "array" }, "repository": { "$ref": "#/$defs/Repository", "description": "Optional repository metadata for the MCP server source code.\nRecommended for transparency and security inspection." }, "title": { "description": "Optional human-readable title or display name for the MCP server.\nMCP subregistries or clients MAY choose to use this for display purposes.", "maxLength": 100, "minLength": 1, "type": "string" }, "version": { "description": "Version string for this server. SHOULD follow semantic versioning\n(e.g., '1.0.2', '2.1.0-alpha'). Equivalent of `Implementation.version`\nin the MCP specification. Non-semantic versions are allowed but may not\nsort predictably. Version ranges are rejected (e.g., '^1.2.3', '~1.2.3',\n'>=1.2.3', '1.x', '1.*').", "maxLength": 255, "type": "string" }, "websiteUrl": { "description": "Optional URL to the server's homepage, documentation, or project website.\nProvides a central link for users to learn more about the server.\nParticularly useful when the server has custom installation instructions\nor setup requirements.", "format": "uri", "type": "string" } }, "required": ["$schema", "description", "name", "version"], "type": "object" } } }