Generated banner for API Gateway MCP Server
Generated logo for API Gateway MCP Server

API Gateway MCP Server

GoogleOfficialPublished by Google

  • Skill
  • Tool integration
  • Cloud and DevOps
  • Apache-2.0
  • Low risk
  • Has scripts

From the author

Configures Google Cloud API Gateway to act as a remote Model Context Protocol (MCP) server (Public Preview) that exposes REST APIs as agent tools over HTTP (POST /mcp). Use when migrating OpenAPI 2.0 specs to OpenAPI 3.x for MCP, annotating specs with x-google-api-management.mcp and x-google-mcp-tool, securing tools/list with JWTs or API keys, connecting Google ADK (McpToolset) or Apigee API hub and Agent Registry, or troubleshooting MCP JSON-RPC errors (-32601, -32602, -32000). Do not use for Apigee X proxy bundles, outbound LLM model routing, or GKE Gateway API.
— the description by Google

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill enables the transformation of REST APIs hosted on Google Cloud API Gateway into remote Model Context Protocol (MCP) servers. By annotating OpenAPI 3.x specifications with specific extensions, the gateway can translate MCP JSON-RPC 2.0 requests into standard HTTP REST calls. The skill provides a structured workflow for migrating OpenAPI 2.0 specs to 3.x, validating configurations, securing the MCP endpoint, and integrating with tools like the Google Agent Development Kit (ADK).

What it does

  • Converts REST APIs into MCP-compatible tools via OpenAPI 3.x annotations.
  • Validates OpenAPI specifications for MCP compatibility using a provided Python script.
  • Configures security for the MCP tools/list endpoint using JWTs or API keys.
  • Facilitates integration with Google ADK McpToolset and API hub discovery.
  • Provides guidance on troubleshooting common MCP JSON-RPC error codes.
  • Manages the lifecycle of API Gateway resources including creation, updates, and deletion.

When to use it

  • When you need to expose existing REST APIs as tools for AI agents using the Model Context Protocol.
  • When migrating legacy OpenAPI 2.0 specifications to OpenAPI 3.x for MCP support.
  • When you need to secure MCP tool discovery with specific authentication schemes.
  • When integrating Google Cloud-hosted APIs with agent frameworks like the Google ADK.

Advantages

  • Enables standard MCP communication over HTTP for Google Cloud-hosted services.
  • Leverages existing API Gateway authentication and quota management policies.
  • Supports automated discovery in API hub and Agent Registry.
  • Provides a deterministic validation loop to catch configuration errors before deployment.

Usage examples

“How do I annotate my OpenAPI 3.0 spec to expose a REST endpoint as an MCP tool?”
The skill provides the necessary x-google-mcp-tool annotations and explains how to define the tool name, description, and request body properties for LLM tool selection.
“Validate my OpenAPI spec for MCP deployment.”
The skill guides you to run the provided scripts/validate_mcp_openapi.py script to ensure your specification meets all requirements before attempting to create an API config.
“How can I connect my agent to the API Gateway MCP server?”
The skill provides a Python code sample using McpToolset and StreamableHTTPConnectionParams to connect to the gateway's /mcp endpoint.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/google/api-gateway-mcp-server/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip api-gateway-mcp-server.zip -d .agents/skills

Documentation by Google

API Gateway Remote MCP Server (Public Preview)

This skill converts new or existing REST APIs on Google Cloud API Gateway into remote Model Context Protocol (MCP) servers (POST https://{default_hostname}/mcp, Public Preview). By annotating an OpenAPI 3.x (3.0.x or 3.1.x) specification with x-google-api-management.mcp and x-google-mcp-tool, API Gateway translates MCP JSON-RPC 2.0 requests (initialize, notifications/initialized, tools/list, tools/call) into standard HTTP REST requests to your backend while enforcing existing authentication and quota policies.

Attribution

MUST READ: Before executing any gcloud, REST API, or MCP command, you MUST read Usage Attribution. For commands executed directly in the terminal (never in generated scripts, Terraform, or user code), prefix gcloud with CLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:api-gateway-mcp-server)" and append agent-skills/1.0 (skill:api-gateway-mcp-server) to User-Agent headers.

Prerequisites

  1. Install the Google Cloud CLI and the validator dependency:

    • Install the Google Cloud CLI. Then update it to the latest version with gcloud components update. An old CLI can fail when it uploads an OpenAPI 3.x API config.

    • Install Python 3.10 or later and PyYAML for the local OpenAPI MCP validator script:

      pip install "PyYAML>=6.0,<7.0"
  2. Authenticate your environment:

    • Local CLI session: gcloud auth login

    • Application Default Credentials (SDKs / ADK): gcloud auth application-default login

  3. Select or create a project, confirm billing, and pick a supported gateway location:

    • Select an existing project (gcloud config set project {project_id}) or create one (gcloud projects create {project_id}).

    • Confirm that an active billing account is linked to {project_id}. API Gateway has a free monthly allowance of API calls for each billing account, but you still need an active billing account to deploy. Calls above the allowance and network data transfer out are charged. For current prices, see API Gateway pricing.

    • Use us-central1 as the default --location for gateway commands. For the other supported regions, see API Gateway deployment model.

  4. Enable the required Google Cloud APIs:

    gcloud services enable \
      apigateway.googleapis.com \
      servicemanagement.googleapis.com \
      servicecontrol.googleapis.com \
      --project={project_id}

    For API hub discovery (optional), enable the API hub API in the API hub host project: gcloud services enable apihub.googleapis.com --project={hub_project_id}. To query Agent Registry (optional), also run gcloud services enable agentregistry.googleapis.com --project={project_id}.

  5. Verify the IAM roles (use the most restrictive role for each step):

    • To create and update the API, API configs, and gateways: API Gateway Admin (roles/apigateway.admin) on {project_id}. To run the gcloud services enable commands: Service Usage Admin (roles/serviceusage.serviceUsageAdmin) on that project.

    • To reference the gateway service account in an API config: Service Account User (roles/iam.serviceAccountUser) on {gateway_sa_name}@{project_id}.iam.gserviceaccount.com.

    • For a Cloud Run backend: grant the gateway service account the Cloud Run Invoker role (roles/run.invoker) on the service.

    • To mint test ID tokens as a caller service account: Service Account Token Creator (roles/iam.serviceAccountTokenCreator) on {caller_sa_email}.

    • Reference: Configure the development environment.

Decision Matrix: MCP Server Configuration and Client Integration

TaskRequired MechanismCritical GuardrailDetailed Reference
Migrate OpenAPI 2.0 (swagger: "2.0") or author OpenAPI 3.x for MCPRoot x-google-api-management.mcp + named backends + operation-level x-google-mcp-toolNEVER add MCP extensions to an OpenAPI 2.0 spec. Rationale: MCP is not supported for OpenAPI 2.0. Use OpenAPI 3.0.x or 3.1.x, and deploy the spec with gcloud api-gateway api-configs create. Keep all MCP operations in one OpenAPI document: if an API config has several documents, API Gateway serves the MCP tools of only one of them.OpenAPI 2.0 to 3.x Migration
Optimize tool names, descriptions, and schemas for LLM tool selectionx-google-mcp-tool (name, description, false) + described requestBody propertiesEvery operation MUST have an operationId, with or without MCP. Every exposed tool MUST resolve to a unique name that matches [A-Za-z0-9_.-]{1,128} (x-google-mcp-tool.name, or else the operationId), a non-empty description, and a non-empty response body (HTTP 204 is unsupported). Only GET, POST, PUT, PATCH, and DELETE operations can be tools, and a gateway serves at most 1,000 tools. API Gateway rejects complex nested schemas when you create the API config, but a simple nested object body works. In OpenAPI 3.1, give each schema one type, because API Gateway also rejects a type list such as type: ["string", "null"]. Describe each property, and check each tool's inputSchema in tools/list after you deploy.OpenAPI Agent Tool Optimizer
Secure tools/list and hide internal/admin routesx-google-api-management.mcp.tools-list.security (exactly one JWT or API key scheme; a JWT scheme is also listed in root security) + x-google-mcp-tool: falsetools/list is unauthenticated by default. It accepts one JWT scheme, or one API key scheme sent in the x-api-key header. API Gateway rejects a config whose JWT tools-list.security scheme is missing from the root security list, and that root entry also requires the JWT on every REST operation without its own security. If the root list already has an API key scheme, add the JWT to the same requirement object (AND): API Gateway does not support alternative (OR) requirements with an API key. An mcp object (for tools-list) also enables MCP for every eligible operation, so opt out each operation that agents must not use. x-google-mcp-tool: false hides a route from MCP only; keep REST security on admin routes.OpenAPI 2.0 to 3.x Migration
Connect Google ADK (McpToolset) and discover in API hub / Agent RegistryMcpToolset (StreamableHTTPConnectionParams) + API hub project attachmentNo separate registration step is needed. After you attach the API Gateway project to API hub, the MCP server appears in API hub as {your_api} (MCP) and in Agent Registry automatically.ADK and API Hub Discovery
Verify /mcp JSON-RPC lifecycle and troubleshoot -32601 / -32602 / -32000 errorsPOST https://{default_hostname}/mcp with MCP-Protocol-Version: 2025-11-25Keep /mcp at the host root: a servers base path (such as /v2) applies to REST paths only, and {basepath}/mcp returns HTTP 404. Nest JSON request bodies under params.arguments.body ({"body": {...}}). NEVER combine x-google-api-management.mcp with x-google-model-router in one config. Rationale: API Gateway does not allow MCP and model routing in the same API config.MCP Verification and Troubleshooting

Execution Workflow and Validation Loop

  1. Upgrade and annotate the OpenAPI 3.x specification:

    • The references in this skill contain the conversion rules: the Swagger 2.0 Construct Conversion Map covers each Swagger 2.0 construct, and the Complete Converted Example shows a finished spec with a Google ID token scheme. Use them before you search other sources.

    • Follow OpenAPI 2.0 to 3.x Migration and OpenAPI Agent Tool Optimizer to set openapi to a 3.0.x or 3.1.x version (the examples use 3.0.4), remove unsupported OpenAPI 2.0 fields (x-google-allow), define x-google-api-management.backends (with jwtAudience or disableAuth), configure x-google-api-management.mcp.tools-list.security with exactly one JWT or API key scheme (add a JWT scheme to the root security list too, in the same requirement object as any API key scheme), author x-google-mcp-tool descriptions stating when and why to invoke each tool, and opt out administrative routes (x-google-mcp-tool: false).

    • Before you deploy, give the user a short summary that states each of these points, and get approval:

      • MCP is not supported for OpenAPI 2.0, so you converted the spec to OpenAPI 3.x.

      • Which operations you exposed as tools, and which you opted out with x-google-mcp-tool: false. Opted-out operations stay on REST.

      • If tools/list uses a JWT scheme, the root security entry makes every REST operation without its own security require the JWT. The gateway rejects REST callers without it.

      • The MCP endpoint is https://{default_hostname}/mcp, at the host root even when the spec sets a servers base path.

      • The limits that apply: only GET, POST, PUT, PATCH, and DELETE operations can be tools, a gateway serves at most 1,000 tools, request parameters must be primitive types, API Gateway rejects complex nested schemas and OpenAPI 3.1 type lists (such as type: ["string", "null"]) when you create the API config, tools cannot return HTTP 204, and MCP is stateless with UTF-8 text responses only.

    • Give the same points when the user only asks for the converted spec or for advice, without a deploy.

    • Preserve exact quota metric names in x-google-api-management.metrics across API configs so existing gateways do not fail with HTTP 500 Failed to call Service Control Quota.

  2. Run the deterministic MCP OpenAPI validation loop before creating the API config:

    • Execute scripts/validate_mcp_openapi.py on {candidate_openapi_spec}:

      python3 scripts/validate_mcp_openapi.py --spec={candidate_openapi_spec}
    • If scripts/validate_mcp_openapi.py exits with code 1 (status: "FAIL"), fix every reported error in {candidate_openapi_spec} (such as OpenAPI 2.0 syntax, x-google-allow, path-level x-google-mcp-tool, undefined backend names, an operation without an operationId, missing descriptions, invalid or duplicate tool names, a header parameter with the reserved x-google- prefix, a tools-list.security scheme that is neither an oauth2 JWT nor an apiKey scheme, a JWT tools-list.security scheme missing from the root security list, alternative (OR) security requirements with an API key, or an x-google-model-router operation in an MCP spec) and re-run the script until it exits with code 0 (status: "PASS"). If it exits with code 2, fix the file path or YAML syntax error printed to stderr.

    • Read every warning (such as an HTTP 204 response, a request parameter that is not a primitive type, or operations that an mcp object exposes by default). Fix it, or tell the user why you keep it.

  3. Create the API (if new), create the API config, deploy the gateway, and enable the managed service (request human approval before updating a production gateway):

    gcloud api-gateway apis create {api_id} --project={project_id}
    
    gcloud api-gateway api-configs create {config_id} \
      --api={api_id} \
      --openapi-spec={candidate_openapi_spec} \
      --backend-auth-service-account={gateway_sa_name}@{project_id}.iam.gserviceaccount.com \
      --project={project_id}
    
    gcloud api-gateway gateways update {gateway_id} \
      --api={api_id} \
      --api-config={config_id} \
      --location={region} \
      --project={project_id}
    
    gcloud services enable $(gcloud api-gateway apis describe {api_id} --project={project_id} --format="value(managedService)") --project={project_id}

    (For a brand-new gateway, run gcloud api-gateway gateways create {gateway_id} ... instead of gateways update).

    • Run one api-configs create at a time per API. Wait for it to finish before you start the next one, because API Gateway creates only one config for an API at a time. A complex API config can take up to ten minutes to create.

    • If clients use API keys from other projects, enable the managed service in each of those projects too. API Gateway rejects an API key unless the API is enabled in the project that created the key.

  4. Verify the JSON-RPC 2.0 lifecycle and connect ADK / API hub:

    • Send every probe to https://{default_hostname}/mcp, even when the spec sets a servers base path.

    • An HTML 404 Page not found means that the gateway may not be deployed correctly. Check that the gateway state is ACTIVE and that the last create or update finished, and retry before you change the config. During a gateway update, some requests can still reach the previous API config. A JSON 404 (The current request is not defined by this API.) means that the active config does not define the path.

    • If tools/list requires a JWT, mint a Google ID token whose audience is in x-google-auth.audiences: gcloud auth print-identity-token --impersonate-service-account={caller_sa_email} --audiences={jwt_audience}. If tools/list requires an API key, send it in the x-api-key header.

    • Run the initialize, notifications/initialized, tools/list, and tools/call verification probes in MCP Verification and Troubleshooting.

    • Connect Google ADK (McpToolset) and verify automatic catalog discovery in Apigee API hub ({your_api} (MCP)) and Agent Registry using ADK and API Hub Discovery.

Pre-Deployment Checklist

  • [ ] Specification version is openapi: 3.0.x or 3.1.x (not swagger: "2.0"), omits x-google-allow, and does not contain x-google-model-router.

  • [ ] python3 scripts/validate_mcp_openapi.py --spec={candidate_openapi_spec} returns status: "PASS" (exit code 0).

  • [ ] Every operation has an operationId, and all MCP operations are in one OpenAPI document.

  • [ ] x-google-api-management.mcp.tools-list.security names exactly one scheme: an oauth2 JWT scheme with x-google-auth that the root security list also references, or an apiKey scheme with in: header and name: x-api-key.

  • [ ] If tools/list uses a JWT scheme, the user knows that REST operations without their own security now require that JWT.

  • [ ] Administrative, health-check, and HTTP 204 endpoints are opted out with x-google-mcp-tool: false, and opted-out admin paths remain protected on REST.

  • [ ] MCP clients call https://{default_hostname}/mcp (not {basepath}/mcp), nest tools/call JSON request bodies inside params.arguments.body, and send MCP-Protocol-Version: 2025-11-25.

Resource Cleanup

To avoid ongoing charges when tearing down a test or staging environment, request human approval and delete the gateway, API config, API, and service account in dependency order:

gcloud api-gateway gateways delete {gateway_id} --location={region} --project={project_id}
gcloud api-gateway api-configs delete {config_id} --api={api_id} --project={project_id}
gcloud api-gateway apis delete {api_id} --project={project_id}
gcloud iam service-accounts delete {gateway_sa_name}@{project_id}.iam.gserviceaccount.com --project={project_id}

Files

references/openapi-v2-to-v3-mcp-migration.md

OpenAPI 2.0 to 3.x Migration and MCP Extension Reference

  • Why OpenAPI 3.x Is Required for MCP: Lines 11-18

  • OpenAPI 2.0 to 3.x Extension Mapping Table: Lines 20-34

  • Swagger 2.0 Construct Conversion Map: Lines 36-54

  • Configuration of x-google-api-management.mcp and x-google-mcp-tool: Lines 56-132

  • Tool Discovery Security (tools/list) vs Tool Calls (tools/call): Lines 134-140

  • How MCP tools/call Arguments Map to REST Requests: Lines 142-148

  • Complete Converted Example: Lines 150-251

Why OpenAPI 3.x Is Required for MCP

Model Context Protocol (MCP) support in Google Cloud API Gateway (Public Preview) requires an OpenAPI 3.x specification: OpenAPI 3.0.x or 3.1.x. The examples in this reference use openapi: 3.0.4.

  • NEVER add x-google-api-management.mcp or x-google-mcp-tool to an OpenAPI 2.0 (swagger: "2.0") specification. Rationale: MCP is not supported for OpenAPI 2.0, and the MCP extensions are defined only for OpenAPI 3.x.

  • If an existing gateway runs an OpenAPI 2.0 specification, start from the spec file in the user's repository. If there is no file, find the active config ID with gcloud api-gateway gateways describe {gateway_id} --location={region} --project={project_id} --format="value(apiConfig.basename())", and print its spec with gcloud api-gateway api-configs describe {config_id} --api={api_id} --project={project_id} --view=FULL --format=json | python3 -c 'import base64,json,sys; [print(base64.b64decode(d["document"]["contents"]).decode()) for d in json.load(sys.stdin)["openapiDocuments"]]'. Then convert it with the Swagger 2.0 Construct Conversion Map, and compare your result with the Complete Converted Example.

References: Supported OpenAPI versions and Modify a gateway to use OpenAPI 3.x

OpenAPI 2.0 to 3.x Extension Mapping Table

Standard OpenAPI 2.0-to-3.0 converters update standard OpenAPI fields (swagger -> openapi, securityDefinitions -> components.securitySchemes), but leave Google extensions in their legacy OpenAPI 2.0 form. You MUST manually migrate those extensions according to this table:

FeatureOpenAPI 2.0 (swagger: "2.0")OpenAPI 3.xRequired Structural Change
BackendsInline x-google-backend object with snake_case fields (jwt_audience, path_translation, disable_auth)Root x-google-api-management.backends.{backend_name} map with camelCase fields (jwtAudience, pathTranslation, disableAuth) + x-google-backend: {backend_name} string referenceDefine named backends in x-google-api-management.backends (setting jwtAudience or disableAuth) and set x-google-backend to the string name.
JWT Authx-google-issuer, x-google-jwks_uri, x-google-audiences directly on the security schemex-google-auth: { issuer, jwksUri, audiences, jwtLocations } inside components.securitySchemes.{name}Nest the JWT settings inside x-google-auth: x-google-issuer becomes issuer, x-google-jwks_uri becomes jwksUri, and the comma-separated x-google-audiences string becomes an audiences list.
Quotasx-google-management arrays + x-google-quota: { metricCosts: { ... } }x-google-api-management.metrics and quota.limits YAML maps + x-google-quota: { {metric_name}: {cost} }Move metrics and limits into x-google-api-management as YAML maps (preserving exact metric names), and remove valueType, metricKind, and unit. Set each limit's values to a plain integer (no STANDARD key), and remove the metricCosts wrapper.
Endpoints (CORS)x-google-endpointsservers entry with x-google-endpoint: { allowCors: true }Only one servers entry can carry x-google-endpoint. Remove the legacy name field. For basePath, see the Swagger 2.0 Construct Conversion Map.
Route Catch-Allx-google-allow (all or configured)Unsupported in OpenAPI 3.xRemove x-google-allow. API Gateway does not support it in OpenAPI 3.x.
API Namex-google-api-namex-google-api-management.apiNameMove x-google-api-name into x-google-api-management.apiName.
MCP ServerUnsupportedx-google-api-management.mcp (root) and x-google-mcp-tool (operation level)Enable MCP globally or per operation.

Reference: OpenAPI 3.x extensions in API Gateway

Swagger 2.0 Construct Conversion Map

Convert these standard Swagger 2.0 constructs as shown. Where a row says to ask the user, the choice belongs to the user.

Swagger 2.0 constructOpenAPI 3.x for API Gateway MCP
basePath: /v2 (with or without host)servers: [{url: "https://{managed_service}/v2", x-google-endpoint: {}}], where {managed_service} is gcloud api-gateway apis describe {api_id} --project={project_id} --format="value(managedService)". REST paths stay under /v2. MCP stays at https://{default_hostname}/mcp.
Root x-google-backend: {address, path_translation}Named backend under x-google-api-management.backends (address, pathTranslation) + root x-google-backend: {backend_name}. For a Cloud Run backend, set jwtAudience to the Cloud Run service URL.
in: body parameterrequestBody.content.application/json.schema.
definitions and #/definitions/{name}components.schemas and #/components/schemas/{name}.
securityDefinitionscomponents.securitySchemes.
consumes / producesMove the media types into requestBody.content and responses.content. Use application/json for tool operations: tools/call sends the request body as JSON in arguments.body, and tool responses are limited to UTF-8 text.
in: formData (application/x-www-form-urlencoded)requestBody with that media type. Recommendation: set x-google-mcp-tool: false, because MCP clients pass the request body as JSON in arguments.body.
type: file (file upload)requestBody with multipart/form-data and a type: string, format: binary property. Recommendation: set x-google-mcp-tool: false, because MCP tool arguments are JSON values.
collectionFormat array parameterAPI Gateway supports only primitive types in request parameters. Ask the user: keep the array for REST and set x-google-mcp-tool: false, or change the parameter to a primitive type (such as a comma-separated string) that the backend accepts.
deprecated: true operationKeep it for REST. Ask the user before you expose it as a tool, because agents can start to depend on it.
Operation with only 4xx responsesAdd the success response that the backend returns, with its JSON schema. Tools cannot return an empty body (HTTP 204).
DELETE or other destructive operationAsk the user before you expose it. If you expose it, warn in the tool description, because API Gateway does not emit destructiveHint annotations.
No securityAdd the scheme that the user asks for to x-google-api-management.mcp.tools-list.security. If it is a JWT scheme, also list it in the root security. See Complete Converted Example.

Configuration of x-google-api-management.mcp and x-google-mcp-tool

You can enable MCP globally at the document root (x-google-api-management.mcp: true or object form) and customize or opt out individual operations using x-google-mcp-tool at the operation level.

  • Place x-google-mcp-tool ONLY on individual HTTP operation objects (get, post, put, patch, delete). NEVER place x-google-mcp-tool at the path item level. Rationale: API Gateway rejects specifications that declare x-google-mcp-tool at the path level.

  • Every operation MUST have an operationId, with or without MCP. Rationale: API Gateway rejects an API config that has an operation without an operationId.

  • Every exposed operation MUST also have a configured backend (x-google-backend at root or operation level), a unique tool name that matches [A-Za-z0-9_.-]{1,128} (x-google-mcp-tool.name, or else the operationId), and a non-empty description (x-google-mcp-tool.description, operation description, or summary).

  • Keep all MCP operations in one OpenAPI document. Rationale: If an API config has several OpenAPI documents, API Gateway serves the MCP tools of only one of them, and the tools of the other documents are missing without an error.

openapi: 3.0.4
info:
  title: Orders API
  version: 1.0.0
x-google-api-management:
  mcp:
    tools-list:
      security:
        agent_jwt: []
  backends:
    orders-backend:
      address: https://{backend_service}-{hash}.a.run.app
      jwtAudience: https://{backend_service}-{hash}.a.run.app
      pathTranslation: APPEND_PATH_TO_ADDRESS
x-google-backend: orders-backend
components:
  securitySchemes:
    api_key:
      type: apiKey
      name: x-api-key
      in: header
    agent_jwt:
      type: oauth2
      flows:
        implicit:
          authorizationUrl: ""
          scopes: {}
      x-google-auth:
        issuer: "https://accounts.google.com"
        jwksUri: "https://www.googleapis.com/oauth2/v3/certs"
        audiences:
          - "{oauth_client_id}"
security:
  - api_key: []
    agent_jwt: []
paths:
  /v1/orders/{orderId}:
    get:
      operationId: getOrderStatus
      summary: Get order status
      description: Returns fulfillment status, carrier tracking number, and ETA for an order.
      x-google-mcp-tool:
        name: get_order_status
        description: >-
          Look up the fulfillment status, carrier tracking number, and delivery ETA for a customer order.
          Call this tool when the user asks where an order is or needs the SKU before creating a return.
      parameters:
        - name: orderId
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Order details
  /v1/admin/orders/purge:
    delete:
      operationId: purgeOrders
      summary: Purge archived orders
      description: Administrative operation to purge archived order records.
      x-google-mcp-tool: false
      responses:
        "200":
          description: Purge status

Reference: Configure Model Context Protocol

Tool Discovery Security (tools/list) vs Tool Calls (tools/call)

MCP MethodDefault SecurityHow to ConfigureCritical Constraint
initialize and notifications/initializedUnauthenticatedNo configurationThese protocol lifecycle methods are always unauthenticated.
tools/listUnauthenticated by defaultx-google-api-management.mcp.tools-list.security (+ the same scheme in the root security list for a JWT scheme)Must reference exactly one scheme in components.securitySchemes: a JWT scheme (oauth2 with x-google-auth) or an API key scheme (apiKey). For a JWT scheme, the root security list MUST also reference it (API Gateway rejects the config otherwise), and that root entry also requires the JWT on every REST operation without its own security. If the root list has an API key scheme, put the JWT in the same requirement object (AND), because API Gateway does not support alternative (OR) requirements with an API key. For an API key scheme, use in: header and name: x-api-key, because tools/list reads API keys only from the x-api-key header. Configuring mcp as an object also enables MCP globally for all eligible operations.
tools/callInherits the operation's security requirementOperation or root security block (apiKey and/or oauth2 JWT)Shares the exact same authentication and x-google-quota allocation as direct REST calls to that operation.

How MCP tools/call Arguments Map to REST Requests

When an MCP client invokes tools/call, API Gateway synthesizes the tool's inputSchema and maps params.arguments into the outbound HTTP REST request as follows:

  1. Path and query parameters (in: path, in: query): Become top-level properties inside params.arguments, keyed by their exact OpenAPI parameter name (for example, "arguments": {"orderId": "ORD-10042"}).

  2. JSON request body (requestBody): Nested under a single top-level property named body inside params.arguments (for example, "arguments": {"orderId": "ORD-10042", "body": {"itemSku": "SKU-1", "reason": "DEFECTIVE"}}). Passing body fields at the top level of arguments without the body wrapper fails validation with JSON-RPC error -32602 (Invalid tool arguments).

  3. Header parameters (in: header): Become top-level properties inside params.arguments and are injected as HTTP headers on the backend call. You cannot bind parameters to reserved system headers or headers starting with x-google-.

Complete Converted Example

This example is a Swagger 2.0 API with basePath: /v2, a root x-google-backend, a GET, a POST with a body, and a DELETE, converted for MCP. To list or call tools, a caller needs a valid Google ID token whose audience is {jwt_audience}.

openapi: 3.0.4
info:
  title: Petstore API
  version: 1.4.0
servers:
  - url: https://{managed_service}/v2
    x-google-endpoint: {}
x-google-api-management:
  mcp:
    tools-list:
      security:
        google_id_token: []
  backends:
    petstore-backend:
      address: https://{backend_service}-{project_number}.{region}.run.app
      jwtAudience: https://{backend_service}-{project_number}.{region}.run.app
      pathTranslation: APPEND_PATH_TO_ADDRESS
x-google-backend: petstore-backend
security:
  - google_id_token: []
components:
  securitySchemes:
    google_id_token:
      type: oauth2
      flows:
        implicit:
          authorizationUrl: ""
          scopes: {}
      x-google-auth:
        issuer: https://accounts.google.com
        jwksUri: https://www.googleapis.com/oauth2/v3/certs
        audiences:
          - "{jwt_audience}"
  schemas:
    Pet:
      type: object
      required: [name]
      properties:
        id: {type: integer, format: int64}
        name: {type: string, description: 'Pet name, for example "Buddy".'}
        status: {type: string, enum: [available, pending, sold]}
paths:
  /pet/{petId}:
    get:
      operationId: getPetById
      summary: Find pet by ID
      x-google-mcp-tool:
        name: get_pet
        description: >-
          Get one pet by its numeric ID. Use this when the user asks about a specific pet.
      parameters:
        - {name: petId, in: path, required: true, schema: {type: integer, format: int64}}
      responses:
        "200":
          description: The pet
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Pet'}
    delete:
      operationId: deletePet
      summary: Delete a pet
      x-google-mcp-tool: false
      parameters:
        - {name: petId, in: path, required: true, schema: {type: integer, format: int64}}
      responses:
        "200":
          description: The pet was deleted
  /pet:
    post:
      operationId: addPet
      summary: Add a new pet to the store
      x-google-mcp-tool:
        name: add_pet
        description: >-
          Add a new pet to the store catalog. Use this when the user wants to list a new pet for sale.
      requestBody:
        required: true
        content:
          application/json:
            schema: {$ref: '#/components/schemas/Pet'}
      responses:
        "200":
          description: The created pet
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Pet'}

Values to fill in:

  • {managed_service}: gcloud api-gateway apis describe {api_id} --project={project_id} --format="value(managedService)".

  • {jwt_audience}: the audience that callers request when they mint a token, such as https://{managed_service}. Do not use an IP address or an internal address, because API Gateway does not accept them in the aud claim. A caller gets a matching token with gcloud auth print-identity-token --impersonate-service-account={caller_sa_email} --audiences={jwt_audience}. The token has iss: https://accounts.google.com and aud: {jwt_audience}.

  • API Gateway checks the token claims against the scheme. It does not check the IAM permissions that you granted to the caller's service account. A Google ID token scheme accepts every caller that can get a Google ID token with this audience. To accept only one service account, check the email claim in the backend (API Gateway forwards the JWT payload in the X-Apigateway-Api-Userinfo header), or use a self-signed JWT with issuer set to the service account email.

References:

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an MCP server, Needs an API key, Needs a command-line tool, Needs Python

Security

What our scanner noticed· Low risk

  • Instructions that use the network
  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
Google
Publisher
Google (Official)
Source
google/skills · skills/cloud/api-gateway-mcp-server · commit 2194d3b
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Google.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download api-gateway-mcp-server.zip