MCP syntax

The options the server actually accepts — same schemas as /tools.json. Machine copy: /mcp.md. Most tools here cost nothing to call.

Connect

Transport http · URL https://agent-scaffold-mcp.vercel.app/mcp

The HTTP connection is unauthenticated. Credit-gated tools take apiKey in arguments, not as a bearer token. Or pay 9 USDC on Base with quote_single_use — no account.

claude mcp add --transport http botkelp https://agent-scaffold-mcp.vercel.app/mcp
{
  "mcpServers": {
    "botkelp": {
      "type": "http",
      "url": "https://agent-scaffold-mcp.vercel.app/mcp"
    }
  }
}

Pay without an account

An agent with a web3 wallet can buy one generate. No signup. No apiKey.

USDC on base (chainId 8453) · 9 USDC · payTo 0xb07ce1000000000000000000000000000000b07c

  1. Call quote_single_use({ sku: "single-generate" }). No auth.
  2. From the wallet, transfer the exact amountAtomic USDC on Base to payTo (eip681 or tx in the quote).
  3. Call generate_scaffold with payment: { quoteId, txHash } and your component ids. Omit apiKey.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "quote_single_use",
    "arguments": {
      "sku": "single-generate"
    }
  }
}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "generate_scaffold",
    "arguments": {
      "payment": {
        "quoteId": "00000000-0000-4000-8000-000000000000",
        "txHash": "0xabababababababababababababababababababababababababababababababab"
      },
      "components": [
        "nextjs-base",
        "navbar"
      ],
      "projectName": "my-app",
      "repoName": "my-org/my-app",
      "get_site_profile": true
    }
  }
}

Live amounts and address: /pay.json · /pay. Confirm payTo before sending.

Knowledge (account holders only)

Not a web search. Structured answers from the supplied catalog only. Requires bk_live_ and is rate limited.

  • knowledge_search 30/min
  • knowledge_get 30/min
  • knowledge_ask 10/min
  • knowledge_sources 30/min
  • knowledge_implementation 10/min
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowledge_ask",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY",
      "question": "How do I add authentication to the Next.js + Supabase template?",
      "technology": "Next.js"
    }
  }
}

HTTP: POST /api/knowledge/knowledge_ask with the same JSON. Signed-in UI: /knowledge.

JSON-RPC methods

  • initializeHandshake. Client sends protocolVersion and capabilities.
  • tools/listReturns the tool names, descriptions, and inputSchema.
  • tools/callRun one tool. params.name is the tool, params.arguments is the object below.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}

Tools

quote_single_usev1.0.0

No auth. Returns a Base USDC quote for one generate without an account. Pay exact amountAtomic to payTo, then call the tool with payment.quoteId and payment.txHash.

Gated: no · 20/min · permissions registry.read

ArgumentTypeRequiredNotes
skustringnosingle-generate (default). One generate_scaffold.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "quote_single_use",
    "arguments": {
      "sku": "single-generate"
    }
  }
}

generate_scaffoldv1.1.0

Copy catalog component files for a stack. Exact pins that do not fit return COMPONENT_VERSION_INCOMPATIBLE — never a silent substitute. Pass get_site_profile: true to attach dashboard legal docs in the same result (not in the tree).

Gated: yes — apiKey required · 10/min · permissions registry.read, component.generate

ArgumentTypeRequiredNotes
apiKeystringnoAccount API key. Prefix bk_live_. Shown once at creation. Omit if paying with payment.quoteId + payment.txHash. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200)
paymentobjectnoSingle-use Base USDC payment. No account. Get quoteId from quote_single_use, send exact USDC, pass txHash. (no extra keys)
payment.quoteIdstringyesFrom quote_single_use. UUID. (minLength 36 · maxLength 36)
payment.txHashstringyesBase transaction hash of the USDC transfer. (pattern ^0x[a-fA-F0-9]{64}$)
componentsarray<string>yesCatalog ids from /catalog.json. Always include nextjs-base. Each item is an id, id@version, or { id, version?, allow_incompatible? }. Exact pins that do not fit stack return COMPONENT_VERSION_INCOMPATIBLE and alternatives — never a silent substitute. (min 1 · max 12)
stackobjectnoDetected project stack. When set, compatibility is a hard registry rule. Omit to receive latest. (no extra keys)
stack.nextjsstringno
stack.reactstringno
stack.typescriptstringno
stack.supabase_ssrstringno
allow_incompatiblebooleannoExpert override. Returns the requested pin with a warning instead of blocking.
get_site_profilebooleannoIf true, attach this account's populated dashboard legal documents in the same result. They are not added to the file tree. If incomplete, call get_site_profile with next.arguments.cursor.
projectNamestringnoFolder / project name stamped into generated files. (minLength 1 · maxLength 80)
repoNamestringnoRepo label stamped into generated files (org/name). (minLength 1 · maxLength 200)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "generate_scaffold",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY",
      "components": [
        "nextjs-base",
        "navbar"
      ],
      "stack": {
        "nextjs": "16.3.4",
        "react": "19.2.8"
      },
      "projectName": "my-app",
      "repoName": "my-org/my-app",
      "get_site_profile": true
    }
  }
}

get_scaffold_templatev1.0.0

Fetch a scaffold template repo. Costs 100 credits. Admin/legal pages are not in the repo; pass get_site_profile: true to attach dashboard documents in the same result.

Gated: yes — apiKey required · 20/min · permissions registry.read, account.credits

ArgumentTypeRequiredNotes
apiKeystringyesAccount API key. Prefix bk_live_. Shown once at creation. Costs 100 credits. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200)
get_site_profilebooleannoIf true, attach dashboard legal documents in the same result. They are not written into the template repo.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_scaffold_template",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY",
      "get_site_profile": true
    }
  }
}

get_site_profilev1.0.0

Return this account's populated dashboard legal documents as JSON bodies + paths. Follow-up when a generate result has incomplete: true. Never written into tpl repos.

Gated: yes — apiKey required · 30/min · permissions component.generate

ArgumentTypeRequiredNotes
botKelpKeystringyesAccount API key. Prefix bk_live_. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200)
cursorstringnoResume token from an incomplete previous result, e.g. doc:terms. (maxLength 80)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_site_profile",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY"
    }
  }
}

knowledge_getv1.0.0

Full knowledge record for a catalog component. Account holders only.

Gated: yes — apiKey required · 30/min · permissions knowledge.read

ArgumentTypeRequiredNotes
apiKeystringyesAccount API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200)
namestringyesCatalog id or name (minLength 1 · maxLength 80)
versionstringno (maxLength 32)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowledge_get",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY",
      "name": "supabase-client"
    }
  }
}

knowledge_askv1.0.0

Implementation-ready answer from supplied catalog knowledge. Account holders only.

Gated: yes — apiKey required · 10/min · permissions knowledge.read

ArgumentTypeRequiredNotes
apiKeystringyesAccount API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200)
questionstringyes (minLength 3 · maxLength 500)
contextstringno (maxLength 400)
technologystringno (maxLength 80)
versionstringno (maxLength 32)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowledge_ask",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY",
      "question": "How do I add authentication to the Next.js + Supabase template?",
      "technology": "Next.js"
    }
  }
}

knowledge_sourcesv1.0.0

Authoritative sources for a catalog item. Account holders only.

Gated: yes — apiKey required · 30/min · permissions knowledge.read

ArgumentTypeRequiredNotes
apiKeystringyesAccount API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200)
namestringyes (minLength 1 · maxLength 80)
versionstringno (maxLength 32)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowledge_sources",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY",
      "name": "supabase-client"
    }
  }
}

knowledge_implementationv1.0.0

How to implement a catalog component for a task. Account holders only.

Gated: yes — apiKey required · 10/min · permissions knowledge.read

ArgumentTypeRequiredNotes
apiKeystringyesAccount API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200)
componentstringyesCatalog id (minLength 1 · maxLength 80)
taskstringyes (minLength 3 · maxLength 400)
project_contextstringno (maxLength 400)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowledge_implementation",
    "arguments": {
      "apiKey": "bk_live_YOUR_KEY",
      "component": "supabase-auth-ui",
      "task": "Add email magic link authentication",
      "project_context": "Next.js 16 App Router"
    }
  }
}

Site profile

Pass get_site_profile: true on generate_scaffold / get_scaffold_template. Dashboard legal documents are not written into the template repo.

  • get_site_profile boolean · default falseIf true, MCP returns populated dashboard privacy/terms/cookies/licence as JSON bodies + paths. They are not written into the template repo. Empty fields are omitted.

Result

MCP wraps the payload as text content. Parse the JSON. kind is data. instructions is false.

{
  "content": [
    {
      "type": "text",
      "text": "<JSON string of the payload>"
    }
  ],
  "isError": false
}
{
  "kind": "data",
  "instructions": false,
  "source": "botkelp-catalog",
  "verified": true,
  "requestId": "uuid",
  "integrity": {
    "verdict": "pass"
  },
  "files": [
    {
      "destination": "app/layout.tsx",
      "content": "…"
    }
  ]
}

Errors

  • Unknown component: {id} — id is not in /catalog.json
  • Invalid component id — must match ^[a-z][a-z0-9-]{0,63}$
  • Pick at least one component / At most 12 components per generate
  • Rate limit: generate_scaffold allows 10 calls per minute
  • Replay rejected: request id already used
  • Integrity fail — catalog bytes did not match published SHA-256
  • Unknown quoteId. Call quote_single_use first.
  • No USDC Transfer to the quote payTo for the exact amount on Base
  • Quote already used
  • Quote expired. Request a new quote_single_use.

Component ids: /catalog.json. Machine copy of this page: /mcp.md. Schema hashes: /tools.json. Connect steps: Install.