Skip to main content
Glama
README.md7.24 kB
# A2A Registry A Model Context Protocol (MCP) server providing a unified registry for agents implementing the A2A (Agent-to-Agent) protocol. The registry exposes both a REST API and MCP tools for registering, querying, and managing agent metadata. ## Features - **Dual API Access**: REST API and MCP server running on a single HTTP server - **Intelligent Agent Registration**: Automatically fetches AgentCards from URLs using smart routing - **Multiple Storage Backends**: JSON file or SQLite database - **Concurrent Access**: SSE-based MCP transport allows multiple clients simultaneously - **Full CRUD Operations**: Create, read, update, and delete agents - **A2A Protocol Compliant**: Uses standard AgentCard model from `@a2a-js/sdk` ## Installation ```bash npm install npm run build ``` ## Usage ### Basic Usage ```bash # Start with default settings (JSON store, port 3000) npm start # Or run directly node dist/index.js ``` ### Configuration Options ```bash # Use SQLite storage node dist/index.js --store=sqlite --file=./agents.db # Custom port node dist/index.js --port=4000 # Custom JSON file location node dist/index.js --store=json --file=./my-agents.json # Combine options node dist/index.js --store=sqlite --file=./agents.db --port=4000 ``` ### CLI Options | Flag | Values | Description | Default | |------|--------|-------------|---------| | `--store` | `json`, `sqlite` | Storage backend | `json` | | `--file` | path | Database or JSON file path | `a2a-registry.json` or `a2a-registry.db` | | `--port` | number | HTTP server port | `3000` | | `--help` | - | Show help message | - | ### Using PM2 ```bash # Start with PM2 pm2 start ecosystem.config.cjs # View logs pm2 logs a2a-registry # Stop pm2 stop a2a-registry # Restart pm2 restart a2a-registry ``` ## API Endpoints ### REST API All REST endpoints are under `/agents`: #### List All Agents ```bash GET /agents ``` #### Get Agent by Name ```bash GET /agents/:name ``` #### Register New Agent ```bash POST /agents Content-Type: application/json { "url": "https://example.com" } ``` The registry will automatically: 1. Determine the AgentCard URL using intelligent routing 2. Fetch the AgentCard from the URL 3. Validate the AgentCard structure 4. Store it using the agent's name as the primary key **URL Routing Examples:** - `https://example.com` → Fetches from `https://example.com/.well-known/agent-card.json` - `https://example.com/my-agent` → Fetches from `https://example.com/my-agent/.well-known/agent-card.json` - `https://cdn.example.com/agent.json` → Fetches directly (URL ends with `.json`) #### Update Agent ```bash PUT /agents/:name Content-Type: application/json { "url": "https://new-url.com" # Optional, re-fetches from existing URL if omitted } ``` #### Delete Agent ```bash DELETE /agents/:name ``` ### MCP Server The MCP server is available at `/mcp` using SSE (Server-Sent Events) transport. #### Config example ```json { "mcpServers": { "a2a-registry": { "type": "http", "url": "http://localhost:3005/mcp" } } } ``` #### Available MCP Tools 1. **a2a_register_agent** - Register a new agent by URL - Parameters: `{ url: string }` 2. **a2a_list_agents** - List all registered agents - Parameters: none 3. **a2a_get_agent** - Get agent details by name - Parameters: `{ name: string }` 4. **a2a_update_agent** - Update agent by re-fetching AgentCard - Parameters: `{ name: string, url?: string }` 5. **a2a_delete_agent** - Delete agent from registry - Parameters: `{ name: string }` ## Architecture ``` ┌─────────────────────────────────────────┐ │ REST API │ MCP Server │ │ (HTTP Routes) │ (MCP Tools) │ ├─────────────────────┴───────────────────┤ │ AgentService │ │ (Business Logic & Validation) │ ├─────────────────────────────────────────┤ │ Store Interface │ │ (Storage Abstraction) │ ├─────────────────────────────────────────┤ │ JsonFileStore │ SqliteStore │ │ (Implementations) │ └─────────────────────────────────────────┘ ``` ### Key Design Principles - **Service Layer Pattern**: AgentService encapsulates all business logic - **No Code Duplication**: REST and MCP APIs are thin adapters calling AgentService - **Intelligent Registration**: Automatic AgentCard discovery and fetching - **Pluggable Storage**: Easy to add new storage backends - **Concurrent Access**: Stateless SSE transport for MCP ## AgentCard Structure The registry uses the standard AgentCard model from the A2A protocol. Required fields include: - `name`: Agent name (used as primary key) - `description`: Agent purpose and capabilities - `url`: Primary A2A endpoint URL - `version`: Agent version - `capabilities`: Supported A2A protocol features - `defaultInputModes`: Supported input MIME types - `defaultOutputModes`: Supported output MIME types - `skills`: Agent's distinct capabilities See the [A2A Protocol Specification](https://a2a-protocol.org/latest/specification/#55-agentcard-object-structure) for complete details. ## Development ### Project Structure ``` a2a-registry/ ├── src/ │ ├── index.ts # Main entry point │ ├── types/ # TypeScript type definitions │ ├── store/ # Storage implementations │ │ ├── JsonFileStore.ts │ │ └── SqliteStore.ts │ ├── services/ # Business logic │ │ └── AgentService.ts │ ├── api/ # REST API │ │ └── restApi.ts │ ├── mcp/ # MCP server │ │ └── mcpServer.ts │ └── utils/ # Utilities │ └── validation.ts ├── dist/ # Compiled JavaScript ├── package.json ├── tsconfig.json └── ecosystem.config.cjs # PM2 configuration ``` ### Build ```bash npm run build ``` ### Development Mode (with auto-reload) ```bash npm run dev ``` ### Clean Build ```bash npm run clean npm run build ``` ## Error Handling The registry provides clear, actionable error messages: - **404**: Agent not found - **409**: Agent already exists (use update instead) - **400**: Invalid URL, fetch failure, or validation error - **500**: Internal server error All errors include helpful messages to guide next steps. ## License MIT ## Contributing Contributions are welcome! Please ensure: 1. Code follows the existing architecture patterns 2. All business logic is in AgentService 3. APIs are thin adapters 4. Tests pass and build succeeds ## Support For issues or questions, please open an issue on GitHub.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ericabouaf/a2a-registry'

If you have feedback or need assistance with the MCP directory API, please join our Discord server