feat: add authenticated remote MCP access and complete business workflows

This commit is contained in:
陈煜 committed 2026-10-03 22:23:35 +08:00
1 parent f40f4da781
commit 027a8c1b6a
35 files changed
+4430 -183

No files matched your search

+127
View File
@@ -42,6 +42,133 @@ model User {
icons Icon[]
transfers Transfer[]
schedules Schedule[]
agentGrants AgentGrant[]
agentOperations AgentOperation[]
agentAuthorizations AgentAuthorization[]
agentPolicy AgentPolicy?
agentCalls AgentCall[]
}
/// MCP 调用审计,不保存工具参数、令牌、密码或财务内容
model AgentCall {
/// 审计记录标识
id String @id @default(uuid()) @db.Char(36)
/// 可信认证上下文中的用户标识
userId String @db.Char(36)
/// 所属用户;注销后级联清理
user User @relation(fields:[userId],references:[id],onDelete:Cascade)
/// 发起调用的连接标识
grantId String @db.Char(36)
/// 工具名称
tool String @db.VarChar(100)
/// 结果状态 success 或 error
status String @db.VarChar(16)
/// 调用完成时间,UTC
createdAt DateTime @default(now())
@@index([userId,createdAt])
}
/// 用户的 Agent 写入策略
model AgentPolicy {
/// 所属用户标识,用于数据隔离
userId String @id @db.Char(36)
user User @relation(fields:[userId],references:[id],onDelete:Cascade)
/// 写入策略:readonly 只读、draft 草稿、direct 普通直接写入
mode String @default("draft") @db.VarChar(16)
}
/// OAuth 动态注册客户端元数据
model AgentClient {
/// 唯一标识
id String @id @db.Char(36)
/// 公开客户端注册元数据,不保存用户凭据
metadata Json
/// 创建时间,UTC
createdAt DateTime @default(now())
}
/// 短期 OAuth 授权请求及一次性授权码摘要
model AgentAuthorization {
/// 唯一标识
id String @id @default(uuid()) @db.Char(36)
/// 所属用户标识,用于数据隔离
userId String? @db.Char(36)
user User? @relation(fields:[userId],references:[id],onDelete:Cascade)
/// OAuth 客户端标识;个人令牌为空
clientId String @db.Char(36)
/// 具体操作参数;禁止保存密码及令牌
parameters Json
/// 一次性授权码 SHA-256 摘要
codeDigest String? @unique @db.Char(64)
/// 到期时间,UTC
expiresAt DateTime
/// 当前处理状态
status String @default("pending") @db.VarChar(16)
}
/// 用户授权连接、令牌摘要及资源权限
model AgentGrant {
/// 唯一标识
id String @id @default(uuid()) @db.Char(36)
/// 所属用户标识,用于数据隔离
userId String @db.Char(36)
user User @relation(fields:[userId],references:[id],onDelete:Cascade)
/// OAuth 客户端标识;个人令牌为空
clientId String? @db.Char(36)
/// 用户可见连接名称
name String @db.VarChar(100)
/// 权限列表:read、draft、write、sensitive
scopes Json
/// 令牌适用的规范 MCP 资源地址
resource String @db.VarChar(500)
/// 访问令牌 SHA-256 摘要;完整值仅颁发时返回
accessDigest String @unique @db.Char(64)
/// 刷新令牌 SHA-256 摘要,使用后轮换
refreshDigest String? @unique @db.Char(64)
/// 到期时间,UTC
expiresAt DateTime
/// 刷新授权到期时间,UTC
refreshExpiresAt DateTime?
/// 撤销时间,UTC;空表示未撤销
revokedAt DateTime?
/// 本连接的独立业务授权会话标识,不作为 MCP 凭证
sessionId String @db.Char(64)
/// 创建时间,UTC
createdAt DateTime @default(now())
@@index([userId,createdAt])
}
/// Agent 写入草稿、幂等记录及提交结果
model AgentOperation {
/// 唯一标识
id String @id @default(uuid()) @db.Char(36)
/// 所属用户标识,用于数据隔离
userId String @db.Char(36)
user User @relation(fields:[userId],references:[id],onDelete:Cascade)
/// 发起操作的授权连接标识
grantId String @db.Char(36)
/// 同用户唯一的客户端幂等键
key String @db.VarChar(128)
/// 工具和参数的规范摘要;拒绝同键不同参数
hash String @db.Char(64)
/// 业务工具名称
tool String @db.VarChar(100)
/// 具体操作参数;禁止保存密码及令牌
parameters Json
/// 确认前的账目版本摘要,防止覆盖并发修改
snapshot String @db.Char(64)
/// 当前处理状态
status String @default("pending") @db.VarChar(16)
/// 到期时间,UTC
expiresAt DateTime
/// 结构化操作结果或最近提交失败原因
result Json?
/// 创建时间,UTC
createdAt DateTime @default(now())
/// 完成或取消时间,UTC
completedAt DateTime?
@@unique([userId,key])
@@index([userId,createdAt])
}
/// 登录会话与隐藏项目查看授权
model Session {