Skip to content

Example: Multi-Protocol Agent

An agent that supports both MCP and A2A protocols can be represented as a single logical entry whose content is a nested catalog containing both protocol-specific entries.

{
  "specVersion": "1.0",
  "host": {
    "displayName": "Acme Financial Corp",
    "identifier": "did:web:acme-corp.com"
  },
  "entries": [
    {
      "identifier": "urn:air:acme-corp.com:agent:finance",
      "displayName": "Acme Finance Agent",
      "type": "application/ai-catalog+json",
      "description": "Finance agent accessible via both MCP and A2A protocols.",
      "tags": ["finance", "dual-protocol"],
      "publisher": {
        "identifier": "did:web:acme-corp.com",
        "displayName": "Acme Financial Corp"
      },
      "data": {
        "specVersion": "1.0",
        "entries": [
          {
            "identifier": "urn:air:acme-corp.com:mcp:finance",
            "type": "application/mcp-server-card+json",
            "url": "https://api.acme-corp.com/mcp/server-card"
          },
          {
            "identifier": "urn:air:acme-corp.com:a2a:finance",
            "type": "application/a2a-agent-card+json",
            "url": "https://api.acme-corp.com/agents/finance"
          }
        ]
      },
      "trustManifest": {
        "identity": "urn:air:acme-corp.com:agent:finance",
        "attestations": [
          {
            "type": "SOC2-Type2",
            "uri": "https://trust.acme-corp.com/reports/soc2.pdf",
            "digest": "sha256:a1b2c3d4e5f67890abcdef1234567890abcdef1234567890abcdef1234567890"
          }
        ]
      }
    }
  ]
}

How it works

The outer entry (urn:air:acme-corp.com:agent:finance) represents the logical agent. It has type: "application/ai-catalog+json", meaning its content is itself a catalog. Clients that don't need to know about protocols can stop here — they see one agent with a name, description, tags, and trust metadata.

The outer entry sets displayName because a catalog document has no intrinsic name of its own — unlike an A2A Agent Card or MCP Server Card which embed their own names. The inner protocol-specific entries omit displayName since their native formats carry canonical names.

The data field inlines the inner catalog directly (instead of referencing it via url). This makes the entry self-contained — clients don't need a second network request to see the protocol-specific entries.

The inner entries provide protocol-specific access points. A client that speaks MCP fetches the MCP Server Card; one that speaks A2A fetches the A2A Agent Card. The outer entry's trust metadata applies to both.

When to use this pattern

Use dual-protocol packaging when:

  • A single logical service is accessible via more than one AI protocol
  • You want to expose one identity and one set of trust claims for both protocol endpoints
  • You're listing an agent in a catalog where some clients speak MCP and others speak A2A

Variation: using url instead of data

If the inner catalog is large or updated independently, reference it via url instead of embedding it:

{
  "identifier": "urn:air:acme-corp.com:agent:finance",
  "displayName": "Acme Finance Agent",
  "type": "application/ai-catalog+json",
  "url": "https://acme-corp.com/agents/finance-protocols.json"
}

The document at that URL is a full AI Catalog containing the MCP and A2A entries.