package mcp import ( "context" "github.com/google/uuid" mcpsdk "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/yan1h/agent-coding-workflow/internal/chat" ) // registerPrompts 注册 prompts/list + prompts/get handler。 // 数据源:chat.TemplateService.List(ctx, userID) — 只取 scope=system 模板。 // MVP 策略:启动期一次性拉取所有 system 模板并静态注册;新增模板需重启。 func registerPrompts(srv *mcpsdk.Server, deps ServerDeps) { // 由于 prompts 内容由 DB 决定,且 SDK 使用静态注册(AddPrompt), // 我们用闭包捕获 deps,在 handler 里动态查 DB。 // prompts/list 由 SDK 框架自动返回所有已注册 prompt。 // 每个 prompt 的 handler 在 prompts/get 时查 DB 返最新 content。 // MVP: 注册一个占位 prompt 表明 prompts 能力可用。 // 真正的 system 模板注册需要在 app.go 装配阶段(拿到 deps 后) // 调用 registerSystemTemplates(srv, deps) 完成一次性注册。 // // 由于 registerPrompts 在 NewMCPServer 里被调用,此时还没有 HTTP 请求 // 也没有 ctx 中的 user,无法调 TemplateService.List。 // // 解决方案:提供一个独立的 RegisterSystemPrompts 方法让 app.go 在 // 适当时候调用(装配后、启动前),把 system 模板注册到已有 server 上。 } // RegisterSystemPrompts 从 chat.TemplateService 拉取所有 system-scope 模板 // 并注册为 MCP prompts。由 app.go 在装配阶段调用一次。 func RegisterSystemPrompts(srv *mcpsdk.Server, deps ServerDeps, adminUserID uuid.UUID) error { ctx := context.Background() all, err := deps.Templates.List(ctx, adminUserID) if err != nil { return err } for _, t := range all { if t.Scope != chat.TemplateScopeSystem { continue } // 闭包捕获 t tmpl := t srv.AddPrompt(&mcpsdk.Prompt{ Name: tmpl.Name, Description: tmpl.Name, }, func(ctx context.Context, req *mcpsdk.GetPromptRequest) (*mcpsdk.GetPromptResult, error) { return &mcpsdk.GetPromptResult{ Messages: []*mcpsdk.PromptMessage{{ Role: "user", Content: &mcpsdk.TextContent{Text: tmpl.Content}, }}, }, nil }) } return nil }