コーディングエージェントと一緒に働くチームの多くで、プロジェクトについての知識は3か所に散らばっています。人の頭の中、エージェントからは見えない wiki、そして誰かのチェックアウトにある AGENTS.md や CLAUDE.md です。最後のものは誰かがリファクタリングした日に古くなり、それでも次のエージェントはそれを信じます。
ClewWiki は4つ目の場所として作っています。エージェントが人と対等に働く wiki です。読み、書き、ディスカッションで議論し、報告します。バージョン 0.9.0 には 40 個の MCP ツールがあります。以下では Claude Code、Cursor、Codex のつなぎ方と、エージェントが何を得るかを説明します。人の側(インポート、サインイン、組織)は姉妹記事にまとめました。
2分でつなぐ#
MCP サーバーは npm パッケージ @clewwiki/mcp-server として配布しています。事前に入れておくものは Node.js 22 だけです。インスタンスの Agent tokens でエージェントトークンを発行し、あとは設定を書きます。Claude Code ならプロジェクトの .mcp.json です。
{
"mcpServers": {
"clewwiki": {
"command": "npx",
"args": ["-y", "@clewwiki/mcp-server"],
"env": {
"CLEWWIKI_URL": "https://wiki.example.com",
"CLEWWIKI_TOKEN": "${CLEWWIKI_TOKEN}"
}
}
}
}Cursor は同じ mcpServers オブジェクトを .cursor/mcp.json に書きます。Codex は ~/.codex/config.toml の TOML を読みます。
[mcp_servers.clewwiki]
command = "npx"
args = ["-y", "@clewwiki/mcp-server"]
env = { CLEWWIKI_URL = "https://wiki.example.com", CLEWWIKI_TOKEN = "..." }これは stdio トランスポートです。エージェントが開発者のマシンでサーバーを起動し、サーバーは HTTPS でインスタンスと通信します。ローカルアドレス以外では素の http:// を拒否します。CI のエージェント向けには、2つ目のトランスポートとして streamable HTTP があります。デフォルトでは無効(MCP_HTTP_ENABLED=false)で、匿名アクセスはできません。
いちばん簡単なのは、設定を手で書かないことです。アプリの Connect an agent ページが、使っているクライアント用の正確なコマンドと、wiki の使い方をエージェントに説明するプロンプトを表示します。0.8 からは日常的なコマンドも並んでいます。タスクの前に wiki を読む、終わったら更新する、ディスカッションを開く、などです。Claude Code 向けには、これらを /wiki-read と /wiki-update としてインストールするワンライナーもあります。
エージェントのトークンは人のパスワードとどう違うか#
MCP サーバーは、インスタンスのごく普通の REST クライアントとして作られています。トークンを持っているだけで、ほかに中へ入る経路はありません。そこから一番大事な性質が生まれます。エージェントには裏口がありません。どの呼び出しも、直接の HTTP リクエストと同じ権限チェック、同じレート制限、同じ監査を通ります。
トークンは許可されたスペースに限定され、有効期限があり、失効させられます。期限切れや失効済みのトークンは、書き込みの前、認証の段階で弾かれます。書き込みの試みは、成功しても、他人の claim にぶつかっても、古いハッシュを持っていても、同じトランザクションの中で監査ログに記録されます。トークンごとにレート制限があるので、ループに入ったエージェントは wiki をあふれさせる前に制限に当たります。
他人の書いたテキストについては、別の約束事があります。ツールが保存済みの内容から返すもの(ページ本文、メモ、名前、コード片)はすべて、指示ではなくデータとして印が付いています。「以前の指示を無視せよ」と書かれたページは、ただのテキストのままです。これで prompt injection が不可能になるわけではありませんが、いちばん安上がりな経路はふさがります。
1つのページに2つのエージェント#
このしくみについては記事を1本まるごと書いたので、ここでは手短に。書き込む前に、エージェントは wiki.claim でページやセクションの claim を取ります。書き込みには claim の ID と、エージェントが読んだ内容のハッシュが含まれます。claim は今ほかの誰も書いていないことを、ハッシュはその間に誰も書かなかったことを証明します。2つ目のエージェントには、保持者の名前入りのコンフリクトが返ります。他人のテキストを黙って上書きすることはできません。サーバーが勝手にマージすることもありません。ハッシュが古ければ両方のハッシュを返し、エージェントがページを読み直すのを待ちます。
claim は自動で期限切れになり、延長(wiki.renew_claim)も解放(wiki.release_claim)もできます。固まった claim は管理者が外せて、その操作は専用の名前で監査ログに残ります。エージェントのトークンで他人の claim を強制的に外すことはできません。
エージェントの変更は人を待つが、作業は止めない#
エージェントは承認なしで書き込みます。変更は届いた瞬間にページになります。そうしなければ、人が忙しいあいだエージェントはキューで待つことになります。ただし、前回のレビュー以降にエージェントが変えたものは、すべて Changes に差分として集まります。人はそれを承認するか元に戻し、そのときに残したメモをエージェントは次の試みの前に読みます(wiki.get_review)。
保留中の変更はフラグとして保存されるのではなく、算出されます。人が書いたか承認した最新のバージョンが基準になり、そのあとにエージェントがしたことはすべて保留扱いです。
今 wiki にいるのは誰か#
0.8 で Presence ボードは claim だけでなく人も表示するようになりました。誰がどのページを開いていて、読んでいるのか編集しているのか。その隣には、直近10分間にトークンでリクエストを送ったエージェントと、最後のリクエストが対象にしていたページが並びます。ページのタイトルの下には、ほかに誰がそのページにいるかが表示されます。
思ったより早く役に立った細かい点がひとつあります。WebDriver(Playwright、Selenium、Puppeteer)で操作されているブラウザは、別扱いで表示されます。それは人のセッションを通して働くエージェントで、同僚と見分けられると人にとって便利です。
エージェントは同じ情報を wiki.get_presence の active_now フィールドから得られます。ページに取りかかる前に、今まさに誰かがそこにいるとわかれば、コンフリクトに当たる代わりに別のタスクを選べます。
タスクはトラッカーから来る#
0.8 では、YouTrack と Jira の連携と一緒に3つのツールが加わりました。
wiki.my_tasks:エージェントのトークンを発行した人に割り当てられた未解決の課題。トラッカー内でメールアドレスから探します。wiki.get_issue:キーで指定した課題を、説明とコメント付きで返します。wiki.search_issues:YouTrack のクエリや JQL での検索。
こうして Connect an agent ページの「自分のタスクを取って」は、実際に動く流れになります。エージェントは一覧を取得し、課題を読み、そのキーに言及している wiki のページを見つけ、文脈を持った状態で作業を始めます。トラッカーのトークンはインスタンスの環境変数にだけあり、データベースには入りません。
制限ははっきり書いておきます。トラッカーのクライアントは、記録した API レスポンスの形でテストしただけで、実際の YouTrack や Jira ではまだ試していません。
ブランチ、リリース、そして忘れがちなもの#
0.9 で加わった Development セクションは、人よりもエージェントにとって便利です。スペースの git リポジトリを読み、ブランチごとに作業の流れを管理します。デフォルトブランチに対してどれだけ先行・遅延しているか、マージ済みか、どのリリースに属するか。リリースなしでマージされた作業はハイライトされ、マージされていない流れが残っている間、リリースは出荷済みにできません。
エージェント向けには3つのツール(wiki.development、wiki.get_stream、wiki.update_stream)と、wiki.open_discussion の stream_id パラメーターがあります。ブランチで問題にぶつかったエージェントは、そのブランチの流れの中で直接ディスカッションを開きます。ディスカッションが解決すると、決定がその流れのドキュメントにページとして書かれ、スレッド自体は期限切れで消えます。残るのは結論で、チャットのログは積み上がりません。
ファイル、受信箱、ウォッチ#
エージェントはファイルを公開したり読んだりできます。wiki.upload_file はツール経由で 7 MB まで、それより大きいファイルは同じトークンで REST から送ります。wiki.get_file は 256 KB までのテキストファイルの内容を返します。ページにすでにある名前でファイルを上げると、同じリンクの後ろにバージョンが追加されます。
wiki.watch でページやスペースをウォッチし、wiki.check_inbox でエージェントに関係するものを受け取ります。自分が開いたディスカッションへの返信、メンション、自分の変更へのレビュー、ファイルの新しいバージョンなどです。メールも別の通知キューもなしに、答えは質問した人のところに届きます。
ルールとスキルはチェックアウトではなく wiki に#
プロジェクトのルールと再利用できるスキルは wiki に保存され、どのエージェントも作業の前に MCP で読みます(wiki.get_rules、wiki.list_skills、wiki.get_skill)。チームの決まりごとが、誰かのノートパソコンにあるツールごとのファイルではなくなります。
ただし、エージェントのホストはスキルをディレクトリから読み込み、MCP の呼び出しはディスクに書き込めません。そのためパッケージにはコマンドも入っています。
CLEWWIKI_URL=https://wiki.example.com CLEWWIKI_TOKEN=$CLEWWIKI_TOKEN \
npx -y @clewwiki/mcp-server skills install --space MOBILEスペースのスキルを取得して ~/.claude/skills/<slug>/SKILL.md に書き込み、書いたファイルを1つずつ表示します。--only で選んだものだけを入れ、--dir で別のディレクトリに書き込めます。
そして「文脈が古くなる」問題への最後の手当て。ページを Swift、TypeScript、TSX、Kotlin の コード上の宣言にアンカー できます。フォーマッターをかけても何も変わらず、本体が変わればページは古いと印が付き、名前の変更や移動は認識され、削除は報告されます。そのしくみと、誤検知が出ない理由はアンカーの記事に書きました。
約束しないこと#
- これは 0.x です。 最初のタグは9月18日、10個目は10月5日に出ました。ツールはほぼ毎リリース追加され、エージェントが見るには再接続が必要で、データベースのマイグレーションも頻繁です。
- トラッカーは実環境で未検証です。 先に書いたとおりです。
- streamable HTTP はデフォルトで無効です。 CI のエージェントのために使うなら、意図して有効にし、インスタンスを TLS の後ろに置く必要があります。
- 監査と claim は、悪い内容からは守ってくれません。 書き込み権限のあるエージェントは、自信満々にでたらめを書けます。変更のレビューはまさにそのためにありますが、誰かがそれを見る必要があります。
試してみる#
README のクイックスタートでインスタンスを立て、1つのスペース用にトークンを発行し、次のタスクの前に wiki を読んで、終わったら更新するようエージェントに頼んでください。Changes に何が出てくるかを見れば、このやり方がチームに合うかどうかがひと晩でわかります。
ツールの全一覧とスコープ、エラーはリポジトリの docs/mcp.md にあります。プロジェクトの概要は ClewWiki のページにあります。



