diff --git a/pkg/server/api/mcp/v1/schema.resolvers.go b/pkg/server/api/mcp/v1/schema.resolvers.go index 9555a0ed6..bff6a572f 100644 --- a/pkg/server/api/mcp/v1/schema.resolvers.go +++ b/pkg/server/api/mcp/v1/schema.resolvers.go @@ -1448,6 +1448,21 @@ func (r *Resolver) UnassignTaskTool(ctx context.Context, req *mcp.CallToolReques }, nil } +func (r *Resolver) DeleteTaskTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteTaskInput) (*mcp.CallToolResult, types.DeleteTaskOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionTaskDelete) + + svc := r.ProboService(ctx, input.ID) + + err := svc.Tasks.Delete(ctx, input.ID) + if err != nil { + return nil, types.DeleteTaskOutput{}, fmt.Errorf("failed to delete task: %w", err) + } + + return nil, types.DeleteTaskOutput{ + DeletedTaskID: input.ID, + }, nil +} + func (r *Resolver) ListSnapshotsTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListSnapshotsInput) (*mcp.CallToolResult, types.ListSnapshotsOutput, error) { r.MustAuthorize(ctx, input.OrganizationID, probo.ActionSnapshotList) diff --git a/pkg/server/api/mcp/v1/server/server.go b/pkg/server/api/mcp/v1/server/server.go index babbfedc1..24c2c0abb 100644 --- a/pkg/server/api/mcp/v1/server/server.go +++ b/pkg/server/api/mcp/v1/server/server.go @@ -72,6 +72,7 @@ type ResolverInterface interface { UpdateTaskTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateTaskInput) (*mcp.CallToolResult, types.UpdateTaskOutput, error) AssignTaskTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AssignTaskInput) (*mcp.CallToolResult, types.AssignTaskOutput, error) UnassignTaskTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnassignTaskInput) (*mcp.CallToolResult, types.UnassignTaskOutput, error) + DeleteTaskTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteTaskInput) (*mcp.CallToolResult, types.DeleteTaskOutput, error) ListSnapshotsTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListSnapshotsInput) (*mcp.CallToolResult, types.ListSnapshotsOutput, error) GetSnapshotTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetSnapshotInput) (*mcp.CallToolResult, types.GetSnapshotOutput, error) TakeSnapshotTool(ctx context.Context, req *mcp.CallToolRequest, input *types.TakeSnapshotInput) (*mcp.CallToolResult, types.TakeSnapshotOutput, error) @@ -842,6 +843,19 @@ func registerToolHandlers(server *mcp.Server, resolver ResolverInterface) { }, resolver.UnassignTaskTool, ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "deleteTask", + Description: "Delete a task", + InputSchema: types.DeleteTaskToolInputSchema, + OutputSchema: types.DeleteTaskToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + DestructiveHint: boolPtr(true), + }, + }, + resolver.DeleteTaskTool, + ) mcp.AddTool( server, &mcp.Tool{ diff --git a/pkg/server/api/mcp/v1/specification.yaml b/pkg/server/api/mcp/v1/specification.yaml index 3e67ce127..994cbc6fe 100644 --- a/pkg/server/api/mcp/v1/specification.yaml +++ b/pkg/server/api/mcp/v1/specification.yaml @@ -3386,6 +3386,24 @@ components: task: $ref: "#/components/schemas/Task" + DeleteTaskInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: Task ID + + DeleteTaskOutput: + type: object + required: + - deleted_task_id + properties: + deleted_task_id: + $ref: "#/components/schemas/GID" + description: Deleted task ID + SnapshotsType: type: string enum: @@ -4898,6 +4916,15 @@ tools: $ref: "#/components/schemas/UnassignTaskInput" outputSchema: $ref: "#/components/schemas/UnassignTaskOutput" + - name: deleteTask + description: Delete a task + hints: + readonly: false + destructive: true + inputSchema: + $ref: "#/components/schemas/DeleteTaskInput" + outputSchema: + $ref: "#/components/schemas/DeleteTaskOutput" - name: listSnapshots description: List all snapshots for the organization hints: diff --git a/pkg/server/api/mcp/v1/types/types.go b/pkg/server/api/mcp/v1/types/types.go index 8cfaf5b24..4fcb3158c 100644 --- a/pkg/server/api/mcp/v1/types/types.go +++ b/pkg/server/api/mcp/v1/types/types.go @@ -54,6 +54,8 @@ var ( DeleteDraftDocumentVersionToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"document_version_id":{"type":"string","format":"string"}},"required":["document_version_id"]}`) DeleteDraftDocumentVersionToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_document_version_id":{"type":"string","format":"string"}},"required":["deleted_document_version_id"]}`) DeleteMeetingToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) + DeleteTaskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) + DeleteTaskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_task_id":{"type":"string","format":"string"}},"required":["deleted_task_id"]}`) DeleteMeetingToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_meeting_id":{"type":"string","format":"string"}},"required":["deleted_meeting_id"]}`) DeleteRiskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) DeleteRiskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_risk_id":{"type":"string","format":"string"}},"required":["deleted_risk_id"]}`) @@ -2169,6 +2171,18 @@ type UnassignTaskOutput struct { Task *Task `json:"task"` } +// DeleteTaskInput represents the schema +type DeleteTaskInput struct { + // Task ID + ID gid.GID `json:"id"` +} + +// DeleteTaskOutput represents the schema +type DeleteTaskOutput struct { + // Deleted task ID + DeletedTaskID gid.GID `json:"deleted_task_id"` +} + // UnlinkControlAuditInput represents the schema type UnlinkControlAuditInput struct { // Audit ID