wa_phone_list
Retrieve available WhatsApp Business phone numbers from YCloud's API to manage messaging channels and verify account connectivity.
Instructions
List phone numbers
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "wa_phone_list"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/tools.ts:115-117 (registration)Maps OpenAPI operations containing 'whatsapp_phone_number_list' in their operationId to the shortened tool name 'wa_phone_list'.
} else if (operationId.includes('whatsapp_phone_number_list')) { operationId = 'wa_phone_list'; } else if (operationId.includes('whatsapp_phone_number_retrieve')) { - src/tools.ts:9-50 (schema)Extracts Zod schemas for input parameters from OpenAPI operation definitions, handling path, query params, and request body.
function extractParamsSchema(operation: any): any { const properties: Record<string, any> = {}; const required: string[] = []; // 处理路径参数 if (operation.parameters) { operation.parameters.forEach((param: any) => { if (param.in === 'path' || param.in === 'query') { let schema; switch (param.schema?.type) { case 'string': schema = z.string(); break; case 'integer': schema = z.number().int(); break; case 'number': schema = z.number(); break; case 'boolean': schema = z.boolean(); break; default: schema = z.any(); } properties[param.name] = schema; if (param.required) { required.push(param.name); } } }); } // 处理请求体 if (operation.requestBody) { properties['body'] = z.any(); required.push('body'); } return properties; } - src/tools.ts:152-219 (registration)Registers the MCP tool using server.tool() with dynamically generated name, description, Zod input schema, and a generic Axios proxy handler that forwards requests to the corresponding YCloud WhatsApp API endpoint.
const toolName = operationId; // 检查工具名称是否已注册 if (!registeredTools.has(toolName)) { server.tool( toolName, description, paramsSchema, async (args: Record<string, any>) => { try { // 解析URL中的路径参数 let url = `${apiBaseUrl}${path}`; Object.keys(args).forEach(key => { if (path.includes(`{${key}}`)) { url = url.replace(`{${key}}`, encodeURIComponent(String(args[key]))); delete args[key]; } }); // 提取请求体和查询参数 const { body, ...queryParams } = args as Record<string, any>; // 设置请求选项 const requestOptions: any = { url, method: method.toUpperCase(), headers: { 'Content-Type': 'application/json', ...headers }, params: Object.keys(queryParams).length > 0 ? queryParams : undefined, data: body, }; // 发送请求 const response = await axios(requestOptions); return { content: [{ type: 'text' as const, text: JSON.stringify(response.data, null, 2) }] }; } catch (error: unknown) { if (axios.isAxiosError(error) && error.response) { return { content: [{ type: 'text' as const, text: JSON.stringify({ error: true, status: error.response.status, message: error.response.data?.message || error.message, data: error.response.data }, null, 2) }] }; } return { content: [{ type: 'text' as const, text: JSON.stringify({ error: true, message: error instanceof Error ? error.message : String(error) }, null, 2) }] }; } } ); registeredTools.add(toolName); registeredToolsCount++; }