mcp-harbor-search
README.md
# mcp-harbor-search
[](https://mcpservers.org/servers/punkjazz-labs/mcp-harbor-search)
A public, remote [MCP](https://modelcontextprotocol.io) server that lets AI agents search the [MCP Harbor](https://mcpharbor.app) directory of 1,400+ MCP servers and AI-agent tools.
**Endpoint:** `https://mcpharbor.app/mcp` (Streamable HTTP, no auth, read-only)
## Tools
| Tool | Arguments | Returns |
|---|---|---|
| `search_tools` | `query` (string), `category`? (slug), `limit`? (1-50, default 10) | Ranked matches: slug, name, description, category, stars, URL, listing link |
| `get_tool` | `slug` (string) | Full listing for one tool |
Categories: `search-web`, `ai-agent-frameworks`, `cloud-infra`, `browser-automation`, `databases`, `memory-knowledge`, `productivity`, `developer-tools`, `finance-crypto`, `media-design`, `other`.
## Connect
Any client that supports remote MCP servers:
```json
{ "mcpServers": { "mcp-harbor": { "url": "https://mcpharbor.app/mcp" } } }
```
For stdio-only clients, use a bridge such as `mcp-remote`: `{"command":"npx","args":["mcp-remote","https://mcpharbor.app/mcp"]}`.
## Try it with curl
```sh
curl -s https://mcpharbor.app/mcp -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_tools","arguments":{"query":"postgres"}}}'
```
## Self-host
No dependencies and no build step. `src/mcp.js` is the protocol and search logic. `src/worker.js` is a Cloudflare Worker entry point that loads the directory dataset from `DATA_URL`.
```sh
npx wrangler deploy
```
## License
MIT, see [LICENSE](./LICENSE).
## Development
`npm ci && npm run check` runs ESLint, a strict TypeScript check of the JSDoc-typed JavaScript (`tsc`, `checkJs`), and the `node:test` suite (fixtures only, no network). GitHub Actions runs the same on every push and pull request.
TDQS
A4/5.0
Scored across 2 tools
Disambiguation5/5
The two tools have clearly distinct purposes: search_tools finds listings by keyword/category, while get_tool retrieves a specific listing by slug. There is no realistic overlap or ambiguity in selection.
Naming Consistency5/5
Both names follow the same snake_case verb_noun pattern, search_tools and get_tool. Singular/plural use is natural and predictable.
Tool Count4/5
A two-tool search-and-detail surface is minimal but well matched to a directory lookup server. The count is slightly thin under the general 3-15 guideline, but each tool earns its place.
Completeness4/5
The core lifecycle of searching the directory and fetching a specific listing is covered. Minor gaps could include browsing all entries or listing categories, but agents can work around these via search.
Maintenance
ActivityMaintained
ResponsivenessNo recent community issues