Files
agentic-coding-workflow/internal/mcp/tools_chat.go
T
q792602257 62d9a91ca5 test(mcp): 13 PM tool tests + fix jsonschema tags
Add tools_pm_test.go with 13 integration tests covering all 16 PM
tools via SDK in-memory transport with fake services.

Fix jsonschema tags in tools_pm.go and tools_chat.go — SDK's tag
parser rejects "required,min=1" and "required,description=X" syntax;
use plain description text instead (non-pointer fields are auto-required).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-08 11:52:24 +08:00

76 lines
2.3 KiB
Go

package mcp
import (
"context"
"fmt"
"github.com/google/uuid"
mcpsdk "github.com/modelcontextprotocol/go-sdk/mcp"
)
// registerChatTools 注册 chat 相关 MCP 工具。
// MVP 只有一个:list_recent_messages。
func registerChatTools(srv *mcpsdk.Server, deps ServerDeps) {
registerListRecentMessages(srv, deps)
}
type listRecentMessagesIn struct {
ConversationID string `json:"conversation_id" jsonschema:"UUID of the conversation"`
BeforeID *int64 `json:"before_id,omitempty" jsonschema:"cursor: return messages with ID < this value"`
Limit int `json:"limit,omitempty" jsonschema:"max messages to return (default 50, max 200)"`
}
type messageSummary struct {
ID int64 `json:"id"`
Role string `json:"role"`
Content string `json:"content"`
Status string `json:"status"`
CreatedAt string `json:"created_at"`
}
type listRecentMessagesOut struct {
Messages []messageSummary `json:"messages"`
}
func registerListRecentMessages(srv *mcpsdk.Server, deps ServerDeps) {
mcpsdk.AddTool(srv,
&mcpsdk.Tool{Name: "list_recent_messages", Description: "List recent chat messages in a conversation."},
func(ctx context.Context, _ *mcpsdk.CallToolRequest, in listRecentMessagesIn) (*mcpsdk.CallToolResult, listRecentMessagesOut, error) {
if err := CheckToolFromCtx(ctx, "list_recent_messages"); err != nil {
return nil, listRecentMessagesOut{}, err
}
c, err := deps.Caller.Resolve(ctx)
if err != nil {
return nil, listRecentMessagesOut{}, err
}
convID, err := uuid.Parse(in.ConversationID)
if err != nil {
return nil, listRecentMessagesOut{}, fmt.Errorf("invalid conversation_id: %w", err)
}
limit := in.Limit
if limit <= 0 {
limit = 50
}
if limit > 200 {
limit = 200
}
msgs, err := deps.Messages.ListMessages(ctx, c.UserID, convID, in.BeforeID, limit)
if err != nil {
return nil, listRecentMessagesOut{}, err
}
out := listRecentMessagesOut{Messages: make([]messageSummary, 0, len(msgs))}
for _, m := range msgs {
out.Messages = append(out.Messages, messageSummary{
ID: m.ID,
Role: string(m.Role),
Content: m.Content,
Status: string(m.Status),
CreatedAt: m.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
})
}
return nil, out, nil
})
}