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

OCHaCafe S11 #1 CloudNativeなMCPサーバーのための基礎知識

Avatar for oracle4engineer oracle4engineer PRO
February 04, 2026

OCHaCafe S11 #1 CloudNativeなMCPサーバーのための基礎知識

Avatar for oracle4engineer

oracle4engineer PRO

February 04, 2026
Tweet

Video

More Decks by oracle4engineer

Transcript

  1. Agenda 3 Copyright © 2026, Oracle and/or its affiliates 1

    2 3 4 5 6 MCPとは MCPサーバーのスケーラビリティ MCPでの認可 MCPサーバーのObservability デモ まとめ
  2. MCPのアーキテクチャ ホスト・クライアント・サーバーの3つの登場人物がいる 7 Copyright © 2026, Oracle and/or its affiliates

    MCPクライアント MCPサーバー MCPホスト(Claude Desktopなど) MCPでやりとり LLM LLMとやり取りす るのはMCPホスト
  3. MCPのアーキテクチャ(レイヤー) データ層とトランスポート層の2層構造 データ層 • JSON-RPCでメッセージのやり取りを行う • MCPサーバーの機能 • Tools •

    Resources • Prompts • MCPクライアントの機能 • Roots • Sampling • Elicitation などを定義している(詳細は後述します) トランスポート層 • JSON-RPCのメッセージをどのようにやり取りするか を定義する • 標準入出力でやり取り • Server Sent Eventsでやりとり(2024-11-05まで) • Streamable HTTPでやり取り(以降) などを定義している(詳細は後述します) 8 Copyright © 2026, Oracle and/or its affiliates
  4. MCPのデータ層 クライアント・サーバー間のメッセージのフォーマット、JSON-RPC 2.0 JSON-RPCは、Remote Procedure Callを実現するプロトコルの一つ。 REST APIの方が聞き馴染みがあるが、JSON-RPCだと非対称な通信路でも使える • REST

    API : リクエストとレスポンスは同一コネクション • RPC: idでリクエストとレスポンスを紐づけるので、同一コネクションである必要はない 9 Copyright © 2026, Oracle and/or its affiliates Server Sent Events Streamable HTTP
  5. MCPのデータ層 クライアント・サーバー間のメッセージのフォーマット、JSON-RPC 2.0 10 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー JSON-RPC 2.0 MCPの仕様 (メソッドなど) JSON-RPC 2.0 MCPの仕様 (メソッドなど) *JSON-RPC 2.0では、jsonrpc, id, method, paramsなどのフィールドが定義されているが、その中に何がくるのかまでは定 義されていない MCPは、その中(例えばmethodの中)にどういう名前が入るかなどを定義している *https://www.jsonrpc.org/specification
  6. MCPのトランスポート層 標準入出力 • MCPクライアントとMCPサーバーを同じマシン上で 実行する場合に使用する • 基本的に認可などが不要なので非常に手軽に利用で きる • MCPクライアントのサブプロセスとしてMCPサー

    バーを起動する Streamable HTTP • リモートのMCPサーバーを利用する場合に使用する • MCPは、サーバー起点でクライアントに通信を開始 する場合がある • しかし通常のHTTPでは、常にクライアント起点の通 信しかできない • HTTPの拡張仕様で、サーバー起点の通信もできるよ うにしたものがStreamable HTTP 11 Copyright © 2026, Oracle and/or its affiliates MCPクライ アント MCP サーバー 標準入力 標準出力
  7. MCPサーバーのプリミティブ 3つの機能がある • Tools • LLMがアクティブに呼び出せる関数 • データベースへの書き込み、外部APIの呼び出し、ファイル変更など • Resources

    • LLMに追加のコンテキストを与える機能(RAGのためのデータ供給源を提供) • サーバーにあるファイルの内容 • データベースのデータ • ドキュメント など • Prompts • LLMがToolsやResourcesを上手く扱えるようにするためのプロンプトを提供する機能 • ToolsやResourcesの呼び出しをユースケース単位でテンプレート化しておく • 正しくツール呼び出しが行われるようなプロンプトをあらかじめ用意しておく - Issueを作成してからPR作成して など 12 Copyright © 2026, Oracle and/or its affiliates
  8. Tools 利用の流れ1 まずはLLMにどんなツールがあるかを教えてあげる 14 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー どんなツールがあ りますか? LLM tools/list MCPホスト
  9. Tools 利用の流れ1 まずはLLMにどんなツールがあるかを教えてあげる 15 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト こんなツールがあ ります レスポンスを返す • 足し算ツール • 掛け算ツール
  10. Tools 利用の流れ1 まずはLLMにどんなツールがあるかを教えてあげる 16 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト このMCPサーバー にはこんなツール があるみたいです プロンプトにツール リストを入れる • 足し算ツール • 引数1と引数2を足します • 掛け算ツール • 引数1と引数2をかけます ※LLMと直接やり取りするのはMCPホスト
  11. Tools 利用の流れ2 LLMがツール実行を行う 17 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト この足し算ツール 使いたいな… Tool Useで指示 • 足し算ツール • 引数は1と2
  12. Tools 利用の流れ2 LLMがツール実行を行う 18 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト 足し算ツールの実 行をお願いします LLMからの要求をみてMCPクライアントを呼び出す
  13. Tools 利用の流れ2 LLMがツール実行を行う 19 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト 足し算ツールの実 行をお願いします tools/call • 足し算ツール • 引数は1と2
  14. Tools 利用の流れ2 LLMがツール実行を行う 20 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト 足し算ツール実行 ね。 終わりましたよ レスポンスを返す • 足し算ツールの結果 • 3
  15. Tools 利用の流れ2 LLMがツール実行を行う 21 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト Tool Aの実行が終わ りました。結果は これです。 結果をプロンプト で返す [Tool結果] 1+2 = 3
  16. Tools 注意点 • ツールリストは、MCPホスト起点でLLMに教えてあげる必要がある • ツールリストを与えないと、そもそもLLMはMCPサーバーの存在を知らない • ツール実行の結果をどのようにLLMに伝達するかは、MCPホストの実装次第 • LLMはあくまで入力された自然言語に対して、尤もらしい自然言語を出力するだけ

    • LLMは無邪気にTool実行を要求するため、危険度の高いToolの扱いには注意が必要 • シェルが実行できるToolを提供するなら、操作できる範囲はクライアントかサーバー側で定めておく • データベース操作ができるToolを提供するなら、クエリの安全性はクライアントかサーバー側で定めておく • そもそもサンドボックス環境(VM, コンテナ)でしか利用しない など 22 Copyright © 2026, Oracle and/or its affiliates
  17. Tools やり取りされるJSONスキーマ(tools/list) リクエスト レスポンス 23 Copyright © 2026, Oracle and/or

    its affiliates この結果をLLMにど う伝えるかはクライ アント次第
  18. Tools やり取りされるJSONスキーマ(tools/call) リクエスト レスポンス 24 Copyright © 2026, Oracle and/or

    its affiliates この結果をLLMにど う伝えるかはクライ アント次第
  19. Resources LLMに追加のコンテキストを与える 四つのメソッドがある • resources/list • リソース(URI)のリストを提供する • resources/templates/list •

    リソーステンプレート(こういうパターンのURIはいけますよ)のリストを提供する • resources/read • リソースの内容を提供する • resources/subscribe • リソースの変更を監視する機能を提供する 25 Copyright © 2026, Oracle and/or its affiliates
  20. Tools 利用の流れ2 どういうリソースがあるかを把握する 26 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト どんなリソースが ありますか? resources/list もしくは resources/templates/list
  21. Tools 利用の流れ2 どういうリソースがあるかを把握する 27 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト どんなリソースが ありますか? resources/list もしくは resources/templates/list • resource/listの場合は、実際のリソースの URIのリストが返る • file:///logs/error.txtなど • resouces/templates/listの場合は、URIのテ ンプレートリストが返る • file:///logs/{date}.txtなど • {date}に値を埋めればいいことがわか る
  22. Tools 利用の流れ2 どういうリソースがあるかを把握する 28 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト こんなリソースが あります レスポンスを返す • file///logs/error.txt • エラーのログ • file///logs/hello.txt • 挨拶のログ
  23. Resources 利用の流れ2 ユーザーがリソースを要求する 30 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト エラーログを分析して欲しいな。 File://logs/error.txtが欲しいです MCPクライアントを呼び出す
  24. Resources 利用の流れ2 ユーザーがリソースを要求する 31 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト File://logs/error.txtが欲しいです resouces/read
  25. Resources 利用の流れ2 ユーザーがリソースを要求する 32 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト どうぞ logs/error.txtの 内容を返す
  26. Resources 利用の流れ2 ユーザーがリソースを要求する 33 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト 内容はこれです エラーを分析して [Resource] logs/error.log [Content] エラー発生 プロンプトで伝える
  27. Resources 利用の流れ2 ユーザーがリソースを要求する 34 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト 分析結果です
  28. Resources 利用の流れ3 ユーザーもしくはMCPホストがリソースを要求する(自動で要求するかは実装による) 35 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト logs/hello.txtに変更 があったら都度教 えてください MCPクライアントを呼び出す
  29. Resources 利用の流れ3 ユーザーもしくはMCPホストがリソースを要求する(自動で要求するかは実装による) 36 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト logs/hello.txtに変更 があったら都度教 えてください resouces/subscribe
  30. Resources 利用の流れ3 サブスクライブしたリソースに変更があった時 38 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト logs/hello.txtの内容 変わったよ notifications/resources/updated
  31. Resources 利用の流れ3 サブスクライブしたリソースに変更があった時 39 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト logs/hello.txtの内容 変わったらしいで す コールバック関数でMCPクライアントから通知を受け取る
  32. Resources 利用の流れ3 サブスクライブしたリソースに変更があった時 40 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト logs/hello.txtの内容 を教えてください MCPクライアントを呼び出してリソースの内容を確認する
  33. Resources 利用の流れ3 サブスクライブしたリソースに変更があった時 41 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト logs/hello.txtの内容 を教えてください resources/read
  34. Resources 利用の流れ3 サブスクライブしたリソースに変更があった時 42 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト どうぞ レスポンス
  35. Resources 利用の流れ3 サブスクライブしたリソースに変更があった時 基本的には裏側で勝手に行われるので、ユーザーが気づくことはない 43 Copyright © 2026, Oracle and/or

    its affiliates MCPクライアント MCPサーバー LLM MCPホスト レスポンス MCPクライアントが受け取った結果を受け取る
  36. Resources 注意点 • サーバー起点の通信が発生する(これが純粋なHTTPではMCPを使えない理由) • Notificationという通信(メソッド)は返信する必要がない(返信しようがない) • JSON-RPCではリクエストIDを見て適切なレスポンスを返すが、NotificationにはリクエストIDがないため • 一方的に送りつけるだけで良い情報に使われる

    • 今回のリソースのサブスクライブも返信が不要(返信する意味がない) • サブスクライブしていても、変更の通知と同時に内容が送られてくるわけではない • 内容が知りたければresources/readを呼び出す 44 Copyright © 2026, Oracle and/or its affiliates
  37. Prompts なんのための機能か 有用なToolsやResourcesを実装しても、以下のような問題がある • MCPサーバーに接続しても、何をどう聞けば利用できるかがよくわからない • うまくToolやResourceを使えるようなプロンプトを毎回書くのは大変 • ベストな使い方はサーバー開発者がよく知っているはずだが、利用者(クライアント)はそれを知らない 46

    Copyright © 2026, Oracle and/or its affiliates そのMCPサーバーの機能をうまく利用できるプロンプトを サーバー開発者側が用意して、提供する仕組み プルリクエストの説 明をして欲しいな… スラッシュコマンドで プロンプトを呼び出し 必要な引数を入 れるだけ
  38. Prompts 利用の流れ1 MCPサーバーにプロンプトのリストを要求する 47 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト どんなプロンプト がありますか? prompts/list
  39. Prompts 利用の流れ1 MCPサーバーにプロンプトのリストを要求する 48 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト これです レスポンス
  40. Prompts 利用の流れ1 MCPサーバーにプロンプトのリストを要求する 49 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト MCPホストにプロンプトリストを渡す
  41. Prompts 利用の流れ2 ユーザーがスラッシュコマンドなどでプロンプトを利用する 51 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト スラッシュコマンドで プロンプト呼び出し (引数が必要であれば 埋める) MCPクライアントにプロンプト要求
  42. Prompts 利用の流れ2 ユーザーがスラッシュコマンドなどでプロンプトを利用する 52 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト サーバーにリクエスト 送信 prompts/get
  43. Prompts 利用の流れ2 ユーザーがスラッシュコマンドなどでプロンプトを利用する 53 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト レスポンス プロンプトをレンダリング (引数を埋めて完成させ る)
  44. Prompts 利用の流れ2 ユーザーがスラッシュコマンドなどでプロンプトを利用する 54 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト 受け取ったプロンプト を送信
  45. Prompts 利用の流れ2 ユーザーがスラッシュコマンドなどでプロンプトを利用する 55 Copyright © 2026, Oracle and/or its

    affiliates MCPクライアント MCPサーバー LLM MCPホスト 推論結果を返す (ここにTool呼び出しなどが含 まれる)
  46. ここまでのまとめ • Tools • LLMがアクティブに呼び出せる関数 • データベースへの書き込み、外部APIの呼び出し、ファイル変更など • Resources •

    LLMに追加のコンテキストを与える機能(RAGのためのデータ供給源を提供) • サーバーにあるファイルの内容 • データベースのデータ • ドキュメント など • Prompts • LLMがToolsやResourcesを上手く扱えるようにするためのプロンプトを提供する機能 • ToolsやResourcesの呼び出しをユースケース単位でテンプレート化しておく • Resources Aの内容を読んで、Tool A, Tool Bを呼び出す など 57 Copyright © 2026, Oracle and/or its affiliates
  47. MCPのトランスポート層 標準入出力 • MCPクライアントとMCPサーバーを同じマシン上で 実行する場合に使用する • 基本的に認可などが不要なので非常に手軽に利用で きる • MCPクライアントのサブプロセスとしてMCPサー

    バーを起動する SSE or Streamable HTTP • リモートのMCPサーバーを利用する場合に使用する • MCPは、サーバー起点でクライアントに通信を開始 する場合がある • しかし通常のHTTPでは、常にクライアント起点の通 信しかできない • HTTPの拡張仕様で、サーバー起点の通信もできるよ うにしたものがStreamable HTTP 60 Copyright © 2026, Oracle and/or its affiliates MCPクライ アント MCP サーバー 標準入力 標準出力 リモートMCPサーバーの場合はこっち
  48. Server Sent Events (SSE) サーバーからクライアントへ一方向のPush通信を行うための仕組み MCPのバージョン2024-11-05までで、リモートMCPサーバーのトランスポート層で使われていた • HTTPでは1リクエストに対して1レスポンスが原則で、都度コネクションを閉じる • SSEでは、レスポンスを分割することでコネクションを閉じないようにする

    • コネクションが閉じないので、サーバーからPush通信が行える • クライアントのリクエストは完了しているので、クライアントからは新たにコネクションを作成しないと送れない MCPでの使われ方 • サーバーは二つのエンドポイントを用意 • SSE用のエンドポイント(このコネクションでクライアントに返答する) • クライアントのメッセージ受け取りエンドポイント • クライアントは以下の手順 • 最初にSSE用のエンドポイントに接続し、コネクションを張る • リクエストはメッセージ受け取りエンドポイントに送る • レスポンスはSSEコネクションから受け取る 61 Copyright © 2026, Oracle and/or its affiliates
  49. Server Sent Event のMCPでの使われ方 62 Copyright © 2026, Oracle and/or

    its affiliates 最初に確立したSSEコネク ションを使ってレスポンス メッセージ受け取りエンド ポイントを教える (HTTP的にはこのレスポン スは一部) 教えてもらったメッセージ 受け取りエンドポイントに メッセージを送信 ※リクエストとレスポンスでコネ クションが異なるため、JSON RPC メッセージのIDで結びつける
  50. Server Sent Eventsの問題点 • 接続が切れると状態が失われる • SSEでは、最初に開いたコネクションで通信を判断する • 接続が切れて新たにコネクションが張られると、以前のコネクションとの紐付けができず、状態(リソースの サブスクライブなど)が失われる

    • スケーリングに弱い • 接続してきたクライアント数分のSSE接続を常時確立する必要がある • 接続数が増えるほど当然パフォーマンスは低下する • FaaSなどでは使いにくい(SSEコネクションを維持できないため) 63 Copyright © 2026, Oracle and/or its affiliates
  51. Server Sent Eventsの問題点 • 接続が切れると状態が失われる • SSEでは、最初に開いたコネクションで通信を判断する • 接続が切れて新たにコネクションが張られると、以前のコネクションとの紐付けができず、状態(リソースの サブスクライブなど)が失われる

    • スケーリングに弱い • 接続してきたクライアント数分のSSE接続を常時確立する必要がある • 接続数が増えるほど当然パフォーマンスは低下する • FaaSなどでは使いにくい(SSEコネクションを維持できないため) 64 Copyright © 2026, Oracle and/or its affiliates 新旧コネクションの紐付けを 行って、必要な時だけSSEを使 えばいいのでは…?
  52. Streamable HTTP • セッションIDを使ってセッションを管理 • 必要な時だけSSE接続を確立する(単一のHTTPエンドポイントで完結する) • エンドポイントは一つ(/mcp) • GETするとSSEコネクションを作成

    • POSTでメッセージの送信 65 Copyright © 2026, Oracle and/or its affiliates GET POST クライア ント サーバー クライア ント サーバー GET /mcp SSEストリーム開始 POST /mcp 単発 or SSE サーバーは必要に応じ てSSEを使用 SSEを使う場合はこの セッションがSSEになる GETで呼び出された時は SSEストリームを開始
  53. Streamable HTTPにおけるGETとPOSTの違い 特定のリクエストに紐づくか否かで異なる 特定のリクエストに紐付かない場合(GET) • リソースのサブスクライブなど • あらかじめSSEセッションを開く必要があるため、 GETであらかじめ開いておく 66

    Copyright © 2026, Oracle and/or its affiliates クライア ント サーバー GET /mcp (SSEセッション開始の合図) 以降は通知などに使う 特定のリクエストに紐づく場合(POST) • 長時間かかるツールの進捗など • 紐づいているリクエストをSSEで返す • そのセッションをSSEにする クライア ント サーバー POST /mcp 200 OK (SSE開始) 進捗送信① このセッション をSSEに使う
  54. Streamable HTTPでのSSE接続の使い分け サーバー起点のリクエストや通知が必要か否か SSEが必要な場合 • 長時間かかるツールの進捗 • リソースのサブスクライブなど • サーバー起点のリクエストや通知が必要な場合

    通常のHTTPで十分な場合 • すぐ終わるツール実行 • プロンプトのレンダリングなど • サーバー起点のリクエストや通知が不要な場合 67 Copyright © 2026, Oracle and/or its affiliates クライア ント サーバー POST 重いツール実行など 200 OK (SSE開始) 進捗送信① クライア ント サーバー POST ツール実行など 200 OK 重いツール実行 だからSSEで進捗 報告しよう 軽いツール実行 だからSSEは不要
  55. Streamable HTTPのセッション管理 以下のような情報をステートとして管理する必要がある • セッションID • MCPの初期化フェーズでやり取りした情報 • プロトコルバージョン •

    Capabilities • MCPの動作フェーズでやり取りした情報 • サブスクライブ中のリソース • サーバーからクライアントへの通知用SSE接続 • 進行中のリクエストの対応関係 68 Copyright © 2026, Oracle and/or its affiliates
  56. MCPサーバーを水平スケールする際に発生する問題 MCPサーバーを水平スケールすると、リクエストがどのPodに割り振られるかはロードバランサに委ねられる この場合、以下の解決策が思いつく • スティッキーセッションを使って同じPodにルーティングする • ステートをすべて外部に外だしして、どのPodにルーティングされても問題ないようにする しかしこれらの解決策にはそれぞれ問題がある • スティッキーセッション

    • MCPではセッションをMcp-Session-Idヘッダーで管理するが、LBがこのヘッダーに応じてルーティングする必要 がある • 多くのMCPクライアントではCookieが利用できないので、Cookieベースのルーティングができない • ステートを全て外部に外だし • 現状、セッション情報を外部に外だしする機能があるフレームワークは確認できなかった • 全て自前で実装する必要がある 69 Copyright © 2026, Oracle and/or its affiliates 現状、水平スケールするMCPサーバーは ステートレスに作るのが最も簡単
  57. MCPサーバーをステートレスに構成するとできること・できないこと 基本的にはMCPはステートレスのため、大体の機能は利用できる 利用できる機能 • ツール呼び出し • リソース要求 • プロンプト要求 利用できない機能

    • Sampling(MCPサーバーがクライアント背後のLLMを呼び出す機能) • Elicitation(MCPサーバーがユーザーに追加で情報を求める機能) • リソースのサブスクライブ(リソースに変更があった際に、クライアントに通知する機能) これらの機能はサーバーからクライアントにリクエストする必要があるため、ステートレスでは利用できない 70 Copyright © 2026, Oracle and/or its affiliates
  58. まとめ • リモートMCPサーバーの場合、MCPバージョンによって二つの選択肢がある • Server Sent Events • Streamable HTTP

    • Server Sent Events • 通信の最初にSSE用セッションを用意し、サーバーのレスポンスはここから受け取る • クライアントのリクエストは都度通常のHTTPで行う • 通信の切断に弱い • Streamable HTTP • 普段は通常のHTTP、必要な時だけSSEを使う方式 • セッションをIDで管理するため、切断時もそのIDで新旧セッションを紐付けられる • MCPサーバーの水平スケールについて • ステートレスに構成すれば水平スケールできる • ステートレスに構成した場合、MCPの一部機能が利用できなくなる • ゲートウェイ構成にするのもあり 72 Copyright © 2026, Oracle and/or its affiliates
  59. MCPの認可仕様 バージョンごとに異なる MCPでは、バージョン2025-03-26から認可についての仕様を定めた • 2025-03-26 • OAuth 2.1 IETF ドラフト

    • OAuth 2.0 認可サーバーメタデータ(RFC8414) • OAuth 2.0 動的クライアント登録プロトコル(RFC7591) • 2025-06-18 • 上の三つはそのまま • OAuth 2.0 保護リソースメタデータ(RFC9728) • 2025-11-25 (Latest) • 上の四つはそのまま • OAuth クライアントIDメタデータドキュメント(IETFドラフト) 74 Copyright © 2026, Oracle and/or its affiliates ドラフトが多すぎ ない?…
  60. すべてに共通する、OAuth 2.1 IETFドラフトとは OAuth 2.0との主な違い • Authorization Code GrantでPKCEが必須に •

    リダイレクトURIを完全に文字列一致させないといけなくなった • URIクエリパラメータでのBearerトークン使用の禁止 • パブリッククライアントのリフレッシュトークンに要件が追加 • Implicit Grant、Resource Owner Password Credentials Grantを削除 • など… 75 Copyright © 2026, Oracle and/or its affiliates
  61. OAuth 2.0 認可サーバーメタデータ(RFC8414) 認可サーバーの情報を渡すメタデータのフォーマットを定義 目的 認可サーバーのメタデータを標準化された形式で公開することで、OAuth2.0クライアントが以下の情報を自動的に取 得できるようになる • 各エンドポイント(トークンエンドポイントなど)のURL •

    サーバーがサポートする機能(サポートするクライアント認証方式など) 76 Copyright © 2026, Oracle and/or its affiliates 認可サーバー (example.com) クライアント GET https://example.com/.well- known/oauth-authorization-server RFC8414で定義されたJSON 認可サーバーの情報を教 えてください 各エンドポイントはこれ、 サポートする機能はこれ です(JSONで渡す)
  62. OAuth 2.0 動的クライアント登録プロトコル(RFC7591) Oauthクライアントを認可サーバーに動的に登録する 目的 従来は、IdPでクライアントを登録してからでないとクライアントが認可サーバーを利用できなかった IdPで自動でクライアント登録するための仕組み 77 Copyright ©

    2026, Oracle and/or its affiliates 従来 動的クライアント登録プロトコル 手動での登録が不要 IdP クライアント ①クライアントを 登録 ②クライアントIDを 登録 ③利用開始 IdP クライアント ①登録依頼 ②登録情報 ③利用開始
  63. OAuth 2.0 動的クライアント登録プロトコル(RFC7591) 問題点 多くのIdPでは以下のような理由でサポートされていない • オープン登録は誰でも登録できてしまうため、セキュリティ上よくない • ユースケースがそもそもあんまりない •

    運用が大変 • 大量のクライアントが登録される可能性 • 不正利用への対応 • 登録されたクライアントのライフサイクル管理 など 79 Copyright © 2026, Oracle and/or its affiliates
  64. OAuth 2.0 保護リソースメタデータ(RFC9728) 保護リソース(リソースサーバー)のメタデータに関する仕様 RFC8414と同様、well-known URIでリソースサーバーが公開する • リソースサーバーを使うのに必要な認可サーバー • 必要なスコープの情報

    • トークンの送り方 などが取得できる 80 Copyright © 2026, Oracle and/or its affiliates クライアント リソースサーバー (https://resources.com) GET https://resource.com/.well- known/oauth-protected-resource RFC9728で定義されたJSON 使う認可サーバー・必要 なスコープなどはこちら です リソースサーバーの情報 を教えてください
  65. OAuth クライアントIDメタデータドキュメント(IETFドラフト) クライアントIDに、クライアント情報を公開しているURLを指定する • クライアントIDに、クライアント情報(メタデータドキュメント)を公開しているURLを指定 • 認可サーバーはそのURLにアクセスし、クライアント情報を確認する • 確認するのはclient_idとredirect_uri 81

    Copyright © 2026, Oracle and/or its affiliates クライアント 認可サーバー 認可リクエスト 認可リクエストと メタデータの情報 が一致してるな クライアント のメタデータ を公開してる サーバー client_idのURLにア クセス メタデータ返却 認可レスポンス
  66. OAuth クライアントIDメタデータドキュメント(IETFドラフト) クライアントIDに、クライアント情報を公開しているURLを指定する 動的クライアント登録では、 • 認可サーバー側でクライアント情報を管理する必要がある • オープン登録の場合は誰でも登録できてしまう という問題があった この方法では、

    • クライアントIDに、クライアント情報(メタデータドキュメント)を公開しているURLを指定 • 認可サーバーはそのURLにアクセスし、クライアント情報を確認する 82 Copyright © 2026, Oracle and/or its affiliates • クライアント情報はクライアント側で管理 • 身元の根拠はドメイン所有権
  67. 認可サーバー検出フェーズ MCPクライアントは、接続したいMCPサーバーが要求する認可サーバーの情報を知らないので、 それを教えてもらうフェーズ 84 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPリクエスト トークンないけどアクセ スしちゃお MCPサーバー (リソース サーバー)
  68. 認可サーバー検出フェーズ MCPクライアントは、接続したいMCPサーバーが要求する認可サーバーの情報を知らないので、 それを教えてもらうフェーズ 85 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPリクエスト HTTP 401 MCPサーバー (リソース サーバー) トークン持ってアクセス してきてね
  69. 認可サーバー検出フェーズ MCPクライアントは、接続したいMCPサーバーが要求する認可サーバーの情報を知らないので、 それを教えてもらうフェーズ 86 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPリクエスト RFC9728にこのエンドポイ ントに聞けばわかるって書 いてあるな GET /.well-known/oauth- protected-resource HTTP 401 MCPサーバー (リソース サーバー) ※RFC9728: 保護リソースメタデータ
  70. 認可サーバー検出フェーズ MCPクライアントは、接続したいMCPサーバーが要求する認可サーバーの情報を知らないので、 それを教えてもらうフェーズ 87 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) MCPリクエスト 認可サーバーはここです (RFC9728仕様) Resource metadata HTTP 401 GET /.well-known/oauth- protected-resource
  71. 認可サーバー検出フェーズ MCPクライアントは、接続したいMCPサーバーが要求する認可サーバーの情報を知らないので、 それを教えてもらうフェーズ 88 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) MCPリクエスト 認可サーバーのURLがわかっ たぞ。RFC8414に従うとこの エンドポイントに認可サー バーの情報があるぞ Resource metadata HTTP 401 GET /.well-known/oauth- protected-resource GET ./well-known/oauth-authorization-server ※RFC8414: 認可サーバーメタデータ
  72. 認可サーバー検出フェーズ MCPクライアントは、接続したいMCPサーバーが要求する認可サーバーの情報を知らないので、 それを教えてもらうフェーズ 89 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) MCPリクエスト 私のエンドポイント情報等は これです Resource metadata HTTP 401 GET /.well-known/oauth- protected-resource GET ./well-known/oauth-authorization-server Authorization server metadata
  73. 認可サーバー検出フェーズ MCPクライアントは、接続したいMCPサーバーが要求する認可サーバーの情報を知らないので、 それを教えてもらうフェーズ 90 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) MCPリクエスト 私のエンドポイント情報等は これです Resource metadata HTTP 401 GET /.well-known/oauth- protected-resource GET ./well-known/oauth-authorization-server Authorization server metadata この手順でやっと認可サーバーの各 エンドポイントの情報が分かった
  74. クライアント登録フェーズ 仕様では、RFC7591(動的クライアント登録プロトコル)をサポートすべき(SHOULD)と書いてある 理由 • クライアントはMCPサーバーとその認可サーバーを事前に把握していない可能性がある • 手動で全ての認可サーバーに登録するのは煩わしい • 新しいMCPサーバーとシームレスに接続できる •

    認可サーバーは独自の登録ポリシーを実装できる ただし、必ずしもRFC7591をサポートする必要はなく、その場合は • MCPクライアントがクライアントID(コンフィデンシャルクライアントの場合はクライアントシークレットも)を ハードコードする • ユーザーが自分でOAuthクライアントを登録した後、これらの詳細を入力できるUIをユーザーに提示する なお、Claude Desktopは動的・静的のどちらのクライアント登録も対応している 91 Copyright © 2026, Oracle and/or its affiliates
  75. OAuthフロー クライアント登録まで終われば、あとはOAuthのフローを行う OAuth2.1 に従うので、グラントタイプは • Authorization Code(PKCE必須)※PKCEに対応していないIdPもあるので注意 • Client Credentials

    • Refresh Token(アクセストークン更新時のみ) ただし、RFC8707で定義されているResource Indicatorsを実装する必要がある 92 Copyright © 2026, Oracle and/or its affiliates
  76. Resource Indicators for OAuth2.0 (RFC8707) • クライアントがトークンを取得する際に、トークンの使い道(リソースサーバー)を明示的に伝える • 認可サーバーは、そのリソースサーバーをaudienceに含めるようにする(申告されたリソースサーバーでしか使え ないようにする)

    93 Copyright © 2026, Oracle and/or its affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) 認可・トークンリクエスト Resourceパラメータにリソー スサーバーのURLを入れる トークンのaudパラメータに resourceパラメータの値を入 れる トークンを持ってリクエスト audパラメータの値が自身の URLかを確認する
  77. Resource Indicators for OAuth2.0 (RFC8707)採用の問題点 MCPのドキュメントには以下のように書かれている MCP clients MUST implement

    Resource Indicators for OAuth 2.0 as defined in RFC 8707 to explicitly specify the target resource for which the token is being requested. つまり、 認可サーバーがサポートしていなくてもresourceパラメータをつけて送れと言っているがこれが問題 • IdPによっては、想定しないパラメータが送られてくるとエラーになる → OAuthフローが失敗する • resourcesパラメータを無視するIdPでは、動作はするが意図したものではない(トークンが他のリソースサーバー でも使える) 94 Copyright © 2026, Oracle and/or its affiliates • RFC8707に対応しているIdPを使う • RFC8707は使わないようにする
  78. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 1. 認可サーバーの検出(辛いところはない) 97 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) GET /.well-known/oauth-protected-resource RFC9728(保護リソース メタデータ)の仕様
  79. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 1. 認可サーバーの検出(辛いところはない) 98 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) Resource metadata 認可サーバーの場所が判明
  80. RFC8414 (認可サーバー メタデータ)の仕様 MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 1. 認可サーバーの検出(辛いところはない) 99 Copyright © 2026,

    Oracle and/or its affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) GET ./well-known/oauth-authorization-server
  81. クライアントとして登録 してもらおう MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 2. 動的クライアント登録 102 Copyright © 2026, Oracle

    and/or its affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) POST /register 多くのIdPではこの機能が 未実装
  82. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 2. 動的クライアント登録 103 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) Client Crentials 多くのIdPではこの機能が 未実装
  83. 認可コードを発行しても らおう MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 3. 認可フロー 104 Copyright © 2026, Oracle

    and/or its affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) 認可エンドポイントにアクセス ※RFC8707に従い、resourceパラメータを付 与している 多くのIdPではresourceパ ラメータが解釈できない ※IdPの実装によっては、ここでOAuthフローが失敗する場合がある
  84. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 3. 認可フロー 105 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) 認証画面にリダイレクト ブラウザ
  85. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 3. 認可フロー 106 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) ブラウザ ログインして認可
  86. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 3. 認可フロー 107 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) ブラウザ 認可コードをつけてリダイレクト 多くのIdPでは認可コードのaudパラメー タにresourceパラメータの値を入れない
  87. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 3. 認可フロー 108 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) トークンエンドポイントにアクセス ※RFC8707に従い、resourceパラメー タを付与している 多くのIdPではresourceパ ラメータが解釈できない
  88. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 3. 認可フロー 109 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) アクセストークンとリフレッシュ トークンを返す 多くのIdPではアクセストークンのaudパ ラメータにresourceパラメータの値を入れ ない
  89. MCPの認可で現実的に辛いところを全体フローから眺める(2025-06-18) 3. 認可フロー 110 Copyright © 2026, Oracle and/or its

    affiliates クライアント 認可サーバー MCPサーバー (リソース サーバー) アクセストークンを持ってMCPリクエスト
  90. MCPの認可で辛いところまとめ ドラフト版を標準としてるため、多くのIdPで対応していないものがある • 動的クライアント登録 • RFCだが対応しているIdPは限定的(Keycloakは対応済み) • Resourcesパラメータ • RFCだが対応しているIdPは限定的(Keycloakは未対応)

    • PKCE • 対応していないIdPも存在する(Keycloakは対応済み) なお、2025-11-25では以下の問題もある • クライアントIDメタデータドキュメント • ドラフトなので対応していない(Keycloakは未対応) 111 Copyright © 2026, Oracle and/or its affiliates
  91. 現状楽にMCPサーバーの認可を行うには? • 動的クライアント登録・クライアントIDメタデータドキュメントを使わない • Anthropicが出しているClaude Desktopは静的クライアント登録にも対応している • 有名なMCP開発フレームワークのFastMCPでは、DCRを受けて静的クライアント登録に変換できる • Resourcesパラメータ

    • 対応していない&エラーになるIdPを使う場合は指定しない • 対応している or エラーにならないIdPの場合は指定する • PKCE • 対応している場合はAuthorization Code Grant with PKCE • 対応していない場合はClient Credentials Grantを使うしかないが注意が必要 112 Copyright © 2026, Oracle and/or its affiliates
  92. MCPにおけるObservability 基本的にはWeb APIと変わらない 114 Copyright © 2026, Oracle and/or its

    affiliates ログ・メトリクス・トレースの基本的な収集方法はWeb APIと大きくは変わらない • ログ • リモートMCPサーバー(Streamable HTTP)の場合は、Web APIと同じ • メトリクス • 基本的にはWeb APIと同じ(リクエスト数、レイテンシ、エラー率など) • MCPはエンドポイントが一つ(/mcp)なので、gRPCと同じ感じでJSON-RPCのmethodフィールドとツール名を組 み合わせて識別する • エラーに関しては後述する違いがある • トレース • Web APIと同様の実装パターンが使える(FastMCPではネイティブでOpenTelemetryをサポートしている) • MCP専用のOpenTelemetryセマンティックルールはまだドラフト段階
  93. MCPのエラー MCPのエラーは以下の3パターンある • HTTPレベルのエラー • HTTPのエラーコードで把握できる • MCPサーバーが起動していないなどの場合に発生する(ある意味MCPの外側のエラー) • JSON-RPCレベルのエラー

    • HTTP 200で返されるため、HTTPのエラーコードでは把握できない • 呼び出そうとしたメソッドが存在しない、パラメータの型が違うなどの場合に発生する • isErrorフラグレベルのエラー • HTTP 200かつJSON-RPCレベルのエラーではない • プロコトルとしては正常に通信できたが、実行した中身(ツールなど)が失敗した場合に使われる 115 Copyright © 2026, Oracle and/or its affiliates
  94. JSON-RPCレベルのエラー HTTP200で返されるので、errorフィールドを確認する 発生するケース • パースエラー(-32700) • 不正なJSON文法の時 • 不正なリクエスト(-32600) •

    JSON-RPCの型に沿っていないJSONの場合 • メソッド不存在(-32601) • 存在しないJSON-RPCメソッドの呼び出し • tools/callをtool/callと呼び出した等 • 不正なパラメータ(-32602) • 必須フィールドがない場合など • 内部エラー(-32603) • サーバー内部の予期しないエラー • カスタムエラー(-32000~-32099) • サーバー実装固有のエラー用 116 Copyright © 2026, Oracle and/or its affiliates
  95. isErrorフラグレベルのエラー HTTP200, JSON-RPCのエラーコードも返さないので、isErrorフラグをみる 発生するケース ツールは正常に呼び出されたが、ツール内部の処理が失敗した場合 • 外部APIの失敗 • データベース接続タイムアウト •

    外部APIのレート制限超過など • 入力検証エラー • 予約日付が過去の日付、利用可能な席がない、など • その他 117 Copyright © 2026, Oracle and/or its affiliates
  96. Grafana CloudではMCP用のダッシュボードも利用可能らしい 118 Copyright © 2026, Oracle and/or its affiliates

    https://grafana.com/docs/grafana-cloud/monitor-applications/ai-observability/mcp-observability/
  97. まとめ • 基本的にはWeb API (REST API)やgRPCと同じ • ログ • リモートMCPサーバー(Streamable

    HTTP)の場合は、Web APIと同じ • メトリクス • 基本的にはWeb APIと同じ(リクエスト数、レイテンシ、エラー率など) • MCPはエンドポイントが一つ(/mcp)なので、gRPCと同じ感じでJSON-RPCのmethodフィールドとツール名を組 み合わせて識別する • エラーに関しては違いがある • トレース • Web APIと同様の実装パターンが使える(FastMCPではネイティブでOpenTelemetryをサポートしている) • MCP専用のOpenTelemetryセマンティックルールはまだドラフト段階 • まだあまり多くは情報が出ていない気がする… 121 Copyright © 2026, Oracle and/or its affiliates
  98. 構成 125 Copyright © 2026, Oracle and/or its affiliates OKE

    フライト予約 MCPサーバー ホテル予約 MCPサーバー 天気取得 MCPサーバー フライト予約 サービス ホテル予約 サービス 天気取得 サービス Ingress User Claude Desktop Anthropicの プロキシ 各アプリケーションはHelidon (Helidon MCP)で実装
  99. まとめ • MCPは、AIアプリケーションを外部システムに接続するための標準規格 • リモートMCPサーバーでは、ローカルMCPサーバーとは異なり以下のようなことを考慮する必要がある • スケーラビリティ - 利用できる機能は絞られるが、現実的にはステートレスにMCPサーバーを構築する方が楽 •

    認可 - 利用するIdPに応じて方法を選ぶ必要がある - 現状は静的クライアント登録で、IdPに応じてresourcesパラメータを使うか使わないか選ぶのが楽 - クライアントが動的クライアント登録しか使えない場合はプロキシを使うのが楽 • 可観測性 - 基本的にはREST APIと変わらない - エラーの扱いには注意する 127 Copyright © 2026, Oracle and/or its affiliates
  100. 参考 128 Copyright © 2026, Oracle and/or its affiliates MCP公式ドキュメント

    https://modelcontextprotocol.io/docs/ FastMCP公式ドキュメント https://gofastmcp.com/getting-started/welcome (Claude Desktop) Building Custom Connectors https://support.claude.com/en/articles/1150383 4-building-custom-connectors-via-remote-mcp- servers Helidon MCP https://github.com/helidon-io/helidon-mcp いまさらOAuth2.0から2.1での変更点 https://zenn.dev/hashi8084/articles/0cf69e15bf793a MCP認可フローを仕様から読み解く(2025-06-18) https://qiita.com/yokawasa/items/74717789465ef2aeedfe MCPのOAuth認証で仕様通りに作るのが難しいこと3選 https://zenn.dev/ncdc/articles/40a7a51a2a016d マイクロサービスの認証・認可とJWT (OCHaCafe #S4) https://speakerdeck.com/oracle4engineer/authentication- and-authorization-in-microservices-and-jwt
  101. 参考 129 Copyright © 2026, Oracle and/or its affiliates OAuth2.1

    IETF Draft https://datatracker.ietf.org/doc/html/draft-ietf- oauth-v2-1-13 RFC8414 https://datatracker.ietf.org/doc/html/rfc8414 RFC7591 https://datatracker.ietf.org/doc/html/rfc7591 RFC9728 https://datatracker.ietf.org/doc/html/rfc9728 RFC8707 https://www.rfc-editor.org/rfc/rfc8707.html OAuth クライアントIDメタデータドキュメント IETF Draft https://datatracker.ietf.org/doc/html/draft-ietf-oauth-client- id-metadata-document-00 MCP Gateway https://github.com/microsoft/mcp-gateway [Proposal] Adding OpenTelemetry Trace Support to MCP https://github.com/modelcontextprotocol/modelcontextprot ocol/discussions/269 Integrating with Model Context Protocol (MCP) https://www.keycloak.org/securing-apps/mcp- authz-server