このページは Apigee と Apigee ハイブリッドに適用されます。
Apigee Edge のドキュメントを表示する
このページでは、Apigee API プロダクトを使用して MCP ツールへのアクセスを制御する方法について説明します。Apigee MCP Discovery Proxy を使用する場合でも、独自の MCP サーバーにトラフィックをプロキシする場合でも、MCP クライアントを認証し、ツールごとの割り当てを適用し、API プロダクト構成に基づいてツールの可視性をフィルタできます。
MCP サーバーは、すべてのツール呼び出しに単一のエンドポイント(/mcp など)を使用します。オペレーションが URL パスと HTTP メソッドで区別される REST API とは異なり、MCP はオペレーションを JSON-RPC リクエストの本文に埋め込みます。Apigee は ParsePayload ポリシーを使用してこれらのオペレーションを抽出し、標準の API 管理ポリシー(認証、割り当ての適用、ツールのフィルタリング)をツールごとに適用できるようにします。
概要
API プロダクトを使用して MCP ツールへのアクセスを管理するには、次の手順を行います。
- ParsePayload ポリシーを追加して、リクエストの本文から MCP ツールの名前を抽出します。
- MCP ツールのオペレーションとツールごとの割り当てを使用して API プロダクトを構成します。
- デベロッパー アプリを登録して、クライアント認証情報を取得します。
- API プロダクトに対してクライアント認証情報を検証する認証ポリシーを追加します(API キーまたは OAuth 2.0)。
- Quota ポリシーを追加して、ツールごとのレート制限を適用します。
- テストツールのフィルタリングを使用して、API プロダクトの構成に基づいて
tools/listレスポンスがフィルタリングされることを確認します。
ParsePayload ポリシーを追加する
ParsePayload ポリシーは、JSON-RPC リクエスト本文を解析し、tools/call/get_weather や tools/list などの MCP オペレーションを抽出します。抽出されたオペレーションは、ポリシー名(parsepayload.ParsePayload-MCP.operation など)を接頭辞とするフロー変数に格納されます。この変数は、ダウンストリーム ポリシーで認証と割り当ての適用に使用されます。
次の ParsePayload ポリシーを MCP プロキシのリクエスト PreFlow に追加します。
<ParsePayload name="ParsePayload-MCP"> <DisplayName>Parse MCP Payload</DisplayName> <Source>request</Source> <PayloadType>JSON-RPC-2.0</PayloadType> <Protocol>MCP</Protocol> </ParsePayload>
ここで
<Source>: 解析するメッセージ。デフォルトはrequestです。<PayloadType>: ペイロードの形式。必ずJSON-RPC-2.0を指定します。<Protocol>: 解析に使用するプロトコル。MCP サーバーの場合はMCPにする必要があります。
実行後、ポリシーはポリシー インスタンス名の接頭辞が付いたフロー変数(parsepayload.policyName.suffix パターン)を設定します。ParsePayload-MCP という名前のポリシーの場合、次の変数が設定されます。
| フロー変数 | 説明 | 値の例 |
|---|---|---|
parsepayload.ParsePayload-MCP.operation |
API プロダクトのマッチングと割り当ての適用に使用される派生オペレーション名。 | tools/call/get_weather |
parsepayload.ParsePayload-MCP.json-rpc.request.method |
リクエストの JSON-RPC method フィールド。 |
tools/call |
parsepayload.ParsePayload-MCP.json-rpc.request.id |
リクエストの JSON-RPC id フィールド。 |
1 |
parsepayload.ParsePayload-MCP.json-rpc.request.params.name |
リクエストの params.name フィールド。 |
get_weather |
MCP ツールのオペレーションを使用して API プロダクトを構成する
API プロダクトは、クライアント アプリケーションがアクセスできる MCP ツールと、各ツールの割り当て上限を定義します。MCP ツールのオペレーションは、API プロダクト定義の payloadOperationGroup フィールドを使用して構成します。
payloadOperationGroup.operationConfigs の各エントリは、次の内容を指定します。
- MCP ツールを提供する API プロキシ(
apiSource)。 - 1 つ以上のツール オペレーション(
tools/call/get_stock_price、tools/listなど)。 - そのオペレーション セットの省略可能な割り当て。
次の API 呼び出しを使用して、MCP ツールのオペレーションを含む API プロダクトを作成します。
curl -X POST \ "https://apigee.googleapis.com/v1/organizations/ORG_NAME/apiproducts" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d '{ "name": "PRODUCT_NAME", "displayName": "PRODUCT_DISPLAY_NAME", "approvalType": "auto", "payloadOperationGroup": { "operationConfigs": [ { "apiSource": "MCP_PROXY_NAME", "operations": [ { "operation": "tools/call/get_stock_price" }, { "operation": "tools/call/get_company_news" } ], "quota": { "limit": "100", "interval": "1", "timeUnit": "minute" } }, { "apiSource": "MCP_PROXY_NAME", "operations": [ { "operation": "tools/list" } ], "quota": { "limit": "300", "interval": "1", "timeUnit": "minute" } } ] } }'
ここで
ORG_NAMEは実際の Apigee 組織の名前です。PRODUCT_NAMEは、API プロダクトの内部名です。PRODUCT_DISPLAY_NAMEは API プロダクトの表示名です。MCP_PROXY_NAMEは、MCP サーバーにトラフィックをルーティングする API プロキシの名前です。これは、Apigee MCP 検出プロキシまたは独自の MCP サーバーをバックエンドとして使用するプロキシにできます。
ツールごとの割り当てを構成する
個々のツールに異なる割り当てを構成できます。たとえば、次の構成では、get_stock_price は 1 分あたり 300 回の呼び出しに制限されますが、get_company_news は 1 分あたり 3 回の呼び出しに制限されます。
{ "payloadOperationGroup": { "operationConfigs": [ { "apiSource": "MCP_PROXY_NAME", "operations": [ { "operation": "tools/call/get_stock_price" } ], "quota": { "limit": "300", "interval": "1", "timeUnit": "minute" } }, { "apiSource": "MCP_PROXY_NAME", "operations": [ { "operation": "tools/call/get_company_news" } ], "quota": { "limit": "3", "interval": "1", "timeUnit": "minute" } }, { "apiSource": "MCP_PROXY_NAME", "operations": [ { "operation": "tools/list" } ], "quota": { "limit": "300", "interval": "1", "timeUnit": "minute" } } ] } }
さまざまなツール サブセットを含む複数の API プロダクトを作成して、階層型アクセスを提供できます。たとえば、ベーシック プロダクトには tools/call/get_stock_price のみが含まれ、プレミアム プロダクトには割り当て量の多いすべての利用可能なツールが含まれます。各デベロッパー アプリは 1 つ以上の API プロダクトに関連付けられているため、クライアントごとに異なるツールセットに自動的にアクセスでき、レート制限も個別に設定できます。
デベロッパー アプリを登録する
テスト用の API キーまたは OAuth 認証情報を取得するには、デベロッパーを登録し、前の手順で作成した API プロダクトに関連付けられたデベロッパー アプリを作成します。
- Apigee 組織にアプリ デベロッパーを登録します。
- デベロッパー アプリを作成し、API プロダクトに関連付けます。
- アプリの認証情報からコンシューマ キー(API キー)を取得します。この鍵は、以降の認証例で使用します。
認証ポリシーを追加する
ParsePayload ポリシーを追加したら、クライアントがリクエストされた MCP ツールを使用する権限を持っていることを確認する認証ポリシーを追加します。Apigee は、抽出されたオペレーションをクライアントの API プロダクトで定義されたオペレーションと照合します。
リクエストされたツールがクライアントの API プロダクトにリストされていない場合、Apigee は 401 Unauthorized エラーを返します。
オプション 1: API キー認証
VerifyAPIKey ポリシーを使用して、API キーでクライアントを認証します。このポリシーを ParsePayload ポリシーの後のリクエスト PreFlow に追加します。
<VerifyAPIKey name="VerifyAPIKey-1"> <DisplayName>Verify API Key</DisplayName> <APIKey ref="request.queryparam.apikey"/> </VerifyAPIKey>
クライアントは、MCP プロキシを呼び出すときに API キーをクエリ パラメータとして渡します。
curl -X POST "https://RUNTIME_HOSTNAME/mcp?apikey=API_KEY" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "get_stock_price", "arguments": { "ticker": "GOOGL" } }, "id": 1 }'
ヘッダーから API キーを読み取るようにポリシーを構成することもできます。
<VerifyAPIKey name="VerifyAPIKey-1"> <DisplayName>Verify API Key</DisplayName> <APIKey ref="request.header.x-api-key"/> </VerifyAPIKey>
オプション 2: OAuth 2.0 認証
VerifyAccessToken オペレーションで OAuthV2 ポリシーを使用して、OAuth 2.0 アクセス トークンでクライアントを認証します。このポリシーを、ParsePayload ポリシーの後のリクエスト PreFlow に追加します。
<OAuthV2 name="OAuthV2-VerifyAccessToken"> <DisplayName>Verify OAuth Access Token</DisplayName> <Operation>VerifyAccessToken</Operation> </OAuthV2>
クライアントは Authorization ヘッダーでアクセス トークンを渡します。
curl -X POST "https://RUNTIME_HOSTNAME/mcp" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -d '{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "get_stock_price", "arguments": { "ticker": "GOOGL" } }, "id": 1 }'
Apigee での OAuth 2.0 の構成の詳細については、OAuth2 のスタートガイドをご覧ください。
Quota ポリシーを追加する
Quota ポリシーを追加して、API プロダクトで定義されたツールごとのレート制限を適用します。このポリシーは UseQuotaConfigInAPIProduct を使用して、一致する API プロダクト オペレーションの割り当て構成を自動的に適用します。
認証ポリシーの後に、次の Quota ポリシーをリクエスト PreFlow に追加します。
<Quota name="Quota-PerToolLimit"> <DisplayName>Per-Tool Quota</DisplayName> <UseQuotaConfigInAPIProduct stepName="AUTH_POLICY_STEP_NAME"/> <Distributed>true</Distributed> </Quota>
ここで、AUTH_POLICY_STEP_NAME は認証ポリシーの XML 要素の name 属性の値です(このページの例では VerifyAPIKey-1 または OAuthV2-VerifyAccessToken)。これは、<DisplayName> ではなく、ポリシーの name 属性と一致する必要があります。
この構成では、各ツール オペレーションは、API プロダクトで定義された割り当てに従って個別にレート制限されます。たとえば、tools/call/get_stock_price の割り当てが 1 分あたり 300 件で、tools/call/get_company_news の割り当てが 1 分あたり 3 件の場合、両方のツールが同じプロキシを介してアクセスされていても、各上限は個別に適用されます。
プロキシの構成を完了する
次の例は、ParsePayload、API キー認証、ツールごとの割り当て適用を含む MCP プロキシのリクエスト PreFlow の完全な構成を示しています。
<ProxyEndpoint name="default"> <PreFlow> <Request> <Step> <Name>ParsePayload-MCP</Name> </Step> <Step> <Name>VerifyAPIKey-1</Name> </Step> <Step> <Name>Quota-PerToolLimit</Name> </Step> </Request> </PreFlow> <HTTPProxyConnection> <BasePath>/mcp</BasePath> </HTTPProxyConnection> <RouteRule name="default"> <TargetEndpoint>default</TargetEndpoint> </RouteRule> </ProxyEndpoint>
ツールのフィルタリング
クライアントが API キーまたは OAuth 認証を使用して MCP プロキシ経由で tools/list リクエストを送信すると、Apigee はレスポンスを自動的にフィルタし、クライアントの API プロダクトに登録されているツールのみを含めます。
たとえば、クライアントの API プロダクトに tools/call/get_stock_price オペレーションと tools/call/get_company_news オペレーションが含まれている場合、MCP サーバーが追加のツールを公開していても、MCP サーバーからの tools/list レスポンスは get_stock_price と get_company_news のみを返すようにフィルタされます。
このフィルタリングは、次の構成が設定されている場合にデフォルトで実行されます。専用のフィルタリング ポリシーは必要ありません。
- リクエスト PreFlow には、ParsePayload と認証ポリシー(VerifyAPIKey または OAuthV2)が含まれます。
- API プロダクトには、
payloadOperationGroupにtools/listが含まれています。 - API プロダクトは、クライアントがアクセスできるツール オペレーション(
tools/call/get_stock_priceなど)を指定します。
ツールのフィルタリングをテストするには、クライアントの API キーを使用して tools/list リクエストを送信します。
curl -X POST "https://RUNTIME_HOSTNAME/mcp?apikey=API_KEY" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "tools/list", "id": 1 }'
API プロダクトに tools/call/get_stock_price と tools/call/get_company_news が含まれている場合、MCP サーバーが追加のツールを公開していても、フィルタされたレスポンスは次のようになります。
{ "jsonrpc": "2.0", "result": { "tools": [ { "name": "get_stock_price", "description": "Get the current stock price for a given ticker symbol.", "inputSchema": { "type": "object", "properties": { "ticker": { "type": "string", "description": "Stock ticker symbol" } }, "required": ["ticker"] } }, { "name": "get_company_news", "description": "Get recent news articles for a company.", "inputSchema": { "type": "object", "properties": { "company": { "type": "string", "description": "Company name" } }, "required": ["company"] } } ] }, "id": 1 }
API プロダクトにリストされていないツール(delete_account や admin_reset など)は、レスポンスから自動的に削除されます。
次のデバッグ セッションは、レスポンス フローの McpToolsFilterExecution ステップを示しています。mcp_flow_info.mcp.allowed.tools プロパティには、API プロダクトで許可されているツールが一覧表示されています。
ツールごとのロジックに条件付きフローを使用する
条件付きフローは、API プロダクトの割り当てで提供される以上のツールごとのロジックが必要な場合に使用します。たとえば、ツール固有の SpikeArrest レートの適用、異なるバックエンドへのルーティング、特定のツールに対するリクエスト変換の追加などです。条件フローは、parsepayload.policyName.operation フロー変数を使用して、抽出された MCP オペレーションを照合します。
ParsePayload-MCP という名前の ParsePayload ポリシーの場合:
<Flows> <Flow name="ListTools"> <Condition>(parsepayload.ParsePayload-MCP.operation = "tools/list")</Condition> <Request/> </Flow> <Flow name="GetStockPrice"> <Condition>(parsepayload.ParsePayload-MCP.operation = "tools/call/get_stock_price")</Condition> <Request> <Step> <Name>SpikeArrest-StockPrice</Name> </Step> </Request> </Flow> <Flow name="GetCompanyNews"> <Condition>(parsepayload.ParsePayload-MCP.operation = "tools/call/get_company_news")</Condition> <Request> <Step> <Name>SpikeArrest-CompanyNews</Name> </Step> </Request> </Flow> </Flows>
プロキシ構成をデバッグする
Apigee の デバッグツールを使用して、ParsePayload ポリシーが MCP オペレーションを正しく抽出していること、認証ポリシーと割り当てポリシーが想定どおりに機能していることを確認します。
デバッグ セッションで、ParsePayload ポリシー ステップ(ParsePayload-MCP はポリシー名)の後に次のフロー変数を確認します。
parsepayload.ParsePayload-MCP.operation: 完全なオペレーション名(tools/call/get_stock_priceなど)を含む必要があります。parsepayload.ParsePayload-MCP.json-rpc.request.method: JSON-RPC メソッド(tools/callなど)を含める必要があります。
制限事項
- ParsePayload ポリシーでは、ペイロード タイプとして
JSON-RPC-2.0のみがサポートされます。 - API プロダクト ツールのオペレーションは、
tools/callメソッドとtools/listメソッドのみをサポートします。tools/listレスポンスのツール フィルタリングは、API プロダクトで構成されたtools/callオペレーションにのみ適用されます。 - ParsePayload ポリシーは、リクエスト本文全体を解析します。Apigee では、リクエスト本文のサイズ上限がデフォルトで 10 MB に設定されています。
request.payload.parse.limitプロパティを使用すると、この上限を最大 30 MB まで構成できます。詳細については、エンドポイント プロパティのリファレンスをご覧ください。 - MCP プロトコルを使用する ParsePayload ポリシーは、JSON-RPC リクエスト ペイロード(
methodフィールドとparamsフィールドを含む)のみを解析します。MCP レスポンス ペイロードは解析されません。 tools/listレスポンスのツール フィルタリングには、リクエストの PreFlow で ParsePayload ポリシーと認証ポリシーが必要です。
次のステップ
- Apigee の MCP の詳細については、Apigee の MCP の概要をご覧ください。
- MCP プロキシを使ってみる: Apigee と MCP を使ってみるをご覧ください。
- API プロダクトと API プロダクトの管理について学習する。
- Apigee のレート制限について学習する。
- API キーと OAuth 2.0 認証について学習する。