Skip to content

Commit ed2fc20

Browse files
feat: add support for MCP servers (#965)
feat: add support for MCP servers Tools can include #!mcp in their instructions with a JSON blob of the configuration. GPTScript will generate tools dynamically for these MCP servers. Signed-off-by: Donnie Adams <[email protected]> Co-authored-by: Darren Shepherd <[email protected]>
1 parent 5ff6543 commit ed2fc20

File tree

18 files changed

+897
-33
lines changed

18 files changed

+897
-33
lines changed

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ require (
1818
github.com/gptscript-ai/chat-completion-client v0.0.0-20250224164718-139cb4507b1d
1919
github.com/gptscript-ai/cmd v0.0.0-20240802230653-326b7baf6fcb
2020
github.com/gptscript-ai/go-gptscript v0.9.6-0.20250204133419-744b25b84a61
21-
github.com/gptscript-ai/tui v0.0.0-20250204145344-33cd15de4cee
21+
github.com/gptscript-ai/tui v0.0.0-20250419050840-5e79e16786c9
2222
github.com/hexops/autogold/v2 v2.2.1
2323
github.com/hexops/valast v1.4.4
2424
github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056
25+
github.com/mark3labs/mcp-go v0.25.0
2526
github.com/mholt/archives v0.1.0
2627
github.com/pkoukk/tiktoken-go v0.1.7
2728
github.com/pkoukk/tiktoken-go-loader v0.0.2-0.20240522064338-c17e8bc0f699
@@ -113,6 +114,7 @@ require (
113114
github.com/skeema/knownhosts v1.2.2 // indirect
114115
github.com/sorairolake/lzip-go v0.3.5 // indirect
115116
github.com/sourcegraph/go-diff-patch v0.0.0-20240223163233-798fd1e94a8e // indirect
117+
github.com/spf13/cast v1.7.1 // indirect
116118
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
117119
github.com/therootcompany/xz v1.0.1 // indirect
118120
github.com/tidwall/match v1.1.1 // indirect
@@ -122,6 +124,7 @@ require (
122124
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
123125
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
124126
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
127+
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
125128
github.com/yuin/goldmark v1.5.4 // indirect
126129
github.com/yuin/goldmark-emoji v1.0.2 // indirect
127130
go4.org v0.0.0-20230225012048-214862532bf5 // indirect

go.sum

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ github.com/gptscript-ai/cmd v0.0.0-20240802230653-326b7baf6fcb h1:ky2J2CzBOskC7J
203203
github.com/gptscript-ai/cmd v0.0.0-20240802230653-326b7baf6fcb/go.mod h1:DJAo1xTht1LDkNYFNydVjTHd576TC7MlpsVRl3oloVw=
204204
github.com/gptscript-ai/go-gptscript v0.9.6-0.20250204133419-744b25b84a61 h1:QxLjsLOYlsVLPwuRkP0Q8EcAoZT1s8vU2ZBSX0+R6CI=
205205
github.com/gptscript-ai/go-gptscript v0.9.6-0.20250204133419-744b25b84a61/go.mod h1:/FVuLwhz+sIfsWUgUHWKi32qT0i6+IXlUlzs70KKt/Q=
206-
github.com/gptscript-ai/tui v0.0.0-20250204145344-33cd15de4cee h1:70PHW6Xw70yNNZ5aX936XqcMLwNmfMZpCV3FCOGKpxE=
207-
github.com/gptscript-ai/tui v0.0.0-20250204145344-33cd15de4cee/go.mod h1:iwHxuueg2paOak7zIg0ESBWx7A0wIHGopAratbgaPNY=
206+
github.com/gptscript-ai/tui v0.0.0-20250419050840-5e79e16786c9 h1:wQC8sKyeGA50WnCEG+Jo5FNRIkuX3HX8d3ubyWCCoI8=
207+
github.com/gptscript-ai/tui v0.0.0-20250419050840-5e79e16786c9/go.mod h1:iwHxuueg2paOak7zIg0ESBWx7A0wIHGopAratbgaPNY=
208208
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
209209
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
210210
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -270,6 +270,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69
270270
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
271271
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
272272
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
273+
github.com/mark3labs/mcp-go v0.25.0 h1:UUpcMT3L5hIhuDy7aifj4Bphw4Pfx1Rf8mzMXDe8RQw=
274+
github.com/mark3labs/mcp-go v0.25.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
273275
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
274276
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
275277
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
@@ -361,6 +363,8 @@ github.com/sorairolake/lzip-go v0.3.5 h1:ms5Xri9o1JBIWvOFAorYtUNik6HI3HgBTkISiqu
361363
github.com/sorairolake/lzip-go v0.3.5/go.mod h1:N0KYq5iWrMXI0ZEXKXaS9hCyOjZUQdBDEIbXfoUwbdk=
362364
github.com/sourcegraph/go-diff-patch v0.0.0-20240223163233-798fd1e94a8e h1:H+jDTUeF+SVd4ApwnSFoew8ZwGNRfgb9EsZc7LcocAg=
363365
github.com/sourcegraph/go-diff-patch v0.0.0-20240223163233-798fd1e94a8e/go.mod h1:VsUklG6OQo7Ctunu0gS3AtEOCEc2kMB6r5rKzxAes58=
366+
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
367+
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
364368
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
365369
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
366370
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
@@ -406,6 +410,8 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM
406410
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
407411
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
408412
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
413+
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
414+
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
409415
github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
410416
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
411417
github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU=

pkg/cli/gptscript.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ func (r *GPTScript) listTools(ctx context.Context, gptScript *gptscript.GPTScrip
215215
// Don't print instructions
216216
tool.Instructions = ""
217217

218-
lines = append(lines, tool.String())
218+
lines = append(lines, tool.Print())
219219
}
220220
fmt.Println(strings.Join(lines, "\n---\n"))
221221
return nil

pkg/engine/engine.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ type Engine struct {
4141
RuntimeManager RuntimeManager
4242
Env []string
4343
Progress chan<- types.CompletionStatus
44+
MCPRunner MCPRunner
45+
}
46+
47+
type MCPRunner interface {
48+
Run(ctx context.Context, progress chan<- types.CompletionStatus, tool types.Tool, input string) (string, error)
4449
}
4550

4651
type State struct {
@@ -307,6 +312,17 @@ func populateMessageParams(ctx Context, completion *types.CompletionRequest, too
307312
return nil
308313
}
309314

315+
func (e *Engine) runMCPInvoke(ctx Context, tool types.Tool, input string) (*Return, error) {
316+
output, err := e.MCPRunner.Run(ctx.Ctx, e.Progress, tool, input)
317+
if err != nil {
318+
return nil, fmt.Errorf("failed to run MCP invoke: %w", err)
319+
}
320+
321+
return &Return{
322+
Result: &output,
323+
}, nil
324+
}
325+
310326
func (e *Engine) runCommandTools(ctx Context, tool types.Tool, input string) (*Return, error) {
311327
if tool.IsHTTP() {
312328
return e.runHTTP(ctx, tool, input)
@@ -342,6 +358,10 @@ func (e *Engine) Start(ctx Context, input string) (ret *Return, err error) {
342358
}
343359
}()
344360

361+
if tool.IsMCPInvoke() {
362+
return e.runMCPInvoke(ctx, tool, input)
363+
}
364+
345365
if tool.IsCommand() {
346366
return e.runCommandTools(ctx, tool, input)
347367
}
@@ -378,6 +398,7 @@ func addUpdateSystem(ctx Context, tool types.Tool, msgs []types.CompletionMessag
378398
instructions = append(instructions, context.Content)
379399
}
380400

401+
tool.Instructions = strings.TrimPrefix(tool.Instructions, types.PromptPrefix)
381402
if tool.Instructions != "" {
382403
instructions = append(instructions, tool.Instructions)
383404
}

pkg/loader/loader.go

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/gptscript-ai/gptscript/pkg/builtin"
2121
"github.com/gptscript-ai/gptscript/pkg/cache"
2222
"github.com/gptscript-ai/gptscript/pkg/hash"
23+
"github.com/gptscript-ai/gptscript/pkg/mcp"
2324
"github.com/gptscript-ai/gptscript/pkg/openapi"
2425
"github.com/gptscript-ai/gptscript/pkg/parser"
2526
"github.com/gptscript-ai/gptscript/pkg/system"
@@ -155,7 +156,23 @@ func loadOpenAPI(prg *types.Program, data []byte) *openapi3.T {
155156
return openAPIDocument
156157
}
157158

158-
func readTool(ctx context.Context, cache *cache.Client, prg *types.Program, base *source, targetToolName, defaultModel string) ([]types.Tool, error) {
159+
func processMCP(ctx context.Context, tool []types.Tool, mcpLoader MCPLoader) (result []types.Tool, _ error) {
160+
for _, t := range tool {
161+
if t.IsMCP() {
162+
mcpTools, err := mcpLoader.Load(ctx, t)
163+
if err != nil {
164+
return nil, fmt.Errorf("error loading MCP tools: %w", err)
165+
}
166+
result = append(result, mcpTools...)
167+
} else {
168+
result = append(result, t)
169+
}
170+
}
171+
172+
return result, nil
173+
}
174+
175+
func readTool(ctx context.Context, cache *cache.Client, mcp MCPLoader, prg *types.Program, base *source, targetToolName, defaultModel string) ([]types.Tool, error) {
159176
data := base.Content
160177

161178
var (
@@ -212,6 +229,11 @@ func readTool(ctx context.Context, cache *cache.Client, prg *types.Program, base
212229
return nil, fmt.Errorf("no tools found in %s", base)
213230
}
214231

232+
tools, err := processMCP(ctx, tools, mcp)
233+
if err != nil {
234+
return nil, err
235+
}
236+
215237
var (
216238
localTools = types.ToolSet{}
217239
targetTools []types.Tool
@@ -279,17 +301,17 @@ func readTool(ctx context.Context, cache *cache.Client, prg *types.Program, base
279301
localTools[strings.ToLower(tool.Name)] = tool
280302
}
281303

282-
return linkAll(ctx, cache, prg, base, targetTools, localTools, defaultModel)
304+
return linkAll(ctx, cache, mcp, prg, base, targetTools, localTools, defaultModel)
283305
}
284306

285-
func linkAll(ctx context.Context, cache *cache.Client, prg *types.Program, base *source, tools []types.Tool, localTools types.ToolSet, defaultModel string) (result []types.Tool, _ error) {
307+
func linkAll(ctx context.Context, cache *cache.Client, mcp MCPLoader, prg *types.Program, base *source, tools []types.Tool, localTools types.ToolSet, defaultModel string) (result []types.Tool, _ error) {
286308
localToolsMapping := make(map[string]string, len(tools))
287309
for _, localTool := range localTools {
288310
localToolsMapping[strings.ToLower(localTool.Name)] = localTool.ID
289311
}
290312

291313
for _, tool := range tools {
292-
tool, err := link(ctx, cache, prg, base, tool, localTools, localToolsMapping, defaultModel)
314+
tool, err := link(ctx, cache, mcp, prg, base, tool, localTools, localToolsMapping, defaultModel)
293315
if err != nil {
294316
return nil, err
295317
}
@@ -298,7 +320,7 @@ func linkAll(ctx context.Context, cache *cache.Client, prg *types.Program, base
298320
return
299321
}
300322

301-
func link(ctx context.Context, cache *cache.Client, prg *types.Program, base *source, tool types.Tool, localTools types.ToolSet, localToolsMapping map[string]string, defaultModel string) (types.Tool, error) {
323+
func link(ctx context.Context, cache *cache.Client, mcp MCPLoader, prg *types.Program, base *source, tool types.Tool, localTools types.ToolSet, localToolsMapping map[string]string, defaultModel string) (types.Tool, error) {
302324
if existing, ok := prg.ToolSet[tool.ID]; ok {
303325
return existing, nil
304326
}
@@ -323,7 +345,7 @@ func link(ctx context.Context, cache *cache.Client, prg *types.Program, base *so
323345
linkedTool = existing
324346
} else {
325347
var err error
326-
linkedTool, err = link(ctx, cache, prg, base, localTool, localTools, localToolsMapping, defaultModel)
348+
linkedTool, err = link(ctx, cache, mcp, prg, base, localTool, localTools, localToolsMapping, defaultModel)
327349
if err != nil {
328350
return types.Tool{}, fmt.Errorf("failed linking %s at %s: %w", targetToolName, base, err)
329351
}
@@ -333,7 +355,7 @@ func link(ctx context.Context, cache *cache.Client, prg *types.Program, base *so
333355
toolNames[targetToolName] = struct{}{}
334356
} else {
335357
toolName, subTool := types.SplitToolRef(targetToolName)
336-
resolvedTools, err := resolve(ctx, cache, prg, base, toolName, subTool, defaultModel)
358+
resolvedTools, err := resolve(ctx, cache, mcp, prg, base, toolName, subTool, defaultModel)
337359
if err != nil {
338360
return types.Tool{}, fmt.Errorf("failed resolving %s from %s: %w", targetToolName, base, err)
339361
}
@@ -373,7 +395,7 @@ func ProgramFromSource(ctx context.Context, content, subToolName string, opts ..
373395
prg := types.Program{
374396
ToolSet: types.ToolSet{},
375397
}
376-
tools, err := readTool(ctx, opt.Cache, &prg, &source{
398+
tools, err := readTool(ctx, opt.Cache, opt.MCPLoader, &prg, &source{
377399
Content: []byte(content),
378400
Path: locationPath,
379401
Name: locationName,
@@ -390,13 +412,20 @@ type Options struct {
390412
Cache *cache.Client
391413
Location string
392414
DefaultModel string
415+
MCPLoader MCPLoader
416+
}
417+
418+
type MCPLoader interface {
419+
Load(ctx context.Context, tool types.Tool) ([]types.Tool, error)
420+
Close() error
393421
}
394422

395423
func complete(opts ...Options) (result Options) {
396424
for _, opt := range opts {
397425
result.Cache = types.FirstSet(opt.Cache, result.Cache)
398426
result.Location = types.FirstSet(opt.Location, result.Location)
399427
result.DefaultModel = types.FirstSet(opt.DefaultModel, result.DefaultModel)
428+
result.MCPLoader = types.FirstSet(opt.MCPLoader, result.MCPLoader)
400429
}
401430

402431
if result.Location == "" {
@@ -407,6 +436,10 @@ func complete(opts ...Options) (result Options) {
407436
result.DefaultModel = builtin.GetDefaultModel()
408437
}
409438

439+
if result.MCPLoader == nil {
440+
result.MCPLoader = mcp.DefaultLoader
441+
}
442+
410443
return
411444
}
412445

@@ -430,15 +463,15 @@ func Program(ctx context.Context, name, subToolName string, opts ...Options) (ty
430463
Name: name,
431464
ToolSet: types.ToolSet{},
432465
}
433-
tools, err := resolve(ctx, opt.Cache, &prg, &source{}, name, subToolName, opt.DefaultModel)
466+
tools, err := resolve(ctx, opt.Cache, opt.MCPLoader, &prg, &source{}, name, subToolName, opt.DefaultModel)
434467
if err != nil {
435468
return types.Program{}, err
436469
}
437470
prg.EntryToolID = tools[0].ID
438471
return prg, nil
439472
}
440473

441-
func resolve(ctx context.Context, cache *cache.Client, prg *types.Program, base *source, name, subTool, defaultModel string) ([]types.Tool, error) {
474+
func resolve(ctx context.Context, cache *cache.Client, mcp MCPLoader, prg *types.Program, base *source, name, subTool, defaultModel string) ([]types.Tool, error) {
442475
if subTool == "" {
443476
t, ok := builtin.DefaultModel(name, defaultModel)
444477
if ok {
@@ -452,7 +485,7 @@ func resolve(ctx context.Context, cache *cache.Client, prg *types.Program, base
452485
return nil, err
453486
}
454487

455-
result, err := readTool(ctx, cache, prg, s, subTool, defaultModel)
488+
result, err := readTool(ctx, cache, mcp, prg, s, subTool, defaultModel)
456489
if err != nil {
457490
return nil, err
458491
}

pkg/loader/openapi_test.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestLoadOpenAPI(t *testing.T) {
2626
}
2727
datav3, err := os.ReadFile("testdata/openapi_v3.yaml")
2828
require.NoError(t, err)
29-
_, err = readTool(context.Background(), nil, &prgv3, &source{Content: datav3}, "", "")
29+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv3, &source{Content: datav3}, "", "")
3030
require.NoError(t, err, "failed to read openapi v3")
3131
require.Equal(t, 3, numOpenAPITools(prgv3.ToolSet), "expected 3 openapi tools")
3232

@@ -35,7 +35,7 @@ func TestLoadOpenAPI(t *testing.T) {
3535
}
3636
datav2, err := os.ReadFile("testdata/openapi_v2.json")
3737
require.NoError(t, err)
38-
_, err = readTool(context.Background(), nil, &prgv2json, &source{Content: datav2}, "", "")
38+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv2json, &source{Content: datav2}, "", "")
3939
require.NoError(t, err, "failed to read openapi v2")
4040
require.Equal(t, 3, numOpenAPITools(prgv2json.ToolSet), "expected 3 openapi tools")
4141

@@ -44,7 +44,7 @@ func TestLoadOpenAPI(t *testing.T) {
4444
}
4545
datav2, err = os.ReadFile("testdata/openapi_v2.yaml")
4646
require.NoError(t, err)
47-
_, err = readTool(context.Background(), nil, &prgv2yaml, &source{Content: datav2}, "", "")
47+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv2yaml, &source{Content: datav2}, "", "")
4848
require.NoError(t, err, "failed to read openapi v2 (yaml)")
4949
require.Equal(t, 3, numOpenAPITools(prgv2yaml.ToolSet), "expected 3 openapi tools")
5050

@@ -57,7 +57,7 @@ func TestOpenAPIv3(t *testing.T) {
5757
}
5858
datav3, err := os.ReadFile("testdata/openapi_v3.yaml")
5959
require.NoError(t, err)
60-
_, err = readTool(context.Background(), nil, &prgv3, &source{Content: datav3}, "", "")
60+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv3, &source{Content: datav3}, "", "")
6161
require.NoError(t, err)
6262

6363
autogold.ExpectFile(t, prgv3.ToolSet, autogold.Dir("testdata/openapi"))
@@ -69,7 +69,7 @@ func TestOpenAPIv3NoOperationIDs(t *testing.T) {
6969
}
7070
datav3, err := os.ReadFile("testdata/openapi_v3_no_operation_ids.yaml")
7171
require.NoError(t, err)
72-
_, err = readTool(context.Background(), nil, &prgv3, &source{Content: datav3}, "", "")
72+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv3, &source{Content: datav3}, "", "")
7373
require.NoError(t, err)
7474

7575
autogold.ExpectFile(t, prgv3.ToolSet, autogold.Dir("testdata/openapi"))
@@ -81,7 +81,7 @@ func TestOpenAPIv2(t *testing.T) {
8181
}
8282
datav2, err := os.ReadFile("testdata/openapi_v2.yaml")
8383
require.NoError(t, err)
84-
_, err = readTool(context.Background(), nil, &prgv2, &source{Content: datav2}, "", "")
84+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv2, &source{Content: datav2}, "", "")
8585
require.NoError(t, err)
8686

8787
autogold.ExpectFile(t, prgv2.ToolSet, autogold.Dir("testdata/openapi"))
@@ -94,7 +94,7 @@ func TestOpenAPIv3Revamp(t *testing.T) {
9494
}
9595
datav3, err := os.ReadFile("testdata/openapi_v3.yaml")
9696
require.NoError(t, err)
97-
_, err = readTool(context.Background(), nil, &prgv3, &source{Content: datav3}, "", "")
97+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv3, &source{Content: datav3}, "", "")
9898
require.NoError(t, err)
9999

100100
autogold.ExpectFile(t, prgv3.ToolSet, autogold.Dir("testdata/openapi"))
@@ -107,7 +107,7 @@ func TestOpenAPIv3NoOperationIDsRevamp(t *testing.T) {
107107
}
108108
datav3, err := os.ReadFile("testdata/openapi_v3_no_operation_ids.yaml")
109109
require.NoError(t, err)
110-
_, err = readTool(context.Background(), nil, &prgv3, &source{Content: datav3}, "", "")
110+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv3, &source{Content: datav3}, "", "")
111111
require.NoError(t, err)
112112

113113
autogold.ExpectFile(t, prgv3.ToolSet, autogold.Dir("testdata/openapi"))
@@ -120,8 +120,18 @@ func TestOpenAPIv2Revamp(t *testing.T) {
120120
}
121121
datav2, err := os.ReadFile("testdata/openapi_v2.yaml")
122122
require.NoError(t, err)
123-
_, err = readTool(context.Background(), nil, &prgv2, &source{Content: datav2}, "", "")
123+
_, err = readTool(context.Background(), nil, fakeMCPLoader{}, &prgv2, &source{Content: datav2}, "", "")
124124
require.NoError(t, err)
125125

126126
autogold.ExpectFile(t, prgv2.ToolSet, autogold.Dir("testdata/openapi"))
127127
}
128+
129+
type fakeMCPLoader struct{}
130+
131+
func (fakeMCPLoader) Load(context.Context, types.Tool) ([]types.Tool, error) {
132+
return nil, nil
133+
}
134+
135+
func (fakeMCPLoader) Close() error {
136+
return nil
137+
}

0 commit comments

Comments
 (0)