kra/pkg/mcp/tool/enter.go

64 lines
1.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package mcpTool
import (
"context"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
"go.uber.org/zap"
"gorm.io/gorm"
)
// McpTool 定义了MCP工具必须实现的接口
type McpTool interface {
// Handle 返回工具调用信息
Handle(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error)
// New 返回工具注册信息
New() mcp.Tool
}
// DependencyInjectable 定义了支持依赖注入的工具接口
type DependencyInjectable interface {
SetDependencies(db *gorm.DB, logger *zap.Logger)
}
// ConfigInjectable 定义了支持配置注入的工具接口
type ConfigInjectable interface {
SetDependencies(db *gorm.DB, logger *zap.Logger, config *AutoCodeConfig)
}
// 工具注册表
var toolRegister = make(map[string]McpTool)
// RegisterTool 供工具在init时调用将自己注册到工具注册表中
func RegisterTool(tool McpTool) {
mcpTool := tool.New()
toolRegister[mcpTool.Name] = tool
}
// RegisterAllTools 将所有注册的工具注册到MCP服务中
func RegisterAllTools(mcpServer *server.MCPServer) {
for _, tool := range toolRegister {
mcpServer.AddTool(tool.New(), tool.Handle)
}
}
// RegisterAllToolsWithDependencies 将所有注册的工具注册到MCP服务中并注入依赖
func RegisterAllToolsWithDependencies(mcpServer *server.MCPServer, db *gorm.DB, logger *zap.Logger, config *AutoCodeConfig) {
for _, tool := range toolRegister {
// 尝试注入配置依赖
if injectable, ok := tool.(ConfigInjectable); ok {
injectable.SetDependencies(db, logger, config)
} else if injectable, ok := tool.(DependencyInjectable); ok {
// 尝试注入基本依赖
injectable.SetDependencies(db, logger)
}
mcpServer.AddTool(tool.New(), tool.Handle)
}
}
// GetRegisteredTools 获取所有已注册的工具
func GetRegisteredTools() map[string]McpTool {
return toolRegister
}