/* Корневые переменные цвета */
:root {
/* Цвет текста по умолчанию */
/* Система цветов Slate */
--color-slate-50: #faf9f6; /* Светло-костяной */
--color-slate-150: #f0eee6; /* Средне-костяной */
--color-slate-200: #e5e2d9; /* Тёмно-костяной */
--color-slate-300: #d1cfc5; /* Светло-облачный */
--color-slate-400: #b8b5a6; /* Средне-облачный */
--color-slate-500: #9a9788; /* Тёмно-облачный */
--color-slate-600: #7c7968; /* Светло-сланцевый */
--color-slate-700: #5e5b4e; /* Средне-сланцевый */
--color-slate-950: #2c2b25; /* Тёмно-сланцевый */
/* Макет контейнера редактора */
/* Стили обозревателя файлов - сохраняем шрифт редактора кода */
#tutorial-container .file-icon,
#tutorial-container .file-name,
/* Вкладки файлов - сохраняем шрифт редактора кода */
/* Пустое состояние при отсутствии открытых файлов */
/* Кнопки навигации */
/* Стили для тура/подсветки */
/* Кнопка триггера тура */
0% {
70% {
100% {
/* Обеспечение корректной работы элементов тура с существующей компоновкой */
/* Мобильные стили */
/* Скрываем название урока на мобильных устройствах */
/* Уменьшаем отступы в навигации урока */
/* Убираем отступы у контейнера кнопок навигации */
/* Уменьшаем высоту кнопок навигации */
/* Уменьшаем отступы контейнера аккордеона */
/* Настройки тура для мобильных устройств */
← Назад Далее →
// Данные из advanced_mcp/sampling.js
".gitignore": `# Файлы, сгенерированные Python
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info
Виртуальные окружения
.venv
.python-version
`,
"README.md": `# Демонстрация ведения журнала и прогресса MCP
Демонстрация работы протокола Model Context Protocol с использованием транспорта STDIO.
Установка
Установите зависимости с помощью uv:
\`\`\`bash
uv sync
\`\`\`
Запуск проекта
Запустите клиент MCP:
\`\`\`bash
uv run client.py
\`\`\`
`,
"client.py": `import asyncio
from anthropic import AsyncAnthropic
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from mcp.client.session import RequestContext
from mcp.types import (
CreateMessageRequestParams,
CreateMessageResult,
TextContent,
SamplingMessage,
anthropic_client = AsyncAnthropic()
model = "claude-sonnet-4-0"
server_params = StdioServerParameters(
command="uv",
args=["run", "server.py"],
async def chat(input_messages: list[SamplingMessage], max_tokens=4000):
messages = []
for msg in input_messages:
if msg.role == "user" and msg.content.type == "text":
content = (
msg.content.text
if hasattr(msg.content, "text")
else str(msg.content)
elif msg.role == "assistant" and msg.content.type == "text":
content = (
msg.content.text
if hasattr(msg.content, "text")
else str(msg.content)
response = await anthropic_client.messages.create(
model=model,
messages=messages,
max_tokens=max_tokens,
text = "".join([p.text for p in response.content if p.type == "text"])
return text
async def sampling_callback(
context: RequestContext, params: CreateMessageRequestParams
):
Вызов Claude с использованием SDK Anthropic
text = await chat(params.messages)
return CreateMessageResult(
role="assistant",
model=model,
content=TextContent(type="text", text=text),
async def run():
async with stdio_client(server_params) as (read, write):
async with ClientSession(
read, write, sampling_callback=sampling_callback
) as session:
await session.initialize()
result = await session.call_tool(
name="summarize",
print(result.content)
if __name__ == "__main__":
import asyncio
asyncio.run(run())
`,
"pyproject.toml": `[project]
name = "sampling"
version = "0.1.0"
description = "Демонстрация работы с выборкой в MCP"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"aioconsole>=0.8.1",
"anthropic>=0.53.0",
"mcp[cli]>=1.9.3",
[tool.setuptools]
py-modules = ["client", "server"]
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
`,
"server.py": `from mcp.server.fastmcp import FastMCP, Context
from mcp.types import SamplingMessage, TextContent
mcp = FastMCP(name="Demo Server")
@mcp.tool()
async def summarize(text_to_summarize: str, ctx: Context):
prompt = f"""
Пожалуйста, сделайте краткое резюме следующего текста:
"""
result = await ctx.session.create_message(
messages=[
SamplingMessage(
role="user", content=TextContent(type="text", text=prompt)
max_tokens=4000,
system_prompt="Вы — полезный исследовательский ассистент.",
if result.content.type == "text":
return result.content.text
else:
raise ValueError("Ошибка при выполнении выборки")
if __name__ == "__main__":
mcp.run(transport="stdio")
`,
file: "server.py",
line: 14,
endLine: 22,
title: "Инициализация выборки",
markdown:
"На сервере во время вызова инструмента выполните метод `create_message()`, передав список сообщений, которые вы хотите отправить языковой модели.",
file: "client.py",
line: 50,
endLine: 52,
title: "Функции обратного вызова для выборки",
markdown:
"На клиенте вы должны реализовать функцию обратного вызова для выборки. Она будет получать список сообщений, предоставленных сервером.",
file: "client.py",
line: 24,
endLine: 38,
title: "Форматы сообщений",
markdown: `Список сообщений, предоставленных сервером, отформатирован для общения в MCP. Отдельные сообщения не гарантированно совместимы с используемым вами SDK языковой модели.
Например, если вы используете SDK Anthropic, вам потребуется написать немного логики преобразования, чтобы преобразовать сообщения MCP в формат, совместимый с SDK Anthropic.`,
file: "client.py",
line: 53,
endLine: 60,
title: "Возврат сгенерированного текста",
markdown: `После генерации текста с помощью языковой модели вы вернёте `CreateMessageResult`, который содержит сгенерированный текст.`,
file: "client.py",
line: 66,
endLine: 66,
title: "Подключение функции обратного вызова",
markdown: `Не забудьте: функцию обратного вызова на клиенте нужно передать в вызов `ClientSession`.`,
file: "server.py",
line: 24,
endLine: 27,
title: "Получение результата",
markdown: `После того как клиент сгенерирует и вернёт текст, он будет отправлен на сервер. Вы можете использовать этот текст для различных целей:
- Использовать его как часть рабочего процесса в вашем инструменте
- Решить, сделать ли ещё один вызов выборки
- Вернуть сгенерированный текст
`,
```