Server data from the Official MCP Registry
Self-hosted retrieval router for AI agents: budgets, provider routing, route receipts.
Self-hosted retrieval router for AI agents: budgets, provider routing, route receipts.
Valid MCP server (3 strong, 2 medium validity signals). No known CVEs in dependencies. ⚠️ Package registry links to a different repository than scanned source. Imported from the Official MCP Registry. 1 finding(s) downgraded by scanner intelligence.
17 files analyzed · 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: FETCHMUX_BASE_URL
Environment variable: FETCHMUX_API_KEY
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-krutftw-fetchmux": {
"env": {
"FETCHMUX_API_KEY": "your-fetchmux-api-key-here",
"FETCHMUX_BASE_URL": "your-fetchmux-base-url-here"
},
"args": [
"-y",
"@fetchmux/mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
FetchMux is a provider-neutral retrieval router for AI agents. A client sends one stable search request; FetchMux selects an eligible customer-configured provider, enforces cost and deadline limits, normalizes the evidence, and returns an auditable route receipt.
One retrieval API. The right provider for every request.
The founding product is deliberately narrow: public-web search and page retrieval through customer-owned provider accounts, plus an opt-in public scholarly-metadata route. It is not a generic API proxy, pooled-credit reseller, or claim that upstream APIs are interchangeable.
Founding-pilot build. The machine-readable discovery site is live at
fetchmux.com, while the gateway remains private and single-tenant.
FetchMux is a provisional working name pending formal trademark and company-name clearance. No
provider partnership, endorsement, or resale right is implied.
What exists today:
hello@fetchmux.com pilot intake and security@fetchmux.com vulnerability routing;What does not exist yet:
Install, build, and test from the repository root:
npm clean-install
npm run build
npm test
Set a gateway key and one provider key in the current PowerShell session. Cost values must come from the operator's actual provider plan; the number below is only a shape placeholder and must be replaced before using dollar budgets.
$env:FETCHMUX_API_KEY = "replace-with-a-long-random-gateway-key"
$env:BRAVE_API_KEY = "replace-with-your-provider-key"
$env:BRAVE_COST_PER_REQUEST_USD = "replace-with-your-real-cost"
npm run dev:gateway
For a no-provider-account technical proof, Crossref's public REST API can be enabled explicitly. Use a real monitored contact address as required by Crossref's polite-pool guidance:
$env:FETCHMUX_API_KEY = "replace-with-a-long-random-gateway-key"
$env:CROSSREF_ENABLED = "true"
$env:CROSSREF_CONTACT_EMAIL = "replace-with-your-contact@example.com"
npm run dev:gateway
Send the same request shape with task = "scholarly". This route returns bibliographic metadata and
DOI links only; it does not copy abstracts or provide page-content extraction.
In another terminal:
$headers = @{
Authorization = "Bearer replace-with-a-long-random-gateway-key"
"Content-Type" = "application/json"
}
$body = @{
query = "latest stable Node.js release"
task = "fresh_facts"
priority = "balanced"
maxCostUsd = 0.02
maxLatencyMs = 8000
limit = 8
} | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri "http://127.0.0.1:8787/v1/search" -Headers $headers -Body $body
/health reports process health. /ready returns 503 until at least one credentialed provider or
the valid opt-in Crossref route is configured. Protected /v1/* routes return 503 if FetchMux
authentication itself has no key.
The process does not automatically load .env during local Node development. Set variables in the
shell or use an operator-controlled process manager. Docker Compose reads the ignored .env file.
| Variable | Default | Purpose |
|---|---|---|
FETCHMUX_API_KEY | none | One protected-route bearer key |
FETCHMUX_API_KEYS | none | Comma-separated keys for rotation |
FETCHMUX_AUTH_DISABLED | false | Exact true bypass for trusted local use only |
FETCHMUX_ALLOWED_ORIGINS | none | Comma-separated browser origins; CORS is absent when empty |
FETCHMUX_HOST | 127.0.0.1 | Gateway bind address |
FETCHMUX_PORT | 8787 | Gateway TCP port |
BRAVE_API_KEY | none | Brave customer credential |
TAVILY_API_KEY | none | Tavily customer credential |
EXA_API_KEY | none | Exa customer credential |
FIRECRAWL_API_KEY | none | Firecrawl customer credential |
CROSSREF_ENABLED | false | Exact true enables credential-free scholarly metadata egress |
CROSSREF_CONTACT_EMAIL | none | Valid monitored contact sent to Crossref's polite pool |
| provider cost variables | none | Customer-plan estimates used by dollar budgets |
VITE_PILOT_CONTACT_URL | FetchMux pilot email | Optional safe https: or mailto: CTA override |
See provider configuration before enabling maxCostUsd.
| Method | Path | Auth | Behavior |
|---|---|---|---|
GET | /health | public | Process health and version |
GET | /ready | public | Provider readiness |
GET | /v1/providers | bearer | Safe provider configuration status |
POST | /v1/route/preview | bearer | Ranked candidates, no provider call |
POST | /v1/search | bearer | Routed retrieval and route receipt |
The complete FetchMux contract is docs/openapi.yaml. It is not an upstream provider contract.
The SDK is a workspace package in the founding build; it has not been published to a registry.
import { FetchMux } from "@fetchmux/sdk";
const client = new FetchMux({
baseUrl: "http://127.0.0.1:8787/",
apiKey: process.env.FETCHMUX_API_KEY,
fetch: globalThis.fetch.bind(globalThis),
});
const response = await client.search({
query: "latest stable Node.js release",
task: "fresh_facts",
maxCostUsd: 0.02,
});
Build the workspace, start the gateway, and add the compiled stdio server to an MCP client:
{
"mcpServers": {
"fetchmux": {
"command": "node",
"args": ["C:/absolute/path/to/fetchmux/apps/mcp/dist/main.js"],
"env": {
"FETCHMUX_BASE_URL": "http://127.0.0.1:8787/",
"FETCHMUX_API_KEY": "replace-with-the-gateway-key"
}
}
}
}
The tools are search_web and preview_search_route; both are annotated read-only.
Validate all 96 founding case-provider pairs without network calls or credits:
npm run benchmark -- --workload benchmarks/workloads/founding-v1.json --mode dry-run
Live mode is deliberately harder to trigger. It requires provider credentials, explicit
--confirm-live, and an ignored output file:
$env:FETCHMUX_CODE_VERSION = git rev-parse HEAD
npm run benchmark -- --workload benchmarks/workloads/founding-v1.json --mode live --confirm-live --output benchmarks/results/founding-v1-live.json
Live reports are private by default. Provider terms can restrict benchmarking, storage, or performance disclosure; review the account's accepted terms before running live and obtain counsel and any required written permission before sharing results. Read the benchmark methodology before interpreting a run.
Copy the environment template, enter real secrets locally, and start the loopback-only container:
Copy-Item .env.example .env
# Edit .env locally. Never commit it.
docker compose up --build -d
Invoke-RestMethod http://127.0.0.1:8787/health
docker compose logs --follow gateway
The build and runtime image digests pin the official Node 24 build image and supported Distroless
Node 24 Debian 13 nonroot runtime. The image includes production dependencies only for the gateway
and its two internal packages, drops Linux capabilities in Compose, supports a read-only root
filesystem, and receives provider credentials only at container start.
npm test
npm run typecheck
npm run lint
npm run build
npm run dev:gateway
npm run dev:site
Gateway route events go to stdout as structured JSON and exclude query text, provider keys, raw provider bodies, and result content. The founding gateway has no database and no built-in metrics retention. Configure process-log retention deliberately and treat normalized URLs and provider metadata returned to callers as customer data.
Apache-2.0. The license grant takes practical effect when the repository is made public; swap the LICENSE file first if a different license is preferred. See the public release runbook for the full release sequence.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.