From 99f07d9209086ed97e4fba678579555edf84eefc Mon Sep 17 00:00:00 2001 From: anonymouse07 Date: Mon, 16 Mar 2026 21:45:44 -0500 Subject: [PATCH] feat: add trigger_deploy MCP tool (closes #11) --- pkg/deploy/repo.go | 23 +++++++++++++++++++++++ pkg/deploy/tools.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/pkg/deploy/repo.go b/pkg/deploy/repo.go index dff6aa9..448c508 100644 --- a/pkg/deploy/repo.go +++ b/pkg/deploy/repo.go @@ -50,3 +50,26 @@ func (r *Repo) GetDeploy(ctx context.Context, serviceId string, deployId string) return resp.JSON200, nil } +func (r *Repo) TriggerDeploy(ctx context.Context, serviceId string, clearCache bool) (*client.Deploy, error) { + var clearCacheVal *client.CreateDeployJSONBodyClearCache + if clearCache { + v := client.Clear + clearCacheVal = &v + } else { + v := client.DoNotClear + clearCacheVal = &v + } + + body := client.CreateDeployJSONRequestBody{ + ClearCache: clearCacheVal, + } + + resp, err := r.client.CreateDeployWithResponse(ctx, client.ServiceIdParam(serviceId), body) + if err != nil { + return nil, err + } + if err := client.ErrorFromResponse(resp); err != nil { + return nil, err + } + return resp.JSON201, nil +} \ No newline at end of file diff --git a/pkg/deploy/tools.go b/pkg/deploy/tools.go index cb8f976..d0dca8b 100644 --- a/pkg/deploy/tools.go +++ b/pkg/deploy/tools.go @@ -17,6 +17,7 @@ func Tools(c *client.ClientWithResponses) []server.ServerTool { return []server.ServerTool{ listDeploys(deployRepo), getDeploy(deployRepo), + triggerDeploy(deployRepo), } } @@ -134,3 +135,47 @@ func getDeploy(deployRepo *Repo) server.ServerTool { }, } } +func triggerDeploy(deployRepo *Repo) server.ServerTool { + return server.ServerTool{ + Tool: mcp.NewTool("trigger_deploy", + mcp.WithDescription("Trigger a new deploy for a service. Use this to redeploy a service after making changes."), + mcp.WithToolAnnotation(mcp.ToolAnnotation{ + Title: "Trigger deploy", + ReadOnlyHint: pointers.From(false), + IdempotentHint: pointers.From(false), + OpenWorldHint: pointers.From(true), + }), + mcp.WithString("serviceId", + mcp.Required(), + mcp.Description("The ID of the service to trigger a deploy for"), + ), + mcp.WithBoolean("clearCache", + mcp.Description("Whether to clear the build cache before deploying. Defaults to false."), + mcp.DefaultBool(false), + ), + ), + Handler: func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + serviceId, err := validate.RequiredToolParam[string](request, "serviceId") + if err != nil { + return mcp.NewToolResultError(err.Error()), nil + } + + clearCache, _, err := validate.OptionalToolParam[bool](request, "clearCache") + if err != nil { + return mcp.NewToolResultError(err.Error()), nil + } + + deploy, err := deployRepo.TriggerDeploy(ctx, serviceId, clearCache) + if err != nil { + return mcp.NewToolResultError(err.Error()), nil + } + + respJSON, err := json.Marshal(deploy) + if err != nil { + return mcp.NewToolResultError(err.Error()), nil + } + + return mcp.NewToolResultText(string(respJSON)), nil + }, + } +}