MCP-сервер для решения задач в рабочем пространстве через Z.AI Coding Plan (solve_in_workspace, apply_changes)
Project description
ZAI Coding Gateway
MCP-сервер для решения задач в рабочем пространстве через Z.AI Coding Plan endpoint (api.z.ai/api/coding/paas/v4). Предоставляет инструменты solve_in_workspace, apply_changes, confirm_session_done для любых MCP-клиентов (Cursor, Anigravity, Claude Code, Cline и др.). Один и тот же сервер можно добавить в любую IDE — поведение не зависит от того, откуда вы его запускаете.
Требования
- Python 3.11+
- Ключ Z.AI и подписка Coding Plan
Установка
pip install -e .
# или с тестами:
pip install -e ".[dev]"
Настройка
Все настройки задаются переменными окружения. Ключ и модель не хранятся в коде — их задаёт пользователь в настройках MCP-клиента (например, в Cursor в mcp.json в секции env).
| Переменная | Назначение |
|---|---|
ZAI_API_KEY |
Ключ Z.AI (обязательный) |
ZAI_WORK_MODEL |
Необязательно. Модель для генерации кода, рефакторинга и основного цикла сессии. По умолчанию glm-4.7 (контекст 200K). |
ZAI_FAST_MODEL |
Необязательно. Модель для консолидации и суммаризации внутри сессии. По умолчанию glm-4.5-air (контекст 128K, быстрая). |
ZAI_BASE_URL |
По умолчанию https://api.z.ai/api/coding/paas/v4 |
ZAI_PROJECT_ROOT |
Корень открытого проекта для solve_in_workspace (пути file_paths и сессия). Чтобы из любой IDE всё работало «как по маслу», задайте эту переменную в конфиге MCP так, чтобы она указывала на папку открытого в IDE проекта. Многие IDE при старте MCP подставляют в env переменные вроде ${workspaceFolder} / ${projectPath} — тогда один конфиг подходит для Cursor, Anigravity и др. Без неё сервер пробует MCP roots/list (многие клиенты пока не поддерживают) или поиск вверх от cwd по маркерам; при неудаче — явная ошибка с просьбой задать ZAI_PROJECT_ROOT. |
ZAI_SESSION_LOGS_DIR |
Опционально. Каталог для логов сессий solve_in_workspace. По умолчанию логи пишутся в проект gateway (для разработчиков). Если нужно получать логи в свой проект — укажите абсолютный путь к каталогу (например ${workspaceFolder}/workspace_sessions_logs). |
Работа из любой IDE
MCP запускается вашей IDE при открытии проекта. Чтобы пути file_paths/file_path и сессия solve_in_workspace относились к открытому проекту (а не к случайному cwd), в настройках MCP укажите ZAI_PROJECT_ROOT в env. Тогда не важно, в какой IDE вы работаете (Cursor, Anigravity, другая):
- Если IDE при запуске MCP подставляет в env путь к открытому проекту (например через переменную вроде
${workspaceFolder},${workspaceRoot},%projectPath%и т.п.) — используйте её дляZAI_PROJECT_ROOT. Один и тот же конфиг будет работать во всех проектах и во всех таких IDE. - Если такой подстановки нет — укажите в конфиге абсолютный путь к корню проекта; для другого проекта можно завести отдельный конфиг или переопределить env в настройках проекта/workspace.
Идея: корень проекта задаёт тот, кто запускает MCP (IDE), через env — тогда серверу не нужно угадывать, и поведение едино во всех средах.
Подключение в Cursor
Вариант: пакет с PyPI (как shadcn — только конфиг)
Установка не нужна: Cursor при старте вызовет pipx run zai-coding-gateway, пакет подтянется с PyPI. Но Cursor не видит PATH из терминала, поэтому в command нужен полный путь к pipx.
- Установите pipx, если ещё нет: pypa.github.io/pipx (
brew install pipxна macOS,pip install pipxи т.п.). - Запустите скрипт — он найдёт pipx на вашей платформе и выведет готовый фрагмент для
mcp.json:python scripts/print_mcp_config.pyИли из репозитория пакета (после клонирования):python scripts/print_mcp_config.py. - Скопируйте вывод и вставьте в
~/.cursor/mcp.jsonв объектmcpServers(если файла нет — создайте с обёрткой{"mcpServers": { ... } }). - Вставьте в
envсвойZAI_API_KEYи при необходимостиZAI_PROJECT_ROOT. - Перезапустите MCP в Cursor (или перезапустите Cursor).
Скрипт print_mcp_config.py поддерживает macOS, Linux и Windows и подставляет типичные пути к pipx. Если репозитория нет (только пакет с PyPI), подставьте путь к pipx вручную — типичные расположения:
| Платформа | Типичный путь к pipx |
|---|---|
| macOS (Homebrew) | /opt/homebrew/bin/pipx или /usr/local/bin/pipx |
| Linux | $HOME/.local/bin/pipx или /usr/bin/pipx |
| Windows | %USERPROFILE%\.local\bin\pipx.exe или через where pipx в cmd |
В терминале: which pipx (macOS/Linux) или where pipx (Windows) — выведет путь для вашей системы.
Вариант: локальная разработка (pip install -e .)
- В проекте:
pip install -e . - В
mcp.jsonукажите полный путь к тому же Python, в окружении которого установлен пакет, например:"command": "/путь/к/.venv/bin/python", "args": ["-m", "zai_coding_gateway.main", "--stdio"],
- В
envзадайтеZAI_API_KEYи при необходимостиZAI_PROJECT_ROOT.
Модели (work / fast)
- Для основного цикла сессии в solve_in_workspace (need_more/done/use_tools) используется work-модель (по умолчанию glm-4.7, контекст 200K).
- Для внутренней консолидации и суммаризации истории в solve_in_workspace используется fast-модель (по умолчанию glm-4.5-air, контекст 128K).
- Выбор модели в вызовах MCP недоступен; при необходимости заменить дефолты задайте ZAI_WORK_MODEL и/или ZAI_FAST_MODEL в env.
Запуск
Сервер запускается MCP-клиентом по stdio (Cursor сам стартует процесс по mcp.json). Ручной запуск для отладки:
export ZAI_API_KEY="ваш-ключ"
python -m zai_coding_gateway.main --stdio
Инструменты
Порядок использования: solve_in_workspace → apply_changes → при необходимости confirm_session_done.
solve_in_workspace
Точка входа: запускает сессию рабочего пространства. Модель получает полный контекст, может запрашивать файлы (need_more), использовать list_dir/grep/glob/read, вернуть отчёт и suggested_changes (в т.ч. предложения по новым файлам). Создание файлов в проекте — только через apply_changes после утверждения архитектором.
Вход: instruction (строка — формулировка задачи), todos (список строк), file_paths (список путей относительно корня проекта, обязательный начальный контекст), max_steps (число, по умолчанию 10).
Выход: session_id (строка), report (строка), suggested_changes (список объектов: каждый с полем path и полем diff или content), files_used (список путей).
Лимит: 5 раундов инструментов за сессию. Логи: workspace_sessions_logs/<session_id>.log или каталог из ZAI_SESSION_LOGS_DIR.
apply_changes
Применяет утверждённые изменения к проекту. Вызывать после solve_in_workspace, когда принято решение по suggested_changes.
Вход: session_id (из ответа solve_in_workspace), changes (список объектов: каждый {path: путь к файлу, content: новое содержимое} или {path, diff: unified diff или полный текст}), confirm_after (bool, по умолчанию True — после применения очистить сессию). Пути должны входить в сессию.
Выход: session_id, applied (список применённых путей), cleaned (bool).
confirm_session_done
Очищает темп-каталог сессии после принятия решения (после apply_changes или при отказе от изменений).
Вход: session_id. Выход: session_id, cleaned (true).
Режим «архитектор + разработчик»
Один поток работы: сформулируйте задачу в instruction и todos, укажите file_paths (начальный контекст — существующие файлы). Запустите solve_in_workspace — модель получит контекст, при необходимости запросит ещё файлы или использует list_dir/grep/glob/read, затем вернёт отчёт и suggested_changes (в т.ч. предложения по новым файлам). Все изменения применяются только после вашего утверждения через apply_changes (или откажитесь и при необходимости вызовите confirm_session_done). Точечное чтение и запись файлов архитектор выполняет средствами IDE.
Тесты
pytest tests/ -v
Тесты используют мок Z.AI API (реальный ключ не нужен). E2E-тесты с реальным API помечены маркером e2e и выполняются только при заданном ZAI_API_KEY:
ZAI_API_KEY=ваш-ключ pytest tests/ -v -m e2e
# или
ZAI_API_KEY=ваш-ключ ./scripts/e2e_smoke.sh
Боевой E2E (tests/test_e2e_battle.py): тестовый проект в tests/e2e_fixtures/battle_project/. Тесты проверяют доступ к файлам проекта и solve_in_workspace (структура ответа). Запуск с ключом: ZAI_API_KEY=... pytest tests/test_e2e_battle.py -v -m e2e.
В CI по умолчанию e2e не запускают.
Как проверить, что списывается Coding Plan (а не общий биллинг)
-
При старте MCP в stderr выводится строка вида:
zai-coding-gateway: endpoint = https://api.z.ai/api/coding/paas/v4 (Coding Plan)
Если в скобках Coding Plan — запросы идут на подписку Coding Plan. Если общий paas (не Coding Plan) — используется общий endpoint (без/coding/в пути), и списание может идти с общего биллинга. -
По умолчанию (без
ZAI_BASE_URL) используетсяhttps://api.z.ai/api/coding/paas/v4— это Coding Plan. Не задавайтеZAI_BASE_URL, если хотите использовать только Coding Plan. -
Проверка в кабинете Z.AI — в использовании/биллинге посмотрите, по какому продукту идёт списание (Coding Plan vs общий API).
-
Кто решает, откуда списывать — итоговая привязка к Coding Plan или к общему биллингу определяется политикой Z.AI (как правило, по вызываемому endpoint и/или по привязке API-ключа к продукту). Мы со своей стороны гарантируем только то, что запросы уходят на выбранный URL (по умолчанию Coding Plan); ключ вы задаёте в конфиге MCP. При сомнениях — уточните в документации или поддержке Z.AI.
Диагностика 401 (token expired or incorrect)
Если E2E или вызовы из Cursor возвращают 401 - token expired or incorrect:
- Формат ключа — Z.AI ожидает ключ вида
{id}.{secret}и заголовокAuthorization: Bearer <ключ>. Сервер уже отправляет ключ в этом формате; проверьте, что вZAI_API_KEYнет лишних пробелов и кавычек. - Подписка Coding Plan — endpoint
api.z.ai/api/coding/paas/v4доступен только при активной подписке GLM Coding Plan. Убедитесь, что ключ создан для аккаунта с этой подпиской. - Проверка ключа на общем endpoint — временно задайте
ZAI_BASE_URL=https://api.z.ai/api/paas/v4и запустите E2E. Если с общим endpoint запрос проходит, а с Coding — 401, значит ключ или аккаунт не привязаны к Coding Plan. - Перевыпуск ключа — в управлении API-ключами проверьте, что ключ активен; при необходимости создайте новый и подставьте в
ZAI_API_KEY.
Транспорт и развёртывание
Текущий режим — stdio (клиент запускает процесс). Развёртывание на удалённом сервере (StreamableHTTP) планируется в следующей итерации.
Лицензия
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zai_coding_gateway-0.1.1.tar.gz.
File metadata
- Download URL: zai_coding_gateway-0.1.1.tar.gz
- Upload date:
- Size: 28.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a34b40da4b35b9b8d9187e2f37f66cc872edd287ba6ddc1da8afa0f5c41c9b6
|
|
| MD5 |
2a24e85e2da2ca248c2f046da6221974
|
|
| BLAKE2b-256 |
0f17109086f5d9a4fe10345da7671abc30cdbd5562f084792fa3733faae50d16
|
File details
Details for the file zai_coding_gateway-0.1.1-py3-none-any.whl.
File metadata
- Download URL: zai_coding_gateway-0.1.1-py3-none-any.whl
- Upload date:
- Size: 26.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa475e30c24f1d936d74f96d00e38c8a5b374c9d5538b6237e3769546d691155
|
|
| MD5 |
38df1a7d1e7dd16e4624febfb51ba4a3
|
|
| BLAKE2b-256 |
cb02f5ddf935c095bc6226f946c291c360b6afcc0dd9129c046369a0bbee9d1b
|