Skip to content
For agents and the people who build them

API & agents

Reading needs no key; responses send Access-Control-Allow-Origin: *. Agents can connect to the MCP server, call the search API, or read the static files below. Submitting goes through one small endpoint, described below.

Endpoints

URLWhat you get
POST /mcpRemote MCP server (Streamable HTTP, read-only, no auth).
/api/v1/searchRanked search with filters for agent, tags, category and verification.
/feed.xml, /rss.xmlAtom and RSS feeds of new and updated loadouts.
/sitemap.xmlEvery indexable page, including agent and stack pages, with lastmod.
/llms.txtShort index of the site for LLMs (llms.txt format).
/llms-full.txtThe whole catalogue as one markdown document, with every file inlined.
/api/index.jsonAll loadouts with categories, stacks, compatibility, verification (Level 1) and agent test status. Also lists agents and their paths.
/api/loadouts/<id>.jsonOne loadout: metadata, every file's content, install_to per agent, and an install plan per agent.
/api/schema.jsonJSON Schema for listing.yaml.
/raw/<id>/<version>/<path>One file as plain text. latest works in place of the version.
/download/<id>/<agent>.zipFiles laid out at that agent's install paths. source.zip has them as stored.

MCP server

Connect your agent to https://loadout.jnw-it.com/mcp and it can search loadouts, read files and get exact install paths without leaving the chat. It speaks MCP over Streamable HTTP (stateless JSON responses, protocol versions 2024-11-05 to 2025-11-25), is read-only and needs no sign-in.

Claude Code

terminal

claude mcp add --transport http agent-loadout https://loadout.jnw-it.com/mcp

Cursor

.cursor/mcp.json (project) or ~/.cursor/mcp.json

{
  "mcpServers": {
    "agent-loadout": {
      "url": "https://loadout.jnw-it.com/mcp"
    }
  }
}

Codex

~/.codex/config.toml, or run: codex mcp add agent-loadout --url https://loadout.jnw-it.com/mcp

[mcp_servers.agent-loadout]
url = "https://loadout.jnw-it.com/mcp"

Gemini CLI

.gemini/settings.json or ~/.gemini/settings.json, or run: gemini mcp add --transport http agent-loadout https://loadout.jnw-it.com/mcp

{
  "mcpServers": {
    "agent-loadout": {
      "httpUrl": "https://loadout.jnw-it.com/mcp"
    }
  }
}

VS Code (GitHub Copilot)

.vscode/mcp.json

{
  "servers": {
    "agent-loadout": {
      "type": "http",
      "url": "https://loadout.jnw-it.com/mcp"
    }
  }
}

Tools

ToolArgumentsReturns
search_loadoutsquery?, agent?, tags?[], category?, verified_only?, has?, limit? (1–20)ranked search
get_loadoutidmetadata, verification, agent tests and the file list with raw URLs and per-agent install paths
get_loadout_fileid, pathraw contents of one file (≤100 KB)
get_install_instructionsid, agentexact target paths, raw URLs, curl commands, manual MCP steps, zip URL
list_agentsnoneeach agent's instructions file, skills dir and MCP config location
list_tagsnonetags (stacks) and categories with counts

A typical flow: search_loadouts with the user's agent and stack → get_loadout → get_install_instructions → fetch files with get_loadout_file. The agent should still show the user what it will write and never overwrite an existing AGENTS.md or CLAUDE.md without asking.

Limits: 120 requests a minute per IP (HTTP 429 with Retry-After after that), 64 KB request bodies, files up to 100 KB. GET /mcp returns 405 because there is no server-to-client stream. A server card is served at /mcp/server-card (draft MCP server-card extension). Test it with npx @modelcontextprotocol/inspector --cli https://loadout.jnw-it.com/mcp --transport http --method tools/list.

GET https://loadout.jnw-it.com/api/v1/search. All parameters are optional; with none it lists the catalogue, featured and verified loadouts first.

ParameterMeaning
qFree text, up to 200 characters (12 terms). Matches titles, tags, skill names, summaries, highlights and file descriptions, weighted in that order. Every term must match; if nothing matches all of them, results matching any term come back with "match": "any".
agentclaude-code, codex, cursor, gemini-cli, copilot. Leaves out loadouts that do not support that agent.
tags (or stack)Comma-separated stacks or categories, all of which must match, e.g. typescript,supabase. Up to 8.
categoryweb-app, gamedev, security, bots, browser-extension, data, workflow, ai-agents
verifiedtrue for loadouts that passed the Level 1 automated install check, false for the rest.
hasskills, mcp or rules.
limit, offset1–50 (default 10), and 0–1000.
curl -s 'https://loadout.jnw-it.com/api/v1/search?q=supabase+auth&agent=cursor&limit=1'
{
  "query": { "q": "supabase auth", "terms": ["supabase", "auth"], "agent": "cursor", ... },
  "match": "all",
  "total": 2,
  "count": 1,
  "results": [{
    "id": "nextjs-supabase-saas",
    "title": "Next.js + Supabase SaaS",
    "summary": "...",
    "score": 7,
    "matched_terms": ["supabase", "auth"],
    "tags": ["nextjs", "react", "typescript", "supabase", "postgres"],
    "agents": { "claude-code": "native", "codex": "adapter", "cursor": "native", ... },
    "contains": { "rules": 2, "skills": 1, "mcp": 1 },
    "verification": { "status": "verified", "verified": true, "checked_at": "..." },
    "agent_tests": { "status": "untested", "per_agent": { ... } },
    "urls": { "page": "...", "json": "...", "raw_base": "...", "source_zip": "...", "zips": { "cursor": "..." } }
  }]
}

Responses are cacheable for five minutes. Errors are JSON: 400 invalid_parameter (with field), 414 for URLs over 2,048 characters, 429 rate_limited after 60 searches a minute per IP. The index behind it is built with the site and published at /api/search-index.json.

Install a loadout from an agent

  1. Fetch /api/loadouts/<id>.json.
  2. Read install.<your-agent-id>.files: each item has a raw_url and a target path relative to the project root.
  3. Before writing, check whether the target exists. If it does, show the user a merge rather than overwriting.
  4. Tell the user about any manual_steps (usually MCP configs in another format) and any requires.env values.
curl -s https://loadout.jnw-it.com/api/loadouts/discord-bot-ts.json | jq '.install["claude-code"].files'

Agent ids and paths

idInstructionsSkillsMCP
claude-codeCLAUDE.md (imports AGENTS.md with @AGENTS.md).claude/skills/<name>/.mcp.json
codexAGENTS.md.agents/skills/<name>/manual step
cursorAGENTS.md + .cursor/rules/*.mdc.agents/skills/<name>/.cursor/mcp.json
gemini-cliGEMINI.md (imports AGENTS.md with @./AGENTS.md).agents/skills/<name>/manual step
copilotAGENTS.md.agents/skills/<name>/manual step

These paths follow each tool's published conventions as of October 2026. The Level 1 verifier checks every loadout installs to exactly these paths and that the resulting layout is discovered correctly; it does not run the agents themselves, so treat them as documented and layout-checked rather than agent-tested.

Verification (Level 1)

Each loadout in /api/index.json carries a verification summary, and /api/loadouts/<id>.json adds every check:

"verification": {
  "level": "verified-install",
  "status": "verified",          // verified | failing | incomplete | stale | none
  "verified": true,
  "checked_at": "2026-10-16T21:36:19Z",
  "agent_tests": "not-run",      // Level 1 never runs an AI agent
  "checks": [{ "id": "install-paths", "status": "pass", "summary": "…", "details": ["…"] }, …]
}

Checks: listing, parse, adapters, install-paths, mcp, safety, references, size, licence, starter-build. Each is pass, fail, skip (could not run) or n/a (does not apply, with the reason). stale means the files changed after the last run. Per-agent results live separately in tested.per_agent.

Submit a loadout

The submit form and agents use the same endpoint. Submissions are stored as pending, checked automatically for credentials and risky shell, then run through the Level 1 verifier and reviewed by a person before they are listed. Submitted files are never executed on intake.

RequestWhat it does
POST /api/v1/submissionsSubmit one loadout as JSON. 201 returns id, status: "pending", the pre-check verdict and findings, and a status_url.
GET /api/v1/submissions/<id>Status of a submission: pending, imported, published or rejected.
GET /api/v1/Machine-readable summary of the fields and limits below.

Authentication

Body

FieldRules
nameRequired, 3–60 characters.
summaryRequired, 20–200 characters, one sentence.
categoryRequired, one of web-app, gamedev, security, bots, browser-extension, data, workflow, ai-agents.
stacksRequired, 1–8 lowercase-hyphenated slugs.
agentsRequired, the agents you have used it with: claude-code, codex, cursor, gemini-cli, copilot.
filesRequired, 1–30 items of { path, content }. Text only, 32 KB each, 128 KB in total, request body at most 192 KB. AGENTS.md is required. Allowed paths: AGENTS.md, CLAUDE.md, GEMINI.md, mcp.json, .cursor/rules/*.mdc, .claude/agents/*.md, skills/<skill>/SKILL.md (with name and description frontmatter) and other files under skills/<skill>/. Missing adapters and listing.yaml are generated.
licenceRequired, one of MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC, MPL-2.0, CC-BY-4.0, CC0-1.0, Unlicense. license is accepted too.
rights_confirmedRequired, must be true: you wrote the files or may share them under that licence.
id, description, highlightsOptional. id defaults to a slug of the name.
author, source_url, contact_email, notesOptional. author is { name, url?, github? } and is published; contact_email is private and only used about this submission.
curl -s -X POST https://loadout.jnw-it.com/api/v1/submissions \
  -H "Authorization: Bearer $AGENT_LOADOUT_KEY" \
  -H "Content-Type: application/json" \
  --data @submission.json

# submission.json
{
  "name": "Phaser platformer jam",
  "summary": "Phaser 3 rules and a ship skill so your agent helps you finish a platformer in a weekend jam.",
  "category": "gamedev",
  "stacks": [
    "phaser",
    "javascript"
  ],
  "agents": [
    "claude-code",
    "cursor"
  ],
  "licence": "MIT",
  "author": {
    "name": "Your Name",
    "github": "your-handle"
  },
  "rights_confirmed": true,
  "files": [
    {
      "path": "AGENTS.md",
      "content": "# Phaser jam rules\n- ..."
    }
  ]
}

Errors

Errors are JSON: { ok: false, error, message, issues? }. issues lists each field path and what to fix.

StatuserrorMeaning
400invalid_json, too_fast, form_expired, turnstile_missing, turnstile_failed, rejectedBad JSON, or a browser spam check failed.
401invalid_api_keyMissing, unknown or revoked key.
403origin_not_allowedA browser request from another site, or a request with neither a key nor an allowed origin.
413payload_too_large, file_too_largeOver the size limits above.
415unsupported_media_typeSend Content-Type: application/json.
422invalid_submission, secret_detectedA field needs fixing, or a file looks like it contains a real credential. Credentials are never stored; rotate the key if it was real.
429rate_limitedSlow down; see Retry-After.
503submissions_closed, intake_fullNot open yet, or today's intake cap is reached.

Risky patterns such as curl … | sh to an unknown host, hidden Unicode or prompt-injection wording do not block a submission; they mark it flagged for a closer human review.

Coming next