- 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 章节)
44 lines
1.7 KiB
JavaScript
44 lines
1.7 KiB
JavaScript
// 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' }
|
||
});
|
||
}
|
||
};
|