docs: refresh translations, and translate pages in parallel (#3458)
This commit is contained in:
parent
08a3bc8eaf
commit
fd66270926
2 changed files with 4821 additions and 2277 deletions
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
translation:
|
||||
sections: [0d6c05bcbf836bf3, 59a7b14eeefc68c1, 7114d8d6daba203f, e8bbb56a98ba7bc9, 5138010f6159901c, f78da7c7c363d4c6, 220a939cab348686]
|
||||
sections: [0d6c05bcbf836bf3, 9a78b5f6b44b18ab, 7114d8d6daba203f, e8bbb56a98ba7bc9, bfd2fd1153e71dac, 1615a994ef071fdd, 65c599fae991f245]
|
||||
tool: 1
|
||||
---
|
||||
# Первые шаги {#first-steps}
|
||||
|
|
@ -17,7 +17,7 @@ translation:
|
|||
* **Клиент** живёт внутри хоста и говорит на MCP. Хост запускает по одному клиенту на каждый сервер, к которому подключён.
|
||||
* **Сервер** — это то, что вы строите с помощью этого SDK. Он предоставляет клиентам разные вещи. С моделью напрямую он никогда не общается.
|
||||
|
||||
Вы пишете сервер. Хосты — это чужой продукт. SDK также даёт класс `Client`. Он пригодится для тестирования серверов и появится ниже на этой странице.
|
||||
Вы пишете сервер. Хосты — это чужой продукт. SDK также даёт класс `Client` — тот же самый, которым хост подключился бы к серверу по URL или запустил бы его как подпроцесс. Он появится ниже на этой странице, и им же вы будете тестировать свои серверы.
|
||||
|
||||
## Три примитива {#the-three-primitives}
|
||||
|
||||
|
|
@ -83,22 +83,20 @@ Inspector запустил ваш сервер через **stdio** — один
|
|||
|
||||
Когда клиент подключается, сервер объявляет свои **возможности**: на какие семейства запросов он будет отвечать. По этому объявлению клиент решает, о чём вообще имеет смысл спрашивать. Вы его не писали; `MCPServer` объявляет его за вас.
|
||||
|
||||
Посмотрите сами. Класс `Client` из SDK принимает объект сервера напрямую и подключается к нему **в памяти** (без подпроцесса, без порта):
|
||||
Посмотрите сами. Оставьте `server.py` работать по HTTP в одном терминале:
|
||||
|
||||
```python
|
||||
import asyncio
|
||||
```console
|
||||
uv run mcp run server.py --transport streamable-http
|
||||
```
|
||||
|
||||
from mcp import Client
|
||||
а из другого направьте на него клиент:
|
||||
|
||||
from server import mcp
|
||||
```python title="client.py" hl_lines="7-8"
|
||||
--8<-- "docs_src/first_steps/tutorial001_client.py"
|
||||
```
|
||||
|
||||
|
||||
async def main() -> None:
|
||||
async with Client(mcp) as client:
|
||||
print(client.server_capabilities.model_dump(exclude_none=True))
|
||||
|
||||
|
||||
asyncio.run(main())
|
||||
```console
|
||||
python client.py
|
||||
```
|
||||
|
||||
```text
|
||||
|
|
@ -118,9 +116,9 @@ asyncio.run(main())
|
|||
Обратите внимание на то, чего здесь нет. `completions` (автодополнение аргументов для шаблонов ресурсов и промптов) требует обработчика, который пишете вы; у этого сервера его нет, поэтому возможность отсутствует, и корректный клиент о ней не спросит. Таково правило для всего необязательного: зарегистрируйте нужное — и возможность появится; страница **[Автодополнение](../servers/completions.md)** это демонстрирует.
|
||||
|
||||
!!! info
|
||||
`Client(mcp)` — тот самый клиент в памяти, которым тестируется каждый пример в этой
|
||||
документации, и именно так вы будете тестировать свои. Ему отведена целая страница:
|
||||
**[Тестирование](testing.md)**.
|
||||
Этот `client.py` — полноценный MCP-клиент, и ему посвящена страница **[Клиент](../client/index.md)**.
|
||||
В тесте терминал и порт не нужны: передайте `Client` сам объект сервера —
|
||||
`Client(mcp)`. Этому тоже отведена целая страница: **[Тестирование](testing.md)**.
|
||||
|
||||
## Чего вы не писали {#what-you-did-not-write}
|
||||
|
||||
|
|
@ -129,7 +127,7 @@ asyncio.run(main())
|
|||
* JSON Schema. `a: int, b: int` — это *и есть* схема для `add`.
|
||||
* Обработчик запросов. `tools/list`, `resources/read`, `prompts/get` — всё это обслуживается за вас.
|
||||
* Объявление возможностей. `MCPServer` составил его за вас.
|
||||
* Ни строчки протокола. Согласование версии, обрамление JSON-RPC, обмен возможностями — всё это произошло внутри `mcp dev` и `Client(mcp)`, и вы этого не видели.
|
||||
* Ни строчки протокола. Согласование версии, обрамление JSON-RPC, обмен возможностями — всё это произошло внутри `mcp dev` и `client.py`, и вы этого не видели.
|
||||
|
||||
В этом соотношении — весь смысл SDK.
|
||||
|
||||
|
|
@ -140,6 +138,6 @@ asyncio.run(main())
|
|||
* По одному декоратору на примитив: `@mcp.tool()`, `@mcp.resource(uri)`, `@mcp.prompt()`. Имя, описание и схема берутся из функции.
|
||||
* URI с `{param}` создаёт **шаблон** ресурса, который отображается отдельно от конкретных ресурсов.
|
||||
* **Возможности** сервера объявляются за вас, а клиент спрашивает только о том, что сервер объявил.
|
||||
* `Client(mcp)` подключается к объекту сервера в памяти: ваш тестовый стенд с первого дня.
|
||||
* `Client("http://localhost:8000/mcp")` разговаривает с запущенным сервером. Передайте ему вместо этого сам объект сервера, `Client(mcp)`, — и это ваш тестовый стенд с первого дня.
|
||||
|
||||
Дальше — **[Подключение к настоящему хосту](real-host.md)**: этот же сервер внутри Claude Desktop или IDE, по-настоящему. Затем **[Тестирование](testing.md)**: одна страница, один клиент в памяти — и больше не придётся гадать, работает ли оно. После этого каждому примитиву отведена своя страница, начиная с того, которым управляет модель: **[Инструменты](../servers/tools.md)**.
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
---
|
||||
translation:
|
||||
sections: ['4926721070127497', c52a1de2b6b32f40, 8e792bf8c7489ec6, 627195f7159e24ef]
|
||||
sections: [5d13c2f0ba42c0d2, c52a1de2b6b32f40, 8e792bf8c7489ec6, 38552ea228b0a04f]
|
||||
tool: 1
|
||||
---
|
||||
# Тестирование {#testing}
|
||||
|
||||
В Python SDK есть класс `Client` со **встроенным in-memory транспортом**: передайте ему объект сервера, и он подключится к нему напрямую.
|
||||
Класс `Client` из SDK — тот самый, что подключается к URL или запускает подпроцесс, — умеет подключаться и **в памяти**: передайте ему объект сервера, и он будет говорить с ним напрямую.
|
||||
|
||||
Ни подпроцесса. Ни порта. Вообще никакого транспорта. Та же идея, что и `TestClient` в FastAPI.
|
||||
Ни подпроцесса. Ни порта. Ничего не передаётся по сети. Та же идея, что и `TestClient` в FastAPI.
|
||||
|
||||
## Базовое использование {#basic-usage}
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ async def test_call_add_tool(client: Client):
|
|||
|
||||
В тестах оставляйте его включённым. В продакшен-коде он не имеет смысла.
|
||||
|
||||
## Внутри процесса по умолчанию {#in-process-by-default}
|
||||
## Без привязки к поколению протокола по умолчанию {#era-neutral-by-default}
|
||||
|
||||
!!! note
|
||||
`Client(mcp)` подключается внутри процесса и по умолчанию **не привязан к поколению
|
||||
|
|
|
|||
Loading…
Reference in a new issue