Skip to main content
Glama

corpus-mcp

ローカル MCP サーバーです。エージェントに、オフラインのZIMアーカイブから構成されるローカル知識コーパス — Wikipedia、医療系(MDWiki)、開発者向けドキュメント(DevDocs)、Stack Exchange — へのクリーンで効率的なアクセスを、単一の一貫したインターフェース経由で提供します。インターネット不要、埋め込み不要、ベクトルデータベース不要: libzim による全文検索と、サーバー内での決定的なコンテンツのクリーニングだけです。

公開されるMCPサーフェスは、ちょうど2つのツールのみです:

search(query, limit?)
fetch(ref, sections?)

構成されたコーパスはオペレーターの関心事であり、エージェントの関心事ではありません。エージェントが行えるのは、次のことだけです:

discover  →  search()
select    →  fetch()

コーパスファミリー

コーパス

kind

ドキュメント

セクションモデル

Wikipedia、MDWiki

article

記事

見出しツリー(h2+)、リードセクション ID ""

DevDocs(C、CMake、Python)

documentation

ドキュメントページ

見出しツリー; ページ内の目次(TOC)とナビゲーションパーツは除去

Stack Exchange

thread

質問と回答

合成セクション: questionaccepted-answeranswer-<id>

コーパスの識別、ルーティング、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.toml

corpus.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 build

MCP エンドポイントは 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 は "" です。スレッドでは、セクションは questionaccepted-answeranswer-<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"])

構成

環境変数(コンテナのデフォルト値):

変数

デフォルト

意味

CORPUS_ROOT

/corpus

コンテナ 内の コーパスのルート(必須)

CORPUS_CONFIG

/config/corpus.toml

コンテナ内のマニフェストのパス(必須)

MCP_HOST

0.0.0.0

コンテナ内の待受アドレス

MCP_PORT

8000

コンテナ内の待受ポート

SEARCH_LIMIT

5

search() のデフォルトの limit

SEARCH_MAX_LIMIT

10

search(limit=…) のハードの上限

MAX_FETCH_CHARS

100000

フェッチしたコンテンツの出力上限

SEARCH_WORKERS

8

ファンアウト時のアーカイブ検索の並列実行数

SEARCH_MAX_CONSECUTIVE

2

多様性パス: 1つのライブラリからの連続最大結果数

LOG_QUERIES

true

検索クエリのテキストをログ出力するか(プライバシー)

ZIM_CHECK

false

起動時に 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 サーフェスのリグレッションテストでは、サーバーが公開しているのがツール searchfetch の2つだけで、プロンプトやリソースは一切無いことを確認します。

セキュリティ方針

設計上、ローカルで動くサービスです。: ホストへのバインドはデフォルトでループバックのみ、コーパスのボリュームは読み取り専用、コンテナは非root ユーザーで実行、特権モードなし、Docker ソケットなし、任意のファイルシステムへのアクセスなし、URL のフェッチなし、シェル実行なし。どちらのツールも、ファイルシステムのパス、URL、コマンド、実行可能なコンテンツを受け付けません — ref は不透明なコーパスの ID としてのみ機能します。

F
license - not found
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
    A
    quality
    A
    maintenance
    Enables 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.
    1
    118
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An 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.
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables large language models to directly access and search content in ZIM files, allowing offline question answering and information retrieval from resources like Wikipedia.
    19
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables offline CRUD and semantic search on Wikipedia ZIM archives via MCP tools for reading, writing, editing, deleting, and searching articles.
    1
    MIT

View all related MCP servers

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.

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/MagoDelBlocco/mcp-wiki'

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