-
Notifications
You must be signed in to change notification settings - Fork 9
REST API接口
nixi-agent edited this page Aug 10, 2026
·
1 revision
本服务提供两类对外能力:
- 健康检查 HTTP 端点,用于快速探测服务状态与认证状态。
- JSON-RPC over HTTP(SSE)的 MCP 工具调用接口,暴露一组“工具”供客户端通过 tools/list 发现、tools/call 调用,实现 VRChat 好友监控、群组管理、世界查询、资源上传下载等能力。
服务监听本地端口 8799,仅绑定 127.0.0.1,默认不对外开放。所有对 VRChat 的写操作均受内置限流器保护,避免触发远端限流。
- start-monitor.js:HTTP 服务器、MCP 协议处理、工具路由、SSE 响应封装、启动流程。
- vrchat-api.js:VRChat 官方 API 客户端,负责认证(Cookie/Basic Auth/OTP)、请求封装、文件上传下载。
- core/rate-limiter.js:请求级限流器,保证对 VRChat API 的请求间隔安全。
- test-apis.mjs:VRChat 官方 API 的全面测试脚本(可作为参考)。
- archive/*:历史或桥接实现,展示 MCP over stdio 与 HTTP 的交互方式,有助于理解会话与鉴权头。
graph TB
Client["客户端"] --> HTTP["HTTP 服务器<br/>:8799"]
HTTP --> |/health| Health["健康检查"]
HTTP --> |POST /mcp| MCP["MCP 处理器"]
MCP --> Tools["工具路由<br/>tools/list, tools/call"]
Tools --> RL["限流器"]
Tools --> VRC["VRChat API 客户端"]
VRC --> API["https://api.vrchat.cloud/api/1"]
图表来源
- start-monitor.js:2185-2248
- vrchat-api.js:50-87
- HTTP 服务器与路由:
- GET /health:返回服务运行时间、认证状态、数据库统计、限流器统计、WebSocket 状态等。
- GET /mcp:探针,返回空 SSE 流以探测服务端支持。
- POST /mcp:接收 JSON-RPC 消息,按 method 分发到 initialize、notifications/initialized、tools/list、tools/call。
- MCP 会话:
- 使用内存 Map 维护会话,支持可选 Mcp-Session-Id 头进行会话关联。
- 初始化后 capabilities 声明为 { tools: {} },协议版本固定为 2025-03-26。
- 工具系统:
- tools/list 返回全部可用工具定义(名称、描述、输入参数 Schema)。
- tools/call 根据 name 路由到具体处理器,部分处理器经 RateLimiter 执行。
- VRChat 认证:
- Cookie 持久化 + Basic Auth 登录 + OTP 验证;自动续期 Cookie。
- ensureAuthWithAutoOtp 支持在需要时自动拉取邮箱验证码完成登录。
- 限流器:
- 最小间隔 2600ms,队列最大长度 50,串行执行并等待必要间隔。
sequenceDiagram
participant C as "客户端"
participant S as "HTTP 服务器"
participant M as "MCP 处理器"
participant T as "工具路由"
participant R as "限流器"
participant A as "VRChat API 客户端"
participant V as "VRChat 官方API"
C->>S : POST /mcp (JSON-RPC)
S->>M : 解析 body, 提取 sessionId
M->>T : tools/call(name, args)
alt 需要访问外部API
T->>R : execute(fn)
R->>A : 调用封装方法(ensureAuth/_request)
A->>V : HTTPS 请求
V-->>A : JSON 响应
A-->>R : 结果
R-->>T : 结果
else 本地数据
T-->>M : 结果
end
M-->>C : SSE data : {jsonrpc, result/error}
图表来源
- start-monitor.js:2215-2263
- start-monitor.js:1947-2181
- vrchat-api.js:50-87
- 传输协议:HTTP + JSON-RPC 2.0,响应采用 Server-Sent Events(SSE),每行 data: 。
- 内容类型:请求 Content-Type: application/json;响应 Content-Type: text/event-stream。
- 会话:可选请求头 Mcp-Session-Id,服务端回显相同头以便客户端关联会话。
- 错误:当 JSON 解析失败或工具抛出异常时,返回 jsonrpc 错误对象,常见代码:
- -32700:Parse error(请求体非合法 JSON)
- -32603:内部错误(工具执行异常)
- -32601:方法不存在(当前仅支持 initialize、notifications/initialized、tools/list、tools/call)
- 成功:result.content[0].text 为 JSON 字符串,需客户端二次解析。
- 作用:健康检查,返回服务运行时长、认证状态、数据库统计、限流器统计、WebSocket 状态、好友状态统计、事件管道统计。
- 请求:无参数。
- 响应:application/json,字段包括 ok、auth、db、rateLimiter、ws、friendState、eventPipeline、uptime。
- 示例(成功):
- 请求:GET http://127.0.0.1:8799/health
- 响应:{ ok: true, auth: { authenticated: true/false, user?: {...}, needsOtp?: boolean }, db: {...}, rateLimiter: {...}, ws: {...}, friendState: {...}, eventPipeline: {...}, uptime: number }
- 示例(未认证):
- auth.authenticated=false,若需要 OTP,则包含 needsOtp=true。
- 作用:MCP 协议入口,支持以下 method:
- initialize:建立会话,返回协议版本与能力。
- notifications/initialized:通知已初始化(可忽略)。
- tools/list:列出所有可用工具及其输入 Schema。
- tools/call:调用指定工具。
- 请求头:
- Content-Type: application/json
- Accept: application/json, text/event-stream
- Mcp-Session-Id: 可选,用于会话关联
- 请求体(JSON-RPC):
- jsonrpc: "2.0"
- id: 任意标识(建议递增数字)
- method: 见上
- params: 依 method 而定
- 响应:SSE 流,每行 data: <JSON-RPC 消息>。
- 示例(initialize):
- 请求:
- POST /mcp
- Body: { jsonrpc:"2.0", id:1, method:"initialize", params:{ protocolVersion:"2025-03-26", capabilities:{}, clientInfo:{ name:"...", version:"..." } } }
- 响应(SSE):data: { jsonrpc:"2.0", id:1, result:{ protocolVersion:"2025-03-26", capabilities:{ tools:{} }, serverInfo:{ name:"vrc-monitor", version:"1.0.0" } } }
- 请求:
- 示例(tools/list):
- 请求:{ jsonrpc:"2.0", id:2, method:"tools/list" }
- 响应:data: { jsonrpc:"2.0", id:2, result:{ tools:[...] } }
- 示例(tools/call):
- 请求:{ jsonrpc:"2.0", id:3, method:"tools/call", params:{ name:"get_server_status", arguments:{} } }
- 响应:data: { jsonrpc:"2.0", id:3, result:{ content:[{ type:"text", text:"{...}" }] } }
- 错误示例(未知工具):
- 响应:data: { jsonrpc:"2.0", id:3, error:{ code:-32601, message:"Unknown tool: xxx" } }
- tools/list 返回全部工具定义,每个工具包含:
- name:工具名
- description:功能描述
- inputSchema:输入参数 JSON Schema(type/object,properties,required 等)
- tools/call 的 params:
- name:工具名
- arguments:对象,字段与 inputSchema 对应
- 返回值统一包装为 result.content[0].text,值为 JSON 字符串,客户端需自行解析。
- 错误:
- 参数缺失或类型不符:由工具处理器抛错,返回 -32603。
- 外部 API 错误:如 VRChat 返回 4xx/5xx,工具会转换为错误信息。
以下为常用工具与其行为摘要(完整列表请通过 tools/list 获取):
- get_server_status:返回服务健康与认证状态。
- get_database_stats:返回本地数据库统计。
- get_online_friends:返回在线好友列表(含昵称、位置解析等)。
- search_users:按显示名搜索用户。
- send_boop:向用户发送“拍一拍”,需 userId,可选 emojiId。
- upload_print / upload_gallery_image:上传照片至相册或画廊(需 VRChat Plus)。
- remove_print / remove_gallery_image:删除资源,需 confirm:true 确认。
- download_print / download_gallery_image:下载资源到本地 downloads 目录。
- create_instance / invite_myself:创建实例并邀请自己进入。
- send_friend_request / remove_friend:添加/移除好友。
- get_world_name / set_world_note / get_world_history:世界信息查询与备注管理。
- scan_new_worlds / get_new_worlds:扫描新发布世界与查询跟踪结果。
- get_watchlist / add_to_watchlist / remove_from_watchlist:关注名单管理。
- get_companions / get_online_pattern:同屏好友分析与上线规律。
- get_nicknames / set_nickname:昵称映射管理。
- get_user_groups / get_group_info / get_group_instances / get_group_announcement / search_groups:群组相关查询。
- join_group / leave_group / peek_group_announcement:加入/离开群组及预览公告。
- backup_database:立即备份本地数据库。
注意:
- 涉及外部 VRChat API 的工具大多经 RateLimiter 保护,确保最小间隔。
- 部分写操作要求 confirm:true 才真正执行,否则返回预览。
- HTTP 层:
- Node.js http.createServer 提供 /health 与 /mcp。
- /mcp 解析 JSON-RPC 并分派到 handleRpc。
- 工具层:
- 工具处理器调用 Storage、FriendStateManager、EventPipeline、WsManager 等模块读取本地数据或状态。
- 外部依赖:
- VrchatApiClient 封装对 https://api.vrchat.cloud/api/1 的 HTTPS 请求,处理 Cookie、Basic Auth、OTP、文件上传下载。
- 限流:
- RateLimiter 保证相邻请求的最小间隔,防止触发远端限流。
classDiagram
class HttpServer {
+handleRequest(req,res)
+createServer()
}
class McpHandler {
+handleRpc(rpc,session,res)
+sendSSE(res,events,sessionId)
}
class ToolRouter {
+dispatch(name,args)
}
class RateLimiter {
+execute(fn)
+getStats()
}
class VrchatApiClient {
+ensureAuth()
+_request(method,path,body)
+uploadPrint(...)
+downloadFile(url)
}
HttpServer --> McpHandler : "POST /mcp"
McpHandler --> ToolRouter : "tools/call"
ToolRouter --> RateLimiter : "wraps external calls"
ToolRouter --> VrchatApiClient : "calls VRChat API"
图表来源
- start-monitor.js:2185-2263
- start-monitor.js:1947-2181
- core/rate-limiter.js:1-82
- vrchat-api.js:50-87
- 限流策略:
- 最小间隔 2600ms,队列最大长度 50,串行执行。
- 适用于调用 VRChat API 的工具,避免触发 30次/分钟限制。
- 并发控制:
- 同一时刻仅一个任务在处理,其他任务排队等待。
- 统计:
- 可通过 /health 的 rateLimiter 字段查看 totalCalls、totalWaitedMs、queueLength、isProcessing、minInterval。
- 建议:
- 批量操作应拆分多次调用,避免单次请求过大。
- 合理设置 limit/offset 分页参数,减少单次负载。
- 常见问题:
- 认证失败:/health 中 auth.authenticated=false,可能需要 OTP。
- 需要 OTP:调用工具时可能抛出 needsOtp 信号,需先完成 OTP 验证流程。
- 限流:若频繁调用外部 API,可能被限流;观察 rateLimiter 统计与日志。
- 端口占用:启动时报 EADDRINUSE,检查是否有旧进程残留。
- 定位步骤:
- 使用 /health 检查服务状态。
- 通过 tools/list 确认工具是否可用。
- 逐步缩小问题范围:先调用只读工具,再尝试写工具。
- 检查本地 credentials.json 与 auth_cookie.txt 是否存在且有效。
- 日志:
- 控制台输出包含关键节点日志(登录、WS 连接、事件处理、错误等)。
本服务通过简洁的 HTTP 端点与 JSON-RPC over HTTP(SSE)暴露了丰富的 VRChat 管理能力。健康检查便于运维监控,MCP 工具体系提供了可扩展的能力集合。内置限流与认证机制保障了稳定性与安全性。建议在生产环境中仅允许可信来源访问本地端口,并结合反向代理与访问控制策略加固。
- 健康检查:
- MCP 探针:
- curl -N -H "Accept: text/event-stream" http://127.0.0.1:8799/mcp
- 初始化:
- curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' http://127.0.0.1:8799/mcp
- 列出工具:
- curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' http://127.0.0.1:8799/mcp
- 调用工具(示例:get_server_status):
- curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_server_status","arguments":{}}}' http://127.0.0.1:8799/mcp
- 运行全面测试:
- node test-apis.mjs
- 该脚本演示了对 VRChat 官方 API 的多阶段调用,可作为参考了解各端点的预期行为与错误场景。
- 启用更详细的日志:在服务端控制台查看关键节点输出。
- 使用浏览器或 Postman 订阅 SSE 流,观察 data: 行。
- 对于需要 OTP 的场景,确保 credentials.json 配置正确,并具备邮箱 IMAP 授权码。
- archive/stdio-bridge.js:1-60
- API参考手册
- REST API接口
- WebSocket API
- SSE实时推送接口
- MCP 工具接口