[{"data":1,"prerenderedAt":100},["ShallowReactive",2],{"wiki-mcp-mcp-server-for-existing-api-en":3},{"meta":4,"html":8,"headings":9,"words":99},{"title":5,"description":6,"published":7,"updated":7},"MCP server over an existing API","An MCP server over an existing API adapts it for a model: choice of tools, descriptions, parameters, response size, errors, authorization and state.","2026-11-03","\u003Cp>An \u003Cstrong>MCP server over an existing API\u003C/strong> is an \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"mcp-server\">MCP server\u003C/span> that gives a language model access to a service through the service's existing REST, GraphQL or RPC interface. The server does not copy the API one to one. It selects the operations worth exposing, turns them into tools that a model can choose and fill in correctly, and shapes the results to fit the model's context.\u003C/p>\n\u003Cp>The MCP specification does not define how such a server should be designed. It defines the format of tools, the separation of errors, \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"caching-hints\">caching hints\u003C/span> and security requirements; the rest is design guidance. This article follows the specification version \u003Cstrong>2026-07-28\u003C/strong> and the guide &quot;Writing effective tools for agents&quot;, published by Anthropic in September 2025. Basic concepts of the protocol are described in the article \u003Ca href=\"/en/wiki/mcp/what-is-mcp\" class=\"wiki-link wiki-link--article\">What is MCP\u003C/a>, and the fields of a tool definition in the article \u003Ca href=\"/en/wiki/mcp/mcp-tools\" class=\"wiki-link wiki-link--article\">Tools in 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\u003C/td>\n\u003Ctd>MCP server that wraps the API of an existing service\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Main primitive\u003C/td>\n\u003Ctd>Tools; resources and prompts are optional\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Requirements\u003C/td>\n\u003Ctd>Specification 2026-07-28: tools, caching, authorization, Security Best Practices\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Design guidance\u003C/td>\n\u003Ctd>&quot;Writing effective tools for agents&quot;, Anthropic, September 2025\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Key decisions\u003C/td>\n\u003Ctd>Set of tools, descriptions, parameters, response size, errors, authorization, state\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=\"why-an-api-is-not-exposed-as-is\" class=\"wiki-heading\">Why an API is not exposed as is\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"why-an-api-is-not-exposed-as-is\" 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 API is designed for programs. A developer reads the documentation once and writes code that calls endpoints in a fixed order, stores identifiers, walks through every page of a list and maps numeric codes to meanings.\u003C/p>\n\u003Cp>A model chooses a tool in every conversation, from the names, descriptions and input schemas in its context. Every tool definition and every result takes space in that context. A long list of similar tools makes the choice harder, a page of raw JSON consumes tokens, and an opaque identifier is easy to confuse with another one.\u003C/p>\n\u003Cp>The Anthropic guide names tools that merely wrap existing endpoints as a common mistake and recommends a few tools aimed at specific high-impact workflows. The MCP server becomes an adaptation layer between the model and the unchanged API.\u003C/p>\n\u003Ch2 id=\"history\" class=\"wiki-heading\">History\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"history\" 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 table lists the changes of the specification that matter for the design of tools.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Date\u003C/th>\n\u003Cth>Event\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>26 March 2025\u003C/td>\n\u003Ctd>Specification 2025-03-26: tool annotations that describe the behavior of a tool\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>18 June 2025\u003C/td>\n\u003Ctd>Specification 2025-06-18: structured tool output (\u003Ccode>outputSchema\u003C/code>, \u003Ccode>structuredContent\u003C/code>), resource links in results, the \u003Ccode>title\u003C/code> field\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>11 September 2025\u003C/td>\n\u003Ctd>Anthropic publishes the guide &quot;Writing effective tools for agents&quot;\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>25 November 2025\u003C/td>\n\u003Ctd>Specification 2025-11-25: input validation errors are returned as tool execution errors (SEP-1303)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>28 July 2026\u003C/td>\n\u003Ctd>Specification 2026-07-28: stateless protocol, explicit state handles, caching hints \u003Ccode>ttlMs\u003C/code> and \u003Ccode>cacheScope\u003C/code>, deterministic order of tools\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch2 id=\"choosing-the-operations\" class=\"wiki-heading\">Choosing the operations\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"choosing-the-operations\" 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=\"workflows-instead-of-endpoints\" class=\"wiki-heading\">Workflows instead of endpoints\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"workflows-instead-of-endpoints\" 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>A tool covers a task that a user asks for, not a single HTTP call. In the examples of the Anthropic guide, one \u003Ccode>schedule_event\u003C/code> tool finds a free slot and creates the event instead of separate tools for listing users, listing events and creating an event; a \u003Ccode>search_logs\u003C/code> tool returns only relevant lines instead of \u003Ccode>read_logs\u003C/code>.\u003C/p>\n\u003Cp>A tool that combines several API calls moves the logic from the model to the server: the server performs the calls in the right order and joins the data. The guide also warns that too many tools, or tools with overlapping purposes, distract the model from efficient strategies. It prefers a search with filters to a full list, which makes the model read records that do not matter for the task.\u003C/p>\n\u003Ch3 id=\"read-and-write-operations\" class=\"wiki-heading\">Read and write operations\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"read-and-write-operations\" 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>Operations that read data and operations that change it carry different risks. A server can expose read operations broadly and only those write operations that the target workflows need. A rarely needed, irreversible or administrative operation can stay outside the server: the user performs it in the service's own interface.\u003C/p>\n\u003Cp>The final control stays with the host: the specification recommends that a human always be able to deny a tool call.\u003C/p>\n\u003Ch3 id=\"annotations-for-destructive-operations\" class=\"wiki-heading\">Annotations for destructive operations\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"annotations-for-destructive-operations\" 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>A tool definition can carry annotations, optional properties that describe its behavior. The schema of version 2026-07-28 defines five of them:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Annotation\u003C/th>\n\u003Cth>Meaning\u003C/th>\n\u003Cth>Default\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>title\u003C/code>\u003C/td>\n\u003Ctd>Human-readable name of the tool\u003C/td>\n\u003Ctd>none\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>readOnlyHint\u003C/code>\u003C/td>\n\u003Ctd>The tool does not modify its environment\u003C/td>\n\u003Ctd>\u003Ccode>false\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>destructiveHint\u003C/code>\u003C/td>\n\u003Ctd>The tool may perform destructive updates; \u003Ccode>false\u003C/code> means only additive updates\u003C/td>\n\u003Ctd>\u003Ccode>true\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>idempotentHint\u003C/code>\u003C/td>\n\u003Ctd>A repeated call with the same arguments has no additional effect\u003C/td>\n\u003Ctd>\u003Ccode>false\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>openWorldHint\u003C/code>\u003C/td>\n\u003Ctd>The tool interacts with an open world of external entities, such as the web\u003C/td>\n\u003Ctd>\u003Ccode>true\u003C/code>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>\u003Ccode>destructiveHint\u003C/code> and \u003Ccode>idempotentHint\u003C/code> are meaningful only when \u003Ccode>readOnlyHint\u003C/code> is \u003Ccode>false\u003C/code>. The defaults describe the most cautious case, so a server sets \u003Ccode>readOnlyHint: true\u003C/code> on read-only tools and \u003Ccode>destructiveHint: false\u003C/code> on tools that only add data.\u003C/p>\n\u003Cblockquote>\n\u003Cp>Annotations are hints. Clients must treat them as untrusted unless the server is trusted, and an annotation does not replace access control on the server.\u003C/p>\n\u003C/blockquote>\n\u003Ch2 id=\"descriptions-and-names\" class=\"wiki-heading\">Descriptions and names\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"descriptions-and-names\" 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=\"tool-names\" class=\"wiki-heading\">Tool names\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"tool-names\" 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>Two connected servers can expose tools with the same name, such as \u003Ccode>search\u003C/code>, and the specification lets clients prefix tool names with a server identifier. The Anthropic guide recommends namespacing on the server side as well: by service (\u003Ccode>asana_search\u003C/code>, \u003Ccode>jira_search\u003C/code>) and by resource (\u003Ccode>asana_projects_search\u003C/code>, \u003Ccode>asana_users_search\u003C/code>). According to the guide, the choice between prefixes and suffixes had a noticeable effect in its evaluations and differs between models.\u003C/p>\n\u003Ch3 id=\"tool-descriptions\" class=\"wiki-heading\">Tool descriptions\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"tool-descriptions\" 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 description is the main source from which the model learns when to use a tool; the schema calls it a hint to the model. The Anthropic guide recommends describing a tool the way one would explain it to a new member of the team. What an experienced user of the API knows implicitly is written out: query formats, domain terms, relationships between entities, limits. According to the guide, even small refinements of descriptions can lead to large improvements in how a model uses the tools.\u003C/p>\n\u003Cp>Information that concerns the whole server, rather than one tool, can go into the \u003Ccode>instructions\u003C/code> field of the \u003Ccode>server/discover\u003C/code> result. The schema describes it as natural-language guidance that helps the model use the server and that should not duplicate tool descriptions.\u003C/p>\n\u003Ch3 id=\"parameter-names\" class=\"wiki-heading\">Parameter names\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"parameter-names\" 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>Parameter names are part of the description: according to the guide, a parameter named \u003Ccode>user_id\u003C/code> is clearer than \u003Ccode>user\u003C/code>. Each parameter has its own \u003Ccode>description\u003C/code> with the expected format and an example. A schema with \u003Ccode>additionalProperties: false\u003C/code> rejects unknown arguments.\u003C/p>\n\u003Ch2 id=\"parameters\" class=\"wiki-heading\">Parameters\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"parameters\" 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=\"enumerations-and-default-values\" class=\"wiki-heading\">Enumerations and default values\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"enumerations-and-default-values\" 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>An API often accepts codes and flags that only make sense with documentation. In a tool they become explicit choices: a status that the API encodes as a number becomes an \u003Ccode>enum\u003C/code> of readable values, and the server maps them to the codes. The model chooses from a closed list instead of guessing.\u003C/p>\n\u003Cp>Parameters that most calls do not need get default values. The JSON Schema \u003Ccode>default\u003C/code> keyword states the value in the schema, and the server applies it when the argument is missing.\u003C/p>\n\u003Ch3 id=\"readable-identifiers\" class=\"wiki-heading\">Readable identifiers\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"readable-identifiers\" 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>APIs identify objects with internal identifiers, often UUIDs. According to the Anthropic guide, resolving UUIDs into meaningful names, or even into a simple numbering, significantly improves the precision of the model in retrieval tasks and reduces hallucinations.\u003C/p>\n\u003Cp>A server over an API therefore accepts the identifiers people use: a project key, an issue key such as \u003Ccode>WEB-142\u003C/code>, a user name, the word &quot;me&quot; for the current user. The server resolves them into internal identifiers itself.\u003C/p>\n\u003Ch2 id=\"response-size\" class=\"wiki-heading\">Response size\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"response-size\" 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=\"filtering-and-limits\" class=\"wiki-heading\">Filtering and limits\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"filtering-and-limits\" 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>A tool that can return a large amount of data limits it with pagination, range selection, filtering or truncation and sensible defaults. For Claude Code, the guide states, tool responses are limited to 25,000 tokens by default.\u003C/p>\n\u003Cp>The protocol defines cursor pagination only for list operations such as \u003Ccode>tools/list\u003C/code>, not for the content of a \u003Ccode>tools/call\u003C/code> result. A search tool therefore has its own parameters, such as a limit and a cursor that the result returns for the next call.\u003C/p>\n\u003Ch3 id=\"truncation-with-guidance\" class=\"wiki-heading\">Truncation with guidance\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"truncation-with-guidance\" 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>When a result is cut, the tool says so and explains how to get the rest: narrow the filter, request the next page, search for a specific item. The guide recommends such text to steer the model toward small targeted searches instead of one broad one.\u003C/p>\n\u003Ch3 id=\"concise-and-detailed-formats\" class=\"wiki-heading\">Concise and detailed formats\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"concise-and-detailed-formats\" 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 guide describes a \u003Ccode>response_format\u003C/code> parameter with the values \u003Ccode>&quot;concise&quot;\u003C/code> and \u003Ccode>&quot;detailed&quot;\u003C/code>. The concise format returns only what the model needs to answer, for example the text of messages. The detailed format adds identifiers and fields that are needed for follow-up calls. In the guide's example, the concise response took about a third of the tokens of the detailed one.\u003C/p>\n\u003Cp>The fields of the response are chosen for the model, not copied from the API: the guide prefers \u003Ccode>name\u003C/code> and \u003Ccode>file_type\u003C/code> to \u003Ccode>uuid\u003C/code> and \u003Ccode>mime_type\u003C/code>.\u003C/p>\n\u003Ch2 id=\"errors-the-model-can-act-on\" class=\"wiki-heading\">Errors the model can act on\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"errors-the-model-can-act-on\" 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 separates \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"protocol-error\">protocol errors\u003C/span>, such as an unknown tool, from \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"tool-execution-error\">tool execution errors\u003C/span>, such as an API failure, a business logic error or invalid arguments. The latter are returned in the tool result with \u003Ccode>isError: true\u003C/code>, and the specification describes them as actionable feedback that the model can use to correct the call.\u003C/p>\n\u003Cp>A server over an API therefore translates the errors of the API. An HTTP status with an internal code tells the model little; a text that names the wrong value and the valid ones lets it recover. The guide recommends specific, actionable messages instead of opaque error codes and stack traces.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"json\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">JSON\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>{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 7,\n  &quot;result&quot;: {\n    &quot;resultType&quot;: &quot;complete&quot;,\n    &quot;content&quot;: [\n      {\n        &quot;type&quot;: &quot;text&quot;,\n        &quot;text&quot;: &quot;Project \\&quot;WEBB\\&quot; not found. Available project keys: WEB, API, MOBILE. Call tracker_search_issues again with one of these keys in the project parameter.&quot;\n      }\n    ],\n    &quot;isError&quot;: true\n  }\n}\u003C/code>\u003C/pre>\u003C/div>\n\u003Ch2 id=\"authorization-and-user-identity\" class=\"wiki-heading\">Authorization and user identity\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"authorization-and-user-identity\" 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>How an MCP server over HTTP obtains and validates tokens is described in the article \u003Ca href=\"/en/wiki/mcp/mcp-authorization\" class=\"wiki-link wiki-link--article\">Authorization in MCP\u003C/a>. For a server over an API, two rules of the specification matter most.\u003C/p>\n\u003Cp>First, the server accepts only tokens issued for itself and validates every incoming token. The identity of the user is taken from the verified token, not from a tool argument. The list of tools may depend on the authorization of the request, for example on the granted scopes.\u003C/p>\n\u003Cp>Second, the server must not pass the token it received from the client on to the API (\u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"token-passthrough\">token passthrough\u003C/span>). When the server calls the upstream API, it may act as an OAuth client of that API and uses a separate token issued by the API's own \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"authorization-server\">authorization server\u003C/span>. The specification does not prescribe how the server obtains that token or how it links the user to an account in the API.\u003C/p>\n\u003Cp>A server that connects clients to a third-party API with one static client identifier is called an \u003Cstrong>MCP proxy server\u003C/strong> in Security Best Practices. Such a server is exposed to the \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"confused-deputy\">confused deputy\u003C/span> problem, and the document requires it to keep per-client consent and to check it before the third-party authorization flow starts. The document also recommends a minimal initial set of scopes, with additional scopes requested when a privileged operation is first attempted. Security risks are described in the article \u003Ca href=\"/en/wiki/mcp/mcp-security\" class=\"wiki-link wiki-link--article\">Security of MCP\u003C/a>. A local server over \u003Cspan class=\"wiki-term\" tabindex=\"0\" data-wiki-term=\"stdio\">stdio\u003C/span> takes credentials, such as an API key, from its environment.\u003C/p>\n\u003Ch2 id=\"state-between-calls\" class=\"wiki-heading\">State between calls\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"state-between-calls\" 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>Since 2026-07-28 the protocol has no session; the changes are described in the article \u003Ca href=\"/en/wiki/mcp/stateless-mcp\" class=\"wiki-link wiki-link--article\">Stateless MCP\u003C/a>. A server that needs state between calls, such as a draft or an open transaction, returns an explicit handle from the tool that creates the state and accepts it as an argument of later calls. The model carries the handle forward.\u003C/p>\n\u003Cp>The specification gives non-normative guidance for handles:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Authorization.\u003C/strong> On an authenticated server a handle is a name, not a permission: the server checks the caller's rights to the handle on every call.\u003C/li>\n\u003Cli>\u003Cstrong>Opacity.\u003C/strong> A handle does not encode internal structure that invites parsing or guessing.\u003C/li>\n\u003Cli>\u003Cstrong>Lifetime.\u003C/strong> The retention period is stated in the description of the creating tool, for example &quot;drafts expire after 24 hours of inactivity&quot;, so that the model sees it.\u003C/li>\n\u003Cli>\u003Cstrong>Expiry.\u003C/strong> A call with an expired or unknown handle returns a tool execution error that says so, and the model can create a new handle.\u003C/li>\n\u003C/ul>\n\u003Cp>Security Best Practices adds that possession of a handle is not authentication. Handles come from a secure random generator and are bound on the server to the user from the verified token, for example by storing the state under the key \u003Ccode>&lt;user_id&gt;:&lt;handle&gt;\u003C/code>.\u003C/p>\n\u003Ch2 id=\"structured-output\" class=\"wiki-heading\">Structured output\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"structured-output\" 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>A tool can declare \u003Ccode>outputSchema\u003C/code>, the JSON Schema of its result. The structured result is returned in \u003Ccode>structuredContent\u003C/code> and must conform to the schema; for compatibility the tool should also return the serialized JSON in a text block. The fields themselves are described in the article \u003Ca href=\"/en/wiki/mcp/mcp-tools\" class=\"wiki-link wiki-link--article\">Tools in MCP\u003C/a>.\u003C/p>\n\u003Cp>For a server over an API, the output schema is a separate contract, not a copy of the API response: it contains the fields that the tool returns after filtering and renaming.\u003C/p>\n\u003Ch2 id=\"caching-hints\" class=\"wiki-heading\">Caching hints\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"caching-hints\" 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>Since 2026-07-28 the results of \u003Ccode>server/discover\u003C/code>, list methods and \u003Ccode>resources/read\u003C/code> carry caching hints: \u003Ccode>ttlMs\u003C/code>, the time in milliseconds during which the result stays fresh, and \u003Ccode>cacheScope\u003C/code>. The results of \u003Ccode>tools/call\u003C/code> are not on this list.\u003C/p>\n\u003Cp>\u003Ccode>cacheScope: &quot;public&quot;\u003C/code> means that the result contains no user-specific data and any shared cache may serve it to any user. \u003Ccode>&quot;private&quot;\u003C/code> allows reuse only within the same authorization context, so a list of tools that depends on the scopes of the token is \u003Ccode>&quot;private&quot;\u003C/code>. \u003Ccode>cacheScope\u003C/code> does not replace access control. Tools are returned in a deterministic order, which, according to the specification, also improves the hit rate of the model's prompt cache.\u003C/p>\n\u003Ch2 id=\"example-with-an-issue-tracker-api\" class=\"wiki-heading\">Example with an issue tracker API\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"example-with-an-issue-tracker-api\" 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 example uses a fictional API of an issue tracker at \u003Ccode>api.tracker.example\u003C/code>. It is not a real service. The API has four endpoints:\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-2\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Endpoint\u003C/th>\n\u003Cth>What it does\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>GET /v2/projects/{project_id}/issues\u003C/code>\u003C/td>\n\u003Ctd>List of issues; filters \u003Ccode>state\u003C/code> (code 1, 2 or 3) and \u003Ccode>assignee_id\u003C/code> (UUID); \u003Ccode>page\u003C/code>, \u003Ccode>per_page\u003C/code>; every issue with all its fields\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>POST /v2/projects/{project_id}/issues\u003C/code>\u003C/td>\n\u003Ctd>Creates an issue\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>POST /v2/issues/{issue_id}/transitions\u003C/code>\u003C/td>\n\u003Ctd>Changes the status by the identifier of a transition\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DELETE /v2/issues/{issue_id}\u003C/code>\u003C/td>\n\u003Ctd>Deletes an issue\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Ch3 id=\"before-the-redesign\" class=\"wiki-heading\">Before the redesign\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"before-the-redesign\" 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>A direct mirror produces one tool per endpoint. The names repeat the paths, the descriptions repeat the HTTP method, and the parameters require UUIDs and numeric codes that the model can only guess.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"json\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">JSON\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>[\n  {\n    &quot;name&quot;: &quot;get_v2_projects_project_id_issues&quot;,\n    &quot;description&quot;: &quot;GET /v2/projects/{project_id}/issues&quot;,\n    &quot;inputSchema&quot;: {\n      &quot;type&quot;: &quot;object&quot;,\n      &quot;properties&quot;: {\n        &quot;project_id&quot;: { &quot;type&quot;: &quot;string&quot; },\n        &quot;state&quot;: { &quot;type&quot;: &quot;integer&quot; },\n        &quot;assignee_id&quot;: { &quot;type&quot;: &quot;string&quot; },\n        &quot;page&quot;: { &quot;type&quot;: &quot;integer&quot; },\n        &quot;per_page&quot;: { &quot;type&quot;: &quot;integer&quot; }\n      },\n      &quot;required&quot;: [&quot;project_id&quot;]\n    }\n  },\n  {\n    &quot;name&quot;: &quot;post_v2_issues_issue_id_transitions&quot;,\n    &quot;description&quot;: &quot;POST /v2/issues/{issue_id}/transitions&quot;,\n    &quot;inputSchema&quot;: {\n      &quot;type&quot;: &quot;object&quot;,\n      &quot;properties&quot;: {\n        &quot;issue_id&quot;: { &quot;type&quot;: &quot;string&quot; },\n        &quot;transition_id&quot;: { &quot;type&quot;: &quot;string&quot; }\n      },\n      &quot;required&quot;: [&quot;issue_id&quot;, &quot;transition_id&quot;]\n    }\n  },\n  {\n    &quot;name&quot;: &quot;delete_v2_issues_issue_id&quot;,\n    &quot;description&quot;: &quot;DELETE /v2/issues/{issue_id}&quot;,\n    &quot;inputSchema&quot;: {\n      &quot;type&quot;: &quot;object&quot;,\n      &quot;properties&quot;: {\n        &quot;issue_id&quot;: { &quot;type&quot;: &quot;string&quot; }\n      },\n      &quot;required&quot;: [&quot;issue_id&quot;]\n    }\n  }\n]\u003C/code>\u003C/pre>\u003C/div>\n\u003Ch3 id=\"after-the-redesign\" class=\"wiki-heading\">After the redesign\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"after-the-redesign\" 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 redesigned server has three tools with the \u003Ccode>tracker_\u003C/code> prefix. They accept project and issue keys, readable statuses and user names; the server resolves them into identifiers, codes and transitions and walks through the pages of the API itself. Deletion is not exposed and stays in the tracker's own interface.\u003C/p>\n\u003Cdiv class=\"wiki-code\" data-language=\"json\">\u003Cdiv class=\"wiki-code__header\">\u003Cspan class=\"wiki-code__language\">JSON\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>[\n  {\n    &quot;name&quot;: &quot;tracker_search_issues&quot;,\n    &quot;title&quot;: &quot;Search issues&quot;,\n    &quot;description&quot;: &quot;Search issues in one project of the tracker. Returns at most `limit` issues, newest first. Use the concise format to answer questions and the detailed format when you need issue fields for a follow-up call. If more issues match, the result says so; narrow the query instead of raising the limit.&quot;,\n    &quot;inputSchema&quot;: {\n      &quot;type&quot;: &quot;object&quot;,\n      &quot;properties&quot;: {\n        &quot;project&quot;: {\n          &quot;type&quot;: &quot;string&quot;,\n          &quot;description&quot;: &quot;Project key, for example WEB&quot;\n        },\n        &quot;status&quot;: {\n          &quot;type&quot;: &quot;string&quot;,\n          &quot;enum&quot;: [&quot;open&quot;, &quot;in_progress&quot;, &quot;done&quot;],\n          &quot;description&quot;: &quot;Filter by status. Omit to search all statuses&quot;\n        },\n        &quot;assignee&quot;: {\n          &quot;type&quot;: &quot;string&quot;,\n          &quot;description&quot;: &quot;Username of the assignee, or me for the current user&quot;\n        },\n        &quot;query&quot;: {\n          &quot;type&quot;: &quot;string&quot;,\n          &quot;description&quot;: &quot;Words to find in the title or description&quot;\n        },\n        &quot;limit&quot;: {\n          &quot;type&quot;: &quot;integer&quot;,\n          &quot;minimum&quot;: 1,\n          &quot;maximum&quot;: 50,\n          &quot;default&quot;: 20\n        },\n        &quot;response_format&quot;: {\n          &quot;type&quot;: &quot;string&quot;,\n          &quot;enum&quot;: [&quot;concise&quot;, &quot;detailed&quot;],\n          &quot;default&quot;: &quot;concise&quot;\n        }\n      },\n      &quot;required&quot;: [&quot;project&quot;],\n      &quot;additionalProperties&quot;: false\n    },\n    &quot;outputSchema&quot;: {\n      &quot;type&quot;: &quot;object&quot;,\n      &quot;properties&quot;: {\n        &quot;issues&quot;: {\n          &quot;type&quot;: &quot;array&quot;,\n          &quot;items&quot;: {\n            &quot;type&quot;: &quot;object&quot;,\n            &quot;properties&quot;: {\n              &quot;key&quot;: { &quot;type&quot;: &quot;string&quot; },\n              &quot;title&quot;: { &quot;type&quot;: &quot;string&quot; },\n              &quot;status&quot;: { &quot;type&quot;: &quot;string&quot; },\n              &quot;assignee&quot;: { &quot;type&quot;: &quot;string&quot; }\n            },\n            &quot;required&quot;: [&quot;key&quot;, &quot;title&quot;, &quot;status&quot;]\n          }\n        },\n        &quot;truncated&quot;: { &quot;type&quot;: &quot;boolean&quot; }\n      },\n      &quot;required&quot;: [&quot;issues&quot;, &quot;truncated&quot;]\n    },\n    &quot;annotations&quot;: {\n      &quot;readOnlyHint&quot;: true,\n      &quot;openWorldHint&quot;: false\n    }\n  },\n  {\n    &quot;name&quot;: &quot;tracker_create_issue&quot;,\n    &quot;title&quot;: &quot;Create issue&quot;,\n    &quot;description&quot;: &quot;Create an issue in a project. Returns the key of the new issue, for example WEB-143. Each call creates a new issue, so do not repeat a call that succeeded.&quot;,\n    &quot;inputSchema&quot;: {\n      &quot;type&quot;: &quot;object&quot;,\n      &quot;properties&quot;: {\n        &quot;project&quot;: { &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;Project key, for example WEB&quot; },\n        &quot;title&quot;: { &quot;type&quot;: &quot;string&quot;, &quot;maxLength&quot;: 200 },\n        &quot;description&quot;: { &quot;type&quot;: &quot;string&quot; },\n        &quot;priority&quot;: {\n          &quot;type&quot;: &quot;string&quot;,\n          &quot;enum&quot;: [&quot;low&quot;, &quot;medium&quot;, &quot;high&quot;],\n          &quot;default&quot;: &quot;medium&quot;\n        }\n      },\n      &quot;required&quot;: [&quot;project&quot;, &quot;title&quot;],\n      &quot;additionalProperties&quot;: false\n    },\n    &quot;annotations&quot;: {\n      &quot;readOnlyHint&quot;: false,\n      &quot;destructiveHint&quot;: false,\n      &quot;idempotentHint&quot;: false,\n      &quot;openWorldHint&quot;: false\n    }\n  },\n  {\n    &quot;name&quot;: &quot;tracker_change_issue_status&quot;,\n    &quot;title&quot;: &quot;Change issue status&quot;,\n    &quot;description&quot;: &quot;Move an issue to another status. The previous status is replaced. Moving an issue to the status it already has changes nothing.&quot;,\n    &quot;inputSchema&quot;: {\n      &quot;type&quot;: &quot;object&quot;,\n      &quot;properties&quot;: {\n        &quot;issue&quot;: { &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;Issue key, for example WEB-142&quot; },\n        &quot;status&quot;: { &quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;open&quot;, &quot;in_progress&quot;, &quot;done&quot;] }\n      },\n      &quot;required&quot;: [&quot;issue&quot;, &quot;status&quot;],\n      &quot;additionalProperties&quot;: false\n    },\n    &quot;annotations&quot;: {\n      &quot;readOnlyHint&quot;: false,\n      &quot;destructiveHint&quot;: true,\n      &quot;idempotentHint&quot;: true,\n      &quot;openWorldHint&quot;: false\n    }\n  }\n]\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>The annotations follow the definitions of the schema. Creation only adds data and is not idempotent, because each call creates a new issue. The status change replaces the previous value, which is not an additive update, so \u003Ccode>destructiveHint\u003C/code> stays \u003Ccode>true\u003C/code>; a repeated call with the same status changes nothing, so the tool is idempotent. The tracker is a closed domain, so \u003Ccode>openWorldHint\u003C/code> is \u003Ccode>false\u003C/code>.\u003C/p>\n\u003Ch2 id=\"rest-api-endpoint-and-mcp-tool\" class=\"wiki-heading\">REST API endpoint and MCP tool\u003Cbutton type=\"button\" class=\"wiki-heading__anchor\" data-wiki-anchor=\"rest-api-endpoint-and-mcp-tool\" 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 table compares a typical endpoint of an existing API with a tool of a server designed over it.\u003C/p>\n\u003Cdiv class=\"wiki-table wiki-table--cols-3\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C/th>\n\u003Cth>REST API endpoint\u003C/th>\n\u003Cth>MCP tool over the API\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Consumer\u003C/td>\n\u003Ctd>Code written by a developer\u003C/td>\n\u003Ctd>A model choosing in each conversation\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Unit\u003C/td>\n\u003Ctd>One resource and one HTTP method\u003C/td>\n\u003Ctd>One task, possibly several API calls\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Interface description\u003C/td>\n\u003Ctd>Documentation, OpenAPI\u003C/td>\n\u003Ctd>Name, description, \u003Ccode>inputSchema\u003C/code>, read by the model\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Identifiers\u003C/td>\n\u003Ctd>Internal, often UUIDs\u003C/td>\n\u003Ctd>Readable keys and names; resolved by the server\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Volume of results\u003C/td>\n\u003Ctd>Full objects, pages chosen by the client\u003C/td>\n\u003Ctd>Selected fields, limits, concise and detailed formats\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Errors\u003C/td>\n\u003Ctd>HTTP status and error code\u003C/td>\n\u003Ctd>\u003Ccode>isError: true\u003C/code> with a text that explains the fix\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Side effects\u003C/td>\n\u003Ctd>Described in documentation\u003C/td>\n\u003Ctd>Annotations \u003Ccode>readOnlyHint\u003C/code>, \u003Ccode>destructiveHint\u003C/code>, \u003Ccode>idempotentHint\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Credentials\u003C/td>\n\u003Ctd>Token of the API\u003C/td>\n\u003Ctd>Token issued for the MCP server; separate token for the API\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>State\u003C/td>\n\u003Ctd>Resources and identifiers of the API\u003C/td>\n\u003Ctd>Explicit handles passed as arguments\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>The endpoint remains the basis: the logic of the service, its validation and its access control stay in the API. The tool adds the layer that the model needs: a choice of operations, wording, simplification and limits.\u003C/p>\n\u003Cp>The two interfaces evolve separately: a new tool description can change the behavior of the model without any change in the API, so tools are tested with models, as described in the article \u003Ca href=\"/en/wiki/mcp/testing-mcp-servers\" class=\"wiki-link wiki-link--article\">Testing MCP servers\u003C/a>. General methods of evaluating applications based on language models are described 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=\"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>MCP server over an existing API\u003C/td>\n\u003Ctd>MCP server that gives a model access to a service through its existing API and adapts its operations into tools\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tool annotations\u003C/td>\n\u003Ctd>Optional hints in a tool definition about its behavior: \u003Ccode>readOnlyHint\u003C/code>, \u003Ccode>destructiveHint\u003C/code>, \u003Ccode>idempotentHint\u003C/code>, \u003Ccode>openWorldHint\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tool namespacing\u003C/td>\n\u003Ctd>Common prefix or suffix in tool names that groups them by service or resource\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Response format\u003C/td>\n\u003Ctd>Tool parameter that lets the model choose a concise or a detailed result\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Tool execution error\u003C/td>\n\u003Ctd>Tool result with \u003Ccode>isError: true\u003C/code> and a text that the model can use to correct the call\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Token passthrough\u003C/td>\n\u003Ctd>Forwarding the client's token to another service; forbidden by the specification\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>MCP proxy server\u003C/td>\n\u003Ctd>MCP server that connects clients to a third-party API and acts as a single OAuth client of that API\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\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/server/utilities/caching\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Caching, 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/server/utilities/pagination\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Pagination, 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/authorization/security-considerations\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Authorization: Security Considerations, 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/changelog\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Key Changes, 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://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/2026-07-28/schema.ts\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Schema of the specification 2026-07-28 (schema.ts), 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://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://blog.modelcontextprotocol.io/posts/2026-03-16-tool-annotations/\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">Tool Annotations as Risk Vocabulary: What Hints Can and Can't Do, MCP blog, 16 March 2026\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\u003Cli>\u003Ca href=\"https://json-schema.org/draft/2020-12/json-schema-validation\" target=\"_blank\" rel=\"noopener\" class=\"wiki-link wiki-link--external\">JSON Schema Validation, draft 2020-12\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,63,66,69,72,75,78,81,84,87,90,93,96],{"id":11,"level":12,"text":13},"overview",2,"Overview",{"id":15,"level":12,"text":16},"why-an-api-is-not-exposed-as-is","Why an API is not exposed as is",{"id":18,"level":12,"text":19},"history","History",{"id":21,"level":12,"text":22},"choosing-the-operations","Choosing the operations",{"id":24,"level":25,"text":26},"workflows-instead-of-endpoints",3,"Workflows instead of endpoints",{"id":28,"level":25,"text":29},"read-and-write-operations","Read and write operations",{"id":31,"level":25,"text":32},"annotations-for-destructive-operations","Annotations for destructive operations",{"id":34,"level":12,"text":35},"descriptions-and-names","Descriptions and names",{"id":37,"level":25,"text":38},"tool-names","Tool names",{"id":40,"level":25,"text":41},"tool-descriptions","Tool descriptions",{"id":43,"level":25,"text":44},"parameter-names","Parameter names",{"id":46,"level":12,"text":47},"parameters","Parameters",{"id":49,"level":25,"text":50},"enumerations-and-default-values","Enumerations and default values",{"id":52,"level":25,"text":53},"readable-identifiers","Readable identifiers",{"id":55,"level":12,"text":56},"response-size","Response size",{"id":58,"level":25,"text":59},"filtering-and-limits","Filtering and limits",{"id":61,"level":25,"text":62},"truncation-with-guidance","Truncation with guidance",{"id":64,"level":25,"text":65},"concise-and-detailed-formats","Concise and detailed formats",{"id":67,"level":12,"text":68},"errors-the-model-can-act-on","Errors the model can act on",{"id":70,"level":12,"text":71},"authorization-and-user-identity","Authorization and user identity",{"id":73,"level":12,"text":74},"state-between-calls","State between calls",{"id":76,"level":12,"text":77},"structured-output","Structured output",{"id":79,"level":12,"text":80},"caching-hints","Caching hints",{"id":82,"level":12,"text":83},"example-with-an-issue-tracker-api","Example with an issue tracker API",{"id":85,"level":25,"text":86},"before-the-redesign","Before the redesign",{"id":88,"level":25,"text":89},"after-the-redesign","After the redesign",{"id":91,"level":12,"text":92},"rest-api-endpoint-and-mcp-tool","REST API endpoint and MCP tool",{"id":94,"level":12,"text":95},"terms","Terms",{"id":97,"level":12,"text":98},"sources","Sources",2860,1793718914268]