Skip to content

Commit acdf274

Browse files
committed
Add MCP loader and runner options to the SDK server
Signed-off-by: Donnie Adams <[email protected]>
1 parent 72a426d commit acdf274

File tree

6 files changed

+45
-16
lines changed

6 files changed

+45
-16
lines changed

pkg/engine/engine.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"sync"
1212

1313
"github.com/gptscript-ai/gptscript/pkg/counter"
14-
"github.com/gptscript-ai/gptscript/pkg/mcp"
1514
"github.com/gptscript-ai/gptscript/pkg/types"
1615
"github.com/gptscript-ai/gptscript/pkg/version"
1716
)
@@ -314,11 +313,7 @@ func populateMessageParams(ctx Context, completion *types.CompletionRequest, too
314313
}
315314

316315
func (e *Engine) runMCPInvoke(ctx Context, tool types.Tool, input string) (*Return, error) {
317-
runner := e.MCPRunner
318-
if runner == nil {
319-
runner = mcp.DefaultRunner
320-
}
321-
output, err := runner.Run(ctx.Ctx, e.Progress, tool, input)
316+
output, err := e.MCPRunner.Run(ctx.Ctx, e.Progress, tool, input)
322317
if err != nil {
323318
return nil, fmt.Errorf("failed to run MCP invoke: %w", err)
324319
}

pkg/runner/runner.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
context2 "github.com/gptscript-ai/gptscript/pkg/context"
1515
"github.com/gptscript-ai/gptscript/pkg/credentials"
1616
"github.com/gptscript-ai/gptscript/pkg/engine"
17+
"github.com/gptscript-ai/gptscript/pkg/mcp"
1718
"github.com/gptscript-ai/gptscript/pkg/types"
1819
"golang.org/x/exp/maps"
1920
)
@@ -37,6 +38,7 @@ type Options struct {
3738
CredentialOverrides []string `usage:"-"`
3839
Sequential bool `usage:"-"`
3940
Authorizer AuthorizerFunc `usage:"-"`
41+
MCPRunner engine.MCPRunner `usage:"-"`
4042
}
4143

4244
type RunOptions struct {
@@ -69,6 +71,9 @@ func Complete(opts ...Options) (result Options) {
6971
if opt.CredentialOverrides != nil {
7072
result.CredentialOverrides = append(result.CredentialOverrides, opt.CredentialOverrides...)
7173
}
74+
if opt.MCPRunner != nil {
75+
result.MCPRunner = opt.MCPRunner
76+
}
7277
}
7378
return
7479
}
@@ -87,6 +92,9 @@ func complete(opts ...Options) Options {
8792
if result.Authorizer == nil {
8893
result.Authorizer = DefaultAuthorizer
8994
}
95+
if result.MCPRunner == nil {
96+
result.MCPRunner = mcp.DefaultRunner
97+
}
9098
return result
9199
}
92100

@@ -99,6 +107,7 @@ type Runner struct {
99107
credOverrides []string
100108
credStore credentials.CredentialStore
101109
sequential bool
110+
mcpRunner engine.MCPRunner
102111
}
103112

104113
func New(client engine.Model, credStore credentials.CredentialStore, opts ...Options) (*Runner, error) {
@@ -113,6 +122,7 @@ func New(client engine.Model, credStore credentials.CredentialStore, opts ...Opt
113122
credStore: credStore,
114123
sequential: opt.Sequential,
115124
auth: opt.Authorizer,
125+
mcpRunner: opt.MCPRunner,
116126
}
117127

118128
if opt.StartPort != 0 {
@@ -326,6 +336,7 @@ func (r *Runner) start(callCtx engine.Context, state *State, monitor Monitor, en
326336

327337
e := engine.Engine{
328338
Model: r.c,
339+
MCPRunner: r.mcpRunner,
329340
RuntimeManager: runtimeWithLogger(callCtx, monitor, r.runtimeManager),
330341
Progress: progress,
331342
Env: env,
@@ -524,6 +535,7 @@ func (r *Runner) resume(callCtx engine.Context, monitor Monitor, env []string, s
524535

525536
e := engine.Engine{
526537
Model: r.c,
538+
MCPRunner: r.mcpRunner,
527539
RuntimeManager: runtimeWithLogger(callCtx, monitor, r.runtimeManager),
528540
Progress: progress,
529541
Env: env,

pkg/sdkserver/routes.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type server struct {
2929
datasetTool, workspaceTool string
3030
serverToolsEnv []string
3131
client *gptscript.GPTScript
32+
mcpLoader loader.MCPLoader
3233
events *broadcaster.Broadcaster[event]
3334

3435
runtimeManager engine.RuntimeManager
@@ -283,11 +284,20 @@ func (s *server) load(w http.ResponseWriter, r *http.Request) {
283284
}
284285

285286
if reqObject.Content != "" {
286-
prg, err = loader.ProgramFromSource(ctx, reqObject.Content, reqObject.SubTool, loader.Options{Cache: s.client.Cache})
287+
prg, err = loader.ProgramFromSource(ctx, reqObject.Content, reqObject.SubTool, loader.Options{
288+
Cache: s.client.Cache,
289+
MCPLoader: s.mcpLoader,
290+
})
287291
} else if reqObject.File != "" {
288-
prg, err = loader.Program(ctx, reqObject.File, reqObject.SubTool, loader.Options{Cache: s.client.Cache})
292+
prg, err = loader.Program(ctx, reqObject.File, reqObject.SubTool, loader.Options{
293+
Cache: s.client.Cache,
294+
MCPLoader: s.mcpLoader,
295+
})
289296
} else {
290-
prg, err = loader.ProgramFromSource(ctx, reqObject.ToolDefs.String(), reqObject.SubTool, loader.Options{Cache: s.client.Cache})
297+
prg, err = loader.ProgramFromSource(ctx, reqObject.ToolDefs.String(), reqObject.SubTool, loader.Options{
298+
Cache: s.client.Cache,
299+
MCPLoader: s.mcpLoader,
300+
})
291301
}
292302
if err != nil {
293303
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err))

pkg/sdkserver/run.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ func (s *server) execAndStream(ctx context.Context, programLoader loaderFunc, lo
3636
if defaultModel == "" {
3737
defaultModel = s.gptscriptOpts.OpenAI.DefaultModel
3838
}
39-
prg, err := programLoader(ctx, toolDef.String(), subTool, loader.Options{Cache: g.Cache, DefaultModel: defaultModel})
39+
prg, err := programLoader(ctx, toolDef.String(), subTool, loader.Options{
40+
Cache: g.Cache,
41+
DefaultModel: defaultModel,
42+
MCPLoader: s.mcpLoader,
43+
})
4044
if err != nil {
4145
writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err))
4246
return

pkg/sdkserver/server.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
"github.com/google/uuid"
1717
"github.com/gptscript-ai/broadcaster"
1818
"github.com/gptscript-ai/gptscript/pkg/gptscript"
19+
"github.com/gptscript-ai/gptscript/pkg/loader"
20+
"github.com/gptscript-ai/gptscript/pkg/mcp"
1921
"github.com/gptscript-ai/gptscript/pkg/mvl"
2022
"github.com/gptscript-ai/gptscript/pkg/repos/runtimes"
2123
"github.com/gptscript-ai/gptscript/pkg/runner"
@@ -26,6 +28,7 @@ import (
2628
type Options struct {
2729
gptscript.Options
2830

31+
MCPLoader loader.MCPLoader
2932
ListenAddress string
3033
DatasetTool, WorkspaceTool string
3134
ServerToolsEnv []string
@@ -114,6 +117,7 @@ func run(ctx context.Context, listener net.Listener, opts Options) error {
114117
serverToolsEnv: opts.ServerToolsEnv,
115118

116119
client: g,
120+
mcpLoader: opts.MCPLoader,
117121
events: events,
118122
runtimeManager: runtimes.Default(opts.Cache.CacheDir, opts.SystemToolsDir),
119123
waitingToConfirm: make(map[string]chan runner.AuthorizerResponse),
@@ -168,6 +172,7 @@ func complete(opts ...Options) Options {
168172
result.WorkspaceTool = types.FirstSet(opt.WorkspaceTool, result.WorkspaceTool)
169173
result.Debug = types.FirstSet(opt.Debug, result.Debug)
170174
result.DisableServerErrorLogging = types.FirstSet(opt.DisableServerErrorLogging, result.DisableServerErrorLogging)
175+
result.MCPLoader = types.FirstSet(opt.MCPLoader, result.MCPLoader)
171176
}
172177

173178
if result.ListenAddress == "" {
@@ -183,6 +188,9 @@ func complete(opts ...Options) Options {
183188
if len(result.ServerToolsEnv) == 0 {
184189
result.ServerToolsEnv = os.Environ()
185190
}
191+
if result.MCPLoader == nil {
192+
result.MCPLoader = mcp.DefaultLoader
193+
}
186194

187195
return result
188196
}

pkg/tests/runner2_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ name: mcp
308308
],
309309
"type": "object"
310310
},
311-
"instructions": "#!sys.mcp.invoke.append_insight e057d98f5d43e56fda04eb3e7ea6120c93b5bcaf832090fca76e8d744e2de494",
311+
"instructions": "#!sys.mcp.invoke.append_insight 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
312312
"id": "inline:append_insight",
313313
"localTools": {
314314
"append_insight": "inline:append_insight",
@@ -341,7 +341,7 @@ name: mcp
341341
],
342342
"type": "object"
343343
},
344-
"instructions": "#!sys.mcp.invoke.create_table e057d98f5d43e56fda04eb3e7ea6120c93b5bcaf832090fca76e8d744e2de494",
344+
"instructions": "#!sys.mcp.invoke.create_table 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
345345
"id": "inline:create_table",
346346
"localTools": {
347347
"append_insight": "inline:append_insight",
@@ -374,7 +374,7 @@ name: mcp
374374
],
375375
"type": "object"
376376
},
377-
"instructions": "#!sys.mcp.invoke.describe_table e057d98f5d43e56fda04eb3e7ea6120c93b5bcaf832090fca76e8d744e2de494",
377+
"instructions": "#!sys.mcp.invoke.describe_table 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
378378
"id": "inline:describe_table",
379379
"localTools": {
380380
"append_insight": "inline:append_insight",
@@ -398,7 +398,7 @@ name: mcp
398398
"arguments": {
399399
"type": "object"
400400
},
401-
"instructions": "#!sys.mcp.invoke.list_tables e057d98f5d43e56fda04eb3e7ea6120c93b5bcaf832090fca76e8d744e2de494",
401+
"instructions": "#!sys.mcp.invoke.list_tables 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
402402
"id": "inline:list_tables",
403403
"localTools": {
404404
"append_insight": "inline:append_insight",
@@ -500,7 +500,7 @@ name: mcp
500500
],
501501
"type": "object"
502502
},
503-
"instructions": "#!sys.mcp.invoke.read_query e057d98f5d43e56fda04eb3e7ea6120c93b5bcaf832090fca76e8d744e2de494",
503+
"instructions": "#!sys.mcp.invoke.read_query 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
504504
"id": "inline:read_query",
505505
"localTools": {
506506
"append_insight": "inline:append_insight",
@@ -533,7 +533,7 @@ name: mcp
533533
],
534534
"type": "object"
535535
},
536-
"instructions": "#!sys.mcp.invoke.write_query e057d98f5d43e56fda04eb3e7ea6120c93b5bcaf832090fca76e8d744e2de494",
536+
"instructions": "#!sys.mcp.invoke.write_query 607ca64476abf0288ef49061557243e43735fd4de4bc5fdcd51d93049ffa023e",
537537
"id": "inline:write_query",
538538
"localTools": {
539539
"append_insight": "inline:append_insight",

0 commit comments

Comments
 (0)