Skip to content

Commit 925a01d

Browse files
authored
Switch to modelcontextprotocol/go-sdk (#2)
1 parent 1b32010 commit 925a01d

File tree

18 files changed

+731
-592
lines changed

18 files changed

+731
-592
lines changed

cmd/openapi-mcp/doc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func handleDocMode(flags *cliFlags, ops []openapi2mcp.OpenAPIOperation, doc *ope
3030
"name": name,
3131
"description": desc,
3232
"tags": op.Tags,
33-
"inputSchema": inputSchema,
33+
"inputSchema": openapi2mcp.SchemaToMap(inputSchema),
3434
})
3535
}
3636
jsonBytes, _ := json.MarshalIndent(toolSummaries, "", " ")

cmd/openapi-mcp/main_test.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import (
1212

1313
"github.com/evcc-io/openapi-mcp/pkg/openapi2mcp"
1414
"github.com/getkin/kin-openapi/openapi3"
15-
"github.com/mark3labs/mcp-go/mcp"
16-
mcpserver "github.com/mark3labs/mcp-go/server"
15+
"github.com/modelcontextprotocol/go-sdk/mcp"
1716
)
1817

1918
func TestRegisterOpenAPITools(t *testing.T) {
@@ -44,7 +43,8 @@ func TestRegisterOpenAPITools(t *testing.T) {
4443
Paths: paths,
4544
}
4645

47-
server := mcpserver.NewMCPServer("test", "0.0.1")
46+
impl := &mcp.Implementation{Name: "test", Version: "0.0.1"}
47+
server := mcp.NewServer(impl, nil)
4848
ops := openapi2mcp.ExtractOpenAPIOperations(doc)
4949
openapi2mcp.RegisterOpenAPITools(server, ops, doc, nil)
5050

@@ -166,7 +166,8 @@ func TestHTTPOpenAPIToolHandler(t *testing.T) {
166166
Paths: paths,
167167
}
168168

169-
server := mcpserver.NewMCPServer("test", "0.0.1")
169+
impl := &mcp.Implementation{Name: "test", Version: "0.0.1"}
170+
server := mcp.NewServer(impl, nil)
170171
ops := openapi2mcp.ExtractOpenAPIOperations(doc)
171172
openapi2mcp.RegisterOpenAPITools(server, ops, doc, nil)
172173

@@ -391,7 +392,8 @@ func TestRegisterOpenAPITools_ServerSelection(t *testing.T) {
391392
}(),
392393
}
393394

394-
server := mcpserver.NewMCPServer("test", "0.0.1")
395+
impl := &mcp.Implementation{Name: "test", Version: "0.0.1"}
396+
server := mcp.NewServer(impl, nil)
395397
ops := openapi2mcp.ExtractOpenAPIOperations(doc)
396398
openapi2mcp.RegisterOpenAPITools(server, ops, doc, nil)
397399

@@ -417,7 +419,8 @@ func TestExternalDocsTool(t *testing.T) {
417419
},
418420
Paths: openapi3.NewPaths(),
419421
}
420-
server := mcpserver.NewMCPServer("test", "0.0.1")
422+
impl := &mcp.Implementation{Name: "test", Version: "0.0.1"}
423+
server := mcp.NewServer(impl, nil)
421424
ops := openapi2mcp.ExtractOpenAPIOperations(doc)
422425
openapi2mcp.RegisterOpenAPITools(server, ops, doc, nil)
423426

@@ -489,7 +492,8 @@ func TestInfoTool(t *testing.T) {
489492
},
490493
Paths: openapi3.NewPaths(),
491494
}
492-
server := mcpserver.NewMCPServer("test", "0.0.1")
495+
impl := &mcp.Implementation{Name: "test", Version: "0.0.1"}
496+
server := mcp.NewServer(impl, nil)
493497
ops := openapi2mcp.ExtractOpenAPIOperations(doc)
494498
openapi2mcp.RegisterOpenAPITools(server, ops, doc, nil)
495499

cmd/openapi-mcp/server.go

Lines changed: 80 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,15 @@
22
package main
33

44
import (
5-
"context"
65
"encoding/json"
76
"fmt"
8-
"log"
97
"net/http"
108
"os"
119
"strings"
12-
"time"
1310

1411
"github.com/evcc-io/openapi-mcp/pkg/openapi2mcp"
1512
"github.com/getkin/kin-openapi/openapi3"
16-
"github.com/mark3labs/mcp-go/mcp"
17-
mcpserver "github.com/mark3labs/mcp-go/server"
13+
"github.com/modelcontextprotocol/go-sdk/mcp"
1814
)
1915

2016
// startServer starts the MCP server in stdio or HTTP mode, based on CLI flags.
@@ -126,7 +122,7 @@ func startServer(flags *cliFlags, ops []openapi2mcp.OpenAPIOperation, doc *opena
126122
}
127123

128124
// makeMCPHandler returns an http.Handler that serves the MCP server at the given basePath.
129-
func makeMCPHandler(srv *mcpserver.MCPServer, basePath string) http.Handler {
125+
func makeMCPHandler(srv *mcp.Server, basePath string) http.Handler {
130126
return openapi2mcp.HandlerForBasePath(srv, basePath)
131127
}
132128

@@ -149,47 +145,54 @@ func formatHumanReadableLog(timestamp, logType, method string, id any, data inte
149145
case "request":
150146
log.WriteString("📤 INCOMING REQUEST\n")
151147

152-
// Handle typed MCP request objects
153-
switch req := data.(type) {
154-
case *mcp.CallToolRequest:
155-
// Handle CallToolRequest directly
156-
log.WriteString(fmt.Sprintf("🔧 Tool: %s\n", req.Params.Name))
157-
args := req.GetArguments()
158-
if len(args) > 0 {
159-
log.WriteString("📝 Arguments:\n")
160-
for key, value := range args {
161-
valueStr := formatValue(value, noTruncation)
162-
log.WriteString(fmt.Sprintf(" %s: %s\n", key, valueStr))
163-
}
164-
} else {
165-
log.WriteString("📝 Arguments: (none)\n")
166-
}
167-
168-
case *mcp.ListToolsRequest:
169-
// ListToolsRequest typically has pagination params
170-
log.WriteString("📝 Method: tools/list\n")
171-
if req.Params.Cursor != "" {
172-
log.WriteString(fmt.Sprintf(" Cursor: %s\n", req.Params.Cursor))
173-
}
174-
175-
case *mcp.InitializeRequest:
176-
log.WriteString("📝 Method: initialize\n")
177-
log.WriteString(fmt.Sprintf(" Protocol Version: %s\n", req.Params.ProtocolVersion))
178-
if req.Params.ClientInfo.Name != "" {
179-
log.WriteString(fmt.Sprintf(" Client: %s/%s\n", req.Params.ClientInfo.Name, req.Params.ClientInfo.Version))
180-
}
181-
182-
case *mcp.PingRequest:
183-
log.WriteString("📝 Method: ping\n")
184-
185-
default:
186-
// For other request types or if we can't determine the type,
187-
// try to marshal to JSON and display
188-
if jsonData, err := json.MarshalIndent(data, " ", " "); err == nil {
189-
log.WriteString(fmt.Sprintf("📝 Request:\n %s\n", string(jsonData)))
190-
} else {
191-
log.WriteString(fmt.Sprintf("📝 Request type: %T\n", data))
192-
}
148+
// Handle typed MCP request objects (commented out due to API changes)
149+
// switch req := data.(type) {
150+
// case *mcp.CallToolRequest:
151+
// // Handle CallToolRequest directly
152+
// log.WriteString(fmt.Sprintf("🔧 Tool: %s\n", req.Params.Name))
153+
// args := req.GetArguments()
154+
// if len(args) > 0 {
155+
// log.WriteString("📝 Arguments:\n")
156+
// for key, value := range args {
157+
// valueStr := formatValue(value, noTruncation)
158+
// log.WriteString(fmt.Sprintf(" %s: %s\n", key, valueStr))
159+
// }
160+
// } else {
161+
// log.WriteString("📝 Arguments: (none)\n")
162+
// }
163+
//
164+
// case *mcp.ListToolsRequest:
165+
// // ListToolsRequest typically has pagination params
166+
// log.WriteString("📝 Method: tools/list\n")
167+
// if req.Params.Cursor != "" {
168+
// log.WriteString(fmt.Sprintf(" Cursor: %s\n", req.Params.Cursor))
169+
// }
170+
//
171+
// case *mcp.InitializeRequest:
172+
// log.WriteString("📝 Method: initialize\n")
173+
// log.WriteString(fmt.Sprintf(" Protocol Version: %s\n", req.Params.ProtocolVersion))
174+
// if req.Params.ClientInfo.Name != "" {
175+
// log.WriteString(fmt.Sprintf(" Client: %s/%s\n", req.Params.ClientInfo.Name, req.Params.ClientInfo.Version))
176+
// }
177+
//
178+
// case *mcp.PingRequest:
179+
// log.WriteString("📝 Method: ping\n")
180+
//
181+
// default:
182+
// // For other request types or if we can't determine the type,
183+
// // try to marshal to JSON and display
184+
// if jsonData, err := json.MarshalIndent(data, " ", " "); err == nil {
185+
// log.WriteString(fmt.Sprintf("📝 Request:\n %s\n", string(jsonData)))
186+
// } else {
187+
// log.WriteString(fmt.Sprintf("📝 Request type: %T\n", data))
188+
// }
189+
// }
190+
191+
// Generic fallback for logging (temporary until new API is implemented)
192+
if jsonData, err := json.MarshalIndent(data, " ", " "); err == nil {
193+
log.WriteString(fmt.Sprintf("📝 Request:\n %s\n", string(jsonData)))
194+
} else {
195+
log.WriteString(fmt.Sprintf("📝 Request type: %T\n", data))
193196
}
194197

195198
case "response":
@@ -243,8 +246,8 @@ func formatHumanReadableLog(timestamp, logType, method string, id any, data inte
243246
if len(result.Content) > 0 {
244247
log.WriteString("📋 Response Content:\n")
245248
for i, item := range result.Content {
246-
if textContent, ok := item.(mcp.TextContent); ok {
247-
log.WriteString(fmt.Sprintf(" [%d] Type: %s\n", i+1, textContent.Type))
249+
if textContent, ok := item.(*mcp.TextContent); ok {
250+
log.WriteString(fmt.Sprintf(" [%d] Type: text\n", i+1))
248251
// Truncate very long responses
249252
if !noTruncation && len(textContent.Text) > 500 {
250253
log.WriteString(fmt.Sprintf(" [%d] Text: %s... (%d chars total)\n",
@@ -372,57 +375,60 @@ func formatValue(value interface{}, noTruncation bool) string {
372375
}
373376

374377
// createLoggingHooks creates MCP hooks for logging requests and responses to a file
375-
func createLoggingHooks(logFilePath string, noLogTruncation bool) (*mcpserver.Hooks, *os.File, error) {
378+
// NOTE: Commented out due to API changes in MCP SDK v0.2.0
379+
func createLoggingHooks(logFilePath string, noLogTruncation bool) (*os.File, error) {
376380
logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o644)
377381
if err != nil {
378-
return nil, nil, fmt.Errorf("failed to open log file: %w", err)
382+
return nil, fmt.Errorf("failed to open log file: %w", err)
379383
}
380384

381-
logger := log.New(logFile, "", 0) // No prefix, we'll format our own output
385+
// logger := log.New(logFile, "", 0) // No prefix, we'll format our own output
382386

383-
hooks := &mcpserver.Hooks{}
387+
// Logging is now handled via LoggingTransport in the new SDK
384388

389+
// TODO: Implement logging with the new SDK API
390+
// The hooks API has been removed or changed in v0.2.0
391+
385392
// Log requests with human-readable format
386-
hooks.AddBeforeAny(func(ctx context.Context, id any, method mcp.MCPMethod, message any) {
387-
timestamp := time.Now().Format("2006-01-02 15:04:05 MST")
388-
humanLog := formatHumanReadableLog(timestamp, "request", string(method), id, message, nil, noLogTruncation)
389-
logger.Print(humanLog)
390-
})
393+
// hooks.AddBeforeAny(func(ctx context.Context, id any, method mcp.MCPMethod, message any) {
394+
// timestamp := time.Now().Format("2006-01-02 15:04:05 MST")
395+
// humanLog := formatHumanReadableLog(timestamp, "request", string(method), id, message, nil, noLogTruncation)
396+
// logger.Print(humanLog)
397+
// })
391398

392399
// Log successful responses with human-readable format
393-
hooks.AddOnSuccess(func(ctx context.Context, id any, method mcp.MCPMethod, message any, result any) {
394-
timestamp := time.Now().Format("2006-01-02 15:04:05 MST")
395-
humanLog := formatHumanReadableLog(timestamp, "response", string(method), id, result, nil, noLogTruncation)
396-
logger.Print(humanLog)
397-
})
400+
// hooks.AddOnSuccess(func(ctx context.Context, id any, method mcp.MCPMethod, message any, result any) {
401+
// timestamp := time.Now().Format("2006-01-02 15:04:05 MST")
402+
// humanLog := formatHumanReadableLog(timestamp, "response", string(method), id, result, nil, noLogTruncation)
403+
// logger.Print(humanLog)
404+
// })
398405

399406
// Log errors with human-readable format
400-
hooks.AddOnError(func(ctx context.Context, id any, method mcp.MCPMethod, message any, err error) {
401-
timestamp := time.Now().Format("2006-01-02 15:04:05 MST")
402-
humanLog := formatHumanReadableLog(timestamp, "error", string(method), id, message, err, noLogTruncation)
403-
logger.Print(humanLog)
404-
})
407+
// hooks.AddOnError(func(ctx context.Context, id any, method mcp.MCPMethod, message any, err error) {
408+
// timestamp := time.Now().Format("2006-01-02 15:04:05 MST")
409+
// humanLog := formatHumanReadableLog(timestamp, "error", string(method), id, message, err, noLogTruncation)
410+
// logger.Print(humanLog)
411+
// })
405412

406-
return hooks, logFile, nil
413+
return logFile, nil
407414
}
408415

409416
// createServerWithOptions creates a new MCP server with the given operations and optional logging
410-
func createServerWithOptions(name, version string, doc *openapi3.T, ops []openapi2mcp.OpenAPIOperation, logFile string, noLogTruncation bool) (*mcpserver.MCPServer, *os.File) {
411-
var opts []mcpserver.ServerOption
417+
func createServerWithOptions(name, version string, doc *openapi3.T, ops []openapi2mcp.OpenAPIOperation, logFile string, noLogTruncation bool) (*mcp.Server, *os.File) {
412418
var logFileHandle *os.File
413419

414420
if logFile != "" {
415-
hooks, fileHandle, err := createLoggingHooks(logFile, noLogTruncation)
421+
fileHandle, err := createLoggingHooks(logFile, noLogTruncation)
416422
if err != nil {
417423
fmt.Fprintf(os.Stderr, "Failed to create logging hooks: %v\n", err)
418424
os.Exit(1)
419425
}
420426
logFileHandle = fileHandle
421-
opts = append(opts, mcpserver.WithHooks(hooks))
422427
fmt.Fprintf(os.Stderr, "Logging MCP requests and responses to: %s\n", logFile)
423428
}
424429

425-
srv := mcpserver.NewMCPServer(name, version, opts...)
430+
impl := &mcp.Implementation{Name: name, Version: version}
431+
srv := mcp.NewServer(impl, nil)
426432
openapi2mcp.RegisterOpenAPITools(srv, ops, doc, nil)
427433
return srv, logFileHandle
428434
}

cmd/openapi-mcp/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func compareWithDiffFile(opts *openapi2mcp.ToolGenOptions, doc *openapi3.T, ops
6363
"name": name,
6464
"description": desc,
6565
"tags": op.Tags,
66-
"inputSchema": inputSchema,
66+
"inputSchema": openapi2mcp.SchemaToMap(inputSchema),
6767
})
6868
}
6969
curBytes, _ := json.MarshalIndent(toolSummaries, "", " ")

go.mod

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,26 @@
11
module github.com/evcc-io/openapi-mcp
22

3-
go 1.23
3+
go 1.23.0
44

5-
toolchain go1.24.4
5+
toolchain go1.24.6
66

77
require (
88
github.com/chzyer/readline v1.5.1
99
github.com/getkin/kin-openapi v0.132.0
10-
github.com/mark3labs/mcp-go v0.32.0
10+
github.com/modelcontextprotocol/go-sdk v0.2.0
1111
github.com/xeipuuv/gojsonschema v1.2.0
1212
go.yaml.in/yaml/v3 v3.0.4
1313
)
1414

1515
require (
1616
github.com/go-openapi/jsonpointer v0.21.0 // indirect
1717
github.com/go-openapi/swag v0.23.0 // indirect
18-
github.com/google/uuid v1.6.0 // indirect
1918
github.com/josharian/intern v1.0.0 // indirect
2019
github.com/mailru/easyjson v0.7.7 // indirect
2120
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
2221
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
2322
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
2423
github.com/perimeterx/marshmallow v1.1.5 // indirect
25-
github.com/spf13/cast v1.8.0 // indirect
2624
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
2725
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
2826
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect

go.sum

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38
77
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
88
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
99
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10-
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
11-
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
1210
github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=
1311
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
1412
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
@@ -17,10 +15,8 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr
1715
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
1816
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
1917
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
20-
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
21-
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
22-
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
23-
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
18+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
19+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
2420
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
2521
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
2622
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -29,8 +25,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
2925
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
3026
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
3127
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
32-
github.com/mark3labs/mcp-go v0.32.0 h1:fgwmbfL2gbd67obg57OfV2Dnrhs1HtSdlY/i5fn7MU8=
33-
github.com/mark3labs/mcp-go v0.32.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
28+
github.com/modelcontextprotocol/go-sdk v0.2.0 h1:PESNYOmyM1c369tRkzXLY5hHrazj8x9CY1Xu0fLCryM=
29+
github.com/modelcontextprotocol/go-sdk v0.2.0/go.mod h1:0sL9zUKKs2FTTkeCCVnKqbLJTw5TScefPAzojjU459E=
3430
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
3531
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
3632
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY=
@@ -43,8 +39,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
4339
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
4440
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
4541
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
46-
github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk=
47-
github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
4842
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
4943
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
5044
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
@@ -63,6 +57,8 @@ go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
6357
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
6458
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng=
6559
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
60+
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
61+
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
6662
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6763
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
6864
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

0 commit comments

Comments
 (0)