API 文档
全部A 股数据接口都通过一个地址提供:标准 MCP 协议(JSON-RPC over HTTP)。 自己写代码的话不需要装任何 SDK —— 对这个地址 POST 两段 JSON 就能取到数据。
顺带说明为什么不按 REST 一个接口一条路径:210 个接口意味着 210 条路由 与一套 OpenAPI,而 MCP 的工具列表自带每个接口的入参 schema, 人和模型都能直接读。两处各维护一份契约必然漂移。
1. 拿到 API Key
在控制台 - API Key里复制(sk- 开头)。 一个账号一把 Key,重置后旧的立刻失效。
还没登录的话用手机号登录,新用户免费领 100 次调用。用 WorkBuddy 的话不必拿 Key —— 它走浏览器授权,见 MCP 接入。
2. 服务地址与鉴权
https://api.yasinaai.com/mcp/stock
把 Key 放进 Authorization 头, 不需要 Bearer 前缀(带了也认)。 另一个必须的请求头是 Accept: application/json, text/event-stream—— 服务端按 SSE 回,缺了它会被直接拒绝。
Authorization: sk-xxxxxxxxxxxx Content-Type: application/json Accept: application/json, text/event-stream
3. 调用示例
两步:先 initialize 握手, 再 tools/call 调接口。握手在同一个进程里 做一次就行。
第一步:握手
curl -s https://api.yasinaai.com/mcp/stock \
-H "Authorization: sk-你的APIKey" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "curl", "version": "0" }
}
}'第二步:调一个接口
curl -s https://api.yasinaai.com/mcp/stock \
-H "Authorization: sk-你的APIKey" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "daily",
"arguments": { "ts_code": "000001.SZ", "start_date": "20240101" }
}
}'name 是接口名(与全部接口清单一致),arguments 的字段见下一步的 schema。返回在 result.content[0].text 里,是一段 JSON —— 就是下面第 4 节的信封。
想知道某个接口要传什么?取 schema
curl -s https://api.yasinaai.com/mcp/stock \
-H "Authorization: sk-你的APIKey" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}'tools/list 只返回你的档位能用的接口, 每个带完整的入参 JSON Schema 与字段说明。这也是给模型配工具时读的那份。 不想发请求、只想看某几个接口要传什么,用接口速查(含默认返回列)。
Python(只用标准库)
import json, os, urllib.request
URL = "https://api.yasinaai.com/mcp/stock"
HEADERS = {
"Authorization": os.environ["YASINA_API_KEY"], # sk- 开头
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
}
def rpc(method, params, rid):
req = urllib.request.Request(
URL, data=json.dumps(
{"jsonrpc": "2.0", "id": rid, "method": method, "params": params}
).encode(),
headers=HEADERS, method="POST",
)
raw = urllib.request.urlopen(req).read().decode()
# 服务端按 SSE 回:每行 "data: {...}"
for line in raw.splitlines():
if line.startswith("data: "):
return json.loads(line[6:])["result"]
raise RuntimeError(raw[:200])
# 1) 握手(每个进程一次即可)
rpc("initialize", {"protocolVersion": "2025-06-18", "capabilities": {},
"clientInfo": {"name": "py", "version": "0"}}, 1)
# 2) 调接口:参数名与返回字段见 tools/list 里的 schema
result = rpc("tools/call", {"name": "daily",
"arguments": {"ts_code": "000001.SZ",
"start_date": "20240101"}}, 2)
body = json.loads(result["content"][0]["text"])
print("状态:", body["code"], body["msg"])
print("字段:", body["fields"])
print("数据:", body["items"][:3])
print("额度:", body["credits"])4. 响应格式
所有接口共用同一个信封:code 为 0 表示成功,fields 是列名,items 是数据行(按 fields 的顺序),credits 告诉你这次调用之后的额度。
{
"code": 0,
"msg": "",
"fields": ["ts_code", "trade_date", "close"],
"items": [
["000001.SZ", "20240102", 9.68],
["000001.SZ", "20240103", 9.71]
],
"credits": {
"plan": "free",
"free_left": 99,
"calls_today": 1
}
}5. 错误处理
失败时 code 不为 0,msg 可以直接展示给用户。 JSON-RPC 层失败(没鉴权、方法不存在)另走标准的 error 字段。
| code | 含义 |
|---|---|
0 | 成功。items 是数据行,字段名见 fields |
4xxxx / 5xxxx | 接口自身报错:参数不合法、超出单次返回上限、或该接口不在你的档位里。msg 是可直接展示给用户的原因 |
40301 | 当前套餐不含这个接口。先调 stock_plans 看可升级的档位,让用户自己选 |
40201 | 免费额度(100 次,终身累计)已用完。这条返回里直接带三档套餐的权益与价格 |
42901 | 触发限流(每分钟次数 / 每秒并发 / 每日总量),稍后重试 |
50201 | 数据源暂时不可用(已重试一次),这次不计用量 |
参数写错、越档、限流、数据源故障都不消耗额度 —— 免费额度是终身累计的,扣错了退不回来, 所以只对真正返回了数据的调用计数。
6. 限流
每档套餐有三层限制:每分钟调用次数、每秒并发数、每日总量。 超出返回 42901,并给出建议等待时间。
7. 两套接口别搞混
- ·
https://api.yasinaai.com/mcp/stock:对外的数据接口,用 API Key 或 OAuth 授权,按套餐计费 - ·
https://api.yasinaai.com/v1/stock/*: 官网自己用的站内接口(套餐展示、账户概览、下单), 靠登录 Cookie,不是给第三方调的,会随页面改版调整