diff --git a/internal/mcp/prompts.go b/internal/mcp/prompts.go new file mode 100644 index 0000000..050c34f --- /dev/null +++ b/internal/mcp/prompts.go @@ -0,0 +1,59 @@ +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 +} diff --git a/internal/mcp/server.go b/internal/mcp/server.go index de639e8..f8626a5 100644 --- a/internal/mcp/server.go +++ b/internal/mcp/server.go @@ -40,5 +40,4 @@ func NewMCPServer(deps ServerDeps) *mcpsdk.Server { // register* 占位函数在后续 Phase F/G 实装时替换函数体。 func registerPMTools(_ *mcpsdk.Server, _ ServerDeps) {} func registerChatTools(_ *mcpsdk.Server, _ ServerDeps) {} -func registerPrompts(_ *mcpsdk.Server, _ ServerDeps) {} func registerResources(_ *mcpsdk.Server, _ ServerDeps) {}