Skip to main content
Glama

nwafu-mcp · 西北農林科技大学キャンパス情報 MCP ツール集

任意のエージェントプラットフォームにデプロイされた Agent 向けに、MCP プロトコル に準拠したツール群を提供します。以下3つの中核機能をカバーしています:

  1. キャンパスチャンネル人気まとめ:西北農林科技大学公式 QQ チャンネル(pd.qq.com/g/inwafu1934)の直近の人気投稿を取得し、インタラクション数でソートして「イベント / コンテスト / お知らせ / おすすめ / ヒント / 相談」などのカテゴリに自動分類します。重要な情報にはすべて元投稿のタイトルとリンクを添付し、トレーサビリティを保証します。

  2. 公式サイトクイック検索:学校公式サイト(www.nwafu.edu.cn)とニュースサイトの全文インデックスを通じて、最近のイベント、コンテスト、お知らせ、採用情報をすばやく検索します。「植保学院」「教务处」などのキーワードを渡すことで検索範囲を絞り込めます。

  3. サイト横断カスタム検索:ユーザーの質問を自動的に検索語へ分割し、公式サイトの全文インデックスとキャンパスチャンネルの直近投稿の両方を検索して統合出力します。すべての結果を読みやすい Markdown に整形し、原文リンクを添付します。


機能特長

  • MCP 標準実装:公式 mcp Python SDK(FastMCP)ベース、stdio 転送。Claude Desktop、Cursor、Windsurf、および MCP をサポートする各種エージェントプラットフォームに直接接続できます。

  • 情報のトレーサビリティ:すべての結論項目には出典タイトル+原文リンクを添付し、重要な情報は「重要なお知らせ / タイムリーネス情報」ブロックとして個別に表示します。

  • スマート分類:ルールエンジンがチャンネル投稿を「おすすめ / ヒント / イベント / コンテスト / お知らせ / 相談」などのカテゴリに自動分類し、グループ内では人気度(いいね + コメントの重み付け)順にソートします。

  • キーワード精密検索:公式サイト検索では任意のキーワード(学部名、部門名、事項名など)で範囲を絞り込めます。

  • 堅牢なフォールトトレランス:リクエストタイムアウト、リトライ、レート制限用のランダム遅延、Cookie 期限切れの通知に対応。単一ツールの障害が他のツールに影響しません。

  • プライバシーとコンプライアンス:公開されているコンテンツのみを取得し、ログイン・権限チェックを回避しません。Cookie は環境変数で注入され、コードリポジトリには書き込みません。


Related MCP server: zju-mcp

ツール一覧

ツール

用途

主要パラメータ

campus_channel_summary

キャンパス QQ チャンネルの直近の人気投稿をスマートに要約(人気ランキング + カテゴリ + 重要情報)

window_hours 時間窓、max_posts 取得件数、top_n 人気ランキング件数、include_comments ホットコメント取得の有無

official_site_recent

公式サイトの最近のお知らせ/イベント/コンテスト/採用情報のクイック検索と要約

category カテゴリ、keyword 範囲の絞り込み(学部名など)、days 期間、max_results

official_site_search

公式サイトの全文検索(カスタムキーワード)

query 中心キーワード、keyword 追加の限定語、days、max_results

campus_question_search

「公式サイト + キャンパスチャンネル」横断のカスタム質問検索

question 質問の原文、keywords 任意の明示的検索語、days、include_channel

すべてのツールの出力は Markdown テキストで、構成は:データソース、取得時刻、検索条件、 結果リスト(タイトル / 日付 / 出典 / 概要 / リンク)、重要なお知らせです。


動作原理

キャンパス QQ チャンネル

テンセントチャンネルの Web 版はフロントエンドのみでレンダリングされ、公開データは protobuf-over-JSON ゲートウェイから取得されます:

POST https://pd.qq.com/qunng/guild/gotrpc/noauth/trpc.qchannel.commreader.ComReader/<Method>
x-oidb: {"uint32_service_type": 11 时间线 | 5 评论}

匿名でも公開コンテンツは読み取れますが、ゲートウェイはブラウザレベルのセッション Cookie(p_uin + uuid + EO-Bot-Js-Token)を要求します。本ツールでは:

  • デフォルトで「投稿広場」サブフォーラム(670126629)の直近 N 件の投稿を取得(公開時刻順)

  • 点赞数 + 2 × 评论数 で人気度を推定し、時間窓内で最も人気のある投稿を抽出

  • ルールエンジンで自動分類し、重要な情報(お知らせ/公告/申込/締切/試験など)は個別に提示

  • オプションで人気ランキングの投稿のホットコメントを取得(GetFeedComments)

補足:GetGuildFeeds の「人気順」インターフェースは実測で空データを返すため、人気ランキングは「直近の投稿 × インタラクション数」方式を採用しています。これは「直近の人気」の意味合いに合致します。

学校公式サイト

学校メインサイトとニュースサイトは通元 CMS の全文検索を使用しています:

GET https://www.nwsuaf.edu.cn/cms/web/search/index.jsp
    ?query=<关键词>&siteID=<站点ID>&searchScope=0&channelID=&matchType=0
    &sortField=publishDate&order=1&date=<3|6|12>&page=<页码>
  • siteID=32e6d9be... はメインサイトのインデックス(全学の各学部・部門をカバー)

  • カテゴリごとに検索語を生成(お知らせ/公告、イベント/講演/フォーラム、コンテスト/大会、採用など)。ユーザーのキーワードと統合してページング取得し、タイトル、日付、出典、概要、原文リンクを解析

  • 期間はデフォルトで直近 90 日(インデックスの 3/6/12 か月フィルターにマッピング)


クイックスタート(ローカル実行)

cd nwafu-mcp
uv sync --extra dev
uv run nwafu-export-cookies --out cookies.json

スクリプトはローカルの Edge/Chrome でチャンネルページを開いてセッションを確立し、Cookie をエクスポートします。その後、 cookies.json 内の cookie_header を環境変数に設定します:

$env:PDQQ_COOKIES = "p_uin=xxx; uuid=xxx; EO-Bot-Js-Token=xxx"
# 或
$env:NWAFU_COOKIE_FILE = "F:\path\to\cookies.json"

Cookie は期限切れになります(アンチスクレイピング token がブラウザインスタンスに紐づいているため)。クラウドデプロイでは定期的な更新を推奨します。

2. ツール関数の直接テスト(MCP クライアントを経由しない)

uv run python -c "
import os
os.environ['NWAFU_COOKIE_FILE'] = 'cookies.json'
from nwafu_mcp.server import official_site_recent
print(official_site_recent(category='通知', keyword='植保学院'))
"

3. MCP Server として実行

uv run nwafu-mcp

MCP クライアントへの接続

Claude Desktop(claude_desktop_config.json)

{
  "mcpServers": {
    "nwafu-campus": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/unielevotor/nwafu-AgentPlatformMCP",
        "nwafu-mcp"
      ],
      "env": {
        "PDQQ_COOKIES": "p_uin=xxx; uuid=xxx; EO-Bot-Js-Token=xxx"
      }
    }
  }
}

Cursor / Windsurf / 汎用プラットフォーム(JSON 形式)

{
  "mcpServers": {
    "nwafu-campus": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/unielevotor/nwafu-AgentPlatformMCP", "nwafu-mcp"],
      "env": {
        "PDQQ_COOKIES": "p_uin=xxx; uuid=xxx; EO-Bot-Js-Token=xxx",
        "PDQQ_GUILD_ID": "inwafu1934",
        "PDQQ_CHANNEL_ID": "670126629"
      }
    }
  }
}

または、pip install git+https://github.com/unielevotor/nwafu-AgentPlatformMCP でインストール後、nwafu-mcp コマンドで直接起動することもできます。


GitHub デプロイ手順

  1. GitHub リポジトリ(unielevotor/nwafu-AgentPlatformMCP)にプッシュ:

git remote add origin https://github.com/unielevotor/nwafu-AgentPlatformMCP.git
git push -u origin main
  1. リポジトリが Public であることを確認(プライベートリポジトリの場合、対象のエージェントプラットフォームが GitHub の認証情報にアクセスできる必要があります)。

  2. エージェントプラットフォームの MCP 設定に上記の uvx --from git+... 起動コマンドを入力し、PDQQ_COOKIES などの環境変数を注入します。


環境変数

変数

必須

説明

PDQQ_COOKIES

チャンネルツールで必要

QQ チャンネルのブラウザセッション Cookie

NWAFU_COOKIE_FILE

チャンネルツールで必要

nwafu-export-cookies がエクスポートした JSON を指定

PDQQ_GUILD_ID

いいえ

チャンネル ID。デフォルト inwafu1934

PDQQ_CHANNEL_ID

いいえ

サブフォーラム ID。デフォルト 670126629(投稿広場)

PDQQ_MIN_DELAY / PDQQ_MAX_DELAY

いいえ

チャンネルリクエスト間隔(秒)。デフォルト 0.3–0.8

NWAFU_TIMEOUT

いいえ

単一リクエストのタイムアウト(秒)。デフォルト 30

参考:.env.example。


出力例(抜粋)

# 🎓 西农校园频道 · 近期热门总结

> 数据来源:西北农林科技大学官方 QQ 频道 | 时间窗口:近 72 小时 | 帖子数:48

## 🔥 热度榜
1. **中元节鬼是真的多啊…**(👍7 · 💬1 · 08-27)
   来源:[中元节鬼是真的多啊](https://pd.qq.com/g/inwafu1934/post/...)

## 🏆 竞赛(2)
- **关于举办2026年创新创业大赛的通知**(👍5 · 💬2 · 08-26)
  来源:[…](https://pd.qq.com/g/inwafu1934/post/...)

## ⚠️ 重点信息(建议优先查看)
- [关于选课时间安排的通知](https://pd.qq.com/g/inwafu1934/post/...)
# 📢 西北农林科技大学官网 · 近期信息查询

> 查询条件:分类=通知 | 关键词=植保学院 | 时间范围:近 90 天 | 结果数:12

1. **关于举办2026年植保论坛系列学术报告会(十七)的通知**(2026-08-26 · 植物保护学院)
   [查看原文](https://ppc.nwafu.edu.cn/xzbg/...)

コンプライアンスと利用上の推奨事項

  • 取得対象は公開されているコンテンツのみとし、ログイン、有料、権限チェックを回避しません。

  • ランダム UA、ランダム遅延、失敗時のリトライを内蔵済みです。デプロイ時は遅延を短縮して高頻度で取得しないでください。対象プラットフォームの利用規約と「個人情報保護法」などの適用法令を遵守してください。

  • 重要な情報(申込締切、試験日程など)は公式の原文を基準とし、本ツールの出力は概要確認用です。

  • チャンネル Cookie にはセッション識別子が含まれます。公開リポジトリにコミットせず、必ず環境変数で注入してください。


よくある質問

現象

対処

チャンネルツールが「Cookie 未設定」と表示される

ローカルで nwafu-export-cookies --out cookies.json を実行して環境変数を設定

チャンネルツールが retcode=150/4000 を返す

Cookie の期限切れ、またはアンチスクレイピング token の欠落。再エクスポートする

公式サイトの検索結果が空

days を広げる、キーワードを外す、またはカテゴリを変更して再試行

クラウドに Edge/Chrome がない

playwright をインストールして python -m playwright install chromium を実行。またはローカルで定期的に Cookie をエクスポートして注入

ディレクトリ構成

src/nwafu_mcp/
  server.py          MCP 服务器与四个工具定义
  qq_channel.py      QQ 频道数据层(时间线/热评)
  official_site.py   官网全文检索数据层
  classify.py        帖子分类与热度评分
  format.py          Markdown 报告排版
  config.py          环境变量与默认配置
  export_cookies.py  本地导出频道 Cookie 的 CLI
tests/               单元测试
scripts/mcp_smoke.py 端到端 MCP 冒烟测试(连接 stdio server 并调用全部工具)

Available Tools

4 tools
campus_channel_summaryA

抓取西北农林科技大学官方 QQ 频道(https://pd.qq.com/g/inwafu1934)近期帖子,按互动量(点赞+评论)排名出热度榜,并自动归类为活动/竞赛/通知/推荐/贴士/求助/其他,输出 Markdown 总结;每条重要信息都附来源帖子标题与链接。

NameRequiredDescriptionDefault
top_nNo
max_postsNo
window_hoursNo
comment_top_nNo
include_commentsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It transparently discloses the source URL, ranking formula, automatic categorization, Markdown output, and source attribution. It does not mention failure modes or rate limits, but the core behavior is clearly described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence that front-loads the fetch action, source, ranking, categorization, and output format. Every clause is relevant, though a more structured breakdown of parameters would improve readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return structure, and the description explains source, ranking, categories, and citations. However, with five parameters and no explicit guidance on when to invoke this tool versus siblings, the description is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain any of the five parameters. Terms like 'top_n' and 'window_hours' are only indirectly related to '热度榜' and '近期帖子', while max_posts, comment_top_n, and include_comments receive no clarification.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: fetch recent posts from a named QQ channel, rank them by likes+comments, categorize them into seven types, and output a Markdown summary with source links. It clearly identifies the resource and unique behavior, distinguishing it from a plain recent-posts or search tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for obtaining a ranked, categorized summary of QQ-channel posts rather than raw retrieval or search. It does not explicitly state when to use this tool versus the sibling tools or describe exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

official_site_recentA

查询西北农林科技大学官网(https://www.nwafu.edu.cn/)最近的活动、竞赛、通知、招聘等官方信息并输出 Markdown 总结。支持传入关键词(如学院名)缩小检索范围,例如 keyword='植保学院' 只返回植保学院相关通知。

NameRequiredDescriptionDefault
daysNo
keywordNo
categoryNo全部
max_resultsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden; it discloses that this is a read-only query of the official site and that output is a Markdown summary, plus that keyword narrows the results. It does not mention rate limits, freshness boundaries, or failure modes, but for a simple read tool the key behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first establishes tool, source URL, content scope, and output format; the second gives the key parameter example. The most load-bearing information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the output schema is present, which covers return structure. However, the description does not explain three of the four parameters, nor does it position the tool against official_site_search, so an agent still has meaningful uncertainty about how to set days/category/max_results and when to choose this over its siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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, but only keyword is given real meaning (with the '植保学院' example). days, category, and max_results are left to inference from their names and defaults, which is insufficient with no schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb–resource pair: query the NWAFU official website for recent activities, competitions, notices, and recruitment information, then output a Markdown summary. It does not explicitly distinguish itself from official_site_search or the other siblings, so it loses a point for lacking sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use—retrieving recent official-site news—is implied and there is a concrete keyword example, but no alternative tools are named and no when-not-to-use conditions are given. Sibling tools like official_site_search could overlap, yet the description does not route the agent between them.

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.

  1. 4 tool updatesv0.1.0
    • First observedcampus_channel_summary
    • First observedcampus_question_search
    • First observedofficial_site_recent
    • First observedofficial_site_search

TDQS

A3.7/5.0

Scored across 4 tools

Disambiguation4/5

Each tool targets a fairly distinct retrieval need: QQ channel hot summaries, official-site recent info, official-site full-text search, and cross-source question search. The only mild overlap is between official_site_recent and official_site_search, but their descriptions make the difference clear enough.

Naming Consistency4/5

Tool names are consistently lowercase snake_case and follow recognizable source prefixes like campus_* and official_site_*. However, suffixes mix result-oriented terms (summary, recent) with action terms (search), so they do not follow a strict verb_noun pattern throughout.

Tool Count5/5

Four tools is well-scoped for a campus information retrieval server. Each tool covers a distinct retrieval workflow without redundancy, and the set is neither too thin nor overloaded for its stated purpose.

Completeness4/5

The set covers recent official announcements, full-text official-site search, QQ channel hot content, and a combined question-based search across both sources. A dedicated channel-only keyword search is missing, but campus_question_search partially fills that gap, so the surface is reasonably complete.

Maintenance

ActivityStale
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables interaction with Zhejiang University's learning platform (学在浙大 / 智云课堂) via MCP tools, allowing natural language commands to check todos, view schedules, fetch lecture transcripts, and submit homework.
    7
    9
    -
  • A
    license
    A
    quality
    B
    maintenance
    Provides Google search, URL extraction, and academic paper inline extraction without API keys, enabling search and content retrieval from a single MCP server.
    5
    601 npm
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables searching the Xiangtan University Computer Science College official website, retrieving article content and attachments, and listing common sections through a Cloudflare-hosted MCP server.
    -