Mengelola akses alat MCP dengan produk API

Halaman ini berlaku untuk Apigee dan Apigee hybrid.

Lihat dokumentasi Apigee Edge.

Halaman ini menjelaskan cara menggunakan produk Apigee API untuk mengontrol akses ke alat MCP. Baik Anda menggunakan Apigee MCP Discovery Proxy atau mem-proxy traffic ke server MCP Anda sendiri, Anda dapat mengautentikasi klien MCP, menerapkan kuota per alat, dan memfilter visibilitas alat berdasarkan konfigurasi produk API.

Server MCP menggunakan satu endpoint (misalnya, /mcp) untuk semua pemanggilan alat. Tidak seperti REST API yang membedakan operasi berdasarkan jalur URL dan metode HTTP, MCP menyematkan operasi dalam isi permintaan JSON-RPC. Apigee menggunakan kebijakan ParsePayload untuk mengekstrak operasi ini sehingga kebijakan pengelolaan API standar—autentikasi, penerapan kuota, dan pemfilteran alat—dapat diterapkan berdasarkan per alat.

Ringkasan

Untuk mengelola akses alat MCP dengan produk API, selesaikan langkah-langkah berikut:

  1. Tambahkan kebijakan ParsePayload untuk mengekstrak nama alat MCP dari isi permintaan.
  2. Konfigurasi produk API dengan operasi alat MCP dan kuota per alat.
  3. Daftarkan aplikasi developer untuk mendapatkan kredensial klien.
  4. Tambahkan kebijakan autentikasi (kunci API atau OAuth 2.0) untuk memverifikasi kredensial klien terhadap produk API.
  5. Tambahkan kebijakan Quota untuk menerapkan batas frekuensi per alat.
  6. Pemfilteran alat pengujian untuk mengonfirmasi bahwa tools/list respons difilter berdasarkan konfigurasi produk API.

Menambahkan kebijakan ParsePayload

Kebijakan ParsePayload mengurai isi permintaan JSON-RPC dan mengekstrak operasi MCP, seperti tools/call/get_weather atau tools/list. Operasi yang diekstrak disimpan dalam flow variable yang diawali dengan nama kebijakan (misalnya, parsepayload.ParsePayload-MCP.operation), yang digunakan oleh kebijakan hilir untuk autentikasi dan penerapan kuota.

Tambahkan kebijakan ParsePayload berikut ke PreFlow permintaan proxy MCP Anda:

<ParsePayload name="ParsePayload-MCP">
    <DisplayName>Parse MCP Payload</DisplayName>
    <Source>request</Source>
    <PayloadType>JSON-RPC-2.0</PayloadType>
    <Protocol>MCP</Protocol>
</ParsePayload>

Dengan:

  • <Source>: Pesan yang akan diurai. Nilai defaultnya adalah request.
  • <PayloadType>: Format payload. Harus berupa JSON-RPC-2.0.
  • <Protocol>: Protokol yang akan digunakan untuk parsing. Harus berupa MCP untuk server MCP.

Setelah eksekusi, kebijakan akan mengisi variabel alur yang diawali dengan nama instance kebijakan, mengikuti pola parsepayload.policyName.suffix. Untuk kebijakan bernama ParsePayload-MCP, variabel berikut ditetapkan:

Variabel alur Deskripsi Nilai contoh
parsepayload.ParsePayload-MCP.operation Nama operasi turunan yang digunakan untuk pencocokan produk API dan penerapan kuota. tools/call/get_weather
parsepayload.ParsePayload-MCP.json-rpc.request.method Kolom method JSON-RPC dari permintaan. tools/call
parsepayload.ParsePayload-MCP.json-rpc.request.id Kolom id JSON-RPC dari permintaan. 1
parsepayload.ParsePayload-MCP.json-rpc.request.params.name Kolom params.name dari permintaan. get_weather

Mengonfigurasi produk API dengan operasi alat MCP

Produk API menentukan alat MCP mana yang dapat diakses oleh aplikasi klien dan batas kuota untuk setiap alat. Anda mengonfigurasi operasi alat MCP menggunakan kolom payloadOperationGroup dalam definisi produk API.

Setiap entri di payloadOperationGroup.operationConfigs menentukan:

  • Proxy API yang melayani alat MCP (apiSource).
  • Satu atau beberapa operasi alat (misalnya, tools/call/get_stock_price, tools/list).
  • Kuota opsional untuk serangkaian operasi tersebut.
UI pembuatan produk API yang menampilkan panel Operasi Payload dengan API Proxy yang ditetapkan ke mcp-discovery, Protocol yang ditetapkan ke MCP, dan opsi MCP Operation Type untuk List dan Call dengan konfigurasi kuota.

Gunakan panggilan API berikut untuk membuat produk API dengan operasi alat MCP:

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"
          }
        }
      ]
    }
  }'

Dengan:

  • ORG_NAME adalah nama organisasi Apigee Anda.
  • PRODUCT_NAME adalah nama internal produk API.
  • PRODUCT_DISPLAY_NAME adalah nama tampilan produk API.
  • MCP_PROXY_NAME adalah nama proxy API yang merutekan traffic ke server MCP Anda. Ini dapat berupa Proxy Penemuan MCP Apigee atau proxy dengan server MCP Anda sendiri sebagai backend.

Mengonfigurasi kuota per alat

Anda dapat mengonfigurasi kuota yang berbeda untuk setiap alat. Misalnya, konfigurasi berikut membatasi get_stock_price hingga 300 panggilan per menit, tetapi membatasi get_company_news hanya hingga 3 panggilan per menit:

{
  "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" }
      }
    ]
  }
}

Anda dapat membuat beberapa produk API dengan subset alat yang berbeda untuk menawarkan akses bertingkat. Misalnya, produk Basic mungkin hanya menyertakan tools/call/get_stock_price, sementara produk Premium menyertakan semua alat yang tersedia dengan kuota yang lebih tinggi. Setiap aplikasi developer dikaitkan dengan satu atau beberapa produk API, sehingga klien yang berbeda akan otomatis mendapatkan akses ke berbagai set alat dengan batas kecepatan yang berbeda.

Mendaftarkan aplikasi developer

Untuk mendapatkan kredensial API atau OAuth untuk pengujian, daftarkan developer dan buat aplikasi developer yang terkait dengan produk API yang Anda buat pada langkah sebelumnya.

  1. Daftarkan developer aplikasi di organisasi Apigee Anda.
  2. Buat aplikasi developer dan kaitkan dengan produk API Anda.
  3. Dapatkan kunci konsumen (kunci API) dari kredensial aplikasi. Gunakan kunci ini dalam contoh autentikasi berikut.

Menambahkan kebijakan autentikasi

Setelah menambahkan kebijakan ParsePayload, tambahkan kebijakan autentikasi untuk memverifikasi bahwa klien diizinkan menggunakan alat MCP yang diminta. Apigee mencocokkan operasi yang diekstrak dengan operasi yang ditentukan dalam produk API klien.

Jika alat yang diminta tidak tercantum dalam produk API klien, Apigee akan menampilkan error 401 Unauthorized.

Opsi 1: Autentikasi kunci API

Gunakan kebijakan VerifyAPIKey untuk mengautentikasi klien menggunakan kunci API. Tambahkan kebijakan ini ke PreFlow permintaan setelah kebijakan ParsePayload:

<VerifyAPIKey name="VerifyAPIKey-1">
    <DisplayName>Verify API Key</DisplayName>
    <APIKey ref="request.queryparam.apikey"/>
</VerifyAPIKey>

Klien meneruskan kunci API sebagai parameter kueri saat memanggil proxy MCP:

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

Anda juga dapat mengonfigurasi kebijakan untuk membaca kunci API dari header:

<VerifyAPIKey name="VerifyAPIKey-1">
    <DisplayName>Verify API Key</DisplayName>
    <APIKey ref="request.header.x-api-key"/>
</VerifyAPIKey>

Opsi 2: Autentikasi OAuth 2.0

Gunakan kebijakan OAuthV2 dengan operasi VerifyAccessToken untuk mengautentikasi klien menggunakan token akses OAuth 2.0. Tambahkan kebijakan ini ke PreFlow permintaan setelah kebijakan ParsePayload:

<OAuthV2 name="OAuthV2-VerifyAccessToken">
    <DisplayName>Verify OAuth Access Token</DisplayName>
    <Operation>VerifyAccessToken</Operation>
</OAuthV2>

Klien meneruskan token akses di header 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
  }'

Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi OAuth 2.0 di Apigee, lihat Mulai menggunakan OAuth2.

Menambahkan kebijakan Kuota

Tambahkan kebijakan Quota untuk menerapkan batas kapasitas per alat yang ditentukan dalam produk API. Kebijakan ini menggunakan UseQuotaConfigInAPIProduct untuk menerapkan konfigurasi kuota secara otomatis dari operasi produk API yang cocok.

Tambahkan kebijakan Kuota berikut ke PreFlow permintaan setelah kebijakan autentikasi:

<Quota name="Quota-PerToolLimit">
    <DisplayName>Per-Tool Quota</DisplayName>
    <UseQuotaConfigInAPIProduct stepName="AUTH_POLICY_STEP_NAME"/>
    <Distributed>true</Distributed>
</Quota>

Dengan AUTH_POLICY_STEP_NAME adalah nilai atribut name dalam elemen XML kebijakan autentikasi (baik VerifyAPIKey-1 maupun OAuthV2-VerifyAccessToken dalam contoh di halaman ini). Nilai ini harus cocok dengan atribut name kebijakan, bukan <DisplayName>.

Dengan konfigurasi ini, setiap operasi alat dibatasi lajunya secara independen sesuai dengan kuota yang ditentukan dalam produk API. Misalnya, jika tools/call/get_stock_price memiliki kuota 300 per menit dan tools/call/get_company_news memiliki kuota 3 per menit, setiap batas akan diterapkan secara terpisah meskipun kedua alat diakses melalui proxy yang sama.

Menyelesaikan konfigurasi proxy

Contoh berikut menunjukkan konfigurasi PreFlow permintaan lengkap untuk proxy MCP dengan ParsePayload, autentikasi kunci API, dan penerapan kuota per alat:

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

Pemfilteran alat

Saat klien mengirim permintaan tools/list melalui proxy MCP dengan autentikasi kunci API atau OAuth, Apigee akan otomatis memfilter respons untuk menyertakan hanya alat yang terdaftar di produk API klien.

Misalnya, jika produk API klien mencakup operasi tools/call/get_stock_price dan tools/call/get_company_news, respons tools/list dari server MCP akan difilter untuk menampilkan hanya get_stock_price dan get_company_news, meskipun server MCP mengekspos alat tambahan.

Pemfilteran ini terjadi secara default jika konfigurasi berikut diterapkan. Tidak diperlukan kebijakan pemfilteran khusus:

  • PreFlow permintaan mencakup ParsePayload dan kebijakan autentikasi (VerifyAPIKey atau OAuthV2).
  • Produk API mencakup tools/list di payloadOperationGroup.
  • Produk API menentukan operasi alat (misalnya, tools/call/get_stock_price) yang diizinkan untuk diakses klien.

Untuk menguji pemfilteran alat, kirim permintaan tools/list dengan kunci API klien:

curl -X POST "https://RUNTIME_HOSTNAME/mcp?apikey=API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/list",
    "id": 1
  }'

Jika produk API mencakup tools/call/get_stock_price dan tools/call/get_company_news, respons yang difilter akan terlihat mirip dengan berikut, meskipun server MCP mengekspos alat tambahan:

{
  "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
}

Alat yang tidak tercantum dalam produk API (misalnya, delete_account atau admin_reset) akan otomatis dihapus dari respons.

Sesi debug berikut menunjukkan langkah McpToolsFilterExecution dalam alur respons, dengan properti mcp_flow_info.mcp.allowed.tools yang mencantumkan alat yang diizinkan oleh produk API:

Sesi debug yang menampilkan langkah McpToolsFilterExecution dengan mcp_flow_info.mcp.allowed.tools yang mencantumkan alat yang difilter.

Menggunakan alur bersyarat untuk logika per alat

Gunakan alur bersyarat saat Anda memerlukan logika per alat di luar yang disediakan kuota produk API, seperti menerapkan tarif SpikeArrest khusus alat, merutekan ke backend yang berbeda, atau menambahkan transformasi permintaan untuk alat tertentu. Flow bersyarat menggunakan variabel flow parsepayload.policyName.operation untuk mencocokkan operasi MCP yang diekstrak.

Untuk kebijakan ParsePayload bernama ParsePayload-MCP:

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

Men-debug konfigurasi proxy

Gunakan alat Debug Apigee untuk memverifikasi bahwa kebijakan ParsePayload mengekstrak operasi MCP dengan benar dan kebijakan autentikasi dan kuota berfungsi seperti yang diharapkan.

Sesi debug yang menampilkan langkah ParsePayload-MCP dengan variabel alur termasuk parsepayload.ParsePayload-MCP.operation yang ditetapkan ke tools/list.

Dalam sesi debug, periksa variabel alur berikut setelah langkah kebijakan ParsePayload (dengan ParsePayload-MCP adalah nama kebijakan):

  • parsepayload.ParsePayload-MCP.operation: Harus berisi nama operasi lengkap (misalnya, tools/call/get_stock_price).
  • parsepayload.ParsePayload-MCP.json-rpc.request.method: Harus berisi metode JSON-RPC (misalnya, tools/call).

Batasan

  • Kebijakan ParsePayload hanya mendukung JSON-RPC-2.0 sebagai jenis payload.
  • Operasi alat produk API hanya mendukung metode tools/call dan tools/list. Pemfilteran alat untuk respons tools/list hanya berlaku untuk operasi tools/call yang dikonfigurasi di produk API.
  • Kebijakan ParsePayload mengurai seluruh isi permintaan. Apigee menerapkan batas ukuran isi permintaan default sebesar 10 MB, yang dapat dikonfigurasi hingga 30 MB menggunakan properti request.payload.parse.limit. Untuk mengetahui detailnya, lihat Referensi properti endpoint.
  • Kebijakan ParsePayload dengan protokol MCP hanya mem-parsing payload permintaan JSON-RPC (yang berisi kolom method dan params). Payload respons MCP tidak diuraikan.
  • Pemfilteran alat untuk respons tools/list memerlukan kebijakan ParsePayload dan autentikasi di PreFlow permintaan.

Langkah berikutnya