Universal MCP server that exposes coding agents (Copilot, Claude Code, Codex) as subagents via a unified tool interface
Project description
agentprism
A universal MCP server that exposes coding agents — GitHub Copilot, Claude Code, Codex — as background subagents behind a single, unified tool interface.
agentprism lets one AI agent orchestrate other AI agents. Drop it into your MCP client (Claude Code, Cursor, Continue, …) and you gain nine tools — agent_run, agent_spawn, agent_send, agent_wait, agent_status, agent_list, agent_kill, agent_models, agent_providers — that drive any supported coding agent through its native protocol. Run several in parallel, hand off tasks between them, or use a cheaper model as a worker for a more expensive planner. agentprism speaks each provider's wire protocol natively (ACP JSON-RPC for Copilot, stream-JSON for Claude Code, exec-resume for Codex) — no fragile screen-scraping.
Installation
Recommended — no install required (uvx):
# uvx runs agentprism directly from PyPI, no pip install needed
uvx agentprism
Or install permanently:
pip install agentprism
# or: uv tool install agentprism
Or from source:
git clone https://github.com/StefanMaron/agentprism
cd agentprism
pip install -e .
You also need at least one supported coding-agent CLI installed and authenticated:
| Provider | CLI | Auth |
|---|---|---|
| Copilot | copilot (install) |
copilot login |
| Claude Code | claude (install) |
claude then /login |
| Codex | codex (install) |
codex login |
Usage with Claude Code
Add to ~/.claude/mcp.json (create if it doesn't exist):
{
"mcpServers": {
"agentprism": {
"command": "agentprism",
"type": "stdio"
}
}
}
No flags needed — every running agentprism instance auto-starts an HTTP API
on a random free port and registers itself in ~/.agentprism/{pid}.json. The
global dashboard discovers and aggregates all running instances:
agentprism dashboard # default port 7070
agentprism dashboard --port 8080
Then open http://localhost:7070 to see every active session across every
project, grouped by working directory. The legacy --dashboard PORT flag
still works for a single per-instance dashboard if you need it.
If you'd rather run via uvx, use "command": "uvx", "args": ["agentprism"].
Restart Claude Code. The nine agent_* tools will appear. Try:
Call
agent_providersto see what's available, then useagent_spawnto start a Copilot session in/tmp/playgroundwith the task "write a Python script that prints prime numbers up to 100", thenagent_waitfor it to finish.
Usage with other MCP clients
Any MCP client that supports stdio servers works. The config shape is the same — point command at agentprism (or uvx + args: ["agentprism"]).
Helping your agent know when to delegate
agentprism's tool descriptions include trigger conditions, but for reliable delegation add a short snippet to your project's AGENTS.md or CLAUDE.md:
## Delegation with agentprism
You have access to the agentprism MCP server. Use it to delegate coding tasks
to external agents (Copilot, Claude Code, Codex) instead of doing the work yourself.
Trigger conditions — reach for agentprism when:
- The user says "let Copilot handle", "delegate to Copilot", "offload to an agent", or similar
- A task is large/mechanical and offloading would preserve your context window
- You want to run multiple tasks in parallel
Quick patterns:
- One-shot (no corrections): `agent_run(task, cwd)`
- Parallel workers: multiple `agent_spawn` calls, then `agent_wait` each
- With corrections: `agent_spawn` → `agent_wait` → `agent_send` → `agent_wait` → `agent_kill`
Default provider is Copilot (1x cost). Use `agent_providers` to check what's available.
Tool reference
| Tool | Args | Returns |
|---|---|---|
agent_providers |
— | which providers are installed + authenticated |
agent_models |
provider? |
model ids + cost multipliers per provider |
agent_run |
task, cwd, provider?, model?, timeout? |
output — one-shot, blocks, auto-cleans up |
agent_spawn |
task, cwd, provider?, model?, mode? |
session_id — non-blocking, persistent |
agent_send |
session_id, message |
agent reply (blocks until response) |
agent_status |
session_id |
working | idle | done | error |
agent_wait |
session_id, timeout_seconds? |
accumulated output (blocks until done) |
agent_list |
— | all active sessions |
agent_kill |
session_id |
terminates the subprocess |
provider values: copilot, claude, codex — omit to use AGENTPRISM_DEFAULT_PROVIDER (default: copilot)
mode values (Copilot / Claude Code): agent (default), plan, autopilot
Push notifications
When a worker finishes, agentprism proactively notifies the orchestrating MCP client — no polling required.
If the client advertised the sampling capability (Claude Code does), agentprism sends a sampling/createMessage request: the LLM receives a structured wake-up message with the session summary and can immediately act on the results. Falls back to a notifications/message log event for clients that don't support sampling.
Provider support
| Provider | Status | Protocol |
|---|---|---|
| GitHub Copilot | ✓ | ACP JSON-RPC over stdio |
| Claude Code | ✓ | stream-JSON bidirectional stdio |
| Codex | ✓ | codex exec / codex exec resume |
Model cost multipliers
Use agent_models(provider="copilot") at runtime to get the current list. Examples:
| Model (Copilot) | Multiplier | Notes |
|---|---|---|
auto / claude-sonnet-4.6 |
1x | default |
claude-haiku-4.5 |
0.33x | cheapest Claude |
gpt-5-mini |
0x | free |
gpt-4.1 |
0x | free |
claude-opus-4.7 |
7.5x | deep reasoning only |
gpt-5.5 |
7.5x | GPT flagship |
Architecture
Claude session A Claude session B agentprism dashboard
(project X) (project Y) (standalone, any terminal)
│ │ │
▼ ▼ │
agentprism (stdio) agentprism (stdio) │
SessionRegistry SessionRegistry │
HTTP API :auto ──────────────────────────────────────────────►│ fan-out
│ writes │ writes reads │
▼ ▼ all ▼
~/.agentprism/{pidA}.json ~/.agentprism/{pidB}.json ──► grouped by project
│ │ http://localhost:7070
▼ ▼
CopilotAdapter ClaudeCodeAdapter
CodexAdapter CopilotAdapter
│ │
▼ ▼
copilot --acp claude stream-json
(subprocess) (subprocess)
Sessions are fully isolated per Claude session — no cross-session interference. The standalone dashboard is read-only and discovers instances via ~/.agentprism/{pid}.json lockfiles.
Configuration
Environment variables:
| Variable | Default | Purpose |
|---|---|---|
AGENTPRISM_LOG_LEVEL |
INFO |
Python logging level (logs go to stderr) |
AGENTPRISM_COPILOT_BIN |
copilot |
Path to the copilot binary |
AGENTPRISM_CLAUDE_BIN |
claude |
Path to the claude binary |
AGENTPRISM_CODEX_BIN |
codex |
Path to the codex binary |
Development
git clone https://github.com/StefanMaron/agentprism
cd agentprism
pip install -e ".[dev]"
ruff check .
pytest
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentprism-0.2.3.tar.gz.
File metadata
- Download URL: agentprism-0.2.3.tar.gz
- Upload date:
- Size: 41.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
540396f22652bbe94d681b6a4eae9709fe01183ea8158567a10891f5db75df8b
|
|
| MD5 |
d3151bbdbb11898a87091fe9cd4499d7
|
|
| BLAKE2b-256 |
92809e765830afc565607414113a2e1b60ae0b566be0b4b574f8d126f8d97ecf
|
Provenance
The following attestation bundles were made for agentprism-0.2.3.tar.gz:
Publisher:
publish.yml on StefanMaron/agentprism
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentprism-0.2.3.tar.gz -
Subject digest:
540396f22652bbe94d681b6a4eae9709fe01183ea8158567a10891f5db75df8b - Sigstore transparency entry: 1399775264
- Sigstore integration time:
-
Permalink:
StefanMaron/agentprism@ca022e6595ab1b24566950f215fdb85616991d6c -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/StefanMaron
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ca022e6595ab1b24566950f215fdb85616991d6c -
Trigger Event:
release
-
Statement type:
File details
Details for the file agentprism-0.2.3-py3-none-any.whl.
File metadata
- Download URL: agentprism-0.2.3-py3-none-any.whl
- Upload date:
- Size: 48.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfd078e43f564ea3b8e923b48dcf7b42f688cffd061e143265be5b906fadfe6d
|
|
| MD5 |
443989320ebec4ea5dfea6ec6fdb6022
|
|
| BLAKE2b-256 |
850b3caa0651dd8b805d41d3aa78ae3e654617f661985635d650d36d5df88a94
|
Provenance
The following attestation bundles were made for agentprism-0.2.3-py3-none-any.whl:
Publisher:
publish.yml on StefanMaron/agentprism
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentprism-0.2.3-py3-none-any.whl -
Subject digest:
dfd078e43f564ea3b8e923b48dcf7b42f688cffd061e143265be5b906fadfe6d - Sigstore transparency entry: 1399775304
- Sigstore integration time:
-
Permalink:
StefanMaron/agentprism@ca022e6595ab1b24566950f215fdb85616991d6c -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/StefanMaron
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ca022e6595ab1b24566950f215fdb85616991d6c -
Trigger Event:
release
-
Statement type: