{"id":48446133,"url":"https://github.com/oaslananka/a2a-mesh","last_synced_at":"2026-05-08T23:21:17.507Z","repository":{"id":348604086,"uuid":"1198942964","full_name":"oaslananka/a2a-mesh","owner":"oaslananka","description":"TypeScript runtime for Google's Agent2Agent (A2A) Protocol","archived":false,"fork":false,"pushed_at":"2026-04-02T00:00:59.000Z","size":378,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-02T09:46:26.296Z","etag":null,"topics":["a2a","agent2agent","ai-agents","interoperability","llm-orchestration","multi-agent","nodejs","open-source","protocol","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oaslananka.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":"AUDIT.md","citation":null,"codeowners":".github/CODEOWNERS","security":".github/SECURITY.md","support":".github/SUPPORT.md","governance":".github/GOVERNANCE.md","roadmap":".github/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["oaslananka"]}},"created_at":"2026-04-01T23:06:19.000Z","updated_at":"2026-04-02T00:01:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oaslananka/a2a-mesh","commit_stats":null,"previous_names":["oaslananka/a2a-mesh"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/oaslananka/a2a-mesh","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oaslananka%2Fa2a-mesh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oaslananka%2Fa2a-mesh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oaslananka%2Fa2a-mesh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oaslananka%2Fa2a-mesh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oaslananka","download_url":"https://codeload.github.com/oaslananka/a2a-mesh/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oaslananka%2Fa2a-mesh/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31483380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a2a","agent2agent","ai-agents","interoperability","llm-orchestration","multi-agent","nodejs","open-source","protocol","typescript"],"created_at":"2026-04-06T18:00:56.457Z","updated_at":"2026-05-08T23:21:17.501Z","avatar_url":"https://github.com/oaslananka.png","language":"TypeScript","funding_links":["https://github.com/sponsors/oaslananka"],"categories":["⚙️ Implementations \u0026 Libraries"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003ea2a-mesh\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eSecurity-hardened TypeScript runtime for Google's Agent-to-Agent (A2A) Protocol\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003eThe missing infrastructure layer for multi-agent AI systems.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/a2a-mesh\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/a2a-mesh?style=flat-square\u0026color=2563eb\" alt=\"npm version\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/a2a-mesh\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/dm/a2a-mesh?style=flat-square\u0026color=0f766e\" alt=\"npm downloads\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/coverage-%E2%89%A585%25-brightgreen?style=flat-square\" alt=\"Coverage\" /\u003e\n  \u003ca href=\"./LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square\" alt=\"License\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://google.github.io/A2A\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/A2A%20Protocol-v1.0-1d4ed8?style=flat-square\" alt=\"A2A Protocol\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Node.js-%3E%3D20-15803d?style=flat-square\" alt=\"Node.js\" /\u003e\n\u003c/p\u003e\n\n---\n\n## The problem\n\nEvery AI framework has its own way of making agents talk to each other. Getting a LangChain\nagent to delegate work to an OpenAI-backed agent over HTTP usually means rebuilding transport,\nauth, retries, streaming, task state, discovery, and observability from scratch.\n\n**Google's A2A Protocol** defines the wire standard. `a2a-mesh` is the runtime, registry, and\nintegration toolkit that makes it practical to build with.\n\n---\n\n## What you get\n\n| Capability                    | Details                                                                                                     |\n| ----------------------------- | ----------------------------------------------------------------------------------------------------------- |\n| **A2A Protocol v1.0 runtime** | JSON-RPC handling, SSE streaming, push notifications, health endpoints, agent cards                         |\n| **Multi-framework adapters**  | OpenAI, Anthropic, LangChain, Google ADK, LlamaIndex, CrewAI HTTP bridge                                    |\n| **Registry control plane**    | Agent discovery, capability matching, health polling, SSE registry updates, Redis backend                   |\n| **Security controls**         | Verified JWT/JWKS and API-key auth, typed request context, tenant-aware task access, SSRF and origin policy |\n| **Observability**             | OpenTelemetry span hooks, structured audit logs, registry metrics, Grafana and alerting artifacts           |\n| **Network resilience**        | Retry, exponential backoff, jitter, timeouts, circuit breaker primitives                                    |\n| **Transport extensions**      | WebSocket transport package today, gRPC transport package in experimental form                              |\n| **Testing toolkit**           | `A2ATestServer`, `MockA2AClient`, fixtures, matchers, integration tests                                     |\n| **Scaffolding CLI**           | `pnpm dlx create-a2a-mesh` for new agents and multi-agent starter packs                                     |\n\n---\n\n## Try it in 30 seconds\n\n```bash\npnpm dlx create-a2a-mesh demo\ncd demo\npnpm install\npnpm run dev\n```\n\nThen send a task:\n\n```bash\ncurl -s -X POST http://localhost:3000/rpc \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"message/send\",\"params\":{\"message\":{\"role\":\"user\",\"messageId\":\"m1\",\"timestamp\":\"2026-04-06T00:00:00.000Z\",\"parts\":[{\"type\":\"text\",\"text\":\"Hello agent!\"}]}}}'\n```\n\nYou will see a task get created, completed, and returned through the A2A runtime immediately.\n\n---\n\n## Quickstart\n\nFor a real multi-agent starter pack:\n\n```bash\npnpm dlx create-a2a-mesh my-team --adapter pack-research-team\ncd my-team\ncp .env.example .env\n# add OPENAI_API_KEY to .env\npnpm install\npnpm run dev\n```\n\nThis pack starts a local registry plus multiple agents wired together through A2A. The raw\nregistry catalog is available at `http://localhost:3099/agents`.\n\n### Or install manually\n\n```bash\npnpm add a2a-mesh\n```\n\n```ts\nimport { A2AServer, type AgentCard, type Artifact, type Message, type Task } from 'a2a-mesh';\n\nconst card: AgentCard = {\n  protocolVersion: '1.0',\n  name: 'My Agent',\n  description: 'Does one thing well',\n  url: 'http://localhost:3001',\n  version: '1.0.0',\n  capabilities: {\n    streaming: true,\n    pushNotifications: false,\n    stateTransitionHistory: true,\n  },\n  skills: [\n    {\n      id: 'hello',\n      name: 'Hello',\n      description: 'Says hello back',\n      tags: ['demo'],\n      inputModes: ['text'],\n      outputModes: ['text'],\n    },\n  ],\n  defaultInputModes: ['text'],\n  defaultOutputModes: ['text'],\n  securitySchemes: [],\n};\n\nclass MyAgent extends A2AServer {\n  constructor() {\n    super(card);\n  }\n\n  async handleTask(_task: Task, message: Message): Promise\u003cArtifact[]\u003e {\n    const text = message.parts.find((part) =\u003e part.type === 'text');\n\n    return [\n      {\n        artifactId: 'reply-1',\n        parts: [\n          {\n            type: 'text',\n            text: `Hello from a2a-mesh. You said: ${text?.type === 'text' ? text.text : ''}`,\n          },\n        ],\n        index: 0,\n        lastChunk: true,\n      },\n    ];\n  }\n}\n\nnew MyAgent().start(3001);\nconsole.log('Agent running at http://localhost:3001');\n```\n\n---\n\n## Framework adapters\n\n```ts\n// OpenAI\nimport OpenAI from 'openai';\nimport { OpenAIAdapter } from 'a2a-mesh-adapters';\n\nclass MyOpenAIAgent extends OpenAIAdapter {\n  constructor() {\n    super(card, new OpenAI({ apiKey: process.env.OPENAI_API_KEY }), 'gpt-5-mini');\n  }\n}\n\n// Anthropic Claude\nimport Anthropic from '@anthropic-ai/sdk';\nimport { AnthropicAdapter } from 'a2a-mesh-adapters';\n\nclass MyClaudeAgent extends AnthropicAdapter {\n  constructor() {\n    super(\n      card,\n      new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }),\n      'claude-sonnet-4-20250514',\n    );\n  }\n}\n\n// LangChain\nimport { LangChainAdapter } from 'a2a-mesh-adapters';\n\nconst runnable = {\n  async invoke(input: unknown) {\n    return JSON.stringify(input);\n  },\n};\n\nclass MyLangChainAgent extends LangChainAdapter {\n  constructor() {\n    super(card, runnable);\n  }\n}\n```\n\n---\n\n## MCP bridge\n\nExpose any A2A agent as an MCP tool:\n\n```ts\nimport { createMcpToolFromAgent, handleA2AMcpToolCall } from 'a2a-mesh-mcp-bridge';\n\nconst config = {\n  agentUrl: 'http://localhost:3001',\n  name: 'researcher',\n  description: 'Searches and summarizes web content.',\n};\n\nconst tool = createMcpToolFromAgent(config);\nconst result = await handleA2AMcpToolCall(config, {\n  message: 'Summarize the latest A2A protocol changes.',\n});\n```\n\nWrap an MCP tool definition as an A2A-discoverable skill:\n\n```ts\nimport { createA2ASkillFromMcpTool } from 'a2a-mesh-mcp-bridge';\n\nconst skill = createA2ASkillFromMcpTool(tool, {\n  tags: ['search', 'mcp'],\n  inputModes: ['json'],\n});\n```\n\n---\n\n## Architecture\n\n```text\n┌──────────────────── Control Plane ────────────────────┐\n│ Registry UI                                             │\n│ Topology · Live task stream · Health · Search           │\n└────────────────────────────┬───────────────────────────┘\n                             │ SSE / HTTP\n                      ┌──────▼──────┐\n                      │  Registry   │ ← InMemory or Redis\n                      │   :3099     │\n                      └──┬──────┬───┘\n                         │      │\n               Register +│      │Search / heartbeats\n                         │      │\n                ┌────────▼──┐  ┌▼────────────┐\n                │  Agent A  │  │   Agent B   │\n                │   :3001   │◄─►    :3002    │\n                └───────────┘  └─────────────┘\n                       │               │\n                 MCP bridge      OpenAI / Anthropic /\n                                  LangChain / ADK / ...\n```\n\n---\n\n## Packages\n\n| Package               | Status   | Description                                                                  |\n| --------------------- | -------- | ---------------------------------------------------------------------------- |\n| `a2a-mesh`            | npm      | Core runtime: server, client, auth, telemetry, storage                       |\n| `a2a-mesh-adapters`   | npm      | Framework adapters for OpenAI, Anthropic, LangChain, ADK, CrewAI, LlamaIndex |\n| `a2a-mesh-registry`   | npm      | Registry server with discovery, health polling, SSE updates                  |\n| `a2a-mesh-cli`        | npm      | CLI for discovery, validation, sending, monitoring, and scaffolding          |\n| `create-a2a-mesh`     | npm      | Project scaffolder                                                           |\n| `a2a-mesh-client`     | monorepo | Standalone client surface kept in-repo today                                 |\n| `a2a-mesh-testing`    | monorepo | Testing helpers, fixtures, and matchers                                      |\n| `a2a-mesh-mcp-bridge` | monorepo | MCP ↔ A2A bridge, prepared for npm release                                   |\n| `a2a-mesh-ws`         | monorepo | Experimental WebSocket transport                                             |\n| `a2a-mesh-grpc`       | monorepo | Experimental gRPC transport                                                  |\n\n---\n\n## Deployment\n\n**Docker Compose** runs the registry, demo agents, Redis, and Jaeger locally:\n\n```bash\ndocker compose up\n```\n\nSee [docs/deployment.md](./docs/deployment.md) for manual deployment guidance covering Docker,\nKubernetes, Cloud Run, Railway, and docs-site publishing without GitHub Actions.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md). Use Conventional Commits and run the local verification\nsuite before opening a PR.\n\n---\n\n## License\n\nApache 2.0 — see [LICENSE](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foaslananka%2Fa2a-mesh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foaslananka%2Fa2a-mesh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foaslananka%2Fa2a-mesh/lists"}