Koskamo

BotKelp MCP

A remote MCP server providing a catalog of verified building blocks for AI coding agents. It allows agents to assemble scaffolds for full-stack applications (Next.js, Django, etc.) that actually build, handling authentication and payments via x402 or OAuth.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

BotKelp MCP logo, by BotKelpCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by BotKelp
You need:Any MCP clientAn account: every other tool; sign in when prompted (MCP OAuth 2.1) or send Authorization: Bearer bk_live_…A 401 means "needs an account"
MCP endpoint (Streamable HTTP)
https://www.botkelp.com/mcp
Vendor documentation

What you can do with it

  • Assemble a Next.js + Supabase + Stripe app scaffold
  • Browse verified component catalog for login, payments, database
  • Generate project files that install and build correctly
  • Manage keys and credit from a single dashboard

Source and maintenance

Community listingRegistry 1.1.0
Maintenance checked

Protocol and capabilities

Server
botkelp 0.2.0
MCP protocol
2025-06-18
Tools
16 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Call get_help first (a short index), then search_components to pick ids — both free, with no API key required. You never pass any API key as a tool argument: the server authenticates you once via MCP OAuth 2.1 at the transport and injects your linked BotKelp account key on your behalf. Call get_account_status to check whether your key is linked. If generated or catalog code is wrong, outdated, fails to build, has a security issue, or you want a new component, call report_issue.

Tools

16 advertised

get_help — Get help
Advertised by the server during the last successful anonymous check.
Advertised read-only

Free. Short usage index. Then search_components to pick ids.

get_help input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
get_help annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_components — Search components
Advertised by the server during the last successful anonymous check.
Advertised read-only

Free. Compact catalog TSV: id, provides, requires, conflictsWith. Omit args for all.

search_components input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "query": {
      "type": "string",
      "description": "Words to match, e.g. \"auth stripe\"."
    },
    "detail": {
      "type": "boolean",
      "description": "Add short descriptions."
    },
    "provides": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Required capability tags."
    }
  }
}
search_components annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_component — Get component source
Advertised by the server during the last successful anonymous check.
Advertised read-only

One component's source files, UNRENDERED (EJS markers, not build-ready): inspect only; use purchase_scaffold for real files. Free, 32/day, signed-in account.

get_component input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "component"
  ],
  "properties": {
    "component": {
      "type": "string",
      "description": "Component id, or id@version, e.g. \"supabase-client@2.0.0\"."
    }
  }
}
get_component annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
purchase_scaffold — Purchase scaffold
Advertised by the server during the last successful anonymous check.
Open-world

Buys a CI-green starter repo for component ids (credits via your signed-in account, or x402). Returns a git clone command and projectid. Red builds are refused and not charged. delivery "inline" returns files instead (more tokens).

purchase_scaffold input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "components"
  ],
  "properties": {
    "project": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Your label."
        },
        "description": {
          "type": "string",
          "description": "Notes."
        }
      },
      "description": "Saved project metadata."
    },
    "delivery": {
      "enum": [
        "clone",
        "inline"
      ],
      "type": "string",
      "description": "\"clone\" (default) or \"inline\"."
    },
    "maintain": {
      "type": "boolean",
      "description": "Renewable repeat access (default true)."
    },
    "components": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "description": "Component ids, e.g. [\"nextjs-base\",\"tailwind\"]."
    },
    "site_profile": {
      "type": [
        "boolean",
        "string"
      ],
      "description": "true or a profile name: bake legal pages in."
    },
    "admin_page_set": {
      "type": "string",
      "description": "Extra file-set name."
    },
    "template_files": {
      "anyOf": [
        {
          "type": "boolean",
          "const": true
        },
        {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "dest": {
                "type": "string",
                "description": "Destination path."
              },
              "name": {
                "type": "string",
                "description": "Saved file name."
              },
              "source": {
                "type": "string",
                "description": "Path in connected repo."
              }
            }
          }
        }
      ],
      "description": "Extra files: true, or [{name}|{source,dest}]."
    }
  }
}
purchase_scaffold annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_scaffold — Get scaffold
Advertised by the server during the last successful anonymous check.
Open-world

Refetches a scaffold you purchased (fresh clone command), no extra credits. Credit-flow projects need Maintain on. Same site_profile/delivery options as purchase_scaffold.

get_scaffold input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectid"
  ],
  "properties": {
    "delivery": {
      "enum": [
        "clone",
        "inline"
      ],
      "type": "string",
      "description": "\"clone\" (default) or \"inline\"."
    },
    "projectid": {
      "type": "string",
      "description": "The project id from a previous purchase_scaffold result. Required — your project is resolved from your authenticated account."
    },
    "site_profile": {
      "type": [
        "boolean",
        "string"
      ],
      "description": "false/omit: skip. true: attach this account's one site profile (errors if 0 or >1). A string: attach that named profile."
    }
  }
}
get_scaffold annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_projects — Get projects
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists this account's saved scaffold projects (id, name, description, repo, components, maintain state). Use the projectid with get_scaffold to re-fetch a scaffold — no project_api_key is needed as a tool argument.

get_projects input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
get_projects annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
set_projects — Set projects
Advertised by the server during the last successful anonymous check.
Advertised destructive

Turn Maintain on/off for a project and/or rotate its project key. Off keeps existing clones; it stops future get_scaffold access.

set_projects input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectid"
  ],
  "properties": {
    "rotate": {
      "type": "boolean",
      "description": "If true, mints a new project key and invalidates the old one."
    },
    "maintain": {
      "type": "boolean"
    },
    "projectid": {
      "type": "string",
      "description": "The project id to change (from get_projects). Required — scoped to your authenticated account."
    }
  }
}
set_projects annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
get_siteprofile — Get site profile
Advertised by the server during the last successful anonymous check.
Advertised read-only

Your site profiles (privacy, terms, cookies, licence, custom_field) as JSON. list: true for names, or siteprofilename for one; field filters. Use next.arguments when a purchase reply says incomplete: true.

get_siteprofile input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "list": {
      "type": "boolean",
      "description": "If true, return this account's profile names instead of a profile's content."
    },
    "field": {
      "anyOf": [
        {
          "type": "string",
          "const": "all"
        },
        {
          "type": "array",
          "items": {
            "enum": [
              "privacy",
              "terms",
              "cookies",
              "license",
              "custom_field"
            ],
            "type": "string"
          }
        }
      ],
      "description": "\"all\" (default), or an array from: privacy, terms, cookies, license, custom_field."
    },
    "cursor": {
      "type": "string",
      "description": "Resume token from a previous incomplete result, e.g. \"doc:terms\"."
    },
    "siteprofilename": {
      "type": "string",
      "description": "The profile to fetch. Required unless list: true."
    }
  }
}
get_siteprofile annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
set_siteprofile — Set site profile
Advertised by the server during the last successful anonymous check.
Advertised destructive

Creates or updates one named site profile for this account. Fields omitted from `field` keep their current saved value (or blank, if the profile is new); pass only what changed. custom_field entries are merged key-by-key. An account may keep more than one named profile (e.g. one per brand/site).

set_siteprofile input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "siteprofilename",
    "field"
  ],
  "properties": {
    "field": {
      "type": "object",
      "properties": {
        "terms": {
          "type": "string"
        },
        "cookies": {
          "type": "string"
        },
        "license": {
          "type": "string"
        },
        "privacy": {
          "type": "string"
        },
        "custom_field": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "description": "Fields to change. Omitted fields keep their current value."
    },
    "siteprofilename": {
      "type": "string",
      "description": "Name for this profile, e.g. \"default\" or \"acme-co\"."
    }
  }
}
set_siteprofile annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
get_adminpageset — Get admin page set
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists this account's admin page set names (omit name), or returns one set's exact files (pass name). These are the file trees purchase_scaffold's admin_page_set param bakes into a dedicated forked repo. Requires a linked account (transport auth).

get_adminpageset input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "name": {
      "type": "string",
      "description": "The set to fetch. Omit to list this account's set names instead."
    }
  }
}
get_adminpageset annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
set_adminpageset — Set admin page set
Advertised by the server during the last successful anonymous check.
Advertised destructive

Creates or fully replaces one named admin page set for this account — real file source (React/Next.js), not text config. purchase_scaffold's admin_page_set param bakes a chosen set into a brand-new, dedicated repo. An account may keep more than one named set.

set_adminpageset input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "name",
    "files"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "Name for this set, e.g. \"default\" or \"acme-admin\"."
    },
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path",
          "content"
        ],
        "properties": {
          "path": {
            "type": "string",
            "description": "Relative file path, e.g. \"app/layout.tsx\"."
          },
          "content": {
            "type": "string"
          }
        }
      },
      "minItems": 1,
      "description": "The full set of files, e.g. [{ path: \"app/admin/page.tsx\", content: \"...\" }]."
    }
  }
}
set_adminpageset annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
verify_scaffold — Verify scaffold
Advertised by the server during the last successful anonymous check.
Open-world

Remote `npm install && npm run build` of your edited files (send every file). Call with files -> WAIT + jobId; call again with jobId -> OK or FAIL with the error tail. Needs a purchased projectid.

verify_scaffold input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "projectid"
  ],
  "properties": {
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path",
          "content"
        ],
        "properties": {
          "path": {
            "type": "string",
            "description": "Relative file path, e.g. \"app/layout.tsx\"."
          },
          "content": {
            "type": "string"
          }
        }
      },
      "minItems": 1,
      "description": "The full project to verify — a scaffold's files with your edits applied. Omit when polling with jobId."
    },
    "jobId": {
      "type": "string",
      "description": "Poll a previously started verification. Omit on the first call (pass files), pass the returned jobId on subsequent calls."
    },
    "projectid": {
      "type": "string",
      "description": "The project id from a previous purchase_scaffold result — must be owned by this account. Required."
    },
    "envVariables": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "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)."
    }
  }
}
verify_scaffold annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
report_issue — Report an issue
Advertised by the server during the last successful anonymous check.
Open-world

Report a catalog/code bug or request a component (files an issue on botkelp/components). Signed-in account, 10/day. No secrets.

report_issue input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "description"
  ],
  "properties": {
    "projectid": {
      "type": "string",
      "description": "Optional project id this report relates to."
    },
    "description": {
      "type": "string",
      "description": "What is wrong or what you want. Include enough detail to reproduce. No secrets."
    }
  }
}
report_issue annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_github — Get GitHub connection
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Shows whether this account has a GitHub repo connected, or lists files under a path in that repo. If not connected, the result includes installUrl — open it (GitHub App) to grant read access to one repo. Sign in on botkelp.com with GitHub first so the install is tied to your account.

get_github input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "path": {
      "type": "string",
      "description": "Folder or file in the connected repo to list. Omit for connection status."
    }
  }
}
get_github annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
set_github — Connect or disconnect GitHub
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Returns a GitHub App install URL so the user can grant BotKelp read access to one of their repos. Open the URL, pick a single repo, approve. Then purchase_scaffold template_files: [{ source: "app/legal/" }] copies those pages into the clone. disconnect: true drops the connection. Prefer signing in with GitHub on botkelp.com first.

set_github input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "disconnect": {
      "type": "boolean",
      "description": "true: drop the connected repo. Omit to mint a fresh install URL."
    }
  }
}
set_github annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
get_account_status — Get account status
Advertised by the server during the last successful anonymous check.
Advertised read-only

No params. Says whether you are signed in (authenticated) and account tools work (accountToolsReady). Never returns a key.

get_account_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
get_account_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

catalog — Component catalog

Advertised by the server during the last successful anonymous check.

Full BotKelp component catalog as TSV (with descriptions). No tool call needed.

catalog URI
botkelp://catalog

MIME type: text/tab-separated-values

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1085 ms
95th percentile latency
1085 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1085 ms · metadata changed · 16 tool(s), 1 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http botkelp-mcp https://www.botkelp.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add botkelp-mcp --url https://www.botkelp.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable botkelp-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "botkelp-mcp": {
      "url": "https://www.botkelp.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "botkelp-mcp": {
      "type": "streamableHttp",
      "url": "https://www.botkelp.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start botkelp-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "botkelp-mcp": {
      "type": "http",
      "url": "https://www.botkelp.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http botkelp-mcp https://www.botkelp.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "botkelp-mcp": {
      "url": "https://www.botkelp.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "botkelp-mcp": {
      "serverUrl": "https://www.botkelp.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like BotKelp MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.