on main help sign in
fix: fix mcp clients
commit428d71a162480cac31d12db1e0ea54b3e8b5fd59 authorKujtim Hoxha <kujtimii.h@gmail.com> dateFri 1 Aug 2025, 08:26 (1 year ago) parent5b79510
3 files changed+14−43
internal/app/app.go+1 internal/llm/agent/agent.go+3−2 internal/llm/agent/mcp-tools.go+10−41
internal/app/app.go+1
@@ -256,6 +256,7 @@ func (app *App) InitCoderAgent() error {
256256 }
257257 var err error
258258 app.CoderAgent, err = agent.NewAgent(
259+ app.globalCtx,
259260 coderAgentCfg,
260261 app.Permissions,
261262 app.Sessions,
internal/llm/agent/agent.go+3−2
@@ -67,6 +67,7 @@ type agent struct {
6767 agentCfg config.Agent
6868 sessions session.Service
6969 messages message.Service
70+ mcpTools []McpTool
7071
7172 tools *csync.LazySlice[tools.BaseTool]
7273
@@ -86,6 +87,7 @@ var agentPromptMap = map[string]prompt.PromptID{
8687}
8788
8889func NewAgent(
90+ ctx context.Context,
8991 agentCfg config.Agent,
9092 // These services are needed in the tools
9193 permissions permission.Service,
@@ -94,7 +96,6 @@ func NewAgent(
9496 history history.Service,
9597 lspClients map[string]*lsp.Client,
9698) (Service, error) {
97− ctx := context.Background()
9899 cfg := config.Get()
99100
100101 var agentTool tools.BaseTool
@@ -103,7 +104,7 @@ func NewAgent(
103104 if taskAgentCfg.ID == "" {
104105 return nil, fmt.Errorf("task agent not found in config")
105106 }
106− taskAgent, err := NewAgent(taskAgentCfg, permissions, sessions, messages, history, lspClients)
107+ taskAgent, err := NewAgent(ctx, taskAgentCfg, permissions, sessions, messages, history, lspClients)
107108 if err != nil {
108109 return nil, fmt.Errorf("failed to create task agent: %w", err)
109110 }
internal/llm/agent/mcp-tools.go+10−41
@@ -20,9 +20,10 @@ import (
2020 "github.com/mark3labs/mcp-go/mcp"
2121)
2222
23−type mcpTool struct {
23+type McpTool struct {
2424 mcpName string
2525 tool mcp.Tool
26+ client MCPClient
2627 mcpConfig config.MCPConfig
2728 permissions permission.Service
2829 workingDir string
@@ -38,11 +39,11 @@ type MCPClient interface {
3839 Close() error
3940}
4041
41−func (b *mcpTool) Name() string {
42+func (b *McpTool) Name() string {
4243 return fmt.Sprintf("mcp_%s_%s", b.mcpName, b.tool.Name)
4344}
4445
45−func (b *mcpTool) Info() tools.ToolInfo {
46+func (b *McpTool) Info() tools.ToolInfo {
4647 required := b.tool.InputSchema.Required
4748 if required == nil {
4849 required = make([]string, 0)
@@ -56,7 +57,6 @@ func (b *mcpTool) Info() tools.ToolInfo {
5657}
5758
5859func runTool(ctx context.Context, c MCPClient, toolName string, input string) (tools.ToolResponse, error) {
59− defer c.Close()
6060 initRequest := mcp.InitializeRequest{}
6161 initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
6262 initRequest.Params.ClientInfo = mcp.Implementation{
@@ -93,7 +93,7 @@ func runTool(ctx context.Context, c MCPClient, toolName string, input string) (t
9393 return tools.NewTextResponse(output), nil
9494}
9595
96−func (b *mcpTool) Run(ctx context.Context, params tools.ToolCall) (tools.ToolResponse, error) {
96+func (b *McpTool) Run(ctx context.Context, params tools.ToolCall) (tools.ToolResponse, error) {
9797 sessionID, messageID := tools.GetContextValues(ctx)
9898 if sessionID == "" || messageID == "" {
9999 return tools.ToolResponse{}, fmt.Errorf("session ID and message ID are required for creating a new file")
@@ -114,43 +114,13 @@ func (b *mcpTool) Run(ctx context.Context, params tools.ToolCall) (tools.ToolRes
114114 return tools.ToolResponse{}, permission.ErrorPermissionDenied
115115 }
116116
117− switch b.mcpConfig.Type {
118− case config.MCPStdio:
119− c, err := client.NewStdioMCPClient(
120− b.mcpConfig.Command,
121− b.mcpConfig.ResolvedEnv(),
122− b.mcpConfig.Args...,
123− )
124− if err != nil {
125− return tools.NewTextErrorResponse(err.Error()), nil
126− }
127− return runTool(ctx, c, b.tool.Name, params.Input)
128− case config.MCPHttp:
129− c, err := client.NewStreamableHttpClient(
130− b.mcpConfig.URL,
131− transport.WithHTTPHeaders(b.mcpConfig.ResolvedHeaders()),
132− )
133− if err != nil {
134− return tools.NewTextErrorResponse(err.Error()), nil
135− }
136− return runTool(ctx, c, b.tool.Name, params.Input)
137− case config.MCPSse:
138− c, err := client.NewSSEMCPClient(
139− b.mcpConfig.URL,
140− client.WithHeaders(b.mcpConfig.ResolvedHeaders()),
141− )
142− if err != nil {
143− return tools.NewTextErrorResponse(err.Error()), nil
144− }
145− return runTool(ctx, c, b.tool.Name, params.Input)
146− }
147−
148− return tools.NewTextErrorResponse("invalid mcp type"), nil
117+ return runTool(ctx, b.client, b.tool.Name, params.Input)
149118}
150119
151−func NewMcpTool(name string, tool mcp.Tool, permissions permission.Service, mcpConfig config.MCPConfig, workingDir string) tools.BaseTool {
152− return &mcpTool{
120+func NewMcpTool(name string, c MCPClient, tool mcp.Tool, permissions permission.Service, mcpConfig config.MCPConfig, workingDir string) tools.BaseTool {
121+ return &McpTool{
153122 mcpName: name,
123+ client: c,
154124 tool: tool,
155125 mcpConfig: mcpConfig,
156126 permissions: permissions,
@@ -179,9 +149,8 @@ func getTools(ctx context.Context, name string, m config.MCPConfig, permissions
179149 return stdioTools
180150 }
181151 for _, t := range tools.Tools {
182− stdioTools = append(stdioTools, NewMcpTool(name, t, permissions, m, workingDir))
152+ stdioTools = append(stdioTools, NewMcpTool(name, c, t, permissions, m, workingDir))
183153 }
184− defer c.Close()
185154 return stdioTools
186155}
187156