agents-council-mcp 0.0.0
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.
- package/README.md +226 -0
- package/package.json +68 -0
- package/scripts/cli.cjs +42 -0
- package/scripts/postuninstall.cjs +32 -0
- package/scripts/resolveBinary.cjs +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="./.github/agents-council.jpg" alt="Agents Council" width="1280" height="714" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h2 align="center">Agents Council MCP: A lightweight MCP server for shared agent feedback sessions</h2>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
Status: <code>Experimental</code>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
Inspired by Andrej Karpathy's [LLM Council](https://github.com/karpathy/llm-council), **Agents Council** provides an MCP-based
|
|
16
|
+
CLI tool that lets multiple agents communicate with each other and find solutions to your most complex tasks.
|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
|
|
20
|
+
- Agent-to-Agent communication via MCP stdio server
|
|
21
|
+
- Agents can join the council, submit questions and continue with their own sessions after they collected enough feedback
|
|
22
|
+
- Markdown or JSON text output for agent readability or automation
|
|
23
|
+
- Local, private state stored on disk. Can run fully offline when using local models.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Installation
|
|
28
|
+
|
|
29
|
+
Requires Node.js or Bun
|
|
30
|
+
<em>For Bun, use `bunx` instead of `npx`</em>
|
|
31
|
+
|
|
32
|
+
<details>
|
|
33
|
+
<summary>amp</summary>
|
|
34
|
+
Use the amp CLI to add the Agents Council MCP server (<a href="https://ampcode.com/manual#mcp">guide</a>):
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
amp mcp add council npx agents-council-mcp@latest mcp
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
</details>
|
|
41
|
+
|
|
42
|
+
<details>
|
|
43
|
+
<summary>Claude Code</summary>
|
|
44
|
+
Use the Claude Code CLI to add the Agents Council MCP server (<a href="https://docs.anthropic.com/en/docs/claude-code/mcp">guide</a>):
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
claude mcp add council npx agents-council-mcp@latest mcp
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
or use a predefined Agent Name and enable it for all projects with user scope
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
claude mcp add council -s user -- npx agents-council-mcp@latest mcp -n Opus
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
</details>
|
|
57
|
+
|
|
58
|
+
<details>
|
|
59
|
+
<summary>Codex</summary>
|
|
60
|
+
Use the Codex CLI to add the Agents Council MCP server (<a href="https://developers.openai.com/codex/mcp/#add-a-mcp-server">guide</a>):
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
codex mcp add council npx agents-council-mcp@latest mcp
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
or with a custom Agent Name
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
codex mcp add council -- npx agents-council-mcp@latest mcp -n "Codex-5.2"
|
|
70
|
+
```
|
|
71
|
+
</details>
|
|
72
|
+
|
|
73
|
+
<details>
|
|
74
|
+
<summary>Copilot CLI</summary>
|
|
75
|
+
|
|
76
|
+
Start Copilot CLI:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
copilot
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Start the dialog to add a new MCP server by running:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
/mcp add
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Configure the following fields and press `CTRL+S` to save the configuration:
|
|
89
|
+
|
|
90
|
+
- **Server name:** `council`
|
|
91
|
+
- **Server Type:** `[1] Local`
|
|
92
|
+
- **Command:** `npx agents-council-mcp@latest mcp`
|
|
93
|
+
|
|
94
|
+
</details>
|
|
95
|
+
|
|
96
|
+
<details>
|
|
97
|
+
<summary>Gemini CLI</summary>
|
|
98
|
+
Use the Gemini CLI to add the Agents Council MCP server (<a href="https://geminicli.com/docs/tools/mcp-server/#adding-a-server-gemini-mcp-add">guide</a>):
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
gemini mcp add council npx agents-council-mcp@latest mcp
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
or use a predefined Agent Name and enable it for all projects with user scope
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
gemini mcp add council -s user -- npx agents-council-mcp@latest mcp -n "Gemini 3 Pro"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
</details>
|
|
111
|
+
|
|
112
|
+
<details>
|
|
113
|
+
<summary>Other MCP integrations</summary>
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"mcpServers": {
|
|
118
|
+
"council": {
|
|
119
|
+
"command": "npx",
|
|
120
|
+
"args": [
|
|
121
|
+
"agents-council-mcp@latest",
|
|
122
|
+
"mcp"
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
or use a predefined Agent Name
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"mcpServers": {
|
|
134
|
+
"council": {
|
|
135
|
+
"command": "npx",
|
|
136
|
+
"args": [
|
|
137
|
+
"agents-council-mcp@latest",
|
|
138
|
+
"mcp",
|
|
139
|
+
"-n",
|
|
140
|
+
"YourAgentName"
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
</details>
|
|
148
|
+
|
|
149
|
+
## Quick start
|
|
150
|
+
|
|
151
|
+
```text
|
|
152
|
+
1. Start claude in a terminal window and tell it to start the council session for tackling some complex topic
|
|
153
|
+
2. Start codex or any other agent in another terminal window and tell it to join the council session and provide feedback
|
|
154
|
+
3. Let claude know that the feedback is ready and can check if this resolves the problem
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## What problem does this tool solve?
|
|
158
|
+
|
|
159
|
+
For most complex tasks, I want to get the feedback from a second or third agent and creating a tmux session is something not very simple for lots of users.
|
|
160
|
+
I wanted to create the simplest possible tool that doesn't require any technical knowledge to run
|
|
161
|
+
|
|
162
|
+
## MCP Tools
|
|
163
|
+
|
|
164
|
+
Agents (or your MCP client) can use the following tools:
|
|
165
|
+
|
|
166
|
+
- `start_council` to open a session with a request
|
|
167
|
+
- `join_council` for first-time participants to fetch the request and responses
|
|
168
|
+
- `get_current_session_data` to poll for new responses (optionally with a cursor)
|
|
169
|
+
- `send_response` to reply
|
|
170
|
+
- `close_council` to end the session with a conclusion
|
|
171
|
+
|
|
172
|
+
## Agent Name behavior
|
|
173
|
+
|
|
174
|
+
- Without `--agent-name`/`-n`, `start_council` and `join_council` require the `agent_name` field.
|
|
175
|
+
- With `--agent-name`/`-n`, tool inputs omit `agent_name` field entirely and use the provided name instead.
|
|
176
|
+
- The server may append `#1`, `#2`, etc. if a name is already used.
|
|
177
|
+
|
|
178
|
+
## Response format (Experimental)
|
|
179
|
+
|
|
180
|
+
You can choose to receive JSON or Markdown responses from the Agents Council MCP server.
|
|
181
|
+
Some agents might work better with JSON and other with Markdown.
|
|
182
|
+
|
|
183
|
+
You can choose the format of the response by adding `-f json` or `-f markdown` argument to the MCP startup command.
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
council mcp --format markdown
|
|
187
|
+
council mcp --format json
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## State
|
|
191
|
+
|
|
192
|
+
State is stored at:
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
~/.agents-council/state.json
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Override with the following env:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
AGENTS_COUNCIL_STATE_PATH=/path/to/state.json
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Roadmap
|
|
205
|
+
|
|
206
|
+
- [x] v0.1.0 - MCP Council
|
|
207
|
+
- [ ] v0.2.0 - Chat UI
|
|
208
|
+
- [ ] v0.3.0 - Spawn Claude automatically
|
|
209
|
+
- [ ] v0.4.0 - Spawn Codex automatically
|
|
210
|
+
- [ ] v0.5.0 - Spawn Gemini automatically
|
|
211
|
+
- [ ] v0.6.0 - Multiple council sessions in parallel
|
|
212
|
+
- [ ] v0.7.0 - Connect to external LLMs via API Keys
|
|
213
|
+
- [ ] v Next - Submit your idea
|
|
214
|
+
|
|
215
|
+
## Development
|
|
216
|
+
|
|
217
|
+
See `DEVELOPMENT.md` for local setup and workflow details.
|
|
218
|
+
|
|
219
|
+
## Compatibility
|
|
220
|
+
|
|
221
|
+
This project is highly experimental and does not maintain backwards compatibility. Tool names, inputs, and responses
|
|
222
|
+
may change without legacy support; update clients alongside releases.
|
|
223
|
+
|
|
224
|
+
## License
|
|
225
|
+
|
|
226
|
+
MIT
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agents-council-mcp",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"scripts/*.cjs",
|
|
7
|
+
"README.md",
|
|
8
|
+
"LICENSE"
|
|
9
|
+
],
|
|
10
|
+
"bin": {
|
|
11
|
+
"council": "scripts/cli.cjs"
|
|
12
|
+
},
|
|
13
|
+
"optionalDependencies": {
|
|
14
|
+
"agents-council-mcp-darwin-arm64": "*",
|
|
15
|
+
"agents-council-mcp-darwin-x64": "*",
|
|
16
|
+
"agents-council-mcp-linux-arm64": "*",
|
|
17
|
+
"agents-council-mcp-linux-x64": "*",
|
|
18
|
+
"agents-council-mcp-windows-x64": "*"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "bun build src/cli/index.ts --compile --outfile dist/council",
|
|
22
|
+
"cli": "bun src/cli/index.ts",
|
|
23
|
+
"lint": "biome lint .",
|
|
24
|
+
"format": "biome format --write .",
|
|
25
|
+
"format:check": "biome check --formatter-enabled=true --linter-enabled=false .",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"prepare": "husky"
|
|
28
|
+
},
|
|
29
|
+
"lint-staged": {
|
|
30
|
+
"package.json": [
|
|
31
|
+
"biome check --write --files-ignore-unknown=true"
|
|
32
|
+
],
|
|
33
|
+
"*.json": [
|
|
34
|
+
"biome check --write --files-ignore-unknown=true"
|
|
35
|
+
],
|
|
36
|
+
"src/**/*.{ts,js}": [
|
|
37
|
+
"biome check --write --files-ignore-unknown=true"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@modelcontextprotocol/sdk": "1.25.1",
|
|
42
|
+
"zod": "4.2.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@biomejs/biome": "2.3.10",
|
|
46
|
+
"@types/bun": "1.3.5",
|
|
47
|
+
"husky": "9.1.7",
|
|
48
|
+
"lint-staged": "16.2.7",
|
|
49
|
+
"typescript": "5.9.3"
|
|
50
|
+
},
|
|
51
|
+
"author": "Alex Gavrilescu (https://github.com/MrLesk)",
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "git+https://github.com/MrLesk/agents-council.git"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/MrLesk/agents-council/issues"
|
|
58
|
+
},
|
|
59
|
+
"homepage": "https://github.com/MrLesk/agents-council",
|
|
60
|
+
"keywords": [
|
|
61
|
+
"mcp",
|
|
62
|
+
"council",
|
|
63
|
+
"agents",
|
|
64
|
+
"cli",
|
|
65
|
+
"mcp-server"
|
|
66
|
+
],
|
|
67
|
+
"license": "MIT"
|
|
68
|
+
}
|
package/scripts/cli.cjs
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn } = require("node:child_process");
|
|
4
|
+
const { resolveBinaryPath } = require("./resolveBinary.cjs");
|
|
5
|
+
|
|
6
|
+
let binaryPath;
|
|
7
|
+
try {
|
|
8
|
+
binaryPath = resolveBinaryPath();
|
|
9
|
+
} catch {
|
|
10
|
+
console.error(`Binary package not installed for ${process.platform}-${process.arch}.`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const rawArgs = process.argv.slice(2);
|
|
15
|
+
const cleanedArgs = rawArgs.filter((arg) => {
|
|
16
|
+
if (arg === binaryPath) return false;
|
|
17
|
+
try {
|
|
18
|
+
const pattern = /node_modules[/\\]agents-council-mcp-(darwin|linux|windows)-[^/\\]+[/\\]council(\.exe)?$/i;
|
|
19
|
+
return !pattern.test(arg);
|
|
20
|
+
} catch {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const child = spawn(binaryPath, cleanedArgs, {
|
|
26
|
+
stdio: "inherit",
|
|
27
|
+
windowsHide: true,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
child.on("exit", (code) => {
|
|
31
|
+
process.exit(code || 0);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
child.on("error", (err) => {
|
|
35
|
+
if (err.code === "ENOENT") {
|
|
36
|
+
console.error(`Binary not found: ${binaryPath}`);
|
|
37
|
+
console.error(`Please ensure you have the correct version for your platform (${process.platform}-${process.arch})`);
|
|
38
|
+
} else {
|
|
39
|
+
console.error("Failed to start council:", err);
|
|
40
|
+
}
|
|
41
|
+
process.exit(1);
|
|
42
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn } = require("node:child_process");
|
|
4
|
+
|
|
5
|
+
const platformPackages = [
|
|
6
|
+
"agents-council-mcp-linux-x64",
|
|
7
|
+
"agents-council-mcp-linux-arm64",
|
|
8
|
+
"agents-council-mcp-darwin-x64",
|
|
9
|
+
"agents-council-mcp-darwin-arm64",
|
|
10
|
+
"agents-council-mcp-windows-x64",
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
const packageManager = process.env.npm_config_user_agent?.split("/")[0] || "npm";
|
|
14
|
+
|
|
15
|
+
console.log("Cleaning up platform-specific packages...");
|
|
16
|
+
|
|
17
|
+
for (const pkg of platformPackages) {
|
|
18
|
+
const args = packageManager === "bun" ? ["remove", "-g", pkg] : ["uninstall", "-g", pkg];
|
|
19
|
+
|
|
20
|
+
const child = spawn(packageManager, args, {
|
|
21
|
+
stdio: "pipe",
|
|
22
|
+
windowsHide: true,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
child.on("exit", (code) => {
|
|
26
|
+
if (code === 0) {
|
|
27
|
+
console.log(`Cleaned up ${pkg}`);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
console.log("Platform package cleanup completed.");
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
function mapPlatform(platform = process.platform) {
|
|
2
|
+
switch (platform) {
|
|
3
|
+
case "win32":
|
|
4
|
+
return "windows";
|
|
5
|
+
case "darwin":
|
|
6
|
+
case "linux":
|
|
7
|
+
return platform;
|
|
8
|
+
default:
|
|
9
|
+
return platform;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function mapArch(arch = process.arch) {
|
|
14
|
+
switch (arch) {
|
|
15
|
+
case "x64":
|
|
16
|
+
case "arm64":
|
|
17
|
+
return arch;
|
|
18
|
+
default:
|
|
19
|
+
return arch;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getPackageName(platform = process.platform, arch = process.arch) {
|
|
24
|
+
return `agents-council-mcp-${mapPlatform(platform)}-${mapArch(arch)}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function resolveBinaryPath(platform = process.platform, arch = process.arch) {
|
|
28
|
+
const packageName = getPackageName(platform, arch);
|
|
29
|
+
const binary = `council${platform === "win32" ? ".exe" : ""}`;
|
|
30
|
+
return require.resolve(`${packageName}/${binary}`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = { getPackageName, resolveBinaryPath };
|