MCP syntax

The options the server actually accepts — same schemas as /tools.json. Machine copy: /mcp-docs.md. Most tools here cost nothing to call. The live MCP endpoint itself is /mcp (JSON-RPC, not a page).

Connect

Transport http · URL https://www.botkelp.com/mcp

Connect with the URL only (no client ID, secret or key argument). Nothing: initialize, tools/list, get_help, get_account_status. A wallet: purchase_scaffold via x402 (no Authorization header -> HTTP 402 -> retry with _meta["x402/payment"]). An account: every other tool; sign in when prompted (MCP OAuth 2.1) or send Authorization: Bearer bk_live_…. A 401 means "needs an account". Never pass account_api_key as a tool argument. verify_scaffold needs an account plus projectid.

claude mcp add --transport http botkelp https://www.botkelp.com/mcp
{
  "mcpServers": {
    "botkelp": {
      "type": "http",
      "url": "https://www.botkelp.com/mcp"
    }
  }
}

Client Auth Matrix (OAuth vs Bearer)

BotKelp supports both MCP OAuth 2.1 and first-class Bearer tokens (bk_live_…) interchangeably at the transport layer.

ClientAuth MechanismSetup / Command
Mistral Vibe CLIBearer (bk_live_)export BOTKELP_API_KEY=bk_live_…
vibe mcp add botkelp --url https://www.botkelp.com/mcp --api-key-env BOTKELP_API_KEY
Claude.ai (Web)MCP OAuth 2.1Connectors UI (leave client ID/secret blank)
Mistral Le ChatMCP OAuth 2.1Custom connector, URL only. Sign in when prompted
Claude CodeOAuth / Bearerclaude mcp add --transport http botkelp https://www.botkelp.com/mcp
Cursor / Windsurf / DesktopOAuth / BearermcpServers json configuration
HermesOAuth / Bearerhermes mcp add botkelp --url https://www.botkelp.com/mcp
OpenClawOAuth / Beareropenclaw mcp add botkelp --url https://www.botkelp.com/mcp --transport streamable-http

Pay without an account

An agent with a web3 wallet can buy a scaffold repo via purchase_scaffold without a linked BotKelp account (x402). No signup.

USDC on base (chainId 8453) · USDC · payTo

  1. Call purchase_scaffold with component ids and no payment to get price / accepts
  2. Retry the same call with _meta["x402/payment"] set to a matching signed payment
  3. You are charged only if the call succeeds
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "purchase_scaffold",
    "arguments": {
      "components": [
        "nextjs-base",
        "navbar"
      ],
      "project": {
        "name": "my-app"
      }
    }
  }
}

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

Knowledge (HTTP, not MCP)

These names are not MCP tools. They are account-holder HTTP endpoints. Do not send them to tools/call.

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
{
  "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. This is the live list — /tools.json must match it.
  • 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

get_helpv1.0.0

No API key. Plain text: short usage instructions, a one-line-per-tool summary, then the full component catalog as TSV (id, name, version, description, provides, requires, conflictsWith). Call this first. Also readable as the resource botkelp://catalog with no tool call.

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

ArgumentTypeRequiredNotes
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_help",
    "arguments": {}
  }
}

get_componentv1.0.0

Returns the exact, unrendered source files for one catalog component. Use this to inspect or compare a component before buying a scaffold. Free, rate-limited to 32 calls/day per account. Requires a linked account (transport auth).

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 30/min · permissions registry.read

ArgumentTypeRequiredNotes
componentstringyesComponent id, or id@version, e.g. "supabase-client@2.0.0".
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_component",
    "arguments": {
      "component": "supabase-client"
    }
  }
}

purchase_scaffoldv1.0.0

Requests a build for the given component ids, backed by a private GitHub repo BotKelp owns and manages itself. Extra pages (site_profile, template_files from a connected GitHub repo) bake into a personal clone. Returns a clone credential and a persistent projectid. Pay with linked account credits (transport auth) or via x402.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 10/min · permissions registry.read, account.credits, template.buy

ArgumentTypeRequiredNotes
componentsarray<string>yesComponent ids to include, e.g. ["nextjs-base", "tailwind", "supabase-client"]. (min 1)
site_profileany-ofnofalse/omit: skip. true: bake this account's one site profile into the clone (errors if 0 or >1). A string: bake that named profile (privacy, terms, cookies, …).
template_filesany-ofnotrue: every saved dashboard template file. Or a list of {name} and/or {source, dest} from the connected GitHub repo (source may be a folder).
projectobjectnoProject metadata to save alongside the purchased scaffold.
project.namestringnoName used for the project and in package.json.
project.descriptionstringnoFree-text description saved with the project.
maintainbooleannoKeep repeat access to this repo renewable. Defaults to true. Ignored for x402 (accountless) purchases.
deliverystringno"clone" (default): git clone command. "inline": files in the reply. No git needed. More tokens.
admin_page_setstringnoOptional extra file-tree name (same overlay as template_files). Prefer site_profile / template_files.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "purchase_scaffold",
    "arguments": {
      "components": [
        "nextjs-base",
        "navbar"
      ],
      "project": {
        "name": "my-app"
      },
      "site_profile": true
    }
  }
}

get_scaffoldv1.0.0

Re-fetches a scaffold you already purchased via purchase_scaffold: a fresh clone credential and current component versions, at no additional credit cost. Requires an active Maintain subscription for a credit-flow project. delivery: "inline" returns the files in the reply instead of a clone command.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 10/min · permissions registry.read, account.credits

ArgumentTypeRequiredNotes
projectidstringyesThe project id from a previous purchase_scaffold result. Required — resolved from your authenticated account.
site_profileany-ofno
deliverystringno"clone" (default): git clone command. "inline": files in the reply. No git needed. More tokens.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_scaffold",
    "arguments": {
      "projectid": "proj_…"
    }
  }
}

get_projectsv1.0.0

Lists this account's saved scaffold projects (id, name, description, repo, components, maintain state).

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 30/min · permissions project.write

ArgumentTypeRequiredNotes
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_projects",
    "arguments": {}
  }
}

set_projectsv1.0.0

Turns Maintain on/off for one of this account's projects and/or rotates its project key. Identify the project with projectid (scoped to your authenticated account).

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 20/min · permissions project.write

ArgumentTypeRequiredNotes
projectidstringyesThe project id to change (from get_projects). Required — scoped to your authenticated account.
maintainbooleanno
rotatebooleannoIf true, mints a new project key and invalidates the old one.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "set_projects",
    "arguments": {
      "projectid": "proj_…",
      "maintain": false
    }
  }
}

get_siteprofilev1.0.0

Returns one or all of this account's named site profiles (privacy, terms, cookies, licence, custom_field) as JSON bodies + destination paths — not as files in a template repo.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 30/min · permissions component.generate

ArgumentTypeRequiredNotes
listbooleannoIf true, return this account's profile names instead of a profile's content.
siteprofilenamestringnoThe profile to fetch. Required unless list: true.
fieldany-ofno"all" (default), or an array from: privacy, terms, cookies, license, custom_field.
cursorstringnoResume token from a previous incomplete result, e.g. "doc:terms".
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_siteprofile",
    "arguments": {
      "siteprofilename": "default"
    }
  }
}

set_siteprofilev1.0.0

Creates or updates one named site profile for this account. Fields omitted keep their current saved value. An account may keep more than one named profile.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 20/min · permissions component.generate

ArgumentTypeRequiredNotes
siteprofilenamestringyesName for this profile, e.g. "default" or "acme-co".
fieldobjectyesFields to change. Omitted fields keep their current value.
field.privacystringno
field.termsstringno
field.cookiesstringno
field.licensestringno
field.custom_fieldobjectno
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "set_siteprofile",
    "arguments": {
      "siteprofilename": "acme-co",
      "field": {
        "privacy": "Our privacy policy text."
      }
    }
  }
}

get_githubv1.0.0

Shows whether this account has a GitHub repo connected, or lists files under a path. If not connected, includes installUrl so the user can grant read access (GitHub App). Prefer signing in with GitHub on botkelp.com first.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 30/min · permissions project.write

ArgumentTypeRequiredNotes
pathstringnoFolder or file in the connected repo to list. Omit for connection status.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_github",
    "arguments": {}
  }
}

set_githubv1.0.0

Returns a GitHub App install URL so the user can grant BotKelp read access to one repo. disconnect: true drops the connection. Then purchase_scaffold template_files: [{ source: "app/legal/" }] copies those pages into the clone.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 20/min · permissions project.write

ArgumentTypeRequiredNotes
disconnectbooleannotrue: drop the connected repo. Omit to mint a fresh install URL.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "set_github",
    "arguments": {}
  }
}

get_adminpagesetv1.0.0

Lists this account's admin page set names (omit name), or returns one set's exact files (pass name). These are extra file trees purchase_scaffold bakes into a unique personal repo.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 30/min · permissions component.generate

ArgumentTypeRequiredNotes
namestringnoThe set to fetch. Omit to list this account's set names instead.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_adminpageset",
    "arguments": {
      "name": "default"
    }
  }
}

set_adminpagesetv1.0.0

Creates or fully replaces one named admin page set for this account — real file source, not text config. An account may keep more than one named set.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 20/min · permissions component.generate

ArgumentTypeRequiredNotes
namestringyesName for this set, e.g. "default" or "acme-admin".
filesarray<object>yesThe full set of files, e.g. [{ path: "app/admin/page.tsx", content: "..." }]. (min 1)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "set_adminpageset",
    "arguments": {
      "name": "acme-admin",
      "files": [
        {
          "path": "app/admin/page.tsx",
          "content": "export default function AdminPage() { return <main><h1>Admin</h1></main>; }"
        }
      ]
    }
  }
}

verify_scaffoldv1.0.0

Runs a real `npm install && npm run build` against the given files on an isolated runner and reports whether the project builds. Two-call protocol: pass files to start (returns WAIT + jobId), then call again with jobId to get OK/FAIL. No credit cost, but requires the projectid of a project this account purchased. Use it after editing a get_scaffold result.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 10/min · permissions verify.run

ArgumentTypeRequiredNotes
projectidstringyesThe project id from a previous purchase_scaffold result — must be owned by this account. Required.
filesarray<object>noThe full project to verify — a scaffold's files with your edits applied. Omit when polling with jobId. (min 1)
envVariablesarray<string>noEnv var names to write placeholder values for before building (typically get_component's `envVariables` output) — needed for components that read process.env at build time (e.g. a Supabase client).
jobIdstringnoPoll a previously started verification. Omit on the first call (pass files), pass the returned jobId on subsequent calls.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "verify_scaffold",
    "arguments": {
      "projectid": "proj_…",
      "files": [
        {
          "path": "package.json",
          "content": "{ \"name\": \"my-app\", \"scripts\": { \"build\": \"next build\" } }"
        }
      ],
      "envVariables": [
        "NEXT_PUBLIC_SUPABASE_URL"
      ]
    }
  }
}

report_issuev1.0.0

File a GitHub issue on https://github.com/botkelp/components/issues about generated or catalog code, or request a new component/docs change. Requires a linked account (spam guard), rate-limited to 10 calls/day per account.

Gated: yes — MCP OAuth 2.1 / Bearer bk_live_ · 10/min · permissions issue.write

ArgumentTypeRequiredNotes
descriptionstringyesWhat is wrong or what you want. Include enough detail to reproduce. No secrets.
projectidstringnoOptional project id this report relates to.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "report_issue",
    "arguments": {
      "description": "Generated app/layout.tsx has <html> with no lang attribute. Next.js requires html as the root."
    }
  }
}

get_account_statusv1.0.0

Reports whether your authenticated account has a BotKelp account_api_key linked (yes/no) and when it was last linked/rotated. Never returns the key. Call after OAuth.

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

ArgumentTypeRequiredNotes
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_account_status",
    "arguments": {}
  }
}

Site profile

Pass site_profile on purchase_scaffold or get_scaffold. Documents are not written into the template repo, and an account can keep more than one named profile — see get_siteprofile/set_siteprofile below.

  • site_profile boolean | string · default false — On purchase_scaffold and get_scaffold. false/omit: skip. true: this account's one profile (errors if it has 0 or >1). A string: that named profile. Returns populated privacy/terms/cookies/licence/custom_field documents as JSON bodies + paths — never written into the template repo. An account can keep more than one named profile via get_siteprofile/set_siteprofile.

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}$
  • COMPONENT_VERSION_INCOMPATIBLE — exact pin does not fit stack; alternatives returned, no silent substitute
  • get_component: daily limit of 32 reached for this account
  • report_issue: daily limit of 10 reached for this account
  • MaintainRequiredError — a repeat get_scaffold/purchase_scaffold for a combination this account already has needs an active Maintain subscription (set_projects)
  • Integrity fail — catalog bytes did not match published SHA-256

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