使用 API 產品管理 MCP 工具存取權

本頁內容適用於 Apigee 和 Apigee Hybrid。

查看 Apigee Edge 說明文件。

本頁說明如何使用 Apigee API 產品控管 MCP 工具的存取權。無論您是使用 Apigee MCP Discovery Proxy,還是將流量 Proxy 至自己的 MCP 伺服器,都可以驗證 MCP 用戶端、套用各項工具的配額,以及根據 API 產品設定篩選工具顯示設定。

MCP 伺服器會使用單一端點 (例如 /mcp) 叫用所有工具。與 REST API 不同,MCP 會將作業嵌入 JSON-RPC 要求主體,而非透過網址路徑和 HTTP 方法區分作業。Apigee 會使用 ParsePayload 政策擷取這些作業,以便根據工具套用標準 API 管理政策 (驗證、配額強制執行和工具篩選)。

總覽

如要透過 API 產品管理 MCP 工具存取權,請完成下列步驟:

  1. 新增 ParsePayload 政策,從要求主體中擷取 MCP 工具名稱。
  2. 設定 API 產品,其中包含 MCP 工具作業和各項工具的配額。
  3. 註冊開發人員應用程式,取得用戶端憑證。
  4. 新增驗證策略 (API 金鑰或 OAuth 2.0),根據 API 產品驗證用戶端憑證。
  5. 新增配額政策,強制執行各項工具的頻率限制。
  6. 測試工具篩選,確認系統會根據 API 產品設定篩選回覆。tools/list

新增 ParsePayload 政策

ParsePayload 政策會剖析 JSON-RPC 要求主體,並擷取 MCP 作業,例如 tools/call/get_weather 或 tools/list。擷取的作業會儲存在以政策名稱為前置字串的流程變數中 (例如 parsepayload.ParsePayload-MCP.operation),供下游政策用於驗證和配額強制執行。

在 MCP Proxy 的要求 PreFlow 中新增下列 ParsePayload 政策:

<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 工具,以及各項工具的配額限制。您可以使用 API 產品定義中的 payloadOperationGroup 欄位,設定 MCP 工具作業。

payloadOperationGroup.operationConfigs 中的每個項目都會指定:

  • 提供 MCP 工具的 API Proxy (apiSource)。
  • 一或多個工具作業 (例如 tools/call/get_stock_price、tools/list)。
  • 這組作業的選用配額。
API 產品建立 UI 顯示「酬載作業」面板,其中 API Proxy 設為 mcp-discovery,通訊協定設為 MCP,且 MCP 作業類型選項為「列出」和「呼叫」,並提供配額設定。

使用下列 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 Proxy 名稱。這可以是 Apigee MCP 探索 Proxy,也可以是後端為您自有 MCP 伺服器的 Proxy。

設定各項工具的配額

您可以為個別工具設定不同配額。舉例來說,下列設定會將 get_stock_price 限制為每分鐘 300 次呼叫,但將 get_company_news 限制為每分鐘 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,而進階產品則包含所有可用工具,且配額較高。每個開發人員應用程式都會與一或多個 API 產品建立關聯,因此不同的用戶端會自動取得不同工具組合的存取權,且各有獨立的速率限制。

註冊開發人員應用程式

如要取得 API 金鑰或 OAuth 憑證進行測試,請註冊開發人員,並建立與上一個步驟中建立的 API 產品相關聯的開發人員應用程式。

  1. 在 Apigee 機構中註冊應用程式開發人員。
  2. 建立開發人員應用程式,並與 API 產品建立關聯。
  3. 從應用程式憑證取得用戶端金鑰 (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 Proxy 時,會將 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 驗證

使用 OAuthV2 政策和 VerifyAccessToken 作業,透過 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政策,強制執行 API 產品中定義的工具費率限制。 這項政策會使用 UseQuotaConfigInAPIProduct,自動套用相符 API 產品作業的配額設定。

在驗證政策之後,將下列配額政策新增至要求 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)。這必須與政策 name 屬性相符,而非 <DisplayName>。

完成這項設定後,系統會根據 API 產品中定義的配額,獨立限制每項工具作業的速率。舉例來說,如果 tools/call/get_stock_price 的配額為每分鐘 300 個,而 tools/call/get_company_news 的配額為每分鐘 3 個,即使這兩個工具都是透過相同 Proxy 存取,系統也會分別強制執行配額限制。

完成 Proxy 設定

以下範例顯示 MCP 代理的完整要求 PreFlow 設定,包含 ParsePayload、API 金鑰驗證和工具配額強制執行:

<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>

工具篩選

當用戶端透過 MCP Proxy 傳送 tools/list 要求,並使用 API 金鑰或 OAuth 驗證時,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 產品允許的工具:

偵錯工作階段,顯示 McpToolsFilterExecution 步驟,其中 mcp_flow_info.mcp.allowed.tools 列出經過篩選的工具。

使用條件式流程,為每個工具設定邏輯

如果需要超出 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>

偵錯 Proxy 設定

使用 Apigee Debug 工具,確認 ParsePayload 政策是否正確擷取 MCP 作業,以及驗證和配額政策是否正常運作。

偵錯工作階段顯示 ParsePayload-MCP 步驟,以及流程變數,包括設為 tools/list 的 parsepayload.ParsePayload-MCP.operation。

在偵錯工作階段中,檢查 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 方法。工具篩選功能僅適用於 API 產品中設定的 tools/call 作業,tools/list 回應則不適用。
  • ParsePayload 政策會剖析完整的要求主體。Apigee 會強制執行預設要求主體大小限制 (10 MB),您可以使用 request.payload.parse.limit 屬性將限制設為最多 30 MB。詳情請參閱端點屬性參考資料。
  • 使用 MCP 通訊協定的 ParsePayload 政策只會剖析 JSON-RPC 要求酬載 (包含 method 和 params 欄位)。不會剖析 MCP 回應酬載。
  • 如要篩選 tools/list 回應的工具,要求 PreFlow 中必須有 ParsePayload 和驗證政策。

後續步驟