

# 在 AgentCore 閘道中呼叫工具
<a name="gateway-using-mcp-call"></a>

若要呼叫特定工具，請對閘道的 MCP 端點提出 POST 請求，並在請求內文、工具名稱和引數中指定 `tools/call`作為方法：

```
POST /mcp HTTP/1.1
Host: ${GatewayEndpoint}
Content-Type: application/json
Authorization: ${Authorization header}

${RequestBody}
```

取代以下的值：
+  `${GatewayEndpoint}` – 閘道的 URL，如 [CreateGateway](https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_CreateGateway.html) API 的回應所提供。
+  `${Authorization header}` – 當您設定[傳入](gateway-inbound-auth.md)授權時，來自身分提供者的授權憑證。
+  `${RequestBody}` – 請求內文的 JSON 承載，如[模型內容通訊協定 (MCP)](https://modelcontextprotocol.io/docs/getting-started/intro) 中的[呼叫工具](https://modelcontextprotocol.io/specification/2025-06-18/server/tools#calling-tools)所指定。包含 `tools/call`做為 `method`，並包含 工具`name`的 及其 `arguments`。

回應會傳回工具傳回的內容和相關聯的中繼資料。

## 呼叫工具的程式碼範例
<a name="gateway-using-mcp-call-examples"></a>

若要查看閘道中列出可用工具的範例，請選取下列其中一種方法：

**Example**  

1. 下列 curl 請求顯示透過 ID 為 `searchProducts`的閘道呼叫 工具的範例請求`mygateway-abcdefghij`。

   ```
   curl -X POST \
     https://mygateway-abcdefghij.gateway.bedrock-agentcore.us-west-2.amazonaws.com/mcp \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -d '{
       "jsonrpc": "2.0",
       "id": "invoke-tool-request",
       "method": "tools/call",
       "params": {
         "name": "searchProducts",
         "arguments": {
           "query": "wireless headphones",
           "category": "Electronics",
           "maxResults": 2,
           "priceRange": {
             "min": 50.00,
             "max": 200.00
           }
         }
       }
   }'
   ```

1. 

   ```
   import requests
   import json
   
   def call_tool(gateway_url, access_token, tool_name, arguments):
       headers = {
           "Content-Type": "application/json",
           "Authorization": f"Bearer {access_token}"
       }
   
       payload = {
           "jsonrpc": "2.0",
           "id": "call-tool-request",
           "method": "tools/call",
           "params": {
               "name": tool_name,
               "arguments": arguments
           }
       }
   
       response = requests.post(gateway_url, headers=headers, json=payload)
       return response.json()
   
   # Example usage
   gateway_url = "https://${GatewayEndpoint}/mcp" # Replace with your actual gateway endpoint
   access_token = "${AccessToken}" # Replace with your actual access token
   result = call_tool(
       gateway_url,
       access_token,
       "openapi-target-1___get_orders_byId",  # Replace with <{TargetId}__{ToolName}>
       {"orderId": "ORD-12345-67890", "customerId": "CUST-98765"}
   )
   print(json.dumps(result, indent=2))
   ```

1. 

   ```
   from mcp import ClientSession
   from mcp.client.streamable_http import streamablehttp_client
   import asyncio
   
   async def execute_mcp(
       url,
       token,
       tool_params,
       headers=None
   ):
       default_headers = {
           "Authorization": f"Bearer {token}"
       }
       headers = {**default_headers, **(headers or {})}
   
       async with streamablehttp_client(
          url=url,
          headers=headers,
       ) as (
           read_stream,
           write_stream,
           callA,
       ):
           async with ClientSession(read_stream, write_stream) as session:
               # 1. Perform initialization handshake
               print("Initializing MCP...")
               _init_response = await session.initialize()
               print(f"MCP Server Initialize successful! - {_init_response}")
   
               # 2. Call specific tool
               print(f"Calling tool: {tool_params['name']}")
               tool_response = await session.call_tool(
                   name=tool_params['name'],
                   arguments=tool_params['arguments']
               )
               print(f"Tool response: {tool_response}")
               return tool_response
   
   async def main():
       url = "https://${GatewayEndpoint}/mcp"
       token = "your_bearer_token_here"
       tool_params = {
           "name": "LambdaTarget___get_order_tool",
           "arguments": {
               "orderId": "order123"
           }
       }
       await execute_mcp(
           url=url,
           token=token,
           tool_params=tool_params
       )
   
   
   if __name__ == "__main__":
       asyncio.run(main())
   ```

1. 注意：這是用於叫用代理程式

   ```
   from strands.tools.mcp.mcp_client import MCPClient
   from mcp.client.streamable_http import streamablehttp_client
   
   def create_streamable_http_transport(mcp_url: str, access_token: str):
       return streamablehttp_client(mcp_url, headers={"Authorization": f"Bearer {access_token}"})
   
   def run_agent(mcp_url: str, access_token: str):
       mcp_client = MCPClient(lambda: create_streamable_http_transport(mcp_url, access_token))
   
       with mcp_client:
           result = mcp_client.call_tool_sync(
               tool_use_id="tool-123",  # A unique ID for the tool call
               name="openapi-target-1___get_orders",  # The name of the tool to invoke
               arguments={}  # A dictionary of arguments for the tool
           )
           print(result)
   
   url = {gatewayUrl}
   token = {AccessToken}
   run_agent(url, token)
   ```

1. 注意：這是用於叫用代理程式

   ```
   import asyncio
   
   from langgraph.prebuilt import create_react_agent
   
   def execute_agent(
       user_prompt,
       model_id,
       region,
       tools
   ):
       model = ChatBedrock(model_id=model_id, region_name=region)
   
       agent = create_react_agent(model, tools)
       _response = asyncio.run(agent.ainvoke({
           "messages": user_prompt
       }))
   
       _response = _response.get('messages', {})[1].content
       print(
           f"Invoke Langchain Agents Response"
           f"Response - \n{_response}\n"
       )
       return _response
   ```

## 錯誤
<a name="gateway-using-mcp-call-errors"></a>

`tools/call` 操作可能會傳回下列類型的錯誤：
+ 在 HTTP 狀態碼中傳回的錯誤：  
 **AuthenticationError**   
由於身分驗證登入資料無效，請求失敗。  
 **HTTP 狀態碼**：401  
 **AuthorizationError**   
呼叫者沒有叫用工具的許可。  
 **HTTP 狀態碼**：403  
 **ResourceNotFoundError**   
指定的工具不存在。  
 **HTTP 狀態碼**：404  
 **ValidationError**   
提供的引數不符合工具的輸入結構描述。  
 **HTTP 狀態碼**：400  
 **ToolExecutionError**   
執行工具時發生錯誤。  
 **HTTP 狀態碼**：500  
 **InternalServerError**   
發生內部伺服器錯誤。  
 **HTTP 狀態碼**：500
+ MCP 錯誤。如需這些錯誤類型的詳細資訊，請參閱[模型內容通訊協定 (MCP)](https://modelcontextprotocol.io/docs/getting-started/intro) 文件中的[錯誤處理](https://modelcontextprotocol.io/specification/2024-11-05/server/tools#error-handlinghttps://modelcontextprotocol.io/specification/2024-11-05/server/tools#error-handling)。