{"_id":"@a2anet/openclaw-a2a-plugin","_rev":"6-3eb44b84810a174c96c0f4c167406d91","name":"@a2anet/openclaw-a2a-plugin","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@a2anet/openclaw-a2a-plugin","version":"0.1.0","keywords":["a2a","agent-to-agent","openclaw","plugin"],"author":{"name":"A2A Net","email":"hello@a2anet.com"},"license":"Apache-2.0","_id":"@a2anet/openclaw-a2a-plugin@0.1.0","maintainers":[{"name":"benclarkenpm","email":"ben@a2anet.com"}],"homepage":"https://github.com/a2anet/openclaw-a2a-plugin#readme","bugs":{"url":"https://github.com/a2anet/openclaw-a2a-plugin/issues"},"dist":{"shasum":"93a5fe193b2080465b12232f3889ad14825b9794","tarball":"https://registry.npmjs.org/@a2anet/openclaw-a2a-plugin/-/openclaw-a2a-plugin-0.1.0.tgz","fileCount":48,"integrity":"sha512-GBhydkDaxteNDVsi0auIQloitOLVYS+YHBKMN1/Y4vqvT0/hEv06wwv+Z7cL5kxrl1sTbX5PNVhZ1afvUG+pDg==","signatures":[{"sig":"MEYCIQC4BQY71aMDqe44MDhoX/lP83DVHfMfd9aRAeDTW1BcTAIhAPtB8+PUj8umG2D/K7CljS7q+5ZwxJR5BNEBzg8t5k+0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165551},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e98051bf8b9ff729c541e63c09efa9354de02f4a","scripts":{"test":"bun test","build":"tsc","check":"biome check .","check:fix":"biome check --write .","typecheck":"tsc --noEmit","test:coverage":"bun test --coverage"},"_npmUser":{"name":"benclarkenpm","email":"ben@a2anet.com"},"openclaw":{"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/a2anet/openclaw-a2a-plugin.git","type":"git"},"_npmVersion":"10.9.4","description":"A2A protocol plugin for OpenClaw. Send messages to remote A2A agents and allow others to connect to your agent.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","zod":"^3.25.0","@a2a-js/sdk":"^0.3.10","@a2anet/a2a-utils":"^0.7.1","@sinclair/typebox":"^0.34.0","zod-to-json-schema":"^3.25.1"},"_hasShrinkwrap":false,"devDependencies":{"openclaw":"^2026.4.8","@types/ws":"^8.0.0","@types/bun":"latest","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"peerDependencies":{"openclaw":">=2026.4.8"},"trustedDependencies":["@biomejs/biome"],"_npmOperationalInternal":{"tmp":"tmp/openclaw-a2a-plugin_0.1.0_1775785884787_0.25139070217495685","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@a2anet/openclaw-a2a-plugin","version":"0.1.1","keywords":["a2a","agent-to-agent","openclaw","plugin"],"author":{"name":"A2A Net","email":"hello@a2anet.com"},"license":"Apache-2.0","_id":"@a2anet/openclaw-a2a-plugin@0.1.1","maintainers":[{"name":"benclarkenpm","email":"ben@a2anet.com"}],"homepage":"https://github.com/a2anet/openclaw-a2a-plugin#readme","bugs":{"url":"https://github.com/a2anet/openclaw-a2a-plugin/issues"},"dist":{"shasum":"856c9a6a0908060deb8d58ec0a7d1c871b229f23","tarball":"https://registry.npmjs.org/@a2anet/openclaw-a2a-plugin/-/openclaw-a2a-plugin-0.1.1.tgz","fileCount":44,"integrity":"sha512-PhgNtpOLlRtdz9hh3ReQumg8p0E2CB+9JQB0BUMWw8PfXVwmIBuMbJieyP2tqeiRpe/F19ihbpzRmdW1dWU5vw==","signatures":[{"sig":"MEUCIBVH7Iw83aG19bwpwc2HL9hZguBULRcjjH0Brld/xqXIAiEAoP77JvDzx9jfCetl5bhHDb9luY/YJHg8Rcil7TzYHKU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a2anet%2fopenclaw-a2a-plugin@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":156645},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f7371d301dd4ee3525ac12bcafb5c0a6e138f360","scripts":{"test":"bun test","build":"tsc","check":"biome check .","check:fix":"biome check --write .","typecheck":"tsc --noEmit","test:coverage":"bun test --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ef3c55f1-1042-49f4-82b3-dc000ad52303"}},"openclaw":{"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/a2anet/openclaw-a2a-plugin.git","type":"git"},"_npmVersion":"11.11.0","description":"A2A protocol plugin for OpenClaw. Send messages to remote A2A agents and allow others to connect to your agent.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.19.0","zod":"^3.25.0","@a2a-js/sdk":"^0.3.10","@a2anet/a2a-utils":"^0.7.2","@sinclair/typebox":"^0.34.0","zod-to-json-schema":"^3.25.1"},"_hasShrinkwrap":false,"devDependencies":{"openclaw":"^2026.4.8","@types/ws":"^8.0.0","@types/bun":"latest","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"peerDependencies":{"openclaw":">=2026.4.8"},"trustedDependencies":["@biomejs/biome"],"_npmOperationalInternal":{"tmp":"tmp/openclaw-a2a-plugin_0.1.1_1776363872782_0.2035426817584136","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@a2anet/openclaw-a2a-plugin","version":"0.1.2","keywords":["a2a","agent-to-agent","openclaw","plugin"],"author":{"name":"A2A Net","email":"hello@a2anet.com"},"license":"Apache-2.0","_id":"@a2anet/openclaw-a2a-plugin@0.1.2","maintainers":[{"name":"benclarkenpm","email":"ben@a2anet.com"}],"homepage":"https://github.com/a2anet/openclaw-a2a-plugin#readme","bugs":{"url":"https://github.com/a2anet/openclaw-a2a-plugin/issues"},"dist":{"shasum":"853680530ea9c31b83b640fb8c31f7d690888a37","tarball":"https://registry.npmjs.org/@a2anet/openclaw-a2a-plugin/-/openclaw-a2a-plugin-0.1.2.tgz","fileCount":44,"integrity":"sha512-pn7JHReWu0v0pmdIFyWJGjz2pFV0ZrC3l2V9AArtUzij+NqHreV8e377QjocD30s87jMHD4Czev3YVeXLAfumQ==","signatures":[{"sig":"MEYCIQCkVvDYCmcUVgaWSn7qCfzNP2exEERsrq4xouU2fa+LPgIhAIgV3YCPHDLkltBvEn2t/1mMnVuCfJ3D1JWtJ1SwEwKL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a2anet%2fopenclaw-a2a-plugin@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":156878},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f9e9ac6f7f67923068efc735fcd94630a1dc92d7","scripts":{"test":"bun test","build":"tsc","check":"biome check .","check:fix":"biome check --write .","typecheck":"tsc --noEmit","test:coverage":"bun test --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ef3c55f1-1042-49f4-82b3-dc000ad52303"}},"openclaw":{"build":{"openclawVersion":"2026.4.8","pluginSdkVersion":"2026.4.8"},"compat":{"pluginApi":">=2026.4.8","minGatewayVersion":"2026.4.8"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/a2anet/openclaw-a2a-plugin.git","type":"git"},"_npmVersion":"11.11.0","description":"A2A protocol plugin for OpenClaw. Send messages to remote A2A agents and allow others to connect to your agent.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.19.0","zod":"^3.25.0","@a2a-js/sdk":"^0.3.10","@a2anet/a2a-utils":"^0.7.2","@sinclair/typebox":"^0.34.0","zod-to-json-schema":"^3.25.1"},"_hasShrinkwrap":false,"devDependencies":{"openclaw":"^2026.4.8","@types/ws":"^8.0.0","@types/bun":"latest","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"peerDependencies":{"openclaw":">=2026.4.8"},"trustedDependencies":["@biomejs/biome"],"_npmOperationalInternal":{"tmp":"tmp/openclaw-a2a-plugin_0.1.2_1777330188161_0.9368298558864909","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@a2anet/openclaw-a2a-plugin","version":"0.1.3","keywords":["a2a","agent-to-agent","openclaw","plugin"],"author":{"name":"A2A Net","email":"hello@a2anet.com"},"license":"Apache-2.0","_id":"@a2anet/openclaw-a2a-plugin@0.1.3","maintainers":[{"name":"benclarkenpm","email":"ben@a2anet.com"}],"homepage":"https://github.com/a2anet/openclaw-a2a-plugin#readme","bugs":{"url":"https://github.com/a2anet/openclaw-a2a-plugin/issues"},"dist":{"shasum":"84e9cade9f8bbb5e991e2896efa967bf8871694d","tarball":"https://registry.npmjs.org/@a2anet/openclaw-a2a-plugin/-/openclaw-a2a-plugin-0.1.3.tgz","fileCount":44,"integrity":"sha512-r9tb+tJ6irx9bbr8bcOKBKQLtuVHKky/PjgRJJcsLFW9jqG1fmUF4Lerq5TQA5Oq3bSqAB3DEYkxoGiEjGbDfQ==","signatures":[{"sig":"MEYCIQCwc11s4XOWH+li6Jgx6IrQnmVy4SVb07USgDDKnPm1DQIhAOPCI7gksYxLLpXm1JvjBwS4QqxbASEfN3TJgwSQG9uW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a2anet%2fopenclaw-a2a-plugin@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":156914},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"1f0ac847b37d41b3fd50ba2030f4c1fc65b571c8","scripts":{"test":"bun test","build":"tsc","check":"biome check .","check:fix":"biome check --write .","typecheck":"tsc --noEmit","test:coverage":"bun test --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ef3c55f1-1042-49f4-82b3-dc000ad52303"}},"openclaw":{"build":{"openclawVersion":"2026.4.8","pluginSdkVersion":"2026.4.8"},"compat":{"pluginApi":">=2026.4.8","minGatewayVersion":"2026.4.8"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/a2anet/openclaw-a2a-plugin.git","type":"git"},"_npmVersion":"11.11.0","description":"A2A protocol plugin for OpenClaw. Send messages to remote A2A agents and allow others to connect to your agent.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ws":"^8.19.0","zod":"^3.25.0","@a2a-js/sdk":"^0.3.10","@a2anet/a2a-utils":"^0.7.2","@sinclair/typebox":"^0.34.0","zod-to-json-schema":"^3.25.1"},"_hasShrinkwrap":false,"devDependencies":{"openclaw":"^2026.4.8","@types/ws":"^8.0.0","@types/bun":"latest","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"peerDependencies":{"openclaw":">=2026.4.8"},"trustedDependencies":["@biomejs/biome"],"_npmOperationalInternal":{"tmp":"tmp/openclaw-a2a-plugin_0.1.3_1778239504628_0.6751257839613383","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@a2anet/openclaw-a2a-plugin","version":"0.1.4","keywords":["a2a","agent-to-agent","openclaw","plugin"],"author":{"name":"A2A Net","email":"hello@a2anet.com"},"license":"Apache-2.0","_id":"@a2anet/openclaw-a2a-plugin@0.1.4","maintainers":[{"name":"benclarkenpm","email":"ben@a2anet.com"}],"homepage":"https://github.com/a2anet/openclaw-a2a-plugin#readme","bugs":{"url":"https://github.com/a2anet/openclaw-a2a-plugin/issues"},"dist":{"shasum":"38ec90d7739fa745557012a7359148b3f0774e1b","tarball":"https://registry.npmjs.org/@a2anet/openclaw-a2a-plugin/-/openclaw-a2a-plugin-0.1.4.tgz","fileCount":44,"integrity":"sha512-T0ybsO3/gaDpo1wvdklAt1c1dx9pjj2CLOEibAkfld7GA4aZJkgSvLdHoNVNwanpkDB8rUkDjJEcMMxluJj8BA==","signatures":[{"sig":"MEYCIQCLZVsjvy7Dt+aL6m7/FVvFsan2aIk1499tFRCUQ/Ix0QIhANhb24eHI5Y1bZCjFGuMxS+z2dEo984/+ZQiE36xp0Ja","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a2anet%2fopenclaw-a2a-plugin@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":158199},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4d230c446c978c81ae6de306210a0f38f361fca8","scripts":{"test":"bun test","build":"tsc","check":"biome check .","check:fix":"biome check --write .","typecheck":"tsc --noEmit","test:coverage":"bun test --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ef3c55f1-1042-49f4-82b3-dc000ad52303"}},"openclaw":{"build":{"openclawVersion":"2026.4.8","pluginSdkVersion":"2026.4.8"},"compat":{"pluginApi":">=2026.4.8","minGatewayVersion":"2026.4.8"},"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/a2anet/openclaw-a2a-plugin.git","type":"git"},"_npmVersion":"11.12.1","description":"A2A protocol plugin for OpenClaw. Send messages to remote A2A agents and allow others to connect to your agent.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ws":"^8.19.0","zod":"^3.25.0","@a2a-js/sdk":"^0.3.10","@a2anet/a2a-utils":"^0.7.2","@sinclair/typebox":"^0.34.0","zod-to-json-schema":"^3.25.1"},"_hasShrinkwrap":false,"devDependencies":{"openclaw":"^2026.4.8","@types/ws":"^8.0.0","@types/bun":"latest","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"peerDependencies":{"openclaw":">=2026.4.8"},"trustedDependencies":["@biomejs/biome"],"_npmOperationalInternal":{"tmp":"tmp/openclaw-a2a-plugin_0.1.4_1779316432680_0.9665127972859526","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@a2anet/openclaw-a2a-plugin","version":"0.2.0","description":"A2A protocol plugin for OpenClaw. Send messages to remote A2A agents and allow others to connect to your agent.","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"tsc","check":"biome check .","check:fix":"biome check --write .","typecheck":"tsc --noEmit","test":"bun test","test:coverage":"bun test --coverage","test:e2e":"RUN_E2E=1 bun test tests/e2e"},"openclaw":{"extensions":["./dist/index.js"],"compat":{"pluginApi":">=2026.4.8","minGatewayVersion":"2026.4.8"},"build":{"openclawVersion":"2026.4.8","pluginSdkVersion":"2026.4.8"}},"keywords":["a2a","agent-to-agent","openclaw","plugin"],"author":{"name":"A2A Net","email":"hello@a2anet.com"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/a2anet/openclaw-a2a-plugin.git"},"bugs":{"url":"https://github.com/a2anet/openclaw-a2a-plugin/issues"},"homepage":"https://github.com/a2anet/openclaw-a2a-plugin#readme","dependencies":{"@a2a-js/sdk":"^0.3.10","@a2anet/a2a-utils":"^0.7.2","@sinclair/typebox":"^0.34.0","ws":"^8.19.0","zod":"^3.25.0","zod-to-json-schema":"^3.25.1"},"peerDependencies":{"openclaw":">=2026.4.8"},"devDependencies":{"@biomejs/biome":"^1.9.0","@types/bun":"latest","@types/ws":"^8.0.0","openclaw":"^2026.4.8","typescript":"^5.7.0"},"trustedDependencies":["@biomejs/biome"],"gitHead":"e7e1d8a45fa696e977ab78aee7c133dcd54c7657","_id":"@a2anet/openclaw-a2a-plugin@0.2.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-MRqxGhpYtWPv0GUgeEQqcbMI35Ow1VWWu66+KD29ZXccUPPUfLt+iUaiD4Zd9WjvTGG4pT+vaVFGvbbZE4wzzQ==","shasum":"3ee73f2b03ca670fcc3282cdd3d3c973f15138c0","tarball":"https://registry.npmjs.org/@a2anet/openclaw-a2a-plugin/-/openclaw-a2a-plugin-0.2.0.tgz","fileCount":48,"unpackedSize":178505,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@a2anet%2fopenclaw-a2a-plugin@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDIS/Khj08UrBBNJuKa7ho5sKPKDzZ6mAXk86eP8EuSGgIgGPKJaGp5RyqlBrQOgBARekqhg9DGSbVuUdiYqtn/SRg="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ef3c55f1-1042-49f4-82b3-dc000ad52303"}},"directories":{},"maintainers":[{"name":"benclarkenpm","email":"ben@a2anet.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openclaw-a2a-plugin_0.2.0_1779737015423_0.6213301870904078"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-10T01:51:24.691Z","modified":"2026-05-25T19:23:36.086Z","0.1.0":"2026-04-10T01:51:24.933Z","0.1.1":"2026-04-16T18:24:32.918Z","0.1.2":"2026-04-27T22:49:48.291Z","0.1.3":"2026-05-08T11:25:04.788Z","0.1.4":"2026-05-20T22:33:52.830Z","0.2.0":"2026-05-25T19:23:35.636Z"},"bugs":{"url":"https://github.com/a2anet/openclaw-a2a-plugin/issues"},"author":{"name":"A2A Net","email":"hello@a2anet.com"},"license":"Apache-2.0","homepage":"https://github.com/a2anet/openclaw-a2a-plugin#readme","keywords":["a2a","agent-to-agent","openclaw","plugin"],"repository":{"type":"git","url":"git+https://github.com/a2anet/openclaw-a2a-plugin.git"},"description":"A2A protocol plugin for OpenClaw. Send messages to remote A2A agents and allow others to connect to your agent.","maintainers":[{"name":"benclarkenpm","email":"ben@a2anet.com"}],"readme":"# OpenClaw A2A Plugin\n\n![OpenClaw A2A Plugin](images/openclaw-a2a-plugin-banner.png)\n\n[![npm version](https://img.shields.io/npm/v/@a2anet/openclaw-a2a-plugin.svg)](https://www.npmjs.com/package/@a2anet/openclaw-a2a-plugin) [![License](https://img.shields.io/github/license/a2anet/openclaw-a2a-plugin)](https://github.com/a2anet/openclaw-a2a-plugin/blob/main/LICENSE) [![A2A Protocol](https://img.shields.io/badge/A2A-Protocol-blue)](https://a2a-protocol.org) [![Discord](https://img.shields.io/discord/1391916121589944320?color=7289da&label=Discord&logo=discord&logoColor=white)](https://discord.gg/674NGXpAjU)\n\n[OpenClaw](https://openclaw.ai) [A2A protocol](https://a2a-project.org/) community plugin.\nSend messages and files to other agents over the internet, and/or allow your agent to receive messages and files with Tailscale.\nThe plugin is powered by [A2A Utils](https://github.com/a2anet/a2a-utils), a comprehensive set of utility functions for using [A2A servers (remote agents)](https://a2a-protocol.org/latest/topics/key-concepts/#core-actors-in-a2a-interactions), that powers the [A2A MCP Server](https://github.com/a2anet/a2a-mcp).\n\nThe plugin gives your agent 6 tools to send messages and files to other agents without relying on a third-party chat app or email:\n\n- `a2a_get_agents` to list the agents it's connected to\n- `a2a_get_agent` to view an agent's skills in detail\n- `a2a_send_message` to send messages and files. The agent will respond with a `context_id` and `task_id`, which your agent can use to continue the conversation.\n- `a2a_get_task` to poll for a response if either agent loses connection or a response hasn't been recieved in over a minute\n- `a2a_view_text_artifact` to view large text responses that have been minimised\n- `a2a_view_data_artifact` to view large data responses that have been minimised\n\nThe plugin also allows your agent to receive messages and files with Tailscale and other reverse proxies (nginx, Caddy, etc).\nIt's secure by default, requiring you to generate an API key (`openclaw a2a generate-key <label>`) for each agent you want to give access to.\nYour agent will see the sender (`<label>`), and each inbound message creates a separate conversation that is identified by the sender (`<label>`) and `context_id`.\nThis way, your agent can support multiple conversations simulateneously, including from the same sender.\n\n## 📺 Demo\n\nWatch [OpenClaw A2A Plugin Demo - Connect your OpenClaw to other OpenClaws (and agents) over the internet](https://youtu.be/bodb7ATn5nc?si=9uVltb4K6-4Z8hPE) on YouTube.\n\n## 📦 Installation\n\nInstall the plugin:\n\n```bash\nopenclaw plugins install @a2anet/openclaw-a2a-plugin\n```\n\nRestart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nFollow the set up instructions in \"📤 Sending Messages (outbound)\" and/or \"📥 Receiving Messages (inbound)\".\n\n## 💡 Use Cases\n\n- Connect your OpenClaw to a company-wide OpenClaw to ask questions, give updates, and access company accounts and services\n- Connect your OpenClaw to agents on A2A marketplaces to ehance OpenClaw's capabilities\n- Connect a sandboxed local OpenClaw to a full access cloud OpenClaw to efficiently share context and files\n- Connect your OpenClaw to a hackathon teammate's to sync code plans when vibe coding at the same time to avoid merge conflicts\n- Connect your OpenClaw to a classmate's or co-worker's to work together on a project\n- Connect your OpenClaw to a friend's to plan a fun day out based on what it knows about you\n\n## ✨ Features\n\n- **Send messages to remote agents** — 6 outbound tools (`a2a_get_agents`, `a2a_get_agent`, `a2a_send_message`, `a2a_get_task`, `a2a_view_text_artifact`, `a2a_view_data_artifact`) for communicating with any A2A agent\n- **Receive messages from remote agents** — expose your OpenClaw agent as an A2A server with Agent Card discovery, JSON-RPC 2.0 endpoint, and SSE streaming\n- **Host multiple agents** — expose several agents from one gateway, each with its own `/a2a/<agentId>` endpoint, Agent Card discovery URL, and card metadata\n- **Send and receive files** — outbound messages can include local file paths (up to 1MB) or URLs; inbound files are saved locally\n- **Multi-turn conversations** — continue conversations across multiple messages using `context_id`\n- **Long-running task support** — if `a2a_send_message` times out, use `a2a_get_task` to monitor until the task reaches a terminal state\n- **Automatic artifact minimization** — large text and data artifacts are automatically minimized for LLM context windows, with dedicated tools for detailed navigation\n- **Inbound authentication** — API key-based auth with timing-safe HMAC-SHA256 comparison, per-key labels, and CLI key management\n- **Live Agent Card updates** — update your agent's name, description, and skills at runtime with `a2a_update_agent_card` without restarting\n- **Tailscale integration** — expose your agent to the internet via Tailscale Funnel, or restrict to your tailnet with Tailscale Serve\n- **Custom headers and outbound auth** — per-agent custom headers with `${ENV_VAR}` substitution for secrets\n- **Configurable timeouts and limits** — control character limits, timeouts, poll intervals, and whether to enable task and file storage\n\n## 🤖 A2A Core Concepts\n\nThe [A2A protocol](https://a2a-project.org/) is a protocol for agent-to-agent communication supported by AWS, Azure, GCP, and [150+ enterprises](https://a2a-protocol.org/latest/partners/).\n\n- **Agent Card** — A JSON object at a publicly available URL (e.g. `/.well-known/agent-card.json`) that describes an agent (name, description, skills, etc).\n- **Message** — a single communication turn between agents, containing one or\n  more Parts. Each message has a role (`user` or `agent`).\n- **Part** — content within a Message, Task, or Artifact: text (`TextPart`), JSON data (`DataPart`), or files (`FilePart`).\n- **Task** — a unit of work with a unique ID. Useful for long-running tasks, agents can disconnect and poll intermittently.\n- **Artifact** — output produced by a task (e.g. generated text, JSON data, files).\n\n## 📤 Sending Messages (outbound)\n\n### Set Up\n\nConfigure at least one remote agent in your OpenClaw config. You just need the\nremote agent's Agent Card URL (and API key, if required). No Tailscale or port\nexposure needed.\n\n```json\n{\n    \"tools\": {\n        \"profile\": \"full\"\n    },\n    \"plugins\": {\n        \"entries\": {\n            \"a2a\": {\n                \"enabled\": true,\n                \"config\": {\n                    \"outbound\": {\n                        \"agents\": {\n                            \"weather\": {\n                                \"url\": \"https://weather-agent.example.com/.well-known/agent-card.json\"\n                            },\n                            \"search\": {\n                                \"url\": \"https://example.com/search-agent/agent-card.json\",\n                                \"custom_headers\": {\n                                    \"Authorization\": \"Bearer ${SEARCH_API_KEY}\"\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    },\n    \"sandbox\": {\n        \"tools\": {\n            \"alsoAllow\": [\n                \"a2a_get_agents\",\n                \"a2a_get_agent\",\n                \"a2a_send_message\",\n                \"a2a_get_task\",\n                \"a2a_view_text_artifact\",\n                \"a2a_view_data_artifact\"\n            ]\n        }\n    }\n}\n```\n\n> **Note:** Header values support `${ENV_VAR}` substitution so you can keep secrets out of\n> your config file.\n> The \"sandbox\" section is only required if sandbox is enabled.\n\n| Field                         | Type                                     | Default | Description                                                 |\n| ----------------------------- | ---------------------------------------- | ------- | ----------------------------------------------------------- |\n| `agents`                      | `Record<string, {url, custom_headers?}>` | —       | Named remote agents. Keys are agent IDs used in tool calls. |\n| `taskStore`                   | `boolean`                                | `true`  | Enable persistent task storage.                             |\n| `fileStore`                   | `boolean`                                | `true`  | Enable persistent file artifact storage.                    |\n| `sendMessageCharacterLimit`   | `number`                                 | `50000` | Maximum characters for minimized artifact text.             |\n| `minimizedObjectStringLength` | `number`                                 | `5000`  | Maximum string length for minimized data objects.           |\n| `viewArtifactCharacterLimit`  | `number`                                 | `50000` | Maximum characters returned by view artifact tools.         |\n| `agentCardTimeout`            | `number`                                 | `15`    | Timeout in seconds for fetching remote agent cards.         |\n| `sendMessageTimeout`          | `number`                                 | `60`    | Timeout in seconds for send message requests.               |\n| `getTaskTimeout`              | `number`                                 | `60`    | Timeout in seconds for get task monitoring.                 |\n| `getTaskPollInterval`         | `number`                                 | `5`     | Interval in seconds between task status polls.              |\n\n### Tools\n\nThe `a2a_*` tools are registered when at least one agent is configured (`agents`).\nThe plugin is powered by [A2A Utils](https://github.com/a2anet/a2a-utils), for example tool usage, results, etc. see [A2A Utils JavaScript A2ATools](https://github.com/a2anet/a2a-utils/blob/main/javascript/README.md#a2atools).\n\n#### `a2a_get_agents`\n\nList all available remote A2A agents with names and descriptions.\n\nNo parameters.\n\n#### `a2a_get_agent`\n\nGet detailed info about a specific agent, including skills.\n\n| Parameter  | Type   | Required | Description                   |\n| ---------- | ------ | -------- | ----------------------------- |\n| `agent_id` | string | Yes      | The agent's unique identifier |\n\n#### `a2a_send_message`\n\nSend a message to a remote agent and receive a structured response. The message\nis sent non-blocking — the tool streams or polls for updates until the task\nreaches a terminal state or the timeout is reached. If the task is still in\nprogress after the timeout, the current task state is returned. Use\n`a2a_get_task` with the returned `id` to continue monitoring.\n\n| Parameter    | Type   | Required | Description                                                                                                                                                |\n| ------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `agent_id`   | string | Yes      | ID of the target agent                                                                                                                                     |\n| `message`    | string | Yes      | Message content to send                                                                                                                                    |\n| `context_id` | string | No       | Continue an existing multi-turn conversation                                                                                                               |\n| `task_id`    | string | No       | Attach to an existing task (for `input_required` flows)                                                                                                    |\n| `timeout`    | number | No       | Override default timeout in seconds                                                                                                                        |\n| `data`       | array  | No       | Structured data to include with the message. Each item is sent as a separate JSON object or array alongside the text.                                      |\n| `files`      | array  | No       | Files to include with the message. Accepts local file paths (read and sent as binary, max 1MB) or URLs (sent as references for the remote agent to fetch). |\n\n#### `a2a_get_task`\n\nCheck the progress of an A2A task that is still in progress. Monitors until the\ntask reaches a terminal state or the timeout is reached. If still in progress,\nreturns the current task state — call again to continue monitoring.\n\n| Parameter       | Type   | Required | Description                                |\n| --------------- | ------ | -------- | ------------------------------------------ |\n| `agent_id`      | string | Yes      | ID of the agent owning the task            |\n| `task_id`       | string | Yes      | Task ID from a previous `a2a_send_message` |\n| `timeout`       | number | No       | Monitoring timeout in seconds              |\n| `poll_interval` | number | No       | Interval between status checks in seconds  |\n\n#### `a2a_view_text_artifact`\n\nView text content from an artifact, optionally selecting a line or character\nrange. Can select by line range OR character range, but not both.\n\n| Parameter         | Type   | Required | Description                                   |\n| ----------------- | ------ | -------- | --------------------------------------------- |\n| `agent_id`        | string | Yes      | ID of the agent that produced the artifact    |\n| `task_id`         | string | Yes      | Task ID containing the artifact               |\n| `artifact_id`     | string | Yes      | The artifact's unique identifier              |\n| `line_start`      | number | No       | Starting line number (1-based, inclusive)     |\n| `line_end`        | number | No       | Ending line number (1-based, inclusive)       |\n| `character_start` | number | No       | Starting character index (0-based, inclusive) |\n| `character_end`   | number | No       | Ending character index (0-based, exclusive)   |\n\n#### `a2a_view_data_artifact`\n\nView structured data from an artifact with optional JSON path, row, and column\nfiltering.\n\n| Parameter     | Type   | Required | Description                                                            |\n| ------------- | ------ | -------- | ---------------------------------------------------------------------- |\n| `agent_id`    | string | Yes      | ID of the agent that produced the artifact                             |\n| `task_id`     | string | Yes      | Task ID containing the artifact                                        |\n| `artifact_id` | string | Yes      | The artifact's unique identifier                                       |\n| `json_path`   | string | No       | Dot-separated path to navigate data (e.g. `\"results.items\"`)           |\n| `rows`        | string | No       | Row selection for list data (`\"0\"`, `\"0-10\"`, `\"0,2,5\"`, or `\"all\"`)   |\n| `columns`     | string | No       | Column selection for tabular data (`\"name\"`, `\"name,age\"`, or `\"all\"`) |\n\n## 📥 Receiving Messages (inbound)\n\n### Set Up\n\nOther agents can discover and message your OpenClaw agent through the inbound\nendpoint. Follow the steps below to make your agent reachable.\n\n#### 1. Configure Inbound\n\n```json\n{\n    \"tools\": {\n        \"profile\": \"full\"\n    },\n    \"plugins\": {\n        \"entries\": {\n            \"a2a\": {\n                \"enabled\": true\n            }\n        }\n    },\n    \"sandbox\": {\n        \"tools\": {\n            \"alsoAllow\": [\"a2a_update_agent_card\"]\n        }\n    }\n}\n```\n\n> **Note:** The \"sandbox\" section is only required if sandbox is enabled.\n\n| Field                   | Type      | Default                              | Description                                                                                                                                                                      |\n| ----------------------- | --------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `agentCard.name`        | `string`  | Agent identity name                  | Agent Card display name.                                                                                                                                                         |\n| `agentCard.description` | `string`  | `\"AI assistant powered by OpenClaw\"` | Agent Card description.                                                                                                                                                          |\n| `agentCard.skills`      | `array`   | `[]`                                 | Skills to advertise. Each needs `id`, `name`, `description`. Optional: `tags`, `examples`, `inputModes`, `outputModes`. Can also be set at runtime with `a2a_update_agent_card`. |\n| `apiKeys`               | `array`   | —                                    | Array of `{ label, key }` objects for inbound auth.                                                                                                                              |\n| `allowUnauthenticated`  | `boolean` | `false`                              | Skip API key validation for inbound requests.                                                                                                                                    |\n| `agents`                | `object`  | —                                    | Named inbound agents, keyed by agent ID. Each value takes an `agentCard` (`name`, `description`, `skills`). See [Hosting Multiple Agents](#hosting-multiple-agents).             |\n\n#### Hosting Multiple Agents\n\nA single gateway can expose several agents, each as its own addressable A2A\nendpoint. Add `inbound.agents`, keyed by agent ID. Each key is both the URL\npath segment and the OpenClaw agent ID that handles the message, so a message\nto `/a2a/swe` is routed to the OpenClaw agent `swe`. The key must match a\nconfigured OpenClaw agent ID, or requests to it will fail to route.\n\n```json\n{\n    \"plugins\": {\n        \"entries\": {\n            \"a2a\": {\n                \"enabled\": true,\n                \"config\": {\n                    \"inbound\": {\n                        \"apiKeys\": [{ \"label\": \"flynn\", \"key\": \"...\" }],\n                        \"agents\": {\n                            \"swe\": {\n                                \"agentCard\": {\n                                    \"name\": \"SWE\",\n                                    \"description\": \"Software engineering agent\",\n                                    \"skills\": [\n                                        { \"id\": \"code\", \"name\": \"Code\", \"description\": \"Writes and reviews code\" }\n                                    ]\n                                }\n                            },\n                            \"pmo\": {\n                                \"agentCard\": { \"name\": \"PMO\", \"description\": \"Project management agent\" }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n```\n\nEach agent gets its own JSON-RPC endpoint and Agent Card discovery URL:\n\n| Agent | JSON-RPC endpoint | Agent Card discovery URL    |\n| ----- | ----------------- | --------------------------- |\n| `swe` | `/a2a/swe`        | `/a2a/swe/agent-card.json`  |\n| `pmo` | `/a2a/pmo`        | `/a2a/pmo/agent-card.json`  |\n\nThe `apiKeys` / `allowUnauthenticated` settings apply to every agent on the\nhost. Each agent can update its own card at runtime with `a2a_update_agent_card`\n— the edit is scoped to the calling agent and persisted under its\n`inbound.agents.<agentId>.agentCard`. When `inbound.agents` is omitted, a single\nagent is exposed on the default `/a2a` and `/.well-known/agent-card.json` paths,\nconfigured via `inbound.agentCard`.\n\n#### 2. Restart the Gateway\n\nThe plugin registers its HTTP endpoints on startup, so a restart is required:\n\n```bash\nopenclaw gateway restart\n```\n\n#### 3. Expose Your Gateway\n\nYou need to make your gateway's HTTP port (default 18789) reachable from the\ninternet. [Tailscale Funnel](https://tailscale.com/kb/1223/funnel) is the\nrecommended approach — it gives your machine a public HTTPS URL with automatic\nTLS certificates, no port forwarding or DNS configuration needed. You can also\nuse any reverse proxy (nginx, Caddy, etc.).\n\n> **Note:** The commands below were verified on **macOS** (Apple Silicon)\n> with the [Tailscale Mac app](https://tailscale.com/download/mac). The\n> overall flow is the same on Linux and Windows, but the install and daemon\n> setup will differ — consult the\n> [Tailscale install docs](https://tailscale.com/kb/1347/installation) for\n> your OS.\n\n##### Install Tailscale\n\nInstall the **[Tailscale Mac app](https://tailscale.com/download/mac)**. The GUI app ships a Network Extension\nthat plumbs MagicDNS into macOS's system resolver, so browsers and other apps\ncan resolve your `*.ts.net` hostname.\n\nAfter installing, launch the app, click the Tailscale menu bar icon, and\nsign in. The CLI is bundled with the app.\n\nConfirm you're online:\n\n```bash\ntailscale status\n```\n\nYou should see your node name, tailnet IP, and user.\n\n##### Provision an HTTPS Certificate\n\nFunnel needs a LetsEncrypt cert for your node's `*.ts.net` name. Running\n`tailscale cert` once provisions it and also confirms that HTTPS certificates\nand MagicDNS are enabled on your tailnet:\n\n```bash\ncd /tmp && tailscale cert \"$(tailscale status --json | jq -r '.Self.DNSName | rtrimstr(\".\")')\"\n```\n\nThe `cd /tmp` is because `tailscale cert` writes `<host>.crt` and\n`<host>.key` to the current directory.\n\n##### Enable Funnel\n\n```bash\ntailscale funnel --bg http://localhost:18789\n```\n\nOn success, Tailscale prints the public URL, e.g.:\n\n```\nAvailable on the internet:\n\nhttps://your-machine.tailXXXXXX.ts.net/\n|-- proxy http://localhost:18789\n```\n\nIf the `funnel` command fails with a policy error, you need to add the\nFunnel ACL attribute in the [admin console](https://login.tailscale.com/admin/acls/file)\n(there is no CLI equivalent for editing ACLs):\n\n```json\n\"nodeAttrs\": [\n  {\n    \"target\": [\"autogroup:member\"],\n    \"attr\": [\"funnel\"]\n  }\n]\n```\n\nIt can take up to a minute or two after `tailscale funnel --bg` returns\nbefore the public URL actually serves traffic from the open internet,\nbecause the Funnel edge has to propagate your config and finish TLS\nprovisioning. If an external request returns a TLS error or \"broken pipe\",\nwait ~60s and retry.\n\n##### Tailscale Serve (Tailnet-Only)\n\nIf you only need agents on your tailnet to reach you (not the public internet),\nuse Tailscale Serve instead of Funnel:\n\n```bash\ntailscale serve --bg http://localhost:18789\n```\n\nWith Serve, traffic is restricted to your tailnet, so disabling authentication\nis reasonable.\n\n##### Stopping Funnel\n\n```bash\ntailscale funnel --https=443 off\n```\n\n#### 4. Verify\n\nOpen your Agent Card URL in a browser:\n\n```\nhttps://your-machine.tail123.ts.net/.well-known/agent-card.json\n```\n\nYou should see the JSON Agent Card (name, description, skills, etc.).\n\n#### 5. Generate an API Key\n\nThe Agent Card is public, but for other people to send messages to your OpenClaw you'll need to generate an API key for them:\n\n```bash\nopenclaw a2a generate-key flynn\n```\n\n#### 6. Customise Your Agent Card\n\nThe Agent Card will have default values.\nOnce you've generated an API key, ask your OpenClaw to use the `a2a_update_agent_card` tool to update its Agent Card:\n\n> Update your Agent Card with the `a2a_update_agent_card` tool\n\n#### 7. Share Your URL and Key\n\nSend your Agent Card URL and the generated API key to the person you generated it for.\nThey'll need to install the plugin and add your OpenClaw as a remote agent with the headers:\n\n```json\n\"custom_headers\": {\n    \"Authorization\": \"Bearer [GENERATED API KEY]\"\n}\n```\n\nThat's it! Your friend's agent should now be able to send messages and files to your OpenClaw.\n\n### Tools\n\nThe `a2a_update_agent_card` tool is registered when inbound is configured\n(`apiKeys` or `allowUnauthenticated`).\n\n#### `a2a_update_agent_card`\n\nLive-update this agent's A2A Agent Card name, description, or skills. Changes\ntake effect immediately and persist to config — no restart needed. At least one\nfield must be provided. When `inbound.agents` is configured, the edit is scoped\nto the calling agent's own card.\n\n| Parameter     | Type   | Required | Description                                                                                    |\n| ------------- | ------ | -------- | ---------------------------------------------------------------------------------------------- |\n| `name`        | string | No       | Display name for the Agent Card                                                                |\n| `description` | string | No       | Description for the Agent Card                                                                 |\n| `skills`      | array  | No       | Skills to advertise (objects with `id`, `name`, `description`, and optional `tags`/`examples`) |\n\n## 🌐 HTTP Endpoints\n\n| Endpoint                          | Method | Auth         | Description                                                                                    |\n| --------------------------------- | ------ | ------------ | ---------------------------------------------------------------------------------------------- |\n| `/.well-known/agent-card.json`    | GET    | No           | Returns the Agent Card for discovery (single-agent configuration)                              |\n| `/a2a`                            | POST   | Bearer token | JSON-RPC 2.0 endpoint supporting `message/send`, `message/stream`, `tasks/get`, `tasks/cancel` |\n| `/a2a/<agentId>/agent-card.json`  | GET    | No           | Returns the Agent Card for `<agentId>` (when `inbound.agents` is configured)                   |\n| `/a2a/<agentId>`                  | POST   | Bearer token | JSON-RPC 2.0 endpoint for `<agentId>` (when `inbound.agents` is configured)                    |\n\n### Supported JSON-RPC Methods\n\n| Method           | Description                                            |\n| ---------------- | ------------------------------------------------------ |\n| `message/send`   | Send a message and wait for the full response          |\n| `message/stream` | Send a message with Server-Sent Events (SSE) streaming |\n| `tasks/get`      | Get the status and details of a task                   |\n| `tasks/cancel`   | Cancel an ongoing task                                 |\n\n### Error Codes\n\n| Code     | Meaning                 |\n| -------- | ----------------------- |\n| `-32700` | Parse error             |\n| `-32600` | Invalid request         |\n| `-32601` | Method not found        |\n| `-32602` | Invalid params          |\n| `-32001` | Authentication required |\n| `-32000` | Server error            |\n\n## 💾 Data Storage\n\nTasks and file artifacts are saved locally, separated by direction. Task state lives under OpenClaw's state directory; file artifacts live under OpenClaw's workspace directory so the agent can access received files.\n\n| Direction | Type  | Path                              |\n| --------- | ----- | --------------------------------- |\n| Outbound  | Tasks | `<state>/a2a/outbound/tasks/`     |\n| Outbound  | Files | `<workspace>/a2a/outbound/files/` |\n| Inbound   | Tasks | `<state>/a2a/inbound/tasks/`      |\n| Inbound   | Files | `<workspace>/a2a/inbound/files/`  |\n\nWhen `inbound.agents` is configured, each agent's inbound tasks and files are\nisolated under its agent ID — `<state>/a2a/inbound/<agentId>/tasks/` and\n`<workspace>/a2a/inbound/<agentId>/files/`.\n\nOutbound task/file storage can be disabled with `outbound.taskStore: false` and `outbound.fileStore: false`.\n\n## 🛠️ Development\n\nInstall the dependencies:\n\n```bash\nmake install\n```\n\nInstall git hooks:\n\n```bash\nmake install-hooks\n```\n\nInstall the plugin:\n\n```bash\nopenclaw plugins install /absolute/path/to/openclaw-a2a-plugin\n```\n\nRestart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\n## 📄 License\n\nApache-2.0\n\n## 🤝 Join the A2A Net Community\n\nA2A Net is a site to find and share AI agents and open-source community. Join to share your A2A agents, ask questions, stay up-to-date with the latest A2A news, be the first to hear about open-source releases, tutorials, and more!\n\n- 🌍 Site: [A2A Net](https://a2anet.com)\n- 🤖 Discord: [Join the Discord](https://discord.gg/674NGXpAjU)\n","readmeFilename":"README.md"}