Skip to main content
Glama

ai-consensus-mcp

Минималистичный stdio-сервер Model Context Protocol, который предоставляет протокол Consensus Validation Protocol в виде единого инструмента consensus. Дайте Claude Code, Cursor, Windsurf — или любому другому MCP-хосту — возможность организовать настоящий многомодельный круглый стол.

npm license

Тонкая обертка над ai-consensus-core. Один инструмент, один файл конфигурации, никакой лишней суеты.

Что вы получаете

  • Один MCP-инструмент: consensus. Укажите список моделей и персон, чтобы запустить многораундовые дебаты.

  • Любой OpenAI-совместимый провайдер. xAI Grok, Anthropic (через OpenAI-совместимый эндпоинт), OpenAI, Groq, Together, Fireworks или ваш собственный шлюз. Один адаптер, настраиваемый для каждого участника.

  • Прогресс в реальном времени. Каждое структурированное событие движка пересылается как уведомление о прогрессе MCP — хосты отображают статус раунда, участника, разногласий и оценки в реальном времени.

  • Минимум зависимостей. @modelcontextprotocol/sdk, zod, ai-consensus-core. Парсинг SSE реализован через нативный fetch — никаких SDK провайдеров.

Related MCP server: Claude Code AI Collaboration MCP Server

Протокол

Информацию о самом протоколе — раундах, фазах, промптах, оценках — см. в диаграмме протокола ai-consensus-core. Этот README описывает только интерфейс сервера.

Установка

Через npm:

# Globally, for use as a binary
npm install -g ai-consensus-mcp

# Or as a project dependency
npm install ai-consensus-mcp

Или клонируйте и запустите:

git clone https://github.com/entropyvortex/ai-consensus-mcp.git
cd ai-consensus-mcp
npm install
npm run build

Настройка

Скопируйте пример и отредактируйте его:

cp consensus.config.example.json ./consensus.config.json

Минимальная структура:

{
  "providers": {
    "xai": {
      "baseUrl": "https://api.x.ai/v1",
      "apiKeyEnv": "GROK_API_KEY"
    },
    "anthropic": {
      "baseUrl": "https://api.anthropic.com/v1",
      "apiKeyEnv": "ANTHROPIC_API_KEY"
    }
  },
  "participants": [
    { "id": "grok",   "provider": "xai",       "modelId": "grok-4",            "personaId": "pessimist" },
    { "id": "domain", "provider": "anthropic", "modelId": "claude-sonnet-4-6", "personaId": "domain-expert" },
    { "id": "devil",  "provider": "xai",       "modelId": "grok-4",            "personaId": "devils-advocate" }
  ],
  "judge": {
    "provider": "xai",
    "modelId": "grok-4"
  }
}

Справочник конфигурации

providers.<id>.baseUrl         string   OpenAI-compatible base URL. No trailing /chat/completions.
providers.<id>.apiKeyEnv       string   Name of the env var holding the API key.
providers.<id>.extraHeaders    object?  Static headers sent on every request (rarely needed).

participants[].id              string   Stable participant id (appears in events + progress).
participants[].provider        string   Key into providers.
participants[].modelId         string   Opaque model id the provider accepts.
participants[].personaId       enum     One of: pessimist, first-principles, vc-specialist,
                                        scientific-skeptic, optimistic-futurist,
                                        devils-advocate, domain-expert.
participants[].label           string?  Optional display label.

judge.provider                 string?  Key into providers.
judge.modelId                  string?  Opaque judge model id.
judge.temperature              number?  Defaults to 0.3.
judge.maxOutputTokens          number?  Defaults to 1500.

defaults.maxRounds             int?     1–10, defaults 4.
defaults.earlyStop             bool?    Defaults true.
defaults.convergenceDelta      number?  Defaults 3.
defaults.disagreementThreshold number?  Defaults 20.
defaults.blindFirstRound       bool?    Defaults true.
defaults.randomizeOrder        bool?    Defaults true.
defaults.participantTemperature number? Defaults 0.7.
defaults.maxOutputTokens       int?     Defaults 1500.
defaults.useJudge              bool?    Defaults true if `judge` is declared, else false.

Каждое поле, отсутствующее в этом списке, отклоняется загрузчиком конфигурации — опечатки приводят к явной ошибке, а не к молчаливому игнорированию.

Автономный запуск

export GROK_API_KEY=xai-...
export ANTHROPIC_API_KEY=sk-ant-...

ai-consensus-mcp --config ./consensus.config.json

Сервер использует JSON-RPC через stdio. Строка готовности, например:

ai-consensus-mcp ready — 3 participant(s) from 2 provider(s), judge=grok-4 (config: /abs/consensus.config.json)

записывается в stderr при запуске; stdout зарезервирован для потока протокола MCP.

Регистрация в MCP-хосте

Claude Desktop

Отредактируйте ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) или эквивалентный файл в Windows:

{
  "mcpServers": {
    "consensus": {
      "command": "ai-consensus-mcp",
      "args": ["--config", "/absolute/path/to/consensus.config.json"],
      "env": {
        "GROK_API_KEY": "xai-...",
        "ANTHROPIC_API_KEY": "sk-ant-..."
      }
    }
  }
}

(Если вы не устанавливали пакет глобально, замените "command": "ai-consensus-mcp" на "command": "node" и укажите в args путь к /path/to/ai-consensus-mcp/dist/index.js.)

Перезапустите Claude Desktop. Вы должны увидеть доступный инструмент consensus.

Claude Code

claude mcp add consensus \
  --scope user \
  -- ai-consensus-mcp --config /absolute/path/to/consensus.config.json

Или отредактируйте ~/.claude.json напрямую с той же структурой command / args / env.

Cursor, Windsurf и другие хосты

Укажите им ai-consensus-mcp --config <path>/consensus.config.json с соответствующими API-ключами провайдеров в переменных окружения. Только транспорт stdio.

Инструмент consensus

Входные данные

{
  "prompt": "Should an early-stage startup adopt microservices from day one?",
  "maxRounds": 4,            // optional, 1–10
  "participantIds": ["grok", "domain"],  // optional — subset of configured participants
  "earlyStop": true,         // optional
  "judge": true,             // optional — defaults to config.defaults.useJudge
  "blindFirstRound": true,   // optional
  "randomizeOrder": true,    // optional
  "convergenceDelta": 3,     // optional
  "disagreementThreshold": 20, // optional
  "participantTemperature": 0.7, // optional
  "maxOutputTokens": 1500,   // optional
  "randomSeed": 42           // optional — deterministic round-order shuffle
}

Обязателен только prompt. Все остальное берется из defaults в конфигурации, а затем из настроек по умолчанию самого движка.

Выходные данные

Два артефакта при каждом успешном вызове:

  1. content[0].text — читаемое человеком резюме в формате markdown:

    • Итоговая оценка, длительность, причина остановки

    • Таблица оценок по раундам

    • Ответы финального раунда, помеченные персоной + моделью

    • Синтез судьи (если judge: true)

  2. structuredContent — полный объект ConsensusResult в формате JSON для программной обработки.

Уведомления о прогрессе

Каждое структурированное событие движка пересылается как сообщение MCP notifications/progress. События потоковой передачи на уровне токенов намеренно отбрасываются — они бы переполнили канал.

Событие движка

Пример сообщения о прогрессе

roundStart

Round 2/4 — Counterarguments (sequential) starting

participantStart

grok (grok-4) thinking…

participantComplete

grok done — confidence=72 (4132ms)

confidenceUpdate

running avg round 2: 74.5 (last: grok=72)

disagreementDetected

⚠ disagreement: Risk Analyst vs Optimistic Futurist (Δ=35)

roundComplete

Round 2 complete — score=71, avg=74.5, σ=7.0, disagreements=1

earlyStop

✓ Early stop at round 3: Consensus score delta 2.0 … is at or below …

synthesisStart

Judge synthesis starting (grok-4)…

synthesisComplete

Judge synthesis complete (confidence=84)

finalResult

Consensus complete — finalScore=76, rounds=3, stopReason=converged

progress увеличивается монотонно при roundComplete и synthesisComplete; total равен maxRounds + (judge ? 1 : 0).

Ошибки

  • Ошибки загрузки конфигурации являются фатальными при запуске и выводятся в stderr с указанием пути к ошибочному полю.

  • Ошибки ввода инструмента возвращают { isError: true, content: [{ type: "text", text: "…" }] } — хост видит их, но сервер продолжает работу.

  • Ошибки провайдера (HTTP не 2xx, пустые потоки) записываются в поле response.error для конкретного участника, и выполнение продолжается с оставшимися участниками. Ошибки видны как в потоке прогресса, так и в итоговом структурированном результате.

  • Отмена. Когда хост отменяет вызов инструмента, AbortSignal распространяется на каждый активный fetch, и движок возвращает ConsensusResult со статусом stopReason: "aborted".

Ограничения и нецелевые задачи

  • Нет персистентности. Каждый вызов инструмента — это новый запуск. Если вам нужна история, записывайте structuredContent на стороне хоста.

  • Нет HTTP-транспорта. Только stdio. Для HTTP/SSE используйте ai-consensus-core напрямую.

  • Нет контроля лимитов токенов. maxOutputTokens носит рекомендательный характер для каждого вызова; настраивайте оповещения об использовании на дашбордах ваших провайдеров.

  • Нет планировщика нескольких запусков. Один запуск на вызов, последовательно, если хост ставит их в очередь.

Если что-то из этого станет для вас критически важным, основная библиотека — лучшее место для расширения; этот сервер намеренно сделан крошечным.

Разработка

git clone https://github.com/entropyvortex/ai-consensus-mcp.git
cd ai-consensus-mcp
npm install
npm run test        # vitest — config loader + MCP handshake integration
npm run build
npm start -- --config ./consensus.config.json

Философия

Основная библиотека должна работать везде — Next.js, CLI, worker, Durable Object, другой MCP-сервер. Именно поэтому она не знает, что такое LLM-провайдер.

Этот пакет — то самое «везде», которое нужно большинству в первую очередь: stdio MCP-сервер, который легко встраивается в Claude Code, Cursor, Windsurf или любой хост, поддерживающий протокол. Он намеренно мал — загружает конфигурацию, пересылает события и ничего больше. Если вы перерастете его, ядро всегда под рукой.

См. также

  • ai-consensus-core — базовая библиотека. Используйте её напрямую, если вам нужен HTTP-транспорт, пользовательские планировщики или более глубокая интеграция.

Лицензия

MIT


Часть стека entropyvortex — практичный, честный ИИ с открытым исходным кодом от Marcelo Ceccon.

Сделано с ❤️ в Бразилии.

Лицензия MIT • Создано для использования.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

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/entropyvortex/ai-consensus-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server