[アップデート] Amazon  Bedrock AgentCore GatewayのターゲットにAmazon API Gatewayが追加されました

[アップデート] Amazon Bedrock AgentCore GatewayのターゲットにAmazon API Gatewayが追加されました

2025.12.04

こんにちは、コンサルティング部の神野です。
re:Inventに現地参加で毎日楽しくセッションに参加したりブログを書いています。

本日は下記アップデートについてご紹介させてください!

https://aws.amazon.com/jp/about-aws/whats-new/2025/12/api-gateway-mcp-proxy-support/

タイトルを見るとAmazon API Gateway単独のMCP Proxy機能と思われそうですが、本アップデートはAmazon Bedrock AgentCore Gatewayと密に連携した機能で、Gatewayのターゲットが追加されたアップデートになります。

アップデート内容

前提として、今までのAmazon Bedrock AgentCore Gatewayのターゲットを確認すると下記が挙げられます。

CleanShot 2025-12-04 at 01.20.53@2x

  • Lambda関数
  • OpenAPI仕様のAPI
  • Smithy モデルのAPI
  • Remote MCP Server
  • Built-in templates(Slack、Jiraなど)

今回のアップデートは、API Gatewayもターゲット追加できるようになりました!

CleanShot 2025-12-04 at 01.24.14@2x

あれ、OpenAPI仕様のAPIならAPI Gatewayもターゲットに追加できたのでは?何が違うのって思うかもしれません。私も最初見たとき思いました。
ただ、今まではOpenAPI仕様書を用意して汎用的なAPIサーバーとして接続する形式だったため、API Gatewayに特化した連携方法ではありませんでした。

そこが今回のアップデートでターゲットにAPI Gatewayが誕生してより連携しやすくなった、嬉しいアップデートです。早速やってみましょう。

やってみる

全部コンソール上からやってみます。

API Gatewayの作成

まずはAPI Gatewayに簡単なREST APIを作成します。
まずはコンソール上からREST APIを選択して作成します。

CleanShot 2025-12-04 at 01.32.37@2x

今回は固定のレスポンスで構わないので、Example APIを選択します。

CleanShot 2025-12-04 at 01.44.17@2x

作成したらAPIをデプロイします。

CleanShot 2025-12-04 at 01.57.47@2x

新しいステージを作成する必要があるので、testとして作成してみます。

CleanShot 2025-12-04 at 01.58.01@2x

これでAPI Gateway側の準備は完了です。

Amazon Bedrock AgentCore Gatewayの作成

こちらもコンソール上から作成します。
GatewayのタブからCreate Gatewayを選択します。

CleanShot 2025-12-04 at 02.00.36@2x

名前は任意の名前として、Inbound AuthはUse JSON Web Tokens(JWT)を選択します。また簡単にCognitoの作成および設定を行ってくれる、Quick create configurations with Cognitoを選択します。
私も初めて使ったのですが、サクッと認証付きのAgentCore Gatewayを作る際には便利でした!

CleanShot 2025-12-04 at 02.00.59@2x

Target typeに新しいターゲットAPI Gatewayが追加されています。もちろん今回はTarget typeにAPI Gatewayを選択します。
またAPIはサンプルで作った、PetStore、ステージはtestを選択します。

APIを選択する必要があるのですが、今回は下記を選択します。

  • /pets - GET
    • 全ペット取得API
  • /pets - POST
    • ペット作成API
  • /pets/{petId} - GET
    • IDに紐づくペット取得API

サンプルで作ったAPIのOpenAPI定義には/pets - GETのみoperationIdがないので、Name overrideにどういったオペレーションをするか名前を要求されています。
この箇所はGetAllPetsとします。入力した値がツール名の一部として反映されます。

CleanShot 2025-12-04 at 02.02.04@2x

作成した後はGateway URLを控えておきます。

CleanShot 2025-12-04 at 02.59.25@2x

またCognitoも自動作成されているので、ClientID、Secretなど確認して控えておきます。

自動生成されたApp Clientを確認して、ClientIDとSecretをメモしておきます。

CleanShot 2025-12-04 at 03.03.58@2x

またトークンを取得するエンドポイントも確認します。
Domainのタブから情報を確認できるのでコピーしておきます。

CleanShot 2025-12-04 at 03.05.15@2x

これでリソースの準備は完了です!実際にGateway経由で疎通できるか確認していきます。

テスト

まずはトークンの取得処理を作成します。
TOKEN_ENDPOINTは事前に取得したCognito Domainの値に変更します。/oauth2/tokenエンドポイントにアクセスします。

get_cognito_token.py
"""Cognito Client Credentials Flow でアクセストークンを取得するスクリプト"""

import os
import base64
import requests

# 設定
TOKEN_ENDPOINT = "https://xxx.auth.us-west-2.amazoncognito.com/oauth2/token"
CLIENT_ID = os.environ.get("COGNITO_CLIENT_ID", "xxx")
CLIENT_SECRET = os.environ.get("COGNITO_CLIENT_SECRET")

def get_access_token():
    if not CLIENT_SECRET:
        raise ValueError("環境変数 COGNITO_CLIENT_SECRET を設定してください")

    credentials = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode()).decode()

    headers = {
        "Authorization": f"Basic {credentials}",
        "Content-Type": "application/x-www-form-urlencoded"
    }

    data = {
        "grant_type": "client_credentials"
    }

    response = requests.post(TOKEN_ENDPOINT, headers=headers, data=data)
    response.raise_for_status()

    return response.json()

また環境変数にCLIENT_IDCLIENT_SECRETを事前に取得した値を設定します。

export CLIENT_ID=xxx
export CLIENT_SECRET=yyy

まずは、利用可能なツール一覧を取得する処理list_tools.pyを作成します。
GATEWAY_URLは事前に確認した、AgentCore GatewayのURLを指定します。

"""Bedrock AgentCore Gateway からツール一覧を取得するスクリプト"""

import json
import os

import requests

from get_cognito_token import get_access_token

GATEWAY_URL = "https://gateway-quick-start-xxx.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"

def list_tools(gateway_url: str, bearer_token: str):
    """List all available tools from the gateway"""
    response = requests.post(
        gateway_url,
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {bearer_token}",
        },
        json={
            "jsonrpc": "2.0",
            "id": 1,
            "method": "tools/list",
            "params": {},
        },
    )

    print(f"Status Code: {response.status_code}")
    print(f"Response Body: {json.dumps(response.json(), indent=2)}")
    return response

if __name__ == "__main__":
    if not GATEWAY_URL:
        raise ValueError("環境変数 GATEWAY_URL を設定してください")

    # Cognitoからアクセストークン取得
    token_response = get_access_token()
    access_token = token_response.get("access_token")

    # ツール一覧取得
    list_tools(GATEWAY_URL, access_token)

実行して疎通できるか確認してみます。

python3 list_tools.py

# 実行結果
Status Code: 200
Response Body: {
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "inputSchema": {
          "type": "object",
          "properties": {
            "basePath": {
              "type": "string"
            },
            "price": {
              "type": "number"
            },
            "type": {
              "type": "string",
              "enum": [
                "dog",
                "cat",
                "fish",
                "bird",
                "gecko"
              ]
            }
          }
        },
        "name": "target-quick-start-xxx___CreatePet",
        "description": "CreatePet"
      },
      {
        "inputSchema": {
          "type": "object",
          "properties": {
            "basePath": {
              "type": "string"
            },
            "page": {
              "type": "string"
            },
            "type": {
              "type": "string"
            }
          }
        },
        "name": "target-quick-start-xxx___GetAllPets",
        "description": "GetAllPets"
      },
      {
        "inputSchema": {
          "type": "object",
          "properties": {
            "petId": {
              "type": "string"
            },
            "basePath": {
              "type": "string"
            }
          },
          "required": [
            "petId"
          ]
        },
        "name": "target-quick-start-xxx___GetPet",
        "description": "GetPet"
      }
    ]
  }
}

認証もパスしてツールの一覧を取得できました!
それぞれのツール名はターゲット名___OperationID or 上書きした名前の命名になります。
次はGetAllPetを実行するスクリプトcall_get_all_pets.pyを作成します。

GATEWAY_URLは事前に確認した、AgentCore GatewayのURLを指定し、target-quick-start-axxx___GetAllPetsの箇所は一覧で取得したGetAllPetsの値を記載します。

#!/usr/bin/env python3
"""Bedrock AgentCore Gateway の GetAllPets ツールを呼び出すスクリプト"""

import json
import os

import requests

from get_cognito_token import get_access_token

GATEWAY_URL = "https://gateway-quick-start-xxx.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp"

def call_tool(
    gateway_url: str, bearer_token: str, tool_name: str, arguments: dict = None
):
    """Call a specific tool on the gateway"""
    response = requests.post(
        gateway_url,
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {bearer_token}",
        },
        json={
            "jsonrpc": "2.0",
            "id": 1,
            "method": "tools/call",
            "params": {
                "name": tool_name,
                "arguments": arguments or {},
            },
        },
    )

    print(f"Status Code: {response.status_code}")
    print(f"Response Body: {json.dumps(response.json(), indent=2)}")
    return response

def get_all_pets(
    gateway_url: str, bearer_token: str, page: str = None, pet_type: str = None
):
    """GetAllPets ツールを呼び出す"""
    arguments = {}
    if page:
        arguments["page"] = page
    if pet_type:
        arguments["type"] = pet_type

    return call_tool(
        gateway_url, bearer_token, "target-quick-start-xxx___GetAllPets", arguments
    )

if __name__ == "__main__":
    if not GATEWAY_URL:
        raise ValueError("環境変数 GATEWAY_URL を設定してください")

    # Cognitoからアクセストークン取得
    token_response = get_access_token()
    access_token = token_response.get("access_token")

    # GetAllPets 呼び出し
    get_all_pets(GATEWAY_URL, access_token)

実行してみます。

python3 call_get_all_pets.py

# 実行結果
Status Code: 200
Response Body: {
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": false,
    "content": [
      {
        "type": "text",
        "text": "[{\"id\":1,\"type\":\"dog\",\"price\":249.99},{\"id\":2,\"type\":\"cat\",\"price\":124.99},{\"id\":3,\"type\":\"fish\",\"price\":0.99}]"
      }
    ]
  }
}

一覧が取得できましたね!
API Gatewayの連携は割とスムーズにできました!

使うには前提条件がある

API GatewayをMCP Proxyとして使うには前提条件があります。満たしているかは事前に確認しましょう。

https://docs.aws.amazon.com/apigateway/latest/developerguide/mcp-server.html#w2aac15c11c11c34c11b7

引用(翻訳)

  • AgentCore Gateway が既に存在している必要があります。
  • パブリックな REST API のみがサポートされています。
  • API のデフォルトのエンドポイントは無効にできません。
  • API の各メソッドには、オペレーション名が定義されているか、ステージをターゲットとして追加する際に名前のオーバーライドを作成する必要があります。この名前は、エージェントがメソッドとやり取りするためのツール名として使用されます。
  • AgentCore Gateway が API にアクセスできるように、アウトバウンド認証には、API_KEY、NO_AUTH、または GATEWAY_IAM_ROLE のいずれかの認証情報プロバイダータイプを使用できます。API_KEY 認証情報プロバイダーは AgentCore Gateway によって定義されます。既存の API Gateway API キーを使用できます。詳細については、アウトバウンド認証の設定を参照してください。
  • Amazon Cognito ユーザープールまたは Lambda オーソライザーを使用して API へのアクセスを制御している場合、MCP クライアントはアクセスできません。
  • API は AgentCore Gateway と同じアカウントおよびリージョンに存在する必要があります。

やはりAgentCore Gatewayを前提としたアップデートですね。
API Gateway単独でMCP Proxyを実現するといったアップデートではない模様です。

また、API GatewayがCognito ユーザープールまたは Lambda オーソライザーを使用して API へのアクセスを制御している場合、MCP クライアントがアクセスできない点に注意したいですね・・・そうなんだ・・・
もし使っている場合で統合したいケースは認証方式の見直しが必要になりそうです。
ここは新規で作るコストと認証の見直しを行うのとどちらがコストやリスクがあるかのトレードオフな気がしました。
AIエージェントのツールから直接APIをコールするのも手かと思います。

おわりに

Amazon Bedrock AgentCore GatewayのターゲットにAPI Gatewayが追加されたので試してみました!
直感的にGatewayのターゲットにAPI Gatewayを指定できるようになったのは便利ですね。既存のAPIをMCP ツールとして使いたい場合は便利なアップデートだと思います。

ただAPI GatewayがCognito ユーザープールまたは Lambda オーソライザーで認証設定している場合は、利用できないので認証スキームを見直して適合させるか、API Gatewayを新規作成、もしくはAgentCore Gatewayを経由せず直接AIエージェントからツールでRestAPIを実行するなどの選択肢になるかと思います。

本記事が少しでも参考になりましたら幸いです。最後までご覧いただきありがとうございましたー!!

補足

今回はAgentCore Gatewayからターゲットを指定しましたが、API Gatewayからも追加可能になります。
AgentCore targetsといったタブが新しく追加されているので、ここからAPI GatewayをAgentCore Gatewayのターゲットに追加することが可能です。

CleanShot 2025-12-04 at 04.37.00@2x

Add AgentCore targetボタンをクリックすると下記入力画面が表示されて、AgentCore Gatewayの設定時とほぼ同一の内容です。API Gatewayの画面、Gatewayの画面どちらからターゲットを指定するか導線の違いだけで設定する内容は同じです。

CleanShot 2025-12-04 at 04.37.26@2x

この記事をシェアする

FacebookHatena blogX

関連記事