feat(AI接入): 内置 MCP 服务与个人 Token 管理
Docker Build and Push / build-image (push) Successful in 4m34s

- 新增 /api/mcp (Streamable HTTP) 与 41 个工具: 项目/看板列/任务/清单/打卡; - 新增 McpToken 模型与迁移, DB 仅存 SHA-256 哈希, token 绑定用户; - 新增 /api/mcp-tokens 增删改查, 支持独立命名 (如 R1); - 「我的」页新增 AI 接入 (MCP) 区块: 地址复制/新建/一次性展示/删除; - 补充 docs/MCP.md 与样式
This commit is contained in:
jif2.zhang
2026-11-09 10:41:08 +08:00
parent fa172d8974
commit ec6c9c7677
26 changed files with 3763 additions and 12 deletions
@@ -0,0 +1,20 @@
-- AI 接入 (MCP): 个人授权 token, 与用户绑定, 独立命名
CREATE TABLE "McpToken" (
"id" SERIAL NOT NULL,
"userId" INTEGER NOT NULL,
"name" VARCHAR(32) NOT NULL,
"prefix" VARCHAR(16) NOT NULL,
"tokenHash" VARCHAR(64) NOT NULL,
"lastUsedAt" TIMESTAMP(3),
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "McpToken_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "McpToken_tokenHash_key" ON "McpToken"("tokenHash");
CREATE UNIQUE INDEX "McpToken_userId_name_key" ON "McpToken"("userId", "name");
CREATE INDEX "McpToken_userId_idx" ON "McpToken"("userId");
ALTER TABLE "McpToken" ADD CONSTRAINT "McpToken_userId_fkey"
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+22 -1
View File
@@ -32,6 +32,9 @@ model User {
assignedTasks Task[] @relation("TaskAssignee")
createdTasks Task[] @relation("TaskCreator")
taskMembers TaskMember[]
// AI 接入 (MCP): 每人可创建多个具名授权 token
mcpTokens McpToken[]
}
model Article {
@@ -459,4 +462,22 @@ model TaskTag {
name String @db.VarChar(20)
@@index([taskId])
}
}
// ==================== AI 接入 (MCP) ====================
// 个人授权 token: 与用户绑定, 可独立命名 (如 R1), 每个 token 拥有该用户全部业务权限.
// 安全: 数据库只存 SHA-256 哈希, 明文仅在创建时返回一次; 前缀用于界面辨识.
model McpToken {
id Int @id @default(autoincrement())
userId Int
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
name String @db.VarChar(32)
prefix String @db.VarChar(16)
tokenHash String @unique @db.VarChar(64)
lastUsedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId, name])
@@index([userId])
}