Как создать сервер MCP с помощью Python, Docker и Claude Code
Как создать MCP-сервер с Python, Docker и Claude Code
Создание собственного MCP-сервера позволяет подключить Claude Code к любому внутреннему инструменту или API.
Структура MCP-сервера
MCP-сервер — это процесс, который общается с Claude Code по стандартному протоколу через stdin/stdout. Может быть написан на любом языке.
Минимальная структура Python MCP-сервера:
# server.py
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types
server = Server("my-custom-server")
@server.list_tools()
async def list_tools() -> list[types.Tool]:
return [
types.Tool(
name="get_metrics",
description="Получить метрики приложения",
inputSchema={
"type": "object",
"properties": {
"service": {"type": "string", "description": "Имя сервиса"}
},
"required": ["service"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[types.TextContent]:
if name == "get_metrics":
service = arguments["service"]
# Ваша логика здесь
metrics = fetch_metrics(service)
return [types.TextContent(type="text", text=str(metrics))]
async def main():
async with stdio_server() as streams:
await server.run(*streams, server.create_initialization_options())
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Зависимости
pip install mcp anthropic
# pyproject.toml
[project]
dependencies = ["mcp>=1.0.0"]
Упаковка в Docker
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY server.py .
CMD ["python", "server.py"]
Регистрация в Claude Code
// .claude/mcp.json
{
"mcpServers": {
"my-metrics": {
"command": "docker",
"args": ["run", "--rm", "-i", "my-metrics-server"],
"env": {
"METRICS_API_KEY": "your-key"
}
}
}
}
Или для локального Python скрипта:
{
"mcpServers": {
"my-metrics": {
"command": "python",
"args": ["/path/to/server.py"]
}
}
}
Использование Claude Code для создания MCP
Интересно: можно попросить Claude Code написать сам MCP-сервер:
Создай MCP-сервер на Python, который:
1. Подключается к нашему внутреннему API (base URL в env: INTERNAL_API_URL)
2. Предоставляет tool get_deployment_status(service: str)
3. Предоставляет tool trigger_deploy(service: str, version: str)
Итог
- MCP-сервер = процесс на stdin/stdout, реализующий протокол MCP
- Python + библиотека mcp — наиболее удобный способ
- Docker упрощает изоляцию и деплой сервера
- Регистрация в .claude/mcp.json, работает в любой сессии проекта
Практические задания
Создай минимальный MCP-сервер
Создай MCP-сервер на Python с одним инструментом: get_timestamp(format: str) -> str, который возвращает текущее время в заданном формате.
Подключи его к Claude Code и проверь, что Claude может вызывать инструмент.
Подсказки
Упакуй сервер в Docker
Возьми MCP-сервер из предыдущего задания и упакуй его в Docker-контейнер.
Обнови конфигурацию Claude Code для запуска сервера через Docker. Убедись, что инструмент по-прежнему работает.
Подсказки