Upgrade to Pro — share decks privately, control downloads, hide ads and more …

権限は渡さない、操作だけ切り出す ― 自前MCPサーバー実践入門

権限は渡さない、操作だけ切り出す ― 自前MCPサーバー実践入門

AI社会実装勉強会第60回 (https://machine-learning-workshop.connpass.com/event/397325/) の発表資料です。

More Decks by 西岡 賢一郎 (Kenichiro Nishioka)

Other Decks in Technology

Transcript

  1. A I 社 会 実 装 勉 強 会 第

    6 0 回 権限は渡さない、 操作だけ切り出 す ― 自前MCPサーバー実践入門 西岡 賢一郎 Data Informed CEO ・ D-stats CTO ・ NOBULL AI CTO 01
  2. 0 0 — 全 体 構 成 今日の道筋 ― 「簡単」で挟んで、真ん中で折り返す

    MCPサーバーは “AIに何でも触らせる仕組み” ではなく、“渡してよい操作だけを切り出す受付窓口” 。この一軸で全体が つながります。 1 導入 結論先出し → なぜ今 → 問題提起 S1–S4 2 簡単さ 持ち帰り① MCPとは → 10行で動く → 切り出せる S5–S7 3 転換 その簡単さが、そのまま罠になる S8 4 危険の構造 指示とデータ → トライフェクタ → 1つ断つ S9–S12 5 最低限の対策 持ち帰り② read-only → 入力制限 → redaction → 再結合防止 S13–S16 6 実例 → 結び 私の構成 → 簡単さに回帰 S17–S18 00
  3. 0 1 — 今 日 の ゴ ー ル 今日、持ち帰ってほしい2つのこと

    持ち帰り ① 作るのは、 驚くほど簡単 関数にデコレータを1つ付けるだけ。 本当に10行で動きます。 ! 持ち帰り ② 無防備な導入は、 危険 10行で作れる = 10行で “機密を外に出す裏口”も作れる。 この2つは矛盾しません。「簡単」で、前後を挟みます。 02
  4. 0 2 — な ぜ 今 これは、ニッチな話ではない Claude Desktop や

    Microsoft のエージェントが急速に普及。AIと外部をつなぐ共通規格が MCP です。 1万超 公開MCPサーバー 2025年末・Anthropic報告(概数) 事実上の標準 OpenAI / Google / Microsoft が採用 中立な団体が管理する規格へ(特定企業のもので はない) もうすぐ 当然に 自分でMCPを作る それが特別なことでなくなる ※ 開発キット(SDK)は月間およそ9,700万ダウンロード規模。数字はいずれも概数・〜時点の値。 03
  5. 0 3 — 問 題 提 起 みんなが作り始める前に、握っておきたい 作れるという「自信」 10行で動く。インフラもデプロイも要らない。

    守れるという「作法」 何を見せ、何をさせないか。境界を決める。 ― この2つを、セットで。 04
  6. 0 4 — 復 習 復習:MCPは「AIの拡張口」をそろえた共通規格 2024年11月、Anthropic が公開したオープン規格。AIアプリと外部ツール・データの“つなぎ方”を1つに統一する。 ホスト(host) AIアプリ本体

    Claude Desktop・IDE など。中で MCP クライア ントを動かす。 MCPサーバー 外部ツール側 1機能=1サーバーで動く。 今日の主役はここ。 公開するもの tool & resource tool=呼べる操作(関数)/resource=読めるデー タ。 たとえると 「AIにとっての USB-C」 ― つなぎ方が1つだから、対応AIならどれからでも挿せる。 05
  7. 0 5 — そ も そ も M C P

    と は MCP=「呼べる関数」を作法どおり外に出すだけ AIエージェント Claude など read-only → MCPサーバー 同じPC内の1プロセス → リソース PC / クラウド / 端末画面 ― デプロイもインフラも要らない 同じPCでプログラムが1つ立つだけ ― 既製コネクタも中身は同じ 仕組みは変わらない ― 違いは「公開範囲を自分で決められる」こと 06
  8. 0 6 — 山 場 10行で、動く from fastmcp import FastMCP

    mcp = FastMCP("sysmon") @mcp.tool def agent_health(target: str) -> str: return check_status(target) mcp.run() ― 関数に デコレータを付けるだけ ― 型ヒントから スキーマ自動生成 ― uv run server.py で即接続 ― 検証・型変換は フレームワーク任せ 07
  9. 0 7 — 切 り 出 せ る なぜ自分で作るのか ―

    「ちょうど」に作れて、「ちょうど」に絞れる 価値① 適合 ― できる 既製では「痒いところに手が届かない」 自前なら、やりたいことを “ちょうど”の形で作れる 価値② 安全 ― 絞れる 既製は「公開範囲が広すぎる」 必要な操作だけ、 “ちょうど”の範囲で渡せる だから、自分で作る ― “できる” と “安全” は、自作で両立する。 09
  10. 0 8 — 転 換 その「簡単さ」が、 そのまま罠にな る 10行で作れる =

    10行で“機密を外に出す裏口”も作れる run_command(cmd)(何でも実行)や read_file(path)(何でも読む)のような 「全部できる便利ツール」に 流されやすい。 10
  11. 0 9 — 指 示 と デ ー タ AIは「指示」と「データ」を区別できない

    prompt injection(不正な指示の混入) 指示も、ログも、Webも ― AIには すべて同じ “読み物” 。 攻撃 者が紛れ込ませた文字列が、 “指示”として実行されうる。 どこから紛れ込む? ・ ログ ・ 端末(ターミナル)の画面 ・ メール・チャット ・ Webページ ・ ドキュメント 11
  12. 1 0 — リ ー サ ル ・ ト ラ

    イ フ ェ ク タ リーサル・トライフェクタ ― 危険な3つの条件 3つが揃った瞬間に、データは盗まれる。 ― Simon Willison が2025年に定式化 12
  13. 1 1 — 防 御 防御は ―「1つ断てば、崩れる」 3つが同時に揃って、はじめて攻撃が成立する。どれか1つを断てば、崩れる―全部を塞ぐ必要はない。 条件 ①

    データ 絞れるが、 ゼロにしにくい 条件 ② 外部入力 ほぼ、 防げない 条件 ③ 送信 ここを断つのが 現実解 13
  14. 1 2 — コ ネ ク タ へ の 答

    え 「既製コネクタでよくない?」への答え コネクタは“敵”ではない。が… SlackやGoogleドライブを「フ ル接続」すると、3つの条件が最初から組み上がる: ① 社内チャット・ファイル(機密データ) ② 誰からでも投稿・共有できる = 外部の文章が入ってくる(外部入力) ③ メッセージ送信・外部共有(外部送信) しかも“1つだけ外す”がやりにくい。 読むだけ(read-only)に絞れば ③ は消せる 。 だから、自前MCPを作る意味 ― 多くはコネクタでよい(便利さは本物) ― 自作は“ゼロから作り直す無駄”ではない ― 範囲が広すぎる時、境界を自分で選ぶ手段 ― read-onlyに絞れる = ③ を外せる 論点は「コネクタか自作か」ではない ― 3つの条件を意識しているか、だ。 14
  15. 1 3 — 対 策 ① ③を断つ ― read-only &

    固定機能 AIに「読むだけ」の道具しか渡さなければ、データを外へ送り出す手段がない。= 条件③(外部送信)が、そもそも成立しない。 ◦ 良い例 get_status(server) サーバーの状態を返すだけ。 読むだけ/できることは固定。 × 悪い例 run_shell(command) read_any_file(path) gcloud(args) docker(args) restart / deploy / 送信を入れない。これだけで ③の条件が消える。 15
  16. 1 4 — 対 策 ② 入力を絞る ― 自由入力を「選択肢」と「範囲」に縛る 対象

    = 決まった一覧から選ぶ(自由入力させない) 提供元 = AWS / GCP から選ぶ 期間 = 今日 / 今週 / 今月 から選ぶ 件数 = 上限つきの数字(最大100件 など) 自由文字列を1つ残すだけで、injectionの通り道になる。 16
  17. 1 5 — 対 策 ③ ①を薄める ― 黒塗り(redaction)&鍵を置かない 1

    返す前に、機械的に黒塗りする 「隠してね」とAIにお願いするだけでは不十分。コードで落とす。 2 認証情報(鍵)を手元に置かない 鍵は中継サーバー側へ。手元が乗っ取られても被害を最小に。 17
  18. 1 6 — 対 策 ④ 全体で“3つを再び揃えない” トライフェクタは “AI全体”の性質。自分のMCPが安全でも、別のツールや隔離環境の外向き通信で ③が復活する。

    信頼境界ごとに分ける 境界を越えて、分けた条件が再び揃わないよう設計する。 権限を見える化・監査する どのAIに何を見せ、送信能力が無効かを確かめる。 18
  19. 1 7 — 補 足 補足:私の場合 ― 3つの実例 あくまで一例。どれも「目的をひとつに絞り、読むだけに限定」しています。 sysmon

    目的 PC・サーバーが今ちゃんと動いているかを、その場 で確認したい。 セキュリティ 状態を読むだけ。再起動・デプロイは持たせない( read-only)。 cloud-cost 目的 AWS / GCP の料金を、AIに集計・説明させたい。 セキュリティ 鍵は手元に置かず中継サーバー側へ。providerは選 択肢に限定。 tmux-capture 目的 作業中のターミナル画面を、AIに要約させたい。 セキュリティ 読み取りのみ。取得する行数に上限を付ける。 「権限を渡す仕組み」ではなく、「渡してよい操作だけを切り出す受付窓口」 19