diff --git a/go.mod b/go.mod index adcbf05..75b9c02 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/linuxsuren/atest-mcp-server go 1.24.3 require ( + github.com/google/jsonschema-go v0.2.0 github.com/linuxsuren/api-testing v0.0.20 github.com/modelcontextprotocol/go-sdk v0.3.0 github.com/spf13/cobra v1.9.1 @@ -29,7 +30,6 @@ require ( github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/jsonschema-go v0.2.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect @@ -63,6 +63,7 @@ require ( github.com/signintech/gopdf v0.32.0 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/pflag v1.0.6 // indirect + github.com/stretchr/testify v1.11.1 // indirect github.com/swaggest/jsonschema-go v0.3.70 // indirect github.com/swaggest/openapi-go v0.2.50 // indirect github.com/swaggest/refl v1.3.0 // indirect diff --git a/go.sum b/go.sum index 343de82..ff4d1da 100644 --- a/go.sum +++ b/go.sum @@ -172,8 +172,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/swaggest/assertjson v1.9.0 h1:dKu0BfJkIxv/xe//mkCrK5yZbs79jL7OVf9Ija7o2xQ= github.com/swaggest/assertjson v1.9.0/go.mod h1:b+ZKX2VRiUjxfUIal0HDN85W0nHPAYUbYH5WkkSsFsU= github.com/swaggest/form/v5 v5.1.1 h1:ct6/rOQBGrqWUQ0FUv3vW5sHvTUb31AwTUWj947N6cY= diff --git a/pkg/atest.go b/pkg/atest.go index 8866fc2..c09199b 100644 --- a/pkg/atest.go +++ b/pkg/atest.go @@ -8,6 +8,7 @@ import ( "github.com/linuxsuren/api-testing/pkg/server" "github.com/modelcontextprotocol/go-sdk/mcp" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type Runner interface { @@ -49,6 +50,11 @@ func NewRunner(address string) Runner { } } +// getConnection creates a gRPC connection to the server +func (r *gRPCRunner) getConnection() (*grpc.ClientConn, error) { + return grpc.NewClient(r.Address, grpc.WithTransportCredentials(insecure.NewCredentials())) +} + type RunRequest struct { SuiteName string `json:"suiteName" jsonschema:"the name of test suite" mcp:"the name of test suite"` CaseName string `json:"caseName" jsonschema:"the name of test case" mcp:"the name of test case"` @@ -56,7 +62,7 @@ type RunRequest struct { func (r *gRPCRunner) Run(ctx context.Context, request *mcp.CallToolRequest, args RunRequest) (result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) runReq := &server.TestTask{ @@ -84,7 +90,7 @@ func (r *gRPCRunner) Run(ctx context.Context, request *mcp.CallToolRequest, args func (r *gRPCRunner) GetSuites(ctx context.Context, request *mcp.CallToolRequest, args any) ( result *mcp.CallToolResult, data map[string]*server.Items, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) var reply *server.Suites @@ -125,7 +131,7 @@ type TestSuiteIndentityRequest struct { func (r *gRPCRunner) CreateTestSuite(ctx context.Context, request *mcp.CallToolRequest, args TestSuiteIndentityRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) if request.Session.InitializeParams().Capabilities.Elicitation != nil && args.Name == "" { @@ -210,7 +216,7 @@ type GetTestSuiteRequest struct { func (r *gRPCRunner) GetTestSuite(ctx context.Context, request *mcp.CallToolRequest, args GetTestSuiteRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) suite := &server.TestSuiteIdentity{ @@ -252,7 +258,7 @@ type APISpec struct { func (r *gRPCRunner) UpdateTestSuite(ctx context.Context, request *mcp.CallToolRequest, args TestSuiteArgs) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) suite := &server.TestSuite{ @@ -280,7 +286,7 @@ func (r *gRPCRunner) UpdateTestSuite(ctx context.Context, request *mcp.CallToolR func (r *gRPCRunner) DeleteTestSuite(ctx context.Context, request *mcp.CallToolRequest, args TestSuiteIndentityRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) suite := &server.TestSuiteIdentity{ @@ -304,7 +310,7 @@ func (r *gRPCRunner) DeleteTestSuite(ctx context.Context, request *mcp.CallToolR func (r *gRPCRunner) ListTestCase(ctx context.Context, request *mcp.CallToolRequest, args TestSuiteIndentityRequest) ( result *mcp.CallToolResult, data TestCases, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) suite := &server.TestSuiteIdentity{ @@ -343,7 +349,7 @@ type TestCaseIndentityRequest struct { func (r *gRPCRunner) RunTestCase(ctx context.Context, request *mcp.CallToolRequest, args TestCaseIndentityRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) testCase := &server.TestCaseIdentity{ @@ -367,7 +373,7 @@ func (r *gRPCRunner) RunTestCase(ctx context.Context, request *mcp.CallToolReque func (r *gRPCRunner) GetTestCase(ctx context.Context, request *mcp.CallToolRequest, args TestCaseIndentityRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) testCase := &server.TestCaseIdentity{ @@ -391,7 +397,7 @@ func (r *gRPCRunner) GetTestCase(ctx context.Context, request *mcp.CallToolReque func (r *gRPCRunner) CreateTestCase(ctx context.Context, request *mcp.CallToolRequest, args CreateTestCaseRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) testCase := &server.TestCaseWithSuite{ @@ -444,7 +450,7 @@ func convertMapToPairs(data map[string]string) []*server.Pair { func (r *gRPCRunner) UpdateTestCase(ctx context.Context, request *mcp.CallToolRequest, args CreateTestCaseRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) testCase := &server.TestCaseWithSuite{ @@ -476,7 +482,7 @@ func (r *gRPCRunner) UpdateTestCase(ctx context.Context, request *mcp.CallToolRe func (r *gRPCRunner) GetSuggestedAPIs(ctx context.Context, request *mcp.CallToolRequest, args TestSuiteIndentityRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) suite := &server.TestSuiteIdentity{ @@ -500,7 +506,7 @@ func (r *gRPCRunner) GetSuggestedAPIs(ctx context.Context, request *mcp.CallTool func (r *gRPCRunner) DeleteTestCase(ctx context.Context, request *mcp.CallToolRequest, args TestCaseIndentityRequest) ( result *mcp.CallToolResult, a any, err error) { var conn *grpc.ClientConn - if conn, err = grpc.Dial(r.Address, grpc.WithInsecure()); err == nil { + if conn, err = r.getConnection(); err == nil { runner := server.NewRunnerClient(conn) testCase := &server.TestCaseIdentity{