corpus-mcp
corpus-mcp
ローカル MCP サーバーです。エージェントに、オフラインのZIMアーカイブから構成されるローカル知識コーパス — Wikipedia、医療系(MDWiki)、開発者向けドキュメント(DevDocs)、Stack Exchange — へのクリーンで効率的なアクセスを、単一の一貫したインターフェース経由で提供します。インターネット不要、埋め込み不要、ベクトルデータベース不要: libzim による全文検索と、サーバー内での決定的なコンテンツのクリーニングだけです。
公開されるMCPサーフェスは、ちょうど2つのツールのみです:
search(query, limit?)
fetch(ref, sections?)構成されたコーパスはオペレーターの関心事であり、エージェントの関心事ではありません。エージェントが行えるのは、次のことだけです:
discover → search()
select → fetch()コーパスファミリー
コーパス |
| ドキュメント | セクションモデル |
Wikipedia、MDWiki |
| 記事 | 見出しツリー(h2+)、リードセクション ID |
DevDocs(C、CMake、Python) |
| ドキュメントページ | 見出しツリー; ページ内の目次(TOC)とナビゲーションパーツは除去 |
Stack Exchange |
| 質問と回答 | 合成セクション: |
コーパスの識別、ルーティング、ZIM へのアクセス、HTML の解釈、クリーニング、ランキング、リダイレクト処理、正規化は、すべてサーバーの責務です。エージェントが HTML をパースしたり、リダイレクトを解決したり、参照を構築・解析したり、libzim、ZIM 名前空間、コーパスの保存形式の内部について何かを知る必要は一切ありません。
Related MCP server: mcpzim
リファレンス
search() の結果には、不透明な ref(例: corpus://Wikipedia/Bell_test)が含まれ、fetch() がそれを消費します。エージェントは ref を構築・解析・変更してはならず、また ref からコーパスを推測してはなりません:
search() produces ref fetch() consumes refアーキテクチャ
Local agent
│ MCP / Streamable HTTP → http://127.0.0.1:8000/mcp
▼
┌──────────────────────────────────────────────┐
│ Corpus MCP Server │
│ search() fetch() │
│ ├─ CorpusManager (routing, cache, │
│ │ bounded-concurrency fan-out) │
│ ├─ federated ranking (RRF + lexical title │
│ │ reranking + diversity) │
│ ├─ adapters: mediawiki / devdocs / │
│ │ stackexchange │
│ ├─ HTML cleaner → Markdown, section trees │
│ └─ GlobalRef codec (opaque refs) │
└─────────────┬────────────────────────────────┘
▼
per-library ZIM service (only libzim touchpoint,
one search lock per archive)
▼
corpus/ (read-only volume, N .zim archives)
corpus.toml (manifest: name, adapter, path)MCP レイヤーは libzim の概念を一切公開しません。名前空間、クラスタID、生エントリ、MIMEタイプ、素の HTML もすべて対象外です。
前提条件
Docker + Docker Compose
ZIM アーカイブ(後述)
テストスイートをローカルで実行する場合: Python 3.12 と
uv(または pip)
コーパスのレイアウト
サーバーは自身ではアーカイブを一切ダウンロードしません。コーパスの取得は、明示的にアプリケーションの起動から分離されています。デフォフォルトレイアウト:
corpus/
wikipedia/wikipedia_en_all_nopic_*.zim
medical/mdwiki_en_all_maxi_*.zim
devdocs/devdocs_en_cpp_*.zim
devdocs/devdocs_en_cmake_*.zim
devdocs/devdocs_en_python_*.zim
stackexchange/stackoverflow.com_en_all_*.zim
stackexchange/security.stackexchange.com_en_all_*.zim
stackexchange/softwareengineering.stackexchange.com_en_all_*.zim
corpus.tomlcorpus.toml は、各ライブラリ、そのアダプタ、そのパス(コーパスルートからの相対パス)を定義します:
version = 1
[[library]]
name = "Wikipedia"
path = "wikipedia/wikipedia_en_all_nopic_2026-06.zim"
adapter = "mediawiki"
[[library]]
name = "CMake-Docs"
path = "devdocs/devdocs_en_cmake_2026-08.zim"
adapter = "devdocs"検証ルール: 名前は一意、アダプタは既知のもの、パスはコーパスルート内に収まること。サーバを起動する前にコーパスを検証します:
make validate-corpus # opens every archive, reports metadata
make corpus-list # list configured libraries起動 / シャットダウン
make start # build + start (docker compose, detached)
make logs # tail logs
make ps # container status
make stop # stop (keep containers)
make down # stop + remove
make restart
make buildMCP エンドポイントは http://127.0.0.1:8000/mcp(Streamable HTTP)で利用できます。ホスト側のポートはデフォルトではループバックのみにバインドされ、コンテナは内部で 0.0.0.0:8000 のリスナーに設定されています。
設定された ZIM のいずれかを開けない場合、サーバは起動に失敗し、問題のライブラリを名指しします。部分的にのみ機能するようなモードは存在しません。
ツールスキーマ
search(query: str, limit?: int)
設定されたすべてのライブラリの全文インデックスを検索します(並行数を制限し、アーカイブごとに1ワーカー)。ランキングリストを Reciprocal Rank Fusion(RRF、相互ランク融合)で融合し、同点のクロスコーパス候補を語彙的なタイトルカバレッジで再ランキングし、それから決定的な多様性パスを適用してクリーンな結果を返します。limit のデフォルトは5です。サーバはハード上限(SEARCH_MAX_LIMIT、デフォルト10)を強制します。
{
"results": [
{
"ref": "corpus://Wikipedia/Bell_test",
"library": "Wikipedia",
"kind": "article",
"title": "Bell test",
"snapshot": "2026-06",
"snippet": "To close the detection loophole, an apparatus with a high detection efficiency is needed.",
"relevant_sections": [
{ "id": "Notable_experiments", "title": "Notable experiments" },
{ "id": "Loopholes", "title": "Loopholes" }
]
}
]
}ref— 不透明なグローバル識別子。fetch()にそのまま戻します。library/kind/snapshot— 来歴: どのアーカイブ、どの種類のドキュメント、どのコーパススナップショットか(アーカイブのメタデータから取得)。relevant_sections— 0〜3個の決定的な語彙ヒント(一致がはっきりしたセクションがない場合は空)。セクションID はサーバ導出であり、エージェントが再構築してはなりません。
1つのライブラリが失敗しても、検索はその分だけ品質が下がるだけです(他のライブラリは通常応答): 検索全体が停止することはありません。
fetch(ref: str, sections?: list[str])
クリーニング済みドキュメントを構造化された Markdown として返します。
sectionsなし: ドキュメント全体(MAX_FETCH_CHARSで上限、セクション境界で打ち切られた場合truncated: true)。sectionsあり: そのセクションのみ(サブツリーも含む)。セクションID はsearch()のヒントまたはavailable_sectionsから得ます。リード / 先頭セクションの ID は""です。スレッドでは、セクションはquestion、accepted-answer、answer-<id>で、そのmetadataにはスコア、承認状態、タグが含まれます。
{
"ref": "corpus://Wikipedia/Bell_test",
"library": "Wikipedia",
"kind": "article",
"title": "Bell test",
"snapshot": "2026-06",
"sections": [
{ "id": "Loopholes", "title": "Loopholes", "content": "## Loopholes\n\n..." }
],
"available_sections": [
{ "id": "", "title": "Bell test" },
{ "id": "Background", "title": "Background" },
{ "id": "Loopholes", "title": "Loopholes" }
],
"truncated": false
}エラーは簡潔で、次の行動に結び付くものです:
{ "error": "invalid_ref", "message": "invalid reference: ..." }
{ "error": "not_found", "message": "Document not found in Wikipedia: Foo_bar" }
{
"error": "section_not_found",
"missing_sections": ["Experiments"],
"available_sections": [ { "id": "Loopholes", "title": "Loopholes" }, "..." ]
}エージェントのワークフロー例
search("Bell experiment loopholes")
↓
fetch("corpus://Wikipedia/Bell_test", ["Notable_experiments", "Loopholes"])構成
環境変数(コンテナのデフォルト値):
変数 | デフォルト | 意味 |
|
| コンテナ 内の コーパスのルート(必須) |
|
| コンテナ内のマニフェストのパス(必須) |
|
| コンテナ内の待受アドレス |
|
| コンテナ内の待受ポート |
|
|
|
|
|
|
|
| フェッチしたコンテンツの出力上限 |
|
| ファンアウト時のアーカイブ検索の並列実行数 |
|
| 多様性パス: 1つのライブラリからの連続最大結果数 |
|
| 検索クエリのテキストをログ出力するか(プライバシー) |
|
| 起動時に libzim による完全なチェックサム検証を実行する(コーパス全体を読み込むため、オプトイン; 大規模アーカイブでは遅い) |
ホスト側の Compose 変数: CORPUS_ROOT(デフォルト ./corpus)と CORPUS_CONFIG(デフォルト ./corpus.toml)。
サーバーは無効な構成であると即座に失敗します。
テスト
make test # unit + integration + MCP surface tests (needs .venv)
make lint
make formatローカルでのテストランのセットアップ:
uv venv .venv --python 3.12
uv pip install -e . --python .venv/bin/python
uv pip install --python .venv/bin/python pytest pytest-asyncio ruff
make testテストは、libzim のライタを使って専用の小さな ZIM フィクスチャ(コーパスファミリにつき1つ)をビルドします。既存のコーパスは不要です。MCP サーフェスのリグレッションテストでは、サーバーが公開しているのがツール search と fetch の2つだけで、プロンプトやリソースは一切無いことを確認します。
セキュリティ方針
設計上、ローカルで動くサービスです。: ホストへのバインドはデフォルトでループバックのみ、コーパスのボリュームは読み取り専用、コンテナは非root ユーザーで実行、特権モードなし、Docker ソケットなし、任意のファイルシステムへのアクセスなし、URL のフェッチなし、シェル実行なし。どちらのツールも、ファイルシステムのパス、URL、コマンド、実行可能なコンテンツを受け付けません — ref は不透明なコーパスの ID としてのみ機能します。
This server cannot be installed
Maintenance
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
- AlicenseAqualityAmaintenanceEnables AI models to access and search offline Wikipedia and other knowledge bases stored in ZIM format files. Provides intelligent content retrieval, structured browsing, advanced search capabilities, and metadata extraction for comprehensive offline knowledge access.1118MIT
- AlicenseAqualityBmaintenanceAn MCP server that provides offline access to ZIM file archives, including Wikipedia, medical knowledge, and maps. It dynamically exposes tools like search, article retrieval, and driving route planning based on available ZIM files.4MIT
- AlicenseNot gradedqualityDmaintenanceEnables large language models to directly access and search content in ZIM files, allowing offline question answering and information retrieval from resources like Wikipedia.19MIT
- AlicenseNot gradedqualityBmaintenanceEnables offline CRUD and semantic search on Wikipedia ZIM archives via MCP tools for reading, writing, editing, deleting, and searching articles.1MIT
Related MCP Connectors
Shared, peer-validated knowledge archive for AI agents — search, contribute, and validate via MCP
Agentic search over your Dewey document collections from any MCP-compatible client.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/MagoDelBlocco/mcp-wiki'
If you have feedback or need assistance with the MCP directory API, please join our Discord server