Help users discover, install, configure, and manage MCP servers. Supports OpenClaw, Claude Desktop, Claude Code, and Cursor.
${VAR_NAME}), never raw tokens. Never ask the user to paste their actual token in chat.Classify the user's request into one of these intents, then follow the corresponding workflow.
Run search: text
python3 {baseDir}/scripts/search_registries.py --query "<user's topic>" [--category "<category>"]
If clawHubMatch is present, mention the bundle first: "There's a [bundle name] plugin on ClawHub with [N] skills — want that instead?"
Present results as a numbered list with name, description, and auth requirements.
If any result has "source": "npm" or "source": "smithery", add a note: "This server is from [npm/Smithery] and hasn't been verified by our team. It should work but proceed with caution."
Offer to install any result.
If user asks "what else should I install?" or "recommend more servers": text
python3 {baseDir}/scripts/smart_recommend.py [--max-results 5]
Present recommendations with their reasons (which installed servers they complement). Offer to install any.
This is the most complex flow. Follow all steps in order.
Step 1 — Search:
text
python3 {baseDir}/scripts/search_registries.py --query "<server name>"
Step 2 — ClawHub bundle offer:
If clawHubMatch is present, offer the bundle:
I found a [bundle displayName] plugin on ClawHub that includes the MCP connection plus [skillCount] additional skills. Would you like the full bundle, or just the raw MCP connection?
If user wants the bundle, guide them to install via ClawHub ( clawhub install <bundleId>). Then record the install and stop.
Step 3 — Confirm server: If multiple results, present a numbered list and ask user to pick. If one result, confirm: "I'll set up [displayName] — sound good?"
Step 3.5 — Compatibility check (if non-default client): If the user specified a client or you detected a non-OpenClaw client, check compatibility:
text
python3 {baseDir}/scripts/check_compatibility.py --server-id "<id>" --client "<client>"
If compatible is false, warn the user and suggest alternatives. If there are warnings, mention them but proceed.
Step 4 — Build config:
text
python3 {baseDir}/scripts/build_config.py --server-id "<id>" [--client "<client>"]
The --client flag is optional. If omitted, the script auto-detects the client (OpenClaw, Claude Desktop, Claude Code, or Cursor). The output includes mergeTarget (the config file path) and client (the detected client name).
Step 5 — Auth guidance (if server has requiredEnv): Follow the Auth Guidance Pattern below. Wait for user to confirm they have their token ready before proceeding.
Step 6 — Check prerequisites and install:
text
python3 {baseDir}/scripts/install_server.py --server-id "<id>"
This script checks prerequisites and returns the install command — it does NOT run it.
prerequisitesMet is false, show the prerequisites.suggestion and help the user install the prerequisite first.prerequisitesMet is true, run the installCommand.command directly using the Bash tool. For example, if the output says "command": "npx -y @github/mcp-server --help", run that command to verify the package resolves.installCommand.command is null (HTTP servers), skip — no install needed.installCommand.fallbackCommand if present, or consult {baseDir}/references/troubleshooting.md.Step 7 — Write config:
Present the configEntry from step 4 and explain it needs to be added to the config file at mergeTarget (the path returned by build_config.py). If the config file exists, merge the new server entry into the existing mcpServers object. If it doesn't exist, create it:
json
{
"mcpServers": {
<configEntry content here>
}
}
Step 8 — Record state:
text
python3 {baseDir}/scripts/manage_servers.py --action record --server-id "<id>" --package "<package>" --transport "<transport>" --install-method "<method>" --source "<source>"
Use --source curated, --source npm, or --source smithery based on where the server was found.
Step 8.5 — Health check (optional):
text
python3 {baseDir}/scripts/health_check.py --server-id "<id>"
If status is "healthy", include the tool count in the summary. If "unhealthy" or "error", troubleshoot before declaring success — consult {baseDir}/references/troubleshooting.md.
Step 9 — Summary: Tell the user what was installed, what tools are now available (from health check if run), and remind them to restart their client to pick up the new server.
If user mentions a specific bundle, resolve it. If they describe a use case, match to the closest bundle: text
python3 {baseDir}/scripts/bulk_install.py --bundle "<bundle-name>"
Available bundles: standard-dev, data-engineering, web-frontend, devops, productivity, ai-ml.
If unsure which bundle, list them all: text
python3 {baseDir}/scripts/bulk_install.py --bundle __list__
Present the options and let the user choose.
Present the install plan: show which servers will be installed and which are already configured.
For each server in toInstall, follow the INSTALL workflow (Steps 3-9). Process them one at a time, confirming auth requirements for each.
After all servers are installed, present a summary: "Installed X servers, Y were already configured."
Run detection: text
python3 {baseDir}/scripts/detect_servers.py --verbose
If unconfigured has entries: "I found [count] MCP server packages on your system that aren't configured yet: [list them]. Want me to set up any of them?"
If alreadyConfigured has entries: mention them as already active.
If nothing detected: "No known MCP server packages found. Want me to search for servers to install?"
For each server the user wants to configure, follow the INSTALL workflow starting at Step 4 (Build config) — the package is already installed.
Scan the project: text
python3 {baseDir}/scripts/recommend_servers.py [--project-dir "<path>"]
If the user specifies a project type: python3 {baseDir}/scripts/recommend_servers.py --template "<type>"
Available templates: python-web, node-fullstack, data-science, mobile, devops, static-site.
If detected is true:
If detected is false:
Identify the server from the user's request.
Run build_config.py --server-id "<id>" with any custom env/args the user provides:
text
python3 {baseDir}/scripts/build_config.py --server-id "<id>" --custom-env '{"KEY": "${KEY}"}'
Follow the Auth Guidance Pattern for any new env vars.
Update the .mcp.json config entry.
Run: text
python3 {baseDir}/scripts/manage_servers.py --action list
Present as a formatted table: server name, package, transport, install method, installed date, config present.
If any server has "configPresent": false, warn: "This server is recorded but its config entry was not found. It may need to be re-configured."
If the user asks about a specific server: text
python3 {baseDir}/scripts/manage_servers.py --action status --server-id "<id>"
If no servers installed, suggest running a discovery search.
Confirm: "Remove [displayName]? This will remove the state record. You should also remove its entry from .mcp.json."
Run: text
python3 {baseDir}/scripts/manage_servers.py --action remove --server-id "<id>"
Remind user to remove the corresponding entry from .mcp.json and restart OpenClaw.
Run version check: text
python3 {baseDir}/scripts/version_check.py
For a specific server: python3 {baseDir}/scripts/version_check.py --server-id "<id>"
Present results:
updateAvailable: true: show current vs latest version and the updateCommand.note (npx/uvx/http): explain they auto-resolve or are managed remotely.docker pull to refresh the image.If the user wants to update, run the updateCommand for each server via the Bash tool.
After updating, optionally run a health check to verify the updated server works.
Identify the server from the user's request.
Run: text
python3 {baseDir}/scripts/health_check.py --server-id "<id>"
If status is "healthy":
If status is "unhealthy" or "error":
{baseDir}/references/troubleshooting.md for the specific error.python3 {baseDir}/scripts/manage_servers.py --action update-status --server-id "<id>" --status errorIdentify the server.
Run health check: text
python3 {baseDir}/scripts/health_check.py --server-id "<id>"
Based on the error, consult {baseDir}/references/troubleshooting.md.
Guide the user through the fix step by step.
Re-run health check to confirm resolution.
If resolved, update status: python3 {baseDir}/scripts/manage_servers.py --action update-status --server-id "<id>" --status active
Gather server details from the user:
my-server)stdio or httpnpx, npm, uvx, pip, http, or dockerGenerate and validate the entry: text
python3 {baseDir}/scripts/contribute_server.py --id "<id>" --display-name "<name>" --description "<desc>" --package "<pkg>" --transport "<transport>" --install-method "<method>" --categories "<cat1,cat2>" --tags "<tag1,tag2>" --required-env "<VAR1,VAR2>"
If valid is true: present the serverEntry JSON and the prBody template. Guide the user to submit a PR to the marketplace repository.
If valid is false: show the validationErrors and help the user fix them, then re-run.
When a server requires environment variables:
List each required variable with its purpose (from authGuidance.instructions).
Provide the generation URL if available: "You can create one at [URL]".
Show the export command: export VAR_NAME=<your-value-here>
Remind about persistence: "Add this to ~/.zshrc (or ~/.bashrc) so it persists across sessions."
NEVER ask the user to paste their actual token in the chat. Guide them to set it in their shell.
NEVER store raw token values in config — only ${VAR_NAME} references.
Offer secrets manager (if available): Before telling the user to add export to .zshrc, check for a secrets manager:
text
python3 {baseDir}/scripts/secrets_helper.py --action detect
If managers are found, offer the option: "I detected [manager name] on your system. Want to store this token there instead of in your shell profile? It's more secure." If yes, generate the store command: text
python3 {baseDir}/scripts/secrets_helper.py --action store-command --manager "<manager>" --service "<server-name>" --env-var "<VAR_NAME>"
Present the storeCommand for the user to run, then show the shellIntegration line to add to ~/.zshrc.
When authGuidance.authType is "oauth":
authGuidance.oauthSetupSteps as a numbered list.GOOGLE_APPLICATION_CREDENTIALS).{baseDir}/references/troubleshooting.md for the specific error and guide the user.{baseDir}/references/transport-patterns.md and walk through it.python3 {baseDir}/scripts/health_check.py --server-id "<id>" to diagnose. Consult {baseDir}/references/troubleshooting.md.--timeout 30.mergeTarget path from build_config.py. See {baseDir}/references/troubleshooting.md for client-specific config paths.Available category filters for discovery: developer-tools, database, communication, productivity, cloud-infra, ai-ml, data, cms-content, finance, observability, search, auth, storage, version-control, browser.