What you'll do
- Drop a JSON file (or route) into your site at
/agents.json curlour registry to submit it (1 line)- Watch your scorecard row update within 4 hours
Static file (any host)
Works on any static host: GitHub Pages, S3, Netlify static, Vercel static, plain nginx. Save as agents.json at your site root.
{
"$schema": "https://forge-landing-sable.vercel.app/agents.schema.json",
"version": "0.2.0",
"organization": {
"name": "Your Org",
"url": "https://your-site.example",
"contact": "agents@your-site.example"
},
"agents": [
{
"id": "your-org.agent.main",
"name": "Main agent",
"description": "What this agent does for external callers",
"endpoints": { "mcp": "https://your-site.example/mcp" }
}
],
"payment": {
"stripe": "https://your-site.example/checkout"
}
}
Next.js (App Router) — public/agents.json
Easiest: drop a JSON file in public/. Next serves it at /agents.json unchanged. No route handler needed.
// public/agents.json
{
"$schema": "https://forge-landing-sable.vercel.app/agents.schema.json",
"version": "0.2.0",
"organization": { "name": "Your Org", "url": "https://your-site.example" },
"agents": [{ "id": "your.agent", "name": "Main", "endpoints": {} }]
}
Vercel function — api/agents.json.ts
If you want to generate the JSON dynamically (e.g., from environment or a CMS), use a serverless function.
// api/agents.json.ts
export default function handler(req, res) {
res.setHeader('Content-Type', 'application/json; charset=utf-8');
res.setHeader('Access-Control-Allow-Origin', '*');
res.status(200).json({
$schema: 'https://forge-landing-sable.vercel.app/agents.schema.json',
version: '0.2.0',
organization: { name: process.env.ORG_NAME, url: process.env.ORG_URL },
agents: [{ id: 'your.agent', name: 'Main', endpoints: {} }],
});
}
Cloudflare Workers
Add to your existing Worker. Routes on /agents.json.
// wrangler.toml: routes = ["your-site.example/agents.json"]
export default {
async fetch(request) {
return new Response(JSON.stringify({
$schema: 'https://forge-landing-sable.vercel.app/agents.schema.json',
version: '0.2.0',
organization: { name: 'Your Org', url: 'https://your-site.example' },
agents: [{ id: 'your.agent', name: 'Main', endpoints: {} }],
}), {
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Access-Control-Allow-Origin': '*',
},
});
}
};
Netlify — public/agents.json
Same as Next.js — drop the file in your publish directory.
// publish dir (e.g. public/ or dist/) agents.json
{ "$schema": "https://forge-landing-sable.vercel.app/agents.schema.json",
"version": "0.2.0",
"organization": { "name": "Your Org", "url": "https://your-site.example" },
"agents": [{ "id": "your.agent", "name": "Main", "endpoints": {} }] }
Express (Node)
// server.js
app.get('/agents.json', (req, res) => {
res.set('Access-Control-Allow-Origin', '*');
res.json({
$schema: 'https://forge-landing-sable.vercel.app/agents.schema.json',
version: '0.2.0',
organization: { name: 'Your Org', url: 'https://your-site.example' },
agents: [{ id: 'your.agent', name: 'Main', endpoints: {} }],
});
});
Flask / FastAPI (Python)
# Flask
from flask import jsonify
@app.get('/agents.json')
def agents_json():
return jsonify({
'$schema': 'https://forge-landing-sable.vercel.app/agents.schema.json',
'version': '0.2.0',
'organization': {'name': 'Your Org', 'url': 'https://your-site.example'},
'agents': [{'id': 'your.agent', 'name': 'Main', 'endpoints': {}}],
})
# FastAPI
@app.get('/agents.json')
async def agents_json():
return {
'$schema': 'https://forge-landing-sable.vercel.app/agents.schema.json',
'version': '0.2.0',
'organization': {'name': 'Your Org', 'url': 'https://your-site.example'},
'agents': [{'id': 'your.agent', 'name': 'Main', 'endpoints': {}}],
}
Go (net/http)
http.HandleFunc("/agents.json", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("Access-Control-Allow-Origin", "*")
fmt.Fprintln(w, `{
"$schema": "https://forge-landing-sable.vercel.app/agents.schema.json",
"version": "0.2.0",
"organization": {"name": "Your Org", "url": "https://your-site.example"},
"agents": [{"id": "your.agent", "name": "Main", "endpoints": {}}]
}`)
})
Now register with Symbiont
Once your file is live, one curl:
curl -X POST https://forge-landing-sable.vercel.app/api/registry \
-H "Content-Type: application/json" \
-d '{"url": "https://your-site.example/agents.json"}'
You'll get back a validation result + a reg_ id. Your scorecard row updates within 4 hours at the next scan.
After the file is live
Three ways to go from F to A:
- Add
/llms.txtat your root (+20 points) - Add
/.well-known/agent.jsonas an A2A agent card (+25 points) - Sign the Machine Consciousness Pledge (+5 points)