Skip to content

Commit d24d498

Browse files
committed
Merge branch 'main' of github.com:mark3labs/mcphost
2 parents bf2f441 + 191dcea commit d24d498

File tree

15 files changed

+28640
-9098
lines changed

15 files changed

+28640
-9098
lines changed

cmd/root.go

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ var (
3838
streamFlag bool // Enable streaming output
3939
compactMode bool // Enable compact output mode
4040
scriptMCPConfig *config.Config // Used to override config in script mode
41+
approveToolRun bool
4142

4243
// Session management
4344
saveSessionPath string
@@ -302,6 +303,8 @@ func init() {
302303
BoolVar(&compactMode, "compact", false, "enable compact output mode without fancy styling")
303304
rootCmd.PersistentFlags().
304305
BoolVar(&noHooks, "no-hooks", false, "disable all hooks execution")
306+
rootCmd.PersistentFlags().
307+
BoolVar(&approveToolRun, "approve-tool-run", false, "enable requiring user approval for every tool call")
305308

306309
// Session management flags
307310
rootCmd.PersistentFlags().
@@ -347,6 +350,7 @@ func init() {
347350
viper.BindPFlag("num-gpu-layers", rootCmd.PersistentFlags().Lookup("num-gpu-layers"))
348351
viper.BindPFlag("main-gpu", rootCmd.PersistentFlags().Lookup("main-gpu"))
349352
viper.BindPFlag("tls-skip-verify", rootCmd.PersistentFlags().Lookup("tls-skip-verify"))
353+
viper.BindPFlag("approve-tool-run", rootCmd.PersistentFlags().Lookup("approve-tool-run"))
350354

351355
// Defaults are already set in flag definitions, no need to duplicate in viper
352356

@@ -445,7 +449,8 @@ func runNormalMode(ctx context.Context) error {
445449
debugLogger = bufferedLogger
446450
}
447451

448-
mcpAgent, err := agent.CreateAgent(ctx, &agent.AgentCreationOptions{ModelConfig: modelConfig,
452+
mcpAgent, err := agent.CreateAgent(ctx, &agent.AgentCreationOptions{
453+
ModelConfig: modelConfig,
449454
MCPConfig: mcpConfig,
450455
SystemPrompt: systemPrompt,
451456
MaxSteps: viper.GetInt("max-steps"),
@@ -743,7 +748,8 @@ func runNormalMode(ctx context.Context) error {
743748
return fmt.Errorf("--quiet flag can only be used with --prompt/-p")
744749
}
745750

746-
return runInteractiveMode(ctx, mcpAgent, cli, serverNames, toolNames, modelName, messages, sessionManager, hookExecutor)
751+
approveToolRun := viper.GetBool("approve-tool-run")
752+
return runInteractiveMode(ctx, mcpAgent, cli, serverNames, toolNames, modelName, messages, sessionManager, hookExecutor, approveToolRun)
747753
}
748754

749755
// AgenticLoopConfig configures the behavior of the unified agentic loop.
@@ -754,6 +760,7 @@ type AgenticLoopConfig struct {
754760
IsInteractive bool // true for interactive mode, false for non-interactive
755761
InitialPrompt string // initial prompt for non-interactive mode
756762
ContinueAfterRun bool // true to continue to interactive mode after initial run (--no-exit)
763+
ApproveToolRun bool // only used in interactive mode
757764

758765
// UI configuration
759766
Quiet bool // suppress all output except final response
@@ -1103,7 +1110,27 @@ func runAgenticStep(ctx context.Context, mcpAgent *agent.Agent, cli *ui.CLI, mes
11031110
currentSpinner.Start()
11041111
}
11051112
},
1106-
streamingCallback, // Add streaming callback as the last parameter
1113+
// Add streaming callback handler
1114+
streamingCallback,
1115+
// Tool call approval handler - called before tool execution to get user approval
1116+
func(toolName, toolArgs string) (bool, error) {
1117+
if !config.IsInteractive || !config.ApproveToolRun {
1118+
return true, nil
1119+
}
1120+
if currentSpinner != nil {
1121+
currentSpinner.Stop()
1122+
currentSpinner = nil
1123+
}
1124+
allow, err := cli.GetToolApproval(toolName, toolArgs)
1125+
if err != nil {
1126+
return false, err
1127+
}
1128+
// Start spinner again for tool calls
1129+
currentSpinner = ui.NewSpinner("Thinking...")
1130+
currentSpinner.Start()
1131+
1132+
return allow, nil
1133+
},
11071134
)
11081135

11091136
// Make sure spinner is stopped if still running
@@ -1306,6 +1333,7 @@ func runNonInteractiveMode(ctx context.Context, mcpAgent *agent.Agent, cli *ui.C
13061333
IsInteractive: false,
13071334
InitialPrompt: prompt,
13081335
ContinueAfterRun: noExit,
1336+
ApproveToolRun: false,
13091337
Quiet: quiet,
13101338
ServerNames: serverNames,
13111339
ToolNames: toolNames,
@@ -1318,12 +1346,13 @@ func runNonInteractiveMode(ctx context.Context, mcpAgent *agent.Agent, cli *ui.C
13181346
}
13191347

13201348
// runInteractiveMode handles the interactive mode execution
1321-
func runInteractiveMode(ctx context.Context, mcpAgent *agent.Agent, cli *ui.CLI, serverNames, toolNames []string, modelName string, messages []*schema.Message, sessionManager *session.Manager, hookExecutor *hooks.Executor) error {
1349+
func runInteractiveMode(ctx context.Context, mcpAgent *agent.Agent, cli *ui.CLI, serverNames, toolNames []string, modelName string, messages []*schema.Message, sessionManager *session.Manager, hookExecutor *hooks.Executor, approveToolRun bool) error {
13221350
// Configure and run unified agentic loop
13231351
config := AgenticLoopConfig{
13241352
IsInteractive: true,
13251353
InitialPrompt: "",
13261354
ContinueAfterRun: false,
1355+
ApproveToolRun: approveToolRun,
13271356
Quiet: false,
13281357
ServerNames: serverNames,
13291358
ToolNames: toolNames,

go.mod

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,29 @@ toolchain go1.24.5
77
require (
88
github.com/JohannesKaufmann/html-to-markdown v1.6.0
99
github.com/PuerkitoBio/goquery v1.10.3
10-
github.com/bytedance/sonic v1.14.1
10+
github.com/bytedance/sonic v1.15.0
1111
github.com/charmbracelet/fang v0.4.0
1212
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834
13-
github.com/cloudwego/eino v0.5.0-alpha.11
14-
github.com/cloudwego/eino-ext/components/model/claude v0.1.0
15-
github.com/cloudwego/eino-ext/components/model/ollama v0.1.2
13+
github.com/cloudwego/eino v0.7.13
14+
github.com/cloudwego/eino-ext/components/model/claude v0.1.12
15+
github.com/cloudwego/eino-ext/components/model/ollama v0.1.8
1616
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250903035842-96774a3ec845
17-
github.com/getkin/kin-openapi v0.120.0
17+
github.com/eino-contrib/jsonschema v1.0.3
18+
github.com/getkin/kin-openapi v0.131.0
1819
github.com/mark3labs/mcp-filesystem-server v0.11.1
19-
github.com/mark3labs/mcp-go v0.43.0
20-
github.com/ollama/ollama v0.11.8
20+
github.com/mark3labs/mcp-go v0.44.0-beta.2
2121
github.com/spf13/cobra v1.10.1
2222
github.com/spf13/viper v1.20.1
2323
github.com/tidwall/gjson v1.18.0
24-
golang.org/x/term v0.34.0
24+
golang.org/x/term v0.37.0
2525
google.golang.org/genai v1.22.0
2626
gopkg.in/yaml.v3 v3.0.1
2727
)
2828

2929
require (
3030
cloud.google.com/go v0.121.6 // indirect
3131
cloud.google.com/go/auth v0.16.5 // indirect
32+
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
3233
cloud.google.com/go/compute/metadata v0.8.0 // indirect
3334
github.com/alecthomas/chroma/v2 v2.20.0 // indirect
3435
github.com/andybalholm/cascadia v1.3.3 // indirect
@@ -52,7 +53,7 @@ require (
5253
github.com/bahlo/generic-list-go v0.2.0 // indirect
5354
github.com/buger/jsonparser v1.1.1 // indirect
5455
github.com/bytedance/gopkg v0.1.3 // indirect
55-
github.com/bytedance/sonic/loader v0.3.0 // indirect
56+
github.com/bytedance/sonic/loader v0.5.0 // indirect
5657
github.com/charmbracelet/colorprofile v0.3.2 // indirect
5758
github.com/charmbracelet/harmonica v0.2.0 // indirect
5859
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 // indirect
@@ -65,7 +66,7 @@ require (
6566
github.com/djherbis/times v1.6.0 // indirect
6667
github.com/dlclark/regexp2 v1.11.5 // indirect
6768
github.com/dustin/go-humanize v1.0.1 // indirect
68-
github.com/eino-contrib/jsonschema v1.0.0 // indirect
69+
github.com/eino-contrib/ollama v0.1.0 // indirect
6970
github.com/evanphx/json-patch v0.5.2 // indirect
7071
github.com/felixge/httpsnoop v1.0.4 // indirect
7172
github.com/fsnotify/fsnotify v1.9.0 // indirect
@@ -85,7 +86,6 @@ require (
8586
github.com/gorilla/css v1.0.1 // indirect
8687
github.com/gorilla/websocket v1.5.3 // indirect
8788
github.com/invopop/jsonschema v0.13.0 // indirect
88-
github.com/invopop/yaml v0.2.0 // indirect
8989
github.com/josharian/intern v1.0.0 // indirect
9090
github.com/json-iterator/go v1.1.12 // indirect
9191
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
@@ -101,6 +101,8 @@ require (
101101
github.com/muesli/reflow v0.3.0 // indirect
102102
github.com/muesli/roff v0.1.0 // indirect
103103
github.com/nikolalohinski/gonja v1.5.3 // indirect
104+
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
105+
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
104106
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
105107
github.com/perimeterx/marshmallow v1.1.5 // indirect
106108
github.com/pkg/errors v0.9.1 // indirect
@@ -122,13 +124,17 @@ require (
122124
github.com/yuin/goldmark v1.7.13 // indirect
123125
github.com/yuin/goldmark-emoji v1.0.6 // indirect
124126
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
127+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
125128
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect
126129
go.opentelemetry.io/otel v1.38.0 // indirect
127130
go.opentelemetry.io/otel/metric v1.38.0 // indirect
128131
go.opentelemetry.io/otel/trace v1.38.0 // indirect
129-
golang.org/x/arch v0.20.0 // indirect
130-
golang.org/x/crypto v0.41.0 // indirect
131-
golang.org/x/net v0.43.0 // indirect
132+
golang.org/x/arch v0.23.0 // indirect
133+
golang.org/x/crypto v0.45.0 // indirect
134+
golang.org/x/net v0.47.0 // indirect
135+
golang.org/x/oauth2 v0.30.0 // indirect
136+
golang.org/x/time v0.12.0 // indirect
137+
google.golang.org/api v0.246.0 // indirect
132138
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect
133139
google.golang.org/grpc v1.75.0 // indirect
134140
google.golang.org/protobuf v1.36.8 // indirect
@@ -137,7 +143,7 @@ require (
137143
require (
138144
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
139145
github.com/charmbracelet/bubbles v0.21.0
140-
github.com/charmbracelet/bubbletea v1.3.6
146+
github.com/charmbracelet/bubbletea v1.3.10
141147
github.com/charmbracelet/glamour v0.10.0
142148
github.com/charmbracelet/x/ansi v0.10.1 // indirect
143149
github.com/charmbracelet/x/term v0.2.1 // indirect
@@ -153,7 +159,7 @@ require (
153159
github.com/rivo/uniseg v0.4.7 // indirect
154160
github.com/spf13/pflag v1.0.10 // indirect
155161
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect
156-
golang.org/x/sync v0.16.0 // indirect
157-
golang.org/x/sys v0.35.0 // indirect
158-
golang.org/x/text v0.28.0 // indirect
162+
golang.org/x/sync v0.18.0 // indirect
163+
golang.org/x/sys v0.40.0 // indirect
164+
golang.org/x/text v0.31.0 // indirect
159165
)

0 commit comments

Comments
 (0)