llm-council-setup 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- llm_council_setup-0.1.0/LICENSE +21 -0
- llm_council_setup-0.1.0/PKG-INFO +228 -0
- llm_council_setup-0.1.0/README.md +208 -0
- llm_council_setup-0.1.0/council_core.py +453 -0
- llm_council_setup-0.1.0/council_settings.py +110 -0
- llm_council_setup-0.1.0/installer.py +294 -0
- llm_council_setup-0.1.0/llm_council_setup.egg-info/PKG-INFO +228 -0
- llm_council_setup-0.1.0/llm_council_setup.egg-info/SOURCES.txt +14 -0
- llm_council_setup-0.1.0/llm_council_setup.egg-info/dependency_links.txt +1 -0
- llm_council_setup-0.1.0/llm_council_setup.egg-info/entry_points.txt +3 -0
- llm_council_setup-0.1.0/llm_council_setup.egg-info/requires.txt +9 -0
- llm_council_setup-0.1.0/llm_council_setup.egg-info/top_level.txt +5 -0
- llm_council_setup-0.1.0/pyproject.toml +25 -0
- llm_council_setup-0.1.0/server.py +282 -0
- llm_council_setup-0.1.0/setup.cfg +4 -0
- llm_council_setup-0.1.0/setup_ui.py +636 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Alexander Deja
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: llm-council-setup
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Local MCP server for the LLM Council workflow
|
|
5
|
+
Author: Alexander Deja
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Repository, https://github.com/salutaris91/llm-council-mcp
|
|
8
|
+
Project-URL: Original idea, https://github.com/karpathy/llm-council
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Dist: mcp>=1.2.0
|
|
13
|
+
Requires-Dist: httpx>=0.27.0
|
|
14
|
+
Requires-Dist: flask>=3.0.0
|
|
15
|
+
Requires-Dist: pydantic>=2.0.0
|
|
16
|
+
Requires-Dist: platformdirs>=4.0.0
|
|
17
|
+
Requires-Dist: tomli>=2.0.0; python_version < "3.11"
|
|
18
|
+
Requires-Dist: tomli_w>=1.0.0
|
|
19
|
+
Dynamic: license-file
|
|
20
|
+
|
|
21
|
+
# LLM Council MCP (lokal, ohne Docker)
|
|
22
|
+
|
|
23
|
+
Ein schlanker, lokaler MCP-Server für deinen Mac, der den 3-Stufen-Workflow
|
|
24
|
+
von [llm-council-plus](https://github.com/DmitryBMsk/llm-council-plus)
|
|
25
|
+
nachbildet — mit den **exakten Original-Prompts**, direkt gegen OpenRouter,
|
|
26
|
+
ohne Docker/NAS-Abhängigkeit. Nutzbar aus Claude Code, Codex CLI und
|
|
27
|
+
Antigravity über MCP.
|
|
28
|
+
|
|
29
|
+
## Was das ist (und was nicht)
|
|
30
|
+
|
|
31
|
+
`council_core.py` ist eine eigenständige Python-Portierung der 3 Stufen aus
|
|
32
|
+
`backend/council.py` und `backend/runtime_settings.py` des echten
|
|
33
|
+
llm-council-plus-Repos:
|
|
34
|
+
|
|
35
|
+
1. **Stufe 1** — jedes Council-Modell beantwortet deine Frage unabhängig, parallel.
|
|
36
|
+
2. **Stufe 2** — jedes Modell bewertet/rankt die anonymisierten Antworten der
|
|
37
|
+
anderen ("Response A", "Response B", ...), damit kein Modell seine eigene
|
|
38
|
+
Antwort erkennen und bevorzugen kann.
|
|
39
|
+
3. **Stufe 3** — ein Chairman-Modell liest Stufe 1 + 2 und schreibt eine
|
|
40
|
+
finale, synthetisierte Antwort. Schlägt der Chairman fehl, probiert der
|
|
41
|
+
Code automatisch die anderen Council-Modelle als Ersatz-Chairman durch
|
|
42
|
+
(Fallback-Logik, 1:1 aus dem Original übernommen).
|
|
43
|
+
|
|
44
|
+
Die Prompt-Templates für alle 3 Stufen sind **wortwörtlich** aus
|
|
45
|
+
`backend/runtime_settings.py` kopiert (siehe `STAGE1_PROMPT_TEMPLATE`,
|
|
46
|
+
`STAGE2_PROMPT_TEMPLATE`, `STAGE3_PROMPT_TEMPLATE` in `council_core.py`),
|
|
47
|
+
ebenso die Default-Temperaturen (Stufe 1: 0.5, Stufe 2: 0.3, Stufe 3: 0.4)
|
|
48
|
+
und das OpenRouter-Aufruf-Schema (Retry mit Backoff bei 429).
|
|
49
|
+
|
|
50
|
+
**Bewusst weggelassen** (für ein schlankes, persönliches Tool nicht nötig):
|
|
51
|
+
|
|
52
|
+
- TOON-Encoding der Stufe-1/2-Daten (im Original nur eine
|
|
53
|
+
Token-Effizienz-Optimierung, ändert das Ergebnis nicht)
|
|
54
|
+
- Web-Suche / Tool-Ergebnisse in Stufe 1
|
|
55
|
+
- Editierbare Prompts/Temperaturen über die UI (siehe unten) — die bleiben
|
|
56
|
+
bewusst Konstanten in `council_core.py`, um die geprüfte Prompt-Treue zum
|
|
57
|
+
Original nicht versehentlich zu gefährden. Wer sie ändern will, editiert
|
|
58
|
+
die Datei direkt.
|
|
59
|
+
- Konversationsverlauf / Multi-Turn-Memory
|
|
60
|
+
|
|
61
|
+
Der Server hat **keinen eigenen Dateizugriff**. Das ist Absicht: das
|
|
62
|
+
aufrufende Tool (Claude Code, Codex, Antigravity) hat bereits Zugriff auf
|
|
63
|
+
deinen lokalen Code und übergibt relevanten Code/Kontext direkt als
|
|
64
|
+
Parameter (`code_context`) beim Tool-Aufruf — kein separater "Scout-Agent",
|
|
65
|
+
kein Ordner-Mounting nötig.
|
|
66
|
+
|
|
67
|
+
## Setup auf dem MacBook
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cd llm-council-mcp
|
|
71
|
+
python3 -m venv venv
|
|
72
|
+
source venv/bin/activate
|
|
73
|
+
pip install -r requirements.txt
|
|
74
|
+
|
|
75
|
+
cp .env.example .env
|
|
76
|
+
# Öffne .env in einem Editor und trage deinen echten OPENROUTER_API_KEY ein.
|
|
77
|
+
# Nie den Key in einen Chat einfügen - nur lokal in die .env-Datei.
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Schneller Funktionstest ohne MCP-Client (optional):
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
python3 -c "
|
|
84
|
+
import asyncio, council_core
|
|
85
|
+
async def main():
|
|
86
|
+
r = await council_core.run_full_council('Sage in einem Satz: 2+2?')
|
|
87
|
+
print(r['stage3']['response'])
|
|
88
|
+
asyncio.run(main())
|
|
89
|
+
"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Setup-UI (empfohlen)
|
|
93
|
+
|
|
94
|
+
Statt `.env` von Hand zu editieren und die Registrierungsbefehle unten manuell
|
|
95
|
+
auszuführen, gibt es eine kleine lokale Weboberfläche dafür:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
python3 setup_ui.py
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Öffnet automatisch `http://127.0.0.1:5151` im Browser. Dort kannst du:
|
|
102
|
+
|
|
103
|
+
- OpenRouter-Key, Council-Modelle und Chairman-Modell setzen (schreibt in `.env`)
|
|
104
|
+
- pro Tool (Claude Code, Codex, Antigravity) per Knopfdruck installieren/entfernen,
|
|
105
|
+
mit Status-Anzeige, ob aktuell installiert
|
|
106
|
+
|
|
107
|
+
Läuft **nur lokal** (127.0.0.1, kein Netzwerkzugriff von außen) und **nur
|
|
108
|
+
solange das Terminal offen ist** — kein Hintergrunddienst. Mit Strg+C beenden,
|
|
109
|
+
wenn fertig. Der eigentliche `ask_council`-MCP-Server (`server.py`) ist davon
|
|
110
|
+
komplett unabhängig und läuft separat on-demand, wenn Claude Code/Codex/
|
|
111
|
+
Antigravity ihn brauchen.
|
|
112
|
+
|
|
113
|
+
**Wie die Buttons technisch funktionieren** (siehe `installer.py`), pro Tool
|
|
114
|
+
unterschiedlich, bewusst so gewählt:
|
|
115
|
+
|
|
116
|
+
- **Claude Code**: über die offizielle `claude mcp add`/`remove`-CLI — die
|
|
117
|
+
stabile, dokumentierte Schnittstelle. Setup-UI ruft diese Befehle für dich auf.
|
|
118
|
+
- **Codex**: direktes Schreiben in `~/.codex/config.toml` (Format laut aktueller
|
|
119
|
+
offizieller Doku verifiziert). **Achtung:** Beim Speichern wird die gesamte
|
|
120
|
+
Datei neu geschrieben — eigene Kommentare in dieser Datei gehen dabei verloren,
|
|
121
|
+
andere `[mcp_servers.*]`-Einträge bleiben aber erhalten.
|
|
122
|
+
- **Antigravity**: direktes Schreiben in `mcp_config.json`, da kein offizielles
|
|
123
|
+
CLI dafür existiert. Pfad ist im UI editierbar, falls der Standardpfad bei dir
|
|
124
|
+
abweicht (siehe Unsicherheiten unten).
|
|
125
|
+
|
|
126
|
+
Die manuellen Befehle unten funktionieren weiterhin identisch — die UI ist nur
|
|
127
|
+
eine Komfortschicht darüber, kein zweiter Mechanismus.
|
|
128
|
+
|
|
129
|
+
## Registrierung in deinen 3 Tools (manuell, alternativ zur Setup-UI)
|
|
130
|
+
|
|
131
|
+
Bei allen drei brauchst du den **absoluten Pfad** zu `server.py` und idealerweise
|
|
132
|
+
zum `python3` aus deinem venv (`which python3` nach `source venv/bin/activate`).
|
|
133
|
+
|
|
134
|
+
### Claude Code
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
claude mcp add llm-council --scope user -- /absoluter/pfad/zu/venv/bin/python3 /absoluter/pfad/zu/llm-council-mcp/server.py
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
`--scope user` macht den Server in allen Projekten verfügbar (nicht nur im
|
|
141
|
+
aktuellen). Mit `claude mcp list` prüfst du, ob er registriert ist.
|
|
142
|
+
|
|
143
|
+
### Codex CLI
|
|
144
|
+
|
|
145
|
+
Codex unterstützt MCP-Server seit einiger Zeit offiziell (geprüft gegen die
|
|
146
|
+
aktuelle Doku auf developers.openai.com/codex/mcp). Zwei Wege, gleiches Ergebnis:
|
|
147
|
+
|
|
148
|
+
**Per CLI:**
|
|
149
|
+
```bash
|
|
150
|
+
codex mcp add llm-council -- /absoluter/pfad/zu/venv/bin/python3 /absoluter/pfad/zu/llm-council-mcp/server.py
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Oder manuell in `~/.codex/config.toml`:**
|
|
154
|
+
```toml
|
|
155
|
+
[mcp_servers.llm-council]
|
|
156
|
+
command = "/absoluter/pfad/zu/venv/bin/python3"
|
|
157
|
+
args = ["/absoluter/pfad/zu/llm-council-mcp/server.py"]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Mit `/mcp` in der Codex-TUI siehst du die aktiven Server.
|
|
161
|
+
|
|
162
|
+
### Antigravity
|
|
163
|
+
|
|
164
|
+
Antigravity legt MCP-Server in einer `mcp_config.json` ab (laut aktueller
|
|
165
|
+
Doku/Community-Quellen typischerweise unter `~/.gemini/antigravity/mcp_config.json`,
|
|
166
|
+
erreichbar auch über Settings → Customizations → MCP Servers in der App).
|
|
167
|
+
**Unsicherheit:** Antigravity ist noch jung und der genaue Pfad kann sich je
|
|
168
|
+
Version/Update unterscheiden — schau im Zweifel direkt im Settings-Menü nach
|
|
169
|
+
dem Punkt "MCP Servers" / "Customizations", statt blind dem Pfad zu folgen.
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"mcpServers": {
|
|
174
|
+
"llm-council": {
|
|
175
|
+
"command": "/absoluter/pfad/zu/venv/bin/python3",
|
|
176
|
+
"args": ["/absoluter/pfad/zu/llm-council-mcp/server.py"]
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Nutzung
|
|
183
|
+
|
|
184
|
+
Sobald registriert, kannst du in jedem der drei Tools sinngemäß sagen:
|
|
185
|
+
|
|
186
|
+
> Frag den Council: Sollten wir für den Cache Redis oder eine In-Memory-Lösung
|
|
187
|
+
> nehmen? Hier ist der relevante Code: [...]
|
|
188
|
+
|
|
189
|
+
Das Tool ruft `ask_council` mit `question` und `code_context` auf. Die Antwort
|
|
190
|
+
ist ein Markdown-Report: zuerst das Chairman-Fazit, danach die einzelnen
|
|
191
|
+
Stufe-1-Antworten zur Transparenz, danach (falls vorhanden) die Stufe-2-Rankings.
|
|
192
|
+
|
|
193
|
+
Ein Aufruf macht mehrere parallele + sequenzielle LLM-Calls und kann
|
|
194
|
+
**gut über eine Minute** dauern — bewusst gedacht für wichtige Einzel-
|
|
195
|
+
Entscheidungen, nicht für ständige Nutzung.
|
|
196
|
+
|
|
197
|
+
## Bekannte Unsicherheiten / was du selbst prüfen solltest
|
|
198
|
+
|
|
199
|
+
- Die exakten OpenRouter-Modell-IDs (`openai/gpt-5.1`,
|
|
200
|
+
`google/gemini-3-pro-preview`, `anthropic/claude-sonnet-4.5`) stammen aus
|
|
201
|
+
den Defaults von llm-council-plus zum Zeitpunkt der Recherche. Falls
|
|
202
|
+
OpenRouter eine ID umbenennt oder ein Modell deprecated, schlägt der
|
|
203
|
+
jeweilige Call mit einer Fehlermeldung fehl (wird im Report angezeigt,
|
|
204
|
+
blockiert aber nicht die anderen Modelle) — einfach `COUNCIL_MODELS` in
|
|
205
|
+
`.env` anpassen.
|
|
206
|
+
- Die `codex mcp add`-Syntax wurde gegen die aktuelle Doku geprüft; sollte sie
|
|
207
|
+
sich geändert haben, hilft `codex mcp --help`.
|
|
208
|
+
- Antigravitys Config-Pfad/-Format wurde über Community-Quellen verifiziert,
|
|
209
|
+
nicht über eine offizielle, vollständig geladene Doku-Seite (die Seite ist
|
|
210
|
+
clientseitig gerendert und lieferte beim Abruf keinen Textinhalt) — im
|
|
211
|
+
Zweifel das Settings-Menü in der App selbst prüfen.
|
|
212
|
+
- Die Setup-UI schreibt `config.toml` (Codex) und `mcp_config.json`
|
|
213
|
+
(Antigravity) jeweils komplett neu. Bestehende Einträge anderer MCP-Server
|
|
214
|
+
bleiben erhalten, aber eigene Kommentare/Formatierung in `config.toml`
|
|
215
|
+
gehen beim Speichern verloren (TOML-Bibliotheken kennen keine Kommentare).
|
|
216
|
+
Falls dir das wichtig ist: Codex lieber weiterhin manuell editieren.
|
|
217
|
+
- Die `claude mcp remove ... --scope user`-Syntax wurde nicht live gegen eine
|
|
218
|
+
echte Installation getestet (kein `claude`-Binary in dieser Sandbox
|
|
219
|
+
verfügbar) — die UI zeigt die rohe Kommandozeilen-Ausgabe an, falls etwas
|
|
220
|
+
nicht wie erwartet läuft.
|
|
221
|
+
|
|
222
|
+
## Credits
|
|
223
|
+
|
|
224
|
+
- **Originalidee:** Andrej Karpathy — [karpathy/llm-council](https://github.com/karpathy/llm-council)
|
|
225
|
+
- **Prompt-/Workflow-Vorlage:** portiert aus [DmitryBMsk/llm-council-plus](https://github.com/DmitryBMsk/llm-council-plus), einem Fork des Originals
|
|
226
|
+
- **Dieser MCP-Server:** Alexander Deja — [anderzlabs.de](https://www.anderzlabs.de/)
|
|
227
|
+
|
|
228
|
+
Die Prompts sind dem Original treu nachgebildet (Stage 1 & 2 wortgleich; Stage 3 auf Karpathys Original-Wortlaut zurückgeführt).
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# LLM Council MCP (lokal, ohne Docker)
|
|
2
|
+
|
|
3
|
+
Ein schlanker, lokaler MCP-Server für deinen Mac, der den 3-Stufen-Workflow
|
|
4
|
+
von [llm-council-plus](https://github.com/DmitryBMsk/llm-council-plus)
|
|
5
|
+
nachbildet — mit den **exakten Original-Prompts**, direkt gegen OpenRouter,
|
|
6
|
+
ohne Docker/NAS-Abhängigkeit. Nutzbar aus Claude Code, Codex CLI und
|
|
7
|
+
Antigravity über MCP.
|
|
8
|
+
|
|
9
|
+
## Was das ist (und was nicht)
|
|
10
|
+
|
|
11
|
+
`council_core.py` ist eine eigenständige Python-Portierung der 3 Stufen aus
|
|
12
|
+
`backend/council.py` und `backend/runtime_settings.py` des echten
|
|
13
|
+
llm-council-plus-Repos:
|
|
14
|
+
|
|
15
|
+
1. **Stufe 1** — jedes Council-Modell beantwortet deine Frage unabhängig, parallel.
|
|
16
|
+
2. **Stufe 2** — jedes Modell bewertet/rankt die anonymisierten Antworten der
|
|
17
|
+
anderen ("Response A", "Response B", ...), damit kein Modell seine eigene
|
|
18
|
+
Antwort erkennen und bevorzugen kann.
|
|
19
|
+
3. **Stufe 3** — ein Chairman-Modell liest Stufe 1 + 2 und schreibt eine
|
|
20
|
+
finale, synthetisierte Antwort. Schlägt der Chairman fehl, probiert der
|
|
21
|
+
Code automatisch die anderen Council-Modelle als Ersatz-Chairman durch
|
|
22
|
+
(Fallback-Logik, 1:1 aus dem Original übernommen).
|
|
23
|
+
|
|
24
|
+
Die Prompt-Templates für alle 3 Stufen sind **wortwörtlich** aus
|
|
25
|
+
`backend/runtime_settings.py` kopiert (siehe `STAGE1_PROMPT_TEMPLATE`,
|
|
26
|
+
`STAGE2_PROMPT_TEMPLATE`, `STAGE3_PROMPT_TEMPLATE` in `council_core.py`),
|
|
27
|
+
ebenso die Default-Temperaturen (Stufe 1: 0.5, Stufe 2: 0.3, Stufe 3: 0.4)
|
|
28
|
+
und das OpenRouter-Aufruf-Schema (Retry mit Backoff bei 429).
|
|
29
|
+
|
|
30
|
+
**Bewusst weggelassen** (für ein schlankes, persönliches Tool nicht nötig):
|
|
31
|
+
|
|
32
|
+
- TOON-Encoding der Stufe-1/2-Daten (im Original nur eine
|
|
33
|
+
Token-Effizienz-Optimierung, ändert das Ergebnis nicht)
|
|
34
|
+
- Web-Suche / Tool-Ergebnisse in Stufe 1
|
|
35
|
+
- Editierbare Prompts/Temperaturen über die UI (siehe unten) — die bleiben
|
|
36
|
+
bewusst Konstanten in `council_core.py`, um die geprüfte Prompt-Treue zum
|
|
37
|
+
Original nicht versehentlich zu gefährden. Wer sie ändern will, editiert
|
|
38
|
+
die Datei direkt.
|
|
39
|
+
- Konversationsverlauf / Multi-Turn-Memory
|
|
40
|
+
|
|
41
|
+
Der Server hat **keinen eigenen Dateizugriff**. Das ist Absicht: das
|
|
42
|
+
aufrufende Tool (Claude Code, Codex, Antigravity) hat bereits Zugriff auf
|
|
43
|
+
deinen lokalen Code und übergibt relevanten Code/Kontext direkt als
|
|
44
|
+
Parameter (`code_context`) beim Tool-Aufruf — kein separater "Scout-Agent",
|
|
45
|
+
kein Ordner-Mounting nötig.
|
|
46
|
+
|
|
47
|
+
## Setup auf dem MacBook
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd llm-council-mcp
|
|
51
|
+
python3 -m venv venv
|
|
52
|
+
source venv/bin/activate
|
|
53
|
+
pip install -r requirements.txt
|
|
54
|
+
|
|
55
|
+
cp .env.example .env
|
|
56
|
+
# Öffne .env in einem Editor und trage deinen echten OPENROUTER_API_KEY ein.
|
|
57
|
+
# Nie den Key in einen Chat einfügen - nur lokal in die .env-Datei.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Schneller Funktionstest ohne MCP-Client (optional):
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
python3 -c "
|
|
64
|
+
import asyncio, council_core
|
|
65
|
+
async def main():
|
|
66
|
+
r = await council_core.run_full_council('Sage in einem Satz: 2+2?')
|
|
67
|
+
print(r['stage3']['response'])
|
|
68
|
+
asyncio.run(main())
|
|
69
|
+
"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Setup-UI (empfohlen)
|
|
73
|
+
|
|
74
|
+
Statt `.env` von Hand zu editieren und die Registrierungsbefehle unten manuell
|
|
75
|
+
auszuführen, gibt es eine kleine lokale Weboberfläche dafür:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
python3 setup_ui.py
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Öffnet automatisch `http://127.0.0.1:5151` im Browser. Dort kannst du:
|
|
82
|
+
|
|
83
|
+
- OpenRouter-Key, Council-Modelle und Chairman-Modell setzen (schreibt in `.env`)
|
|
84
|
+
- pro Tool (Claude Code, Codex, Antigravity) per Knopfdruck installieren/entfernen,
|
|
85
|
+
mit Status-Anzeige, ob aktuell installiert
|
|
86
|
+
|
|
87
|
+
Läuft **nur lokal** (127.0.0.1, kein Netzwerkzugriff von außen) und **nur
|
|
88
|
+
solange das Terminal offen ist** — kein Hintergrunddienst. Mit Strg+C beenden,
|
|
89
|
+
wenn fertig. Der eigentliche `ask_council`-MCP-Server (`server.py`) ist davon
|
|
90
|
+
komplett unabhängig und läuft separat on-demand, wenn Claude Code/Codex/
|
|
91
|
+
Antigravity ihn brauchen.
|
|
92
|
+
|
|
93
|
+
**Wie die Buttons technisch funktionieren** (siehe `installer.py`), pro Tool
|
|
94
|
+
unterschiedlich, bewusst so gewählt:
|
|
95
|
+
|
|
96
|
+
- **Claude Code**: über die offizielle `claude mcp add`/`remove`-CLI — die
|
|
97
|
+
stabile, dokumentierte Schnittstelle. Setup-UI ruft diese Befehle für dich auf.
|
|
98
|
+
- **Codex**: direktes Schreiben in `~/.codex/config.toml` (Format laut aktueller
|
|
99
|
+
offizieller Doku verifiziert). **Achtung:** Beim Speichern wird die gesamte
|
|
100
|
+
Datei neu geschrieben — eigene Kommentare in dieser Datei gehen dabei verloren,
|
|
101
|
+
andere `[mcp_servers.*]`-Einträge bleiben aber erhalten.
|
|
102
|
+
- **Antigravity**: direktes Schreiben in `mcp_config.json`, da kein offizielles
|
|
103
|
+
CLI dafür existiert. Pfad ist im UI editierbar, falls der Standardpfad bei dir
|
|
104
|
+
abweicht (siehe Unsicherheiten unten).
|
|
105
|
+
|
|
106
|
+
Die manuellen Befehle unten funktionieren weiterhin identisch — die UI ist nur
|
|
107
|
+
eine Komfortschicht darüber, kein zweiter Mechanismus.
|
|
108
|
+
|
|
109
|
+
## Registrierung in deinen 3 Tools (manuell, alternativ zur Setup-UI)
|
|
110
|
+
|
|
111
|
+
Bei allen drei brauchst du den **absoluten Pfad** zu `server.py` und idealerweise
|
|
112
|
+
zum `python3` aus deinem venv (`which python3` nach `source venv/bin/activate`).
|
|
113
|
+
|
|
114
|
+
### Claude Code
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
claude mcp add llm-council --scope user -- /absoluter/pfad/zu/venv/bin/python3 /absoluter/pfad/zu/llm-council-mcp/server.py
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`--scope user` macht den Server in allen Projekten verfügbar (nicht nur im
|
|
121
|
+
aktuellen). Mit `claude mcp list` prüfst du, ob er registriert ist.
|
|
122
|
+
|
|
123
|
+
### Codex CLI
|
|
124
|
+
|
|
125
|
+
Codex unterstützt MCP-Server seit einiger Zeit offiziell (geprüft gegen die
|
|
126
|
+
aktuelle Doku auf developers.openai.com/codex/mcp). Zwei Wege, gleiches Ergebnis:
|
|
127
|
+
|
|
128
|
+
**Per CLI:**
|
|
129
|
+
```bash
|
|
130
|
+
codex mcp add llm-council -- /absoluter/pfad/zu/venv/bin/python3 /absoluter/pfad/zu/llm-council-mcp/server.py
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Oder manuell in `~/.codex/config.toml`:**
|
|
134
|
+
```toml
|
|
135
|
+
[mcp_servers.llm-council]
|
|
136
|
+
command = "/absoluter/pfad/zu/venv/bin/python3"
|
|
137
|
+
args = ["/absoluter/pfad/zu/llm-council-mcp/server.py"]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Mit `/mcp` in der Codex-TUI siehst du die aktiven Server.
|
|
141
|
+
|
|
142
|
+
### Antigravity
|
|
143
|
+
|
|
144
|
+
Antigravity legt MCP-Server in einer `mcp_config.json` ab (laut aktueller
|
|
145
|
+
Doku/Community-Quellen typischerweise unter `~/.gemini/antigravity/mcp_config.json`,
|
|
146
|
+
erreichbar auch über Settings → Customizations → MCP Servers in der App).
|
|
147
|
+
**Unsicherheit:** Antigravity ist noch jung und der genaue Pfad kann sich je
|
|
148
|
+
Version/Update unterscheiden — schau im Zweifel direkt im Settings-Menü nach
|
|
149
|
+
dem Punkt "MCP Servers" / "Customizations", statt blind dem Pfad zu folgen.
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"mcpServers": {
|
|
154
|
+
"llm-council": {
|
|
155
|
+
"command": "/absoluter/pfad/zu/venv/bin/python3",
|
|
156
|
+
"args": ["/absoluter/pfad/zu/llm-council-mcp/server.py"]
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Nutzung
|
|
163
|
+
|
|
164
|
+
Sobald registriert, kannst du in jedem der drei Tools sinngemäß sagen:
|
|
165
|
+
|
|
166
|
+
> Frag den Council: Sollten wir für den Cache Redis oder eine In-Memory-Lösung
|
|
167
|
+
> nehmen? Hier ist der relevante Code: [...]
|
|
168
|
+
|
|
169
|
+
Das Tool ruft `ask_council` mit `question` und `code_context` auf. Die Antwort
|
|
170
|
+
ist ein Markdown-Report: zuerst das Chairman-Fazit, danach die einzelnen
|
|
171
|
+
Stufe-1-Antworten zur Transparenz, danach (falls vorhanden) die Stufe-2-Rankings.
|
|
172
|
+
|
|
173
|
+
Ein Aufruf macht mehrere parallele + sequenzielle LLM-Calls und kann
|
|
174
|
+
**gut über eine Minute** dauern — bewusst gedacht für wichtige Einzel-
|
|
175
|
+
Entscheidungen, nicht für ständige Nutzung.
|
|
176
|
+
|
|
177
|
+
## Bekannte Unsicherheiten / was du selbst prüfen solltest
|
|
178
|
+
|
|
179
|
+
- Die exakten OpenRouter-Modell-IDs (`openai/gpt-5.1`,
|
|
180
|
+
`google/gemini-3-pro-preview`, `anthropic/claude-sonnet-4.5`) stammen aus
|
|
181
|
+
den Defaults von llm-council-plus zum Zeitpunkt der Recherche. Falls
|
|
182
|
+
OpenRouter eine ID umbenennt oder ein Modell deprecated, schlägt der
|
|
183
|
+
jeweilige Call mit einer Fehlermeldung fehl (wird im Report angezeigt,
|
|
184
|
+
blockiert aber nicht die anderen Modelle) — einfach `COUNCIL_MODELS` in
|
|
185
|
+
`.env` anpassen.
|
|
186
|
+
- Die `codex mcp add`-Syntax wurde gegen die aktuelle Doku geprüft; sollte sie
|
|
187
|
+
sich geändert haben, hilft `codex mcp --help`.
|
|
188
|
+
- Antigravitys Config-Pfad/-Format wurde über Community-Quellen verifiziert,
|
|
189
|
+
nicht über eine offizielle, vollständig geladene Doku-Seite (die Seite ist
|
|
190
|
+
clientseitig gerendert und lieferte beim Abruf keinen Textinhalt) — im
|
|
191
|
+
Zweifel das Settings-Menü in der App selbst prüfen.
|
|
192
|
+
- Die Setup-UI schreibt `config.toml` (Codex) und `mcp_config.json`
|
|
193
|
+
(Antigravity) jeweils komplett neu. Bestehende Einträge anderer MCP-Server
|
|
194
|
+
bleiben erhalten, aber eigene Kommentare/Formatierung in `config.toml`
|
|
195
|
+
gehen beim Speichern verloren (TOML-Bibliotheken kennen keine Kommentare).
|
|
196
|
+
Falls dir das wichtig ist: Codex lieber weiterhin manuell editieren.
|
|
197
|
+
- Die `claude mcp remove ... --scope user`-Syntax wurde nicht live gegen eine
|
|
198
|
+
echte Installation getestet (kein `claude`-Binary in dieser Sandbox
|
|
199
|
+
verfügbar) — die UI zeigt die rohe Kommandozeilen-Ausgabe an, falls etwas
|
|
200
|
+
nicht wie erwartet läuft.
|
|
201
|
+
|
|
202
|
+
## Credits
|
|
203
|
+
|
|
204
|
+
- **Originalidee:** Andrej Karpathy — [karpathy/llm-council](https://github.com/karpathy/llm-council)
|
|
205
|
+
- **Prompt-/Workflow-Vorlage:** portiert aus [DmitryBMsk/llm-council-plus](https://github.com/DmitryBMsk/llm-council-plus), einem Fork des Originals
|
|
206
|
+
- **Dieser MCP-Server:** Alexander Deja — [anderzlabs.de](https://www.anderzlabs.de/)
|
|
207
|
+
|
|
208
|
+
Die Prompts sind dem Original treu nachgebildet (Stage 1 & 2 wortgleich; Stage 3 auf Karpathys Original-Wortlaut zurückgeführt).
|