133 lines
3.5 KiB
Go
133 lines
3.5 KiB
Go
|
package client
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
"github.com/mark3labs/mcp-go/mcp"
|
|||
|
"testing"
|
|||
|
)
|
|||
|
|
|||
|
// 测试 MCP 客户端连接
|
|||
|
func TestMcpClientConnection(t *testing.T) {
|
|||
|
c, err := NewClient("http://localhost:8888/sse", "test-client", "1.0.0", "gin-vue-admin MCP服务")
|
|||
|
defer c.Close()
|
|||
|
if err != nil {
|
|||
|
t.Fatalf(err.Error())
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func TestTools(t *testing.T) {
|
|||
|
t.Run("currentTime", func(t *testing.T) {
|
|||
|
c, err := NewClient("http://localhost:8888/sse", "test-client", "1.0.0", "gin-vue-admin MCP服务")
|
|||
|
defer c.Close()
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("Failed to create client: %v", err)
|
|||
|
}
|
|||
|
ctx := context.Background()
|
|||
|
|
|||
|
request := mcp.CallToolRequest{}
|
|||
|
request.Params.Name = "currentTime"
|
|||
|
request.Params.Arguments = map[string]interface{}{
|
|||
|
"timezone": "UTC+8",
|
|||
|
}
|
|||
|
|
|||
|
result, err := c.CallTool(ctx, request)
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("方法调用错误: %v", err)
|
|||
|
}
|
|||
|
|
|||
|
if len(result.Content) != 1 {
|
|||
|
t.Errorf("应该有且仅返回1条信息,但是现在有 %d", len(result.Content))
|
|||
|
}
|
|||
|
if content, ok := result.Content[0].(mcp.TextContent); ok {
|
|||
|
t.Logf("成功返回信息%s", content.Text)
|
|||
|
} else {
|
|||
|
t.Logf("返回为止类型信息%+v", content)
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
t.Run("getNickname", func(t *testing.T) {
|
|||
|
|
|||
|
c, err := NewClient("http://localhost:8888/sse", "test-client", "1.0.0", "gin-vue-admin MCP服务")
|
|||
|
defer c.Close()
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("Failed to create client: %v", err)
|
|||
|
}
|
|||
|
ctx := context.Background()
|
|||
|
|
|||
|
// Initialize
|
|||
|
initRequest := mcp.InitializeRequest{}
|
|||
|
initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
|
|||
|
initRequest.Params.ClientInfo = mcp.Implementation{
|
|||
|
Name: "test-client",
|
|||
|
Version: "1.0.0",
|
|||
|
}
|
|||
|
|
|||
|
_, err = c.Initialize(ctx, initRequest)
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("初始化失败: %v", err)
|
|||
|
}
|
|||
|
|
|||
|
request := mcp.CallToolRequest{}
|
|||
|
request.Params.Name = "getNickname"
|
|||
|
request.Params.Arguments = map[string]interface{}{
|
|||
|
"username": "admin",
|
|||
|
}
|
|||
|
|
|||
|
result, err := c.CallTool(ctx, request)
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("方法调用错误: %v", err)
|
|||
|
}
|
|||
|
|
|||
|
if len(result.Content) != 1 {
|
|||
|
t.Errorf("应该有且仅返回1条信息,但是现在有 %d", len(result.Content))
|
|||
|
}
|
|||
|
if content, ok := result.Content[0].(mcp.TextContent); ok {
|
|||
|
t.Logf("成功返回信息%s", content.Text)
|
|||
|
} else {
|
|||
|
t.Logf("返回为止类型信息%+v", content)
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
func TestGetTools(t *testing.T) {
|
|||
|
c, err := NewClient("http://localhost:8888/sse", "test-client", "1.0.0", "gin-vue-admin MCP服务")
|
|||
|
defer c.Close()
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("Failed to create client: %v", err)
|
|||
|
}
|
|||
|
ctx := context.Background()
|
|||
|
|
|||
|
toolsRequest := mcp.ListToolsRequest{}
|
|||
|
|
|||
|
toolListResult, err := c.ListTools(ctx, toolsRequest)
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("获取工具列表失败: %v", err)
|
|||
|
}
|
|||
|
for i := range toolListResult.Tools {
|
|||
|
tool := toolListResult.Tools[i]
|
|||
|
fmt.Printf("工具名称: %s\n", tool.Name)
|
|||
|
fmt.Printf("工具描述: %s\n", tool.Description)
|
|||
|
|
|||
|
// 打印参数信息
|
|||
|
if tool.InputSchema.Properties != nil {
|
|||
|
fmt.Println("参数列表:")
|
|||
|
for paramName, prop := range tool.InputSchema.Properties {
|
|||
|
required := "否"
|
|||
|
// 检查参数是否在必填列表中
|
|||
|
for _, reqField := range tool.InputSchema.Required {
|
|||
|
if reqField == paramName {
|
|||
|
required = "是"
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
fmt.Printf(" - %s (类型: %s, 描述: %s, 必填: %s)\n",
|
|||
|
paramName, prop.(map[string]any)["type"], prop.(map[string]any)["description"], required)
|
|||
|
}
|
|||
|
} else {
|
|||
|
fmt.Println("该工具没有参数")
|
|||
|
}
|
|||
|
fmt.Println("-------------------")
|
|||
|
}
|
|||
|
}
|