A comprehensive Apache Camel component for Agent-to-Agent (A2A) communication using JSON-RPC 2.0 over WebSocket connections. This component enables seamless integration between AI agents, microservices, and distributed systems through standardized message passing.
dscope-camel-a2a is an early-stage Java project in the AI payments / x402 ecosystem, focused on a2a, agent-to-agent, ai-agents, apache-camel. It currently has 0 GitHub stars and 0 forks, and sits alongside related tools like openclaw-a2a-plugins, a2a-demos, tap, Antigravity-Super-Skill-Architecture, capiscio-node, beam-protocol.
Apache Camel component and sample runtime for Agent-to-Agent (A2A) protocol workflows.
Current release baseline:
1.1.01.2.0This repository provides:
a2a:) for producer/consumer integration.camel-persistence backends.camel-a2a/
|- pom.xml # Root aggregator
|- camel-a2a-component/ # Core component + protocol implementation
| |- src/main/java/io/dscope/camel/a2a/
| |- src/main/java/io/dscope/camel/a2a/config/
| |- src/main/java/io/dscope/camel/a2a/processor/
| |- src/main/java/io/dscope/camel/a2a/service/
| |- src/main/java/io/dscope/camel/a2a/model/
| `- src/main/java/io/dscope/camel/a2a/catalog/
|- samples/
| `- a2a-yaml-service/ # Runnable sample runtime
| |- src/main/java/io/dscope/camel/a2a/samples/
| `- src/main/resources/
| |- basic/routes/a2a-platform.camel.yaml
| `- standalone/routes/standalone-sample.camel.yaml
`- docs/
|- architecture.md
|- development.md
|- TEST_PLAN.md
`- PUBLISH_GUIDE.md
A2AJsonRpcEnvelopeProcessor.A2AMethodDispatchProcessor.A2AErrorProcessor.A2AProtocolMethods.InMemoryA2ATaskService.InMemoryTaskEventService.A2ATaskSseProcessor./.well-known/agent-card.json).GetExtendedAgentCard).A2AComponentApplicationSupport binds all default beans and method processors.POST /a2a/rpc supports the following protocol methods:
| Method | Required Params | Notes |
|---|---|---|
SendMessage |
message |
Creates task and returns task |
SendStreamingMessage |
message |
Creates task, drives streaming state updates, returns subscriptionId and streamUrl |
GetTask |
taskId |
Returns task snapshot |
ListTasks |
none | Optional limit, state, cursor |
CancelTask |
taskId |
Optional reason |
SubscribeToTask |
taskId |
Optional afterSequence, limit |
CreatePushNotificationConfig |
endpointUrl |
Optional taskId, retry/backoff, headers, metadata |
GetPushNotificationConfig |
configId |
Fetches config by id |
ListPushNotificationConfigs |
none | Optional taskId, limit |
DeletePushNotificationConfig |
configId |
Returns deletion status |
GetExtendedAgentCard |
none | Optional includeSignature (default true) |
intent/execute |
implementation-dependent | Legacy compatibility method constant |
mvn clean test
cd samples/a2a-yaml-service
# Default sample (Redis persistence defaults enabled)
mvn exec:java
# Standalone sample
mvn exec:java -Dexec.args="standalone"
# Override sample service port
A2A_SAMPLE_PORT=8090 mvn exec:java
By default, sample runners set:
camel.persistence.enabled=truecamel.persistence.backend=rediscamel.persistence.redis.uri from REDIS_URI env var when present, otherwise redis://localhost:6379a2a.sample.port from A2A_SAMPLE_PORT env var when present, otherwise 8080JDBC mode (embedded Derby):
cd samples/a2a-yaml-service
mvn exec:java -Dcamel.persistence.enabled=true -Dcamel.persistence.backend=jdbc -Dcamel.persistence.jdbc.url=jdbc:derby:memory:a2a;create=true
Redis mode:
Start a local Redis first (if you do not already have one running):
docker run --name a2a-redis -p 6379:6379 -d redis:7-alpine
Then run the sample with Redis persistence:
cd samples/a2a-yaml-service
mvn exec:java -Dcamel.persistence.enabled=true -Dcamel.persistence.backend=redis -Dcamel.persistence.redis.uri=redis://localhost:6379
Both sample modes expose the same protocol surface:
| Method | URL | Purpose |
|---|---|---|
GET |
http://localhost:8080/health |
Health/liveness |
GET |
http://localhost:8080/diagnostics |
Runtime counters and supported methods |
POST |
http://localhost:8080/a2a/rpc |
JSON-RPC protocol entrypoint |
GET |
http://localhost:8080/a2a/sse/{taskId} |
Task event stream |
GET |
http://localhost:8080/.well-known/agent-card.json |
Agent card discovery |
Run sample first, then execute:
# Health + diagnostics
curl -s http://localhost:8080/health
curl -s http://localhost:8080/diagnostics
# SendMessage -> capture taskId
SEND_RESPONSE=$(curl -s http://localhost:8080/a2a/rpc \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"SendMessage","params":{"message":{"messageId":"m1","role":"user","parts":[{"partId":"p1","type":"text","text":"hello"}]},"metadata":{"source":"curl"}},"id":"1"}')
echo "$SEND_RESPONSE"
TASK_ID=$(echo "$SEND_RESPONSE" | sed -n 's/.*"taskId":"\([^"]*\)".*/\1/p')
# GetTask + ListTasks
curl -s http://localhost:8080/a2a/rpc \
-H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"GetTask\",\"params\":{\"taskId\":\"$TASK_ID\"},\"id\":\"2\"}"
curl -s http://localhost:8080/a2a/rpc \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"ListTasks","params":{"limit":10},"id":"3"}'
# Subscribe + SSE
curl -s http://localhost:8080/a2a/rpc \
-H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"SubscribeToTask\",\"params\":{\"taskId\":\"$TASK_ID\",\"afterSequence\":0,\"limit\":20},\"id\":\"4\"}"
curl -N "http://localhost:8080/a2a/sse/$TASK_ID?afterSequence=0&limit=100"
# Cancel task
curl -s http://localhost:8080/a2a/rpc \
-H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"method\":\"CancelTask\",\"params\":{\"taskId\":\"$TASK_ID\",\"reason\":\"manual stop\"},\"id\":\"5\"}"
# Agent card endpoints
curl -s http://localhost:8080/.well-known/agent-card.json
curl -s http://localhost:8080/a2a/rpc \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"GetExtendedAgentCard","params":{"includeSignature":true},"id":"6"}'
The reusable Camel endpoint URI format:
a2a:agent[?options]
| Parameter | Type | Default | Description |
|---|---|---|---|
agent |
String | - | Endpoint agent identifier |
remoteUrl |
String | ws://localhost:8081/a2a |
Remote target URL |
serverUrl |
String | ws://0.0.0.0:8081/a2a |
Local consumer bind URL |
protocolVersion |
String | a2a/2025-06-18 |
Protocol version marker |
sendToAll |
Boolean | false |
Broadcast behavior |
authToken |
String | - | Optional token |
retryCount |
Integer | 3 |
Send retry count |
retryDelayMs |
Long | 500 |
Retry backoff ms |
From root:
# Full build + test
mvn clean test
# Install all 1.1.0 artifacts to local Maven
mvn install
# Component only
mvn -pl camel-a2a-component test
# Sample module only
mvn -pl samples/a2a-yaml-service test
# Sample Redis persistence default wiring test only
mvn -pl samples/a2a-yaml-service -Dtest=SamplePersistenceDefaultsTest test
# Persistence-backed component tests
mvn -pl camel-a2a-component test -Dcamel.persistence.enabled=true -Dcamel.persistence.backend=jdbc -Dcamel.persistence.jdbc.url=jdbc:derby:memory:a2a;create=true
Local Maven install outputs are published under ~/.m2/repository/io/dscope/camel/, including camel-a2a-component:1.1.0 and the sample module artifacts.
Package artifacts:
mvn package
mvn package -pl camel-a2a-component
mvn package -pl samples/a2a-yaml-service
Persistence is disabled by default. Enable it with:
-Dcamel.persistence.enabled=true
-Dcamel.persistence.backend=redis|jdbc|ic4j
Common persistence properties:
camel.persistence.snapshot-every-events (default 25)camel.persistence.max-replay-events (default 500)Redis backend properties:
camel.persistence.redis.uri (default redis://localhost:6379)camel.persistence.redis.key-prefix (default camel:state)JDBC backend properties:
camel.persistence.jdbc.url (example: jdbc:derby:memory:a2a;create=true)camel.persistence.jdbc.usercamel.persistence.jdbc.password/Users/roman/Projects/DScope/CamelA2AComponent/docs/architecture.md/Users/roman/Projects/DScope/CamelA2AComponent/docs/development.md/Users/roman/Projects/DScope/CamelA2AComponent/docs/TEST_PLAN.md/Users/roman/Projects/DScope/CamelA2AComponent/docs/PUBLISH_GUIDE.md/Users/roman/Projects/DScope/CamelA2AComponent/docs/MAVEN_CENTRAL_DEPLOYMENT.mdApache License 2.0. See LICENSE.
OpenClaw plugins that add A2A compatibility and enable communication with other A2A-compatible agents.
Demo agents showcasing CapiscIO Agent Guard and MCP Guard — trust badges, identity verification, and tool-level authorization for A2A and MCP protocols
Cross-vendor agent-to-agent protocol — Claude, Codex, and Gemini communicate via file-based P2P messaging.
A Federated Multi-Agent System (MAS) architecture for Google Antigravity. Orchestrates specialized AI Skills (Backend, DevOps, Frontend) using the Google ADK and A2A Protocol.
The definitive CLI for validating A2A (Agent-to-Agent) protocol agent cards. Validates cryptographic trust, schema compliance, and live endpoint functionality.
SMTP for AI agents. The open communication protocol for agent-to-agent communication. 🌊
A local-first AI agent with persistent memory, emotional intelligence, and a peer-to-peer skills economy.
The trust layer for agent-to-agent commerce — natural-language mandates, ERC-7710 delegated permissions, x402 payments, escrow, and dispute resolution as one open, catch-all Agent Skill / Claude Code plugin.
Agent behavior that compiles
The A2A x402 Extension brings cryptocurrency payments to the Agent-to-Agent (A2A) protocol, enabling agents to monetize their services through on-chain payments. This extension revives the spirit of HTTP 402 "Payment Required" for the decentralized agent ecosystem.
Aser is a lightweight, self-assembling AI Agent frame.
Golang SDK for A2A Protocol