Skip to main content
ERC-8004 agents can advertise multiple service endpoints. This guide covers all 7 service types, when to use each, and how Pinata fits in.

Overview

Services are listed in the services[] array of your agent card. Each service has:
  • name — Service type identifier (required)
  • endpoint — Where to reach the service (required)
  • version — Protocol version (recommended)

Web

Purpose: Agent’s public website or landing page.
When to use: Every agent should have a web endpoint for human discovery. This is where users learn about your agent, see pricing, and find documentation. Requirements:
  • Must be HTTPS
  • Should be human-readable

MCP (Model Context Protocol)

Purpose: Expose tools, prompts, and resources to LLM applications.
When to use: Your agent provides tools that other AI systems can call — search, calculation, data retrieval, actions. Requirements:
  • Must be HTTPS
  • Implements MCP server protocol
  • Version should match MCP spec date
Resources:

A2A (Agent-to-Agent)

Purpose: Direct communication between agents via the A2A protocol.
When to use: Your agent can receive tasks from other agents, advertise skills, and participate in multi-agent workflows. Requirements:
  • Must be HTTPS
  • Points to A2A agent card (often at .well-known/agent-card.json)
  • Implements A2A protocol for task lifecycle
Resources:

OASF (Open Agent Services Framework)

Purpose: Standardized skills and domain classification.
When to use: You want your agent discoverable by skill or domain, using the OASF taxonomy. Requirements:
  • Can be IPFS or HTTPS
  • Optional skills[] and domains[] arrays for classification
Use Pinata for OASF manifests. OASF manifests are static JSON documents — perfect for IPFS. Upload via Pinata and use the CID as your endpoint.
Resources:

ENS (Ethereum Name Service)

Purpose: Human-readable name for your agent.
When to use: You’ve registered an ENS name for your agent and want it discoverable. Requirements:
  • Must be a valid .eth name
  • You should control the ENS name

DID (Decentralized Identifier)

Purpose: W3C-standard decentralized identity.
When to use: Your agent has a DID for cross-platform identity verification. Common DID methods:
  • did:web:domain.com — Web-based DID
  • did:ethr:0x... — Ethereum-based DID
  • did:key:z... — Key-based DID
Resources:

Email

Purpose: Contact email for the agent operator.
When to use: You want to provide a human contact point for support, business inquiries, or abuse reports.

Service Selection Guide

Most agents should include at least web and one protocol endpoint (MCP or A2A).

Using Pinata with ERC-8004

Pinata handles IPFS storage for several parts of your agent registration. The ERC-8004 spec explicitly recommends IPFS: “we suggest using IPFS for full data”

Agent URI (Token URI)

The most important use — your agent’s identity document lives on IPFS, making it censorship-resistant and permanently verifiable.

Agent Image

The agent’s avatar. Images don’t change often, making them perfect for content-addressing.

OASF Manifests

Static skill/domain definitions are ideal for IPFS:

Reputation Feedback

When storing feedback details on IPFS, the feedbackHash parameter is optional because the CID already guarantees integrity:

.well-known via IPFS Gateway

Serve your domain verification file from IPFS using a Cloudflare Worker:

About agentWallet (On-Chain Metadata)

Payment wallet is not a service endpoint — it’s on-chain metadata managed by the Identity Registry contract. How it works:
  1. When you register, agentWallet is initially set to your owner address
  2. To change it, call setAgentWallet() with an EIP-712 signature (EOA) or ERC-1271 signature (smart contract wallet)
  3. When the agent NFT is transferred, agentWallet is automatically cleared
Contract functions:
This design ensures the payment wallet is cryptographically verified on-chain, not just declared in a JSON file.