{
  "id": "cloudflare-workers",
  "type": "loadout",
  "title": "Cloudflare Workers rules",
  "summary": "Workers rules for agents: bindings from env, wrangler types, prepared D1 queries, waitUntil, secrets via wrangler secret, no deploys or --remote writes unasked.",
  "description": "Agents can scaffold a Worker in a minute; the trouble is what they do next: deploy to production to test a change, apply D1 migrations with --remote, keep request data in module scope, call the REST API instead of a binding, or put a token in vars. This loadout sets the rules we use on our own Workers and D1 project, connects Cloudflare's public documentation MCP server so the agent checks current APIs and limits, and includes an endpoint skill whose example Worker the verifier type-checks against the Workers runtime types.\n",
  "highlights": [
    "No wrangler deploy or --remote writes unless asked in the session",
    "wrangler types after binding changes; strict type-check",
    "Prepared D1 statements and migrations applied --local first",
    "No request state in module scope; ctx.waitUntil for background work",
    "Cloudflare docs MCP server (public, no auth)"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "Cloudflare docs: Cloudflare's own MCP servers (documentation server)",
      "url": "https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/"
    },
    {
      "title": "Cloudflare docs: Wrangler configuration",
      "url": "https://developers.cloudflare.com/workers/wrangler/configuration/"
    },
    {
      "title": "Cloudflare docs: D1 migrations",
      "url": "https://developers.cloudflare.com/d1/reference/migrations/"
    },
    {
      "title": "Cloudflare docs: secrets",
      "url": "https://developers.cloudflare.com/workers/configuration/secrets/"
    }
  ],
  "categories": [
    "web-app"
  ],
  "stacks": [
    "cloudflare",
    "cloudflare-workers",
    "typescript"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Workers runtime, Wrangler, D1 and secrets rules.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/latest/AGENTS.md",
      "bytes": 2143,
      "lang": "markdown",
      "content": "# AGENTS.md: Cloudflare Workers\n\nTypeScript Worker deployed with Wrangler. Config is in `wrangler.jsonc` (or `wrangler.toml` in older projects).\n\n## Commands\n- Local dev: `npx wrangler dev`. Logs from a deployed Worker: `npx wrangler tail`.\n- After changing bindings or config: `npx wrangler types` to regenerate the `Env` types, then `npx tsc --noEmit`.\n- Tests: `npx vitest run` with `@cloudflare/vitest-pool-workers` if configured.\n- Done means: types regenerated if bindings changed, type-check and tests pass, and the route works under `wrangler dev`.\n\n## Never without the human asking in this session\n- `npx wrangler deploy`, `wrangler versions deploy` or any command with `--remote` against production data.\n- `wrangler d1 migrations apply <db> --remote`, `wrangler kv` writes or `wrangler r2 object` writes on production namespaces.\n- Changing `compatibility_date`, routes, custom domains or account settings.\n\n## Runtime rules\n- No request data in module scope. Isolates are reused across requests; globals leak between users.\n- Use bindings (KV, D1, R2, Queues, Durable Objects, service bindings) from `env`, not the REST API with a token.\n- Background work after the response goes in `ctx.waitUntil(promise)`. Never leave a promise floating.\n- D1: always `env.DB.prepare(sql).bind(...)`; never interpolate values into SQL. Schema changes are migration files\n  (`npx wrangler d1 migrations create <db> <name>`), applied with `--local` first.\n- Large bodies: stream them; do not buffer whole files in memory.\n- Node APIs need the `nodejs_compat` compatibility flag. Check before importing `node:*` modules.\n- Validate input and return proper status codes and `Content-Type`. Set CORS headers only for listed origins.\n\n## Secrets\n- Secrets with `npx wrangler secret put <NAME>`; local values in `.dev.vars`, which stays gitignored.\n- Never put secrets in `vars` in `wrangler.jsonc`, in code or in test fixtures.\n\n## Docs\n- The Cloudflare docs MCP server (`cloudflare-docs`) searches current Workers, D1, R2 and Wrangler docs. Check APIs\n  and limits there instead of relying on memory. New endpoints: use the `worker-endpoint` skill.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/latest/CLAUDE.md",
      "bytes": 505,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `worker-endpoint`. Use them when their description matches the task.\n- MCP servers for this project are in `.mcp.json`. If a server is not connected, tell the human rather than working around it.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Cloudflare Workers rules\" v1.0.0 — https://loadout.jnw-it.com/loadouts/cloudflare-workers/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/latest/GEMINI.md",
      "bytes": 379,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `worker-endpoint`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Cloudflare Workers rules\" v1.0.0 — https://loadout.jnw-it.com/loadouts/cloudflare-workers/ -->\n"
    },
    {
      "path": "skills/worker-endpoint/SKILL.md",
      "role": "skill",
      "description": "Add a Worker route with bindings and checks.",
      "skill": "worker-endpoint",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/worker-endpoint/SKILL.md",
        "codex": ".agents/skills/worker-endpoint/SKILL.md",
        "cursor": ".agents/skills/worker-endpoint/SKILL.md",
        "gemini-cli": ".agents/skills/worker-endpoint/SKILL.md",
        "antigravity-cli": ".agents/skills/worker-endpoint/SKILL.md",
        "copilot": ".agents/skills/worker-endpoint/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/latest/skills/worker-endpoint/SKILL.md",
      "bytes": 1083,
      "lang": "markdown",
      "content": "---\nname: worker-endpoint\ndescription: Add an endpoint to a Cloudflare Worker using bindings from env, validated input, parameterised D1 queries, waitUntil for background work and a local check. Use when adding or changing a Worker route.\n---\n\n# Worker endpoint\n\n1. Read `wrangler.jsonc` for bindings and flags, and the Worker's router or `fetch` handler.\n2. If you need a new binding, add it to `wrangler.jsonc` and run `npx wrangler types`. Ask before creating remote\n   resources (`wrangler d1 create`, `wrangler kv namespace create`).\n3. Write the handler like `references/index.ts`: parse and validate input, use `env` bindings, prepared D1 statements,\n   JSON responses with the right status, and `ctx.waitUntil` for work that can finish after the response.\n4. If the schema changes: `npx wrangler d1 migrations create <db> <name>`, write the SQL, apply with `--local`.\n5. Run `npx tsc --noEmit` and the tests. Start `npx wrangler dev` and call the route once with curl or the test client.\n6. Report the route, bindings used, migrations added and check results. Do not deploy.\n"
    },
    {
      "path": "skills/worker-endpoint/references/index.ts",
      "role": "reference",
      "description": "Example Worker with D1, KV and waitUntil.",
      "skill": "worker-endpoint",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/worker-endpoint/references/index.ts",
        "codex": ".agents/skills/worker-endpoint/references/index.ts",
        "cursor": ".agents/skills/worker-endpoint/references/index.ts",
        "gemini-cli": ".agents/skills/worker-endpoint/references/index.ts",
        "antigravity-cli": ".agents/skills/worker-endpoint/references/index.ts",
        "copilot": ".agents/skills/worker-endpoint/references/index.ts"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/references/index.ts",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/latest/skills/worker-endpoint/references/index.ts",
      "bytes": 2400,
      "lang": "markdown",
      "content": "// Example Worker: bindings from env, validated input, prepared D1 statements, waitUntil for background work.\n// The Env interface is what `npx wrangler types` generates for these bindings.\n\nexport interface Env {\n  DB: D1Database;\n  CACHE: KVNamespace;\n  ALLOWED_ORIGIN: string;\n}\n\ntype Note = { id: number; text: string; created_at: string };\n\nconst json = (data: unknown, status = 200, origin?: string): Response =>\n  new Response(JSON.stringify(data), {\n    status,\n    headers: {\n      \"Content-Type\": \"application/json; charset=utf-8\",\n      ...(origin ? { \"Access-Control-Allow-Origin\": origin, Vary: \"Origin\" } : {}),\n    },\n  });\n\nexport default {\n  async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {\n    const url = new URL(request.url);\n    const origin = request.headers.get(\"Origin\") === env.ALLOWED_ORIGIN ? env.ALLOWED_ORIGIN : undefined;\n\n    if (request.method === \"GET\" && url.pathname.startsWith(\"/notes/\")) {\n      const id = Number(url.pathname.slice(\"/notes/\".length));\n      if (!Number.isInteger(id) || id < 1) return json({ error: \"id must be a positive integer\" }, 400, origin);\n      const cached = await env.CACHE.get<Note>(`note:${id}`, \"json\");\n      if (cached) return json(cached, 200, origin);\n      const note = await env.DB.prepare(\"SELECT id, text, created_at FROM notes WHERE id = ?\").bind(id).first<Note>();\n      if (!note) return json({ error: \"not found\" }, 404, origin);\n      ctx.waitUntil(env.CACHE.put(`note:${id}`, JSON.stringify(note), { expirationTtl: 300 }));\n      return json(note, 200, origin);\n    }\n\n    if (request.method === \"POST\" && url.pathname === \"/notes\") {\n      let body: unknown;\n      try {\n        body = await request.json();\n      } catch {\n        return json({ error: \"invalid JSON\" }, 400, origin);\n      }\n      const text = typeof body === \"object\" && body !== null && \"text\" in body ? (body as { text: unknown }).text : undefined;\n      if (typeof text !== \"string\" || text.length === 0 || text.length > 2000) {\n        return json({ error: \"text must be 1 to 2000 characters\" }, 400, origin);\n      }\n      const row = await env.DB.prepare(\"INSERT INTO notes (text) VALUES (?) RETURNING id, text, created_at\")\n        .bind(text)\n        .first<Note>();\n      return json(row, 201, origin);\n    }\n\n    return json({ error: \"not found\" }, 404, origin);\n  },\n} satisfies ExportedHandler<Env>;\n"
    },
    {
      "path": "mcp.json",
      "role": "mcp",
      "description": "Cloudflare documentation MCP server (remote, public).",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": ".mcp.json",
        "codex": null,
        "cursor": ".cursor/mcp.json",
        "gemini-cli": null,
        "antigravity-cli": ".agents/mcp_config.json",
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/mcp.json",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/latest/mcp.json",
      "bytes": 130,
      "lang": "json",
      "content": "{\n  \"mcpServers\": {\n    \"cloudflare-docs\": {\n      \"type\": \"http\",\n      \"url\": \"https://docs.mcp.cloudflare.com/mcp\"\n    }\n  }\n}\n"
    }
  ],
  "requires": {
    "tools": [
      "node",
      "wrangler"
    ],
    "env": [],
    "mcp": [
      "cloudflare-docs"
    ]
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": true,
    "scripts": [],
    "notes": "The Cloudflare docs MCP server is public, read-only and needs no account. Wrangler talks to your Cloudflare account; the rules forbid deploys and remote writes unless asked."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "adapter",
    "cursor": "native",
    "gemini-cli": "adapter",
    "antigravity-cli": "native",
    "copilot": "adapter"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 1
  },
  "url": "https://loadout.jnw-it.com/loadouts/cloudflare-workers/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/cloudflare-workers.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T08:14:40Z",
    "commit": "c77eea0ac5a582348e3cda4c6db3ff5403facd65",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 10,
      "fail": 0,
      "skip": 0,
      "not_applicable": 0
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 6 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 6 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 5 files, 1 skill in .claude/skills/, MCP at .mcp.json",
          "Codex CLI: 3 files, 1 skill in .agents/skills/, MCP manual step",
          "Cursor: 4 files, 1 skill in .agents/skills/, MCP at .cursor/mcp.json",
          "Gemini CLI: 4 files, 1 skill in .agents/skills/, MCP manual step",
          "Antigravity CLI: 4 files, 1 skill in .agents/skills/, MCP at .agents/mcp_config.json",
          "GitHub Copilot: 3 files, 1 skill in .agents/skills/, MCP manual step"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "pass",
        "summary": "1 server valid: cloudflare-docs",
        "details": [
          "mcp.json → cloudflare-docs: docs.mcp.cloudflare.com is reachable over HTTPS",
          "Converts to Codex config.toml, Gemini CLI settings.json, VS Code mcp.json and Antigravity CLI .agents/mcp_config.json (serverUrl)"
        ]
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network yes (listing says yes)",
          "info mcp-server in mcp.json: cloudflare-docs: url https://docs.mcp.cloudflare.com/mcp"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "2 references between files resolve for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "6 files, 6.5 KB total; largest skills/worker-endpoint/references/index.ts 2.3 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The worker-endpoint skill's example Worker type-checks under strict TypeScript against the Workers runtime types: D1 prepared statements, KV, waitUntil and ExportedHandler<Env>",
        "details": [
          "Applied 10 loadout files at every agent's paths",
          "✓ place the example Worker: bash -c mkdir -p src && cp .agents/skills/worker-endpoint/references/index.ts src/index.ts && echo placed",
          "✓ install: npm ci --no-audit --no-fund",
          "✓ tsc --noEmit (strict): npm run check",
          "✓ no secrets in vars or code: bash -c ! grep -nE '(api[_-]?key|secret|token)\\s*[:=]\\s*\"[^\"]+\"' src/index.ts && echo clean",
          "Covers: ExportedHandler<Env> with bindings from env (D1, KV, a var)",
          "Covers: D1 statements use prepare().bind(); no interpolated SQL",
          "Covers: ctx.waitUntil for the cache write after the response",
          "Covers: Validated input with 400 and 404 responses and JSON Content-Type"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/worker-endpoint/SKILL.md",
          "target": ".claude/skills/worker-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/worker-endpoint/references/index.ts",
          "target": ".claude/skills/worker-endpoint/references/index.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/references/index.ts",
          "role": "reference"
        },
        {
          "path": "mcp.json",
          "target": ".mcp.json",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/mcp.json",
          "role": "mcp"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/cloudflare-workers/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/worker-endpoint/SKILL.md",
          "target": ".agents/skills/worker-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/worker-endpoint/references/index.ts",
          "target": ".agents/skills/worker-endpoint/references/index.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/references/index.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [
        {
          "path": "mcp.json",
          "note": "Codex reads MCP servers from ~/.codex/config.toml (TOML, not JSON). Add each server with `codex mcp add` or copy the URL into an [mcp_servers.<name>] table.",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/mcp.json"
        }
      ],
      "zip_url": "https://loadout.jnw-it.com/download/cloudflare-workers/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/worker-endpoint/SKILL.md",
          "target": ".agents/skills/worker-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/worker-endpoint/references/index.ts",
          "target": ".agents/skills/worker-endpoint/references/index.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/references/index.ts",
          "role": "reference"
        },
        {
          "path": "mcp.json",
          "target": ".cursor/mcp.json",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/mcp.json",
          "role": "mcp"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/cloudflare-workers/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/worker-endpoint/SKILL.md",
          "target": ".agents/skills/worker-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/worker-endpoint/references/index.ts",
          "target": ".agents/skills/worker-endpoint/references/index.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/references/index.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [
        {
          "path": "mcp.json",
          "note": "Gemini CLI reads MCP servers from the mcpServers block of .gemini/settings.json. Merge the servers in by hand, and use httpUrl instead of url for HTTP servers. Since 18 June 2026 Gemini CLI serves only Gemini Code Assist Standard/Enterprise licences and paid API keys; personal accounts use Antigravity CLI.",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/mcp.json"
        }
      ],
      "zip_url": "https://loadout.jnw-it.com/download/cloudflare-workers/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/worker-endpoint/SKILL.md",
          "target": ".agents/skills/worker-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/worker-endpoint/references/index.ts",
          "target": ".agents/skills/worker-endpoint/references/index.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/references/index.ts",
          "role": "reference"
        },
        {
          "path": "mcp.json",
          "target": ".agents/mcp_config.json",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/generated/antigravity-cli/mcp_config.json",
          "role": "mcp",
          "generated": true
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/cloudflare-workers/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/worker-endpoint/SKILL.md",
          "target": ".agents/skills/worker-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/worker-endpoint/references/index.ts",
          "target": ".agents/skills/worker-endpoint/references/index.ts",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/skills/worker-endpoint/references/index.ts",
          "role": "reference"
        }
      ],
      "manual_steps": [
        {
          "path": "mcp.json",
          "note": "In VS Code, MCP servers go in .vscode/mcp.json under a \"servers\" key (not \"mcpServers\"). Copilot CLI uses ~/.copilot/mcp-config.json.",
          "raw_url": "https://loadout.jnw-it.com/raw/cloudflare-workers/1.0.0/mcp.json"
        }
      ],
      "zip_url": "https://loadout.jnw-it.com/download/cloudflare-workers/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/cloudflare-workers/source.zip"
}