关于 dsa-coach-mcp
dsa-coach-mcp 是面向 LeetCode 和 Codeforces 刷题者的 MCP 服务,汇总平台资料,并结合 FSRS 复习安排与错误日志,依据历史记录生成练习和测验。
主要功能
- 01LeetCode 与 Codeforces 个人资料
- 02按标签和难度搜索题目
- 03FSRS 间隔复习安排
- 04错误日志与模式统计
- 05练习计划和复习测验
- 06MCP Apps 进度仪表板
适用场景
- 01查看各标签下已解与未解题数
- 02根据记忆概率安排复习
- 03复习题目时记录反复出现的错误
- 04依据错误和进度制定练习集
MCP 相关
提供个人资料、题目搜索、复习记录、复习安排、错误分析和练习规划等工具与提示词。仪表板以 MCP App 形式供兼容客户端展示。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
dsa-coach-mcp
一个 MCP 服务,可将你的 LeetCode 和 Codeforces 历史记录转化为 Claude、Cursor 或任何 MCP 客户端中的 DSA 教练: 了解你在不同平台上的水平,获取下一步尝试的题目,并按照间隔重复计划复习已解题目;它还配有错误日志,记录你答错的原因,并据此制定下一组练习题。
这是一个真实会话,由 examples/demo.py 录制:它通过 stdio 启动服务,并使用实时数据调用其工具。
为什么需要
练习数据分散在各个网站上,而且每个平台对难度的划分方式各不相同 (LeetCode 的 Easy/Medium/Hard、Codeforces 的 800-3500 评分)。大多数追踪工具只统计题目数量;很少有工具能告诉你正在遗忘什么。此服务将两个平台整合到一个接口中,并使用 FSRS 安排复习,让你已在交流的模型为你提供指导。
FSRS 会预测你仍记得每道题目的概率,并在该概率降到 90% 以下之前重新安排这道题。在公开的
间隔重复基准测试中,对约 10k 个 Anki 集合进行测试后发现,FSRS 对大多数用户的记忆情况预测都比 SM-2 更准确。积累了复习历史后,personalize_schedule 会根据你的遗忘速度拟合参数。
已解题目数量掩盖了真正的信号:反复出现的同几种错误。每次复习都可以记录相关错误,模型会将这些模式转化为练习题集和复习测验,专门针对你反复出错的地方。
设计
服务返回的是数据,而非决策。它不会硬编码哪些主题算薄弱,也不会硬编码下一阶段的水平;模型会读取你的个人资料和平台自身的分类,并据此做出判断。
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["scheduling.py<br/>FSRS"] --> Store[("SQLite<br/>cards, reviews,<br/>mistakes")]
- 适配器将各个平台的 API 转换为共享模型(
Problem、Profile、PlatformInfo)。适配器之外的任何代码都不会提及特定平台。 - **数据来自平台。**标签和等级从各个平台的 API 中读取;复习时使用的问题标题、链接和标签也取自平台,而非模型,因此不会虚构历史记录。各个平台自己的标签列表并不完整,因此
search_problems支持查询列表之外的标签;只有在没有匹配结果时才会报告该标签。 - **个人资料会说明自身无法获取的信息。**每份个人资料都包含
limitations,例如 LeetCode 只公开你最近 20 次已通过的提交记录。
工具
| 工具 | 功能 |
|---|---|
list_platforms | 已连接的平台,以及每个平台接受的筛选标签和难度级别 |
get_profile | 你的难度级别、各标签下已解决和未解决的问题数量,以及最近的提交 |
search_problems | 查找指定难度级别下带有所有给定标签的问题;可选择跳过已解决的问题 |
log_review | 记录你的答题情况(again / hard / good / easy)、记录背后的错误,并使用 FSRS 安排下一次复习。标题、链接和标签取自平台 |
revisions_due | 当前待复习的问题,按最不可能记住的顺序排列,并显示每个问题的 FSRS 记忆估计值 |
schedule_info | 当前使用的 FSRS 参数、参数是否经过个性化调整,以及已记录的复习次数 |
personalize_schedule | 根据你自己的复习记录拟合 FSRS(需要 dsa-coach-mcp[optimizer]) |
record_problem | 记录来自其他平台(HackerRank、GeeksforGeeks、CodeChef、AtCoder 等)的问题,数据取自其页面 |
progress | 按平台显示:已复习的问题数、已记录的复习次数,以及当前待复习的问题数 |
show_dashboard | 进度、按遗忘风险排列的待复习内容,以及错误热力图;在支持 MCP Apps 的宿主中以交互视图呈现 |
mistake_kinds | 迄今使用过的所有错误标签,方便新错误沿用相同的表述 |
list_mistakes | 已记录的错误,可按标签、主题、平台或最近天数筛选 |
mistake_patterns | 各标签的错误数量,并按主题、平台和月份细分 |
提示词
| 提示词 | 功能 |
|---|---|
practice_plan | 根据反复出现的错误和进度制定下一组练习 |
revision_quiz | 根据你之前答错的内容,测验你今天的待复习内容 |
仪表板
show_dashboard 是一个 MCP App:支持此类应用的宿主(Claude、Claude Desktop、VS Code Copilot、Goose 等)会在对话中呈现它;其他宿主则会从工具结果中获取相同的数据。该视图是一个独立的 HTML 文件,不包含外部脚本,会遵循宿主的浅色或深色主题,并通过 MCP Apps postMessage 协议与宿主通信。
由 examples/dashboard_host.py 根据示例数据渲染,该脚本模拟协议中的宿主端。
任意平台
LeetCode 和 Codeforces 提供了从其 API 读取数据的适配器。其他所有平台都通过你当前查看的页面运行:将此服务与浏览器 MCP 服务(例如处于扩展模式的 Playwright MCP)配对,即可让模型读取你自己浏览器中已登录的标签页。模型读取题目页面后,会调用 record_problem 并提供其 URL、标题、标签和难度;之后,该题就会像其他问题一样被复习、安排并记录。
{
"mcpServers": {
"dsa-coach": { "command": "uvx", "args": ["dsa-coach-mcp"] },
"playwright": { "command": "npx", "args": ["@playwright/mcp@latest", "--extension"] }
}
}
代码中不会列出平台:平台就是问题 URL 的主机,问题 ID 则是 URL 的路径。通过这种方式记录的问题会标记为 "source": "reported",因为它们来自模型读取的页面,而非平台 API;如果某个主机有适配器,则始终会将其交给该适配器处理。
错误记录
错误类型没有固定列表。模型会用几个词为每个错误添加标签,并且会看到之前使用过的所有标签,因此会沿用你的标签,而不是另造新词;错误记录中的词汇会随着你自己的复习不断丰富。服务只负责存储和计数;发现其中规律则由模型负责。
You: Redid Course Schedule. Forgot to detect the cycle again, and used DFS recursion
that would overflow on 10^5 nodes.
Claude: (log_review rated "hard" with two mistakes, reusing your existing
"missed cycle detection" label)
That's the third time cycle detection has slipped on graph problems ...
安装
需要 uv。
Claude Desktop:添加到 claude_desktop_config.json:
{
"mcpServers": {
"dsa-coach": {
"command": "uvx",
"args": ["dsa-coach-mcp"]
}
}
}
Claude Code:
claude mcp add dsa-coach -- uvx dsa-coach-mcp
Cursor:在 .cursor/mcp.json 中使用与上文相同的 command 和 args。
Agent 技能
skills/dsa-coach/SKILL.md 会告诉 Agent 何时使用这些工具以及如何用好它们:如何评价一次复盘、如何复用已有的错误标签,以及如何只根据自己读过的页面记录其他平台上的题目。对于 Claude Code,将其复制到你的技能目录:
mkdir -p ~/.claude/skills/dsa-coach
curl -fsSL https://raw.githubusercontent.com/aaryagodbole/dsa-coach-mcp/main/skills/dsa-coach/SKILL.md \
-o ~/.claude/skills/dsa-coach/SKILL.md
配置
| 变量 | 默认值 | 用途 |
|---|---|---|
DSA_COACH_DB | ~/.dsa-coach/coach.db | 卡片、复盘和错误的存储位置 |
若要自定义计划,请安装优化器扩展(它会引入 PyTorch):
uvx --from 'dsa-coach-mcp[optimizer]' dsa-coach-mcp。
隐私
无需登录或 API 密钥。服务仅使用你提供的用户名调用各平台的公开 API,复习卡片则保存在本地 SQLite 文件中。
添加平台
- 编写
src/dsa_coach_mcp/platforms/<name>.py,其中包含一个实现PlatformAdapter的类:name、describe()、profile()和search()。 - 将该类添加到
platforms/__init__.py中的ADAPTERS。 - 添加使用模拟 API 的测试,例如
tests/test_codeforces.py。
服务和工具无需更改。
评测
单元测试检查代码;evals/ 检查模型能否实际使用这些工具进行辅导。模型通过 MCP 协议驱动真实服务,在一个固定环境中(一个练习平台、一份预置历史记录、一只固定时钟)执行任务,例如根据个人资料制定计划、记录包含错误的复盘、复用已有错误标签、记录其他平台上的题目,以及在不需要工具时保持沉默。
评分是确定性的,不使用 LLM 评审:每项任务都会列出预期的工具调用及其参数谓词、禁止调用的工具,以及调用次数上限。一次运行会报告通过率、工具选择准确率、参数准确率、工具错误率、每项任务的调用次数和令牌用量。
模型通过配置指定,而非写入代码。任何支持 chat completions 格式的 API 均可使用,无论是托管的免费套餐、付费 API,还是在你自己的机器上运行的模型:
EVALS_BASE_URL=<api base url> EVALS_MODEL=<model> EVALS_API_KEY=<key, if needed> \
uv run python -m evals.run
该循环通过一个小型 AgentBackend 接口与模型通信
(evals/backends/base.py);采用不同通信格式的 API 只需增加一个后端模块。运行不会自行启动:可在本地运行,或在设置好仓库变量 EVALS_BASE_URL 和 EVALS_MODEL(如果你的 API 需要密钥,还需设置 EVALS_API_KEY 密钥)后,从 Actions 选项卡启动 Agent evals 工作流。评分器、固定环境、循环和后端都已在 CI 中通过单元测试,无需调用任何模型。
开发
uv sync
uv run pre-commit install
uv run pytest
uv run ruff check . && uv run ruff format --check .
uv run mypy
使用实时数据重新录制本页顶部的演示:
uv run python examples/demo.py --leetcode <username> --codeforces <handle>
测试不会访问网络:适配器使用模拟 API 响应进行测试。请参阅 CONTRIBUTING.md。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。