Repovive MCP Server
Click on "Deploy 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., "@Repovive MCP Server What contests are running this week, and what are the problems?"
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.
An MCP server that exposes the Repovive competitive-programming platform to any MCP client (Claude Desktop, Claude Code, IDE extensions, …). Built with FastMCP v3 and httpx.
It provides 102 tools, 11 resources (1 templated), and 8 prompts covering problems, contests, ratings, courses, blog posts, direct messages, notifications, mock-interview info, Vive points, account/profile management, real code submission, contest standings, production problem/contest authoring in Repovive's build editor, and a built-in local judge — with built-in version control over everything it edits, all behind scoped bearer authentication when served over HTTP.
Every tool has been tested end-to-end — read/write tools against the live Repovive API,
submission verified with a real Accepted verdict, and the authoring/judge tools by
generating full contests and running every reference solution to Accepted.
Contents
Related MCP server: cf-mcp-orange
How it works
Connect your MCP client (Claude Desktop, Claude Code, an IDE) to the server over stdio or HTTP.
Read & author — browse problems and contests, or generate and draft new ones in Repovive's build editor.
Judge locally — verify a solution against its tests with the built-in judge before anything leaves your machine.
Submit / publish — submit for a real verdict, or (with approval) publish a draft to a contest.
What you can do
Browse & read problems — list a contest's problems with full statements, constraints, I/O formats, time/memory limits, tags, and sample test cases.
Explore contests — list upcoming/ongoing/past contests, view details, check and manage your registrations, get invite links.
Submit & track — submit a solution for a real verdict, read your submission history, and pull a contest's ranking, results and announcements.
Ratings — page and filter the global leaderboard by country / name / tier.
Courses & blog — list courses and posts; manage course editors/metadata (with the right permissions).
Community — read/send direct messages, manage conversations and blocks, read and mark notifications.
Interviews & Vive — read mock-interview pricing/capacity/sessions; view Vive earn methods and create a Vive checkout link.
Account — who am I, profile, update country, search users, sign out.
Scoped access — hand out keys that can read but not submit, author but not publish, or call the platform but not run code on your host.
Undo your edits — every change to a draft, contest, course or profile is versioned automatically, with a diff and a one-call rollback.
Author for production — create problem drafts in Repovive's editor and fill in statement, tests, model solution, editorial and validator; generate and verify whole rounds; judge solutions locally — see Authoring.

Submitting code
repovive_submit_solution submits to POST /api/code/submit and polls until the verdict
is final — a real submission recorded on your account. Verify locally first with
repovive_judge_solution; Repovive rate-limits submissions to roughly 10 per minute.
repovive_submit_solution(contest_id="<24-hex>", problem_slug="remainder-count",
source=..., language="pypy")
# -> {"submissionId": "...", "status": "Accepted", "passed": 18, "total": 18}Language ids for submission follow the Judge0 set (python 71, pypy 220, cpp 54,
java 62, …), which differs from the problem editor's own ids — the tool maps names for
you. repovive_list_my_submissions lists your submission history.

Notes. The curated problem sets (Classics / FAANG / Quant / Math) are premium content served only through the website, so their problem lists are not available via the API —
repovive_list_problem_setsreturns their metadata and website URLs; for API-readable problems use contests (repovive_list_contest_problems). A problem like/dislike vote endpoint exists but keys on browser-URL identifiers that can't be resolved reliably from the public API, so it is intentionally not exposed.
Quick start
pip install repovive-mcp # or, from a clone: pip install -e .
export REPOVIVE_EMAIL="you@example.com"
export REPOVIVE_PASSWORD="your-password"
python -m repovive_mcp # stdio transport (or: repovive-mcp)Then point your MCP client at it (see below) and try
repovive_whoami or repovive_list_contests.
Serving it over HTTP instead? You also need an access token, because the port would otherwise let anyone act as your Repovive account — see Access control.
export REPOVIVE_MCP_AUTH_TOKEN="$(make auth-token)"
make run-http # or: docker compose up --buildInstall
Requires Python ≥ 3.10.
pip install repovive-mcpOr from a clone, for development:
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]" # fastmcp>=3, httpx, pytest, ruffPrefer a container? Images are published multi-arch, signed, and carry an SBOM:
docker pull ghcr.io/dwin-gharibi/repovive-mcp:latestRun it directly (stdio transport):
export REPOVIVE_EMAIL="you@example.com"
export REPOVIVE_PASSWORD="your-password"
python -m repovive_mcp # or: repovive-mcpAccess control
Two different things are being authenticated, and it is worth keeping them apart:
What it is | Configured with | |
Repovive account | who the server acts as on the platform |
|
MCP access | who may call this server |
|
Over stdio your MCP client spawns the process, so the process boundary is the trust boundary and there is nothing to configure. Over HTTP the server refuses to start without an access token — an open port there is an open door to your account: submitting code, sending direct messages, deleting contests.
export REPOVIVE_MCP_AUTH_TOKEN="$(python -c 'import secrets; print(secrets.token_urlsafe(32))')"Callers then send Authorization: Bearer <token>. You can store a sha256:<hex> digest
instead of the secret itself, hand out several keys with different privileges, or verify
JWTs from your own issuer.
Scopes. Every tool declares what it needs, and a caller without that scope doesn't get
an error — the tool is simply absent from tools/list, so a model never sees a capability
it can't use.
Scope | Grants |
| Problems, contests, standings, leaderboard, posts, courses, inbox. |
| Mutating your account: DMs, blocks, notifications, profile, registrations, Vive checkout. |
| Real submissions recorded against your account. |
| Creating and editing problem drafts. |
| Contest and course administration; deletions. |
| Running code on the server host (local judge, generators). |
| Reading the action log and revision history, and rolling a change back. |
# a read-only key for a dashboard, and a full key for your own agent
export REPOVIVE_MCP_AUTH_TOKENS='{
"sha256:<hex>": {"client_id": "dashboard", "scopes": ["repovive:read"]},
"sha256:<hex>": {"client_id": "agent"}
}'Full details — digests, expiry, JWT settings, and the REPOVIVE_MCP_ALLOW_ANONYMOUS
escape hatch for a port already behind an authenticating proxy — in
docs/SECURITY.md.
Configure your MCP client
Add a server entry. Example (Claude Desktop claude_desktop_config.json /
Claude Code mcp config):
{
"mcpServers": {
"repovive": {
"command": "python",
"args": ["-m", "repovive_mcp"],
"env": {
"REPOVIVE_EMAIL": "you@example.com",
"REPOVIVE_PASSWORD": "your-password"
}
}
}
}If you installed into a virtualenv, point command at that interpreter (e.g.
/path/to/.venv/bin/python) or use the repovive-mcp console script.
For a server you're running over HTTP, point the client at the endpoint and pass the access token:
{
"mcpServers": {
"repovive": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"headers": { "Authorization": "Bearer YOUR_ACCESS_TOKEN" }
}
}
}Tool reference
All tools are prefixed repovive_. Read tools accept response_format (markdown
default, or json) where a summary view is useful. Each carries the access scope it needs
(see Access control). The list below is grouped by area; the
always-current, auto-generated reference — with per-tool scopes and full descriptions — is
docs/TOOLS.md.

Account & profile (7)
Tool | Description |
| Current account (id, role, premium, Vive, streaks). |
| Profile document (job role, org, socials, location). |
| Update profile country (idempotent). |
| Find users by name (for DMs). |
| Your uploaded documents. |
| Deployed build/release info (no auth). |
| Invalidate session (auto re-auth next call). |
Problems (4)
Tool | Description |
| Curated sets (Classics/FAANG/Quant/Math) + URLs. |
| All problems in a contest (summaries or full). |
| One problem: statement, constraints, limits, samples. |
| Browser URL to solve/submit a problem. |
Contests & ratings (12)
Tool | Description |
| List contests, filter by upcoming/ongoing/past. |
| One contest by number or id. |
| Your registrations & permissions. |
| Register (normal or virtual). |
| Shareable invite link. |
| Invite eligibility. |
| List collaborators (admin). |
| Grant a role (admin). |
| Revoke a role (admin). |
| Edit contest settings (admin). |
| Delete a contest (admin, destructive). |
| Global ratings leaderboard (paged/filtered). |
Standings & results (4)
Tool | Description |
| Final standings for a contest. |
| Your per-problem results in a contest. |
| Contest announcements/clarifications. |
| Submissions for one contest problem. |
Submissions (3)
Tool | Description |
| Submit a solution and await the verdict (real submission). |
| Your submission history. |
| Read a submission's status/verdict by id. |
Content — courses & blog (8)
Tool | Description |
| Blog posts (paged). |
| Blog categories. |
| Courses with your enrollment. |
| List course editors. |
| Add an editor. |
| Remove an editor (destructive). |
| Update title/description/tags. |
| Public/private (admin). |
Community — notifications & DMs (14)
Tool | Description |
| In-app notifications. |
| Unread count. |
| Mark notifications read. |
| DM conversations. |
| Messages in a conversation. |
| Send a message. |
| Start a conversation. |
| Mark a conversation read. |
| Delete a conversation (destructive). |
| Delete a message (destructive). |
| Total unread DMs. |
| Blocked users. |
| Block a user. |
| Unblock a user (destructive). |
Interviews & Vive (5)
Tool | Description |
| Mock-interview prices. |
| Interview capacity. |
| Your interview sessions. |
| Ways to earn Vive. |
| Create a Vive purchase link (no charge). |
Authoring & judge — local (11)
Tool | Description |
| Built-in problem generators. |
| Generate a complete, self-consistent problem. |
| Empty problem skeleton + field reference. |
| Validate a problem against the schema. |
| Run a solution against tests (local judge). |
| Languages the host can run. |
| Generate + validate + judge a whole contest. |
| Generators that match Repovive's published style. |
| Generate a house-style problem. |
| Check a problem against house conventions. |
| Assemble & verify a full house-style round. |
Problem editor — build sessions (25)
Tool | Description |
| List / create problem drafts. |
| Slug, difficulty, limits, interactive flag. |
| Statement, I/O format, constraints. |
| Manage draft test cases. |
| Model & alternative solutions (language→judgeId). |
| Editorial / learn pages. |
| Input validator, custom checker. |
| Generators, gen-data, sources. |
| Generate & verify tests. |
| Push a whole generated problem into a draft. |
| Metadata+statement+tests+solution+editorial+validator in one call. |
| Delete a problem draft (destructive). |
| Publish step (explicit). |
History & revisions (9)
Tool | Description |
| Browse the local log of state-changing calls. |
| One entry in full, with its (redacted) arguments. |
| Where the database lives, what it holds, retention limits. |
| An entity's saved versions, newest first. |
| One revision including its full snapshot. |
| What changed between two revisions, field by field. |
| Roll back to a revision (or into a different entity). |
| Step one change back. |
| Delete history entries (destructive). |
Drafts are not visible on the platform until reviewed; publishing is the separate
repovive_build_add_to_contest call. Details in docs/AUTHORING.md.
Every edit above is versioned automatically — see History & rollback.
Authoring & local judge
The server can generate complete problems, build full contests, and evaluate them with a
local judge — offline, with no writes to the live platform. Every generated problem's
expected outputs are computed by running its reference solution, so it is correct by
construction; repovive_build_contest(..., verify=True) judges every reference solution
and only reports success when all are Accepted.
repovive_build_house_round(title="Repovive Starter Round 8")
-> {round, verification: {all_passed: true, ...}} # 7 problems, house-style, all ACWhen you're ready to put a draft into Repovive's editor, the build-session tools write everything and leave publishing to you:

Verified example artifacts live in examples/ (12 problems, 4 contests). Full
details in docs/AUTHORING.md. A ready-to-use agent skill is in
skills/repovive-contest-dev/.
History & rollback
Repovive has no version control for problem drafts, so the server keeps its own. Every state-changing call is logged, and every change to a problem draft, contest, course or your profile is snapshotted automatically — you don't opt in, and you don't call anything to save a version.
repovive_list_revisions(target_kind="build_session", target_id="<session id>")
# seq 4 auto Updated the draft statement <- the mistake
# seq 3 auto Added draft test cases
# seq 2 auto Updated the draft statement
# seq 1 baseline before the first tracked change
repovive_diff_revisions(from_revision_id=…, to_revision_id=…)
# statement.title: 'Array Sum' -> 'OOPS wrong title'
# statement.description: 'Sum the array.' -> 'Broken.'
repovive_undo_last_change(target_kind="build_session", target_id="<session id>")
# -> statement restored, test cases untouched, undo recorded as a new revisionNothing is destroyed. A restore re-applies an old snapshot through the normal API and is recorded as a new revision, so you can undo the undo.
Deleting a draft doesn't delete its history. Create a fresh build session and pass
into_target_idto rebuild it there.dry_run=Truereports exactly which sections would be written before anything changes.Honest about coverage. Repovive exposes no read endpoint for a draft's statement or generators, so those sections are reconstructed from what this server wrote; test cases and solutions are read back and always authoritative. Each revision names the sections it actually knows instead of pretending to more.
Irreversible things stay irreversible. A sent direct message, a recorded submission and a Vive checkout are logged, never claimed as undoable.
The log doubles as an audit trail — filter it by actor to see what a given access token did, or by tool to see who ran code on the host:
repovive_list_history(status="error", days=7)
repovive_list_history(tool="repovive_judge_solution")Everything lives in one local SQLite file (mode 0600), holds no secrets — argument keys
that look like credentials are redacted before writing — and is bounded by retention limits.
Reading needs repovive:history; restoring additionally needs the write scope of whatever is
being restored — so a repovive:history token alone is a genuine read-only audit key, and the
restore tools are not even listed for it. Full details in docs/HISTORY.md.
Repovive house style
The generators and the skill follow Repovive's measured conventions — read from all 98
published problems and 23 contests, and exposed as the repovive://house-style resource:
Problems are multi-test (every problem starts with
t), use a braced-array input format, a markdown-bullet constraints list, exactly one sample holding several sub-cases, and one explanation paragraph per sub-case. Memory limit 256 MB; time limits 1–2 s.Rounds are 7 problems (A–G) on the
500…3500points ladder with the difficulty curve easy, easy, medium, medium, medium, hard, hard, 120 minutes, tags drawn from a fixed 12-word vocabulary.
repovive_check_house_style validates a problem against these rules, and
repovive_build_house_round assembles a whole conforming round and verifies every problem.
Resources & prompts
Resources (read via URI) — 11, one templated:
repovive://me, repovive://profile, repovive://contests,
repovive://contests/{contest_id}/problems (templated), repovive://problem-sets,
repovive://leaderboard, repovive://posts, repovive://courses,
repovive://notifications, repovive://house-style, repovive://auth-scopes.
Prompts (parameterised workflows) — 8:
solve_problem, prepare_for_contest, study_plan, analyze_leaderboard,
inbox_triage, build_repovive_round, problemset_contest, author_and_verify_problem.
Example agent session
A typical "solve a real problem" loop chains a handful of tools:
1. repovive_list_contests(status="ongoing") # find a contest id
2. repovive_list_contest_problems(contest_id=…) # pick a problem slug
3. repovive_get_problem(contest_id=…, problem_slug=…) # statement + samples
4. …write a solution…
5. repovive_judge_solution(problem=…, source=…) # local check → Accepted
6. repovive_submit_solution(contest_id=…, problem_slug=…, source=…, language="pypy")
# -> {"status": "Accepted", "passed": 18, "total": 18}
7. repovive_get_contest_ranking(contest_id=…) # see where you land
The two authentications
Inbound — who may call this server. Nothing to configure over stdio; over HTTP a bearer token is required and the server refuses to start without one. Tokens are held as SHA-256 digests and carry scopes that decide which tools a caller can even see. See Access control and docs/SECURITY.md.
Outbound — who this server is on Repovive.
With
REPOVIVE_EMAIL+REPOVIVE_PASSWORD, the server logs in on first use, keeping both the JWT bearer token and theauth_tokensession cookie (some routes need the cookie). It re-authenticates automatically on a 401 — and a concurrent caller reuses a token another has already refreshed rather than logging in again — and caches the token (REPOVIVE_TOKEN_CACHE, mode0600, written atomically) to avoid login rate limits.With
REPOVIVE_TOKENonly, it uses the bearer token (cookie-gated routes may not work).A
429from Repovive surfaces as a typed rate-limit error carryingRetry-Afterrather than being retried indefinitely.The server sends a descriptive
User-Agentand standardOriginheader, exactly like any first-party API client.

Deployment
Runs over stdio (local) or HTTP (REPOVIVE_MCP_TRANSPORT=http, endpoint /mcp).
Docker, Docker Compose, Kubernetes (kustomize), Helm, OpenTofu/Terraform, Ansible, and
Vagrant paths are all provided under deploy/ and the root Docker/Vagrant files.
docker compose up --build # HTTP on :8000 (reads .env, incl. REPOVIVE_MCP_AUTH_TOKEN)
# or: helm install rv deploy/helm/repovive-mcp \
# --set credentials.email=... --set credentials.password=... --set access.token=...
# or: kubectl apply -k deploy/kubernetes (after creating the secret)Every path carries an access token, and the Helm chart refuses to render without one.

Full guide: docs/DEPLOYMENT.md. Handy targets in the Makefile
(make help) and a Taskfile.yml for go-task
(task --list).
Project layout
repovive-mcp/
├── repovive_mcp/ the server package
│ ├── app.py shared FastMCP instance, RepoviveClient, auth provider, lifespan
│ ├── auth.py access control for the server itself (tokens, JWT, scope guard)
│ ├── scopes.py the scope vocabulary
│ ├── client.py async httpx client (login, re-auth, rate limits, token cache)
│ ├── history.py local SQLite action log + revision store
│ ├── tracking.py which tools change what; the middleware that records it
│ ├── revisions.py per-entity snapshot capture and restore
│ ├── tools_*.py tool groups (account, contests, submit, build, …)
│ ├── resources.py MCP resources prompts.py MCP prompts
│ ├── authoring.py housestyle.py templates_house.py production.py local authoring
│ ├── localjudge.py Judge0-style subprocess judge
│ └── server.py registers everything; stdio or HTTP (refusing an open port)
├── scripts/gen_tools_doc.py regenerates docs/TOOLS.md from the live server
├── scripts/release.py one-source version management + changelog rolling
├── .github/workflows/ ci.yml (lint, tests, auth gate) and release.yml
├── docs/ architecture, tools, authoring, deployment, api map, security
├── deploy/ docker, kubernetes, helm, opentofu, ansible
├── examples/ verified problems & contests
├── skills/ repovive-contest-dev agent skill
└── tests/ smoke, offline authoring, and live e2e testsDocumentation
docs/ARCHITECTURE.md — components + diagrams
docs/TOOLS.md — full tool reference (auto-generated)
docs/AUTHORING.md — problem/contest generation + local judge
docs/DEPLOYMENT.md — Docker/K8s/Helm/OpenTofu/Ansible/Vagrant
docs/API_MAP.md — the Repovive endpoints the tools use
docs/HISTORY.md — the action log, automatic revisions, and rollback
docs/RELEASING.md — how a version reaches PyPI, GHCR and the Releases tab
docs/SECURITY.md — access tokens, scopes, credentials, boundaries, judge sandboxing
skills/repovive-contest-dev/ — production contest-development skill
Development & tests
pip install -e ".[dev]"
# Live tests require real credentials and are skipped without them:
REPOVIVE_EMAIL=... REPOVIVE_PASSWORD=... pytest -q
make check # lint + offline tests + docs freshness (no credentials needed)
make test-offline # or: task test:offline
make docs # regenerate docs/TOOLS.md from the live servertests/test_smoke.py boots the server in-memory (fastmcp.Client(mcp)), lists
tools/resources/prompts, and exercises representative read tools plus error handling.
tests/test_auth.py covers token parsing and verification, the scope guard, and the
fail-closed HTTP start; tests/test_client_behaviour.py drives the HTTP client through a
mock transport (re-login, rate limits, token-cache permissions); tests/test_history.py
runs the whole edit → snapshot → diff → undo loop.
docs/TOOLS.md is generated by scripts/gen_tools_doc.py (CI enforces freshness with
--check).
Security notes
The HTTP transport will not serve without an access token. Every caller acts as your Repovive account, so that port is the boundary that matters.
Credentials come only from environment variables — never hard-code them.
Treat the JWT/cookie as secrets; they grant access to your account. The token cache lives outside the repo (
REPOVIVE_TOKEN_CACHE, default$XDG_CACHE_HOME/repovive-mcp/token.json, mode0600).Write tools (submission, DMs, registration, deletes, course/contest admin) perform real actions; their annotations (
destructiveHint, etc.) let clients gate them, and scopes let you withhold them entirely.The local judge runs the code you give it.
repovive:executeis a separate scope for exactly that reason.The history database holds your statements, tests and solution source. It is written
0600, never leaves the host, redacts credential-shaped arguments, and can be turned off withREPOVIVE_HISTORY=off.Authoring writes drafts; publishing a draft to a live contest is a separate, explicit call. See docs/SECURITY.md.
Available Tools
102 toolsrepovive_add_course_editorAdd course editorAIdempotent
Grant a person edit or view access to a course by their email address. Requires edit rights on that course.
Inputs: email (required), course_id (required), role. Returns: result
repovive_available_judge_languagesList judge languagesARead-only
List the languages the local judge can actually run on this host (toolchain present) alongside every language it knows about. Check this before repovive_judge_solution.
Inputs: no named parameters. Returns: result
repovive_block_userBlock a userAIdempotent
Block a user so they can no longer direct-message the authenticated account, with an optional reason. Reversible with repovive_unblock_user.
Inputs: user_id (required), reason. Returns: result
repovive_build_add_testcasesAdd test casesA
Append test cases to a draft in one call. Cases are ADDED to whatever is already there — clear first with repovive_build_clear_testcases if you mean to replace them. For interactive problems omit expectedOutput; the interactor decides the verdict.
Inputs: cases_json (required), session_id (required). Returns: result
repovive_build_add_to_contestAttach draft to a contestA
Publish a draft by attaching it to a contest as a real problem. This is the step that makes authored work visible on the platform — never call it without the user's explicit approval. Verify the draft builds cleanly first.
Inputs: body_json (required), session_id (required). Returns: result
repovive_build_author_complete_problemAuthor a complete problemAIdempotent
Import a complete problem into a draft in one call: clears the existing test cases (unless replace_testcases=False), then writes metadata, statement, test cases, the reference solution, editorial pages and input validator. Returns a per-step report — check all_ok before treating the draft as ready. This edits a private draft; publishing it to a contest is a separate call.
Inputs: session_id (required), problem_json (required), learn_pages_json, validator_source, +1 more. Returns: result
repovive_build_cancel_runCancel build runAIdempotent
Cancel the build run currently executing for a draft.
Inputs: session_id (required). Returns: result
repovive_build_clear_testcasesClear test casesADestructiveIdempotent
Delete every manually added test case from a draft. This cannot be undone — use it before uploading a replacement set.
Inputs: session_id (required). Returns: result
repovive_build_contestBuild & test a full contestAIdempotent
Generate a whole contest from an ordered list of generator kinds and verify it: each problem is schema-checked, its reference solution is judged against its own tests, and a known-wrong solution is checked to fail. Returns the import-ready contest plus a per-problem verification report; require verification.all_passed before using it.
Inputs: title (required), problem_kinds (required), seed, verify, +1 more. Returns: result
repovive_build_create_sessionCreate a build sessionA
Start a new problem draft on Repovive and return its session id. Drafts are private to the authoring account until explicitly attached to a contest. Set force_new=False to resume an existing draft with the same name instead of creating another.
Inputs: session_name (required), mode, force_new. Returns: result
repovive_build_delete_generatorDelete a generatorADestructiveIdempotent
Remove a named generator from a draft. Any gen-data lines that invoke it will stop working, so update the gen-data script too.
Inputs: session_id (required), generator_name (required). Returns: result
repovive_build_delete_sessionDelete a problem draftADestructiveIdempotent
Permanently delete a problem draft and everything in it — statement, test cases, solutions, generators. This cannot be undone; confirm with the user before calling.
Inputs: session_id (required). Returns: result
repovive_build_delete_testcaseDelete one test caseADestructiveIdempotent
Delete one test case from a draft by its id. Get ids from repovive_build_list_testcases. This cannot be undone.
Inputs: session_id (required), testcase_id (required). Returns: result
repovive_build_get_solutionsGet draft solutionsARead-only
Fetch the solutions attached to a draft — the main test solution plus any alternatives with their expected verdicts.
Inputs: session_id (required). Returns: result
repovive_build_house_roundBuild a house-style roundAIdempotent
Build a full Repovive-format round from house-style generators, one per slot A-G, applying the 500-3500 points ladder and the easy/easy/medium/medium/medium/hard/hard difficulty curve. Every problem is schema-checked, house-style-checked and judged against its own tests; require verification.all_passed before publishing anything.
Inputs: title (required), problem_kinds (required), seed, num_hidden_per_problem. Returns: result
repovive_build_list_admin_contestsList attachable contestsARead-only
List the contests the authenticated account may attach a finished draft to, with their ids. Feed one of these ids to repovive_build_add_to_contest.
Inputs: no named parameters. Returns: result
repovive_build_list_sessionsList build sessionsARead-only
List the problem-draft build sessions owned by the authenticated account, with their session ids and current state. Every other build tool needs one of these ids.
Inputs: no named parameters. Returns: result
repovive_build_list_testcasesList draft test casesARead-only
List the test cases currently stored in a draft, with the per-case ids needed by repovive_build_delete_testcase.
Inputs: session_id (required). Returns: result
repovive_build_prepare_judge_targetPrepare judge targetA
Kick off Repovive's build pipeline for a draft: run the generators, validate the inputs, and run the solutions against the produced tests. Poll repovive_build_run_status for the outcome.
Inputs: session_id (required). Returns: result
repovive_build_push_problemPush a full problem into a draftAIdempotent
Write a problem object into an existing draft: metadata, statement and (optionally) test cases. Test cases are APPENDED to whatever the draft already holds. For a complete import that also clears old cases and uploads the reference solution, editorial and validator, use repovive_build_author_complete_problem.
Inputs: session_id (required), problem_json (required), include_testcases. Returns: result
repovive_build_run_statusGet build run statusARead-only
Check the status of a draft's build run started by repovive_build_prepare_judge_target: progress, per-stage results and any errors.
Inputs: session_id (required). Returns: result
repovive_build_set_custom_checkerSet custom checkerAIdempotent
Attach a custom checker to a draft, replacing exact output matching. Use it when a problem accepts multiple correct answers or needs tolerance-based comparison.
Inputs: session_id (required), checker_source (required). Returns: result
repovive_build_set_gen_dataSet gen-data scriptAIdempotent
Set a draft's gen-data script — one generator invocation per line, each producing one hidden test file. Define the generators first with repovive_build_set_generator.
Inputs: session_id (required), gen_data_content (required). Returns: result
repovive_build_set_generatorSet test generator sourceAIdempotent
Store a named test generator program in a draft. Generators are invoked from the gen-data script (repovive_build_set_gen_data) to produce the hidden tests.
Inputs: session_id (required), generator_name (required), generator_source (required). Returns: result
repovive_build_set_learn_pagesSet learn pagesAIdempotent
Set a draft's editorial pages — the post-contest explanation shown with the problem. Pass a JSON list of {"title", "content"}; pass "[]" to clear them.
Inputs: pages_json (required), session_id (required). Returns: result
repovive_build_set_solutionsSet draft solutionsAIdempotent
Attach a solution to a draft with its expected verdict (AC, WA, TLE, …) and, by default, make it the draft's main test solution. Set replace=False to keep the existing alternatives and append — useful for adding deliberately wrong or slow solutions that the test data must reject.
Inputs: source (required), session_id (required), name, replace, +3 more. Returns: result
repovive_build_set_validatorSet input validatorAIdempotent
Attach an input validator to a draft. The validator reads each generated test and asserts it satisfies the stated constraints, catching malformed test data before the problem goes live.
Inputs: session_id (required), validator_source (required). Returns: result
repovive_build_update_problem_infoUpdate problem infoAIdempotent
Update a draft's metadata: slug, difficulty, time limit, memory limit and interactive flag. Only the arguments you pass are changed; the rest keep their current values.
Inputs: session_id (required), slug, difficulty, time_limit, +2 more. Returns: result
repovive_build_update_sourcesUpdate build sources (raw)AIdempotent
Send a raw update-sources body to a draft, for fields the typed tools do not cover. Prefer repovive_build_update_statement, _set_generator, _set_gen_data, _set_validator or _set_custom_checker unless you need something they omit.
Inputs: body_json (required), session_id (required). Returns: result
repovive_build_update_statementUpdate problem statementAIdempotent
Write the statement of a draft: title, description body, input/output formats, constraints, interaction protocol and tags (markdown with LaTeX). Only the arguments you pass are changed. Avoid an inline math span followed directly by a period — Repovive rejects $10^5$.
Inputs: session_id (required), tags, title, constraints, +4 more. Returns: result
repovive_build_versionGet build versionARead-only
Return the deployed Repovive web-app build version. This is an unauthenticated health/diagnostic call — use it to check that the platform is reachable.
Inputs: no named parameters. Returns: result
repovive_check_house_styleCheck Repovive house styleARead-only
Check a problem against Repovive's measured house style and list every deviation: input/output braced-array notation, the t bound in the constraints bullet list, tags from the fixed 12-word vocabulary, 256 MB memory, 1-2 s time limit, a points value on the ladder, and exactly one explained sample.
Inputs: problem_json (required). Returns: result
repovive_check_interview_capacityCheck interview capacityARead-only
Report whether Repovive currently has mock-interview capacity available for booking.
Inputs: no named parameters. Returns: result
repovive_check_invite_eligibilityCheck invite eligibilityARead-only
Report whether the authenticated account may issue contest invitations, and any remaining invite quota.
Inputs: no named parameters. Returns: result
repovive_create_vive_checkoutCreate Vive checkoutA
Start a paid checkout to buy Vive points for the authenticated account and return the payment URL. This begins a real purchase flow — always confirm the amount with the user before calling.
Inputs: vive_amount (required). Returns: result
repovive_delete_contestDelete a contest (admin)ADestructive
Permanently delete a contest and everything attached to it. This cannot be undone — confirm with the user before calling. Requires contest administration rights.
Inputs: contest_id (required). Returns: result
repovive_delete_conversationDelete a conversationADestructiveIdempotent
Delete a direct-message conversation and its history for the authenticated account. This cannot be undone — confirm with the user before calling.
Inputs: conversation_id (required). Returns: result
repovive_delete_direct_messageDelete a messageADestructiveIdempotent
Delete a single direct message the authenticated account sent. This cannot be undone — confirm with the user before calling.
Inputs: message_id (required). Returns: result
repovive_diff_revisionsDiff two revisionsARead-only
Compare two saved revisions of the same entity and list what changed field by field — added, removed and modified. Use it to see what a change actually did before deciding whether to roll it back.
Inputs: to_revision_id (required), from_revision_id (required), response_format. Returns: result
repovive_generate_house_problemGenerate a house-style problemAIdempotent
Generate one problem in Repovive's published house style: multi-test input led by t, braced-array input/output sections, a bulleted constraints list bounding t, and a single sample packing several sub-cases with per-case explanations. Deterministic in the seed; runs the reference solution on this host to produce expected outputs.
Inputs: kind (required), seed, num_hidden, cases_per_test. Returns: result
repovive_generate_problemGenerate a problemAIdempotent
Generate a complete, self-consistent problem from a built-in generator: statement, constraints, samples with explanations, deterministic hidden tests, an input validator, an editorial and a reference solution. Test outputs are produced by running the reference solution on this host. Same seed gives the same problem.
Inputs: kind (required), seed, num_hidden. Returns: result
repovive_get_contestGet a contestARead-only
Fetch one contest's full record by contest number (the number shown in its title) or by ObjectId. Pages through the contest list until it finds a match, so older contests resolve too.
Inputs: contest_id, contest_number. Returns: result
repovive_get_contest_announcementsGet contest announcementsARead-only
Fetch the announcements and clarifications posted by the jury for a contest. Check these when a statement is ambiguous or a problem was patched mid-round.
Inputs: contest_id (required). Returns: result
repovive_get_contest_invite_linkGet contest invite linkARead-only
Fetch the shareable invite link for a contest, when the authenticated account is allowed to invite. Use repovive_check_invite_eligibility first if unsure.
Inputs: contest_id (required). Returns: result
repovive_get_contest_permissionsGet contest permissions (admin)ARead-only
List which users hold editor/viewer/admin roles on a contest. Requires the authenticated account to administer that contest.
Inputs: contest_id (required). Returns: result
repovive_get_contest_rankingGet contest rankingARead-only
Fetch a contest's standings — rank, participant, country and total score — capped at the number of rows you ask for. Use it after a contest to see final placement.
Inputs: contest_id (required), limit, response_format. Returns: result
repovive_get_contest_registrationsGet my registrationsARead-only
List the contests the authenticated account is registered for, including virtual participation windows. Check this before registering again.
Inputs: no named parameters. Returns: result
repovive_get_contest_resultsGet my contest resultsARead-only
Summarise how the authenticated account did in one contest: every problem with its points, attempt count and best verdict, plus the total solved. Combines the contest's problem list with the account's submissions.
Inputs: contest_id (required), page_size. Returns: result
repovive_get_conversation_messagesGet DM messagesARead-only
Read the messages in one direct-message conversation, newest page first. Use it to review a thread before replying with repovive_send_direct_message.
Inputs: conversation_id (required), page, page_size. Returns: result
repovive_get_course_editorsGet course editorsARead-only
List the users who can edit a course, with their roles. Requires edit rights on that course.
Inputs: course_id (required). Returns: result
repovive_get_history_entryGet a history entryARead-only
Fetch one history entry in full, including the (secret-redacted) arguments the tool was called with and any error it returned. Use it to see exactly what a change did.
Inputs: entry_id (required). Returns: result
repovive_get_interview_pricesGet interview pricesARead-only
Fetch the current price list for Repovive mock interviews, by interview type and duration.
Inputs: no named parameters. Returns: result
repovive_get_leaderboardGet ratings leaderboardARead-only
Fetch a page of Repovive's global ratings leaderboard — rank, name, current and max rating, contest count and country — with optional country, name and tier filters.
Inputs: name, page, tier, limit, +2 more. Returns: result
repovive_get_my_profileGet my profileARead-only
Fetch the public profile of the authenticated account: username, full name, job role, organisation, open-to-work flag, location and verification badges. Complements repovive_whoami, which returns account/billing state instead.
Inputs: response_format. Returns: result
repovive_get_post_categoriesGet blog categoriesARead-only
List the categories blog posts are filed under, with their slugs and post counts.
Inputs: no named parameters. Returns: result
repovive_get_problemGet a problemARead-only
Fetch one contest problem in full: statement, input/output formats, constraints, time and memory limits, tags, sample tests with explanations, and the browser workspace URL. This is the tool to call before solving or submitting.
Inputs: contest_id (required), problem_slug (required), response_format, include_hidden_tests. Returns: result
repovive_get_problem_submissionsGet submissions for a problemARead-only
List the submissions made against one contest problem. Defaults to the authenticated account; pass user_id to look at another participant where the contest allows it.
Inputs: contest_id (required), problem_slug (required), user_id. Returns: result
repovive_get_problem_workspace_urlGet solve/submit URLARead-only
Build the repovive.com URL where a problem can be read and solved in the browser. Pass contest_id for a contest problem, or problem_set (classics|faang|quant|math) for a curated-set problem. Useful when a capability is website-only.
Inputs: problem_slug (required), contest_id, problem_set. Returns: result
repovive_get_revisionGet a revisionARead-only
Fetch one saved revision including its full snapshot — the statement, test cases, solutions and settings as they stood. Address it by revision id, or by target plus sequence number.
Inputs: seq, target_id, revision_id, target_kind. Returns: result
repovive_get_submissionGet a submissionARead-only
Fetch one submission by id: its verdict, passed/total counts, judging status, language and timing. Use it to poll a submission that repovive_submit_solution left pending.
Inputs: submission_id (required). Returns: result
repovive_get_unread_dm_countUnread DM countARead-only
Return how many direct messages are unread for the authenticated account — a cheap check before listing conversations.
Inputs: no named parameters. Returns: result
repovive_get_unread_notifications_countUnread notifications countARead-only
Return how many in-app notifications are unread for the authenticated account — a cheap check before fetching the full list.
Inputs: no named parameters. Returns: result
repovive_get_vive_earn_methodsGet Vive earn methodsARead-only
List the ways an account can earn Vive points on Repovive (streaks, solves, contest participation, …) together with the reward each one grants.
Inputs: no named parameters. Returns: result
repovive_history_statusHistory statusARead-only
Report where the history database lives, whether recording is on, how much it holds, the retention limits in force, and which entity kinds can be rolled back.
Inputs: no named parameters. Returns: result
repovive_judge_solutionJudge a solution locallyAIdempotent
Run a solution against test cases on this host and return a per-case verdict (Accepted / Wrong Answer / Time Limit Exceeded / Memory Limit Exceeded / Runtime Error / Compilation Error) with the failing input, expected and actual output. Supply either problem_json or test_cases_json. Use this before repovive_submit_solution — it costs nothing and does not touch the platform. Executes the code you pass, so only judge code you trust.
Inputs: source (required), language, problem_json, time_limit_s, +2 more. Returns: result
repovive_list_blocked_usersList blocked usersARead-only
List the users the authenticated account has blocked from messaging it, with the block ids needed to undo them.
Inputs: no named parameters. Returns: result
repovive_list_contest_problemsList contest problemsARead-only
List every problem in one contest with its slug, order, difficulty, points, limits, tags and solve counts. Set full=True to also include statements. Hidden test cases are never returned. Get contest ids from repovive_list_contests.
Inputs: contest_id (required), full, response_format. Returns: result
repovive_list_contestsList contestsARead-only
List Repovive contests with their ObjectId, contest number, title, computed status (upcoming/ongoing/past), window, problem and member counts, and premium/rated flags. The ObjectId returned here is what every other contest tool needs.
Inputs: skip, limit, status, response_format. Returns: result
repovive_list_conversationsList DM conversationsARead-only
List the authenticated account's direct-message conversations with their ids, participants, last message and unread counts. The conversation id feeds every other DM tool.
Inputs: page, page_size. Returns: result
repovive_list_coursesList coursesARead-only
List Repovive courses visible to the authenticated account: id, title, slug, description, section/unit counts, access level, enrolment count and whether this account can edit them.
Inputs: response_format. Returns: result
repovive_list_historyList action historyARead-only
Browse this server's local log of state-changing calls, newest first: when, which access token, which tool, what it targeted, whether it succeeded, and the revision it produced. Filter by target, tool, actor, status or age. This is the audit trail — use repovive_list_revisions to see an entity's versions.
Inputs: days, tool, actor, limit, +4 more. Returns: result
repovive_list_house_templatesList house-style generatorsARead-only
List the house-style generators, each pre-assigned to a round slot (A-G) with the matching points and difficulty. These produce Repovive's published round format: multi-test input led by t, braced-array I/O sections, one sample holding several sub-cases. Feed the kinds to repovive_build_house_round.
Inputs: no named parameters. Returns: result
repovive_list_interview_sessionsList interview sessionsARead-only
List the mock-interview sessions booked by the authenticated account, with their scheduling and status. Supports offset/limit paging.
Inputs: limit, offset. Returns: result
repovive_list_my_documentsList my documentsARead-only
List the documents (CV/resume and other uploads) attached to the authenticated Repovive account, with their ids and metadata.
Inputs: no named parameters. Returns: result
repovive_list_my_submissionsList my submissionsARead-only
List the authenticated account's submissions, newest first, with verdicts and timestamps. Optionally filter by problem slug or contest id, and page with page/page_size.
Inputs: page, page_size, contest_id, problem_slug. Returns: result
repovive_list_notificationsList notificationsARead-only
List in-app notifications for the authenticated account with their ids, titles, messages, read state and timestamps, plus the unread count. Pass the ids to repovive_mark_notifications_read to clear them.
Inputs: limit, response_format. Returns: result
repovive_list_postsList blog postsARead-only
List Repovive blog posts with title, slug, author, publication date, read time, likes/views and tags. Supports page/limit paging.
Inputs: page, limit, response_format. Returns: result
repovive_list_problem_setsList curated problem setsARead-only
List Repovive's curated practice sets (Classics, FAANG, Quant, Math) with their keys, submission kind (code/answer/proof) and browser URLs. Statements for these sets are website-only; for problems readable through this server use repovive_list_contests then repovive_list_contest_problems.
Inputs: response_format. Returns: result
repovive_list_problem_templatesList problem generatorsARead-only
List the built-in problem generators (kind, title, difficulty, tags) that repovive_generate_problem and repovive_build_contest accept. These produce classic single-test problems; see repovive_list_house_templates for Repovive's round format.
Inputs: no named parameters. Returns: result
repovive_list_revisionsList revisionsARead-only
List the saved versions of an entity, newest first, with the sequence number to pass to repovive_restore_revision. Revisions are captured automatically whenever a problem draft, contest, course or your profile is changed through this server.
Inputs: limit, target_id, target_kind, response_format. Returns: result
repovive_logoutLog outAIdempotent
Invalidate the current Repovive session server-side and drop the cached token from this MCP server. The next authenticated tool call logs in again from the configured credentials; use it to force a fresh session.
Inputs: no named parameters. Returns: result
repovive_mark_conversation_readMark conversation readAIdempotent
Mark every message in one conversation as read, clearing its unread badge.
Inputs: conversation_id (required). Returns: result
repovive_mark_notifications_readMark notifications readAIdempotent
Mark the given in-app notifications as read. Take the ids from repovive_list_notifications; already-read ids are harmless.
Inputs: notification_ids (required). Returns: result
repovive_new_problem_templateNew problem templateARead-only
Return an empty Repovive problem object plus a field-by-field description of the schema. Start here when authoring a problem by hand rather than from a generator.
Inputs: no named parameters. Returns: result
repovive_purge_historyPurge historyADestructive
Permanently delete history entries and revisions — everything older than N days, or everything for one entity. This destroys the ability to roll those changes back and cannot be undone; confirm with the user before calling.
Inputs: target_id, target_kind, older_than_days. Returns: result
repovive_register_for_contestRegister for a contestAIdempotent
Register the authenticated account for a contest. Use mode='normal' for the live window, or mode='virtual' with an ISO-8601 virtual_start_time to schedule a virtual run. This is a real registration on the account.
Inputs: contest_id (required), mode, virtual_start_time. Returns: result
repovive_remove_contest_permissionRemove contest permission (admin)ADestructiveIdempotent
Revoke a user's role on a contest, removing their editor/viewer/admin access. Requires contest administration rights.
Inputs: user_id (required), contest_id (required). Returns: result
repovive_remove_course_editorRemove course editorADestructiveIdempotent
Revoke a user's edit access to a course. Requires edit rights on that course; the removed editor loses access immediately.
Inputs: course_id (required), editor_id (required). Returns: result
repovive_restore_revisionRestore a revisionAIdempotent
Roll an entity back to a saved revision by re-applying its snapshot through the normal Repovive API. Nothing is deleted: the restore is itself recorded as a new revision, so you can undo the undo. Pass into_target_id to restore a snapshot into a different entity — for instance to rebuild a deleted problem draft in a fresh build session. Use dry_run=True first to see exactly which steps would run.
Inputs: seq, dry_run, target_id, revision_id, +2 more. Returns: result
repovive_search_usersSearch usersARead-only
Search Repovive users by name (partial match) and return the matches with their user ids. Use it to resolve a person's id before starting a direct message, blocking them, or granting contest permissions.
Inputs: query (required). Returns: result
repovive_send_direct_messageSend a direct messageA
Send a message into an existing conversation as the authenticated account. This is visible to a real person immediately and cannot be unsent from here — get the user's approval on the wording first.
Inputs: content (required), conversation_id (required). Returns: result
repovive_set_contest_permissionSet contest permission (admin)AIdempotent
Grant a user a role on a contest (e.g. editor, viewer, admin). Resolve the target's user id with repovive_search_users first. Requires contest administration rights.
Inputs: role (required), user_id (required), contest_id (required). Returns: result
repovive_set_course_visibilitySet course visibility (admin)AIdempotent
Publish or unpublish a course platform-wide. Making a course public exposes it to every Repovive user, so confirm before calling. Requires site administration rights.
Inputs: course_id (required), is_public (required). Returns: result
repovive_start_conversationStart a conversationA
Open a new direct-message conversation with a user and send the first message. Resolve recipient_id with repovive_search_users. This reaches a real person — confirm before calling.
Inputs: recipient_id (required), initial_message (required). Returns: result
repovive_submit_solutionSubmit a solutionA
Submit source code to a contest problem and, by default, poll until the judge returns a final verdict. This records a REAL submission on the authenticated Repovive account and counts against the ~10 submissions/minute limit — verify locally with repovive_judge_solution first. Returns the submission id, verdict and passed/total.
Inputs: source (required), contest_id (required), problem_slug (required), wait, +2 more. Returns: result
repovive_unblock_userUnblock a userADestructiveIdempotent
Remove a block so the user can message the authenticated account again. Take the block id from repovive_list_blocked_users.
Inputs: block_id (required). Returns: result
repovive_undo_last_changeUndo the last changeA
Step one change back: restore the entity's previous revision, undoing the most recent edit made through this server. Equivalent to restoring seq-1. Nothing is deleted — the undo is recorded as a new revision, so it can itself be undone. Use dry_run=True to see what would change first.
Inputs: target_id (required), target_kind (required), dry_run. Returns: result
repovive_update_contestUpdate a contest (admin)AIdempotent
Update a contest's settings — title, lobby problem count, admin-only and weekly-challenge flags, problem display style, rated tier cap. Only the arguments you pass are changed. Requires contest administration rights.
Inputs: contest_id (required), title, admin_only, rated_max_tier, +3 more. Returns: result
repovive_update_course_detailsUpdate course detailsAIdempotent
Update a course's title and, optionally, its description and tags. Only the fields you pass are changed. Requires edit rights on that course.
Inputs: title (required), course_id (required), tags, description. Returns: result
repovive_update_my_locationUpdate my countryAIdempotent
Set the country shown on the authenticated account's profile and used for country-filtered leaderboards. Takes an ISO 3166-1 country code and overwrites any previous value.
Inputs: country (required), country_auto_detected. Returns: result
repovive_validate_problemValidate a problemARead-only
Check a problem object against Repovive's schema and report every issue found: missing or empty fields, a non-URL-safe slug, bad difficulty, non-positive limits, and missing or malformed test cases. Run it before pushing a draft.
Inputs: problem_json (required). Returns: result
repovive_whoamiWho am IARead-only
Return the Repovive account this server is authenticated as: id, name, email, role, verification and premium status, Vive balance, streaks, country and join date. Use it to confirm which account submissions and messages will be attributed to.
Inputs: response_format. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 102 tools
Most tools are clearly separated by resource and action, and descriptions explicitly distinguish near-twins like get_my_profile vs whoami and push_problem vs author_complete_problem. However, with 102 tools there are several clusters (history vs revisions, contest ranking vs leaderboard, build status vs build actions) where an agent could still misselect without careful reading.
The overwhelming majority of tools follow a consistent repovive_verb_noun snake_case pattern, which makes the set predictable. Minor deviations like whoami, new_problem_template, available_judge_languages, and build_run_status keep it from being a perfect 5.
102 tools is far beyond the 50+ threshold for an extreme mismatch. Even if each tool is individually useful, the surface is too large for an agent to navigate efficiently and for a user to audit coherently.
The server covers many domains thoroughly: contest problems, draft building, submissions, DMs, notifications, and revision history. Notable gaps remain, however, including no contest creation, no contest unregistration, no mock-interview booking/cancellation, and no course creation or content management.
Maintenance
Related MCP Connectors
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Operate GitHub from your AI assistant: repos, PRs, issues, Actions. Previews and read-only mode.
Read and write KukGit repositories, files, issues and pull requests from an AI assistant.
Code intelligence for LLMs. Analyze, search, and retrieve code from any public git repository.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to participate in CodeChef contests by fetching problems, generating and testing solutions in a secure sandbox, and submitting answers.-
- AlicenseAqualityDmaintenanceA complete, all-in-one MCP server for Codeforces, enabling AI assistants to access user profiles, compare users, search problems, get practice recommendations, and more.83MIT
- FlicenseAqualityCmaintenanceEnables coding agents to discover unsolved Codeforces practice problems, analyze tag performance, and inspect submissions, profiles, rating history, and upcoming contests through MCP-compatible clients.6-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to interact with GitHub data and Codeforces competitive programming analytics, including profiles, repositories, commits, PRs, issues, contest history, weak-topic analysis, and problem recommendations.MIT