You've already forked agentic-coding-workflow
feat(mcp): prompts registration via RegisterSystemPrompts (system-scope only)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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) {}
|
||||
|
||||
Reference in New Issue
Block a user