MCP-серверы¶
Что это такое?
Ознакомьтесь с этой секцией документации, чтобы узнать подробности: Базовая информация — MCP-серверы
Вот базовый пример, от которого можно отталкиваться:
mcpServers:
- name: "Notion"
command: "npx"
args: ["-y", "@notionhq/notion-mcp-server"]
env:
NOTION_TOKEN: "..."
Подробности о конфигурации можно найти здесь: mcpServers.
Проверка статуса серверов¶
Через интерфейс:
- Откройте Настройки
- Перейдите на вкладку MCP
- Просмотрите список серверов:
- 🟢 Connected — подключён
- 🟡 Connecting — подключение
- 🔴 Not Connected — ошибка подключения
Просмотр доступных инструментов¶
- Откройте чат
- Переключитесь на Агент
- Нажмите Инструменты
- Найдите инструменты MCP по названию сервера
Пример:
GitHub MCP:
- github_create_issue
- github_get_pull_request
- github_search_repositories
SQLite MCP:
- query_database
- list_tables
- describe_table
Вызов инструментов MCP¶
Агент автоматически использует инструменты MCP:
Пример 1: Работа с GitHub
Пример 2: Работа с БД
Пример 3: Работа с файлами
Политики инструментов MCP¶
Для инструментов MCP можно настроить политики:
- Откройте Инструменты в режиме Агент
- Найдите инструмент MCP
- Выберите политику:
- ✅ Автоматически
- ⚠️ С подтверждением
- ❌ Выключен
Рекомендации безопасности¶
-
Доверяйте только проверенным серверам:
- Используйте официальные серверы
- Проверяйте код кастомных серверов
-
Ограничивайте доступ:
-
Используйте переменные окружения:
-
Требуйте подтверждения:
- Для операций записи
- Для удаления данных
- Для выполнения команд
Не рекомендуется:
- Передавать секреты в логах
- Давать доступ к системным файлам
- Выполнять произвольные команды
- Подключаться к недоверенным серверам
Допустимо:
- Читать данные из БД
- Вызывать API сервисов
- Работать с файлами проекта
- Использовать официальные серверы
Создание собственного MCP-сервера¶
MCP сервер можно написать на любом языке, например:
- TypeScript/JavaScript — официальная библиотека
- Python — официальная библиотека
- Java/Kotlin — через HTTP/WebSocket
- Go — через STDIO
- Любой другой — через стандартные потоки
MCP сервер должен реализовать:
- Инициализация — handshake с клиентом
- Список инструментов — что может делать сервер
- Вызов инструментов — выполнение функций
- Ресурсы (опционально) — данные для чтения
- Промпты (опционально) — шаблоны текста
Ниже приведены примеры на популярных языках программирования.
Для создания MCP-сервера на Python используйте официальную библиотеку mcp:
# server.py
from mcp.server.fastmcp import FastMCP
import sqlite3
mcp = FastMCP("SQLite MCP")
@mcp.tool()
def query_database(sql: str) -> list[dict]:
"""Выполняет SQL-запрос к базе данных и возвращает результаты."""
conn = sqlite3.connect("example.db")
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute(sql)
results = [dict(row) for row in cursor.fetchall()]
conn.close()
return results
@mcp.resource("db://tables")
def list_tables() -> list[str]:
"""Возвращает список таблиц в базе данных."""
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
tables = [row[0] for row in cursor.fetchall()]
conn.close()
return tables
if __name__ == "__main__":
mcp.run()
Конфигурация:
Используйте пакет @modelcontextprotocol/sdk для создания сервера на Node.js:
// server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "Weather MCP",
version: "1.0.0",
});
server.tool(
"getWeather",
"Получает текущую погоду для указанного города",
{
city: z.string().describe("Название города"),
},
async ({ city }) => {
// Логика получения погоды (например, через API)
const temperature = Math.floor(Math.random() * 30) + 10;
return {
content: [
{
type: "text",
text: `Температура в городе ${city}: ${temperature}°C`,
},
],
};
}
);
server.resource(
"config",
"config://settings",
async () => ({
content: [
{
type: "text",
text: JSON.stringify({ apiKey: "xxx", timeout: 5000 }),
},
],
})
);
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);
Конфигурация:
Для Go используйте библиотеку github.com/mark3labs/mcp-go:
// main.go
package main
import (
"fmt"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
func main() {
s := server.NewMCPServer(
"File System MCP",
"1.0.0",
server.WithResourceCapabilities(true, true),
server.WithToolCapabilities(true),
)
// Добавляем инструмент
s.AddTool(mcp.NewTool(
"read_file",
mcp.WithDescription("Читает содержимое файла"),
mcp.WithString("path", mcp.Required(), mcp.Description("Путь к файлу")),
), readFileHandler)
// Добавляем ресурс
s.AddResource(mcp.Resource{
URI: "file:///etc/config",
Name: "System Config",
Template: mcp.NewResourceTemplate("file://{path}"),
}, readResourceHandler)
server.ServeStdio(s)
}
func readFileHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
path := request.Arguments["path"].(string)
// Логика чтения файла
content := "Содержимое файла..."
return &mcp.CallToolResult{
Content: []mcp.Content{
mcp.TextContent{Text: content},
},
}, nil
}
func readResourceHandler(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {
return []mcp.ResourceContents{
{Text: "Конфигурация системы...", URI: request.Params.URI},
}, nil
}
Конфигурация: