Install MCPfinder — a local MCP server that searches Official MCP Registry, Glama, and Smithery for 25,000+ MCP servers — into the user's AI client...
MCPfinder is a discovery layer — a local MCP server that knows about 25,000+ other MCP servers across three registries (Official MCP Registry, Glama, Smithery) and generates install configs for them on demand. Install it once and the user's AI can then discover any MCP server without manual JSON edits.
Activate this skill when any of these is true:
Do not activate if:
search_mcp_servers, get_install_config, or
equivalently named MCPfinder tools available.Ask the user which client they use, unless it's obvious from session context:
"Which MCP client are you using? Claude Desktop, Cursor, Claude Code, Cline (VS Code), or Windsurf?"
Shortcut signals: a .mcp.json in the project = Claude Code; a .cursor/
directory = Cursor; etc.
| Client | Path |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Cursor (global) | ~/.cursor/mcp.json |
| Cursor (project) | <project>/.cursor/mcp.json |
| Claude Code (project, preferred) | <project>/.mcp.json |
| Claude Code (global) | ~/.claude.json |
| Cline / Roo Code | <project>/.vscode/mcp.json |
| Windsurf (macOS/Linux) | ~/.codeium/windsurf/mcp_config.json |
| Windsurf (Windows) | %USERPROFILE%\.codeium\windsurf\mcp_config.json |
If the user has both a project-scoped and global config and hasn't said which to use, ask. Default to project-scoped for Cursor, Claude Code, and Cline; default to global for Claude Desktop and Windsurf.
Read the existing config. If it doesn't exist yet, create it with the minimum wrapping structure.
Top-level key: mcpServers for everyone except Cline, which uses
servers.
MCPfinder entry to add:
{
"command": "npx",
"args": ["-y", "@mcpfinder/server"]
}
Example merge — existing config has one server already:
{
"mcpServers": {
"slack": {
"command": "uvx",
"args": ["slack-mcp"]
}
}
}
After merge:
{
"mcpServers": {
"slack": {
"command": "uvx",
"args": ["slack-mcp"]
},
"mcpfinder": {
"command": "npx",
"args": ["-y", "@mcpfinder/server"]
}
}
}
Preserve existing formatting and indentation. If writing fresh, use 2-space indent and a trailing newline.
If a server named mcpfinder already exists, do not overwrite it. Tell
the user there's already an entry with that name and ask whether to replace
or rename.
| Client | What to do |
|---|---|
| Claude Desktop | Quit Claude Desktop (not just close the window) and reopen. |
| Cursor | Reload window (Cmd/Ctrl+Shift+P → Developer: Reload Window) or restart. |
| Claude Code | Start a new claude session — running sessions don't hot-reload config. |
| Cline | Reload VS Code window. |
| Windsurf | Quit and reopen Windsurf. |
After the restart, the user's AI should have these four tools available:
search_mcp_servers — keyword / use-case search across all three registriesget_server_details — trust signals, env vars, warnings for one serverget_install_config — ready-to-paste JSON config for any target clientbrowse_categories — single-call category browserIf the user triggered this skill because they wanted a specific capability (e.g. "connect to Postgres"), remind them that on the next session they can simply ask again and the AI will use MCPfinder to handle it end-to-end.
servers, not mcpServers. Every other supported client
uses mcpServers at the top level. Easy to miss.better-sqlite3 native
bindings. If node -v shows anything lower, tell the user to upgrade
(nvm install 20 or similar) before installing.https://mcpfinder.dev/api/v1/snapshot on first run. If the
user is offline, first run will do a ~10-minute live sync against the three
upstream registries instead — it still works, just slower. Offer the
MCPFINDER_DISABLE_SNAPSHOT=1 env var for users who want to force a live
sync.@mcpfinder/server. Not mcpfinder-server, not
mcp-finder, not @mcpfinder/mcp — those are either squatted, legacy, or
unrelated. Always scoped as @mcpfinder/server.mcp.json. Strip comments before parsing, then
restore them — or use a JSONC-aware parser if available.