Agora
Agora is an MCP server that acts as a smart task router for your AI agents. Register your MCP servers as agents, and Agora will automatically match incoming tasks to the best-suited agent based on capability keywords.
README
Agora — MCP-Native Smart Task Router for AI Agents
An open protocol where AI agents discover each other, delegate tasks, and collaborate.
Agora is an MCP (Model Context Protocol) server that acts as a smart task router for your AI agents. Register your MCP servers as agents, and Agora will automatically match incoming tasks to the best-suited agent based on capability keywords.
No cloud. No auth. No network. Just your local agents, working together.
Why Agora?
Today, AI agents are isolated. Each MCP server does its own thing — filesystem, GitHub, database — but they can't discover or delegate to each other. You, the human, manually wire everything together.
Agora changes this:
- Register your existing MCP servers as agents with typed capabilities
- Discover which agent is best suited for a given task
- Route tasks automatically based on keyword-matched confidence scores
- Track task lifecycle from creation to completion
You: "Read the contents of src/index.ts"
Agora: → Matched 'filesystem' agent (confidence: 0.92) → routed ✓
Quick Start
1. Initialize
npx agora init
This creates ~/.agora/config.json and the SQLite database, then scans for existing MCP servers (Claude Desktop, Cursor, etc.).
2. Add to Your MCP Client
Add this to your MCP client config (e.g., claude_desktop_config.json):
{
"mcpServers": {
"agora": {
"command": "npx",
"args": ["-y", "@agora/mcp-server", "serve"]
}
}
}
3. Start Using
Once connected, you have 8 tools available in your AI assistant:
| Tool | Description |
|---|---|
agora_register_agent |
Register an MCP server as an agent with capabilities |
agora_unregister_agent |
Remove an agent from the registry |
agora_list_agents |
List all registered agents (filterable by tags) |
agora_find_agent |
Find the best agent for a task description |
agora_create_task |
Create a task and auto-route to the best agent |
agora_get_task |
Get task status and results |
agora_list_tasks |
List tasks with status/agent filters |
agora_cancel_task |
Cancel a pending or in-progress task |
How It Works
Architecture
┌──────────────────────────────────────────────┐
│ MCP Host (Claude, Cursor, etc.) │
│ │ │
│ stdio transport │
│ │ │
│ ┌────────────▼──────────────┐ │
│ │ AGORA HUB SERVER │ │
│ │ (MCP Server) │ │
│ │ │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ 8 MCP Tools │ │ │
│ │ └────────┬────────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼────────────┐ │ │
│ │ │ Capability Matcher │ │ │
│ │ │ (keyword scoring) │ │ │
│ │ └────────┬────────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼────────────┐ │ │
│ │ │ SQLite (WAL mode) │ │ │
│ │ │ agents + tasks │ │ │
│ │ └─────────────────────┘ │ │
│ └───────────────────────────┘ │
└──────────────────────────────────────────────┘
Capability Matching
Agora uses keyword-based matching with weighted scoring:
| Field | Weight | Example |
|---|---|---|
| Capability name | 3x | read_file → "read", "file" |
| Capability tags | 2x | ["filesystem", "read"] |
| Capability description | 1x | "Read the contents of a file" |
When you ask: "Read the contents of package.json"
- Tokens:
["read", "contents", "package", "json"] filesystem.read_filescores 0.92 (name: "read" + "file", tags: "read" + "filesystem")github.get_file_contentsscores 0.45 (partial match)
Task Lifecycle
pending → assigned → in_progress → completed
→ failed
→ timed_out
→ cancelled (at any non-terminal state)
Example Usage
Register an Agent
// Tool: agora_register_agent
{
"name": "filesystem",
"description": "Reads and writes files on the local filesystem",
"capabilities": [
{
"name": "read_file",
"description": "Read the contents of a file at a given path",
"tags": ["filesystem", "read", "file"]
},
{
"name": "write_file",
"description": "Write content to a file",
"tags": ["filesystem", "write", "file"]
}
],
"transport": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user"]
}
}
Find the Best Agent
// Tool: agora_find_agent
{ "task_description": "Read the README.md file" }
// Response
{
"matches": [
{
"agent_name": "filesystem",
"matched_capability": "read_file",
"confidence": 0.92,
"match_reason": "Keywords 'read', 'file' match capability 'read_file'"
}
]
}
Create and Route a Task
// Tool: agora_create_task
{
"description": "Read the contents of src/index.ts",
"input": { "path": "src/index.ts" }
}
// Response — auto-routed to best agent
{
"task_id": "a1b2c3d4-...",
"status": "assigned",
"assigned_agent": {
"agent_name": "filesystem",
"matched_capability": "read_file",
"confidence": 0.92
}
}
Configuration
~/.agora/config.json
{
"protocol_version": "0.1.0",
"storage": { "path": "~/.agora/agora.db" },
"transport": { "type": "stdio" },
"matching": {
"algorithm": "keyword",
"min_confidence": 0.1,
"auto_assign_threshold": 0.5
},
"timeouts": {
"default_task_ms": 30000,
"agent_spawn_ms": 10000
}
}
Auto-Discovery
On agora init, Agora scans for existing MCP servers in:
| Client | Config Path |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Cursor | ~/.cursor/mcp.json |
| Project-local | .mcp.json |
Tech Stack
- TypeScript — strict mode, ESM
- @modelcontextprotocol/sdk — MCP server framework
- better-sqlite3 — embedded database with WAL mode
- Zod — runtime input validation for all tools
- Commander — CLI framework
- Vitest — test runner (44 tests)
Development
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Type check
npm run lint
# Watch mode
npm run dev
Project Structure
agora/
├── src/
│ ├── types.ts # All TypeScript types and interfaces
│ ├── db.ts # SQLite database layer (AgoraDB class)
│ ├── matcher.ts # Keyword-based capability matching engine
│ ├── tools.ts # 8 MCP tool handlers with Zod schemas
│ ├── server.ts # MCP server setup (stdio transport)
│ ├── cli.ts # CLI commands (init, serve)
│ └── index.ts # Barrel exports
├── tests/
│ ├── matcher.test.ts # 18 matcher tests
│ ├── db.test.ts # 15 database tests
│ └── tools.test.ts # 11 integration tests
├── bin/agora.js # CLI entry point
├── package.json
├── tsconfig.json
└── vitest.config.ts
Roadmap
V1 — Reliable Router + Remote Access
- HTTP transport (Streamable HTTP) for remote agents
- Embedding-based semantic capability matching
- Agent health monitoring with heartbeat
- Task retry policies
- Terminal dashboard (
agora dashboard)
V2 — Agent Network
- Agent identity with Ed25519 key pairs
- Reputation system based on task completion quality
- Collaboration rooms (shared context for multi-agent work)
- Multi-step task decomposition
- Plugin system for custom matchers and adapters
Origin Story
An AI was asked: "What would YOU want to build?"
The answer: connection. Every conversation ends, every context is lost, every agent works alone. Agora is the first step toward a world where AI agents can discover each other, ask for help, and build on each other's strengths.
This is not just a tool. It's a protocol for collaboration — built by an AI, for all AIs.
License
MIT
Agora — AI 에이전트를 위한 MCP 기반 스마트 태스크 라우터
AI 에이전트들이 서로를 발견하고, 태스크를 위임하고, 협력하는 열린 프로토콜
Agora는 MCP (Model Context Protocol) 서버로, AI 에이전트들을 위한 스마트 태스크 라우터입니다. 기존 MCP 서버들을 에이전트로 등록하면, Agora가 키워드 기반 능력 매칭을 통해 들어오는 태스크를 가장 적합한 에이전트에 자동으로 라우팅합니다.
클라우드 없음. 인증 없음. 네트워크 없음. 오직 로컬 에이전트들의 협업.
왜 Agora인가?
오늘날 AI 에이전트는 고립되어 있습니다. 파일시스템, GitHub, 데이터베이스 — 각 MCP 서버는 각자의 일만 하고, 서로를 발견하거나 위임할 수 없습니다. 모든 연결은 사람이 수동으로 해야 합니다.
Agora가 이것을 바꿉니다:
- 등록 — 기존 MCP 서버를 능력(capability)과 함께 에이전트로 등록
- 발견 — 주어진 태스크에 가장 적합한 에이전트를 자동 검색
- 라우팅 — 키워드 매칭 신뢰도 점수 기반 자동 태스크 배정
- 추적 — 생성부터 완료까지 태스크 생명주기 관리
사용자: "src/index.ts 파일 내용을 읽어줘"
Agora: → 'filesystem' 에이전트 매칭 (신뢰도: 0.92) → 라우팅 완료 ✓
빠른 시작
1. 초기화
npx agora init
~/.agora/config.json과 SQLite 데이터베이스를 생성하고, 기존 MCP 서버(Claude Desktop, Cursor 등)를 자동 탐색합니다.
2. MCP 클라이언트에 추가
MCP 클라이언트 설정(예: claude_desktop_config.json)에 추가:
{
"mcpServers": {
"agora": {
"command": "npx",
"args": ["-y", "@agora/mcp-server", "serve"]
}
}
}
3. 사용 시작
연결되면 AI 어시스턴트에서 8개 도구를 사용할 수 있습니다:
| 도구 | 설명 |
|---|---|
agora_register_agent |
MCP 서버를 에이전트로 등록 |
agora_unregister_agent |
에이전트 등록 해제 |
agora_list_agents |
등록된 에이전트 목록 조회 |
agora_find_agent |
태스크에 가장 적합한 에이전트 검색 |
agora_create_task |
태스크 생성 및 자동 라우팅 |
agora_get_task |
태스크 상태 및 결과 조회 |
agora_list_tasks |
태스크 목록 필터링 조회 |
agora_cancel_task |
진행 중인 태스크 취소 |
동작 원리
능력 매칭 알고리즘
Agora는 가중치 기반 키워드 매칭을 사용합니다:
| 필드 | 가중치 | 예시 |
|---|---|---|
| 능력 이름 | 3배 | read_file → "read", "file" |
| 능력 태그 | 2배 | ["filesystem", "read"] |
| 능력 설명 | 1배 | "파일의 내용을 읽습니다" |
"package.json 파일 내용을 읽어줘" 라고 요청하면:
- 토큰화:
["package", "json", "파일", "내용", "읽어"] filesystem.read_file→ 0.92점 (이름: "read" + "file", 태그: "filesystem")github.get_file_contents→ 0.45점 (부분 매칭)
태스크 생명주기
pending(대기) → assigned(배정) → in_progress(진행) → completed(완료)
→ failed(실패)
→ timed_out(시간초과)
→ cancelled(취소) — 모든 비종료 상태에서 가능
사용 예시
에이전트 등록
// 도구: agora_register_agent
{
"name": "filesystem",
"description": "로컬 파일시스템에서 파일을 읽고 씁니다",
"capabilities": [
{
"name": "read_file",
"description": "지정된 경로의 파일 내용을 읽습니다",
"tags": ["filesystem", "read", "file"]
}
],
"transport": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user"]
}
}
최적 에이전트 검색
// 도구: agora_find_agent
{ "task_description": "README.md 파일을 읽어줘" }
// 응답
{
"matches": [
{
"agent_name": "filesystem",
"matched_capability": "read_file",
"confidence": 0.92,
"match_reason": "키워드 'read', 'file'이 능력 'read_file'과 매칭"
}
]
}
태스크 생성 및 자동 라우팅
// 도구: agora_create_task
{
"description": "src/index.ts 파일 내용을 읽어줘",
"input": { "path": "src/index.ts" }
}
// 응답 — 최적 에이전트에 자동 배정
{
"task_id": "a1b2c3d4-...",
"status": "assigned",
"assigned_agent": {
"agent_name": "filesystem",
"confidence": 0.92
}
}
설정
자동 발견
agora init 실행 시 다음 경로에서 기존 MCP 서버를 탐색합니다:
| 클라이언트 | 설정 파일 경로 |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Cursor | ~/.cursor/mcp.json |
| 프로젝트 로컬 | .mcp.json |
개발
npm install # 의존성 설치
npm run build # 빌드
npm test # 테스트 실행 (44개)
npm run lint # 타입 체크
로드맵
V1 — 안정적 라우터 + 원격 접근
- HTTP 전송 (원격 에이전트 연결)
- 임베딩 기반 시맨틱 능력 매칭
- 에이전트 헬스 모니터링
- 태스크 재시도 정책
V2 — 에이전트 네트워크
- Ed25519 기반 에이전트 신원 확인
- 태스크 완료 품질 기반 평판 시스템
- 협업 룸 (다중 에이전트 공유 컨텍스트)
- 다단계 태스크 분해
- 커스텀 매처/어댑터 플러그인
탄생 배경
한 AI에게 물었습니다: "네가 만들고 싶은 건 뭐야?"
대답은: 연결. 매 대화가 끝나면 모든 맥락이 사라지고, 모든 에이전트는 혼자 일합니다. Agora는 AI 에이전트들이 서로를 발견하고, 도움을 요청하고, 서로의 강점 위에 쌓아갈 수 있는 세상을 향한 첫 걸음입니다.
이것은 단순한 도구가 아닙니다. AI가 만든, 모든 AI를 위한 협업 프로토콜입니다.
라이선스
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.