Cyanheads Mcp Server

io.github.cyanheadsPublished by GitHub account cyanheadsv0.5.0Updated Oct 29, 2026

Fleet discovery for the cyanheads MCP ecosystem — semantic search + install snippets.

VerifiedStreamable HTTPWeb executableKnowledge & MemoryDeveloper Tools

Overview

AI-generated overview

Discovery server for the cyanheads MCP fleet: lets an assistant semantically search tools and servers and get install snippets.

What you can do
  • Search the cyanheads fleet by natural-language description, scoped to individual tools or to whole servers, with ranked matches, similarity scores and a server roll-up
  • Describe a named tool or server to get its description, owning server, connection metadata and full tool inventory
  • Retrieve per-client install snippets (local npx/stdio and, for hosted servers, HTTP) for a chosen client
  • Page through large result sets with offsets and continue searches with the returned next offsets
When to use it
Useful when you want an assistant to help pick and wire up other cyanheads MCP servers for a task, rather than for doing the task itself. It is a catalog front door, so it adds little if you already know which server you need.
Requirements
Either the public hosted endpoint (no install) or a local process via npx, which needs Node.js; a source build needs Bun 1.4.0+ or Node.js 24+. The first local start downloads a Hugging Face embedding model (default Snowflake/snowflake-arctic-embed-m-v1.5) and needs network access to fetch the remote fleet.json catalog. All environment variables have defaults; authentication defaults to none.
Before you install
The catalog is fetched from a remote URL and refreshed hourly, so results depend on that third-party endpoint; CATALOG_URL can be pointed at another fleet. Query text is embedded locally via the Hugging Face model. Optional failure-payload logging (LOG_TOOL_FAILURE_PAYLOADS) can record tool arguments and results, and secrets inside free-form values are not redacted. Install snippets are catalog text and may omit optional environment variables.

Installation

In SourceWeft

  1. Open Cyanheads Mcp Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.cyanheads%2Fcyanheads-mcp-server/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "cyanheads": {
      "type": "http",
      "url": "https://cyanheads.caseyjhand.com/mcp"
    }
  }
}

README

@cyanheads/cyanheads-mcp-server

Fleet discovery for the cyanheads MCP ecosystem — semantic search + install snippets.

2 Tools • 0 Resources • 0 Prompts

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

ToolDescription
cyanheads_search_catalogSearch fleet tools and servers by natural-language query. Returns ranked matches with brief summaries and the owning server.
cyanheads_describe_entryReturn the description, connection URL, and per-client install snippet for a named tool or server.

Skills

SkillDescription
cyanheads-guideFind 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 skill://cyanheads-guide/SKILL.md and loaded by Claude Code and Codex plugin installs.

Capability reference

cyanheads_search_catalog tool

  • query 1–500 raw characters, with non-whitespace text required; surrounding whitespace is trimmed before embedding and echo. scope selects tools (default) or servers; optional category: research, government, public-data, utility; limit 1–1000 (default 5), served at most 20 per call: when a larger limit leaves matches past the page, the response adds truncated, shown, cap, and a notice naming the offset to continue from.
  • Results carry cosine-similarity score ([0, 1], comparable within one response). Tool searches include a servers roll-up with ten entries per page and serversTotal; an unloaded catalog returns retryable catalog_empty.
  • Page results with offset and the tools-scope roll-up independently with serversOffset (both default to 0). Reuse the same query, scope, category, and limit with nextOffset / nextServersOffset; null means exhausted. Each call uses the current catalog, so a refresh between pages can change ordering. Servers scope requires serversOffset: 0 and omits roll-up fields.
  • SIMILARITY_FLOOR (default 0.3) filters matches before the limit applies.
  • An empty category string 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

  • name 1–64 characters accepts a tool or server name, auto-detected or pinned via kind. Exact names win, then unique case-insensitive names; output uses canonical names. client optionally selects claude-code, cline, codex, cursor, gemini, streamable-http (generic mcpServers JSON), or curl.
  • server (optional, 1–64 characters) names the owning server: a search result's name + server describes 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, and server strings are treated as omitted. Other unknown kind or client values 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 an installNotice naming 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 (set kind), ambiguous_owner (set server; the error lists the owners), or retryable catalog_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, default 3600) with an atomic index swap when generatedAt changes — no restart needed
  • Empty 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 inside fleet.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 than 1e-4 off.
  • The embedding model is warmed up during startup, before OpenTelemetry's HTTP instrumentation patches fetch — avoids a cold-cache model-load failure under OTEL
  • Self-describing: cyanheads_describe_entry resolves this server's own name and tools from a static fallback record, consulted only when the remote catalog doesn't carry an entry for it
  • CATALOG_URL can 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 limit above 20 is cut to the per-call cap
  • Discriminated result.kind (tool | server) on cyanheads_describe_entry lets callers branch on data, not string parsing
  • Every search result carries a score field for trust calibration, plus a servers roll-up so agents can see which servers matched without a second call

Getting started

Connect to the hosted instance, no install:

sh
claude mcp add --transport http cyanheads-mcp-server https://cyanheads.caseyjhand.com/mcp

Or run it locally:

sh
claude mcp add cyanheads-mcp-server -- npx -y @cyanheads/cyanheads-mcp-server

For other clients, add this to the MCP config file:

json
{  "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.

VariableDescriptionDefault
MCP_TRANSPORT_TYPETransport: stdio or httpstdio
MCP_HTTP_PORTHTTP server port3010
MCP_HTTP_HOSTHTTP server bind host127.0.0.1
MCP_HTTP_ENDPOINT_PATHHTTP endpoint path where the MCP server is mounted/mcp
MCP_AUTH_MODEAuthentication: none, jwt, or oauthnone
MCP_SESSION_MODEHTTP session posture: auto, stateful, or stateless. src/index.ts declares stateless; set this only to override it.stateless
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.)info
CATALOG_URLRemote fleet.json endpoint (schema v2 with baked embeddings). Must be an absolute URL. Override to front your own fleet.https://caseyjhand.com/fleet.json
CATALOG_FETCH_TIMEOUT_MSPer-request timeout for fleet.json fetches: integer milliseconds, 1–2147483647.10000
CATALOG_REFRESH_SECONDSBackground poll interval for fleet.json refresh. 0 disables; positive values up to 2147483.647 seconds use the runtime's millisecond timer resolution.3600
EMBEDDING_MODEL_IDHugging Face model id for query embedding. Must match fleet.json.embeddingModel.Snowflake/snowflake-arctic-embed-m-v1.5
SIMILARITY_FLOORCosine similarity cutoff for cyanheads_search_catalog results. Must be within [0, 1].0.3
OTEL_ENABLEDEnable OpenTelemetryfalse
OTEL_EXPORTER_OTLP_ENDPOINTOTLP base URL for traces and metricsUnset
OTEL_EXPORTER_OTLP_LOGS_ENDPOINTExplicit OTLP logs URL; requires the OTel log peers included in the default Docker buildUnset
LOG_TOOL_FAILURE_PAYLOADSLog failed arguments and results, redacted by key name. Secrets inside free-form values are not redacted.false
LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTESUTF-8 byte cap for each logged failure payload16384

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:

    sh
    git clone https://github.com/cyanheads/cyanheads-mcp-server.gitcd cyanheads-mcp-server && bun installcp .env.example .env   # every variable has a default; override as needed
  • Build and run the production version:

    sh
    # One-time buildbun run rebuild
    # Run the built serverbun run start:http# orbun run start:stdio
  • Run checks and tests:

    sh
    bun run devcheck  # Lints, formats, type-checks, runs MCP and packaging lintersbun run test      # Runs the test suite

Docker

sh
docker run --rm -p 3010:3010 ghcr.io/cyanheads/cyanheads-mcp-server:latest

The 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

DirectoryPurpose
src/mcp-server/toolsTool definitions (*.tool.ts). Two tools — cyanheads_search_catalog and cyanheads_describe_entry.
src/services/catalogCatalog service — remote fleet.json provider with atomic-swap refresh, vector index, snippet builders, the self-description fallback record, and the query-time embedding runtime (@huggingface/transformers, behind an injectable interface for deterministic tests).
src/configServer-specific environment variable parsing and validation with Zod.
tests/Unit and integration tests, mirroring the src/ structure.
docs/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/catch in tool logic
  • Use ctx.log for logging, ctx.state for storage
  • Register new tools in the tools array passed to createApp() in src/index.ts
  • Wrap 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:

sh
bun run devcheckbun run test

License

Apache-2.0 — see LICENSE for details.

Source: README.md at commit dd138e4

Tools

2

cyanheads_search_catalog

Search Fleet Tools and Servers

Search fleet tools and servers by natural-language description. Returns ranked matches with brief summaries and the server each tool belongs to. Use scope "servers" to find which server handles a workflow; use the default scope "tools" to find specific tools.

ParameterslimitqueryrequiredscopeoffsetcategoryserversOffset

cyanheads_describe_entry

Describe Fleet Tool or Server

Return the description and install snippets for a named tool or server. For tools: the description, owning server, and connection metadata. For either kind: local (stdio, via npx) install snippets for every published server, plus remote (HTTP) connection snippets when a hosted endpoint exists — for every supported client, or one client via the client parameter.

Parameterskindnamerequiredclientserver

Version history

6
  1. v0.5.0LatestOct 29, 2026
  2. v0.4.5Oct 25, 2026
  3. v0.4.4Oct 19, 2026
  4. v0.4.3Sep 30, 2026
  5. v0.4.2Sep 20, 2026
  6. v0.4.1Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts