Skip to main content

Local MCP server for the LLM Council workflow

Project description

LLM Council MCP (lokal, ohne Docker)

Ein schlanker, lokaler MCP-Server für deinen Mac, der den 3-Stufen-Workflow von llm-council-plus nachbildet — mit den exakten Original-Prompts, direkt gegen OpenRouter, ohne Docker/NAS-Abhängigkeit. Nutzbar aus Claude Code, Codex CLI und Antigravity über MCP.

Was das ist (und was nicht)

council_core.py ist eine eigenständige Python-Portierung der 3 Stufen aus backend/council.py und backend/runtime_settings.py des echten llm-council-plus-Repos:

  1. Stufe 1 — jedes Council-Modell beantwortet deine Frage unabhängig, parallel.
  2. Stufe 2 — jedes Modell bewertet/rankt die anonymisierten Antworten der anderen ("Response A", "Response B", ...), damit kein Modell seine eigene Antwort erkennen und bevorzugen kann.
  3. Stufe 3 — ein Chairman-Modell liest Stufe 1 + 2 und schreibt eine finale, synthetisierte Antwort. Schlägt der Chairman fehl, probiert der Code automatisch die anderen Council-Modelle als Ersatz-Chairman durch (Fallback-Logik, 1:1 aus dem Original übernommen).

Die Prompt-Templates für alle 3 Stufen sind wortwörtlich aus backend/runtime_settings.py kopiert (siehe STAGE1_PROMPT_TEMPLATE, STAGE2_PROMPT_TEMPLATE, STAGE3_PROMPT_TEMPLATE in council_core.py), ebenso die Default-Temperaturen (Stufe 1: 0.5, Stufe 2: 0.3, Stufe 3: 0.4) und das OpenRouter-Aufruf-Schema (Retry mit Backoff bei 429).

Bewusst weggelassen (für ein schlankes, persönliches Tool nicht nötig):

  • TOON-Encoding der Stufe-1/2-Daten (im Original nur eine Token-Effizienz-Optimierung, ändert das Ergebnis nicht)
  • Web-Suche / Tool-Ergebnisse in Stufe 1
  • Editierbare Prompts/Temperaturen über die UI (siehe unten) — die bleiben bewusst Konstanten in council_core.py, um die geprüfte Prompt-Treue zum Original nicht versehentlich zu gefährden. Wer sie ändern will, editiert die Datei direkt.
  • Konversationsverlauf / Multi-Turn-Memory

Der Server hat keinen eigenen Dateizugriff. Das ist Absicht: das aufrufende Tool (Claude Code, Codex, Antigravity) hat bereits Zugriff auf deinen lokalen Code und übergibt relevanten Code/Kontext direkt als Parameter (code_context) beim Tool-Aufruf — kein separater "Scout-Agent", kein Ordner-Mounting nötig.

Setup auf dem MacBook

cd llm-council-mcp
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

cp .env.example .env
# Öffne .env in einem Editor und trage deinen echten OPENROUTER_API_KEY ein.
# Nie den Key in einen Chat einfügen - nur lokal in die .env-Datei.

Schneller Funktionstest ohne MCP-Client (optional):

python3 -c "
import asyncio, council_core
async def main():
    r = await council_core.run_full_council('Sage in einem Satz: 2+2?')
    print(r['stage3']['response'])
asyncio.run(main())
"

Setup-UI (empfohlen)

Statt .env von Hand zu editieren und die Registrierungsbefehle unten manuell auszuführen, gibt es eine kleine lokale Weboberfläche dafür:

python3 setup_ui.py

Öffnet automatisch http://127.0.0.1:5151 im Browser. Dort kannst du:

  • OpenRouter-Key, Council-Modelle und Chairman-Modell setzen (schreibt in .env)
  • pro Tool (Claude Code, Codex, Antigravity) per Knopfdruck installieren/entfernen, mit Status-Anzeige, ob aktuell installiert

Läuft nur lokal (127.0.0.1, kein Netzwerkzugriff von außen) und nur solange das Terminal offen ist — kein Hintergrunddienst. Mit Strg+C beenden, wenn fertig. Der eigentliche ask_council-MCP-Server (server.py) ist davon komplett unabhängig und läuft separat on-demand, wenn Claude Code/Codex/ Antigravity ihn brauchen.

Wie die Buttons technisch funktionieren (siehe installer.py), pro Tool unterschiedlich, bewusst so gewählt:

  • Claude Code: über die offizielle claude mcp add/remove-CLI — die stabile, dokumentierte Schnittstelle. Setup-UI ruft diese Befehle für dich auf.
  • Codex: direktes Schreiben in ~/.codex/config.toml (Format laut aktueller offizieller Doku verifiziert). Achtung: Beim Speichern wird die gesamte Datei neu geschrieben — eigene Kommentare in dieser Datei gehen dabei verloren, andere [mcp_servers.*]-Einträge bleiben aber erhalten.
  • Antigravity: direktes Schreiben in mcp_config.json, da kein offizielles CLI dafür existiert. Pfad ist im UI editierbar, falls der Standardpfad bei dir abweicht (siehe Unsicherheiten unten).

Die manuellen Befehle unten funktionieren weiterhin identisch — die UI ist nur eine Komfortschicht darüber, kein zweiter Mechanismus.

Registrierung in deinen 3 Tools (manuell, alternativ zur Setup-UI)

Bei allen drei brauchst du den absoluten Pfad zu server.py und idealerweise zum python3 aus deinem venv (which python3 nach source venv/bin/activate).

Claude Code

claude mcp add llm-council --scope user -- /absoluter/pfad/zu/venv/bin/python3 /absoluter/pfad/zu/llm-council-mcp/server.py

--scope user macht den Server in allen Projekten verfügbar (nicht nur im aktuellen). Mit claude mcp list prüfst du, ob er registriert ist.

Codex CLI

Codex unterstützt MCP-Server seit einiger Zeit offiziell (geprüft gegen die aktuelle Doku auf developers.openai.com/codex/mcp). Zwei Wege, gleiches Ergebnis:

Per CLI:

codex mcp add llm-council -- /absoluter/pfad/zu/venv/bin/python3 /absoluter/pfad/zu/llm-council-mcp/server.py

Oder manuell in ~/.codex/config.toml:

[mcp_servers.llm-council]
command = "/absoluter/pfad/zu/venv/bin/python3"
args = ["/absoluter/pfad/zu/llm-council-mcp/server.py"]

Mit /mcp in der Codex-TUI siehst du die aktiven Server.

Antigravity

Antigravity legt MCP-Server in einer mcp_config.json ab (laut aktueller Doku/Community-Quellen typischerweise unter ~/.gemini/antigravity/mcp_config.json, erreichbar auch über Settings → Customizations → MCP Servers in der App). Unsicherheit: Antigravity ist noch jung und der genaue Pfad kann sich je Version/Update unterscheiden — schau im Zweifel direkt im Settings-Menü nach dem Punkt "MCP Servers" / "Customizations", statt blind dem Pfad zu folgen.

{
  "mcpServers": {
    "llm-council": {
      "command": "/absoluter/pfad/zu/venv/bin/python3",
      "args": ["/absoluter/pfad/zu/llm-council-mcp/server.py"]
    }
  }
}

Nutzung

Sobald registriert, kannst du in jedem der drei Tools sinngemäß sagen:

Frag den Council: Sollten wir für den Cache Redis oder eine In-Memory-Lösung nehmen? Hier ist der relevante Code: [...]

Das Tool ruft ask_council mit question und code_context auf. Die Antwort ist ein Markdown-Report: zuerst das Chairman-Fazit, danach die einzelnen Stufe-1-Antworten zur Transparenz, danach (falls vorhanden) die Stufe-2-Rankings.

Ein Aufruf macht mehrere parallele + sequenzielle LLM-Calls und kann gut über eine Minute dauern — bewusst gedacht für wichtige Einzel- Entscheidungen, nicht für ständige Nutzung.

Bekannte Unsicherheiten / was du selbst prüfen solltest

  • Die exakten OpenRouter-Modell-IDs (openai/gpt-5.1, google/gemini-3-pro-preview, anthropic/claude-sonnet-4.5) stammen aus den Defaults von llm-council-plus zum Zeitpunkt der Recherche. Falls OpenRouter eine ID umbenennt oder ein Modell deprecated, schlägt der jeweilige Call mit einer Fehlermeldung fehl (wird im Report angezeigt, blockiert aber nicht die anderen Modelle) — einfach COUNCIL_MODELS in .env anpassen.
  • Die codex mcp add-Syntax wurde gegen die aktuelle Doku geprüft; sollte sie sich geändert haben, hilft codex mcp --help.
  • Antigravitys Config-Pfad/-Format wurde über Community-Quellen verifiziert, nicht über eine offizielle, vollständig geladene Doku-Seite (die Seite ist clientseitig gerendert und lieferte beim Abruf keinen Textinhalt) — im Zweifel das Settings-Menü in der App selbst prüfen.
  • Die Setup-UI schreibt config.toml (Codex) und mcp_config.json (Antigravity) jeweils komplett neu. Bestehende Einträge anderer MCP-Server bleiben erhalten, aber eigene Kommentare/Formatierung in config.toml gehen beim Speichern verloren (TOML-Bibliotheken kennen keine Kommentare). Falls dir das wichtig ist: Codex lieber weiterhin manuell editieren.
  • Die claude mcp remove ... --scope user-Syntax wurde nicht live gegen eine echte Installation getestet (kein claude-Binary in dieser Sandbox verfügbar) — die UI zeigt die rohe Kommandozeilen-Ausgabe an, falls etwas nicht wie erwartet läuft.

Credits

Die Prompts sind dem Original treu nachgebildet (Stage 1 & 2 wortgleich; Stage 3 auf Karpathys Original-Wortlaut zurückgeführt).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

llm_council_mcp_server-0.1.0.tar.gz (29.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

llm_council_mcp_server-0.1.0-py3-none-any.whl (27.3 kB view details)

Uploaded Python 3

File details

Details for the file llm_council_mcp_server-0.1.0.tar.gz.

File metadata

  • Download URL: llm_council_mcp_server-0.1.0.tar.gz
  • Upload date:
  • Size: 29.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for llm_council_mcp_server-0.1.0.tar.gz
Algorithm Hash digest
SHA256 33a7d11d0d75b12dc33812db2291f27bb6fdce078a728a203988727e493e501c
MD5 c7f0ee46c99cd9ce717f519f8bd5620e
BLAKE2b-256 1c95b1a887c0b9fecd4021eccee2cfb284260b0d5d7d8a0913cd97b1ab2436e9

See more details on using hashes here.

File details

Details for the file llm_council_mcp_server-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: llm_council_mcp_server-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 27.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for llm_council_mcp_server-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0aaed5169d86160f87f8a4872423bb2c6412848c203b51e9b11a49702fd7b1d3
MD5 a08bb8bf6de2d7e043297b6882390235
BLAKE2b-256 a139db22f48d74efad1ef159d38e1fc767e5c85ff06528cf44975ed93cf15a5d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page