端点参考

HTTP 路由(不含 /mcp

所有非 MCP 路由都由 src/index.ts 中约 L3290-3470 的 fetch 函数处理。每一个响应都会附带 CORS 响应头(定义见 src/mcp.ts L3-11)。

路径方法查询参数返回内容源码位置
/GETJSON 格式的健康检查对象(name/version/endpoints/tools)L3296
/healthzGET/ 相同L3296
/plotGET?d=<base64url-gzipped-json>SVG 图片L3300-3317
/pngGET?d=<base64url-gzipped-json>PNG 图片(resvg 渲染 + CJK 路径化)L3320-3330
/multi_plotGET?spec=<urlencoded-json>SVG 子图网格L3332-3342
/multi_plot.pngGET?spec=<urlencoded-json>PNG 子图网格L3344-3354
/s/{token}GET短链接渲染结果(PNG/SVG/HTML)L3356-3366
/force.svgGET?d=<...>简版受力图 SVGL3368-3377
/force-analysis.svgGET?d=<...>详细受力分析 SVG(含坐标轴/分量/合力)L3379-3388
/circuit.svgGET?d=<...>电路图 SVGL3390-3399
/venn.svgGET?d=<...>维恩图 SVGL3401-3410
/c-memory.svgGET?d=<...>C 语言内存布局 SVGL3412-3421
/shape3d.htmlGET?d=<...>交互式 3D 查看器 HTMLL3423-3432
/mcpPOSTJSON-RPC 2.0 请求体MCP 响应L3434-3468
(其他任意路径)404 not_foundL3434-3436

?d= 查询参数

所有 SVG/PNG 端点都接受一个经过 gzip 压缩、再经过 base64-url 编码的 JSON 规格对象。编码逻辑在 src/utils.ts 中实现:

  • toCompressedBase64UrlFromJson(value) —— 先用 CompressionStream("gzip") 压缩,再进行 base64-url 编码,因此 URL 中不会出现 +/=
  • parseCompressedBase64UrlJson(packed) —— 反向执行上述过程,把压缩后的字符串解析回 JSON

这个 JSON 的具体结构取决于对应端点。例如 /plot 使用的结构是 {expr, x_min, x_max, points, title, xlabel, ylabel, annotations};而 /multi_plot 使用的结构则是 buildSubplot 返回的 MultiPlotResult

短链接

buildShortUrlsrc/index.ts L2306)计算出某个 ?d= URL 长度超过 3600 个字符时,它不会直接把整段参数塞进 URL,而是退化为:把完整 payload 写入 KV,然后返回一个简短的 {origin}/s/{token} 地址。这个 token 是 8 个字符的 base32 字符串。每个 token 在 KV 中都对应一个 ShortLinkRecord,键名形式是 short:{token},TTL 为 30 天(SHORT_LINK_TTL_SECONDS = 60*60*24*30)。

renderShortLink 函数(L2383)会根据 record.path 决定应该调用哪个渲染器:例如 /pngrenderPngResponse,各类 SVG 路径分别走对应的 render*Svg 函数,而 /shape3d.html 则返回 3D HTML 查看器。

CORS

所有响应都会包含 access-control-allow-origin: *access-control-allow-methods: GET, POST, OPTIONSaccess-control-allow-headers: content-type, mcp-session-id。对于 OPTIONS 预检请求,服务端会直接返回 204,并附带同样的一组头。

缓存头

所有图片响应都会设置 cache-control: public, max-age=300,也就是 5 分钟浏览器/边缘缓存。同时,KV 中写入的短链接记录本身也会在 30 天后自动过期,因此短链接不会比底层 KV 记录存在得更久。