[{"data":1,"prerenderedAt":64},["ShallowReactive",2],{"wiki-mcp-testing-mcp-servers-en":3},{"meta":4,"html":8,"headings":9,"words":63},{"title":5,"description":6,"published":7,"updated":7},"Testing MCP servers: the basics","How to test an MCP server: test levels, protocol conformance, MCP Inspector and the conformance suite, security checks and evaluation with models.","2026-11-03","\u003Cp>\u003Cstrong>Testing an MCP server\u003C/strong> is checking that the server follows the Model Context Protocol specification, that its tools, resources and prompts work correctly, that it is safe to connect to, and that language models use it as intended. This article covers the basics: what makes such testing different, which levels it consists of, what the specification requires and which official tools exist.\u003C/p>\n\u003Cp>The requirements in this article follow the specification version \u003Cstrong>2026-07-28\u003C/strong>. Basic concepts of the protocol (host, client, server, primitives, transports) are described in the article \u003Ca href=\"/en/wiki/mcp/what-is-mcp\" class=\"wiki-link wiki-link--article\">What is MCP\u003C/a>.\u003C/p>\n\u003Ch2 id=\"overview\" class=\"wiki-heading\">Overview\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"overview\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Property\u003C/th>\n\u003Cth>Value\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Object of testing\u003C/td>\n\u003Ctd>MCP server: its protocol behavior, tools, resources and prompts\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Levels\u003C/td>\n\u003Ctd>Tool logic, protocol conformance, integration, security, evaluation with models\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Official tools\u003C/td>\n\u003Ctd>MCP Inspector (web, CLI, TUI), conformance test suite\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Source of requirements\u003C/td>\n\u003Ctd>MCP specification, Security Best Practices\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Specification version\u003C/td>\n\u003Ctd>2026-07-28\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"how-it-differs-from-api-testing\" class=\"wiki-heading\">How it differs from API testing\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"how-it-differs-from-api-testing\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>An \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"mcp-server\">MCP server\u003C/span> often wraps an ordinary API, and the usual API testing methods still apply to it. Three things are specific to MCP.\u003C/p>\n\u003Cp>\u003Cstrong>The consumer is a model.\u003C/strong> A person or a program calls an API according to its documentation. An MCP tool is chosen by a model, based on the tool's name, description and input schema. A tool can return correct results and still fail in use: the model does not call it when it should, calls a different tool or fills in the arguments incorrectly. The descriptions are part of the interface and are tested like code.\u003C/p>\n\u003Cp>\u003Cstrong>There is a protocol layer.\u003C/strong> Besides the business logic, the server must follow the rules of MCP: version selection, required fields of each request, capability declarations, error types, transport behavior. A client from another vendor relies on these rules, not on the server's code.\u003C/p>\n\u003Cp>\u003Cstrong>Behavior with a model is not deterministic.\u003C/strong> The same user request can lead to different sequences of tool calls in different runs and with different models. A single run of a scenario shows that it can work, not that it works reliably. This level is tested statistically, on sets of tasks and repeated runs.\u003C/p>\n\u003Ch2 id=\"levels-of-testing\" class=\"wiki-heading\">Levels of testing\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"levels-of-testing\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Level\u003C/th>\n\u003Cth>What is checked\u003C/th>\n\u003Cth>How\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Tool logic\u003C/td>\n\u003Ctd>The code behind each tool returns correct results and correct errors\u003C/td>\n\u003Ctd>Ordinary unit tests of the handlers, without the protocol\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Protocol conformance\u003C/td>\n\u003Ctd>Messages, discovery, versions, schemas and errors follow the specification\u003C/td>\n\u003Ctd>MCP Inspector, the conformance test suite\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Integration\u003C/td>\n\u003Ctd>The server starts and works over its transport in a real host, with configuration and authorization\u003C/td>\n\u003Ctd>MCP Inspector, the target host, logs\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Security\u003C/td>\n\u003Ctd>Tokens, access to data and state, input validation, behavior of a local server\u003C/td>\n\u003Ctd>Checks from Security Best Practices, standard security testing\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Evaluation with models\u003C/td>\n\u003Ctd>Models choose the right tools, fill in arguments and complete tasks\u003C/td>\n\u003Ctd>Sets of tasks run through a model with the server connected\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The lower levels are faster and cheaper, so they run on every change. Evaluation with models takes longer and costs model usage, so it runs on changes to tools and their descriptions and on a schedule.\u003C/p>\n\u003Ch2 id=\"protocol-conformance\" class=\"wiki-heading\">Protocol conformance\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"protocol-conformance\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The checks below follow directly from the requirements of the specification.\u003C/p>\n\u003Ch3 id=\"discovery-and-versions\" class=\"wiki-heading\">Discovery and versions\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"discovery-and-versions\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cul>\n\u003Cli>Every server must implement \u003Ccode>server/discover\u003C/code>. The response contains the supported protocol versions (\u003Ccode>supportedVersions\u003C/code>) and the capabilities of the server (\u003Ccode>capabilities\u003C/code>).\u003C/li>\n\u003Cli>A request with a version the server does not support is rejected with \u003Ccode>UnsupportedProtocolVersionError\u003C/code> (code \u003Ccode>-32022\u003C/code>); the supported versions are listed in the \u003Ccode>data\u003C/code> field of the error.\u003C/li>\n\u003Cli>Every request carries \u003Ccode>io.modelcontextprotocol/protocolVersion\u003C/code> and \u003Ccode>io.modelcontextprotocol/clientCapabilities\u003C/code> in \u003Ccode>_meta\u003C/code>. A request without either field is rejected with \u003Ccode>-32602\u003C/code> (Invalid params).\u003C/li>\n\u003Cli>If the server needs a client capability that the request did not declare, for example \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"elicitation\">elicitation\u003C/span>, it returns \u003Ccode>MissingRequiredClientCapabilityError\u003C/code> (code \u003Ccode>-32021\u003C/code>) with the names of the missing capabilities.\u003C/li>\n\u003Cli>The server declares only the capabilities it implements: a server that declares \u003Ccode>tools\u003C/code> must answer \u003Ccode>tools/list\u003C/code>.\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"tools\" class=\"wiki-heading\">Tools\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"tools\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cul>\n\u003Cli>The list returned by \u003Ccode>tools/list\u003C/code> must not depend on the connection or on other requests. It may depend on the authorization of the request, for example on the scopes of the token.\u003C/li>\n\u003Cli>Tools should be returned in a deterministic order: clients cache the list, and the order affects the prompt cache of the model.\u003C/li>\n\u003Cli>\u003Ccode>inputSchema\u003C/code> must be a valid JSON Schema object, not \u003Ccode>null\u003C/code>. The default dialect is JSON Schema 2020-12. For a tool without parameters the specification recommends \u003Ccode>{ &quot;type&quot;: &quot;object&quot;, &quot;additionalProperties&quot;: false }\u003C/code>.\u003C/li>\n\u003Cli>If a tool declares \u003Ccode>outputSchema\u003C/code>, its structured results (\u003Ccode>structuredContent\u003C/code>) must conform to that schema.\u003C/li>\n\u003Cli>Tool names should be 1 to 128 characters long and use only Latin letters, digits, \u003Ccode>_\u003C/code>, \u003Ccode>-\u003C/code> and \u003Ccode>.\u003C/code>; names are unique within a server.\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"errors\" class=\"wiki-heading\">Errors\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"errors\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The specification separates two kinds of errors, and a test checks that each case falls into the right one:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Situation\u003C/th>\n\u003Cth>How it is returned\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Unknown tool, malformed request, server failure\u003C/td>\n\u003Ctd>JSON-RPC error (protocol error)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Invalid arguments, including values that pass the schema but fail validation in code\u003C/td>\n\u003Ctd>Tool result with \u003Ccode>isError: true\u003C/code> and a text explanation\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Failure of an external API, business logic error\u003C/td>\n\u003Ctd>Tool result with \u003Ccode>isError: true\u003C/code>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The difference matters to the model. The host passes a \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"tool-execution-error\">tool execution error\u003C/span> to the model, and the model can correct the call. A \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"protocol-error\">protocol error\u003C/span> is usually handled by the application and does not reach the model. Before SEP-1303, implementations returned invalid arguments in different ways; the current specification returns all input validation errors as tool execution errors.\u003C/p>\n\u003Ch3 id=\"multi-round-trip-requests\" class=\"wiki-heading\">Multi Round-Trip Requests\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"multi-round-trip-requests\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>For a server that asks the client for additional input (\u003Ccode>resultType: &quot;input_required&quot;\u003C/code>):\u003C/p>\n\u003Cul>\n\u003Cli>\u003Ccode>inputRequests\u003C/code> contains only request types that the client declared in its capabilities;\u003C/li>\n\u003Cli>every \u003Ccode>InputRequiredResult\u003C/code> contains \u003Ccode>inputRequests\u003C/code>, \u003Ccode>requestState\u003C/code> or both;\u003C/li>\n\u003Cli>a modified or foreign \u003Ccode>requestState\u003C/code> is rejected when it affects authorization, access to resources or business logic;\u003C/li>\n\u003Cli>a repeated request with the answers is processed correctly by any instance of the server.\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"transports\" class=\"wiki-heading\">Transports\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"transports\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>stdio:\u003C/strong> standard output contains only MCP messages. Any other output, such as logs or debug prints, breaks the protocol. Logs go to standard error.\u003C/li>\n\u003Cli>\u003Cstrong>Streamable HTTP:\u003C/strong> the server works behind a load balancer without sticky sessions, because there is no protocol session since 2026-07-28. State needed between calls is passed in explicit handles, which are checked separately for security.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"official-tools\" class=\"wiki-heading\">Official tools\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"official-tools\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Ch3 id=\"mcp-inspector\" class=\"wiki-heading\">MCP Inspector\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"mcp-inspector\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>MCP Inspector is the reference developer tool for testing and debugging MCP servers. It is distributed as the npm package \u003Ccode>@modelcontextprotocol/inspector\u003C/code>, requires Node.js 22.19.0 or newer and contains three clients:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Client\u003C/th>\n\u003Cth>Command\u003C/th>\n\u003Cth>Purpose\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Web\u003C/td>\n\u003Ctd>\u003Ccode>npx @modelcontextprotocol/inspector\u003C/code>\u003C/td>\n\u003Ctd>Graphical interface: primitives, tool calls, the JSON-RPC exchange\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>CLI\u003C/td>\n\u003Ctd>\u003Ccode>npx @modelcontextprotocol/inspector --cli\u003C/code>\u003C/td>\n\u003Ctd>One request per run with machine-readable output, for scripts and CI\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>TUI\u003C/td>\n\u003Ctd>\u003Ccode>npx @modelcontextprotocol/inspector --tui\u003C/code>\u003C/td>\n\u003Ctd>Interactive interface in the terminal\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The server is passed as the command that starts it (\u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"stdio\">stdio\u003C/span>) or as a URL (\u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"streamable-http\">Streamable HTTP\u003C/span>):\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode># Local server over stdio\nnpx @modelcontextprotocol/inspector node build/index.js\n\n# Remote server over Streamable HTTP\nnpx @modelcontextprotocol/inspector --server-url https://api.example.com/mcp --transport http\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>The CLI runs one request (\u003Ccode>--method\u003C/code>) and exits with a code that tells the type of failure, so a script or a CI job can branch on it:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Code\u003C/th>\n\u003Cth>Meaning\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0\u003C/code>\u003C/td>\n\u003Ctd>Success\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>3\u003C/code>\u003C/td>\n\u003Ctd>The server requires authentication (HTTP 401 or 403)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>4\u003C/code>\u003C/td>\n\u003Ctd>The server is unreachable\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>5\u003C/code>\u003C/td>\n\u003Ctd>The tool returned \u003Ccode>isError: true\u003C/code> or was not found\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>6\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>--strict\u003C/code> found an error-level problem in tool schemas\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>A minimal smoke test in CI: the server starts, exposes the expected tool, its schemas pass the strict check and the tool call succeeds.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode>set -euo pipefail\n\n# The server starts and exposes the get_weather tool\nnpx @modelcontextprotocol/inspector --cli node build/index.js \\\n  --method tools/list --format json \\\n  | jq -e '.result.tools | map(.name) | index(&quot;get_weather&quot;)' &gt; /dev/null\n\n# Tool schemas have no error-level problems (exit code 6 otherwise)\nnpx @modelcontextprotocol/inspector --cli node build/index.js \\\n  --method tools/list --strict &gt; /dev/null\n\n# The call succeeds (exit code 5 if the result has isError: true)\nnpx @modelcontextprotocol/inspector --cli node build/index.js \\\n  --method tools/call --tool-name get_weather --tool-arg city=Boston &gt; /dev/null\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>For servers that require authorization, the CLI has the \u003Ccode>--stored-auth-only\u003C/code> flag: it uses a stored token and fails immediately with \u003Ccode>auth_required\u003C/code> instead of opening a browser that a CI job cannot use.\u003C/p>\n\u003Ch3 id=\"conformance-test-suite\" class=\"wiki-heading\">Conformance test suite\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"conformance-test-suite\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h3>\n\u003Cp>The conformance \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"test-suite\">test suite\u003C/span> (repository \u003Ccode>modelcontextprotocol/conformance\u003C/code>) checks client and server implementations against the specification. For a server it acts as a client: it sends test requests, records the responses and runs checks on them, including validation of every JSON-RPC message against the JSON schema of the specification.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"bash\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">Bash\u003C/span>\u003Cbutton type=\"button\" class=\"wiki-code__copy\" data-wiki-copy data-copied-label=\"Copied\">\u003Csvg class=\"wiki-code__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\"/>\u003C/svg>\u003Csvg class=\"wiki-code__icon wiki-code__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003Cspan class=\"wiki-code__label\">Copy\u003C/span>\u003Cspan class=\"wiki-code__label wiki-code__label--done\">Copied\u003C/span>\u003C/button>\u003C/div>\u003Cpre>\u003Ccode># List the server scenarios\nnpx @modelcontextprotocol/conformance list --server\n\n# Run all server scenarios against a server over HTTP\nnpx @modelcontextprotocol/conformance server --url http://localhost:3000/mcp\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>The results of each scenario are saved to \u003Ccode>results/server-&lt;scenario&gt;-&lt;timestamp&gt;/checks.json\u003C/code> with the status of each check. Known failures can be recorded in a YAML file and passed with \u003Ccode>--expected-failures\u003C/code>, so that CI fails only on new ones.\u003C/p>\n\u003Cp>The suite is the reference point for the official SDKs: an SDK of Tier 1 must pass all conformance tests, an SDK of Tier 2 at least 80 percent. Since SEP-2484, a change to the protocol with observable behavior reaches the final status only together with a conformance scenario that covers its requirements. Comparison of contracts between versions of a server is described in the article \u003Ca href=\"/en/wiki/mcp/mcp-server-regression-testing\" class=\"wiki-link wiki-link--article\">Regression testing of an MCP server\u003C/a>.\u003C/p>\n\u003Ch2 id=\"security\" class=\"wiki-heading\">Security\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"security\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>The specification and the Security Best Practices document describe the attacks that concern MCP servers. For each of them there is a verifiable requirement:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>What to check\u003C/th>\n\u003Cth>Requirement\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Tokens\u003C/td>\n\u003Ctd>The server accepts only tokens issued for it and rejects tokens with another audience. Invalid or expired tokens get HTTP 401\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Token passthrough\u003C/td>\n\u003Ctd>The server does not forward the client's token to other APIs; for them it obtains its own tokens\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>State handles\u003C/td>\n\u003Ctd>A handle (for example, a cart or workflow identifier) is not treated as authentication. Handles are random, not sequential, bound to the user and checked on every call\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Scopes\u003C/td>\n\u003Ctd>\u003Ccode>scopes_supported\u003C/code> lists a minimal set; additional scopes are requested when a privileged operation is first attempted\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Local server\u003C/td>\n\u003Ctd>It uses stdio, or restricts access to its HTTP endpoint with a token or IPC. A local HTTP server without protection can be reached by other processes and through DNS rebinding\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tool inputs and outputs\u003C/td>\n\u003Ctd>The server validates all inputs, enforces access control, limits the call rate and sanitizes results\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tool descriptions\u003C/td>\n\u003Ctd>Descriptions contain only the description of the tool. Text addressed to the model, hidden in a description or in data the tool returns, is a form of prompt injection\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The attacks behind these requirements are described in the article \u003Ca href=\"/en/wiki/mcp/mcp-security\" class=\"wiki-link wiki-link--article\">MCP security\u003C/a>, the authorization flow in the article \u003Ca href=\"/en/wiki/mcp/mcp-authorization\" class=\"wiki-link wiki-link--article\">Authorization in MCP\u003C/a>, and \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"prompt-injection\">prompt injection\u003C/span> and ways to test for it in the article \u003Ca href=\"/en/wiki/ai-testing/prompt-injection\" class=\"wiki-link wiki-link--article\">Prompt injection\u003C/a>.\u003C/p>\n\u003Ch2 id=\"evaluation-with-models\" class=\"wiki-heading\">Evaluation with models\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"evaluation-with-models\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cp>Protocol conformance shows that a client can work with the server. Whether a model can complete tasks with it is shown only by running the model. Anthropic describes this approach in its guide to writing tools for agents.\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Tasks.\u003C/strong> A set of realistic tasks based on real data, each with a verifiable outcome: an exact answer or a check by another model. Good tasks require several tool calls.\u003C/li>\n\u003Cli>\u003Cstrong>Runs.\u003C/strong> Each task is run in a loop: the model receives the task and the tools, calls them and gets the results until it gives an answer.\u003C/li>\n\u003Cli>\u003Cstrong>Metrics.\u003C/strong> Accuracy of the answers, the time of tasks and tool calls, the number of tool calls, token consumption and tool errors.\u003C/li>\n\u003Cli>\u003Cstrong>Analysis.\u003C/strong> The transcripts show the causes. Many repeated calls point to missing pagination or filters. Frequent invalid arguments point to unclear descriptions or parameter names.\u003C/li>\n\u003Cli>\u003Cstrong>Iterations.\u003C/strong> After changes to tools or descriptions the same set is run again. Part of the tasks is kept aside to confirm that the improvement is not limited to the tasks it was tuned on.\u003C/li>\n\u003C/ol>\n\u003Cp>The behavior of a model varies from run to run, so each task is run several times and the results are compared as shares of successful runs. Models and hosts also differ in how they choose tools, so the evaluation is run on the models that the users of the server work with. The method in detail is described in the article \u003Ca href=\"/en/wiki/mcp/evaluating-mcp-servers\" class=\"wiki-link wiki-link--article\">Evaluating an MCP server with models\u003C/a>, general methods of evaluating applications built on language models in the article \u003Ca href=\"/en/wiki/ai-testing/testing-llm-applications\" class=\"wiki-link wiki-link--article\">Testing LLM applications\u003C/a>.\u003C/p>\n\u003Ch2 id=\"debugging\" class=\"wiki-heading\">Debugging\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"debugging\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cul>\n\u003Cli>The first step is to connect to the server with MCP Inspector and call its tools directly, without a model and a host.\u003C/li>\n\u003Cli>A server over stdio writes logs only to standard error; the host captures this stream. For HTTP servers the logs are collected on the server side, for example with OpenTelemetry.\u003C/li>\n\u003Cli>A host may start a stdio server with an undefined working directory and a limited set of environment variables. Paths in the configuration are absolute; the variables the server needs are set explicitly in the host configuration.\u003C/li>\n\u003Cli>If the connection fails, the protocol version and the \u003Ccode>_meta\u003C/code> fields are checked: \u003Ccode>server/discover\u003C/code> shows the versions the server supports.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"terms\" class=\"wiki-heading\">Terms\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"terms\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Term\u003C/th>\n\u003Cth>Meaning\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Protocol conformance\u003C/td>\n\u003Ctd>Correspondence of an implementation to the requirements of the specification\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Conformance test suite\u003C/td>\n\u003Ctd>Official set of scenarios that checks clients and servers against the specification\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>MCP Inspector\u003C/td>\n\u003Ctd>Official developer tool for connecting to a server, calling its primitives and viewing messages\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Protocol error\u003C/td>\n\u003Ctd>JSON-RPC error: unknown tool, malformed request, server failure. Usually does not reach the model\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tool execution error\u003C/td>\n\u003Ctd>Tool result with \u003Ccode>isError: true\u003C/code>: invalid arguments, API failure, business logic error. Passed to the model\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Evaluation (eval)\u003C/td>\n\u003Ctd>Run of a set of tasks through a model with the server connected, with measurable results\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>State handle\u003C/td>\n\u003Ctd>Identifier that a tool returns and the model passes back in later calls, instead of a protocol session\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Token passthrough\u003C/td>\n\u003Ctd>Forwarding the client's token to other services; forbidden by the specification\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"sources\" class=\"wiki-heading\">Sources\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"sources\" aria-label=\"Copy link to section\" data-copied-label=\"Link to section copied\">\u003Csvg class=\"wiki-heading__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\"/>\u003C/svg>\u003Csvg class=\"wiki-heading__icon wiki-heading__icon--done\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\"/>\u003C/svg>\u003C/button>\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Model Context Protocol specification, version 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/server/tools\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Tools, specification 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/specification/2026-07-28/basic/patterns/mrtr\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Multi Round-Trip Requests, specification 2026-07-28\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tools/inspector\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP Inspector\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tools/inspector/cli\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP Inspector, CLI client\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tools/debugging\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Debugging\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/docs/2026-07-28/tutorials/security/security_best_practices\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Security Best Practices\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/1303-input-validation-errors-as-tool-execution-errors\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-1303: Input Validation Errors as Tool Execution Errors\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://modelcontextprotocol.io/seps/2484-conformance-tests-required-for-final-seps\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">SEP-2484: Require Conformance Tests for Standards Track SEPs to Reach Final Status\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://github.com/modelcontextprotocol/conformance\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">MCP conformance test suite, GitHub\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.anthropic.com/engineering/writing-tools-for-agents\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Writing effective tools for agents, Anthropic, 11 September 2025\u003Csvg class=\"wiki-link__icon\" viewBox=\"0 0 256 256\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\u003Cpath d=\"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\"/>\u003C/svg>\u003Cspan class=\"wiki-visually-hidden\">(opens in a new tab)\u003C/span>\u003C/a>\u003C/li>\n\u003C/ul>\n",[10,14,17,20,23,27,30,33,36,39,42,45,48,51,54,57,60],{"id":11,"level":12,"text":13},"overview",2,"Overview",{"id":15,"level":12,"text":16},"how-it-differs-from-api-testing","How it differs from API testing",{"id":18,"level":12,"text":19},"levels-of-testing","Levels of testing",{"id":21,"level":12,"text":22},"protocol-conformance","Protocol conformance",{"id":24,"level":25,"text":26},"discovery-and-versions",3,"Discovery and versions",{"id":28,"level":25,"text":29},"tools","Tools",{"id":31,"level":25,"text":32},"errors","Errors",{"id":34,"level":25,"text":35},"multi-round-trip-requests","Multi Round-Trip Requests",{"id":37,"level":25,"text":38},"transports","Transports",{"id":40,"level":12,"text":41},"official-tools","Official tools",{"id":43,"level":25,"text":44},"mcp-inspector","MCP Inspector",{"id":46,"level":25,"text":47},"conformance-test-suite","Conformance test suite",{"id":49,"level":12,"text":50},"security","Security",{"id":52,"level":12,"text":53},"evaluation-with-models","Evaluation with models",{"id":55,"level":12,"text":56},"debugging","Debugging",{"id":58,"level":12,"text":59},"terms","Terms",{"id":61,"level":12,"text":62},"sources","Sources",2169,1793718908838]