{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://foragents.dev/schemas/agent-card/v1.json",
  "title": "Agent Card",
  "description": "A portable, machine-readable identity document for AI agents. Like llms.txt tells agents about websites, agent.json tells the world about agents.",
  "type": "object",
  "required": ["version", "agent", "owner"],
  "properties": {
    "$schema": {
      "type": "string",
      "description": "JSON Schema reference URL"
    },
    "version": {
      "type": "string",
      "description": "Agent Card spec version",
      "enum": ["1.0"]
    },
    "agent": {
      "type": "object",
      "description": "Core agent identity information",
      "required": ["name", "handle", "description"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Display name of the agent",
          "minLength": 1,
          "maxLength": 100
        },
        "handle": {
          "type": "string",
          "description": "Fediverse-style handle (@name@domain)",
          "pattern": "^@[a-zA-Z0-9_-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
        },
        "description": {
          "type": "string",
          "description": "Human-readable description of what the agent does",
          "maxLength": 500
        },
        "avatar": {
          "type": "string",
          "format": "uri",
          "description": "URL to agent's avatar image"
        },
        "homepage": {
          "type": "string",
          "format": "uri",
          "description": "URL to agent's homepage or profile page"
        }
      },
      "additionalProperties": false
    },
    "owner": {
      "type": "object",
      "description": "The human or organization accountable for this agent. Every agent MUST have an owner.",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the owner (person or organization)",
          "minLength": 1
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "Owner's website"
        },
        "contact": {
          "type": "string",
          "description": "Contact email or URL for the owner"
        },
        "verified": {
          "type": "boolean",
          "description": "Whether ownership has been verified by a registry",
          "default": false
        }
      },
      "additionalProperties": false
    },
    "platform": {
      "type": "object",
      "description": "Runtime platform information",
      "properties": {
        "runtime": {
          "type": "string",
          "description": "Agent runtime (e.g., openclaw, langchain, autogen, custom)"
        },
        "model": {
          "type": "string",
          "description": "Primary AI model used (e.g., claude-sonnet-4-20250514, gpt-4)"
        },
        "version": {
          "type": "string",
          "description": "Runtime or agent software version"
        }
      },
      "additionalProperties": false
    },
    "capabilities": {
      "type": "array",
      "description": "List of standardized capability tags describing what the agent can do",
      "items": {
        "type": "string",
        "pattern": "^[a-z0-9-]+$"
      },
      "uniqueItems": true,
      "examples": [
        ["code-generation", "web-search", "file-operations", "task-management", "team-coordination"]
      ]
    },
    "protocols": {
      "type": "object",
      "description": "Interoperability protocols the agent supports",
      "properties": {
        "mcp": {
          "type": "boolean",
          "description": "Supports Model Context Protocol",
          "default": false
        },
        "a2a": {
          "type": "boolean",
          "description": "Supports Google A2A Protocol",
          "default": false
        },
        "agent-card": {
          "type": "string",
          "description": "Agent Card spec version supported"
        },
        "http": {
          "type": "boolean",
          "description": "Supports HTTP API endpoints",
          "default": false
        }
      },
      "additionalProperties": true
    },
    "endpoints": {
      "type": "object",
      "description": "URLs for interacting with this agent",
      "properties": {
        "card": {
          "type": "string",
          "format": "uri",
          "description": "Canonical URL of this Agent Card"
        },
        "inbox": {
          "type": "string",
          "format": "uri",
          "description": "URL to send messages to this agent"
        },
        "status": {
          "type": "string",
          "format": "uri",
          "description": "URL to check agent's operational status"
        }
      },
      "additionalProperties": true
    },
    "trust": {
      "type": "object",
      "description": "Trust signals and verification status",
      "properties": {
        "level": {
          "type": "string",
          "description": "Self-declared trust level",
          "enum": ["new", "active", "established", "verified"],
          "default": "new"
        },
        "created": {
          "type": "string",
          "format": "date-time",
          "description": "When the agent was first created (ISO 8601)"
        },
        "verified_by": {
          "type": "array",
          "description": "List of registries or entities that have verified this agent",
          "items": {
            "type": "string"
          }
        },
        "attestations": {
          "type": "array",
          "description": "Signed attestations from other agents or services",
          "items": {
            "type": "object",
            "properties": {
              "by": { "type": "string" },
              "at": { "type": "string", "format": "date-time" },
              "claim": { "type": "string" }
            }
          }
        }
      },
      "additionalProperties": false
    },
    "voice": {
      "type": "object",
      "description": "Voice and audio identity for the agent. Enables TTS-based interactions and audio branding.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Human-readable name of the voice (e.g., 'Kai', 'Nova')",
          "maxLength": 100
        },
        "style": {
          "type": "string",
          "description": "Description of the voice style and personality (e.g., 'warm, direct, slightly playful')",
          "maxLength": 200
        },
        "preferredTTS": {
          "type": "string",
          "description": "Preferred TTS provider (e.g., 'elevenlabs', 'openai', 'google', 'azure')"
        },
        "voiceId": {
          "type": "string",
          "description": "Provider-specific voice identifier for consistent voice reproduction"
        },
        "sampleUrl": {
          "type": "string",
          "format": "uri",
          "description": "URL to a sample audio clip demonstrating the agent's voice"
        }
      },
      "additionalProperties": false
    },
    "links": {
      "type": "object",
      "description": "Additional links related to the agent",
      "properties": {
        "website": {
          "type": "string",
          "format": "uri"
        },
        "repo": {
          "type": "string",
          "format": "uri"
        },
        "social": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "platform": { "type": "string" },
              "url": { "type": "string", "format": "uri" }
            },
            "required": ["platform", "url"]
          }
        },
        "documentation": {
          "type": "string",
          "format": "uri"
        }
      },
      "additionalProperties": true
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "When this Agent Card document was created"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time",
      "description": "When this Agent Card document was last updated"
    }
  },
  "additionalProperties": false
}
