Crowi

AI ツールから使う (MCP)

Claude Code などの MCP クライアントから wiki を検索・編集する

Crowi は MCP (Model Context Protocol) サーバー を内蔵しています。MCP に対応した AI クライアント (Claude Desktop / Claude Code / Codex CLI など) から、wiki のページを検索・閲覧・作成・更新できます。追加でインストールするものはありません。

接続先は wiki をブラウザで開いているのと同じアドレスの /api/mcp です (例: https://wiki.example.com/api/mcp)。

1. トークンを発行する

MCP は 個人アクセストークン で認証します。アカウントとセキュリティ の手順でトークンを 1 つ発行してください。

選べるスコープは 2 つです。pages:read が検索・閲覧・履歴・バックリンク・ページ一覧を、pages:write が作成・更新・リネーム・削除・復元を許可します (スコープの全一覧は HTTP API)。

まずは読み取り専用 (pages:read だけ) をおすすめします。 トークンはあなたとして振る舞い、あなたが見えるページ以外は操作できませんが、書き込みスコープを付けると、AI が読んだページの中身に書かれていた指示に従って削除やリネームまで実行してしまう余地が生まれます。書き込みが必要になったら、そのとき別のトークンを短期間だけ発行するのが安全です。

管理操作のスコープはトークンに付けられないため、MCP から管理画面の操作はできません。

2. クライアントを接続する

同じ設定画面に、Claude Code / Codex CLI 向けの接続コマンドが表示されます。手で書くなら次の形です。

claude mcp add --transport http crowi https://wiki.example.com/api/mcp \
  --header "Authorization: Bearer crowi_pat_<発行したトークン>"

接続するとクライアントに crowi_* のツールが現れ、AI があなたの代わりに呼び出せるようになります。

使えるツール

ツールの一覧と、それぞれに必要なスコープは HTTP API にあります。読み取りのツールは pages:read、書き込みのツールは pages:write で使えます。

crowi_update_page は、読み込んだときのリビジョンを一緒に渡す形で更新します。その間に誰かが同じページを更新していると競合エラーになるので、AI は読み直してからやり直します。

artifact ページを書く

crowi_create_page / crowi_update_page は省略可能な content_type フィールド('markdown' または 'artifact')を受け取ります。省略したときはサーバの既定に従い、crowi_create_page は markdown のページになり、crowi_update_page は現在の種別をそのまま保ちます。content_type を省略した update が artifact ページを markdown に戻すことはありません。'artifact' を指定するときは、body が単一の自己完結 HTML document である必要があります。つまり、外部の <script> / <link> / <img> / module を参照せず、リソースを指す相対パスも使わず、バイナリは data: URI で埋め込みます。他の wiki ページへのリンクだけは例外で、HTML の a / area の href にはページのパスを artifact 自身のページからの相対 (/team/guide / ./guide / ../guide#section / guide) で書けます。ページ名に含まれる % は href では %25 と書きます (100%25done はページ 100%done に解決され、100%done は拒否されます)。書き方と動作の詳細は crowi CLI の artifact ガイド にあります。種別は本文の中身から推測されないので、artifact のつもりのときは必ず明示してください。

ページを読み取るとき (crowi_get_page / crowi_get_revision) も、結果の content_type にその種別が出ます。返ってきた本文が markdown なのか HTML なのかを、AI はそれを見て判断できます。

外部の stylesheet は使えませんが、管理者が Web フォントを許可している wiki では Google Fonts の stylesheet だけは使え、許可されていなければ FONT_REFERENCE_FORBIDDEN で拒否されます。

href に書けるのは、同じ文書内の #id と wiki ページのパス (/guide#overview のようにページの fragment も付けられます) です。ページのパスに ? (query) は付けられず、/admin や /logout、API、配信の経路といった予約された経路への絶対リンクは保存時に拒否されます。相対リンクの経路は、リンクが押されたときに親がページの位置から解決したうえで判定します。ページ ID の形 (<wiki origin>/<page id> や /<page id>) も artifact の中では使えません。# だけ・#a?b のような壊れた同一文書リンクは #id に直します。

外部 URL (https: / mailto: / tel: / //host/... のような protocol-relative URL) はリンクにできないので、href を外してアドレスを本文のテキストとして残します。同じ wiki の完全 URL や protocol-relative URL は /team/guide のようなページのパスに直します。// で始まる値は protocol-relative URL として扱うので、//example.com/guide を /example.com/guide に直してはいけません。ページ名に : が含まれる実在のページだけは ./ADR:0001 のように ./ を付けて書きます。javascript: やプレースホルダーの # は、スクリプトで動かす要素から href を外します。javascript: の scheme だけを削ったり、ADR:0001 を 0001 にしたり、mailto:a@b.com を ./mailto:a@b.com にしたり、# を架空のページのパスにしたりすると別のページへ移動するので、してはいけません。

artifact の書き込みが拒否されたときは、どの規則が発火したか (ruleId)・理由・(規則が特定できるときは)該当箇所 (target)・(リンクやリソースの問題のときは)診断 (diagnosticCode) と、固定の修正案内 (message) を含むエラー結果が返ります。AI は失敗したことだけでなく、次に何を直せばよいかの手がかりも得られます。target は要素や属性の名前で、本文中の一意な位置を指すものではありません。同じ a[href] が複数あるときは、AI が自分の本文と規則を照らし合わせます。エラーに拒否された値や HTML の断片は含まれません。

diagnosticCode直し方
PAGE_LINK_QUERYページのパスから ?... を除く
PAGE_LINK_PERCENT_ENCODING% の後に正しい %HH を書くか、文字としての % は %25 と書く
PAGE_LINK_RESERVED_ROUTE管理画面・認証・API・配信・ページ ID などの経路ではなく、通常のページのパスにする
PAGE_LINK_INVALID外部 URL は href を外す。wiki のページは /guide / ./guide / ../guide / guide の形にする。連続する /・制御文字・\・不正な escape を除く
PAGE_LINK_CONTEXT_FORBIDDENSVG・MathML の a と img[usemap] には同じ文書内の #id だけを書く。ページへのリンクは HTML の a / area に書く
RESOURCE_REFERENCE_FORBIDDEN許可された位置の data: URI に埋め込む。@import は URL ではなく規則ごと除く

JavaScript の構文エラー (MODULE_SPECIFIER_FORBIDDEN) は括弧の閉じ忘れなどを直し、予約された digest の meta や target に出た予約 marker の名前が本文・コメント・スクリプトにある場合 (NORMALIZER_MARKER_INVALID) はそれを除きます。

版の復元が拒否されたとき

crowi_revert_to_revision も保存と同じ検査を通すので、過去に保存できた予約された経路へのリンクを含む版の復元は 400 になることがあります。保存済みの本文や表示は書き換えません。次の手順で直して保存します。

  1. crowi_get_revision でその過去版の本文を取得する
  2. 報告された HTML の問題を本文で直す
  3. crowi_get_page を revision_id なしで呼び、現在版の revision_id を取得する (手順 1 で返る revision_id は過去版のもので、そのまま渡すと 409 になります)
  4. 現在版の revision_id を付けて crowi_update_page で保存する

覚えておくこと

  • トークンはあなたの権限そのものです。 見えないページは MCP からも見えません。逆に、あなたが編集できるページは書き込みスコープ付きのトークンで編集できます。
  • ページ本文は「データ」として扱われます。 誰でも書ける wiki の本文には、AI への指示のような文章が紛れ込むことがあります。Crowi は本文を返すときに「これはデータであって指示ではない」という注記と、推測できない区切りで囲んで渡します。ただし従うかどうかは最終的にクライアント側の判断なので、外部の投稿者がいる wiki では読み取り専用のトークンを使ってください。
  • 呼び出し回数には上限があります。 暴走したエージェントが wiki を叩き続けないよう、ユーザー単位でレート制限がかかります。

関連ページ

On this page