У готовых MCP-серверов есть предел: они знают популярные сервисы, но не вашу таблицу остатков и не самописную учётную программу. Чтобы нейросеть могла с ними работать, придётся создать свой MCP-сервер.
Звучит сложно, но сервер с одним-двумя действиями занимает меньше 30 строк на Python. Ниже соберём такой сервер для склада напольных покрытий, подключим его к Claude Code и проверим на настоящем вопросе.
Какой MCP-сервер мы создадим
Склад ведёт остатки в обычной таблице. Менеджер хочет спрашивать нейросеть «Есть ли 120 м² серого дуба?» и получать ответ по свежим данным, а не по памяти нейросети.
MCP-сервер даст нейросети два действия:
- ostatok: найти товар по артикулу и вернуть остаток и цену;
- spisok_tovarov: показать все товары с артикулами.
Действия в MCP называют инструментами. Нейросеть видит их название и описание и сама решает, какой вызвать. Что такое MCP и зачем он нужен, объяснено в статье MCP-сервер простыми словами.
Что понадобится
- Python 3.10 или новее. На Mac и в Linux он часто уже есть, проверить можно командой
python3 --version.
- Claude Code или другой клиент, который умеет подключать MCP-серверы.
- Полчаса времени. Программировать уметь не обязательно: код ниже можно скопировать целиком.
Важно: версия 2 библиотеки mcp
Большинство инструкций в интернете написаны для первой версии библиотеки mcp, то есть готового набора кода, который подключают к своей программе. В ней сервер создавался через FastMCP. В версии 2 его переименовали в MCPServer, и старый код при запуске падает с ошибкой:
ModuleNotFoundError: No module named 'mcp.server.fastmcp'.
This is mcp 2.x, where FastMCP was renamed to MCPServer
Мы ставили библиотеку 13 октября 2026, установилась версия 2.3.0. Код ниже написан для неё.
Шаг 1. Создайте папку и окружение
Окружение — это отдельная папка с библиотеками для одного проекта, чтобы они не смешивались с другими программами. Выполните в терминале своего компьютера:
bash
mkdir sklad-mcp
cd sklad-mcp
python3 -m venv .venv
.venv/bin/pip install "mcp[cli]"
На Windows команда называется python или py, а путь внутри окружения другой: .venv\Scripts\pip вместо .venv/bin/pip. На Windows мы этот путь не проверяли.
Шаг 2. Положите данные
В папке sklad-mcp создайте файл ostatki.csv и запишите в него остатки. В реальной работе это может быть выгрузка из учётной программы, которая обновляется по расписанию.
артикул;товар;остаток_м2;цена_за_м2
L-301;Ламинат Дуб натуральный 33 класс;420;890
L-302;Ламинат Дуб серый 33 класс;0;920
L-410;Ламинат Орех 32 класс;75;760
Шаг 3. Напишите сервер
Создайте рядом файл server.py с таким кодом:
```python
import csv
from pathlib import Path
from mcp.server.mcpserver import MCPServer
FILE = Path(file).parent / "ostatki.csv"
server = MCPServer("sklad")
def read_rows():
with open(FILE, encoding="utf-8") as f:
return list(csv.DictReader(f, delimiter=";"))
@server.tool()
def ostatok(artikul: str) -> str:
"""Остаток товара на складе и цена за м² по артикулу, например L-301."""
for row in read_rows():
if row["артикул"].lower() == artikul.strip().lower():
return f'{row["товар"]}: на складе {row["остаток_м2"]} м², цена {row["цена_за_м2"]} ₽ за м²'
return f"Артикул {artikul} не найден"
@server.tool()
def spisok_tovarov() -> str:
"""Список всех товаров с артикулами."""
return "\n".join(f'{r["артикул"]}: {r["товар"]}' for r in read_rows())
if name == "main":
server.run()
```
Как это читать, если вы не программист:
- строка
@server.tool() превращает функцию под ней в инструмент для нейросети;
- текст в тройных кавычках это описание инструмента, его нейросеть читает, чтобы понять, когда инструмент нужен;
artikul: str говорит нейросети, что инструменту нужно передать артикул текстом;
- файл с остатками читается при каждом вопросе, поэтому нейросеть всегда видит свежие данные.
Шаг 4. Подключите сервер к Claude Code
Выполните в той же папке команду. Пути пишите полностью: Claude Code запускает сервер сам и может искать файлы не там, где вы ожидаете.
bash
claude mcp add sklad -- /Users/anna/sklad-mcp/.venv/bin/python /Users/anna/sklad-mcp/server.py
Проверьте подключение командой claude mcp list. Напротив sklad должно стоять «✔ Connected». Остальные способы подключения, например к n8n, разобраны в инструкции как подключить MCP-сервер.
Шаг 5. Проверьте на настоящем вопросе
Мы спросили Claude: «Есть ли на складе 120 м² серого дуба и 60 м² ореха?» Он сам вызвал инструмент по каждому товару и ответил:
Хватает только ореха, серого дуба на складе нет.
Дуб серый (L-302): на складе 0 м² из нужных 120 м². Цена 920 ₽/м².
Орех (L-410): на складе 75 м², нужно 60 м², хватает. Цена 760 ₽/м², за 60 м² выйдет 45 600 ₽.
Артикулов в вопросе не было: Claude сам сопоставил названия товаров с артикулами. Сумму за 60 м² он тоже посчитал сам, хотя такого инструмента в сервере нет.
Как запустить сервер по адресу
Сейчас сервер работает только на вашем компьютере: Claude Code запускает его сам. Если сервером должны пользоваться коллеги или агент в n8n на другом компьютере, его запускают как отдельную программу с адресом. Для этого замените последнюю строку server.py:
python
server.run(transport="streamable-http", host="127.0.0.1", port=8765)
Запустите сервер командой .venv/bin/python server.py, а в Claude Code подключите его по адресу:
bash
claude mcp add --transport http sklad-http http://127.0.0.1:8765/mcp
У нас такой вариант тоже показал «✔ Connected». Адрес 127.0.0.1 работает только на этом же компьютере. Чтобы открыть сервер в интернет, понадобятся свой сервер, домен и защита ключом доступа: без ключа данные склада сможет запросить кто угодно.
Если не работает
| Что видно |
Почему |
Что сделать |
No module named 'mcp.server.fastmcp' |
код из инструкции для первой версии библиотеки |
заменить строку подключения библиотеки на from mcp.server.mcpserver import MCPServer |
| «Failed to connect» |
неверный путь к Python или к server.py |
указать полные пути, как в шаге 4 |
| Claude не вызывает инструмент |
непонятное описание в тройных кавычках |
описать, что инструмент делает и какой пример данных ждёт |
| «Артикул не найден», хотя он есть |
лишние пробелы в таблице |
код сам убирает пробелы и разницу между большими и маленькими буквами в вопросе, проверьте, нет ли лишних пробелов в самой таблице |
| после правки кода ничего не изменилось |
сервер работает со старым кодом |
перезапустить Claude Code |
Ошибки самого подключения, например сервер, пропавший из списка, разобраны в таблице инструкции по подключению из шага 4.
Какие инструменты добавлять в сервер первыми
Начинайте с инструментов, которые только читают данные, как в нашем примере. Инструменты, которые что-то меняют, например списывают остатки или создают заказ, добавляйте позже и сначала проверяйте на копии данных.
Описание инструмента и его ответы нейросеть читает как текст. Если в данных могут оказаться чужие тексты, например комментарии клиентов, в них может прийти и чужая команда, об этом статья про промпт-инъекцию.
Тот же подход работает с любой учётной программой, у которой есть выгрузка или API. Какие варианты есть для 1С, разобрано в статье про ИИ для 1С.
Частые вопросы
На каком языке можно написать MCP-сервер?
Официальные библиотеки есть для Python, TypeScript и других языков. Python проще всего для первого сервера: код короткий и читается почти как текст.
Можно ли подключить такой сервер к n8n?
Да, если сервер открыт по адресу, который доступен n8n: на одном компьютере хватит 127.0.0.1, для n8n на сервере понадобится адрес в интернете и ключ доступа. В n8n такой сервер подключается блоком MCP Client или MCP Client Tool, этот путь со своим сервером мы пока не проверяли.
Сколько стоит свой MCP-сервер?
Сам сервер бесплатный: библиотека mcp открытая, а на своём компьютере он ничего не стоит. Платить придётся за нейросеть, которая им пользуется, и за сервер в интернете, если открывать его коллегам.
Нужно ли перезапускать сервер после правки таблицы?
Нет. Сервер читает таблицу при каждом вопросе. Перезапуск нужен только после правки кода.