You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: apply linkification to chapters added on main
Same policy as the previous commit, applied to the newly added MCP Apps,
Extensions, and Dependencies chapters and the new migration/elicitation
sections: chapter cross-references in the Dependencies and Elicitation
pages become bold-wrapped links, and SEP-2133 mentions link to the
proposal PR (prose first-mention and the migration section heading).
Copy file name to clipboardExpand all lines: docs/advanced/extensions.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ An **extension** is an opt-in bundle of MCP behaviour behind one identifier.
4
4
5
5
It can contribute tools, resources, and new request methods, and it can wrap `tools/call`.
6
6
The server advertises it under `capabilities.extensions`, the client opts in the same way,
7
-
and nothing changes for anyone who didn't ask for it. That is the contract (SEP-2133), and
7
+
and nothing changes for anyone who didn't ask for it. That is the contract ([SEP-2133](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2133)), and
8
8
it has one golden rule: **extensions are off by default**.
Copy file name to clipboardExpand all lines: docs/migration.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -407,7 +407,7 @@ On `ClientSession`, `call_tool` / `get_prompt` / `read_resource` still return th
407
407
408
408
For protocol 2026-07-28 over Streamable HTTP, a tool's input-schema property may carry an `x-mcp-header` annotation. When a tool the client has listed is called, each annotated argument is mirrored into an `Mcp-Param-<name>` request header (string verbatim, integer as decimal, boolean as `true`/`false`, base64-sentinel-wrapped when not header-safe; `null`/absent arguments are omitted). The argument is also left in the request body. `list_tools` caches a tool's annotations, so list a tool before calling it to enable mirroring; a tool the client never listed emits no `Mcp-Param-*` headers. Other transports ignore the annotation.
409
409
410
-
### Server extensions API (SEP-2133)
410
+
### Server extensions API ([SEP-2133](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2133))
411
411
412
412
`MCPServer` now accepts opt-in extensions that bundle MCP behaviour behind a
413
413
reverse-DNS identifier and advertise it under `ServerCapabilities.extensions`
Copy file name to clipboardExpand all lines: docs/tutorial/dependencies.md
+6-6Lines changed: 6 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -35,7 +35,7 @@ Here is the input schema `tools/list` reports for `reserve_book`:
35
35
}
36
36
```
37
37
38
-
One property. Like the `Context` in **The Context**, a resolved parameter is a contract between you and the SDK: `stock` is not in the schema, the model is never told about it, and a client that sends a `stock` value anyway is ignored. The resolver's value is the only one your tool can receive.
38
+
One property. Like the `Context` in **[The Context](context.md)**, a resolved parameter is a contract between you and the SDK: `stock` is not in the schema, the model is never told about it, and a client that sends a `stock` value anyway is ignored. The resolver's value is the only one your tool can receive.
39
39
40
40
That last part is the point. A parameter the model cannot supply is a parameter the model cannot get wrong.
41
41
@@ -84,16 +84,16 @@ A resolver's parameters resolve exactly like a tool's: another `Resolve(...)`, t
84
84
!!! warning
85
85
On HTTP transports the `Context` includes `ctx.headers`. Headers are **client-supplied input**,
86
86
like any tool argument: fine for a locale or a feature flag, never an identity. Who the caller
87
-
is comes from your authorization layer (**Authorization**), not from a header anyone can set.
87
+
is comes from your authorization layer (**[Authorization](../advanced/authorization.md)**), not from a header anyone can set.
88
88
89
89
!!! tip
90
90
*Once per call* means exactly that: the next `tools/call` runs `check_stock` again. A resource
91
-
that should outlive a request - a database pool, an HTTP client - belongs in **Lifespan**, and
91
+
that should outlive a request - a database pool, an HTTP client - belongs in **[Lifespan](lifespan.md)**, and
92
92
a resolver can reach it through `ctx.request_context.lifespan_context`.
93
93
94
94
## Ask when you must
95
95
96
-
A resolver doesn't have to know the answer. It can return `Elicit(message, Model)` and the SDK asks the user - the **Elicitation** machinery, run for you:
96
+
A resolver doesn't have to know the answer. It can return `Elicit(message, Model)` and the SDK asks the user - the **[Elicitation](elicitation.md)** machinery, run for you:
97
97
98
98
```python title="server.py" hl_lines="26-32 39"
99
99
--8<--"docs_src/dependencies/tutorial003.py"
@@ -114,7 +114,7 @@ And if the user won't answer at all - declines the question, or cancels it?
114
114
Error executing tool order_book: Resolver for parameter 'backorder' could not resolve: elicitation was decline
115
115
```
116
116
117
-
That's the right default for a precondition: no answer, no order. When declining is an outcome your tool wants to handle - skip the backorder but still suggest another title - annotate `ElicitationResult[Backorder]` instead and the tool receives the full accept/decline/cancel outcome to branch on. **Elicitation** shows that form, and everything else about asking: the schema rules, the three answers, the client's side of the conversation.
117
+
That's the right default for a precondition: no answer, no order. When declining is an outcome your tool wants to handle - skip the backorder but still suggest another title - annotate `ElicitationResult[Backorder]` instead and the tool receives the full accept/decline/cancel outcome to branch on. **[Elicitation](elicitation.md)** shows that form, and everything else about asking: the schema rules, the three answers, the client's side of the conversation.
118
118
119
119
## Recap
120
120
@@ -124,4 +124,4 @@ That's the right default for a precondition: no answer, no order. When declining
124
124
* Bad graphs fail at registration with `InvalidSignature`, not mid-call.
125
125
* Return `Elicit(message, Model)` to ask the user, only when you have to. Unwrapped annotations abort on decline; `ElicitationResult[T]` lets the tool branch.
126
126
127
-
Next: what happens when your tool fails, and how to choose who finds out, in **Handling errors**.
127
+
Next: what happens when your tool fails, and how to choose who finds out, in **[Handling errors](handling-errors.md)**.
Copy file name to clipboardExpand all lines: docs/tutorial/elicitation.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -95,7 +95,7 @@ A parameter annotated `Annotated[T, Resolve(fn)]` is filled by running `fn` befo
95
95
96
96
Annotate the unwrapped model (`Annotated[Confirm, Resolve(confirm_delete)]`) instead when the tool doesn't need to branch: it receives the model on accept and the call aborts with an error on decline or cancel.
97
97
98
-
Asking is only one thing a resolver can do. The general mechanism - dependencies that compute without asking, dependencies of dependencies, what the model can and cannot supply - is the **Dependencies** chapter.
98
+
Asking is only one thing a resolver can do. The general mechanism - dependencies that compute without asking, dependencies of dependencies, what the model can and cannot supply - is the **[Dependencies](dependencies.md)** chapter.
0 commit comments