npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@three-ws/brain-mcp

v0.1.2

Published

Any model, one interface — the three.ws multi-provider LLM router over MCP. Discover available providers/models (Claude, GPT-4o, Qwen, DeepSeek, NVIDIA Nemotron, IBM Granite…) and run a chat completion through whichever one fits. Free tiers need no key; p

Readme


A Model Context Protocol server that gives any AI assistant the three.ws multi-provider LLM router over stdio. Discover which models are available — Claude, GPT-4o, o3, Qwen, DeepSeek, NVIDIA Nemotron, IBM Granite, and more — and run a chat completion through whichever one fits, without wiring each vendor SDK yourself.

The router fronts every provider behind one endpoint and transparently falls back across mirrors and free tiers if the chosen model is briefly down. The free open-weight tiers (GPT-OSS 120B, NVIDIA NIM models) work with no key; the paid first-party flagships unlock with a three.ws API key.

Install

npm install @three-ws/brain-mcp

Or run with npx (no install):

npx @three-ws/brain-mcp

Quick start

Claude Code, one line:

claude mcp add brain -- npx -y @three-ws/brain-mcp

To unlock the paid flagships, pass your three.ws API key:

claude mcp add brain -e THREE_WS_API_KEY=sk_live_… -- npx -y @three-ws/brain-mcp

Claude Desktop / Cursor (claude_desktop_config.json or mcp.json):

{
	"mcpServers": {
		"brain": {
			"command": "npx",
			"args": ["-y", "@three-ws/brain-mcp"],
			"env": { "THREE_WS_API_KEY": "sk_live_…" }
		}
	}
}

Inspect the surface with the MCP Inspector:

npx -y @modelcontextprotocol/inspector npx @three-ws/brain-mcp

Tools

| Tool | Type | What it does | | ---------------- | --------- | ------------------------------------------------------------------------------------------------------------------ | | list_providers | read-only | List every LLM the router can reach — key, network, tier, max output, live availability, and whether it needs auth. | | chat | read-only | Run a chat completion through the chosen provider; returns the full reply, the route taken, token usage, and timing. |

Both tools read live data — the provider set and completions vary between calls, so neither is idempotent. chat does not mutate any platform state, so it is annotated read-only.

Input parameters

list_providers — no parameters.

chatmessages (required: 1–100 turns of { role: "user" | "assistant", content }, content ≤ 16,000 chars), provider (provider key from list_providers, default gpt-oss-120b), system (optional system prompt, ≤ 8,000 chars), maxTokens (optional, 64–16384, default 4096, clamped to the model's ceiling).

Example

Both responses below are shape illustrations — the live provider set and generations will differ.

// list_providers (example response)
> {}
{
  "ok": true,
  "count": 18,
  "available": 11,
  "default_provider": "gpt-oss-120b",
  "providers": [
    { "key": "gpt-oss-120b", "label": "GPT-OSS 120B", "network": "OpenAI · OpenRouter", "tier": "balanced", "maxOutput": 8192, "available": true, "requiresAuth": false },
    { "key": "claude-sonnet-4-6", "label": "Claude Sonnet 4.6", "network": "Anthropic", "tier": "balanced", "maxOutput": 16384, "available": true, "requiresAuth": true },
    { "key": "deepseek-r1", "label": "DeepSeek R1", "network": "DeepSeek", "tier": "reasoning", "maxOutput": 8192, "available": true, "requiresAuth": true }
    /* … */
  ]
}
// chat (example response)
> {
    "provider": "claude-sonnet-4-6",
    "system": "You are terse.",
    "messages": [{ "role": "user", "content": "Name three Solana RPC methods." }]
  }
{
  "ok": true,
  "provider": "claude-sonnet-4-6",
  "model": "Claude Sonnet 4.6",
  "network": "Anthropic",
  "tier": "balanced",
  "routed_via": null,
  "content": "getBalance, getAccountInfo, getSignaturesForAddress.",
  "usage": { "input_tokens": 24, "output_tokens": 14, "total_tokens": 38 },
  "timing_ms": { "first_token": 412, "total": 980 }
}

routed_via is null when the requested provider answered directly; otherwise it names the mirror or free-tier route the router fell back to (so you always get an answer even if the first choice is briefly down).

Model availability is dynamic. Always call list_providers first rather than hardcoding a key — the current Claude ids are claude-fable-5, claude-opus-4-7, claude-sonnet-4-6, and claude-haiku-4-5, but the live list is the source of truth.

Authentication

| Model class | Needs a key? | | ---------------------------------------------------------------------------- | --------------------------- | | Free open-weight tiers (GPT-OSS 120B, NVIDIA NIM: Nemotron / Kimi / Llama 4) | No | | Paid first-party flagships (Claude, GPT-4o, o3, Qwen Plus, DeepSeek, …) | Yes — set THREE_WS_API_KEY |

Create an API key at three.ws/account. Without it, paid models return a sign-in error and list_providers flags them with requiresAuth: true.

Requirements

  • Node.js >= 20.
  • Network access to https://three.ws (or your own THREE_WS_BASE).

Environment variables

| Variable | Required | Default | Purpose | | --------------------- | -------- | ------------------ | ---------------------------------------------------------------- | | THREE_WS_BASE | no | https://three.ws | API base URL (override to self-host or target a preview). | | THREE_WS_API_KEY | no | — | Bearer credential that unlocks the paid first-party flagships. | | THREE_WS_TIMEOUT_MS | no | 120000 | Per-request timeout (completions stream server-side). |

Errors

A failed tool call returns an MCP error result (isError: true) whose text is a single JSON object — { "ok": false, "error": "<code>", "message": "…" }, plus status and detail on upstream rejections:

| error | Meaning | Recovery | | ------- | ------- | -------- | | upstream_error | The router rejected the request — status carries the real HTTP code: 400 (bad arguments or an unknown provider key), 401 (paid model without a valid THREE_WS_API_KEY), 429 (rate-limited), 502 (the model's stream failed before producing output). | Act on status; for 401 set a key, for an unknown key re-run list_providers. | | timeout | No complete response within THREE_WS_TIMEOUT_MS. Long flagship generations can be slow — the default 120 s matches the router's own ceiling. | Retry, lower maxTokens, or pick a fast-tier provider. | | network_error | The request never reached the router (DNS, offline, TLS). | Check connectivity / THREE_WS_BASE. | | bad_config | THREE_WS_TIMEOUT_MS is not a positive number (thrown at startup). | Fix the env var. |

If the requested provider fails mid-flight the router transparently falls back to a mirror or free tier and the reply's routed_via names the route taken — you only see an error when every route is exhausted.

Links

  • Homepage: https://three.ws
  • Changelog: https://three.ws/changelog
  • Issues: https://github.com/nirholas/three.ws/issues
  • License: Apache-2.0 — see LICENSE