cyanheads-mcp-server
OfficialProvides tools to search and retrieve research papers from arXiv, enabling access to scholarly articles across various scientific disciplines.
Provides geocoding and location data services from OpenStreetMap, allowing conversion of addresses to coordinates and reverse geocoding.
Provides tools to search and access researcher profiles and works from ORCID, facilitating interaction with researcher identity data.
Provides tools to query and access structured data from Wikidata, enabling retrieval of entity information and relationships.
Provides tools to search and retrieve encyclopedia content from Wikipedia, enabling access to articles, summaries, and links.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Public Hosted Server: https://cyanheads.caseyjhand.com/mcp
Overview
Find the right MCP tool for the job across the cyanheads fleet. Describe a task in plain language to search every tool and server, then get a description, connection URL, and install snippet for your client.
Tools
Tool | Description |
| Search fleet tools and servers by natural-language query. Returns ranked matches with brief summaries and the owning server. |
| Return the description, connection URL, and per-client install snippet for a named tool or server. |
Skills
Skill | Description |
Find a fleet server for a task and hand over a working install: telling real matches from near misses, the category filter, hosted vs local installs, and env vars the snippets leave out. Served over MCP as |
Related MCP server: embecode
Capability reference
cyanheads_search_catalog tool
query1–500 raw characters, with non-whitespace text required; surrounding whitespace is trimmed before embedding and echo.scopeselectstools(default) orservers; optionalcategory:research,government,public-data,utility;limit1–1000 (default 5), served at most 20 per call: when a largerlimitleaves matches past the page, the response addstruncated,shown,cap, and anoticenaming the offset to continue from.Results carry cosine-similarity
score([0, 1], comparable within one response). Tool searches include aserversroll-up with ten entries per page andserversTotal; an unloaded catalog returns retryablecatalog_empty.Page results with
offsetand the tools-scope roll-up independently withserversOffset(both default to 0). Reuse the same query, scope, category, and limit withnextOffset/nextServersOffset; null means exhausted. Each call uses the current catalog, so a refresh between pages can change ordering. Servers scope requiresserversOffset: 0and omits roll-up fields.SIMILARITY_FLOOR(default0.3) filters matches before the limit applies.An empty
categorystring is treated as omitted; other unknown category values are rejected. Categories are catalog labels, not publisher types, and a wrong one drops the matching server without a notice unless nothing else matches.
cyanheads_describe_entry tool
name1–64 characters accepts a tool or server name, auto-detected or pinned viakind. Exact names win, then unique case-insensitive names; output uses canonical names.clientoptionally selectsclaude-code,cline,codex,cursor,gemini,streamable-http(genericmcpServersJSON), orcurl.server(optional, 1–64 characters) names the owning server: a search result'sname+serverdescribes exactly that row, in either scope. It is required when more than one server owns the tool name; with a server name, it must name the same server.Empty
kind,client, andserverstrings are treated as omitted. Other unknownkindorclientvalues are rejected.Both kinds return connection metadata and install snippets; server results also include the full tool inventory. Published servers get local snippets; hosted servers also get HTTP snippets. For local-only entries,
client: "curl"returns successful metadata with aninstallNoticenaming a stdio client to try. Required environment variables remain visible even without snippets; they list what the server's manifest marks required, so a key it leaves optional is absent.Descriptions are catalog text; obtain tool schemas from the connected server's
tools/list.Failures return
not_found,ambiguous_kind(setkind),ambiguous_owner(setserver; the error lists the owners), or retryablecatalog_empty.
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Catalog-specific:
Hourly background catalog refresh (
CATALOG_REFRESH_SECONDS, default3600) with an atomic index swap whengeneratedAtchanges — no restart neededEmpty catalogs, conflicting duplicate identities, and vectors that can't be normalized (wrong dimension, all zeros, or a non-finite component) fail before index replacement; refresh retains the last valid catalog. Identical duplicates collapse before indexing, with a bounded load-time warning; servers with no tools remain valid.
Query embeddings are computed at request time via
@huggingface/transformers; document embeddings are pre-computed, L2-normalized, and Matryoshka-truncated, shipped insidefleet.json. The server normalizes each document vector again at load, so scores stay cosine similarities even when a catalog's vectors drift from unit length, and a bounded warning names vectors more than1e-4off.The embedding model is warmed up during startup, before OpenTelemetry's HTTP instrumentation patches
fetch— avoids a cold-cache model-load failure under OTELSelf-describing:
cyanheads_describe_entryresolves this server's own name and tools from a static fallback record, consulted only when the remote catalog doesn't carry an entry for itCATALOG_URLcan point at any endpoint serving the same schema, to front a custom fleet
Agent-friendly output:
Search responses echo the effective query, report the total match count before the limit, include broadening guidance when nothing matches, and name the offset to continue from when a
limitabove 20 is cut to the per-call capDiscriminated
result.kind(tool|server) oncyanheads_describe_entrylets callers branch on data, not string parsingEvery search result carries a
scorefield for trust calibration, plus aserversroll-up so agents can see which servers matched without a second call
Getting started
Connect to the hosted instance, no install:
claude mcp add --transport http cyanheads-mcp-server https://cyanheads.caseyjhand.com/mcpOr run it locally:
claude mcp add cyanheads-mcp-server -- npx -y @cyanheads/cyanheads-mcp-serverFor other clients, add this to the MCP config file:
{
"mcpServers": {
"cyanheads-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/cyanheads-mcp-server"]
}
}
}The Claude Desktop bundle (the install badge above) runs the embedding model on ONNX WebAssembly, so it needs no platform-specific native libraries; npm and Docker installs use native CPU inference. Either way, the first start downloads the embedding model and later starts reuse the model cache. For Docker or a source build, see Running the server.
Configuration
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Every variable has a sensible default — out of the box, the server points at the canonical cyanheads fleet.
Variable | Description | Default |
| Transport: |
|
| HTTP server port |
|
| HTTP server bind host |
|
| HTTP endpoint path where the MCP server is mounted |
|
| Authentication: |
|
| HTTP session posture: |
|
| Log level ( |
|
| Remote fleet.json endpoint (schema v2 with baked embeddings). Must be an absolute URL. Override to front your own fleet. |
|
| Per-request timeout for fleet.json fetches: integer milliseconds, |
|
| Background poll interval for fleet.json refresh. |
|
| Hugging Face model id for query embedding. Must match |
|
| Cosine similarity cutoff for |
|
| Enable OpenTelemetry |
|
| OTLP base URL for traces and metrics | Unset |
| Explicit OTLP logs URL; requires the OTel log peers included in the default Docker build | Unset |
| Log failed arguments and results, redacted by key name. Secrets inside free-form values are not redacted. |
|
| UTF-8 byte cap for each logged failure payload |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Requires Bun v1.4.0 or higher (or Node.js v24+).
Clone and install:
git clone https://github.com/cyanheads/cyanheads-mcp-server.git cd cyanheads-mcp-server && bun install cp .env.example .env # every variable has a default; override as neededBuild and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, runs MCP and packaging linters bun run test # Runs the test suite
Docker
docker run --rm -p 3010:3010 ghcr.io/cyanheads/cyanheads-mcp-server:latestThe image defaults to HTTP transport, stateless session mode, and logs to /var/log/cyanheads-mcp-server. To run it over stdio from an MCP client, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/cyanheads-mcp-server:latest"]. To build locally, docker build -t cyanheads-mcp-server .; OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
| Tool definitions ( |
| Catalog service — remote fleet.json provider with atomic-swap refresh, vector index, snippet builders, the self-description fallback record, and the query-time embedding runtime ( |
| Server-specific environment variable parsing and validation with Zod. |
| Unit and integration tests, mirroring the |
| Design doc and schema reference. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor logging,ctx.statefor storageRegister new tools in the
toolsarray passed tocreateApp()insrc/index.tsWrap external data: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Search and install 4,000+ security-scanned MCP servers from inside any MCP-aware AI client.
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Search and get install details on MCP servers, right from your agent -- a unified marketplace index.
Search GitHub, npm, PyPI, StackOverflow, ArXiv from one MCP — built for coding agents.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAI-first MCP server discovery tool that enables agents to search, inspect, and install MCP servers from multiple registries.13AGPL 3.0
- AlicenseAqualityDmaintenanceLocal-first MCP server for semantic + keyword hybrid code search. Zero external services, no API keys required.2MIT
- AlicenseNot gradedqualityCmaintenanceProvides MCP tools for semantic search over personal knowledge sources using pluggable embeddings and local vector indexing.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP-based hybrid semantic code search over repositories, providing tools for searching code by meaning or keyword, retrieving symbol definitions, finding usages, reading chunks, and listing indexed repos.MIT