Начало работы с MCP
Пошаговое руководство по созданию первого MCP сервера — от установки до тестирования
Model Context Protocol (MCP) позволяет создавать серверы, которые расширяют возможности AI-ассистентов. В этом руководстве мы создадим первый MCP сервер с нуля.
Требования
Заголовок раздела «Требования»- Python 3.10+ или Node.js 18+
- pip или npm/pnpm
- Claude Desktop или другой MCP клиент для тестирования
Выбор языка
Заголовок раздела «Выбор языка»| Язык | Рекомендуется для | SDK |
|---|---|---|
| Python | Новичков, ML/Data Science | FastMCP |
| TypeScript | Web-разработчиков | @modelcontextprotocol/sdk |
| PHP | Legacy систем, Laravel | php-mcp/server |
| Rust | Production, высокой производительности | rust-sdk |
| Go | Микросервисов | mcp-go |
| C# | .NET экосистемы | modelcontextprotocol |
Быстрый старт с Python
Заголовок раздела «Быстрый старт с Python»1. Установка
Заголовок раздела «1. Установка»# Создание виртуального окруженияpython -m venv .venvsource .venv/bin/activate # Linux/macOS# .venv\Scripts\activate # Windows
# Установка MCP SDKpip install mcp2. Создание сервера
Заголовок раздела «2. Создание сервера»Создайте файл server.py:
from mcp.server.fastmcp import FastMCP
# Инициализация сервераmcp = FastMCP("Мой первый сервер")
# Инструмент: функция, которую AI может вызвать@mcp.tool()def calculate(operation: str, a: float, b: float) -> float: """ Выполняет математическую операцию.
Args: operation: Операция (add, subtract, multiply, divide) a: Первое число b: Второе число
Returns: Результат вычисления """ match operation: case "add": return a + b case "subtract": return a - b case "multiply": return a * b case "divide": if b == 0: raise ValueError("Деление на ноль") return a / b case _: raise ValueError(f"Неизвестная операция: {operation}")
# Ресурс: данные, которые AI может прочитать@mcp.resource("info://server")def get_server_info() -> str: """Информация о сервере""" return """ Сервер: Мой первый MCP сервер Версия: 1.0.0 Автор: kaktak.net """
# Промпт: шаблон для структурированных запросов@mcp.prompt()def math_prompt(problem: str) -> str: """Промпт для математических задач""" return f""" Реши следующую математическую задачу, используя инструмент calculate:
{problem}
Покажи пошаговое решение. """
if __name__ == "__main__": mcp.run()3. Тестирование с MCP Inspector
Заголовок раздела «3. Тестирование с MCP Inspector»MCP Inspector — официальный инструмент для тестирования серверов:
# Установкаnpm install -g @anthropic-ai/mcp-inspector
# Запускnpx @modelcontextprotocol/inspector python server.pyОткройте http://localhost:5173 в браузере и протестируйте:
- Вкладка Tools — вызовите
calculate - Вкладка Resources — прочитайте
info://server - Вкладка Prompts — используйте
math_prompt
4. Подключение к Claude Desktop
Заголовок раздела «4. Подключение к Claude Desktop»Отредактируйте конфигурацию Claude Desktop:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{ "mcpServers": { "my-server": { "command": "python", "args": ["/полный/путь/к/server.py"] } }}Перезапустите Claude Desktop. Сервер появится в списке доступных.
Быстрый старт с TypeScript
Заголовок раздела «Быстрый старт с TypeScript»1. Инициализация проекта
Заголовок раздела «1. Инициализация проекта»mkdir my-mcp-servercd my-mcp-servernpm init -ynpm install @modelcontextprotocol/sdknpm install -D typescript @types/nodenpx tsc --init2. Создание сервера
Заголовок раздела «2. Создание сервера»Создайте файл src/index.ts:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({ name: "my-server", version: "1.0.0",});
// Регистрация инструментаserver.tool( "calculate", { operation: { type: "string", enum: ["add", "subtract", "multiply", "divide"] }, a: { type: "number" }, b: { type: "number" }, }, async ({ operation, a, b }) => { let result: number;
switch (operation) { case "add": result = a + b; break; case "subtract": result = a - b; break; case "multiply": result = a * b; break; case "divide": if (b === 0) throw new Error("Деление на ноль"); result = a / b; break; default: throw new Error(`Неизвестная операция: ${operation}`); }
return { content: [{ type: "text", text: `Результат: ${result}` }], }; });
// Запуск сервераconst transport = new StdioServerTransport();await server.connect(transport);3. Сборка и запуск
Заголовок раздела «3. Сборка и запуск»npx tscnode dist/index.js4. Конфигурация Claude Desktop
Заголовок раздела «4. Конфигурация Claude Desktop»{ "mcpServers": { "my-server": { "command": "node", "args": ["/полный/путь/к/dist/index.js"] } }}Структура проекта
Заголовок раздела «Структура проекта»Рекомендуемая структура для MCP сервера:
my-mcp-server/├── src/│ ├── index.ts # Entry point│ ├── tools/ # Инструменты│ │ ├── calculator.ts│ │ └── filesystem.ts│ ├── resources/ # Ресурсы│ │ └── config.ts│ └── prompts/ # Промпты│ └── templates.ts├── tests/│ └── server.test.ts├── package.json├── tsconfig.json├── Dockerfile # Для Docker развёртывания└── README.mdКлючевые концепции
Заголовок раздела «Ключевые концепции»Инструменты (Tools)
Заголовок раздела «Инструменты (Tools)»Инструменты — это функции, которые AI может вызывать. Каждый инструмент имеет:
- Имя — уникальный идентификатор
- Описание — что делает инструмент (важно для AI)
- Схему параметров — типы входных данных
- Обработчик — логика выполнения
@mcp.tool()def search_database(query: str, limit: int = 10) -> list[dict]: """ Поиск в базе данных.
Args: query: Поисковый запрос limit: Максимальное количество результатов """ # Логика поиска return resultsРесурсы (Resources)
Заголовок раздела «Ресурсы (Resources)»Ресурсы — это данные, которые AI может прочитать:
- URI — уникальный идентификатор (
file://,db://,api://) - MIME-тип — формат данных
- Содержимое — сами данные
@mcp.resource("config://database")def get_db_config() -> str: """Конфигурация базы данных""" return json.dumps({ "host": "localhost", "port": 5432, "database": "myapp" })Промпты (Prompts)
Заголовок раздела «Промпты (Prompts)»Промпты — шаблоны для структурированных запросов:
@mcp.prompt()def code_review(language: str, code: str) -> str: """Промпт для ревью кода""" return f""" Проведи код-ревью следующего {language} кода:
```{language} {code} ```
Обрати внимание на: 1. Потенциальные баги 2. Производительность 3. Читаемость 4. Best practices """Следующие шаги
Заголовок раздела «Следующие шаги»- Python SDK — подробная документация FastMCP
- TypeScript SDK — работа с Node.js
- Docker развёртывание — контейнеризация
- Безопасность — защита сервера