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
LeetCodeと Codeforcesの履歴を、Claude、Cursor、または任意のMCPクライアント内でDSAコーチに変えるMCPサーバーです。 複数のプラットフォームでの実力を確認し、次に挑戦する問題を受け取り、間隔反復スケジュールに沿って解いた問題を復習できます。さらに、間違えた理由を記録し、その内容をもとに次の練習セットを作成するミスジャーナルも備えています。
examples/demo.pyで記録した実際のセッションです。stdio経由でサーバーを起動し、実データを使ってツールを呼び出します。
その理由
練習データはサイトごとに分かれており、難易度の評価方法もそれぞれ異なります (LeetCodeのEasy/Medium/Hard、Codeforcesの800~3500のレーティング)。ほとんどのトラッカーは問題数を数えますが、何を忘れつつあるかを教えてくれるものはほとんどありません。このサーバーは両方のプラットフォームを一つのインターフェースで利用できるようにし、 FSRSで復習をスケジュールするため、普段使っているモデルがあなたをコーチできます。
FSRSは、各問題をまだ覚えている可能性を予測し、その可能性が90%を下回る直前に再び提示します。約1万件の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件のAccepted投稿しか確認できません。
ツール
| ツール | 機能 |
|---|---|
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からデータを読み取るアダプターがあります。それ以外のプラットフォームでは、
表示中のページを使います。このサーバーを、拡張機能モードのPlaywright MCP
などのブラウザーMCPサーバーと組み合わせると、ログイン済みのあなた自身のブラウザーで開いているタブを
モデルが読み取れるようになります。モデルは問題ページを読み取り、そのURL、タイトル、タグ、難易度を
指定してrecord_problemを呼び出します。その後は、ほかの問題と同様に復習、スケジュール設定、
記録が行われます。
{
"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:上記と同じ command と args を .cursor/mcp.json に追加します。
エージェントスキル
skills/dsa-coach/SKILL.md では、エージェントがこれらのツールを使うタイミングや、効果的な使い方を説明しています。レビューの評価方法、既存のミスラベルの再利用方法、ほかのプラットフォームの問題は実際に読んだページからのみ記録する方法などが記載されています。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に追加します。 tests/test_codeforces.pyのように、モック API を使ったテストを追加します。
サーバーとツールを変更する必要はありません。
評価
単体テストではコードを検証し、evals/ ではモデルがこれらのツールを使って実際にコーチングできるかを検証します。モデルは、フィクスチャーの環境(1 つの練習プラットフォーム、初期データを投入した履歴、固定された時刻)を対象に、MCP プロトコル経由で実際のサーバーを操作します。プロフィールに基づく計画の作成、ミスを含めたレビューの記録、既存のミスラベルの再利用、別のプラットフォームの問題の記録、ツールが不要な場合に応答しないことなどのタスクを実行します。
採点は決定論的で、LLM の評価者は使いません。各タスクには、引数に対する述語付きで期待されるツール呼び出し、使用してはならないツール、呼び出し回数の上限が定義されています。実行結果には、合格率、ツール選択の精度、引数の精度、ツールのエラー率、タスクあたりの呼び出し回数、トークン使用量が表示されます。
モデルはコードではなく設定で指定します。ホスト型の無料プラン、有料 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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。