Skip to content

Commit 66bc75f

Browse files
committed
docs: refresh translations for recent English changes
Re-runs scripts/docs/translations.py translate for all twelve languages to catch up with the English changes since the last refresh. Twenty-three pages per language had sections whose English changed; only those sections were retranslated and everything else is carried over byte for byte. run/authorization.md in es, ru and uk was retranslated whole (--pages) because the section-scoped run kept reproducing a stale phrase from the previous translation. Nothing under docs/, the per-language instructions or glossaries changed.
1 parent c82e003 commit 66bc75f

276 files changed

Lines changed: 4476 additions & 2203 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

i18n/de/pages/advanced/apps.md

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
translation:
3-
sections: [0355618e5f4d5fe4, 1821eaf50f2d0b64, 82e0b28ebd3abf5a, 8ac39614c094f2d0, dab6ff945501ab2a, bd5565c3b2d4f959, 96819ce3d63a0487]
3+
sections: [0355618e5f4d5fe4, 0fefa31fb7c7b585, 5c53e7487c9c70cc, 8ac39614c094f2d0, dab6ff945501ab2a, bd5565c3b2d4f959, 96819ce3d63a0487]
44
tool: 1
55
---
66
# MCP Apps {#mcp-apps}
@@ -18,7 +18,7 @@ Das SDK liefert das als eingebaute Extension `Apps` (`io.modelcontextprotocol/ui
1818

1919
## Eine Uhr mit Gesicht {#a-clock-with-a-face}
2020

21-
```python title="server.py" hl_lines="19 22 30 32"
21+
```python title="server.py" hl_lines="17 20 28 30"
2222
--8<-- "docs_src/apps/tutorial001.py"
2323
```
2424

@@ -39,11 +39,31 @@ Nicht jeder Client rendert Apps. Die Spezifikation sagt unverblümt, was das fü
3939
4040
Das Modell liest `content`; der iframe ist für Menschen. Ein UI-fähiger Host füttert das Modell trotzdem mit dem Textergebnis, und ein reiner Text-Client bekommt *nur* das. Das kanonische Muster ist also: ein Tool, zwei Antworten. Sieh dir `get_time` noch einmal an:
4141

42-
```python title="server.py" hl_lines="23-27"
42+
```python title="server.py" hl_lines="21-25"
4343
--8<-- "docs_src/apps/tutorial001.py"
4444
```
4545

46-
`client_supports_apps(ctx)` ist nur dann `True`, wenn der Client die Extension `io.modelcontextprotocol/ui` deklariert **und** `text/html;profile=mcp-app` in seinen `mimeTypes`-Einstellungen aufgeführt hat. Das Feld ist Pflicht, ein Client, der es weglässt, zählt also nicht. Genau das deklariert `main()` in derselben Datei: die Client-Hälfte der Aushandlung – und die reichhaltige Antwort kommt zurück.
46+
`client_supports_apps(ctx)` ist nur dann `True`, wenn der Client die Extension `io.modelcontextprotocol/ui` deklariert **und** `text/html;profile=mcp-app` in seinen `mimeTypes`-Einstellungen aufgeführt hat. Das Feld ist Pflicht, ein Client, der es weglässt, zählt also nicht. Hier ist die Client-Hälfte der Aushandlung:
47+
48+
```python title="client.py" hl_lines="8 12"
49+
--8<-- "docs_src/apps/tutorial001_client.py"
50+
```
51+
52+
Stelle `server.py` über HTTP bereit und starte dann den Client in einem zweiten Terminal:
53+
54+
```console
55+
uv run mcp run server.py --transport streamable-http
56+
```
57+
58+
```console
59+
python client.py
60+
```
61+
62+
```text
63+
2026-06-26T12:00:00Z
64+
```
65+
66+
Die reichhaltige Antwort kam zurück. Lass `extensions=[APPS_SUPPORT]` im `Client`-Aufruf weg, und dasselbe Programm gibt stattdessen `The time is 2026-06-26T12:00:00Z.` aus – das ist alles, was ein reiner Text-Client je zu sehen bekommt.
4767

4868
!!! warning
4969
Gib niemals einen Platzhalter wie `"[Rendered UI]"` als einzigen Inhalt zurück. Wenn der Fallback-Text nutzlos ist, ist das Tool für jeden reinen Text-Client und für das Modell selbst nutzlos. Schreib den Satz.

i18n/de/pages/advanced/extensions.md

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
translation:
3-
sections: [05891e7cc1938a13, b3c01a6af28c51ee, 7ffc91f5e38bdfe0, 717d3f235a8333a7, f471a13b2fe5d737, ed6af2df4b656dff]
3+
sections: [05891e7cc1938a13, b3c01a6af28c51ee, 6eba6ce094f4417e, 125f28588c85dd7b, ddd8969b698ca11c, ed6af2df4b656dff]
44
tool: 1
55
---
66
# Extensions {#extensions}
@@ -49,25 +49,31 @@ Nimm als Präfix eine Domain, die du kontrollierst. `io.modelcontextprotocol/*`
4949

5050
Die kleinste nützliche Extension besteht aus einem Tool und einer Settings-Map:
5151

52-
```python title="server.py" hl_lines="17 19-20 22-23 26"
52+
```python title="server.py" hl_lines="16 18-19 21-22 25"
5353
--8<-- "docs_src/extensions/tutorial003.py"
5454
```
5555

5656
* `tools()` gibt `ToolBinding`s zurück. Der Server registriert jedes einzelne genau so, als hättest du selbst `mcp.add_tool(...)` aufgerufen: dieselbe Schema-Generierung, dieselbe `Context`-Injection, alles gleich.
5757
* `settings()` ist der Wert, der unter `capabilities.extensions["com.example/stamps"]` angekündigt wird. Gib `{}` zurück (den Standardwert), um die Extension ohne Settings anzukündigen.
5858
* Die Extension bekommt den Server nie in die Hand. Sie deklariert ihre Beiträge als Daten; `MCPServer` verarbeitet sie. Es gibt kein `self.server`, das sie verändern könnte.
5959

60-
Und `main()` ist der Beweis, ein In-Memory-Client direkt gegen `mcp`:
60+
Stelle sie über HTTP bereit, und ein Client liefert den Beweis:
6161

62-
```python title="server.py" hl_lines="29-34"
63-
--8<-- "docs_src/extensions/tutorial003.py"
62+
```console
63+
uv run mcp run server.py --transport streamable-http
64+
```
65+
66+
```python title="client.py" hl_lines="7-11"
67+
--8<-- "docs_src/extensions/tutorial003_client.py"
6468
```
6569

70+
Jede `server.py` auf dieser Seite wird mit diesem Befehl bereitgestellt, und jede `client.py` läuft daneben mit `python client.py` aus einem zweiten Terminal.
71+
6672
### Eigene Methoden bedienen {#serving-your-own-methods}
6773

6874
Eine Extension kann **neue Request-Methoden** registrieren: eigene Verben, bedient neben denen der Spezifikation:
6975

70-
```python title="server.py" hl_lines="16-22 31 40-48"
76+
```python title="server.py" hl_lines="14-20 24 33-41"
7177
--8<-- "docs_src/extensions/tutorial004.py"
7278
```
7379

@@ -83,14 +89,15 @@ Methoden sind **strikt additiv**. Das SDK erzwingt das bei der Konstruktion, nic
8389

8490
### Die Client-Seite {#the-client-side}
8591

86-
Das `main()` derselben Datei ist die ganze Client-Geschichte, beide Hälften davon:
92+
Der Client ist ein eigenes Programm und trägt beide Hälften der Client-Geschichte:
8793

88-
```python title="server.py" hl_lines="54-58"
89-
--8<-- "docs_src/extensions/tutorial004.py"
94+
```python title="client.py" hl_lines="21-23 27-30"
95+
--8<-- "docs_src/extensions/tutorial004_client.py"
9096
```
9197

9298
* `Client(..., extensions=[advertise(EXTENSION_ID)])` deklariert die Extension. Die Deklarationen werden zu `ClientCapabilities.extensions`: Auf einer 2026-07-28-Verbindung reist die Map im `_meta`-Umschlag jedes einzelnen Requests, der Server sieht sie also bei **jedem** Request; auf einer Legacy-Verbindung reist sie mit dem `initialize`-Handshake. Dem Server-Code ist das egal: `require_client_extension(ctx, ...)` und `ctx.session.check_client_capability(...)` lesen auf beiden Pfaden die richtige Quelle.
9399
* Vendor-Methoden steigen eine Schicht tiefer zu `client.session.send_request(...)` hinab; `Client` bekommt nur für Verben der Spezifikation eigene Methoden. `send_request` akzeptiert jede `Request`-Unterklasse, der Vendor-Request geht also unverändert durch.
100+
* `SearchRequest` und die beiden Models, die er trägt, sind der Vertrag der Extension auf der Leitung, also deklariert der Client sie für sich selbst. Eine veröffentlichte Extension würde sie in einem Paket ausliefern, das beide Seiten importieren.
94101

95102
### `tools/call` abfangen {#intercepting-toolscall}
96103

@@ -109,12 +116,18 @@ Der Hook umhüllt `tools/call` und sonst nichts. Für alles, was jede Nachricht
109116

110117
## Eine Client-Extension verwenden {#using-a-client-extension}
111118

112-
Eine **Client-Extension** ist derselbe Vertrag von der konsumierenden Seite: ein Bündel clientseitigen Verhaltens hinter einem einzigen Identifier. Übergib Instanzen an `Client(extensions=[...])` und rufe Tools ganz normal auf:
119+
Eine **Client-Extension** ist derselbe Vertrag von der konsumierenden Seite: ein Bündel clientseitigen Verhaltens hinter einem einzigen Identifier. Der Server hier beantwortet `buy` mit einem einzulösenden Beleg statt mit der Ware, und das nur für einen Client, der die Extension deklariert hat:
113120

114-
```python title="client.py" hl_lines="66-68"
121+
```python title="server.py" hl_lines="22-25"
115122
--8<-- "docs_src/extensions/tutorial006.py"
116123
```
117124

125+
Übergib auf dem Client Instanzen an `Client(extensions=[...])` und rufe Tools ganz normal auf:
126+
127+
```python title="client.py" hl_lines="33-35"
128+
--8<-- "docs_src/extensions/tutorial006_client.py"
129+
```
130+
118131
`call_tool("buy", ...)` gibt ein gewöhnliches `CallToolResult` zurück, wie jeder andere Aufruf. Was die Extension geändert hat: Der Server darf `buy` jetzt mit einer `receipt`-**Ergebnisform** statt mit einem endgültigen Ergebnis beantworten, und `Receipts` bringt sie zu Ende (hier, indem sie den Beleg mit einem Folgeaufruf einlöst), bevor `call_tool` zurückkehrt. An der Aufrufstelle bewegt sich nichts.
119132

120133
Lass die Extension weg, und nichts davon existiert: Die Schranke des Servers weist einen Client ab, der sie nicht deklariert hat (Fehler -32021), und eine beanspruchte Form von einem Server, der die Schranke überspringt, fällt durch die Validierung, genau wie die Spezifikation es für einen unbekannten `resultType` verlangt. Standardmäßig aus, an beiden Enden der Leitung.
@@ -124,15 +137,15 @@ Um einen Identifier **ohne** clientseitiges Verhalten anzukündigen (der Server
124137
```python
125138
from mcp.client import advertise
126139

127-
client = Client(mcp, extensions=[advertise("com.example/search")])
140+
client = Client("http://localhost:8000/mcp", extensions=[advertise("com.example/search")])
128141
```
129142

130143
## Eine Client-Extension schreiben {#writing-a-client-extension}
131144

132145
Leite von `ClientExtension` ab und überschreibe nur, was du brauchst. Drei Arten von Beiträgen, jede mit einer Standardimplementierung: `settings()`, `claims()` und `notifications()`.
133146

134-
```python title="client.py" hl_lines="17-18 43-44 46-47"
135-
--8<-- "docs_src/extensions/tutorial006.py"
147+
```python title="client.py" hl_lines="16-17 25-26 28-29"
148+
--8<-- "docs_src/extensions/tutorial006_client.py"
136149
```
137150

138151
* Der Identifier folgt derselben Grammatik wie auf dem Server und wird validiert, wenn die Klasse definiert wird.
@@ -153,12 +166,18 @@ Zwei stille Regeln. Claims sind nur auf 2026-07-28-Verbindungen aktiv, und die C
153166

154167
### Extension-Verben {#extension-verbs}
155168

156-
Die eigenen Request-Methoden einer Extension brauchen keine clientseitige Registrierung. Ein Vendor-Request-Typ leitet von `mcp.types.Request` ab und geht durch `client.session.send_request`, wie in [Eigene Methoden bedienen](#serving-your-own-methods). Eine Ergänzung: Wenn ein Params-Schlüssel im `Mcp-Name`-Header mitreisen muss (Extension-Spezifikationen wie Tasks verlangen das für ihre Verben), deklariert der Request-Typ `name_param`:
169+
Die eigenen Request-Methoden einer Extension brauchen keine clientseitige Registrierung. Ein Vendor-Request-Typ leitet von `mcp.types.Request` ab und geht durch `client.session.send_request`, wie in [Eigene Methoden bedienen](#serving-your-own-methods). Nimm einen Server, dessen Extension ein einziges Verb zu einem benannten Job bedient:
157170

158-
```python title="client.py" hl_lines="22-25 46-47"
171+
```python title="server.py" hl_lines="12-13 30"
159172
--8<-- "docs_src/extensions/tutorial007.py"
160173
```
161174

175+
Eine Ergänzung auf dem Client: Wenn ein Params-Schlüssel im `Mcp-Name`-Header mitreisen muss (Extension-Spezifikationen wie Tasks verlangen das für ihre Verben), deklariert der Request-Typ `name_param`:
176+
177+
```python title="client.py" hl_lines="20-23 28-29"
178+
--8<-- "docs_src/extensions/tutorial007_client.py"
179+
```
180+
162181
Die Session spiegelt `params["jobId"]` auf jedem Sendepfad in `Mcp-Name`, und ein fehlender Wert scheitert laut, statt einen erforderlichen Header stillschweigend wegzulassen.
163182

164183
## Was eine Extension nicht kann {#what-an-extension-cannot-do}

i18n/de/pages/advanced/low-level-server.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
translation:
3-
sections: [2c79b6338e09b7ac, 7edc43b3fae11314, 1086e77ce561cd7f, a3f71823df5efc31, 9fc7109f72201cae, d50fe7faead8cf68, 7bf25983df655b66, 6330e1f4c6029683, 2f1749c8c133fa1c, 8db7116fc8ddd0ee, ebc33704fbd74262, cd0e9c933350390e]
3+
sections: [2c79b6338e09b7ac, 9d5d10a5f0405d0a, 1086e77ce561cd7f, a3f71823df5efc31, 9fc7109f72201cae, d50fe7faead8cf68, 7bf25983df655b66, 6330e1f4c6029683, 2f1749c8c133fa1c, 8db7116fc8ddd0ee, ebc33704fbd74262, 0fde3bcea081ba3a]
44
tool: 1
55
---
66
# Der Low-Level-Server {#the-low-level-server}
@@ -36,18 +36,22 @@ Drei Dinge haben sich geändert, und sie sind die ganze Low-Level-API:
3636

3737
### Ausprobieren {#try-it}
3838

39-
Hierfür gibt es keinen Inspector: `mcp dev` und `mcp run` akzeptieren nur einen `MCPServer`. Dem In-Memory-`Client` ist das egal; er nimmt einen Low-Level-`Server` genauso wie einen `MCPServer`:
39+
`mcp dev` und `mcp run` akzeptieren nur einen `MCPServer`, also betreibst du diesen hier selbst. Die letzte Zeile von `server.py` baut daraus eine gewöhnliche ASGI-App, und uvicorn führt sie aus:
4040

41-
```python title="main.py"
41+
```console
42+
uvicorn server:app --port 8000
43+
```
44+
45+
Richte den Inspector oder einen beliebigen Client auf `http://localhost:8000/mcp`:
46+
47+
```python title="client.py"
4248
import asyncio
4349

4450
from mcp import Client
4551

46-
from server import server
47-
4852

4953
async def main() -> None:
50-
async with Client(server) as client:
54+
async with Client("http://localhost:8000/mcp") as client:
5155
result = await client.call_tool("search_books", {"query": "dune", "limit": 5})
5256
print(result.content)
5357

@@ -64,6 +68,8 @@ Derselbe Text, den die `@mcp.tool()`-Version erzeugt hat. Zwei ehrliche Untersch
6468
* `result.structured_content` ist `None`. Der High-Level-Server verpackt ein `-> str` für dich in `{"result": ...}`; hier baut niemand, was du nicht gebaut hast.
6569
* `list_tools` gibt das Schema zurück, das **du** getippt hast, Zeichen für Zeichen. Die High-Level-Version hatte `"title": "Query"` auf jeder Property und ein `"title": "search_booksArguments"` an der Wurzel: Pydantic-Artefakte. Hier unten gilt: Was auf der Leitung ist, hast du dort hingelegt.
6670

71+
In einem Test sparst du dir uvicorn und den Port: `Client(server)` nimmt einen Low-Level-`Server` im selben Prozess genauso entgegen wie einen `MCPServer`, und **[Testen](../get-started/testing.md)** ist genau dieses Muster.
72+
6773
## Nichts wird für dich geprüft {#nothing-is-checked-for-you}
6874

6975
`MCPServer` weist ein fehlerhaftes Argument ab, bevor deine Funktion überhaupt läuft, indem er den Aufruf gegen das generierte Schema validiert (**[Tools](../servers/tools.md)**).
@@ -215,4 +221,4 @@ Jeder davon ist eine Idee, für die du jetzt das Vokabular hast; jeder hat seine
215221
* `add_request_handler(method, params_type, handler)` bedient jede Methode. `initialize` ist reserviert.
216222
* Die Capabilities, die ein `Server` ankündigt, leiten sich davon ab, welche Handler du registriert hast.
217223

218-
`Client(server)` hat beide Server identisch behandelt, weil sie dasselbe Protokoll *sind* – und genau darum geht es. Die nächste Schicht darunter ist gar keine Klasse: Es ist **[Middleware](middleware.md)**.
224+
Der Client hat beide Server identisch behandelt, weil sie dasselbe Protokoll *sind* – und genau darum geht es. Die nächste Schicht darunter ist gar keine Klasse: Es ist **[Middleware](middleware.md)**.

i18n/de/pages/advanced/pagination.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
translation:
3-
sections: [a9aba7a026c7bd85, ed32bda7ba9ae33a, 7e64cc5646abb91f, 22a0129ee78b3c63, d875373c06d8d2f9]
3+
sections: [a9aba7a026c7bd85, 83e2a08b9d46a398, 9fd8a0aa384b3257, 22a0129ee78b3c63, d875373c06d8d2f9]
44
tool: 1
55
---
66
# Paginierung {#pagination}
@@ -19,21 +19,25 @@ Paginierung ist für den Server gedacht, dessen Ressourcenliste in Wahrheit eine
1919
--8<-- "docs_src/pagination/tutorial001.py"
2020
```
2121

22-
* Auf einem Low-Level-`Server` sind Handler Konstruktorargumente, keine Dekoratoren. `on_list_resources` beantwortet jeden `resources/list`-Request; mehr Verkabelung gibt es nicht.
23-
* Jeder paginierte Handler ist als `params: PaginatedRequestParams | None` typisiert, und das Beispiel akzeptiert beides. Über eine Verbindung übergibt dir das SDK jedoch nie `None` (ein Request ohne `params`-Member erreicht den Handler als Modell mit seinen Standardwerten). Das Signal, auf das es ankommt, ist daher `params.cursor is None`: **von vorne beginnen**.
22+
* Auf einem Low-Level-`Server` sind Handler Konstruktorargumente, keine Dekoratoren. `on_list_resources` beantwortet jeden `resources/list`-Request; das ist schon die ganze Anbindung.
23+
* Jeder paginierte Handler ist als `params: PaginatedRequestParams | None` typisiert, und das Beispiel akzeptiert beides. Über eine Verbindung übergibt dir das SDK allerdings nie `None` (ein Request ohne `params`-Member erreicht den Handler als Modell mit seinen Standardwerten). Das Signal, auf das es ankommt, ist daher `params.cursor is None`: **von vorne beginnen**.
2424
* Du entscheidest, was ein Cursor *ist*. Hier ist es ein Offset, als String dargestellt. Ein Zeitstempel, ein Primärschlüssel, ein Base64-Blob: alles, was du beim Herausgeben erzeugen und beim Zurückkommen wiedererkennen kannst.
2525
* Mit `next_cursor=None` sagst du „das war die letzte Seite“. Es gibt keine Anzahl, keine Gesamtsumme, kein `has_more`. `None` ist das ganze Signal.
2626

2727
!!! tip
2828
Eine `PAGE_SIZE` von 10 macht das Beispiel lesbar. Wähle deine pro Endpunkt: Eine Liste
29-
einzeiliger Ressourcen verträgt eine Seite mit 500 Einträgen; eine Liste fetter Prompt-Templates nicht.
29+
einzeiliger Ressourcen verträgt eine Seite mit 500 Einträgen; eine Liste üppiger Prompt-Templates nicht.
3030
Der Client hat dabei nichts mitzureden, und das ist Absicht.
3131

3232
### Ausprobieren {#try-it}
3333

34-
`Client(server)` verbindet sich im Speicher mit einem Low-Level-`Server` genau so, wie er sich mit einem `MCPServer` verbindet.
34+
`mcp run` akzeptiert nur einen `MCPServer`, diesen hier stellst du also selbst bereit. Die letzte Zeile von `server.py` baut aus dem `Server` eine gewöhnliche ASGI-App, und uvicorn führt sie aus:
3535

36-
Rufe `list_resources()` ohne Argumente auf. Du bekommst zehn Ressourcen, `book-1` bis `book-10`, und `next_cursor` ist der String `"10"`.
36+
```console
37+
uvicorn server:app --port 8000
38+
```
39+
40+
Richte einen beliebigen Client (**[Der Client](../client/index.md)** oder den Inspector) auf `http://localhost:8000/mcp` und rufe `list_resources()` ohne Argumente auf. Du bekommst zehn Ressourcen, `book-1` bis `book-10`, und `next_cursor` ist der String `"10"`.
3741

3842
Gib ihn mit `list_resources(cursor="10")` zurück, und die erste Ressource ist `book-11`, der neue `next_cursor` ist `"20"`.
3943

@@ -43,15 +47,15 @@ Die zehnte Seite kommt mit `next_cursor` auf `None` zurück. Fertig.
4347

4448
Jede `list_*`-Methode auf `Client` (`list_tools`, `list_resources`, `list_resource_templates`, `list_prompts`) nimmt ein Keyword-Argument `cursor=`. Eine paginierte Liste leerzulesen ist ein einziges `while True`:
4549

46-
```python title="client.py" hl_lines="26-32"
50+
```python title="client.py" hl_lines="9-15"
4751
--8<-- "docs_src/pagination/tutorial002.py"
4852
```
4953

5054
* `cursor` beginnt als `None`, der erste Request trägt also keinen Cursor.
5155
* Erweitere die Liste, **bevor** du auf `next_cursor` schaust: Auch die letzte Seite enthält Ressourcen.
5256
* `next_cursor is None` ist der Ausstieg. Alles andere geht unverändert direkt zurück in `cursor=`.
5357

54-
Führe sein `main()` aus, und es gibt `100 resources` aus: zehn Seiten zu je zehn, zusammengefügt von einer Schleife, die nie wusste, dass es zehn Seiten waren.
58+
Während uvicorn weiterhin `server.py` ausliefert, starte in einem zweiten Terminal `python client.py`. Es gibt `100 resources` aus: zehn Seiten zu je zehn, zusammengefügt von einer Schleife, die nie wusste, dass es zehn Seiten waren.
5559

5660
Das ist dieselbe Schleife, die **[Der Client](../client/index.md)** für jedes `list_*`-Verb zeigt, und sie kostet nichts gegenüber einem Server, der nicht paginiert: `next_cursor` ist schon in der ersten Response `None`, und die Schleife läuft genau einmal.
5761

0 commit comments

Comments
 (0)