Salyut — Setup & Usage
Salyut is a small MCP server that asks several free LLMs the same question and returns their answers side by side. This is the step-by-step manual; the README covers what it is and why.
1. Prerequisites
- Docker (to run the server) or Python 3.10+ (to run it directly / use the CLI).
- At least one free API key from the providers below. Any key you don't set simply drops that model from the panel — nothing breaks, so start with whichever one or two you have.
Where to get each free key
| Env var | Provider | Sign-up |
|---|---|---|
CEREBRAS_API_KEY |
Cerebras | cloud.cerebras.ai |
ZAI_API_KEY |
Z.ai (Zhipu GLM) | z.ai / open.bigmodel.cn |
GROQ_API_KEY |
Groq | console.groq.com |
GEMINI_API_KEY |
Google AI Studio | aistudio.google.com |
MISTRAL_API_KEY |
Mistral | console.mistral.ai |
OPENROUTER_API_KEY |
OpenRouter | openrouter.ai |
⚠️ Mistral's free tier trains on the data you send it. Salyut therefore keeps Mistral out of the
default panel — it's only called if a caller explicitly asks for it. Leave MISTRAL_API_KEY unset if
you'd rather not use it at all.
2. Configure
Copy .env.example to .env and fill in the keys you have:
cp .env.example .env
$EDITOR .env
3. Run it
Docker (recommended)
docker build -t salyut:latest .
docker run -d --name salyut --restart unless-stopped \
--env-file .env -p 8140:8000 salyut:latest
# native MCP over streamable-http is now at http://<your-host>:8140/mcp
If your platform can't build images (e.g. a stack manager that only deploys), build the image on any
host first and reference the salyut:latest tag in your compose/stack.
Directly with Python
pip install -r requirements.txt
set -a; source .env; set +a
CONSULT_PORT=8140 python -m consult.server # serves /mcp on :8140
4. Use it from an MCP client (e.g. Claude Code)
claude mcp add salyut --scope user --transport http http://<your-host>:8140/mcp
Then in a session: "Use salyut's consult tool: is a class or plain functions better here? Ask the default panel." You'll get one answer per model, each attributed.
consult(question, models=None)— leavemodelsempty for the default panel; pass e.g.["cerebras","glm"]to pick specific ones (this is also the only way to includemistral).listmodels()— shows the configured providers and their current models.
5. Use the CLI (scripting / model bake-offs)
# talks to a running server by default (shares its rate-guard)
python -m consult.cli --prompt "Is Rust memory-safe? One sentence." --output result.md
python -m consult.cli --prompt "..." --models cerebras,groq
# offline / no server:
python -m consult.cli --prompt "..." --direct
A handy use: A/B one prompt across models — e.g. testing which model best judges a tricky classification.
6. Tuning
Roster, models, and rate limits
All in consult/core.py:
DEFAULT_ROSTER/FULL_ROSTER— which providers are called.- Per-model overrides via env (e.g.
CONSULT_CEREBRAS_MODEL,CONSULT_GLM_MODEL). GUARD_MIN_INTERVAL/GUARD_DAILY_CAP— the shared rate-guard, set from each provider's real free-tier limits. The guard fails open for any provider with no limit configured, and closed once a configured cap is hit, so nothing crashes and no bucket gets drained.
Free-model slugs rotate — if a default starts returning errors, check the provider's current model list and update the slug.
Troubleshooting
- A model returns
ERROR: HTTP 429— that provider's free bucket is spent (or you're calling faster than its per-second limit). The others still answer; try again later. - A model returns
ERROR: no api key— its key isn't set; that's fine, it just sits out. - "Only N of M models answered" in the digest — Salyut says so plainly rather than pretending a consensus exists.
Built with Claude (Opus 4.8). GPL-3.0-or-later.