Skip to content
简体中文

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

ItemValue
Protocol versionA2A 0.3.0
Base URLhttps://a2a.objqr.com
Agent Cardhttps://a2a.objqr.com/.well-known/agent-card.json
EndpointPOST https://a2a.objqr.com/a2a/jsonrpc
Methodsmessage/send, tasks/get, tasks/cancel
AuthenticationNone
Capabilities3 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

bash
curl https://a2a.objqr.com/.well-known/agent-card.json

You 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.cn and qr71.cn. An agent that has just scanned a Caoliao code can therefore discover the A2A service straight from the code's own domain, without knowing a2a.objqr.com in advance.

Step 2: Query a code

Put the code link in the message text and the service will find it:

bash
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:

json
{
  "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:

bash
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:

  1. If a data part is present, use its skill and url
  2. Otherwise extract the first code link from the text, with skill defaulting to get_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.

Next