@@ -273,8 +273,9 @@ func handleCoderListTemplates(deps ToolDeps) mcpserver.ToolHandlerFunc {
273
273
}
274
274
275
275
// Example payload:
276
- // {"jsonrpc":"2.0","id":1,"method":"tools/call", "params": {"name": "coder_start_workspace", "arguments": {"workspace": "dev"}}}
277
- func handleCoderStartWorkspace (deps ToolDeps ) mcpserver.ToolHandlerFunc {
276
+ // {"jsonrpc":"2.0","id":1,"method":"tools/call", "params": {"name":
277
+ // "coder_workspace_transition", "arguments": {"workspace": "dev", "transition": "stop"}}}
278
+ func handleCoderWorkspaceTransition (deps ToolDeps ) mcpserver.ToolHandlerFunc {
278
279
return func (ctx context.Context , request mcp.CallToolRequest ) (* mcp.CallToolResult , error ) {
279
280
if deps .Client == nil {
280
281
return nil , xerrors .New ("developer error: client is required" )
@@ -292,59 +293,22 @@ func handleCoderStartWorkspace(deps ToolDeps) mcpserver.ToolHandlerFunc {
292
293
return nil , xerrors .Errorf ("failed to fetch workspace: %w" , err )
293
294
}
294
295
295
- switch workspace .LatestBuild .Status {
296
- case codersdk .WorkspaceStatusPending , codersdk .WorkspaceStatusStarting , codersdk .WorkspaceStatusRunning , codersdk .WorkspaceStatusCanceling :
297
- return nil , xerrors .Errorf ("workspace is %s" , workspace .LatestBuild .Status )
298
- }
299
-
300
- wb , err := deps .Client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
301
- Transition : codersdk .WorkspaceTransitionStart ,
302
- })
303
- if err != nil {
304
- return nil , xerrors .Errorf ("failed to start workspace: %w" , err )
305
- }
306
-
307
- resp := map [string ]any {"status" : wb .Status , "transition" : wb .Transition }
308
- respJSON , err := json .Marshal (resp )
309
- if err != nil {
310
- return nil , xerrors .Errorf ("failed to encode workspace build: %w" , err )
311
- }
312
-
313
- return & mcp.CallToolResult {
314
- Content : []mcp.Content {
315
- mcp .NewTextContent (string (respJSON )),
316
- },
317
- }, nil
318
- }
319
- }
320
-
321
- // Example payload:
322
- // {"jsonrpc":"2.0","id":1,"method":"tools/call", "params": {"name": "coder_stop_workspace", "arguments": {"workspace": "dev"}}}
323
- func handleCoderStopWorkspace (deps ToolDeps ) mcpserver.ToolHandlerFunc {
324
- return func (ctx context.Context , request mcp.CallToolRequest ) (* mcp.CallToolResult , error ) {
325
- if deps .Client == nil {
326
- return nil , xerrors .New ("developer error: client is required" )
327
- }
328
-
329
- args := request .Params .Arguments
330
-
331
- wsArg , ok := args ["workspace" ].(string )
296
+ transition , ok := args ["transition" ].(string )
332
297
if ! ok {
333
- return nil , xerrors .New ("workspace is required" )
298
+ return nil , xerrors .New ("transition is required" )
334
299
}
335
-
336
- workspace , err := getWorkspaceByIDOrOwnerName (ctx , deps .Client , wsArg )
337
- if err != nil {
338
- return nil , xerrors .Errorf ("failed to fetch workspace: %w" , err )
339
- }
340
-
341
- switch workspace .LatestBuild .Status {
342
- case codersdk .WorkspaceStatusPending , codersdk .WorkspaceStatusStopping , codersdk .WorkspaceStatusStopped , codersdk .WorkspaceStatusCanceling :
343
- return nil , xerrors .Errorf ("workspace is %s" , workspace .LatestBuild .Status )
300
+ wsTransition := codersdk .WorkspaceTransition (transition )
301
+ switch wsTransition {
302
+ case codersdk .WorkspaceTransitionStart :
303
+ case codersdk .WorkspaceTransitionStop :
304
+ default :
305
+ return nil , xerrors .New ("invalid transition" )
344
306
}
345
307
308
+ // We're not going to check the workspace status here as it is checked on the
309
+ // server side.
346
310
wb , err := deps .Client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
347
- Transition : codersdk . WorkspaceTransitionStop ,
311
+ Transition : wsTransition ,
348
312
})
349
313
if err != nil {
350
314
return nil , xerrors .Errorf ("failed to stop workspace: %w" , err )
0 commit comments