Skip to main content
Glama

旦挞 MCP · DanTa MCP

English | 中文

AI が復旦樹洞旦克課程評価を自動検索できるようにする MCP サーバー。学外からでも利用可能。

樹洞は復旦大学の学生の匿名コミュニティ——生活、恋愛、就職、心理、専攻変更、中古取引、何でも話し合われている。 このツールは、AI がこうした実際の経験を検索し、読み込み、要約するのを手助けする。自分でページをめくる必要はない。

你:帮我查一下高等微积分Ⅰ这门课怎么样

AI:(自动调用 search_courses → get_course_reviews)
    找到「高等微积分Ⅰ」(MATH20021),相辉学堂,5 学分,3 条评价。
    教师严金海 + 王嬴(习题课)
    综合评分 ★★★★★ / ★★★★☆
    - 给分:两位评价者最终都拿了 A,但都提到"课下要花很多时间"
    - 严老师:PPT 有用、往年卷会分享、题型固定不偏;但上课爱扯题外话
    - 王嬴老师:口碑极好,答疑响应快,改作业细致
    - 难度:期中偏难,秋季学期后考试强度有下降

目次


Related MCP server: juejin-mcp-server

できること

設定が完了したら、自然言語で直接質問するだけで、AI が自動的にツールを呼び出す:

シナリオ

そのまま言う

🍜 生活

「どの食堂が美味しい?」「寮のエアコンの修理方法は?」「大学病院は頼りになる?」

💔 恋愛

「樹洞では遠距離恋愛をどう処理してる?」「キャンパス恋愛をどう見てる?」

💼 就職

「最近インターンの推薦はある?」「情報学部の就職前景はどう?」

🧠 心理

「みんな新学期の不安にどう対処してる?」「大学の心理カウンセリングは予約しやすい?」

🔄 学業

「専攻変更は難しい?先輩の話は?」「大学院推薦の経験は?」

👥 交流

「どうやって仲間を見つける?」「サークルに入る価値はある?」

💰 取引

「中古電動自転車の相場は?」「ルームシェア情報は?」

📚 履修

「高等微積分Ⅰは取る価値がある?」「この3つの教養科目を比較して」

データソース:復旦樹洞(リアルタイム匿名討論、23000+ トピックタグ)+ 旦克課程評価庫(構造化スコア + 学生の長文レビュー)。


クイックスタート

前提条件

  • Python 3.10+

  • 復旦 UIS アカウント(学籍番号 + パスワード)

  • 旦挞/樹洞アカウント(メール + パスワード、旦挞 App で登録)

  • MCP 対応クライアント(Hermes / Claude Desktop / Cline など)

1. インストール

git clone <你的仓库地址> danta-mcp
cd danta-mcp

# Windows
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt

# macOS / Linux
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt

2. 認証情報の設定

# Windows
.venv\Scripts\python setup_credentials.py

# macOS / Linux
.venv/bin/python setup_credentials.py

2組のアカウントを順に尋ねられる(パスワード入力時は非表示):

— 复旦 UIS 统一身份认证(学号 + 密码)
  用户名: 20307130001
  密码(不回显):
  ✅ 已保存

— 旦挞/树洞账号(邮箱 + 密码)
  用户名: 20307130001@m.fudan.edu.cn
  密码(不回显):
  ✅ 已保存

保存場所:

  • Windows → 資格情報マネージャー(DPAPI 暗号化、Windows アカウントにバインド)

  • macOS/Linux → システムキーチェーン(pip install keyring が必要)

  • 任意のプラットフォーム → 環境変数 DANTA_UIS_USER / DANTA_UIS_PASS / DANTA_HOLE_USER / DANTA_HOLE_PASS も使用可能

検証:

.venv/Scripts/python setup_credentials.py --check

3. セルフチェック

.venv/Scripts/python -E verify_mcp.py

次のように表示されるはず:

✅ handshake OK — 10 tools registered:
   • search_courses
   ...
✅ 连接正常
  WebVPN: 已建立会话
  用户 ID: 51359
✅ all checks passed

4. MCP クライアントへの接続

クライアント設定に追加する(-E パラメータは必須。詳細はトラブルシューティングを参照):

{
  "mcpServers": {
    "danta": {
      "command": "/绝对路径/danta-mcp/.venv/Scripts/python.exe",
      "args": ["-E", "/绝对路径/danta-mcp/run_server.py"],
      "cwd": "/绝对路径/danta-mcp"
    }
  }
}

Hermes ユーザーは config.yamlmcp_servers: の下に記述(YAML 形式、フィールドは上記と同じ)。

クライアントを再起動すれば完了。


ツール説明

樹洞検索(汎用、どんなトピックでも検索可能)

search_holes(keyword, limit=15, accurate=False, within_days=0)

サイト全体で樹洞の内容を検索する。最もよく使うツール。

search_holes("食堂")                      # 模糊搜索
search_holes("转专业", accurate=True)      # 精确匹配,关键词必须完整出现
search_holes("实习", within_days=14)       # 只看最近两周
  • accurate=True — 完全一致検索。固有名詞、課程コード、人名に適している

  • within_days=N — 直近 N 日のみ表示。時事性のある内容(インターン募集、最新ポリシー)の検索に適している

get_hole(hole_id, limit=40)

特定の樹洞の全フロアを読む。

樹洞の価値は返信にあることが多い —— 投稿者が質問し、閲覧者が経験を共有する。興味のある洞を見つけたら必ず全文を読むこと。

browse_by_tag(tag, limit=15)

トピックタグで最新の樹洞を閲覧する。キーワード検索よりも「ブラウジング」に適している。

よく使われるタグ:質問 助けを求める 生活 学習 恋愛 感情 愚痴 emo 交流 履修 専攻変更 大学院推薦 期末試験 成績発表 中古取引 仲間探し 軍事訓練 家庭教師

list_hot_tags(limit=40, keyword="")

最も人気のあるトピックタグを一覧表示(人気順)、フィルタリング可能。

list_hot_tags()                  # 看树洞上大家都在聊什么
list_hot_tags(keyword="实习")     # 找所有和实习相关的标签

樹洞には 23000+ のタグがあり、人気上位:質問(18万) 助けを求める氵(9.5万) 生活(7.4万) 学習(6万) 恋愛(3.7万) 愚痴(2.3万) emo(1.8万)。

browse_division(division_id, limit=15) / list_divisions()

板ごとに閲覧:

ID

説明

1

茶楼

メインボード、何でも話し合う——日常の第一候補

2

円卓

深い議論

3

評教

課程/教師評価

4

站務

フォーラム管理

5

取引

中古/ルームシェア/代理購入

課程評価(旦克)

search_courses(keyword, limit=10)

課程を検索する。keyword は課程名、課程コード、キーワードのいずれか。

search_courses("微积分")
→ [1136] 微积分(上)(MATH120012) 基础医学院 | 评价数: 0
  [8911] 高等微积分Ⅰ (MATH20021) 相辉学堂 | 评价数: 3

まず評価数を確認すること。0 の課程は参考価値がない。

get_course_reviews(course_group_id, max_reviews=12)

特定の課程の完全な評価を表示。「教師 + 学期」ごとにグループ化。

返される内容:

  • 4次元スコア:総合 / 内容 / 作業量 / 評価方法(1〜5 星)

  • remark おすすめ指数、いいね数

  • 評価本文(通常、成績分布、試験の難易度、課題量、TA の状況を含む)

樹洞

search_holes(keyword, limit=15)

サイト全体で樹洞の内容を検索する。教師の評判、履修経験、実際の愚痴を探すのに適している。

get_hole(hole_id, limit=40)

特定の樹洞の全フロアを読む。

list_divisions() / browse_division(division_id, limit=15)

板の閲覧。板 ID:

ID

説明

1

茶楼

メインフォーラム

2

円卓

自由に発言

3

評教

履修シーズンはここを重点的に

4

站務

フォーラム管理

5

取引

非商業広告

トラブルシューティング

build_citation_report(title, queries, summary_markdown="", per_query=6)

検索結果から完全な出典付きの HTML 引用レポートを生成し、デスクトップに保存。ブラウザで開くだけ。

各引用には、洞番号(クリックで遡れる)、フロア、匿名ニックネーム、時間、いいね数、原文そのままが保持される。 結論を人手で確認する必要があるシナリオに適している —— AI が過度に解釈していないか、項目ごとに確認できる。

build_citation_report(
  title="复旦留学生宿舍 · 快递地址怎么填",
  queries="北区驿站::北区 菜鸟驿站|顺丰京东::顺丰 京东 本部|hole:692300::地址怎么写",
  summary_markdown="<p>结论写在这里</p>"
)

queries| で複数のソースグループを区切り、各グループの形式は セクションタイトル::キーワードhole:洞番号 もサポートされ、樹洞全体の全フロアを直接引用する。

レポートの特徴:レスポンシブレイアウト、ダークモード自動適応、コンテンツはすべて HTML エスケープ(インジェクション防止)。

check_connection()

WebVPN セッション、token、アカウント状態を確認する。問題が発生したら最初にこれを実行する。


動作原理

なぜこのレイヤーが必要なのか

復旦樹洞の API はすべて学内にデプロイされている:

forum.fduhole.com → 10.107.13.152   ← 校内私有地址
auth.fduhole.com  → 10.107.13.152
danke.fduhole.com → 10.107.13.152

学外からは物理的に直接接続できない。このプロジェクトは旦挞公式クライアントの WebVPN 方式を再現している。

完全なチェーン

1. 读取凭据(系统钥匙串 / 环境变量)
        ↓
2. UIS 登录 id.fudan.edu.cn
   getJsPublicKey → RSA-PKCS1 加密密码 → authExecute → loginToken
        ↓
3. authnEngine → CAS ticket (ST-xxxxx)
        ↓
4. 兑换 ticket → 拿到 WebVPN 会话 cookie
        ↓
5. API 域名 AES-CFB 加密改写
   https://auth.fduhole.com/api/login
   → https://webvpn.fudan.edu.cn/https/7772647670...c38/api/login
        ↓
6. 树洞账号换 JWT → 之后所有请求带 Bearer

ステップ 5 の暗号化:AES-CFB、key = iv = wrdvpnisthebest!、ホスト名は文字数(バイト数ではない)で 16 の倍数に揃え、出力は iv_hex + 暗号文hex[:2n]

セルフチェックのヒント:auth.fduhole.com の暗号化結果は常に 77726476706e69737468656265737421f1e2559469366c45760785a9d6562c38、 先頭 32 桁はまさに wrdvpnisthebest! の hex。一致しない場合は実装に問題がある。

キャッシュ

セッションと token は ~/.danta-mcp/ にキャッシュされる:

  • cookies.json — WebVPN セッション、6 時間で期限切れとみなす

  • token.json — 樹洞 JWT、20 日

通常の使用では繰り返しログインすることはない

学内直接接続

キャンパスネットワーク / eduroam に接続すれば直接接続可能。WebVPN レイヤーは自動的に透過的なフォールバックとなり、コードの変更は不要。


セキュリティ設計

パスワードは平文で保存しない

システムレベルの資格情報ストアに保存され、コードはコピーを読み書きしない。リポジトリにも資格情報は存在しない(.gitignore を参照)。

UIS ログインは1回のみ試行、失敗したら停止

これが最も重要な設計。

復旦 UIS は連続ログイン失敗で CAPTCHA をトリガーする。一度トリガーされると、手動でブラウザを開いてログインする必要がある。そのため:

# authExecute 明确 tries=1,绝不重试
r = self._req("POST", ".../authExecute", tries=1, json={...})

message に「验证码」が含まれることを検出したら即座にエラーを投げ、手動ログインを促す。自動リトライは行わない。

ネットワーク層のリトライ(tries=3)は WebVPN の不安定な接続にのみ作用し、ログイン試行には作用しない。

キャッシュファイルの権限

~/.danta-mcp/ 配下のファイル権限は 600(所有者のみ読み書き可能)。

読み取り専用

このプロジェクトは読み取りツールのみを提供し、投稿、返信、投票などの書き込み操作は提供しない。AI があなたの代わりに樹洞で発言することはない。


トラブルシューティング

No module named 'mcp.server.fastmcp'

MCP SDK 2.x は FastMCPMCPServer に改名した。server.py は両バージョンに対応済み。それでもエラーが出る場合は、venv が外部の PYTHONPATH に汚染されている → 次の項目を参照。

ツールがクライアントに表示されない / サーバーが起動直後に終了する

9割は PYTHONPATH の汚染。 一部の MCP ホストは自身の site-packages を子プロセス環境に注入し、このプロジェクトの venv 内のパッケージを上書きする。

解決策:設定で -E(起動時に環境変数を無視)を使用する必要がある:

"args": ["-E", "/path/to/run_server.py"]

⚠️ コード内で sys.path を変更しても効果はない —— sys.path はインタープリタ起動時に PYTHONPATH によって決定される。

❌ UIS が CAPTCHA をトリガーした

ブラウザで https://id.fudan.edu.cn を開き、手動で1回ログインすれば解除される。

繰り返しリトライしないこと。ロックが強化される。

login returned non-JSON

WebVPN セッションの期限切れで、ログインページにリダイレクトされた。コードは自動的にセッションを再構築して1回リトライする。それでも失敗する場合:

rm -rf ~/.danta-mcp   # 清缓存重新登录

IDP did not return a login context

WebVPN が不安定(ルートパス / が頻繁にタイムアウトする)。少し待ってリトライすればよい。

UIS パスワードを変更した後

.venv/Scripts/python setup_credentials.py

再入力すれば完了。


既知の制限

  • 復旦認証システムの現在の実装に依存。大学が認証プロセスをアップグレードすると機能しなくなる可能性があり、DanXi 上流 の変更を追跡する必要がある。

  • 二要素認証(2FA)には非対応。アカウントで拡張認証が有効な場合、EnhancedAuthenticationRequiredException がスローされる。

  • WebVPN 自体が不安定で、タイムアウトは日常的。コードにリトライを追加しているが完全には排除できない。

  • 課程評価データは誰かが書くかどうかに依存。マイナーな課程には評価が1件もない場合がある。

  • Windows でのみ完全にテスト済み。macOS/Linux のキーチェーンパスは記述されているが未テスト。


連絡先

質問、提案、バグ報告:likangxian1007@gmail.com または Issues で報告。


ライセンス

GPL-3.0 — 詳細は LICENSE を参照。

このプロジェクトの WebVPN 暗号化方式と UIS ログインフローは DanXi-Dev/DanXi(GPL-3.0)に由来する。GPL の感染条項に基づき、このプロジェクトは同じライセンスで公開する必要がある。


免責事項

このツールは、あなたがアクセスする権利を持つ学内リソースへのアクセスのみに使用される。手動でウェブページにログインして見られる内容と同等である。

復旦大学のネットワーク利用規定と樹洞コミュニティ規約を遵守すること。利用者は自己の行動に責任を負う。

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables searching and accessing Xiaohongshu (RedNote) content via natural language, with cookie-based authentication for note retrieval and keyword search.
    93
    1,092
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    Enables AI assistants to access and analyze content from the Chinese developer community platform Juejin, including articles, trending topics, and user interactions.
    34
    108
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to search real content from Xiaohongshu and Zhihu, supporting keyword search, note details, and question retrieval.
    8
    4
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    cc98-mcp enables AI assistants to search, read, and aggregate posts from the Zhejiang University campus forum CC98, using official read-only API tools.
    10
    1
    MIT

View all related MCP servers

Related MCP Connectors

  • 搜索笔记、浏览首页推荐、查看笔记内容与评论,并发表你的评论。直接在工作流中与小红书内容互动,高效跟进话题。

  • Search your Obsidian vault to quickly find notes by title or keyword, summarize related content, a…

  • Web search, page extraction and structured commerce, social and business data for AI agents

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/likangxian1007/danta-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server