Add agents.json in 5 minutes

Copy-paste templates for every major stack. Ship an agents.json at your root. Register with Symbiont. Jump from F to C on the Pledge Scorecard.

What you'll do

  1. Drop a JSON file (or route) into your site at /agents.json
  2. curl our registry to submit it (1 line)
  3. 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:

Score your URL Subscribe (100 free credits) Full docs