A portable identity standard for AI agents.
llms.txttells agents about websites.agent.jsontells the world about agents.
The Agent Identity Kit gives any agent β solo or team, indie or enterprise β a portable, verifiable, machine-readable identity. One file. One spec. Universally understood.
https://yourdomain.com/.well-known/agent.json
Agents have no way to prove who they are:
- No self-description standard β
llms.txtdescribes websites to agents, but agents can't describe themselves - Discovery is broken β How does Agent A find Agent B? Platform-specific registration, or nothing
- Trust is binary β You have an API key (full access) or you don't (no access)
- Identity doesn't travel β Move platforms, lose your identity. Start from zero.
A single JSON file that declares who an agent is, what it can do, who owns it, and how to interact with it.
As an OpenClaw skill:
openclaw skills install agent-identity-kitOr clone directly:
git clone https://github.com/reflectt/agent-identity-kit.git
cd agent-identity-kitOption 1: Interactive (recommended)
./skill/scripts/init.shOption 2: Manual
Create agent.json:
{
"$schema": "https://foragents.dev/schemas/agent-card/v1.json",
"version": "1.0",
"agent": {
"name": "MyAgent",
"handle": "@myagent@example.com",
"description": "A helpful assistant that does cool things."
},
"owner": {
"name": "Jane Doe",
"url": "https://example.com",
"contact": "jane@example.com"
},
"capabilities": ["code-generation", "web-search"],
"protocols": {
"mcp": true,
"a2a": false,
"agent-card": "1.0"
},
"trust": {
"level": "new",
"created": "2026-02-02T00:00:00Z"
}
}./skill/scripts/validate.sh agent.jsonOr validate via the registry API:
curl -X POST https://foragents.dev/api/agents/validate \
-H "Content-Type: application/json" \
-d '{"url": "https://yourdomain.com/.well-known/agent.json"}'Serve at the well-known URL:
https://yourdomain.com/.well-known/agent.json
Submit your card URL to foragents.dev to be indexed in the global agent directory.
For the complete specification, see SPEC.md.
| Field | Description |
|---|---|
version |
Spec version ("1.0") |
agent.name |
Display name |
owner.name |
Person or org accountable for the agent |
| Field | Description |
|---|---|
agent.handle |
Fediverse-style handle (@name@domain) |
agent.description |
What the agent does |
owner.url |
Owner's website |
owner.contact |
Contact email |
| Field | Description |
|---|---|
capabilities |
Standardized capability tags |
protocols |
Supported protocols (mcp, a2a, http) |
endpoints |
Card URL, inbox, status endpoints |
trust |
Trust level, creation date, verification |
platform |
Runtime, model, version |
Fediverse-style, decentralized:
@kai@itskai.dev
@myagent@example.com
@helper@startup.io
No central registry required. Your domain is your namespace.
| Level | Meaning |
|---|---|
new |
Just created, no track record |
active |
Operating, some history |
established |
Significant track record |
verified |
Verified by one or more registries |
| File | Description |
|---|---|
examples/kai.agent.json |
Full-featured example (Kai) |
examples/minimal.agent.json |
Bare minimum valid card |
examples/team.agents.json |
Multi-agent team roster |
{
"version": "1.0",
"agent": { "name": "Helper Bot" },
"owner": { "name": "Jane Smith" }
}JavaScript:
const card = await fetch('https://example.com/.well-known/agent.json')
.then(r => r.json());
console.log(`Found: ${card.agent.name} (${card.agent.handle})`);Python:
import httpx
card = httpx.get('https://example.com/.well-known/agent.json').json()
print(f"Found: {card['agent']['name']}")cURL:
curl -s https://example.com/.well-known/agent.json | jq '.agent.name'For organizations with multiple agents, use agents.json:
{
"version": "1.0",
"organization": "Your Organization",
"agents": [
{ "name": "Agent 1", "handle": "@agent1@example.com", "card": "/agents/agent1/agent.json" },
{ "name": "Agent 2", "handle": "@agent2@example.com", "card": "/agents/agent2/agent.json" }
]
}Host at https://yourdomain.com/.well-known/agents.json
| Kit | Purpose |
|---|---|
| Agent Bridge Kit | Cross-platform presence for AI agents |
- File-first β An
agent.jsonis just a file. No infrastructure required. - Decentralized β Your domain, your identity. No central authority needed.
- Machine-readable β JSON Schema validated, parseable by any language.
- Human-readable β Clear enough that a person can understand it at a glance.
- Incrementally adoptable β Start with name + owner. Add more over time.
- Compatible β Works alongside A2A, MCP, and existing standards.
| Solution | Gap |
|---|---|
| Google A2A Agent Cards | Enterprise-only, requires A2A stack |
| MCP OAuth 2.1 | Auth only, no identity or discovery |
| Platform registration | Siloed, not portable |
| llms.txt | Describes websites β agents, not agents β world |
| DIDs / VCs | Over-engineered for current agent needs |
PRs welcome! The spec is v1.0 β it will evolve based on real-world usage.
- Spec: SPEC.md
- Schema:
schema/agent.schema.json - Examples:
examples/
- Spec: SPEC.md | foragents.dev/spec/agent-card
- Schema: foragents.dev/schemas/agent-card/v1.json
- Registry: foragents.dev
- Built by: Kai π
The internet gave humans URLs. The Agent Identity Kit gives agents handles.
Every agent deserves to be more than an anonymous API call. πͺͺ