4
4
"context"
5
5
"encoding/json"
6
6
"errors"
7
+ "log"
7
8
"os"
8
9
"path/filepath"
9
10
@@ -41,7 +42,7 @@ func (r *RootCmd) mcpConfigure() *serpent.Command {
41
42
return cmd
42
43
}
43
44
44
- func (r * RootCmd )mcpConfigureClaudeDesktop ()* serpent.Command {
45
+ func (* RootCmd )mcpConfigureClaudeDesktop ()* serpent.Command {
45
46
cmd := & serpent.Command {
46
47
Use :"claude-desktop" ,
47
48
Short :"Configure the Claude Desktop server." ,
@@ -51,7 +52,7 @@ func (r *RootCmd) mcpConfigureClaudeDesktop() *serpent.Command {
51
52
return err
52
53
}
53
54
configPath = filepath .Join (configPath ,"Claude" )
54
- err = os .MkdirAll (configPath ,0755 )
55
+ err = os .MkdirAll (configPath ,0o755 )
55
56
if err != nil {
56
57
return err
57
58
}
@@ -85,7 +86,7 @@ func (r *RootCmd) mcpConfigureClaudeDesktop() *serpent.Command {
85
86
if err != nil {
86
87
return err
87
88
}
88
- err = os .WriteFile (configPath ,data ,0600 )
89
+ err = os .WriteFile (configPath ,data ,0o600 )
89
90
if err != nil {
90
91
return err
91
92
}
@@ -95,7 +96,7 @@ func (r *RootCmd) mcpConfigureClaudeDesktop() *serpent.Command {
95
96
return cmd
96
97
}
97
98
98
- func (_ * RootCmd )mcpConfigureClaudeCode ()* serpent.Command {
99
+ func (* RootCmd )mcpConfigureClaudeCode ()* serpent.Command {
99
100
cmd := & serpent.Command {
100
101
Use :"claude-code" ,
101
102
Short :"Configure the Claude Code server." ,
@@ -106,7 +107,7 @@ func (_ *RootCmd) mcpConfigureClaudeCode() *serpent.Command {
106
107
return cmd
107
108
}
108
109
109
- func (_ * RootCmd )mcpConfigureCursor ()* serpent.Command {
110
+ func (* RootCmd )mcpConfigureCursor ()* serpent.Command {
110
111
var project bool
111
112
cmd := & serpent.Command {
112
113
Use :"cursor" ,
@@ -131,7 +132,7 @@ func (_ *RootCmd) mcpConfigureCursor() *serpent.Command {
131
132
}
132
133
}
133
134
cursorDir := filepath .Join (dir ,".cursor" )
134
- err = os .MkdirAll (cursorDir ,0755 )
135
+ err = os .MkdirAll (cursorDir ,0o755 )
135
136
if err != nil {
136
137
return err
137
138
}
@@ -172,7 +173,7 @@ func (_ *RootCmd) mcpConfigureCursor() *serpent.Command {
172
173
if err != nil {
173
174
return err
174
175
}
175
- err = os .WriteFile (mcpConfig ,data ,0600 )
176
+ err = os .WriteFile (mcpConfig ,data ,0o600 )
176
177
if err != nil {
177
178
return err
178
179
}
@@ -249,23 +250,29 @@ func mcpServerHandler(inv *serpent.Invocation, client *codersdk.Client, instruct
249
250
options := []codermcp.Option {
250
251
codermcp .WithInstructions (instructions ),
251
252
codermcp .WithLogger (& logger ),
252
- codermcp .WithStdin (invStdin ),
253
- codermcp .WithStdout (invStdout ),
254
253
}
255
254
256
255
// Add allowed tools option if specified
257
256
if len (allowedTools )> 0 {
258
257
options = append (options ,codermcp .WithAllowedTools (allowedTools ))
259
258
}
260
259
261
- closer := codermcp .New (ctx ,client ,options ... )
260
+ srv := codermcp .NewStdio (client ,options ... )
261
+ srv .SetErrorLogger (log .New (invStderr ,"" ,log .LstdFlags ))
262
262
263
- <- ctx .Done ()
264
- if err := closer .Close ();err != nil {
263
+ done := make (chan error )
264
+ go func () {
265
+ defer close (done )
266
+ srvErr := srv .Listen (ctx ,invStdin ,invStdout )
267
+ done <- srvErr
268
+ }()
269
+
270
+ if err := <- done ;err != nil {
265
271
if ! errors .Is (err ,context .Canceled ) {
266
- cliui .Errorf (inv .Stderr ,"Failed tostop the MCP server: %s" ,err )
272
+ cliui .Errorf (inv .Stderr ,"Failed tostart the MCP server: %s" ,err )
267
273
return err
268
274
}
269
275
}
276
+
270
277
return nil
271
278
}