qwen-cli-mcp
qwen-cli-mcp
MCP-сервер, который делегирует задачи кодирования вашему локально установленному Qwen Code CLI.
Он оборачивает настоящий бинарник qwen вместо того, чтобы включать собственную копию агента, поэтому каждый вызов
наследует вашу аутентификацию qwen, модели, MCP-серверы и настройки. Ничего из вашего стека моделей здесь не дублируется,
и сервер не расходится с реальностью, когда вы обновляете qwen.
Родственный проект pi-cli-mcp — та же архитектура, те же принципы, за рулём qwen. Авторитетный дизайн-документ — SPEC.md.
Используйте его, когда ваш основной агент (Claude Code, Cursor, сам pi, любой MCP-клиент) должен передать работу qwen: второе мнение от другого семейства моделей, расследование, которое вы хотите держать вне основного контекстного окна, или параллельная работа.
Установка
npx -y qwen-cli-mcp # no install
npm install -g qwen-cli-mcp # or globalТребуется Node ≥ 22 и рабочий qwen в PATH (npm i -g @qwen-code/qwen-code).
Claude Code
claude mcp add-json qwen -s user '{
"type": "stdio",
"command": "npx",
"args": ["-y", "qwen-cli-mcp"],
"timeout": 3600000
}'
claude mcp list | grep '^qwen:' # expect: ✔ ConnectedЩедрый timeout важен: реальная делегированная задача может выполняться минутами.
Любой другой MCP-клиент
{
"mcpServers": {
"qwen": { "command": "npx", "args": ["-y", "qwen-cli-mcp"] }
}
}Держите имя сервера коротким (qwen): оно становится частью имён инструментов, которые видит ваша модель.
⚠️ Режим одобрения по умолчанию —
yolo. Делегирование полезно только тогда, когда делегат может действовать, поэтому этот сервер запускает qwen с полным одобрением инструментов по умолчанию — внутриcwd, от вашего имени. Сузьте его с помощьюQWEN_MCP_APPROVAL_MODE,approval_modeна каждый вызов илиallowed_tools. Для работы только с анализом передавайте allowlist-ы видаallowed_tools: "read,grep,ls".
Инструменты
Инструмент | Назначение |
| Запустить сессию. Возвращает |
| Продолжить завершённую или прерванную сессию — включая убитую по таймауту. |
| Перечислить модели, которые qwen реально может достичь прямо сейчас (живой пробник через control plane). |
| Доставить сообщение в выполняющийся прямо сейчас ход ( |
| Перечислить ходы, выполняющиеся прямо сейчас, до которых может дотянуться |
| Перечислить известные сессии, новые сверху, с их рабочими каталогами. |
qwen
Аргумент | Примечания |
| Обязателен. Должен быть самодостаточным — qwen не видит вашу беседу. |
| Абсолютный путь; по умолчанию — cwd этого сервера. |
| Значение |
|
|
| Разрешённый список инструментов через запятую, передаётся как |
|
|
| Добавляется к системному промпту qwen для этого запуска. |
|
|
| Время выполнения для этого запуска. Запуск, убитый по дедлайну, остаётся возобновляемым через |
Что возвращается
Только финальный результат qwen плюс агрегированная статистика — никогда не транскрипт, аргументы инструментов или сырой stdout:
[session: 0927adc5-a840-4b68-93ca-5ca344c9fafb]
Refactored retry() in src/http.rs; all 12 tests pass.
---
qwen: qwen3-coder-plus · 6 turns · 5 tool calls: bash×2, read×2, edit · 18k in / 310 out · 41sОтвет — это конверт result, который qwen выдаёт в конце хода — никаких догадок по выбору ответа.
Конверт ошибки (error_max_turns, error_during_execution) приводит к провалу вызова, сохраняя всё, что qwen успел сказать,
так что работа остаётся возобновляемой. Поток, завершившийся без конверта результата, сообщается как сломанный,
никогда не подменяется сырым выводом.
Сессии
qwen возвращает идентификатор сессии; qwen_reply возобновляет её с --resume. Беседа живёт в
собственном хранилище сессий qwen, поэтому продолжения работают после перезапуска этого сервера —
карта «сессия → каталог» сохраняется в ~/.local/state/qwen-mcp/sessions.json.
Одновременные ответы на одну сессию сериализуются в рамках одного серверного процесса: два процесса qwen, пишущих в один файл сессии, испортили бы его. Предостережение о межпроцессном взаимодействии: если вы запускаете два MCP-клиента против двух серверных процессов и оба отвечают на один и тот же идентификатор сессии одновременно, ничто их не сериализует. На практике сессией владеет один клиент; для жёсткой гарантии держите один серверный процесс.
Транспорты
|
| |
команда |
|
|
процесс | остаётся живым, говорит на control plane через stdin | один процесс на ход, завершается по окончании |
доставка в середине |
| невозможно: qwen ничего не читает во время работы |
дедлайн / отмена | сначала собственный | SIGTERM, затем SIGKILL |
stream — дефолт, потому что он надмножество: тот же поток сообщений, плюс выполняющийся ход
остаётся доступным, а прерванный завершается в протоколе, сохраняя хвост потока.
Выбирайте на каждый вызов через transport или задайте дефолт через QWEN_MCP_TRANSPORT=print.
Этот сервер никогда ничего не отправляет в qwen по своей инициативе. Ни автоматического завершения перед дедлайном,
ни внедрённых инструкций: qwen_send срабатывает только когда вызывающий вызывает его.
Окружение
Переменная | Значение по умолчанию | Смысл |
|
| Путь к бинарнику qwen. |
|
| Режим одобрения по умолчанию для каждого вызова. См. предупреждение выше. |
| не задано | Модель по умолчанию для каждого вызова. |
|
| Транспорт по умолчанию: |
|
| Время выполнения по умолчанию; |
|
| Потолок того, что может запросить |
|
| Одновременные процессы qwen. |
| не задано | Ограничение на ответ. Не задано — значит без усечения. |
|
| Хвост stderr, включаемый в ответ. |
| не задано |
|
|
| Защита буфера чтения от вышедшего из-под контроля потока. |
|
| Самая длинная строка сообщения от qwen, после которой она отбрасывается. |
|
| Самый длинный кадр JSON-RPC от клиента. |
|
| Запомненные сессии, прежде чем самая старая будет отброшена. |
|
| Период ожидания SIGTERM → SIGKILL. |
|
| Сколько времени получает |
|
| Таймаут рукопожатия инициализации (только stream). |
|
| Бюджет на весь запуск пробы |
|
| Карта «сессия → cwd». |
| не задано | Префикс команды, например, обёртка песочницы вокруг qwen. |
Дизайн
Процесс на вызов. Собственные файлы сессий qwen — источник истины, именно поэтому продолжения переживают перезапуск этого сервера.
Контракт на проводе — собственный протокол stream-json qwen, говорим напрямую — сообщения с разделителями строк в stdout, управляющие запросы и пользовательские ходы в stdin. Его формы заимствованы из
@qwen-code/sdkчерезimport type, поэтому изменение в апстриме ломает сборку, а не сервер. Ноль зависимостей во время выполнения.Закрытие с ошибкой на всё, что приходит от qwen. Неизвестный подтип результата, неудачное рукопожатие, строка, которая не парсится — сообщается как есть, никогда не нормализуется в успех.
Ни один процесс не переживает свой запрос. Таймауты, отмены и завершение работы вычищают всё дерево процессов qwen; ничего не остаётся ни на одном пути.
Разработка
TypeScript (нативный tsc), Biome, Vitest. Тесты гоняют реальный бинарник сервера через stdio против
фикстуры, говорящей на протоколе qwen; живые тесты против установленного qwen — опциональны.
npm run hooks # once per clone: git hooks from .githooks/
npm run build # tsc -> dist/
npm test # unit + type tests, no API access, no tokens
npm run test:live # 4 live tests against the real qwen binary (spends tokens)
npm run check # format + types + tests
npm run fix # biome --writeЛицензия
MIT
This server cannot be installed
Maintenance
Related MCP Connectors
MCP server for generating rough-draft project plans from natural-language prompts.
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/minmax/qwen-cli-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server