手机归属地查询 MCP 服务:在 AI 客户端里直接问号码归属地

约 15 分钟 入门手机号码归属地查询MCP 服务AI 客户端对话式查询
# 手机归属地查询 MCP 服务:在 AI 客户端里直接问号码归属地 接口:手机归属地查询(apiCode=6,接入点 6-1)|是否免费:是,注册后默认可调用,设使用档次限制|请求方式:POST / GET|返回格式:JSON|适用人群:使用支持 MCP 的 AI 客户端、想用对话方式查号码的用户|阅读时间:约 8 分钟|最后实测核对:2026-09-18 查一个号码是哪里的,不必每次都打开代码编辑器。易源给手机归属地查询接口配了 MCP 服务,把它填进支持 MCP 的 AI 客户端的配置里,之后在对话里直接说号码,模型就会调接口把结果读回来。这篇给出实测通过的配置和握手过程。 ## 核心要点 - MCP 服务地址是 `http://www.showapi.com.cn/mcp/6/{appKey}`,注意域名是 `.com.cn`,跟官网的 `.com` 不同。 - 服务暴露的工具名是「手机归属地查询」,入参只有一个 `num`。 - 实测调用返回的内容除了原始 JSON,还附带一段逐字段的参数说明,模型能据此解释结果。 ## 服务地址与能力 | 项目 | 内容 | |------|------| | MCP 服务地址 | `http://www.showapi.com.cn/mcp/6/YOUR_APPKEY` | | 传输方式 | HTTP,JSON-RPC 2.0,响应为 SSE 帧 | | 暴露的工具 | 手机归属地查询 | | 工具入参 | `num`(String,要查询的手机号码) | | 覆盖的接入点 | 6-1 | | 鉴权 | AppKey 拼在地址路径里 | AppKey 直接写在地址的最后一段,不用额外的请求头。地址里的 `YOUR_APPKEY` 换成你在控制台拿到的 AppKey 即可。 ## 客户端配置 支持自定义 MCP 客户端的工具,配置写法基本一致,把服务地址填进去就行。 ```json { "mcpServers": { "showapi-phone-attribution": { "url": "http://www.showapi.com.cn/mcp/6/YOUR_APPKEY" } } } ``` 如果客户端要求区分传输类型,按 remote HTTP 方式配置。保存后重启客户端,工具列表里应该出现「手机归属地查询」。 ## 实测握手过程 用命令行验证服务可用性时,握手顺序是固定的三步。第一步 `initialize`,从响应头里取会话 ID。 ```bash U="http://www.showapi.com.cn/mcp/6/YOUR_APPKEY" SID=$(curl -s -i -X POST "$U" \ -H "content-type: application/json" \ -H "accept: application/json, text/event-stream" \ --data-raw '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1.0"}}}' \ | grep -i "mcp-session-id" | tr -d "\r" | awk "{print \$2}") echo "$SID" ``` 2026-09-18 实测拿到的会话 ID 形如 `aqyjtg9jMMkNAABC`。 第二步补发 `initialized` 通知。少了这一步,下一步会返回 `-32601 Method not found`。 ```bash curl -s -X POST "$U" \ -H "content-type: application/json" \ -H "accept: application/json, text/event-stream" \ -H "Mcp-Session-Id: $SID" \ --data-raw '{"jsonrpc":"2.0","method":"notifications/initialized"}' > /dev/null ``` 第三步列工具。 ```bash curl -s -X POST "$U" \ -H "content-type: application/json" \ -H "accept: application/json, text/event-stream" \ -H "Mcp-Session-Id: $SID" \ --data-raw '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' ``` 实测返回的 `tools` 数组里有一个条目: ```json { "name": "手机归属地查询", "description": "提供手机号码归属地查询服务,可参考获取对应省份、城市、邮政编码及区号等信息。", "inputSchema": { "type": "object", "properties": { "num": { "type": "string", "description": "要查询的手机号码" }, "content-type": { "type": "string", "description": "" } } } } ``` `inputSchema` 里除了 `num` 还有一个 `content-type` 字段,`description` 是空的,调用时不传它也能正常工作。 ## 调用工具 `num` 是业务参数,工具名是中文,命令行发送时必须用 UTF-8 编码的请求体。先把请求体写成 UTF-8 文件,再用 `--data-binary` 发送,避免中文在传输过程中被转成其他编码导致工具名匹配不上。 ```python import json, pathlib body = { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "手机归属地查询", "arguments": {"num": "13800138000"}}, } pathlib.Path("mcp-call.json").write_text( json.dumps(body, ensure_ascii=False), encoding="utf-8") ``` ```bash curl -s -X POST "$U" \ -H "content-type: application/json" \ -H "accept: application/json, text/event-stream" \ -H "Mcp-Session-Id: $SID" \ --data-binary "@D:/path/to/mcp-call.json" ``` 返回的是 SSE 帧,形如 `data:{...}` 加一行 `id:1`,整体不能直接 `JSON.parse`,要按帧拆开再解析 `data:` 后面的内容。实测 `result.content[0].text` 里是两段内容拼接: ```json { "showapi_res_error": "", "showapi_res_id": "6aaca3c0fb638c2f696992ce", "showapi_res_code": 0, "showapi_fee_num": 1, "showapi_res_body": { "provCode": "110000", "areaCode": "010", "ret_code": 0, "remark": "", "postCode": "100000", "num": 1380013, "cityCode": "110100", "name": "移动全球通卡", "type": 1, "city": "北京", "prov": "北京" } } - 以下是返回参数说明 - 参数名称:prov, 参数类型: String, 参数描述: 省, 参数示例: 云南 - 参数名称:city, 参数类型: String, 参数描述: 市, 参数示例: test - 参数名称:name, 参数类型: String, 参数描述: 运营商, 参数示例: test - 参数名称:num, 参数类型: Number, 参数描述: 号段, 参数示例: 1890871 - 参数名称:provCode, 参数类型: Number, 参数描述: 省别编码,本省身份证的前几位编码。, 参数示例: 530000 - 参数名称:type, 参数类型: Number, 参数描述: 1为移动 2为电信 3为联通 4为广电 -1为未知, 参数示例: 1 - 参数名称:cityCode, 参数类型: String, 参数描述: 城市编码编码,本城市身份证的前几位编码。, 参数示例: 530100 - 参数名称:ret_code, 参数类型: String, 参数描述: 0为成功,其他失败。失败时不扣点数。…, 参数示例: 0 - 参数名称:areaCode, 参数类型: String, 参数描述: 城市区号,座机号码前几位, 参数示例: 0810 ``` 返回结构后面挂了一段字段说明,模型读完之后能直接解释每个字段的含义,不用你在提示词里再补一遍。这段说明的字段清单与 OpenAPI 一致,同样没有列出 `postCode` 和 `remark`。真实返回里有这两个字段这件事,见[返回字段全解](https://www.showapi.com/guides/phone-attribution-response-fields-6)。 ## 对话里怎么问 配置生效后,直接说需求就行。下面几种说法模型都能理解。 - 「查一下 13800138000 是哪里的。」 - 「这个号码是什么运营商:19200001234?」 - 「帮我把表里这 5 个号码的归属地查出来:13800138000、18900189000……」 第三种说法会触发多次工具调用,每次调用都算一次接口调用。号码多的时候用[批量脚本](https://www.showapi.com/guides/phone-attribution-excel-batch-6)更省额度。 ## 两处使用限制 从 HTTPS 页面用浏览器 `fetch` 去请求这个 `http://` 地址会被按混合内容拦下,报 `TypeError: Failed to fetch`。服务端本身有 `Access-Control-Allow-Origin: *`,用客户端或后端发请求没有这个问题。 命令行发送中文工具名时要用 UTF-8 编码的请求体文件,Git Bash 里内联的中文会按本地编码发出去,服务端会返回 `-32602 Unknown tool`,看起来像工具不存在。把请求体写成 UTF-8 文件再发送就正常。 ## FAQ **Q1:MCP 配置里要填 OpenAPI 吗?** 不用。MCP 服务单独一套地址,填 `http://www.showapi.com.cn/mcp/6/YOUR_APPKEY` 就行,与 OpenAPI 文档是两条独立通道。 **Q2:域名是 `.com` 还是 `.com.cn`?** MCP 服务在 `www.showapi.com.cn`,官网是 `www.showapi.com`。填错域名连不上。 **Q3:调用一次会扣几次额度?** 一次 `tools/call` 对应一次接口调用。在对话里让模型批量查多个号码,会按号码个数产生多次调用。 **Q4:为什么工具列表里的名字是中文?** MCP 服务用接入点的中文名作为工具名,这里是「手机归属地查询」。代码里要用这个名字,不要用英文代号。 **Q5:返回是 SSE 格式,怎么解析?** 按行拆开,取 `data:` 开头的行,把后面的内容单独 `JSON.parse`。这一帧里才包含 `jsonrpc` 的 `result`。 **Q6:问号码归属地时模型说工具不存在?** 先确认域名和 AppKey 拼接正确,再看工具名是否按 UTF-8 编码发送。命令行测试时用 UTF-8 请求体文件,不要让中文经过本地编码转换。 ## 下一步阅读 - [手机归属地查询返回字段全解:11 个字段的类型、取值与粒度](https://www.showapi.com/guides/phone-attribution-response-fields-6) —— MCP 返回里每个字段的含义 - [手机归属地查询 OpenAPI 文档:用 Postman 与 Swagger UI 管理接口](https://www.showapi.com/guides/phone-attribution-openapi-6) —— 另一条集成通道 - [手机归属地查询接口怎么用?从 AppKey 到第一条真实返回的完整路径](https://www.showapi.com/guides/phone-attribution-quickstart-6) —— 直接用 HTTP 调用的最短路径 - **本系列共 12 篇**:查看[手机归属地查询指南总目录](https://www.showapi.com/guides/phone-attribution-guides-6)
加载中...