Calibrated AI skill routing via orbital mechanics β picks the right expertise for every query.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Dynamic task routing via orbital mechanics. Domain-agnostic β candidates can be tools, prompts, documents, products, or any routable entity.
Per request, an LLM (Llama-3.3-70B via GitHub Models' free tier) emits N candidate routing entries. A deterministic classifier extracts a 9-scalar physics signature from each candidate's content alone β no curated lookup: mass (log-scaled body length Γ keyword count), scope, independence, cross_domain affinity (token-domain entropy across three star systems), fragmentation, drag, dep_ratio (max sibling Jaccard), lagrange_potential, coherence_time (gβ½ΒΉβΎ-style autocorrelation over the candidate's token stream β added in 3.1.0), plus orbital and optical parameters (semi-major axis, eccentricity, inclination, period, perihelion, aphelion, mean anomaly; wavelength, polarization, amplitude, phase). Six per-class scoring rules assign a celestial body class by argmax: planet, moon, trojan, asteroid, comet, or irregular.
The class-scoring rules:
Output: a deterministically ranked list with route_score, full classification, and decision rule per candidate. Wire format: Model Context Protocol over stdio or Streamable HTTP. Stdio shim is ~5 KB. Tested with Claude Code, Cursor, Windsurf, Goose, Continue, Grok custom connectors, ChatGPT custom MCPs, and Claude.ai connectors.
3.0 β renamed from
meridian-skills-mcp. The classifier was always domain-agnostic; the "skills" framing biased the LLM prompt toward AI-agent capabilities. v3 drops that framing across the prompt, code, branding, and npm name. Migration:npm i -g meridian-orbital(the old package is deprecated; both binaries are still namedmeridian-mcp/meridian-mcp-httpso client configs keep working). The hosted HTTP MCP atmcp.ask-meridian.uk/mcpcontinues to work β URL unchanged.
Same install works in Cursor, Windsurf, Goose, Continue, and any MCP client that speaks stdio.
You'll need a GitHub personal access token with the Models: read permission (free tier). Generate one at https://github.com/settings/personal-access-tokens/new and export it:
(The MCP also picks up plain GITHUB_TOKEN if you have one already in your environment.)
A hosted Streamable-HTTP variant lives at https://mcp.ask-meridian.uk/mcp with full OAuth 2.1 + PKCE so it slots into any host that requires a connector URL β Grok's custom MCP connectors, ChatGPT custom MCPs, Claude.ai connectors. No npm install, no PAT entry from your side, no infra.
In Grok's "Add custom connector" dialog, paste these:
| Field | Value |
|---|---|
| Server URL | https://mcp.ask-meridian.uk/mcp |
| Authorization endpoint | https://mcp.ask-meridian.uk/authorize |
| Token endpoint | https://mcp.ask-meridian.uk/token |
| Client ID | grok |
| Client secret | (empty) |
| Token auth method | none (PKCE only) |
| Scopes | route_task |
When you click "Authorize" in Grok, it opens /authorize β a one-click confirmation page (no PAT pasting, no GitHub jargon). Inference runs against GitHub Models using the operator's PAT, so end users see zero friction. Tokens last 1 hour and can be reauthorized any time.
The same URL works for ChatGPT custom MCPs and Claude.ai connectors β they speak the same MCP Streamable HTTP + OAuth 2.1 spec.
If you'd rather operate your own remote MCP, the package ships a Node binary:
Or via Docker (MCP_MODE=http flips the entrypoint):
Auth modes:
Authorization: Bearer β¦ is forwarded to GitHub Models. Users bring their own PAT.MERIDIAN_GATEWAY_TOKEN (what callers pass) + MERIDIAN_GITHUB_TOKEN (what the server uses for inference).The hosted Worker variant additionally implements OAuth 2.1 + PKCE; the Node binary is bearer-only (suitable for stdioβHTTP bridges and tools like curl).
Single tool: route_task(task, limit?).
Typical call takes 5β15 seconds. Each result ships its full markdown body so the caller agent can lift the candidate straight into its context window.
| Env var | Default | Purpose |
|---|---|---|
MERIDIAN_GITHUB_TOKEN | falls back to GITHUB_TOKEN | GitHub PAT with Models: read scope. Required. |
MERIDIAN_MODEL | meta/llama-3.3-70b-instruct | Any GitHub Models chat model |
MERIDIAN_MODELS_ENDPOINT | https://models.github.ai/inference/chat/completions | Override for self-hosted gateways |
MERIDIAN_CANDIDATES | 5 | How many candidates the LLM generates per call |
MERIDIAN_TIMEOUT_MS | 90000 | Abort the fetch after this many ms |
PORT | 3333 | (HTTP mode) port for meridian-mcp-http |
HOST | 0.0.0.0 | (HTTP mode) bind address |
MERIDIAN_HTTP_PATH | /mcp | (HTTP mode) endpoint path |
MERIDIAN_GATEWAY_TOKEN | (unset) | (HTTP mode) if set, switches auth from pass-through to shared-key gateway. Bearer must match this value; server uses its own MERIDIAN_GITHUB_TOKEN for inference. |
2.0.0The 1.x line called a Cloudflare Worker (https://ask-meridian.uk/api/orbital-route) that ran the LLM and orbital classifier server-side. That backend has been retired. 2.0.0:
To keep using the closed-domain Python scorer + curated 88-entry corpus that shipped with 0.3.x, pin to meridian-skills-mcp@0.3.2. To keep calling the now-defunct Cloudflare backend, pin to 1.0.1 (will fail with HTTP 405 on every call).
Same orbital classifier powers two front-ends served from mcp.ask-meridian.uk:
mcp.ask-meridian.uk/v1/route, same Llama-3.3-70B + classifier path the connector uses.mcp.ask-meridian.uk/v1/vision (GPT-4o-mini, operator-paid), candidates orbit anchored star systems in-view. Same backend as miniapp.Both call the first-party browser endpoint /v1/route β Origin-allowlisted, operator-paid, no PAT pasting. The OAuth-gated /mcp endpoint (this section's "Use as a Grok connector" path) is unchanged.
The browser endpoint /v1/route applies a fitted-correction layer on top of the heuristic ranking. Every time a user engages a candidate (planet click in lens, detail-panel open in miniapp, card click in vision-lab), the front-end POSTs to /v1/feedback and the worker runs one pairwise-ranking SGD step against the chosen candidate vs every other. Constant per-request cost (~1 ms), no GPU, no local execution.
final_score = heuristic_route_score Γ (1 + tanh(K Β· wΒ·x)) β bounded to [0, 2], so no individual candidate can be silently boosted beyond 2Γ heuristic.coherence_time added in 3.1.0) + 6 class one-hot + 3 star-system one-hot + 3 token-hit features + 4 ranking features. Stored under FEATURE_VERSION=v2 in KV; bumping the version re-inits weights cleanly.w = 0, multiplier = 1, pure heuristic. Day 1 deployments don't need any training data./mcp path (Grok / ChatGPT / Claude.ai connectors) keeps deterministic heuristic ranking for reproducibility.classifier-bootstrap.yml (every 3 days, feeds labelled examples from a public HF benchmark into /v1/feedback) and classifier-health.yml (Mondays, posts recall@1 / @5 + model state to landing/healthz.json).Read-only model state: GET https://mcp.ask-meridian.uk/v1/model-info.
Full architecture + the calibration journey that produced this design (the planet-bias bug, the two textbook physics frameworks we tried and abandoned, the v2 retune, the 81% recall@1 [95% Wilson CI 60%, 92%] finding on real labelled data): blog post.
MIT β see LICENSE.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/meridian-skills)<a href="https://allmcps.com/mcp/meridian-skills"><img src="https://allmcps.com/api/badge/meridian-skills?style=directory" alt="Meridian Skills on AllMCPs" /></a>