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
- Call quote_single_use({ sku: "single-generate" }). No auth.
- From the wallet, transfer the exact amountAtomic USDC on Base to payTo (eip681 or tx in the quote).
- 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
- initialize — Handshake. Client sends protocolVersion and capabilities.
- tools/list — Returns the tool names, descriptions, and inputSchema.
- tools/call — Run 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| sku | string | no | single-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
| Argument | Type | Required | Notes |
|---|---|---|---|
| apiKey | string | no | Account 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) |
| payment | object | no | Single-use Base USDC payment. No account. Get quoteId from quote_single_use, send exact USDC, pass txHash. (no extra keys) |
| payment.quoteId | string | yes | From quote_single_use. UUID. (minLength 36 · maxLength 36) |
| payment.txHash | string | yes | Base transaction hash of the USDC transfer. (pattern ^0x[a-fA-F0-9]{64}$) |
| components | array<string> | yes | Catalog 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) |
| stack | object | no | Detected project stack. When set, compatibility is a hard registry rule. Omit to receive latest. (no extra keys) |
| stack.nextjs | string | no | |
| stack.react | string | no | |
| stack.typescript | string | no | |
| stack.supabase_ssr | string | no | |
| allow_incompatible | boolean | no | Expert override. Returns the requested pin with a warning instead of blocking. |
| get_site_profile | boolean | no | If 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. |
| projectName | string | no | Folder / project name stamped into generated files. (minLength 1 · maxLength 80) |
| repoName | string | no | Repo 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| apiKey | string | yes | Account API key. Prefix bk_live_. Shown once at creation. Costs 100 credits. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200) |
| get_site_profile | boolean | no | If 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| botKelpKey | string | yes | Account API key. Prefix bk_live_. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200) |
| cursor | string | no | Resume 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_searchv1.0.0
Search the BotKelp catalog knowledge base. Account holders only. Not a web search.
Gated: yes — apiKey required · 30/min · permissions knowledge.read
| Argument | Type | Required | Notes |
|---|---|---|---|
| apiKey | string | yes | Account API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200) |
| query | string | yes | (minLength 1 · maxLength 200) |
| technology | string | no | (maxLength 80) |
| version | string | no | (maxLength 32) |
| limit | integer | no |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "knowledge_search",
"arguments": {
"apiKey": "bk_live_YOUR_KEY",
"query": "supabase auth"
}
}
}knowledge_getv1.0.0
Full knowledge record for a catalog component. Account holders only.
Gated: yes — apiKey required · 30/min · permissions knowledge.read
| Argument | Type | Required | Notes |
|---|---|---|---|
| apiKey | string | yes | Account API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200) |
| name | string | yes | Catalog id or name (minLength 1 · maxLength 80) |
| version | string | no | (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
| Argument | Type | Required | Notes |
|---|---|---|---|
| apiKey | string | yes | Account API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200) |
| question | string | yes | (minLength 3 · maxLength 500) |
| context | string | no | (maxLength 400) |
| technology | string | no | (maxLength 80) |
| version | string | no | (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
| Argument | Type | Required | Notes |
|---|---|---|---|
| apiKey | string | yes | Account API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200) |
| name | string | yes | (minLength 1 · maxLength 80) |
| version | string | no | (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
| Argument | Type | Required | Notes |
|---|---|---|---|
| apiKey | string | yes | Account API key. Prefix bk_live_. Knowledge tools are account-holders only. (pattern ^bk_live_[A-Za-z0-9]+$ · maxLength 200) |
| component | string | yes | Catalog id (minLength 1 · maxLength 80) |
| task | string | yes | (minLength 3 · maxLength 400) |
| project_context | string | no | (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 false — If 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.