Files
work-hours-tracker/server/worker.js
T
OpenClaw Agent 26306eee52 feat: 设置页 MCP 管理卡片(方案B)— DB 真开关 + 即时生效 + env 仅首次种子
- app_settings 表(key/value):MCP 开关与令牌存 DB,不属于任何用户、不参与同步协议
- 配置读取/写入收敛到 core/mcp.js(readMcpConfig/saveMcpToken/setMcpEnabled)
- 状态语义:未配置→404(端点视为不存在);已配置关闭→503(可重新开启);令牌错→401
- env MCP_AUTH_TOKEN 仅首次种子(库里从没有过令牌时迁入 DB),不设也行;后台改动即时生效无需重启
- 管理 API(登录态):GET /api/mcp/status(掩码)、POST /api/mcp/token(生成/重置,明文仅一次)、GET /api/mcp/token(复制用)、POST /api/mcp/enabled
- 设置页新增「AI 接入 (MCP)」卡片:开关 toggle、掩码展示、一键生成并复制(writeClipboard 兜底)、重置令牌;未登录徽章「本设备请先登录」
- 入口接线:node-server.js 与 worker.js 均挂 /mcp(seedToken 透传);sw.js 放行裸 /mcp(v2→v3)
- 两个适配器补 getSetting/setSetting(node:sqlite 与 D1 同语义)
- 测试:server/test/mcp.test.js 39 项(未配置关闭/鉴权/JSON-RPC 全链路/开关热切换/令牌轮换);npm test 全绿(107+72+39)
- 线上 E2E:生产令牌 initialize/tools 7 个/2026-09 大盘(出勤11天/82h/挣得1599);公网 HTTPS 链路通;UI puppeteer 17/17(含关→503→开→200 热切换,全程无重启)
- 文档:README + server/README(环境变量表/接口表/数据模型/MCP 章节)
2026-09-13 10:24:33 +08:00

44 lines
1.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Cloudflare Workers 入口
//
// 与 node-server.js 是同一套 core/api.js,只是换了存储适配器(D1)与静态资源方式。
// 部署前:
// 1. wrangler d1 create work-hours # 拿到 database_id 填进 wrangler.toml
// 2. npm run cf:migrate # 建表
// 3. npm run cf:deploy
//
// 静态资源走 Workers Assets(wrangler.toml 里的 [assets]),
// 所以这里只处理 /api/*,其余交回 env.ASSETS。
import { handleApi } from './core/api.js';
import { handleMcp } from './core/mcp.js';
import { D1Store } from './adapters/d1.js';
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.pathname.startsWith('/api/') || url.pathname === '/mcp' || url.pathname.startsWith('/mcp/')) {
if (!env.DB) {
return new Response(
JSON.stringify({ ok: false, error: 'D1 未绑定:请在 wrangler.toml 配置 [[d1_databases]] binding = "DB"' }),
{ status: 500, headers: { 'content-type': 'application/json; charset=utf-8' } }
);
}
if (url.pathname === '/mcp' || url.pathname.startsWith('/mcp/')) {
return handleMcp(request, new D1Store(env.DB), { seedToken: env.MCP_AUTH_TOKEN || '' });
}
return handleApi(request, new D1Store(env.DB), {
allowRegister: env.ALLOW_REGISTER === '1',
mcpSeedToken: env.MCP_AUTH_TOKEN || ''
});
}
// 静态资源:绑定了 Assets 就交给它,否则给个明确提示而不是 404 让人猜
if (env.ASSETS) return env.ASSETS.fetch(request);
return new Response('静态资源未绑定(需在 wrangler.toml 配置 [assets])', {
status: 404,
headers: { 'content-type': 'text/plain; charset=utf-8' }
});
}
};