今日油价 MCP 服务:在 Cherry Studio 里用中文工具名查询
约 13 分钟 入门今日油价MCPCherry StudioChatBox
# 今日油价 MCP 服务:在 Cherry Studio 里用中文工具名查询
接口/接入点:今日油价(apiCode=138,接口级 MCP) · 免费 · 适用人群:AI 客户端使用者、ChatBot 搭建者 · 阅读时间:约 5 分钟 · 最后实测核对:2026-09-18
不想写代码查油价,可以把今日油价的 MCP 服务接进支持 MCP 的客户端。配好之后用中文问「查一下北京今天的 92 号汽油价格」,客户端会自己调接口。
## 核心要点
- MCP 服务地址是 `http://www.showapi.com.cn/mcp/138/{你的 AppKey}`,域名是 `showapi.com.cn`,与接口域名 `route.showapi.com` 不同。
- 暴露两个工具,名字是中文的「查询油价」与「查询行情」,分别对应接入点 138-46 与 138-49。
- 2026-09-18 实测 `tools/call` 调用成功,工具返回的文本里包含原始 JSON 和一段字段说明。
## 配置方法
在客户端的 MCP 服务器配置里加入这段 JSON:
```json
{
"mcpServers": {
"showapi-mcp-138": {
"url": "http://www.showapi.com.cn/mcp/138/YOUR_APPKEY"
}
}
}
```
把 `YOUR_APPKEY` 换成控制台「我的 App」里创建的真实 AppKey,管理入口:https://www.showapi.com/console#/myApp
保存后重启客户端,工具列表里会出现两项:
| 工具名 | 对应接入点 | 说明 |
|---|---|---|
| 查询油价 | 138-46 | 通过省名查询最新油价,支持全国范围内 31 个省份 |
| 查询行情 | 138-49 | 查询油价涨跌幅,同时获取最新更新日期与下一次更新日期 |
两个工具的参数都只有一个 `prov`,描述为「省名,比如北京,广西」。查询油价的 `prov` 在接口层是选填,工具的入参 schema 里同样只声明了类型;查询行情需要传省名。
## 对话里怎么用
配置完成后直接在对话里提问即可,例如:
- 「北京今天 92 号汽油多少钱,95 号呢?」
- 「广西现在的 0 号柴油价格和最近一次涨跌」
- 「下一次成品油调价是什么时候?」
客户端会自己选择合适的工具并补全省名。
## MCP 返回长什么样
2026-09-18 实测调用「查询油价」(`prov=北京`),工具返回的文本包含两段内容。第一段是原始 JSON:
```json
{
"showapi_res_error": "",
"showapi_res_id": "6aace6b7fb638cba8b353544",
"showapi_res_code": 0,
"showapi_fee_num": 1,
"showapi_res_body": {
"ret_code": 0,
"list": [
{ "prov": "北京", "p0": "8.02", "p89": "7.76", "p90": "", "p92": "8.29",
"p93": "", "p95": "8.83", "p97": "", "p98": "10.33",
"ct": "2026-09-18 12:00:05.916" }
]
}
}
```
第二段是字段说明,形如「以下是返回参数说明」,逐条列出参数名、类型、描述与示例,例如:
```
- 参数名称:p0, 参数类型: String, 参数描述: 0号油, 参数示例: 8.16
- 参数名称:p95, 参数类型: String, 参数描述: 95号油, 参数示例: 8.97
```
这段说明里的「参数示例」是文档里的静态示例值,不是当时的行情。2026-09-18 实测同一时刻 `p0` 实际返回 8.02、`p95` 实际返回 8.83,与示例值不同。写解析逻辑时按 `showapi_res_body` 里的真实字段取值,不要参考示例。
## 底层协议细节
需要自己写探针或做集成测试时,MCP 的握手顺序是固定的:
1. `initialize`,从响应头里取 `Mcp-Session-Id`
2. 发送 `notifications/initialized` 通知,缺少这一步后续调用会返回 `-32601 Method not found`
3. `tools/list` 或 `tools/call`
响应是 SSE 帧格式,每行以 `data:` 开头,不能整体按 JSON 解析。示例如下(截取):
```bash
U="http://www.showapi.com.cn/mcp/138/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}')
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
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":{}}'
```
Python 客户端(用官方 SDK 时更简单):
```python
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main():
url = "http://www.showapi.com.cn/mcp/138/YOUR_APPKEY"
async with streamablehttp_client(url) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print([t.name for t in tools.tools]) # ['查询行情', '查询油价']
result = await session.call_tool("查询油价", {"prov": "北京"})
print(result.content[0].text[:300])
asyncio.run(main())
```
Node.js(用官方 SDK):
```javascript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("http://www.showapi.com.cn/mcp/138/YOUR_APPKEY")
);
const client = new Client({ name: "oil-probe", version: "1.0.0" });
await client.connect(transport);
const { tools } = await client.listTools();
console.log(tools.map((t) => t.name)); // [ '查询行情', '查询油价' ]
const res = await client.callTool({ name: "查询油价", arguments: { prov: "北京" } });
console.log(res.content[0].text.slice(0, 300));
```
## 适用条件与注意事项
- MCP 地址使用 `http`,域名是 `showapi.com.cn`。从 https 页面里直接 `fetch` 这个地址会被浏览器按混合内容拦下,探针建议在命令行或后端发起。
- 工具名是中文。用 `curl` 手工发 `tools/call` 时,含中文的请求体要按 UTF-8 编码传递,否则会返回 `-32602 Unknown tool`。
- 一个 `showapi-mcp-138` 覆盖本接口的全部接入点,不需要为两个接入点分别配置。
- MCP 配置里的 AppKey 等同于调用凭证,只在自己可信的客户端使用。
- 工具返回的字段说明含文档静态示例值,与实时行情不同,解析以 `showapi_res_body` 为准。
## FAQ
**Q1:MCP 地址里的域名为什么是 `showapi.com.cn`?**
MCP 服务部署在该域名上,与接口域名 `route.showapi.com` 不同,配置时按 `http://www.showapi.com.cn/mcp/138/{appKey}` 填写。
**Q2:一个 MCP 能查涨跌幅吗?**
能。实测 `tools/list` 返回「查询油价」和「查询行情」两个工具,「查询行情」对应接入点 138-49,返回涨跌幅与调价日。
**Q3:支持哪些客户端?**
任何支持 MCP 的客户端都可以按上面的 JSON 配置接入,包括 Cherry Studio、ChatBox 等。
**Q4:工具返回里的「参数示例 8.16」是当时的价格吗?**
不是。那是文档里的静态示例值。2026-09-18 实测同一时刻 `p0` 实际为 8.02,两者不同。
**Q5:调用 MCP 会消耗接口额度吗?**
会。实测工具返回的 JSON 里 `showapi_fee_num=1`,与直接调接口的计费口径一致。
## 相关能力 / 下一步阅读
- [今日油价 OpenAPI 3.0 文档:导入 Postman 与 Swagger UI 调试](https://www.showapi.com/guides/oilprice-openapi-138)
- [今日油价返回字段对照:p89/p92/p0 与 ct 的含义与空值处理](https://www.showapi.com/guides/oilprice-fields-138)
- **本系列共 13 篇**:查看[今日油价指南总目录](https://www.showapi.com/guides/oilprice-guides-138)





