SAIR MCP Server
The SAIR MCP Server exposes the SAIR Competition Public API as 48 tools for MCP clients, enabling end-to-end interaction with competitions, practice playground, personal libraries, and community sharing.
Account
Verify your API key and inspect granted scopes (
get_me)
Competitions
Browse competitions and read their submission specs
Check eligibility before submitting
Submit competition entries (cheatsheet, model-reference, solver-participation, IGP24-polynomial)
View leaderboards and your own standing
Read, download, and manage submissions
Track IGP24 label discovery progress in bulk
Playground
Browse available models and problem sets for practice
Submit, list, cancel, and manage practice runs
Retrieve per-problem results for a run
Stream live verdict events for solver-participation runs
Check usage and credit balance
Cheatsheets
Create, list, read, update, and delete personal cheatsheets for use in runs and competitions
Solver Templates
Create, list, read, update, and delete personal Lean 4 solver templates
Custom Lean Problems
Create, list, read, and delete private immutable Lean statement pairs for use in solver-participation runs
Contributor Network
Browse and search shared cheatsheets, solver templates, and model references
Publish and withdraw your own resources to/from the community
Favorite and unfavorite items
Comment on items and delete your own comments
Explore lineage graphs for individual items or across all visible items
View benchmark results for published items, overall or per-model
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SAIR MCP ServerList all active competitions"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sair-mcp
A local MCP (Model Context Protocol) server that exposes the SAIR Competition Public API as tools for an MCP client (Claude Code, Claude Desktop, or any other MCP-compatible client).
It covers the full documented API surface: account introspection, competitions (browsing, eligibility, leaderboards, submissions, IGP24 label progress), Playground (models, problem sets, runs, results, live event streaming, usage), your private cheatsheet and Lean solver-template libraries, custom Lean problems, and the Contributor Network (browsing, publishing, favoriting, commenting, lineage graphs, benchmarks).
Installation
Requires Python 3.10+.
git clone <this-repo>
cd SAIRmcp
pip install -e .Related MCP server: codabench-mcp
Getting a SAIR API key
Sign in to SAIR and open Account settings -> API keys.
Create a key and select the scopes you need. At minimum, for the examples below:
competition.readandcompetition.write. Addplayground.read/playground.writefor Playground tools,contributor-network.read/contributor-network.writefor Contributor Network tools.Copy the key immediately -- it is shown only once. Keys look like
sair_a1b2c3d4_zR9....
Configuration
Set these environment variables before starting the server:
Variable | Required | Default | Purpose |
| Yes | - | Your personal SAIR API key. The server refuses to start without it. |
| No |
| Override for testing against a different environment. |
Running it standalone
python -m sair_mcpThis starts the server on stdio and blocks, waiting for an MCP client to connect. There is no output on success; it's meant to be launched by an MCP client, not run interactively.
Registering with Claude Code and other mcp clients
Add to your project's .mcp.json (or user-level MCP config)
{
"mcpServers": {
"sair": {
"command": "python",
"args": ["-m", "sair_mcp"],
"env": {
"SAIR_API_KEY": "sair_a1b2c3d4_zR9..."
}
}
}
}Or via the CLI, substituting the same absolute path:
claude mcp add sair -- python3 -m sair_mcp(then set SAIR_API_KEY in your shell environment before launching Claude
Code, or add it to the env block above).
Alternative: pyproject.toml also declares a sair-mcp console-script
entry point, so once installed you can skip -m sair_mcp entirely and
point command straight at that script's absolute path instead -- again,
resolve it in the same command as the install so it can't drift to a
different environment's sair-mcp:
pip install -e . && which sair-mcpNo args needed when using this form.
If you use a dedicated virtual environment for this project (recommended
for isolation from other Python projects), the same rule applies: use
<path-to-venv>/bin/python (or <path-to-venv>/bin/sair-mcp) as command,
not a bare python.
Registering with Claude Desktop
Add the same shape to claude_desktop_config.json under mcpServers,
using the same absolute-interpreter-path command as above -- Desktop's
subprocess environment is even less likely than a terminal's to have your
Python environment on PATH.
Usage example
A typical end-to-end flow, as an MCP client would call it:
get_me-- confirm the key is valid and see its scopes.list_competitions-- find a competition ID.get_competition("modular-arithmetic-challenge")-- readsubmissionSpecto learn the requiredpayloadshape.get_my_participation("modular-arithmetic-challenge")-- checkcanSubmitbefore attempting anything.submit_competition_entry("modular-arithmetic-challenge", payload={"modelName": "you/your-model", "commitHash": "0123...(40 hex chars)"}).get_my_submission("modular-arithmetic-challenge")-- confirm the active submission.
Tool reference
All tools return the API's unwrapped data object as a dict (or None for
204 responses, or a plain string for the two text-returning tools). On
error, the tool call fails with a SairApiError-derived message in the
form [<http status> <error code>] <message>; consult
SAIR's Errors documentation
for the full code table.
Account (1 tool)
Tool | Scope | Purpose |
| none | Confirm the API key and see its owner + granted scopes. |
Competitions (10 tools)
Tool | Scope | Purpose |
|
| List competitions visible through the API. |
|
| Get one competition's detail and |
|
| Check |
|
| List published leaderboard rows. |
|
| Get the caller's own leaderboard entry. |
|
| Create or replace the caller's submission. |
|
| Read the caller's current submission (or history, for IGP24). |
|
| Read one submission by ID. |
|
| Download the stored text body of a submission. |
|
| Bulk aggregate IGP24 discovery progress by label. |
Playground (10 tools)
Tool | Scope | Purpose |
|
| List model IDs accepted in runs for a competition. |
|
| List available practice problem sets. |
|
| Get every problem in one problem set. |
|
| Create a practice run. |
|
| List the caller's runs for a competition. |
|
| Get one run's params, summary, and timing. |
|
| Cancel a pending/running run. |
|
| List per-cell/per-problem result rows for a run. |
|
| Collect live verdict events for a solver-participation run (blocks up to a timeout). |
|
| Get the caller's practice credit/usage counters. |
Cheatsheets (5 tools)
Tool | Scope | Purpose |
|
| List the caller's cheatsheets. |
|
| Get one cheatsheet including its content. |
|
| Create a cheatsheet. |
|
| Update a cheatsheet's title/content. |
|
| Delete a cheatsheet. |
Solver templates (5 tools)
Tool | Scope | Purpose |
|
| List the caller's Lean solver templates. |
|
| Get one solver template including its source. |
|
| Create a solver template. |
|
| Update a solver template's title/source. |
|
| Delete a solver template. |
Custom Lean problems (4 tools)
Tool | Scope | Purpose |
|
| List the caller's private Lean statement pairs. |
|
| Get one custom problem. |
|
| Create an immutable custom Lean problem. |
|
| Delete a custom problem. |
Contributor Network (13 tools)
Tool | Scope | Purpose |
|
| Browse shared cheatsheets/solver templates/model references. |
|
| Get one item's full payload. |
|
| Publish a saved resource, submission body, inline text, or model reference. |
|
| Withdraw (unpublish) an item you authored. |
|
| Favorite an item. |
|
| Unfavorite an item. |
|
| List comments on an item. |
|
| Post a comment. |
|
| Delete a comment. |
|
| Get the lineage subgraph rooted at one item. |
|
| Get the lineage graph across all visible items. |
|
| List platform-run benchmark summaries. |
|
| Get the per-model benchmark breakdown for one item. |
Total: 48 tools.
Development
pip install -e ".[dev]"
pytest --cov=sair_mcp --cov-report=term-missingAll tests run against a mocked HTTP layer (respx) -- no test requires or
uses a real SAIR_API_KEY or makes a real network call.
License
MIT -- see LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/osick/SAIRmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server