|
|
a24107ab33
|
fix(mcp): 开发期放行 0.0.0.0 Host 让 dx 代理可用
CI / check (push) Has been cancelled
CI / build (push) Has been cancelled
dx serve --addr 0.0.0.0 转发到后端原生 server 时无条件把 Host 改写成
0.0.0.0:<随机端口>,rmcp 的 rebinding 防护据此一律 403,导致 MCP 在
dx 开发代理(:8080)下完全不可用。
仅当 APP_BASE_URL 未设或为 localhost 系(开发态)时把 0.0.0.0 加入
Host 白名单;生产域名态保持严格。直连原生端口始终可用(200)。
复现:8080 代理 →403,直连 56709 →200;显式发 Host:localhost 经
代理仍 403 证明 dx 无条件改写 Host。
|
2026-07-28 16:55:18 +08:00 |
|
|
|
6d520c3d48
|
fix(mcp): Host 白名单加入 APP_BASE_URL 域名
CI / check (push) Has been cancelled
CI / build (push) Has been cancelled
rmcp 的 DNS-rebinding 防护默认仅允许 localhost/127.0.0.1/::1,
生产反代 proxy_set_header Host $host 会把真实域名转发进来被 403。
现把 APP_BASE_URL 的 host 解析加入 allowed_hosts(保留默认值),
本地直连与生产域名同时放行。
注:本次只修服务端潜在 prod 403;用户当前 0.0.0.0 的 403 是客户端
配置误用了 bind 地址,应改用 localhost/域名。
|
2026-07-28 16:45:49 +08:00 |
|
|
|
cc88a7e90a
|
fix(mcp): 修正 Oh-My-Pi 配置格式与路径
三处错误(据 omp 客户端实际报错):
1. 字段名 transport→type,值 streamable-http→http:omp 不识别 transport,
遇未知字段退化为 stdio 因缺 command 报错丢弃
2. 路径 ~/.pi/agent/mcp.json→.mcp.json / ~/.omp/agent/mcp.json / ~/.mcp.json
3. omp 与 Claude Code 的 JSON 体现完全相同,差异仅在配置文件路径
|
2026-07-28 16:39:43 +08:00 |
|
|
|
3f3bf411ca
|
feat(mcp): 添加 OpenCode 客户端配置(第二位)
OpenCode 用 opencode.json(非 mcp.json),根键 mcp(非 mcpServers),
远程端点 type: remote(非 streamable-http),带 $schema 与 enabled 字段。
来源:2026 opencode.ai 官方文档。同步更新骨架屏形状数组(0..7)。
|
2026-07-28 16:34:15 +08:00 |
|
|
|
53376a0373
|
fix(mcp): 修正 Claude Code / Cursor 客户端配置格式(联网核实 2026)
CI / check (push) Has been cancelled
CI / build (push) Has been cancelled
依据 2026 官方文档联网核实所有 MCP 客户端配置格式,发现两处错误:
1. Claude Code .mcp.json:type 值应为 "http",不是 "streamable-http"。
Claude Code 用 streamable-http 会静默失败/卡在 connecting 状态。
2. Cursor ~/.cursor/mcp.json:不应带 type 字段——Cursor 按远程 URL 自动
识别 streamable-http,仅需 url + headers。此前 cursor_json 直接
clone claude_code_json,继承了错误的 type 字段。
其余配置核实无误:Cline(streamableHttp 驼峰 + disabled/autoApprove)、
Claude Code CLI(--transport http --header)、Oh-My-Pi(transport 字段)。
改动:
- 拆分 cursor_json,不再 clone claude_code_json
- 更新对应 doc 注释(config.rs / mcp_tokens.rs DTO)
- claude_code 测试断言改为 type=="http"
- cursor_json_equals_claude_code_json → cursor_json_has_no_type_field
|
2026-07-28 15:10:01 +08:00 |
|
|
|
78fb51a310
|
feat(mcp): 客户端配置新增 Oh-My-Pi 片段
在 /admin/mcp 客户端配置展示区增加 Oh-My-Pi(omp)的 MCP 配置片段,
位于 Cline 与「通用」之间。
Oh-My-Pi 的 mcpServers 条目与 Claude Code/Cursor 的关键差异:字段名
是 transport(而非 type),值仍为 streamable-http,auth 同样走
headers.Authorization。配置文件落在 ~/.pi/agent/mcp.json(全局)或
.pi/mcp.json(项目级)。
改动:
- ClientConfigs / McpClientConfigs 新增 omp_json 字段
- generate_client_configs 生成 omp 片段
- ConfigCard 增加 ConfigSnippet 行
- 新增测试 omp_json_uses_transport_field_not_type,并纳入 pretty 校验循环
格式依据:2026 pi.dev / oh-my-pi 官方文档(联网核实)。
|
2026-07-28 15:04:33 +08:00 |
|
|
|
45356c3766
|
feat(mcp): 端点加固 — token 限流、last_used_at 节流、审计日志(T6)
- token-keyed 限流:MCP_LIMITER 按 token_id 计数(与 web 的 IP-keyed 限流隔离),
默认 10/s burst 30,经 RATE_LIMIT_MCP_PER_SEC/_BURST 可调,超限返回 429。
- last_used_at 节流:仅在 NULL 或距上次 ≥ 60s 时写库,避免高频请求每次 UPDATE。
resolve_principal 查询带出 last_used_at 做窗口判断。
- 审计日志:鉴权中间件记录每次已认证 MCP 请求(user_id/scope/token_id),
为自主 AI 客户端的活动留下事后追溯痕迹。
- 输出清理:经设计保证——JSON 序列化转义控制字符,搜索结果硬上限 50,
rmcp 默认 4MiB 请求体上限兜底。间接提示注入靠作用域隔离 + 客户端人工审批。
验证:clippy --all-features -D warnings 干净;659 单测 + 1 集成全绿;web/server 双目标编译通过。
|
2026-07-28 11:57:00 +08:00 |
|
|
|
9eac025b3e
|
feat(mcp): 完整工具面 + token 管理 + 管理页(T2-T5 并行实现 + 合并)
T2 token 管理(src/api/mcp_tokens.rs):create/list/reveal/revoke + get_mcp_client_configs
服务端函数,均经 get_current_admin_user 鉴权;TokenLifetime 枚举(1/7/30/90天/永不过期)。
src/mcp/config.rs 生成 4 种客户端配置(Claude Code/Cursor/Cline/通用 + CLI)。
src/pages/admin/mcp.rs 令牌管理页:列表 + 新建表单 + 一次性明文展示/重查 + 撤销 +
配置片段卡片。路由 /admin/mcp,导航项加入 admin_layout。
T3 read 工具 + Resources(tools/read.rs, resources.rs):search_posts/get_post/list_tags
(read 作用域,仅已发布);published-post Resources(post://{slug},游标分页)。
search_published 提取为共享函数。
T4 write 工具(tools/{posts,comments,tags,media}.rs):create/update/publish/trash/delete_post、
评论审核、标签 CRUD、媒体 base64 上传(WebP 转码 + 去重)。复用既有 helper 的 SQL 与
缓存失效(moka + ssr_cache)。write 作用域,可读草稿。
T5 admin 工具(tools/{settings,runner}.rs):get/update_settings、run_code(沙箱执行)。
admin 作用域。
合并(server.rs):用 rmcp tool_router 的「命名路由 + 组合」模式,7 个工具组在
YggMcpServer 上 impl,combined_router 用 + 合并成单一 ServerHandler。各工具组鉴权
独立,经 Extension<Parts> 读 McpPrincipal + scope.grants 校验。
新增依赖 base64 0.22(媒体上传解码)。验证:server/web 双目标编译通过、clippy
--all-features -D warnings 干净、659 单测 + 1 集成全绿(+20 新测试)。
|
2026-07-28 11:53:32 +08:00 |
|
|
|
7b9dfa7851
|
feat(mcp): tracer bullet — /mcp 端点骨架与 search_posts 工具
T1 探针式实现,接通端到端链路并验证双目标编译:
- 依赖:rmcp=3.0.0-beta.3(server/macros/transport-streamable-http-server/
transport-worker)+ aes-gcm,均经 server feature 门控。
- 迁移 017_mcp_tokens:UUID 主键、scope 约束、token_enc 密文 + token_hash
唯一索引(仅未撤销),users.id 外键级联。
- 模型 src/models/mcp_token.rs:TokenScope(read<write<admin 偏序,grants)+
McpToken/McpTokenSummary/CreateTokenResponse DTO。
- src/mcp/(server-only):
- crypto.rs:AES-GCM-256 加解密(hex 密钥、每次独立 nonce、8 项单测)。
- auth.rs:bearer→SHA-256→DB 常量查找→注入 McpPrincipal,刷新 last_used_at。
- server.rs:rmcp ServerHandler,search_posts 工具(read 作用域,pg_trgm 查询)。
- router.rs:StreamableHttpService(无状态+JSON 响应+Origin 白名单)挂载 /mcp。
- main.rs:merge mcp_route 到应用路由;models/mod.rs 注册 mcp_token 模块。
验证:rmcp+axum-0.8 兼容性经临时探针实测(tools/list、tools/call、Origin→403、
bearer→工具 principal 全链路);--features web 与 --features server 均编译通过;
clippy --all-features -D warnings 干净;639 单测+1 集成 +13 新 MCP 测试全绿。
|
2026-07-28 11:09:55 +08:00 |
|