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.
| Client | Auth Mechanism | Setup / Command |
|---|---|---|
| Mistral Vibe CLI | Bearer (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.1 | Connectors UI (leave client ID/secret blank) |
| Mistral Le Chat | MCP OAuth 2.1 | Custom connector, URL only. Sign in when prompted |
| Claude Code | OAuth / Bearer | claude mcp add --transport http botkelp https://www.botkelp.com/mcp |
| Cursor / Windsurf / Desktop | OAuth / Bearer | mcpServers json configuration |
| Hermes | OAuth / Bearer | hermes mcp add botkelp --url https://www.botkelp.com/mcp |
| OpenClaw | OAuth / Bearer | openclaw 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
- Call purchase_scaffold with component ids and no payment to get price / accepts
- Retry the same call with _meta["x402/payment"] set to a matching signed payment
- 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
| Argument | Type | Required | Notes |
|---|
{
"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
| Argument | Type | Required | Notes |
|---|---|---|---|
| component | string | yes | Component 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| components | array<string> | yes | Component ids to include, e.g. ["nextjs-base", "tailwind", "supabase-client"]. (min 1) |
| site_profile | any-of | no | false/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_files | any-of | no | true: every saved dashboard template file. Or a list of {name} and/or {source, dest} from the connected GitHub repo (source may be a folder). |
| project | object | no | Project metadata to save alongside the purchased scaffold. |
| project.name | string | no | Name used for the project and in package.json. |
| project.description | string | no | Free-text description saved with the project. |
| maintain | boolean | no | Keep repeat access to this repo renewable. Defaults to true. Ignored for x402 (accountless) purchases. |
| delivery | string | no | "clone" (default): git clone command. "inline": files in the reply. No git needed. More tokens. |
| admin_page_set | string | no | Optional 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| projectid | string | yes | The project id from a previous purchase_scaffold result. Required — resolved from your authenticated account. |
| site_profile | any-of | no | |
| delivery | string | no | "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
| Argument | Type | Required | Notes |
|---|
{
"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
| Argument | Type | Required | Notes |
|---|---|---|---|
| projectid | string | yes | The project id to change (from get_projects). Required — scoped to your authenticated account. |
| maintain | boolean | no | |
| rotate | boolean | no | If 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| list | boolean | no | If true, return this account's profile names instead of a profile's content. |
| siteprofilename | string | no | The profile to fetch. Required unless list: true. |
| field | any-of | no | "all" (default), or an array from: privacy, terms, cookies, license, custom_field. |
| cursor | string | no | Resume 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| siteprofilename | string | yes | Name for this profile, e.g. "default" or "acme-co". |
| field | object | yes | Fields to change. Omitted fields keep their current value. |
| field.privacy | string | no | |
| field.terms | string | no | |
| field.cookies | string | no | |
| field.license | string | no | |
| field.custom_field | object | no |
{
"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
| Argument | Type | Required | Notes |
|---|---|---|---|
| path | string | no | Folder 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| disconnect | boolean | no | true: 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| name | string | no | The 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Name for this set, e.g. "default" or "acme-admin". |
| files | array<object> | yes | The 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| projectid | string | yes | The project id from a previous purchase_scaffold result — must be owned by this account. Required. |
| files | array<object> | no | The full project to verify — a scaffold's files with your edits applied. Omit when polling with jobId. (min 1) |
| envVariables | array<string> | no | Env 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). |
| jobId | string | no | Poll 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
| Argument | Type | Required | Notes |
|---|---|---|---|
| description | string | yes | What is wrong or what you want. Include enough detail to reproduce. No secrets. |
| projectid | string | no | Optional 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
| Argument | Type | Required | Notes |
|---|
{
"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.