Synap by Linkrra
Remote MCP server for Linkrra's OpenAI-compatible inference API for open-weight models. Agents can list models with live per-token prices, estimate the cost of a job, and run chat completions. Listing models and pricing needs no key. Streamable HTTP endpoint: https://pool.linkrra.com/mcp
Hosted MCP Server
npx add-mcp 'https://pool.linkrra.com/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Use Linkrra from your tools
One key, two protocols, one line of config. Everything below works today.
One key, two protocols. Get a key on your account page — it looks like sk-pool-… and works everywhere below.
Anything OpenAI-compatible
Change the base URL. Nothing else in your code moves. This covers the OpenAI SDKs, Cline, Continue, Aider, Roo, Cursor and most agent frameworks. Coming from Hyperbolic's retired inference API? There is a short migration guide.
curl
curl https://pool.linkrra.com/v1/chat/completions \
-H "Authorization: Bearer $LINKRRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen/qwen3-coder",
"messages": [{"role": "user", "content": "Say hello"}]
}'
Python
The official OpenAI SDK, pointed at us.
from openai import OpenAI
client = OpenAI(
base_url="https://pool.linkrra.com/v1",
api_key="sk-pool-...",
)
resp = client.chat.completions.create(
model="qwen/qwen3-coder",
messages=[{"role": "user", "content": "Say hello"}],
)
Node
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://pool.linkrra.com/v1",
apiKey: process.env.LINKRRA_API_KEY,
});
Codex CLI
Add a provider in ~/.codex/config.toml, then select it.
[model_providers.linkrra]
name = "Linkrra"
base_url = "https://pool.linkrra.com/v1"
env_key = "LINKRRA_API_KEY"
model_provider = "linkrra"
model = "qwen/qwen3-coder"
Cline · Continue · Cursor
Choose the OpenAI-compatible provider and fill two fields.
Base URL: https://pool.linkrra.com/v1
API key: sk-pool-...
Model: qwen/qwen3-coder
Claude Code beta
Claude Code speaks Anthropic's Messages API rather than OpenAI's, so it needs a different endpoint — we serve that too, tool use included. Point it at us with two environment variables.
Beta, honestly: the endpoint is built, tested and deployed, and the auth path is verified against the live service. A full Claude Code session has not yet been run end to end against it. If something misbehaves, write to weare@linkrra.com — that is a bug report we want.
Claude Code
export ANTHROPIC_BASE_URL="https://pool.linkrra.com"
export ANTHROPIC_AUTH_TOKEN="sk-pool-..."
claude
Codex
Same shape as the Codex CLI section above — Codex speaks OpenAI's protocol, so it needs the /v1 base URL, not the Anthropic one.
export OPENAI_BASE_URL="https://pool.linkrra.com/v1"
export OPENAI_API_KEY="sk-pool-..."
Run your own agent from your editor beta
An agent you built in Agent Studio is addressable as a model id. Pass agent:<your-agent-id> wherever a tool asks for a model, and the request runs with that agent's instructions and its knowledge sources instead of a bare model. Nothing else changes: same key, same balance, same per-token rate.
# Claude Code
export ANTHROPIC_BASE_URL="https://pool.linkrra.com"
export ANTHROPIC_AUTH_TOKEN="sk-pool-..."
claude --model "agent:acme-support"
# Codex CLI — ~/.codex/config.toml
model_provider = "linkrra"
model = "agent:acme-support"
# Codex / any OpenAI-speaking tool, by environment
export OPENAI_BASE_URL="https://pool.linkrra.com/v1"
export OPENAI_API_KEY="sk-pool-..."
export OPENAI_MODEL="agent:acme-support"
# Cline · Continue · Cursor — the OpenAI-compatible provider
Base URL: https://pool.linkrra.com/v1
API key: sk-pool-...
Model: agent:acme-support
Two response headers tell you what happened: X-Linkrra-Agent names the agent that answered, and X-Linkrra-Agent-Sources reports how many of your uploaded sources were retrieved into that turn. When it reads 0, the answer was not grounded in your documents — worth knowing before you trust it.
Answers cite your sources inline as [1], [2]. A citation number the retrieval did not actually supply is stripped before you see it, so a footnote in an answer always points at a real chunk of a real document.
An agent you have paused in the studio is refused here too, with a 403. If our agent store cannot be reached you get a 503 and no charge — never a 404, which would read as "your agent was deleted".
Agent Teams private demo
Every tool above authenticates as your account — the same key spends the same credit balance everywhere.
What a key in a dev tool does and does not carry. Running agent:<id> from Claude Code gives you that agent's prompt and its knowledge. It does not put the agent's Agent Teams envelope around your editor: the tools Claude Code runs on your machine are Claude Code's, and our gateway never sees them, so it cannot bound them. The envelope — which tools, which hosts, what spend ceiling, what expiry — is enforced only for actions that pass through our own execution gateway, which is what happens when the agent runs inside Agent Teams. Treat a key pasted into a dev tool as account-scoped, not team-member-scoped, and do not use it as an access control.
Models
Pass any id from the catalogue as model. Ask for a model we do not serve and the request is refused rather than quietly answered by a different one — you always know which model replied.
Confidential mode (GPU TEE)
Add "confidential": true to a chat completion request to require it be answered inside an attested GPU Trusted Execution Environment — the provider cannot read the prompt even with root access to the machine it runs on, which is a stronger guarantee than our default zero-data-retention routing. Only a subset of models can back this claim today; asking for it on any other model returns 400 rather than silently falling back to an unattested one. Current confidential-capable models: moonshotai/kimi-k3, z-ai/glm-5.2, deepseek/deepseek-v4-flash, openai/gpt-oss-120b.
curl https://pool.linkrra.com/v1/chat/completions \
-H "Authorization: Bearer $LINKRRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"openai/gpt-oss-120b","confidential":true,"messages":[{"role":"user","content":"hi"}]}'
Text-to-speech
Real-time TTS, streamed from the same Gemini Live voice engine that powers our own phone agent — plus a Hebrew path most providers don't have at all: text routed through Dicta 's nikud engine before synthesis, so Hebrew is read with correct vowelization instead of guessed. Detected automatically — send Hebrew text and it's applied; nothing to configure.
REST (your API key)
curl https://pool.linkrra.com/v1/audio/speech \
-H "Authorization: Bearer $LINKRRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Hello from Linkrra."}' \
--output speech.wav
Returns a playable audio/wav file — no separate decoding step. sampleRate (default 24000) and nikud (default true — set false to read Hebrew text without vocalization, at the standard rate instead of the nikud rate) are both optional. 5,000-character limit per call.
x402 — no account, an agent pays per call
Same engine, no API key: an AI agent holding USDC on Base pays per clip in the same round trip, the way /v1/chat/completions already works for inference (see Agents). POST without a payment and you get an HTTP 402 with an exact price quote for that text — no estimate, because a TTS clip's cost is fully determined by its character count. Every x402 paid call carries a $0.01 minimum charge (on TTS and chat/completions alike): below it the quote and the settlement are exactly $0.01; above it you pay the usage-based price. Credit top-ups via /api/billing/x402/topup are $1.00 minimum. Retry with a PAYMENT-SIGNATURE header and the same request returns the WAV clip.
curl https://pool.linkrra.com/api/billing/x402/tts \
-H "Content-Type: application/json" \
-d '{"text": "Hello from Linkrra."}'
# -> 402, PAYMENT-REQUIRED header + body with the exact quote for this text
curl https://pool.linkrra.com/api/billing/x402/tts \
-H "Content-Type: application/json" \
-H "PAYMENT-SIGNATURE: " \
-d '{"text": "Hello from Linkrra."}' \
--output speech.wav
Machine-readable pricing and mechanism: GET /api/billing/x402/tts/info.
Pricing
$0.010 per 1,000 characters standard. $0.15 per 1,000 characters for the Hebrew-nikud path. A request is priced once, from its own text, before anything is generated.
What you are charged
One credit is one token, the same rate on every model we serve, and you are charged on the tokens a request actually consumed — settled after it completes, not on the pre-flight estimate. Your balance and a per-day breakdown are on the account page; prices are on pricing.
Errors worth knowing
401 — the key is missing or malformed; keys start with sk-pool-.
402 — out of credits. Top up or start a plan on your account page.
429 — over your plan's rate limit; it resets shortly.
503 — nothing is serving that model right now. This is ours, not yours.