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. 服务地址与鉴权

服务地址(POST)
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,不是给第三方调的,会随页面改版调整