Wiki.js について
Wiki.jsを利用する読者や管理者向けのMCPサーバーです。ページの検索・閲覧・編集に加え、アセットやユーザーなどを管理でき、ツール選択や書き込み範囲の制限、編集競合の検出にも対応します。
主な機能
- 01タイトルと本文の検索
- 02Wikiページの閲覧と編集
- 03アセット、ユーザー、グループ、コメントの管理
- 04ツール選択または読み取り専用モード
- 05書き込み対象をパスで制限
- 06閲覧後のページ更新を検出
活用シーン
- 01タイトル検索で見つからない本文箇所の検索
- 02新しい編集を上書きせずにページを更新
- 03MCP接続を読み取り専用に設定
- 04指定したWikiパス内だけで書き込みを許可
MCP 対応
Wiki.jsの検索、ページ、アセット、ユーザー、グループ、コメント、メンテナンス操作をMCPツールとして公開します。ツールを絞り込め、読み取り専用モードでは読み取りツールのみを登録します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @ni-c/wikijs-mcpWIKIJS_URLBase URL of the Wiki.js instance, e.g. https://wiki.example.comWIKIJS_TOKENシークレットAPI key from Administration → API Access. WIKIJS_API_KEY is accepted as an aliasWIKIJS_LOCALELocale assumed by page tools that are not given one; part of a page's identity (default: en)WIKIJS_READ_ONLYSet to true to register only the read tools (default: false)WIKIJS_ALLOWED_PATHSComma-separated page path prefixes the write tools are confined to, matched by path segmentWIKIJS_ALLOW_TOOLSComma-separated tool names or list_* prefixes to register; 'essential' selects a curated preset (default: all tools)WIKIJS_DENY_TOOLSComma-separated tool names or list_* prefixes to remove from whatever the allow list leftWIKIJS_INSECURE_TLSSet to true to accept a self-signed certificate from a self-hosted instance (default: false)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
wikijs-mcp
Wiki.js向けのModel Context Protocol(MCP)サーバーです。Wiki.jsは、ページをMarkdown形式で保持し、すべての機能を単一のGraphQLエンドポイントから提供するセルフホスト可能なウィキです。
Claude Code、Claude Desktop、CodexなどのMCPクライアントを使って、ウィキページの検索、閲覧、編集ができます。また、許可すれば、アセット、コメント、ユーザー、グループ、メンテナンスジョブも管理できます。
ツールは62個ありますが、すべてを使う必要はありません。
WIKIJS_ALLOW_TOOLS=essentialを設定すると、厳選された7つだけが登録されます。モデルは62個より7個のほうが適切なツールをはるかに確実に選択できます。詳しくは
読み込むツールの選択をご覧ください。
特長
テキスト検索で見つからない内容も検索できます。 Wiki.jsのデフォルトの検索エンジンがインデックス化するのはタイトルと説明だけです。そのため、search_pagesは稼働中の検索エンジンを示し、grep_pagesはページ本文を検索します。
同僚の編集内容を上書きしません。 update_pageは、ページを読み取った時点の内容と比較し、その間に保存された編集があれば上書きを拒否します。ピンポイント編集では、一致箇所が正確に1つである必要があります。
書き込み先をウィキの一部に限定できます。 WIKIJS_ALLOWED_PATHSは、ページとアセットへの書き込みツールをパスのプレフィックスに制限します。プレフィックスはパスセグメント単位で照合され、読み取りには制限が適用されません。
必要条件
- Node.js ≥ 22
- 稼働中のWiki.jsインスタンスとAPIトークン
設定
| 変数 | 必須 | 説明 |
|---|---|---|
WIKIJS_URL | はい | Wiki のベース URL(例:https://wiki.example.com)。末尾の /graphql は削除されます |
WIKIJS_TOKEN | はい | Administration → API Access で取得する API キー。WIKIJS_API_KEY もエイリアスとして使用できます |
WIKIJS_LOCALE | いいえ | ロケールが指定されていないページツールが使用するロケール(デフォルトは en) |
WIKIJS_READ_ONLY | いいえ | true、1、または yes を指定すると、読み取りツールのみが登録されます |
WIKIJS_ALLOWED_PATHS | いいえ | 書き込みツールの対象を限定するページパスのプレフィックス(カンマ区切り、例:docs,team/notes) |
WIKIJS_ALLOW_TOOLS | いいえ | ツール名、list_* のプレフィックス、または厳選されたプリセットを指定する essential(カンマ区切り) |
WIKIJS_DENY_TOOLS | いいえ | 同じ構文です。WIKIJS_ALLOW_TOOLS で許可されたツールから除外します |
ELICITATION | いいえ | false を指定すると、承認ダイアログが 2 回の呼び出しで使うトークンに置き換わります。プレフィックスは付きません |
WIKIJS_INSECURE_TLS | いいえ | true を指定すると、自己署名証明書を受け入れます(この接続に限ります) |
ロケールはページの表示設定ではなく、ページの識別情報の一部です。 同じパスでも、
en と de では別々のページになります。別の言語でセットアップされた Wiki では、
WIKIJS_LOCALE を設定してください。設定しない場合、パスによる検索はすべて「見つかりません」と
返されます。インストール済みのロケールは list_locales で確認できます。
API キーには管理者権限があります。 Wiki.js では「フルアクセス」またはグループを選べます。
フルアクセスのキーを使うと、すべてのページとアカウントを書き換えられます。
WIKIJS_READ_ONLY、WIKIJS_ALLOWED_PATHS、キー自体に設定されたグループ権限という 3 つの
方法でアクセス範囲を制限できます。詳しくは SECURITY.md を参照してください。
https://を使用してください。 平文の http ではトークンが暗号化されずに送信されます。 ホストがローカルでない場合、サーバーは警告を表示します。自己署名証明書を使う場合は、WIKIJS_INSECURE_TLSよりも適切な内部 CA を使用してください。
認証情報がなくてもサーバーは起動し、ツールを一覧表示します(そのためレジストリや インスペクターから内部を確認できます)。ただし、すべての呼び出しは API にアクセスする代わりに、 セットアップ手順を示して失敗します。
読み込むツールの選択
WIKIJS_ALLOW_TOOLS と WIKIJS_DENY_TOOLS には、カンマ区切りで
ツール名を指定します。末尾に * を付けると、ファミリー全体に一致します。essential は厳選された
プリセットです。Wiki ページを最初から最後まで検索、読み取り、書き込みするために必要な
search_pages、grep_pages、get_page、list_pages、get_page_tree、create_page、
update_page が含まれており、ツールリファレンスで
その旨が示されています。
WIKIJS_ALLOW_TOOLS=essential
WIKIJS_ALLOW_TOOLS=get_page,search_pages,list_*
WIKIJS_DENY_TOOLS=delete_*,purge_page_history,set_api_state
どのツールにも一致しない項目があると、起動時にその項目名を示して処理が中断されます。
そのため、入力ミスによってツールが気づかれないまま非表示になることはありません。
フィルターで除外されたツールは登録されないため、tools/list に表示されず、
tools/call からも認識されません。これは WIKIJS_READ_ONLY のもとで書き込みツールが
使えないのと同じです。
これらのサーバーを複数同時に実行する場合は、もう一つの選択肢として
mcp-hub があります。その /hub エンドポイントは、
各サーバーのツールを 6 つのメタツールに置き換えます。
Wiki の一部への書き込みを制限する
WIKIJS_ALLOWED_PATHS は、書き込みを行うページおよびアセットのツールを、指定したパスプレフィックスに制限します。読み取りは意図的に制限しません。読み取りを制限すると、Wiki の一部しか見られず混乱を招きます。また、ページを完全に非表示にするには API キー自体のページルールを使うのが適切です。このルールを使えば、ウェブ UI からも非表示になります。
WIKIJS_ALLOWED_PATHS=docs,team/notes
照合はパスセグメント単位で行われるため、docs は docs/setup には適用されますが、docs-archive/old には適用されません。move_page は移動元と移動先の両方を確認するため、許可された範囲外への移動も、保護された範囲への移動もできません。
アセットへの書き込みは、別の名前空間であるアセットフォルダーツリーに対してチェックされます。プレフィックスで制限できない操作、つまりインスタンス全体を対象とする6つのメンテナンスツール、タグツール、そしてコメント編集は、対象のページを Wiki.js から特定できないため、この変数が設定されている間は、例外を黙って設けるのではなく拒否されます。これには flush_page_cache、rebuild_page_tree、rebuild_search_index も含まれます。これらはデータを失わせることはありませんが、Wiki 全体に作用します。
インストール
Claude Code
claude mcp add wikijs-mcp -- npx -y @ni-c/wikijs-mcp
Claude Desktop
{
"mcpServers": {
"wikijs-mcp": {
"command": "npx",
"args": ["-y", "@ni-c/wikijs-mcp"],
"env": {
"WIKIJS_URL": "https://wiki.example.com",
"WIKIJS_TOKEN": "…"
}
}
}
}
Codex
[mcp_servers.wikijs-mcp]
command = "npx"
args = ["-y", "@ni-c/wikijs-mcp"]
env = { WIKIJS_URL = "https://wiki.example.com", WIKIJS_TOKEN = "…" }
Docker
docker run --rm -i \
-e WIKIJS_URL=https://wiki.example.com \
-e WIKIJS_TOKEN=… \
ghcr.io/ni-c/wikijs-mcp
mcp-hub 経由
ローカルプロセスを起動できないクライアント(ChatGPT コネクター、ウェブ版 Claude、Cursor、LibreChat)は、mcp-hub 経由で wikijs-mcp に接続できます。1つのコンテナーで複数の stdio MCP サーバーを Streamable HTTP 経由で提供し、1つのパスワードによる OAuth 2.1 ログインと、OAuth を利用できないクライアント向けの長期有効トークンを備えています。/hub エンドポイントは、すべてのサーバーを6つのメタツールの背後に配置するため、モデルのコンテキストに N×ツールスキーマを含めることなく、1つのコネクターですべてのサーバーに接続できます。また、2つのプロトコルリビジョンに対応しており、このサーバーが尋ねる質問は、経由して遠端のユーザーに届きます。
/config/mcp.json は Claude Code の形式を使うため、エントリーにはすでにお持ちのものを使用できます。
{
"mcpServers": {
"wikijs-mcp": {
"command": "npx",
"args": ["-y", "@ni-c/wikijs-mcp"],
"env": {
"WIKIJS_URL": "https://wiki.example.com",
"WIKIJS_TOKEN": "…",
"WIKIJS_ALLOW_TOOLS": "essential"
},
"denyTools": ["delete_*,purge_page_history,set_api_state"]
}
}
}
ここでの allowTools と denyTools は、サーバーごとに適用されるハブ独自のフィルターであり、env 内の *_ALLOW_TOOLS とは異なります。その違いと、間違いやすい点についてはクライアントガイドをご覧ください。
ツール
ツールは62個です。★は essential プリセットを示します。⚠は MCP のエリシテーションを通じてユーザーに確認を求めるツールを示します。これはモデルが代わりに回答できないダイアログです。クライアントが表示できない場合は、2回の呼び出しで行う confirm_token にフォールバックします。ユーザーへの確認をご覧ください。
すべてのツールは outputSchema を宣言し、テキストブロックに加えて structuredContent でも応答するため、クライアントは文章を解析せずに結果を利用できます。以前は 「ページ5(パス)を削除しました。」 のような文だけで応答していた29個のツールは、フィールドも返すようになりました。文は、読み手にとって自然な場所にそのまま残っています。
Wiki のコンテンツを報告するツールは、フィールドに untrusted: true と source: "wikijs" を含みます。ページ本文、タイトル、説明、コメントは、編集権限を持つユーザーなら誰でも書き込めるためです。このリストは呼び出し箇所に基づいています。ツールに印が付くのは、回答がすでに信頼できないデータ用のラッパーを経由している場合に限られます。
update_page が古い読み取りに対して拒否する場合も、意図的な例外として形を維持しています。これは失敗ではなく復旧のための手順を示すものなので、エラーではなく通常の結果として扱われます。また、両方のタイムスタンプをフィールドに含め、written: false と返すようになりました。
| ツール | 説明 |
|---|---|
list_pages | ★ ページとそのメタデータを一覧表示します。デフォルトでは新しい順です。 |
get_page | ★ page_id、またはパスとロケールを指定して、1 つのページを読み込みます。 |
search_pages | ★ 全文検索を行います。ただし、まずこちらをお読みください。デフォルトの Wiki.js では、検索エンジンが「Database - Basic」であり、ページのタイトルと説明のみをインデックス化します。ページ内のテキストは対象外です。 |
grep_pages | ★ ページを取得してローカルで正規表現による照合を行い、ページの実際のテキストを検索します。 |
get_page_tree | ★ パス直下のページとフォルダーを一覧表示します。Wiki の構造を表示するもので、検索では得られない情報です。 |
list_page_links | すべてのページと、それぞれに含まれる内部リンクを返します。指定したロケールの Wiki リンクグラフです。 |
create_page | ★ ページを作成します。 |
update_page | ★ ページを変更します。 |
move_page | ページを別のパス、別のロケール、またはその両方に移動します。 |
delete_page | ⚠ ページとその履歴を削除します。 |
convert_page_editor | ページの保存形式を変更します。 |
list_page_history | ページの保存済みバージョンを新しい順に一覧表示し、誰がいつ何を変更したかを示します。 |
get_page_version | ページの過去のバージョンを 1 つ返します。その時点の本文全体も含まれます。 |
diff_page_versions | ページの 2 つのバージョン間の統合差分を返します。to_version を省略した場合は、1 つのバージョンと現在のページとの差分を返します。 |
get_page_conflict | 読み込んだバージョンより新しいページのバージョンを返します。update_page が書き込みを拒否したときに示す内容です。 |
restore_page_version | ページを保存済みのバージョンに戻します。 |
list_tags | Wiki 内のすべてのタグと、表示タイトルおよび最終使用日時を一覧表示します。 |
search_tags | 文字列の一部に一致するタグを検索します。 |
update_tag | そのタグが付いたすべてのページで、タグ名または表示タイトルを変更します。 |
delete_tag | ⚠ Wiki からタグを削除し、そのタグが付いたすべてのページからも削除します。 |
list_assets | 1 つのアセットフォルダー内の画像とファイルを一覧表示します。 |
list_asset_folders | アセットフォルダー直下のフォルダーを一覧表示します。 |
upload_asset | 画像またはファイルをアセットフォルダーにアップロードし、ページに埋め込めるようにします。 |
create_asset_folder | アセットストアにフォルダーを作成します。 |
rename_asset | アセットの名前を変更します。 |
delete_asset | ⚠ アセットを完全に削除します。 |
list_comments | パスとロケールを指定して、1 つのページのコメントを返します。ページ ID ではありません。Wiki.js でパスを指定する必要があるのはこの場合だけです。 |
get_comment | ID で指定したコメントを 1 つ返します。ソースとレンダリング済み HTML も含まれます。 |
create_comment | ページにコメントを投稿します。別のコメントへの返信として投稿することもできます。 |
update_comment | コメントの本文を置き換えます。 |
delete_comment | ⚠ コメントを完全に削除します。 |
list_users | Wiki のユーザーアカウントを一覧表示します。 |
search_users | 名前またはメールアドレスでユーザーを検索します。 |
get_user | 1 つのアカウントの詳細を返します。所属グループと、二要素認証が有効かどうかも含まれます。 |
create_user | アカウントを作成します。 |
update_user | アカウントの詳細またはグループ所属を変更します。 |
delete_user | ⚠ アカウントを削除します。 |
set_user_active | アカウントを有効または無効にします。 |
verify_user | アカウントのメールアドレスを認証済みとしてマークします。通常はユーザーがリンクをクリックして認証します。 |
set_user_tfa | アカウントの二要素認証を切り替えます。 |
reset_user_password | ローカルアカウントの Wiki.js 独自のパスワードリセットを開始し、ユーザーにリンクをメールで送信します。 |
list_groups | Wiki のグループと、それぞれのユーザー数を一覧表示します。 |
get_group | 1 つのグループと、そのグローバル権限、ページルール、メンバーを返します。 |
create_group | 空のグループを作成します。 |
update_group | グループ名、権限、ページルールをすべて置き換えます。部分更新ではないため、ルールを省略すると削除されます。 |
delete_group | ⚠ グループを削除します。 |
assign_user_to_group | 1 つのアカウントを 1 つのグループに追加します。他のグループへの所属はそのまま維持されます。update_user のグループ一覧に対する追加的な操作です。 |
unassign_user_from_group | 1 つのアカウントを 1 つのグループから外します。 |
get_site_info | バージョン、データベース、ホストの概要、サイト独自のタイトルと説明、およびページ、ユーザー、グループ、タグの合計数を返します。 |
list_locales | インストール済みのロケールと、デフォルトのロケールを表示します。 |
get_navigation_tree | ロケールごとに設定されたサイドバーのナビゲーションを返します。 |
list_search_engines | この Wiki が使用している検索エンジンを表示します。 |
list_api_keys | 有効期限や失効済みかどうかを含む Wiki の API キーと、API アクセスが有効かどうかを一覧表示します。 |
list_storage_targets | 設定済みのストレージバックエンド(Git ミラー、S3 バケット、ローカルファイルのダンプなど)と、同期状況および最終エラーを一覧表示します。 |
revoke_api_key | ⚠ API キーを直ちに完全に失効させます。Wiki.js には失効を取り消す方法がありません。 |
set_api_state | ⚠ Wiki.js の API 全体を有効または無効にします。 |
render_page | Wiki.js にページのソースから HTML を再生成させます。 |
flush_page_cache | Wiki 全体の Wiki.js のレンダリング済みページキャッシュを削除します。 |
rebuild_page_tree | Wiki.js がページパスから生成するフォルダー構造を再計算します。 |
rebuild_search_index | 有効な検索エンジンですべてのページを再インデックス化します。 |
purge_page_history | ⚠ Wiki 全体を対象に、指定した期限より古い保存済みページバージョンを削除します。 |
migrate_pages_locale | ⚠ Wiki 全体のすべてのページを、あるロケールから別のロケールに移動します。 |
| 完全なリファレンス(すべてのパラメーターを含む)は、 | |
| wikijs-mcp.ni-c.de/reference/tools にあります。 |
search_pages を使う前に知っておきたい 2 つのこと
Wiki.js のデフォルトの検索エンジンは、ページの内容をインデックス化しません。 「Database - Basic」
ではタイトルと説明のみが対象となるため、ページ内に書かれた語句を検索しても何も見つかりません。search_pages は現在有効なエンジンを報告し、その旨を伝えます。grep_pages はページを取得してテキストをローカルで照合するため、処理は遅くなりますが、実際に該当箇所を見つけられます。Wiki のエンジンを PostgreSQL または Elasticsearch に切り替え、rebuild_search_index を実行すれば、適切に解決できます。
update_page は、他の人による編集を上書きしません。 直前に自身が読み取った時点ではなく、あなた がページを読み取った時点と比較するため、モデルが考えている間にウェブ UI から保存された編集は、黙って破棄されずに検出されます。get_page_conflict で新しいバージョンを確認できます。force: true を指定すると、意図的に上書きします。
意図的に公開していない機能
API キーを作成するツールはありません。 Wiki.js では GraphQL 経由で作成できますが、このサーバーでは意図的に作成できないようにしています。フルアクセスキーを生成できるモデルであれば、前述の 3 つの制限メカニズムによって取り除かれた権限を、自らに付与できてしまうためです。
読み取りはパスで制限されません。 WIKIJS_ALLOWED_PATHS が制限するのは書き込みのみです。読み取りに制限を設けると、Wiki の一部が分かりにくくなるためです。ページを非表示にするには、キー自体のグループとページのルールを設定するのが適切です。これらのルールは、そのキーを使う他のすべての機能にも適用されます。
安全性
- 破壊的な操作や管理操作では、人の確認を求めます。 クライアントが MCP の確認要求に対応している場合は、モデルが代わりに応答できない実際のダイアログを表示します。対応していない場合は、最初の呼び出しで有効期間の短いトークンが返されます。このトークンは対象に厳密に紐付けられており、トークンを付けた 2 回目の呼び出しでのみ操作が実行されます。これにより、同じ引数で呼び出しが 2 回行われ、それ以上のことは行われていないと証明され、説明文にもその旨が記載されます。紐付けには、何が 操作対象になるかを決めるすべての要素が含まれます。
deからenへのmigrate_pages_localeの承認では、enからdeへの操作は実行されません。ELICITATION=falseを指定すると、意図的に代替手段が使われますが、ガードがなくなることはありません。 - 3 つのメンテナンスツールには、意図的に確認を設けていません。
flush_page_cache、rebuild_page_tree、rebuild_search_indexは、コンテンツではなく時間を消費します。何も失われない操作の前にダイアログを表示すると、内容を読まずにチェックを入れる習慣が身についてしまいます。 - 確認プロンプトに Wiki.js のコンテンツが引用されることはありません。 ページのタイトルと説明は編集権限を持つ人なら誰でも書き込め、そのテキストはモデルによって読み取られます。表示されるのは ID、パス、サーバー側の値のみです。また、パスは埋め込む前に識別子であることを確認します。
- 返されるページのコンテンツには、信頼できないデータであることが明示されます。 Wiki は、テキストを保存して後から読むための場所だからです。
- API キーを作成するツールはありません。 Wiki.js API では作成できますが、フルアクセスキーを生成できるモデルであれば、このセッションの終了後も続く管理者アクセス権を自らに付与できてしまうためです。キーの監査や取り消しができるよう、
list_api_keysとrevoke_api_keyを用意しています。 - 認証情報は起動後に環境変数から削除され、API レスポンス内のシークレットはマスキングされ、エラーボディは短縮され、HTML のエラーページは破棄されます。
WIKIJS_READ_ONLY=trueを指定すると、書き込みツールは登録されません。WIKIJS_DENY_TOOLSでは同じ方針に沿って、さらに細かく制限できます。フィルタリングされたツールは、呼び出し時に拒否されるのではなく、そもそも構築されません。
ドキュメント
完全なガイド、ツールリファレンス、安全性に関する注意事項は
wikijs-mcp.ni-c.de にあります(ソースは docs/ にあります)。
開発
npm install
npm run lint && npm run typecheck && npm run build && npm test
ユニットテストスイートでは、実際の MCP プロトコルを使って、ビルド済みサーバーを偽の
Wiki.js に対して実行するため、Wiki.js のインスタンスは不要です。npm run test:integration は別の
テストスイートで、Docker で実際の Wiki.js を起動し、すべてのツールをテストします。
アーキテクチャ図とソーシャルカードは自動生成されます。編集するのは
docs/assets/architecture.source.svg で、npm run assets を実行してください。レンダリング済みの
ファイルは編集しないでください。また、npm run docs:tools を実行すると、カタログからツールのリファレンスが再生成されます。
リリース
- CHANGELOG の項目を追加し、
package.jsonのバージョンを更新します。 npm run lint && npm run build && npm run test:coverage- コミットしてから、署名付きタグをプッシュします:
git tag -s vX.Y.Z -m "vX.Y.Z" && git push origin main vX.Y.Z
リリースワークフローでは、npm に公開し(Trusted Publishing、来歴情報付き)、CHANGELOG の該当セクションから GitHub リリースを作成し、MCP Registry のエントリーを更新します。
コントリビューション
イシュー、ディスカッション、プルリクエストを歓迎します。CONTRIBUTING.md をご覧ください。 脆弱性については、公開イシューではなく 非公開での報告 をご利用ください。ポリシーは SECURITY.md に記載されています。
ライセンス
MIT © Willi Thiel
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。