mcpField
D
dsa-coach-mcp

dsa-coach-mcp

本地服务
github.com/aaryagodbole科研与教育0今天更新

关于 dsa-coach-mcp

dsa-coach-mcp 是面向 LeetCode 和 Codeforces 刷题者的 MCP 服务,汇总平台资料,并结合 FSRS 复习安排与错误日志,依据历史记录生成练习和测验。

主要功能

  1. 01LeetCode 与 Codeforces 个人资料
  2. 02按标签和难度搜索题目
  3. 03FSRS 间隔复习安排
  4. 04错误日志与模式统计
  5. 05练习计划和复习测验
  6. 06MCP Apps 进度仪表板

适用场景

  1. 01查看各标签下已解与未解题数
  2. 02根据记忆概率安排复习
  3. 03复习题目时记录反复出现的错误
  4. 04依据错误和进度制定练习集

MCP 相关

提供个人资料、题目搜索、复习记录、复习安排、错误分析和练习规划等工具与提示词。仪表板以 MCP App 形式供兼容客户端展示。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"aaryagodbole-dsa-coach": {
"command": "uvx",
"args": [
"dsa-coach-mcp"
]
}
}
}
启动命令uvx dsa-coach-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypidsa-coach-mcp0.3.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

dsa-coach-mcp

CI PyPI Python 3.12+ License: MIT

一个 MCP 服务,可将你的 LeetCode 和 Codeforces 历史记录转化为 Claude、Cursor 或任何 MCP 客户端中的 DSA 教练: 了解你在不同平台上的水平,获取下一步尝试的题目,并按照间隔重复计划复习已解题目;它还配有错误日志,记录你答错的原因,并据此制定下一组练习题。

dsa-coach-mcp 通过 stdio 使用实时 LeetCode 和 Codeforces 数据运行

这是一个真实会话,由 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 协议与宿主通信。

dsa-coach 仪表板,深色主题 dsa-coach 仪表板,浅色主题

由 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 文件中。

添加平台

  1. 编写 src/dsa_coach_mcp/platforms/<name>.py,其中包含一个实现 PlatformAdapter 的类:name、describe()、 profile() 和 search()。
  2. 将该类添加到 platforms/__init__.py 中的 ADAPTERS。
  3. 添加使用模拟 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。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。