# 列出网关工具
在请求体中指定tools/list作为请求方法，获取网关提供的所有可用工具列表。返回结果包含工具名称、描述和参数定义等信息，可用于后续工具调用。
请求体示例：
```
{
  "jsonrpc": "2.0",
  "id": "list-tools-request",
  "method": "tools/list",
  "params": {
    "cursor": "<CURSOR>"
  }
}
```
其中cursor为可选参数，用于分页请求，首次请求无需携带。
响应体示例：
```
{
  "jsonrpc": "2.0",
  "id": "list-tools-request",
  "result": {
    "tools": [
      {
        "name": "tool_name",
        "description": "工具描述",
        "inputSchema": {}
      }
    ],
    "nextCursor": "<NEXT_CURSOR>"
  }
}
```
网关支持分页返回工具列表。当Target响应tools/list请求返回nextCursor字段且非空时，表示该Target有更多工具未返回，需要将nextCursor的值作为下一次请求的cursor参数继续请求，重复此过程直至nextCursor为空，即可获取完整的工具列表，详情请参见[MCP协议分页介绍](https://modelcontextprotocol.io/specification/draft/server/utilities/pagination)。
网关会根据不同的Target进行分页，每个Target的工具列表独立分页返回。即每次返回的工具属于同一Target，获取下一个Target的工具需要继续分页请求。每个Target最多返回1000个工具。
- API Key认证的tools/list调用示例
  ```
  import requests
  import json
  import re
  def list_tools(gateway_url, access_token):
      headers = {
          "Content-Type": "application/json",
          "Accept": "application/json, text/event-stream",
          "mcp-session-id": "<MCP_SESSION_ID>",  # MCP会话ID，相同的sessionid会使用同一网关资源，调用时请配置此参数，例如：4ada96ff-1e16-4e5b-8fb4-b3f0f207a4f3
          "Mcp-Protocol-Version": "<MCP_PROTOCOL_VERSION>",   # MCP协议版本          
          "Authorization": f"Bearer {access_token}"      
      }
      payload = {"jsonrpc": "2.0","id": "list-tools-request","method": "tools/list"}
      response = requests.post(gateway_url, headers=headers, json=payload) # 若需要忽略ssl校验，可补充参数verify=False
      raw = response.content.decode('utf-8', errors='replace')
      ct = response.headers.get('content-type', '')
      if 'text/event-stream' in ct:
          for line in raw.strip().split('\n'):
              if line.startswith('data:'):
                  try:
                      return json.loads(line[5:].strip())
                  except json.JSONDecodeError:
                      continue
          m = re.search(r'\{.*\}', raw, re.DOTALL)
          if m:
              return json.loads(m.group())
      try:
          return json.loads(raw)
      except json.JSONDecodeError:
          print(f"[Fail]: {raw[:200]}")
          return None
  gateway_url = "<GATEWAY_URL>"   # 网关接口地址（业务API调用入口）
  access_token = "<API_KEY>"      # 认证凭证：APIKey认证直接填写密钥；无认证则留空/删除
  result = list_tools(gateway_url, access_token)
  if result:
      print(json.dumps(result, indent=2, ensure_ascii=False))
  ```
  
- IAM认证的tools/list调用示例
  API签名详情请参见[API签名指南](https://support.huaweicloud.com/devg-apisign/api-sign-provide01.html)：
  ```
  import requests
  import json
  import re
  def list_tools(gateway_url, access_token):
      headers = {
          "Content-Type": "application/json",
          "Accept": "application/json, text/event-stream",
          "mcp-session-id": "<MCP_SESSION_ID>",     # MCP会话ID，相同的sessionid会使用同一网关资源，调用时请配置此参数，例如：4ada96ff-1e16-4e5b-8fb4-b3f0f207a4f3
          "Mcp-Protocol-Version": "<MCP_PROTOCOL_VERSION>",   # MCP协议版本 
          "X-Sdk-Date": "<X_SDK_DATE>",             # 网关鉴权时间戳
          "X-Sdk-Content-Sha256": "UNSIGNED-PAYLOAD",
          "Authorization": access_token                       
      }
      payload = {"jsonrpc": "2.0", "id": "list-tools-request", "method": "tools/list"}
      response = requests.post(gateway_url, headers=headers, json=payload) # 若需要忽略ssl校验，可补充参数verify=False
      raw = response.content.decode('utf-8', errors='replace')
      ct = response.headers.get('content-type', '')
      if 'text/event-stream' in ct:
          for line in raw.strip().split('\n'):
              if line.startswith('data:'):
                  try:
                      return json.loads(line[5:].strip())
                  except json.JSONDecodeError:
                      continue
          m = re.search(r'\{.*\}', raw, re.DOTALL)
          if m:
              return json.loads(m.group())
      try:
          return json.loads(raw)
      except json.JSONDecodeError:
          print(f"[Fail]: {raw[:200]}")
          return None
  gateway_url = "<GATEWAY_URL>"       # 网关接口地址（业务API调用入口）
  access_token = "<AUTHORIZATION>"    # 鉴权Authorization
  result = list_tools(gateway_url, access_token)
  if result:
      print(json.dumps(result, indent=2, ensure_ascii=False))
  ```
  
 
