Quick Start
A2A (Agent2Agent) is a standard protocol between agents. Caoliao runs a read-only A2A service: give it a Caoliao QR code link and it returns the full picture of the physical thing behind that code.
Use it when the caller is not an MCP client you configure, but an agent speaking the A2A protocol. You do not have to send them API documentation — they learn what Caoliao can do, and how to call it, from the Agent Card. It reads the same data as Public MCP; the difference is protocol shape — MCP is built for tool calling, A2A for agent-to-agent collaboration.
Service details
| Item | Value |
|---|---|
| Protocol version | A2A 0.3.0 |
| Base URL | https://a2a.objqr.com |
| Agent Card | https://a2a.objqr.com/.well-known/agent-card.json |
| Endpoint | POST https://a2a.objqr.com/a2a/jsonrpc |
| Methods | message/send, tasks/get, tasks/cancel |
| Authentication | None |
| Capabilities | 3 skills, all read-only |
Important: this service does not support streaming (
streaming: false) or push notifications. Every call is a single request and response.
Step 1: Discover
curl https://a2a.objqr.com/.well-known/agent-card.jsonYou get an Agent Card describing who this agent is, what it can do, and where to call it. Field-by-field reference in Agent Card and Discovery.
Tip: the same card is served from Caoliao's code domains
qr61.cnandqr71.cn. An agent that has just scanned a Caoliao code can therefore discover the A2A service straight from the code's own domain, without knowinga2a.objqr.comin advance.
Step 2: Query a code
Put the code link in the message text and the service will find it:
curl -X POST https://a2a.objqr.com/a2a/jsonrpc \
-H 'content-type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": "1",
"method": "message/send",
"params": {
"message": {
"kind": "message",
"role": "user",
"messageId": "m1",
"parts": [
{ "kind": "text", "text": "What is this QR code? https://qr71.cn/okDISU/qssTnoy" }
]
}
}
}'The response is a completed Task whose result sits in artifacts:
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"kind": "task",
"id": "9332c282-1fa7-4c42-96ac-58e4e2f88f4c",
"contextId": "e9c10667-e79b-4c99-b05f-0cb237067127",
"status": { "state": "completed", "timestamp": "2026-08-12T17:14:13.272Z" },
"artifacts": [
{
"artifactId": "6915a6bd-d63c-42e6-b629-8aed3bb06236",
"name": "entity",
"parts": [
{ "kind": "data", "data": { "thing": { "name": "CNC Lathe A08-03-06" } } },
{ "kind": "text", "text": "CNC Lathe A08-03-06; operating status: Normal; 1 record; 7 properties; 2 available actions" }
]
}
]
}
}Every artifact has two parts: data is structured output for programs, text is a one-line summary you can drop straight into a conversation. Full structure in Task and Response.
Note: the service replies in Chinese. The summary above is translated for illustration.
Step 3: Pick a different skill
Caoliao exposes three skills. The example above did not name one, so it used get_entity by default. To be explicit, send structured input:
curl -X POST https://a2a.objqr.com/a2a/jsonrpc \
-H 'content-type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": "2",
"method": "message/send",
"params": {
"message": {
"kind": "message",
"role": "user",
"messageId": "m2",
"parts": [
{
"kind": "data",
"data": {
"skill": "get_records",
"url": "https://qr71.cn/okDISU/qssTnoy",
"size": 2
}
}
]
}
}
}'The artifact is now named records. What each skill does: Skills.
About intent recognition
Caoliao does not do intent recognition. Routing is deterministic:
- If a
datapart is present, use itsskillandurl - Otherwise extract the first code link from the text, with
skilldefaulting toget_entity
In other words, working out "what does the user want" is the calling agent's job; Caoliao only fetches what it is told to fetch. Each skill in the Agent Card carries a description and example questions to support that decision.