dsa-coach-mcp
Provides access to a Codeforces user's public profile, including attempted and accepted problem counts by tag and recent submissions, and supports searching Codeforces problems by tag and rating while optionally excluding already solved problems.
Provides access to a LeetCode user's public profile, including solved and unsolved problem counts by tag and recent accepted submissions, and supports searching LeetCode problems by tag and difficulty while optionally excluding already solved problems.
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., "@dsa-coach-mcpWhat should I practice this week? I'm alice on LeetCode and bob on Codeforces."
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.
dsa-coach-mcp
An MCP server that turns your LeetCode and Codeforces history into a DSA coach inside Claude, Cursor or any MCP client: see where you stand across platforms, get problems to try next, and revise what you solved on a spaced-repetition schedule, with a mistake journal that remembers why you got things wrong and builds your next practice set around it.
You: What should I practise this week? I'm alice on LeetCode and bob on Codeforces.
Claude: (get_profile x2, search_problems)
Your graph work is thin on both sites: 1 LeetCode graph problem, and 3
Codeforces graph problems attempted but never accepted. Here are four
Medium / 1400-rated graph problems you haven't solved yet ...Why
Practice data is split across sites, and each grades difficulty its own way (LeetCode's Easy/Medium/Hard, Codeforces' 800-3500 ratings). Most trackers count problems; few tell you what you are forgetting. This server puts both platforms behind one interface and adds SM-2 revision scheduling, so the model you already talk to can coach you.
Counting solved problems hides the real signal: the same few mistakes, repeated. Every review can carry the mistakes behind it, and the model turns those patterns into practice sets and revision quizzes aimed at exactly what you keep missing.
Related MCP server: DevAssist MCP Server
Design
The server returns data, not decisions. It never hardcodes what counts as a weak topic or the next level up; the model reads your profile and the platform's own vocabulary and decides.
flowchart LR
Client["MCP client<br/>(Claude, Cursor)"] -->|tools| Server["server.py<br/>validates against<br/>platform vocabulary"]
Server --> Registry["platforms/<br/>adapter registry"]
Registry --> LC["LeetCodeAdapter<br/>GraphQL"]
Registry --> CF["CodeforcesAdapter<br/>REST"]
Server --> SRS["srs.py<br/>SM-2"] --> Store[("SQLite<br/>review cards")]Adapters translate one platform's API into shared models (
Problem,Profile,PlatformInfo). Nothing outside an adapter names a platform.Filter values come from the platforms. Tags and levels are read from each platform's API, and
search_problemsrejects anything outside them, so the model can't invent a tag.Profiles say what they can't see. Each profile carries
limitations, e.g. LeetCode only exposes your 20 most recent accepted submissions publicly.
Tools
Tool | What it does |
| Connected platforms, with the tags and levels each accepts as filters |
| Your level, solved and unsolved counts per tag, and recent submissions |
| Problems with every given tag at a given level, optionally skipping ones you solved |
| Records how well you recalled a problem (0-5) and schedules the next revision |
| Problems due for revision today or overdue |
| Every mistake label used so far, so new mistakes reuse the same words |
| Journaled mistakes, filterable by label, tag, platform or recent days |
| Mistake counts per label, broken down by tag, platform and month |
Prompts
Prompt | What it does |
| Builds the next practice set from your recurring mistakes and progress |
| Quizzes you on today's revisions using what you got wrong before |
Mistake journal
There is no fixed list of mistake types. The model labels each mistake in a few words and is shown every label used before, so it reuses yours instead of inventing new ones; your journal's vocabulary grows from your own reviews. The server only stores and counts them; spotting the pattern is the model's job.
You: Redid Course Schedule. Forgot to detect the cycle again, and used DFS recursion
that would overflow on 10^5 nodes.
Claude: (log_review with quality 2 and two mistakes, reusing your existing
"missed cycle detection" label)
That's the third time cycle detection has slipped on graph problems ...Install
Requires uv.
Claude Desktop: add to claude_desktop_config.json:
{
"mcpServers": {
"dsa-coach": {
"command": "uvx",
"args": ["--from", "git+https://github.com/aaryagodbole/dsa-coach-mcp", "dsa-coach-mcp"]
}
}
}Claude Code:
claude mcp add dsa-coach -- uvx --from git+https://github.com/aaryagodbole/dsa-coach-mcp dsa-coach-mcpCursor: same command and args as above in .cursor/mcp.json.
Configuration
Variable | Default | Purpose |
|
| Where revision cards are stored |
Privacy
No login and no API keys. The server only calls the platforms' public APIs with the handles you give it, and revision cards stay in a local SQLite file.
Adding a platform
Write
src/dsa_coach_mcp/platforms/<name>.pywith a class implementingPlatformAdapter:name,describe(),profile()andsearch().Add the class to
ADAPTERSinplatforms/__init__.py.Add tests with a mocked API, like
tests/test_codeforces.py.
The server and tools need no changes.
Development
uv sync
uv run pre-commit install
uv run pytest
uv run ruff check . && uv run ruff format --check .
uv run mypyTests never hit the network: adapters are tested against mocked API responses. See CONTRIBUTING.md.
License
Available Tools
8 toolsget_profileBRead-only
The user's standing on one platform: level, solved and unsolved counts per tag, and their most recent submissions.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| platform | Yes | ||
| recent_submissions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| handle | Yes | |
| platform | Yes | |
| solved_ids | No | |
| limitations | No | |
| submissions | No | |
| level_summary | No | |
| solved_by_tag | No | |
| unsolved_attempts_by_tag | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile and external-dependency nature are covered. The description adds useful scope information (what data categories are returned) but says nothing about failure behavior for unknown handles/platforms or responsiveness for large profiles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the resource and then lists contents in a natural reading order. Efficient with no filler, though 'standing' is slightly vague phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return shape. However, for a 3-parameter tool with zero schema coverage, the missing handle format and platform enumeration leave a real gap that a single clause about list_platforms would have closed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 3 parameters, so the description must compensate, and it only partially does: 'one platform' hints at the platform argument and 'most recent submissions' hints at recent_submissions. The handle parameter and the acceptable platform values (no enum present) remain entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a user's profile on one platform) and enumerates the returned content: level, per-tag solved/unsolved counts, and recent submissions. That distinguishes it from siblings like search_problems or list_mistakes, though it never states an explicit retrieval verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus alternatives, no mention of list_platforms as the way to discover valid platform values, and no note that both platform and handle are required inputs. The agent must infer usage entirely from the description's content list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mistakesBRead-only
Journaled mistakes, newest first, with the problem each was made on. Filter by
label, problem tag, platform, one problem (platform and problem_id), or the last
days days.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| days | No | ||
| kind | No | ||
| limit | No | ||
| platform | No | ||
| problem_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds the useful ordering trait ('newest first') and the paired-parameter constraint for single-problem lookup, but says nothing about pagination beyond the schema's limit, default result size, or how multiple filters combine.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence that front-loads the resource and ordering before enumerating filters. Nothing is padded, though the 'label' term is a wasted/ambiguous token rather than a useful one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needs no explanation, and annotations cover the safety profile. Still, with all 6 parameters undocumented and one filter name ('label') not matching the schema, the description is not complete enough for an agent to choose filter parameters confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 6 parameters, so the description must carry the load and it only partially does. It mentions tag, platform, problem_id and days but never explains 'limit', and it refers to a 'label' filter that does not match any schema property (the closest are 'tag' and 'kind'), leaving genuine ambiguity about which parameter to use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-equivalent (lists journaled mistakes) plus ordering ('newest first') and return content ('with the problem each was made on'). It does not explicitly distinguish itself from siblings like mistake_patterns or mistake_kinds, which are the tools an agent might confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description enumerates the filter axes (label, problem tag, platform, one problem via platform+problem_id, last days), which implies when the tool applies, and it clarifies that a single problem requires both platform and problem_id. However, it gives no explicit when-to-use vs. mistake_patterns/mistake_kinds guidance and no exclusions or combination rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_platformsBRead-only
Connected platforms, with the tags and levels each one accepts as filters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully adds that results include the accepted tags and levels per platform, which is behavioral context not in the annotations, but it says nothing about result size or freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the key content front-loaded; nothing is padded. It is a fragment rather than a full sentence, which slightly weakens clarity but costs no length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present to describe return values, and annotations covering the read-only/open-world profile, the description needs only to say what is listed and why. It does that, though the missing usage cue leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so by baseline this scores 4. The description correctly implies no input is needed to enumerate platforms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The resource is clearly identified ('connected platforms') and the description adds what each entry carries (tags and levels usable as filters), which distinguishes it from all siblings. However, it is a noun phrase with no verb, so the agent must infer that this is a listing/retrieval operation rather than, say, a capability probe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives, and no prerequisites. The phrase 'accepts as filters' hints the output is meant to bootstrap other filter-based calls, but that routing advice is never made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_reviewA
Record how well the user recalled a problem (0 = could not, 5 = instantly), schedule the next revision, and journal any mistakes made on the way.
Pass the problem's tags from search_problems or get_profile. Give each mistake a
short kind, reusing an existing one from mistake_kinds when it fits, and a note
on what went wrong in the user's own words.| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| tags | No | ||
| title | Yes | ||
| quality | Yes | ||
| mistakes | No | ||
| platform | Yes | ||
| problem_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| due | Yes | |
| url | Yes | |
| ease | Yes | |
| title | Yes | |
| platform | Yes | |
| problem_id | Yes | |
| repetitions | Yes | |
| interval_days | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=false and idempotentHint=false, the mutating nature is known, but the description adds valuable context: it explains that a review schedules the next revision and journals mistakes, and defines the 0–5 quality scale. It does not discuss what happens on duplicate calls or auth requirements, leaving a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three well-structured sentences, front-loading the main action and quality scale before parameter guidance. It is appropriately sized with little waste, though some sentences pack multiple instructions that could be slightly clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (7 parameters, 5 required) and an output schema exists, so return values needn't be explained. However, the description omits meaningful guidance on required fields like platform, problem_id, title, and url, which an agent needs to populate correctly. It covers the core action and a few parameters but is not fully complete for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It meaningfully explains quality (0–5 scale with anchor values), tags (source from search_problems/get_profile), and mistakes (kind and note, reuse from mistake_kinds), but leaves platform, problem_id, title, and url completely undocumented. Partial compensation is present but incomplete for 7 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs and resources: 'Record how well the user recalled a problem', 'schedule the next revision', and 'journal any mistakes'. This clearly distinguishes it from siblings like search_problems or revisions_due, and an agent can understand its distinct role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly advises passing tags from search_problems or get_profile and reusing mistake kinds from mistake_kinds, giving clear sourcing guidance. It implies the context (after a review session) but does not state when not to use it or name a direct alternative, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mistake_kindsARead-only
Every mistake label used so far, most frequent first. Reuse these labels when logging new mistakes so the same kind of mistake is counted together.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds non-obvious behavioral context: the output is an aggregate over all past entries and is sorted by frequency, which matters for interpretation. No return-format detail, but an output schema exists to carry that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the observable behavior leads and the usage rationale follows. Nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero params, read-only annotations, and an output schema defining the return shape, the description covers what an agent needs to decide and call. Only the sibling routing is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is no parameter semantics to explain — baseline applies. The description correctly avoids inventing inputs and frames the tool as a no-argument enumeration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (mistake labels used so far) and its ordering (most frequent first), which an agent can distinguish from list_mistakes (records) and mistake_patterns (analysis). However, it never names those siblings, so differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage context — call this before logging a new mistake to reuse existing labels for consistent aggregation. It lacks explicit when-not-to-use or named alternatives, but the intended workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mistake_patternsBRead-only
Mistake counts per label, broken down by problem tag, platform and month. Counts only; reading what they say about the user is up to you.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kinds | Yes | |
| by_tag | Yes | |
| by_month | Yes | |
| by_platform | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real value by stating the output is aggregate counts with no interpretation supplied, which sets expectations about the return shape. It says nothing about coverage windows, defaults, or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the aggregation shape and grouping keys. The second sentence is informal but does carry information about the absence of built-in interpretation, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return formatting need not be explained. However, for a tool whose only knob is a time window, leaving `days` (and what null means) undefined is a meaningful gap that the description should close.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter `days` is never mentioned in the description at all, even though its null default leaves the time window ambiguous. The 'broken down by ... month' note gestures at time grouping but does not explain the lookback filter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (mistake counts) and the exact grouping dimensions (label, problem tag, platform, month), which tells an agent this is an aggregation tool rather than a record lister. It implicitly contrasts with list_mistakes by being counts-only, but never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this versus list_mistakes, mistake_kinds, or search_problems. The closing phrase ('reading what they say about the user is up to you') hints the tool is for pattern analysis rather than retrieval, but an agent gets no routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revisions_dueBRead-only
Problems due for revision today or overdue, oldest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful ordering ('oldest first') and the due/overdue scope, but says nothing about how many items come back, timezone of 'today', or tie-breaking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler; the scope constraint and ordering both land immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, and the read-only nature is covered by annotations. However, for a due-queue tool the agent still lacks result-count expectations and the definition of 'today', which are material to correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'limit' parameter has 0% schema description coverage — only default 10 and bounds 1–100 are machine-readable. The description never mentions trimming result size or any cap/pagination semantics, so it fails to compensate for the undocumented meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise resource and filter — problems due for revision today or overdue — plus ordering ('oldest first'), which is enough to separate it from search_problems or list_mistakes. It falls short of a 5 only because no explicit comparison to those siblings is made.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of when to prefer search_problems instead, and no note that log_review is the natural follow-up after acting on these results. The revision-workflow context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_problemsARead-only
Problems having every tag given, at the level given. Tags and levels must be values from list_platforms. With exclude_solved_by, skips that handle's solved problems.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| level | No | ||
| limit | No | ||
| platform | Yes | ||
| exclude_solved_by | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral semantics beyond that — AND-across-tags matching and the skip-solved exclusion behavior — but says nothing about result ordering or how the single required platform scopes the search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, zero filler, with the core filtering semantics front-loaded before the list_platforms dependency and the exclusion behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover read-only safety, so the remaining burden is small. However, the required 'platform' argument and the pagination limit are unaddressed anywhere, which leaves a gap for a tool an agent must call with a mandatory parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must carry the load. It explains tags (conjunctive), level, and partially exclude_solved_by (skips that handle's solved problems), but is silent on the required 'platform' parameter and on limit behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource and filter semantics precisely: problems matching ALL given tags at a given level, with an explicit 'every tag' AND-constraint that the name alone doesn't convey. It lacks an explicit verb (search/list) and doesn't name any sibling, so it clarifies the operation without differentiating it from mistake-focused tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a prerequisite-style rule (tags and levels must be values from list_platforms), which usefully routes the agent to another tool first. It states the exclude_solved_by behavior but offers no guidance on when to prefer this over list_mistakes or mistake_patterns, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
get_profile - First observed
list_mistakes - First observed
list_platforms - First observed
log_review - First observed
mistake_kinds - First observed
mistake_patterns - First observed
revisions_due - First observed
search_problems
TDQS
Scored across 8 tools
Each tool maps to a distinct action: platform metadata, profile lookup, problem search, review logging, due revisions, mistake labels, mistake journaling, and mistake analytics. The closest overlap is between mistake_kinds (label vocabulary) and mistake_patterns (aggregated counts), but the descriptions make the boundary clear enough.
The tools are all snake_case and readable, but they mix verb-first names (list_platforms, get_profile, search_problems, log_review) with noun-phrase names (revisions_due, mistake_kinds, mistake_patterns). The inconsistency is noticeable but not chaotic.
Eight tools is a well-scoped set for a DSA coaching workflow, covering discovery, review scheduling, and mistake tracking without obvious filler. Each tool appears to earn its place.
The surface covers the main coaching loop: inspect platforms and profiles, find problems, log reviews, see due revisions, and analyze mistakes. Minor gaps exist around explicitly updating solved status or managing platform connections, but core workflows are supported.
Maintenance
Related MCP Connectors
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
One memory for all your AI tools: Claude, ChatGPT, Cursor and any MCP client share the same notes.
Related MCP Servers
- 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
- AlicenseNot gradedqualityCmaintenanceA production-ready MCP server for GitHub and competitive programming (Codeforces) that enables AI assistants to fetch user profiles, repository stats, contest history, and personalized problem recommendations.MIT
- AlicenseNot gradedqualityDmaintenanceThis is an MCP server for tracking your progress through DSA questions with spaced repetition, built-in NeetCode 150 list, and tools to log attempts, get next problems, and view stats.31 PyPI1MIT
- FlicenseNot gradedqualityBmaintenanceAn MCP server that acts as a personalized interview prep coach, tracking DSA problems, scheduling spaced-repetition revisions, and providing RAG-based concept explanations grounded in your own notes.-