feat(mcp): prompts registration via RegisterSystemPrompts (system-scope only)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 10:52:54 +08:00
parent 5cccc97edd
commit 2d6521e610
2 changed files with 59 additions and 1 deletions
+59
View File
@@ -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
}
-1
View File
@@ -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) {}