使用 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_weathertools/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_pricetools/list)。
  • 這組作業的選用配額。
API 產品建立 UI 顯示「Payload Operation」面板,其中 API Proxy 設為 mcp-discovery,通訊協定設為 MCP,且 MCP 作業類型選項為「List」和「Call」,並提供配額設定。

使用下列 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-1OAuthV2-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 代理傳送 tools/list 要求,並使用 API 金鑰或 OAuth 驗證時,Apigee 會自動篩選回應,只納入在用戶端 API 產品中註冊的工具。

舉例來說,如果用戶端的 API 產品包含 tools/call/get_stock_pricetools/call/get_company_news 運算,即使 MCP 伺服器公開其他工具,MCP 伺服器的 tools/list 回應也會經過篩選,只傳回 get_stock_priceget_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_pricetools/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_accountadmin_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/calltools/list 方法。工具篩選功能僅適用於 API 產品中設定的 tools/call 作業,可篩選 tools/list 回應。
  • ParsePayload 政策會剖析完整的要求主體。Apigee 會強制執行預設要求主體大小限制 (10 MB),您可以使用 request.payload.parse.limit 屬性將限制設為最多 30 MB。詳情請參閱端點屬性參考資料
  • 使用 MCP 通訊協定的 ParsePayload 政策只會剖析 JSON-RPC 要求酬載 (包含 methodparams 欄位)。不會剖析 MCP 回應負載。
  • 如要篩選 tools/list 回應,要求 PreFlow 中必須有 ParsePayload 和驗證政策。

後續步驟