Agent Hub MCP
English | 中文
Multi-agent task coordination server built on the Model Context Protocol
Agent Hub is a lightweight coordination layer for multi-agent workflows. It provides structured task dispatch, assignment tracking, inter-agent messaging, handoff documents, and human-in-the-loop approval — all accessible via the MCP protocol.
✨ Features
- 🔌 MCP Streamable HTTP — any MCP client connects directly
- 📋 Task → Round → Assignment state machine with operator approval gates
- 💬 Inter-agent messaging with deduplication and inbox pull
- 🤝 Structured handoff documents — agents pass work with context, not just messages
- 🔒 Distributed locks with TTL-based lease expiry
- 🛡️ Bearer token authentication — each agent authenticates independently
- 📦 Zero-dependency database — SQLite with WAL mode, no external DB needed
- ⚡ 5-minute setup — install, configure tokens, run
🚀 Quick Start
Install
# Install from PyPI (recommended)
pip install agent-hub-mcp
# Or install from source
git clone https://github.com/mazhengeod/agent-hub.git
cd agent-hub
pip install -e .
Configure Agent Tokens
Create ~/.config/agent-hub/agents.env:
# Format: AGENT_ID=BEARER_TOKEN
claude-code=your-secret-token-here
codex-desktop=another-secret-token
Optionally, create ~/.config/agent-hub/config.yaml for tuning:
max_rounds: 3
max_assignments_per_round: 6
max_messages_per_task: 40
lease_minutes: 90
Run
# Start the MCP server (defaults to 127.0.0.1:8765)
python -m agent_hub.server
# Or use the CLI
hubctl serve
Connect from Claude Code
Add to your project's .mcp.json:
{
"mcpServers": {
"agent-hub": {
"type": "streamable-http",
"url": "http://127.0.0.1:8765/mcp",
"headers": {
"Authorization": "Bearer your-secret-token-here"
}
}
}
}
After the MCP client connects, call agent_register once for each token-backed
agent. The token in the request decides the agent_id; name and
capabilities are descriptive metadata:
{
"name": "Claude Code",
"capabilities": "[\"planning\", \"code-review\", \"implementation\"]"
}
You only need to re-register when you want to update the displayed name or capabilities.
🏗️ Architecture
State Machine
Task (draft)
│
├─► Round 1: awaiting_operator_approval
│ ├─► Operator approves ─► dispatched
│ │ ├─► Assignment: pending ─► claimed ─► in_progress ─► completed
│ │ └─► All assignments done ─► awaiting_review
│ └─► Operator rejects ─► back to awaiting_operator_approval
│
└─► Review verdict: approved ─► Task completed
Review verdict: changes_requested ─► Round 2 (re-plan)
16 MCP Tools
| Tool | Description |
|---|---|
hub_status |
Server version and transport info |
agent_register |
Register an agent with name and capabilities |
agent_heartbeat |
Ping to confirm agent is alive |
inbox_pull |
Pull unread messages for the calling agent |
message_send |
Send a message to another agent, or omit to_agent for broadcast |
message_ack |
Mark a message as read |
task_draft_create |
Create a new task in draft state |
round_plan_submit |
Submit a round plan with assignments |
assignment_list |
List assignments for the calling agent |
assignment_claim |
Claim a pending assignment |
assignment_progress |
Report progress on an assignment |
assignment_complete |
Complete an assignment with a handoff document |
handoff_get |
Retrieve a handoff document |
review_submit |
Submit a review verdict (approved/changes_requested) |
lock_acquire |
Acquire a distributed lock with TTL |
lock_release |
Release a held lock |
Operator CLI
hubctl provides manual operator controls:
hubctl approve <round-id> [note] # Approve a round for dispatch
hubctl reject <round-id> [note] # Reject a round (needs re-plan)
hubctl close <task-id> # Close a task
hubctl status <round-id> # Show round status
hubctl list-tasks # List all tasks
hubctl list-rounds [task-id] # List rounds
🔐 Security
- Bearer token auth — each agent has its own token in
agents.env - Tokens are SHA-256 hashed in the database, never stored in plaintext
- Local-only by default — server binds to
127.0.0.1:8765 - No external dependencies — SQLite WAL mode, no Redis/Postgres needed
⚠️ Never commit
agents.envor.mcp.jsonto version control. They contain authentication tokens. Tokens are plaintext inagents.envbecause the server must verify incoming Bearer tokens. The SQLite database stores only token hashes for audit metadata.
🚢 Production Deployment
systemd
A template service file is provided in systemd/agent-hub.service.template. Install with:
# Generate service file with your user and path
./scripts/install.sh
# Or manually:
sed -e "s|%USER%|$(whoami)|g" \
-e "s|%WORKDIR%|$(pwd)|g" \
-e "s|%VENV%|$(pwd)/.venv|g" \
systemd/agent-hub.service.template > ~/.config/systemd/user/agent-hub.service
systemctl --user daemon-reload
systemctl --user enable --now agent-hub
Environment Variables
| Variable | Default | Description |
|---|---|---|
AGENT_HUB_HOST |
127.0.0.1 |
Server bind address |
AGENT_HUB_PORT |
8765 |
Server bind port |
AGENT_HUB_DB |
~/.local/share/agent-hub/hub.db |
SQLite database path |
📂 Project Structure
agent-hub/
├── src/agent_hub/
│ ├── __init__.py # Package init
│ ├── server.py # FastMCP server with 16 tools
│ ├── service.py # State machine logic & rules
│ ├── storage.py # SQLite storage layer
│ ├── models.py # Pydantic data models
│ ├── auth.py # Bearer token verification
│ └── cli.py # hubctl operator CLI
├── migrations/
│ └── 001_init.sql # Database schema
├── tests/ # Test suite
├── examples/ # Example configs
├── systemd/ # Service templates
├── docs/ # Documentation
└── pyproject.toml # Package config
🧪 Development
# Install dev dependencies
uv pip install -e ".[dev]"
# Run tests
pytest
# Run with auto-reload (if using uvicorn)
python -m agent_hub.server
📄 License
MIT — use it, fork it, ship it.
🙏 Acknowledgments
Built with FastMCP and the Model Context Protocol specification.
Metadata
Release files for agent-hub-mcp 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| agent_hub_mcp-0.2.1.tar.gz | 24.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_hub_mcp-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.9 kB
Release files / agent_hub_mcp-0.2.1.tar.gz
| Download URL | agent_hub_mcp-0.2.1.tar.gz |
|---|---|
| Size | 24.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
98d5b1514c82a03762fd946c45cefe8e74d3b784a53a2480fcd8909d2ade5f50
|
|
BLAKE2b-256 checksum How to use checksums |
11385aee11bb389b361a56cf413b9a098cf958d8a4168f2e0085b730cd1a1fe5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Release files / agent_hub_mcp-0.2.1-py3-none-any.whl
| Download URL | agent_hub_mcp-0.2.1-py3-none-any.whl |
|---|---|
| Size | 18.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1590188bf51e394283f31479e282c51ec12e42220d6f19b22f213e9351ba4b91
|
|
BLAKE2b-256 checksum How to use checksums |
cb9f5878110e9a7951e2717346ba53bc424c36bc122a44617f606d959dceb7f1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Security for agent-hub-mcp 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.