Competitive Programming Mentor MCP Server
Provides 23 modular tools for competitive programming, including problem analysis, algorithm planning, code generation, verification, testing, code review, and learning assistance.
README
<p align="center"> <h1 align="center">π Competitive Programming Mentor β MCP Server</h1> <p align="center"> A production-grade <strong>Model Context Protocol (MCP)</strong> server that decomposes competitive programming expertise into 23 modular, provider-independent tools β orchestrated by any MCP-compatible client. </p> </p>
<p align="center"> <img src="https://img.shields.io/badge/python-3.11+-blue?logo=python&logoColor=white" /> <img src="https://img.shields.io/badge/MCP-FastMCP_3.x-green?logo=data:image/svg+xml;base64,PHN2Zy8+" /> <img src="https://img.shields.io/badge/LLM-OpenAI_%7C_Ollama-orange" /> <img src="https://img.shields.io/badge/validation-Pydantic_v2-red?logo=pydantic" /> <img src="https://img.shields.io/badge/cache-Two--Tier-purple" /> </p>
π Table of Contents
- Why MCP?
- Architecture
- Tool Catalog
- Project Structure
- Getting Started
- Configuration
- Workflows
- How It Works
- Testing
- Contributing
π€ Why MCP?
Traditional AI coding assistants force all reasoning through one massive prompt. This approach suffers from:
| Problem | Impact |
|---|---|
| Monolithic prompts | Impossible to test, cache, or reuse individual capabilities |
| Provider lock-in | Switching from OpenAI β Ollama requires rewriting everything |
| No structured output | Raw text responses require fragile regex parsing |
| Redundant LLM calls | Identical problems re-analyzed every time |
This MCP server solves all four. Each capability is an independent tool with its own schema, prompt template, cache key, and validation pipeline.
ββββββββββββββββββββ MCP Protocol ββββββββββββββββββββββββββββ
β Claude Desktop ββββββββββββββββββββββββΊβ CP Mentor MCP Server β
β Cursor IDE β JSON-RPC / stdio β β
β Claude CLI β β 23 Tools Β· 3 Resources β
β Any MCP Client β β 3 Prompts Β· 2-Tier Cacheβ
ββββββββββββββββββββ ββββββββββββββ¬ββββββββββββββ
β
ββββββββββββββΌββββββββββββββ
β LLM Provider Layer β
β ββββββββββ βββββββββββ β
β β OpenAI β β Ollama β β
β βgpt-4o β βllama3.1 β β
β ββββββββββ βββββββββββ β
ββββββββββββββββββββββββββββ
π Architecture
graph TD
Client["MCP Client<br/>(Cursor Β· Claude Desktop Β· CLI)"]
Server["FastMCP Server<br/>server.py"]
Cache{"Two-Tier Cache<br/>Memory TTL + SQLite Disk"}
Prompt["Jinja2 Prompt Manager<br/>prompts/*.md"]
Provider["LLM Provider Factory<br/>OpenAI | Ollama"]
Validator{"Self-Correcting Validator<br/>Pydantic v2 Schemas"}
Formatter["Response Formatter<br/>+ _meta tracing"]
Client -->|"tool call (JSON-RPC)"| Server
Server -->|"check cache"| Cache
Cache -->|"HIT"| Formatter
Cache -->|"MISS"| Prompt
Prompt -->|"rendered prompt"| Provider
Provider -->|"raw JSON"| Validator
Validator -->|"schema fail β retry prompt"| Provider
Validator -->|"schema pass"| Cache
Cache -->|"store result"| Formatter
Formatter -->|"structured response"| Client
Core Design Principles
| Principle | Implementation |
|---|---|
| Tool-Service Decoupling | Tools contain zero business logic β they delegate to PromptManager β Provider β Validator β Cache β Formatter |
| Provider Independence | BaseLLMProvider abstract class ensures zero OpenAI/Ollama imports in tool code |
| Schema-First Validation | Every tool has a dedicated Pydantic BaseModel β LLM outputs are validated and auto-corrected |
| Two-Tier Caching | In-memory TTLCache (ΞΌs latency) + persistent diskcache (survives restarts) |
| Fail-Safe Registration | Each tool module is try/except imported β one broken tool doesn't crash the server |
π§ Tool Catalog (23 Tools)
π Analysis (4 tools)
| Tool | Description | Schema |
|---|---|---|
detect_patterns |
Identifies algorithmic patterns (DP, Graph, Greedy, Math, etc.) from problem text | PatternResponse |
extract_constraints |
Parses numeric bounds (N, M, K, Q) and system limits (time/memory) | ConstraintResponse |
estimate_difficulty |
Approximates competitive programming difficulty rating | DifficultyResponse |
identify_topics |
Tags primary/secondary topic categories | TopicsResponse |
π Planning (4 tools)
| Tool | Description | Schema |
|---|---|---|
suggest_algorithms |
Recommends candidate algorithms based on constraints | AlgorithmsListResponse |
compare_algorithms |
Builds a trade-off comparison matrix across candidates | AlgorithmsComparisonResponse |
choose_best_algorithm |
Selects the optimal algorithm with justification | BestAlgorithmResponse |
estimate_runtime |
Calculates operation count vs. time budget feasibility | RuntimeEstimateResponse |
π» Code Generation (3 tools)
| Tool | Description | Schema |
|---|---|---|
generate_solution |
Produces optimized, contest-ready code in the target language | SolutionResponse |
generate_pseudocode |
Outputs language-agnostic structural pseudocode | PseudocodeResponse |
generate_multi_language |
Generates C++, Java, and Rust implementations simultaneously | MultiLangResponse |
β Verification (3 tools)
| Tool | Description | Schema |
|---|---|---|
dry_run |
Traces variable states step-by-step through sample inputs | DryRunResponse |
prove_correctness |
Provides formal correctness proofs (loop invariants, induction) | CorrectnessProofResponse |
analyze_complexity |
Computes asymptotic time/space complexity with justification | ComplexityResponse |
π§ͺ Testing (3 tools)
| Tool | Description | Schema |
|---|---|---|
generate_testcases |
Creates input/output test pairs covering standard scenarios | TestcasesResponse |
generate_edge_cases |
Targets boundary conditions, zero-cases, and overflow scenarios | EdgeCasesResponse |
stress_testing |
Generates randomized brute-force stress test configurations | StressTestResponse |
π Code Review (3 tools)
| Tool | Description | Schema |
|---|---|---|
review_solution |
Full code review with correctness, efficiency, and style feedback | ReviewResponse |
find_bug |
Pinpoints logical, runtime, or compile-time bugs | BugResponse |
optimize_solution |
Suggests constant-factor and algorithmic optimizations | OptimizationResponse |
π Learning (3 tools)
| Tool | Description | Schema |
|---|---|---|
get_hint |
Progressive hint system (nudge β approach β partial solution) | HintResponse |
explain_algorithm |
Educational breakdown with examples, when-to-use heuristics | ExplanationResponse |
recommend_next_problem |
Suggests follow-up problems to reinforce learned concepts | RecommendationResponse |
π Project Structure
Competitive Programming Mentor MCP Server/
β
βββ app.py # Entry point β mcp.run()
βββ server.py # FastMCP app, tool/resource/prompt registration
βββ config.py # Pydantic-settings configuration from .env
βββ pyproject.toml # Dependencies & build config
βββ .env.example # Environment template
β
βββ services/ # Core business logic layer
β βββ llm/
β β βββ base_provider.py # Abstract LLM interface
β β βββ openai_provider.py # OpenAI gpt-4o-mini adapter
β β βββ ollama_provider.py # Ollama local LLM adapter
β β βββ provider_factory.py # Factory: .env β Provider instance
β βββ prompt_manager.py # Jinja2 template renderer
β βββ validator.py # Pydantic validation + self-correcting retry
β βββ cache.py # Two-tier cache (TTLCache + diskcache)
β βββ problem_parser.py # Regex constraint extractor (N, M, K, Q)
β βββ formatter.py # Response normalization + _meta tags
β
βββ tools/ # MCP tool implementations (23 tools)
β βββ analysis/ # detect_patterns, extract_constraints, ...
β βββ planning/ # suggest_algorithms, compare_algorithms, ...
β βββ generation/ # generate_solution, generate_pseudocode, ...
β βββ verification/ # dry_run, prove_correctness, ...
β βββ testing/ # generate_testcases, generate_edge_cases, ...
β βββ review/ # review_solution, find_bug, optimize_solution
β βββ learning/ # get_hint, explain_algorithm, recommend_problem
β
βββ schemas/ # Pydantic response models (one per tool)
βββ prompts/ # Jinja2 markdown templates (one per tool + personas)
βββ resources/ # Static knowledge base (Markdown files)
β βββ algorithms/graphs/ # dijkstra.md
β βββ data_structures/ # segment_tree.md
β βββ patterns/ # sliding_window.md
β
βββ tests/ # Pytest test suite
β βββ test_parser.py # Constraint parsing tests
β βββ test_cache.py # Two-tier cache tests
β βββ test_validator.py # Schema validation + retry tests
β
βββ docs/
βββ ARCHITECTURE.md # System design documentation
βββ TOOLS.md # Tool reference catalog
π Getting Started
Prerequisites
Installation
# Clone the repository
git clone https://github.com/your-username/competitive-programming-mcp.git
cd competitive-programming-mcp
# Install dependencies with uv
uv sync --all-extras
# Copy and configure environment
cp .env.example .env
# Edit .env with your API keys / Ollama settings
Quick Start
# Start the MCP server (stdio transport)
uv run app.py
# Or run in development mode with auto-reload
fastmcp dev app.py
# Run tests
uv run pytest
β Configuration
All settings are managed via .env and loaded through Pydantic Settings:
# βββ LLM Provider ββββββββββββββββββββββββββββββββββββ
LLM_PROVIDER=openai # "openai" or "ollama"
# βββ OpenAI (when LLM_PROVIDER=openai) βββββββββββββββ
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-mini # ~$0.15/1M input tokens
OPENAI_MAX_TOKENS=4096
OPENAI_TEMPERATURE=0.2 # Low = deterministic code
# βββ Ollama (when LLM_PROVIDER=ollama) ββββββββββββββββ
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.1:8b # Run: ollama pull llama3.1:8b
# βββ Cache ββββββββββββββββββββββββββββββββββββββββββββ
CACHE_ENABLED=true
CACHE_TTL_SECONDS=3600 # 1-hour TTL
CACHE_DISK_DIR=.cache # SQLite-backed persistent cache
# βββ Server ββββββββββββββββββββββββββββββββββββββββββ
LOG_LEVEL=INFO # DEBUG | INFO | WARNING | ERROR
π Workflows
Workflow 1: Claude Desktop Integration
Add the following to your claude_desktop_config.json:
{
"mcpServers": {
"cp-mentor": {
"command": "uv",
"args": [
"--directory",
"YOUR_ABSOLUTE_PATH\\Competitive Programming Mentor MCP Server",
"run",
"app.py"
]
}
}
}
Note on Config Locations:
- Standard Windows:
%APPDATA%\Claude\claude_desktop_config.json- Windows Store App:
C:\Users\YOUR_NAME\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json
Restart Claude Desktop completely. Note: In the latest versions of Claude Desktop, the plug (π) icon has been removed from the UI. MCP tools are simply loaded silently in the background. Just ask Claude to "Use your cp-mentor tools to solve X" and you will see an approval pop-up!
Workflow 2: Claude CLI Integration
If you use the claude terminal tool, run:
claude mcp add cp-mentor uv --directory "/path/to/project" run app.py
claude # Start a session
Important for local models: If you are using
ollamawith the Claude CLI, make sure you launch it with a large enough model (e.g., 9B+ parameters) that supports tool calling. Small models (like 4B or 1B) will crash or fail to invoke MCP tools properly. Example:ollama launch claude --model qwen2.5:14b
Workflow 3: Cursor IDE Integration
- Open Cursor β Settings β Features β MCP
- Click + Add New MCP Server
- Set Name:
cp-mentor - Set Type:
command - Set Command:
uv --directory "/path/to/project" run app.py
Workflow 4: Full Problem-Solving Pipeline
User provides a problem (e.g., LeetCode / Codeforces)
β
βΌ
βββββββββββββββ
β Step 1 β detect_patterns(problem)
β Analyze β extract_constraints(problem)
β β identify_topics(problem)
ββββββββ¬βββββββ
β
βΌ
βββββββββββββββ
β Step 2 β suggest_algorithms(problem)
β Plan β compare_algorithms(problem, candidates)
β β choose_best_algorithm(problem, candidates)
ββββββββ¬βββββββ
β
βΌ
βββββββββββββββ
β Step 3 β generate_solution(problem, approach, language)
β Generate β generate_pseudocode(problem)
ββββββββ¬βββββββ
β
βΌ
βββββββββββββββ
β Step 4 β dry_run(problem, code)
β Verify β prove_correctness(problem)
β β analyze_complexity(problem, code)
ββββββββ¬βββββββ
β
βΌ
βββββββββββββββ
β Step 5 β generate_testcases(problem)
β Test β generate_edge_cases(problem)
β β stress_testing(problem)
ββββββββ¬βββββββ
β
βΌ
βββββββββββββββ
β Step 6 β review_solution(problem, code)
β Review β optimize_solution(problem, code)
βββββββββββββββ
π¬ How It Works (Deep Dive)
1. Request Flow
When a client invokes detect_patterns(problem="..."), the following pipeline executes:
1. FastMCP receives JSON-RPC call via stdio transport
2. Tool function in tools/analysis/detect_patterns.py is invoked
3. CacheService.get("detect_patterns", {problem: "..."}) β checks memory, then disk
4. On MISS: PromptManager renders prompts/detect_patterns.md with Jinja2
5. ProviderFactory returns OpenAIProvider or OllamaProvider
6. Provider.structured_output(prompt, PatternResponse) calls the LLM API
7. Validator checks response against PatternResponse Pydantic schema
8. On validation failure: auto-correcting retry with error feedback prompt
9. CacheService.set() stores result in both memory and disk tiers
10. Formatter wraps response with _meta (tool name, model, cache status, latency)
11. Structured JSON returned to client
2. Self-Correcting Validator
The validator implements a retry loop that feeds Pydantic validation errors back to the LLM:
# Simplified flow
for attempt in range(max_retries):
raw_json = await provider.structured_output(prompt, schema)
try:
return schema.model_validate_json(raw_json) # Success
except ValidationError as e:
prompt = f"Fix these errors: {e.errors()}\nOriginal: {raw_json}"
# Retry with corrective context
3. Two-Tier Cache
βββββββββββββββββββ
get(key) βββββββββΊβ Memory (TTL) βββββ HIT βββββΊ return value
β ~256 entries β
β ΞΌs latency β
βββββββββ¬ββββββββββ
β MISS
βββββββββΌββββββββββ
β Disk (SQLite) βββββ HIT βββββΊ promote to memory
β Persistent β + return value
β ms latency β
βββββββββ¬ββββββββββ
β MISS
βΌ
Call LLM Provider
Cache keys are deterministic: f"{tool_name}:{sha256(sorted_json(inputs))[:16]}"
4. Provider Abstraction
class BaseLLMProvider(ABC):
@abstractmethod
async def generate(self, prompt: str, system: str = "") -> str: ...
@abstractmethod
async def structured_output(self, prompt: str, response_model: type[T], system: str = "") -> T: ...
@property
@abstractmethod
def model_name(self) -> str: ...
- OpenAIProvider: Uses
client.beta.chat.completions.parse()for native JSON schema generation - OllamaProvider: Uses
openai-compatible endpoint with regex JSON extraction fallback
π§ͺ Testing
# Run all tests
$env:PYTHONPATH="." # PowerShell
uv run pytest
# Run with verbose output
uv run pytest -v
# Test specific module
uv run pytest tests/test_parser.py
uv run pytest tests/test_cache.py
uv run pytest tests/test_validator.py
Test Coverage
| Module | Tests | What's Verified |
|---|---|---|
problem_parser |
2 | Constraint regex parsing (including 2 * 10^5 notation), default handling |
cache |
2 | Memory/disk hit/miss, tier promotion, Windows file lock cleanup |
validator |
2 | Schema compliance on first try, self-correcting retry on malformed JSON |
π Tech Stack
| Component | Technology | Purpose |
|---|---|---|
| MCP Framework | fastmcp >= 2.0 |
Server SDK, tool registration, stdio transport |
| LLM Client | openai >= 1.30 |
OpenAI + Ollama-compatible API calls |
| Validation | pydantic >= 2.7 |
Typed schemas for all 23 tool outputs |
| Configuration | pydantic-settings >= 2.3 |
.env β typed config singleton |
| Templating | jinja2 >= 3.1 |
Prompt template rendering |
| Memory Cache | cachetools >= 5.3 |
In-memory TTL cache |
| Disk Cache | diskcache >= 5.6 |
SQLite-backed persistent cache |
| Retry Logic | tenacity >= 8.3 |
Exponential backoff for LLM API calls |
| Testing | pytest + pytest-asyncio |
Async-compatible test framework |
π License
This project is provided as-is for educational and competitive programming purposes.
<p align="center"> Built with π§ by <strong>sami_codeai</strong> β Turning competitive programming into composable AI tools. </p>
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.