Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
32 changes: 19 additions & 13 deletions pkg/atest.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -49,14 +50,19 @@ 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"`
}

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{
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 == "" {
Expand Down Expand Up @@ -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{
Expand Down Expand Up @@ -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{
Expand Down Expand Up @@ -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{
Expand All @@ -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{
Expand Down Expand Up @@ -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{
Expand All @@ -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{
Expand All @@ -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{
Expand Down Expand Up @@ -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{
Expand Down Expand Up @@ -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{
Expand All @@ -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{
Expand Down
Loading