From 0d985b40cc22632185d091f7a891577d181b8dfe Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Mon, 24 Nov 2025 15:00:18 +0100 Subject: [PATCH] Add control mapping tools Signed-off-by: Bryan Frimin --- pkg/server/api/mcp/v1/schema.resolvers.go | 104 ++++++++++++ pkg/server/api/mcp/v1/server/server.go | 88 +++++++++++ pkg/server/api/mcp/v1/specification.yaml | 184 ++++++++++++++++++++++ pkg/server/api/mcp/v1/types/types.go | 112 +++++++++++++ 4 files changed, 488 insertions(+) diff --git a/pkg/server/api/mcp/v1/schema.resolvers.go b/pkg/server/api/mcp/v1/schema.resolvers.go index 15ce789ff..1533f3c62 100644 --- a/pkg/server/api/mcp/v1/schema.resolvers.go +++ b/pkg/server/api/mcp/v1/schema.resolvers.go @@ -1162,3 +1162,107 @@ func (r *Resolver) UpdateControlTool(ctx context.Context, req *mcp.CallToolReque Control: types.NewControl(control), }, nil } + +func (r *Resolver) LinkControlMeasureTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlMeasureInput) (*mcp.CallToolResult, types.LinkControlMeasureOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionCreateControlMeasureMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.CreateMeasureMapping(ctx, input.ControlID, input.MeasureID) + if err != nil { + return nil, types.LinkControlMeasureOutput{}, fmt.Errorf("failed to link control measure: %w", err) + } + + return nil, types.LinkControlMeasureOutput{}, nil +} + +func (r *Resolver) UnlinkControlMeasureTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlMeasureInput) (*mcp.CallToolResult, types.UnlinkControlMeasureOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionDeleteControlMeasureMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.DeleteMeasureMapping(ctx, input.ControlID, input.MeasureID) + if err != nil { + return nil, types.UnlinkControlMeasureOutput{}, fmt.Errorf("failed to unlink control measure: %w", err) + } + + return nil, types.UnlinkControlMeasureOutput{}, nil +} + +func (r *Resolver) LinkControlDocumentTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlDocumentInput) (*mcp.CallToolResult, types.LinkControlDocumentOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionCreateControlDocumentMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.CreateDocumentMapping(ctx, input.ControlID, input.DocumentID) + if err != nil { + return nil, types.LinkControlDocumentOutput{}, fmt.Errorf("failed to link control document: %w", err) + } + + return nil, types.LinkControlDocumentOutput{}, nil +} + +func (r *Resolver) UnlinkControlDocumentTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlDocumentInput) (*mcp.CallToolResult, types.UnlinkControlDocumentOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionDeleteControlDocumentMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.DeleteDocumentMapping(ctx, input.ControlID, input.DocumentID) + if err != nil { + return nil, types.UnlinkControlDocumentOutput{}, fmt.Errorf("failed to unlink control document: %w", err) + } + + return nil, types.UnlinkControlDocumentOutput{}, nil +} + +func (r *Resolver) LinkControlAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlAuditInput) (*mcp.CallToolResult, types.LinkControlAuditOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionCreateControlAuditMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.CreateAuditMapping(ctx, input.ControlID, input.AuditID) + if err != nil { + return nil, types.LinkControlAuditOutput{}, fmt.Errorf("failed to link control audit: %w", err) + } + + return nil, types.LinkControlAuditOutput{}, nil +} + +func (r *Resolver) UnlinkControlAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlAuditInput) (*mcp.CallToolResult, types.UnlinkControlAuditOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionDeleteControlAuditMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.DeleteAuditMapping(ctx, input.ControlID, input.AuditID) + if err != nil { + return nil, types.UnlinkControlAuditOutput{}, fmt.Errorf("failed to unlink control audit: %w", err) + } + + return nil, types.UnlinkControlAuditOutput{}, nil +} + +func (r *Resolver) LinkControlSnapshotTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlSnapshotInput) (*mcp.CallToolResult, types.LinkControlSnapshotOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionCreateControlSnapshotMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.CreateSnapshotMapping(ctx, input.ControlID, input.SnapshotID) + if err != nil { + return nil, types.LinkControlSnapshotOutput{}, fmt.Errorf("failed to link control snapshot: %w", err) + } + + return nil, types.LinkControlSnapshotOutput{}, nil +} + +func (r *Resolver) UnlinkControlSnapshotTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlSnapshotInput) (*mcp.CallToolResult, types.UnlinkControlSnapshotOutput, error) { + r.MustBeAuthorized(ctx, input.ControlID, authz.ActionDeleteControlSnapshotMapping) + + svc := r.ProboService(ctx, input.ControlID) + + _, _, err := svc.Controls.DeleteSnapshotMapping(ctx, input.ControlID, input.SnapshotID) + if err != nil { + return nil, types.UnlinkControlSnapshotOutput{}, fmt.Errorf("failed to unlink control snapshot: %w", err) + } + + return nil, types.UnlinkControlSnapshotOutput{}, nil +} diff --git a/pkg/server/api/mcp/v1/server/server.go b/pkg/server/api/mcp/v1/server/server.go index e673a2766..d192fe8df 100644 --- a/pkg/server/api/mcp/v1/server/server.go +++ b/pkg/server/api/mcp/v1/server/server.go @@ -57,6 +57,14 @@ type ResolverInterface interface { GetControlTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetControlInput) (*mcp.CallToolResult, types.GetControlOutput, error) AddControlTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddControlInput) (*mcp.CallToolResult, types.AddControlOutput, error) UpdateControlTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateControlInput) (*mcp.CallToolResult, types.UpdateControlOutput, error) + LinkControlMeasureTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlMeasureInput) (*mcp.CallToolResult, types.LinkControlMeasureOutput, error) + UnlinkControlMeasureTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlMeasureInput) (*mcp.CallToolResult, types.UnlinkControlMeasureOutput, error) + LinkControlDocumentTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlDocumentInput) (*mcp.CallToolResult, types.LinkControlDocumentOutput, error) + UnlinkControlDocumentTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlDocumentInput) (*mcp.CallToolResult, types.UnlinkControlDocumentOutput, error) + LinkControlAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlAuditInput) (*mcp.CallToolResult, types.LinkControlAuditOutput, error) + UnlinkControlAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlAuditInput) (*mcp.CallToolResult, types.UnlinkControlAuditOutput, error) + LinkControlSnapshotTool(ctx context.Context, req *mcp.CallToolRequest, input *types.LinkControlSnapshotInput) (*mcp.CallToolResult, types.LinkControlSnapshotOutput, error) + UnlinkControlSnapshotTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UnlinkControlSnapshotInput) (*mcp.CallToolResult, types.UnlinkControlSnapshotOutput, error) } // New creates a new MCP server instance with all handlers registered. @@ -546,4 +554,84 @@ func registerToolHandlers(server *mcp.Server, resolver ResolverInterface) { }, resolver.UpdateControlTool, ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "linkControlMeasure", + Description: "Link a measure to a control", + InputSchema: types.LinkControlMeasureToolInputSchema, + OutputSchema: types.LinkControlMeasureToolOutputSchema, + }, + resolver.LinkControlMeasureTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "unlinkControlMeasure", + Description: "Unlink a measure from a control", + InputSchema: types.UnlinkControlMeasureToolInputSchema, + OutputSchema: types.UnlinkControlMeasureToolOutputSchema, + }, + resolver.UnlinkControlMeasureTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "linkControlDocument", + Description: "Link a document to a control", + InputSchema: types.LinkControlDocumentToolInputSchema, + OutputSchema: types.LinkControlDocumentToolOutputSchema, + }, + resolver.LinkControlDocumentTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "unlinkControlDocument", + Description: "Unlink a document from a control", + InputSchema: types.UnlinkControlDocumentToolInputSchema, + OutputSchema: types.UnlinkControlDocumentToolOutputSchema, + }, + resolver.UnlinkControlDocumentTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "linkControlAudit", + Description: "Link an audit to a control", + InputSchema: types.LinkControlAuditToolInputSchema, + OutputSchema: types.LinkControlAuditToolOutputSchema, + }, + resolver.LinkControlAuditTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "unlinkControlAudit", + Description: "Unlink an audit from a control", + InputSchema: types.UnlinkControlAuditToolInputSchema, + OutputSchema: types.UnlinkControlAuditToolOutputSchema, + }, + resolver.UnlinkControlAuditTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "linkControlSnapshot", + Description: "Link a snapshot to a control", + InputSchema: types.LinkControlSnapshotToolInputSchema, + OutputSchema: types.LinkControlSnapshotToolOutputSchema, + }, + resolver.LinkControlSnapshotTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "unlinkControlSnapshot", + Description: "Unlink a snapshot from a control", + InputSchema: types.UnlinkControlSnapshotToolInputSchema, + OutputSchema: types.UnlinkControlSnapshotToolOutputSchema, + }, + resolver.UnlinkControlSnapshotTool, + ) } diff --git a/pkg/server/api/mcp/v1/specification.yaml b/pkg/server/api/mcp/v1/specification.yaml index 393e77138..653815efc 100644 --- a/pkg/server/api/mcp/v1/specification.yaml +++ b/pkg/server/api/mcp/v1/specification.yaml @@ -2654,6 +2654,134 @@ components: control: $ref: "#/components/schemas/Control" + LinkControlMeasureInput: + type: object + required: + - control_id + - measure_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + measure_id: + $ref: "#/components/schemas/GID" + description: Measure ID + + LinkControlMeasureOutput: + type: object + + UnlinkControlMeasureInput: + type: object + required: + - control_id + - measure_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + measure_id: + $ref: "#/components/schemas/GID" + description: Measure ID + + UnlinkControlMeasureOutput: + type: object + + LinkControlDocumentInput: + type: object + required: + - control_id + - document_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + document_id: + $ref: "#/components/schemas/GID" + description: Document ID + + LinkControlDocumentOutput: + type: object + + UnlinkControlDocumentInput: + type: object + required: + - control_id + - document_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + document_id: + $ref: "#/components/schemas/GID" + description: Document ID + + UnlinkControlDocumentOutput: + type: object + + LinkControlAuditInput: + type: object + required: + - control_id + - audit_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + audit_id: + $ref: "#/components/schemas/GID" + description: Audit ID + + LinkControlAuditOutput: + type: object + + UnlinkControlAuditInput: + type: object + required: + - control_id + - audit_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + audit_id: + $ref: "#/components/schemas/GID" + description: Audit ID + + UnlinkControlAuditOutput: + type: object + + LinkControlSnapshotInput: + type: object + required: + - control_id + - snapshot_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + snapshot_id: + $ref: "#/components/schemas/GID" + description: Snapshot ID + + LinkControlSnapshotOutput: + type: object + + UnlinkControlSnapshotInput: + type: object + required: + - control_id + - snapshot_id + properties: + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + snapshot_id: + $ref: "#/components/schemas/GID" + description: Snapshot ID + + UnlinkControlSnapshotOutput: + type: object + tools: - name: listOrganizations description: List all organizations the user has access to @@ -2984,3 +3112,59 @@ tools: $ref: "#/components/schemas/UpdateControlInput" outputSchema: $ref: "#/components/schemas/UpdateControlOutput" + - name: linkControlMeasure + description: Link a measure to a control + readonly: false + inputSchema: + $ref: "#/components/schemas/LinkControlMeasureInput" + outputSchema: + $ref: "#/components/schemas/LinkControlMeasureOutput" + - name: unlinkControlMeasure + description: Unlink a measure from a control + readonly: false + inputSchema: + $ref: "#/components/schemas/UnlinkControlMeasureInput" + outputSchema: + $ref: "#/components/schemas/UnlinkControlMeasureOutput" + - name: linkControlDocument + description: Link a document to a control + readonly: false + inputSchema: + $ref: "#/components/schemas/LinkControlDocumentInput" + outputSchema: + $ref: "#/components/schemas/LinkControlDocumentOutput" + - name: unlinkControlDocument + description: Unlink a document from a control + readonly: false + inputSchema: + $ref: "#/components/schemas/UnlinkControlDocumentInput" + outputSchema: + $ref: "#/components/schemas/UnlinkControlDocumentOutput" + - name: linkControlAudit + description: Link an audit to a control + readonly: false + inputSchema: + $ref: "#/components/schemas/LinkControlAuditInput" + outputSchema: + $ref: "#/components/schemas/LinkControlAuditOutput" + - name: unlinkControlAudit + description: Unlink an audit from a control + readonly: false + inputSchema: + $ref: "#/components/schemas/UnlinkControlAuditInput" + outputSchema: + $ref: "#/components/schemas/UnlinkControlAuditOutput" + - name: linkControlSnapshot + description: Link a snapshot to a control + readonly: false + inputSchema: + $ref: "#/components/schemas/LinkControlSnapshotInput" + outputSchema: + $ref: "#/components/schemas/LinkControlSnapshotOutput" + - name: unlinkControlSnapshot + description: Unlink a snapshot from a control + readonly: false + inputSchema: + $ref: "#/components/schemas/UnlinkControlSnapshotInput" + outputSchema: + $ref: "#/components/schemas/UnlinkControlSnapshotOutput" diff --git a/pkg/server/api/mcp/v1/types/types.go b/pkg/server/api/mcp/v1/types/types.go index cec5f7b16..60107f787 100644 --- a/pkg/server/api/mcp/v1/types/types.go +++ b/pkg/server/api/mcp/v1/types/types.go @@ -58,6 +58,14 @@ var ( GetPeopleToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["people"],"properties":{"people":{"type":"object","required":["id","organization_id","full_name","primary_email_address","additional_email_addresses","kind","created_at","updated_at"],"properties":{"additional_email_addresses":{"type":"array","description":"Additional email addresses","items":{"type":"string"}},"contract_end_date":{"description":"Contract end date","format":"date-time"},"contract_start_date":{"description":"Contract start date","format":"date-time"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"full_name":{"type":"string","description":"Full name"},"id":{"type":"string","format":"string"},"kind":{"type":"string","enum":["EMPLOYEE","CONTRACTOR","SERVICE_ACCOUNT"]},"organization_id":{"type":"string","format":"string"},"position":{"description":"Position"},"primary_email_address":{"type":"string","description":"Primary email address"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}`) GetRiskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"string"}}}`) GetRiskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["risk"],"properties":{"risk":{"type":"object","required":["id","organization_id","name","category","treatment","inherent_likelihood","inherent_impact","inherent_risk_score","residual_likelihood","residual_impact","residual_risk_score","note","created_at","updated_at"],"properties":{"category":{"type":"string","description":"Risk category"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Risk description"},"id":{"type":"string","format":"string"},"inherent_impact":{"type":"integer","description":"Inherent impact"},"inherent_likelihood":{"type":"integer","description":"Inherent likelihood"},"inherent_risk_score":{"type":"integer","description":"Inherent risk score"},"name":{"type":"string","description":"Risk name"},"note":{"type":"string","description":"Risk note"},"organization_id":{"type":"string","format":"string"},"owner_id":{"anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No owner"}]},"residual_impact":{"type":"integer","description":"Residual impact"},"residual_likelihood":{"type":"integer","description":"Residual likelihood"},"residual_risk_score":{"type":"integer","description":"Residual risk score"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No snapshot"}]},"treatment":{"type":"string","enum":["MITIGATED","ACCEPTED","AVOIDED","TRANSFERRED"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}`) + LinkControlAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","audit_id"],"properties":{"audit_id":{"type":"string","format":"string"},"control_id":{"type":"string","format":"string"}}}`) + LinkControlAuditToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + LinkControlDocumentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","document_id"],"properties":{"control_id":{"type":"string","format":"string"},"document_id":{"type":"string","format":"string"}}}`) + LinkControlDocumentToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + LinkControlMeasureToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","measure_id"],"properties":{"control_id":{"type":"string","format":"string"},"measure_id":{"type":"string","format":"string"}}}`) + LinkControlMeasureToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + LinkControlSnapshotToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","snapshot_id"],"properties":{"control_id":{"type":"string","format":"string"},"snapshot_id":{"type":"string","format":"string"}}}`) + LinkControlSnapshotToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) ListAssetsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id"],"properties":{"cursor":{"type":"string","format":"string"},"filter":{"type":"object","properties":{"snapshot_id":{"type":"string","format":"string"}}},"order_by":{"type":"object","required":["field","direction"],"properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","AMOUNT"]}}},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}}}`) ListAssetsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["assets"],"properties":{"assets":{"type":"array","items":{"type":"object","required":["id","organization_id","name","amount","owner_id","asset_type","data_types_stored","created_at","updated_at"],"properties":{"amount":{"type":"integer","description":"Asset amount"},"asset_type":{"type":"string","enum":["PHYSICAL","VIRTUAL"]},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"data_types_stored":{"type":"string","description":"Data types stored"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Asset name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}},"next_cursor":{"type":"string","format":"string"}}}`) ListAuditsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id"],"properties":{"cursor":{"type":"string","format":"string"},"order_by":{"type":"object","required":["field","direction"],"properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","VALID_FROM","VALID_UNTIL","STATE"]}}},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}}}`) @@ -84,6 +92,14 @@ var ( ListRisksToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["risks"],"properties":{"next_cursor":{"type":"string","format":"string"},"risks":{"type":"array","items":{"type":"object","required":["id","organization_id","name","category","treatment","inherent_likelihood","inherent_impact","inherent_risk_score","residual_likelihood","residual_impact","residual_risk_score","note","created_at","updated_at"],"properties":{"category":{"type":"string","description":"Risk category"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Risk description"},"id":{"type":"string","format":"string"},"inherent_impact":{"type":"integer","description":"Inherent impact"},"inherent_likelihood":{"type":"integer","description":"Inherent likelihood"},"inherent_risk_score":{"type":"integer","description":"Inherent risk score"},"name":{"type":"string","description":"Risk name"},"note":{"type":"string","description":"Risk note"},"organization_id":{"type":"string","format":"string"},"owner_id":{"anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No owner"}]},"residual_impact":{"type":"integer","description":"Residual impact"},"residual_likelihood":{"type":"integer","description":"Residual likelihood"},"residual_risk_score":{"type":"integer","description":"Residual risk score"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No snapshot"}]},"treatment":{"type":"string","enum":["MITIGATED","ACCEPTED","AVOIDED","TRANSFERRED"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}}`) ListVendorsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id"],"properties":{"cursor":{"type":"string","format":"string"},"filter":{"type":"object","properties":{"snapshot_id":{"type":"string","format":"string"}}},"order_by":{"type":"object","required":["field","direction"],"properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","UPDATED_AT","NAME"]}}},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}}}`) ListVendorsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["vendors"],"properties":{"next_cursor":{"type":"string","format":"string"},"vendors":{"type":"array","items":{"type":"object","required":["id","name","organization_id","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Vendor description"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Vendor name"},"organization_id":{"type":"string","format":"string"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}}`) + UnlinkControlAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","audit_id"],"properties":{"audit_id":{"type":"string","format":"string"},"control_id":{"type":"string","format":"string"}}}`) + UnlinkControlAuditToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + UnlinkControlDocumentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","document_id"],"properties":{"control_id":{"type":"string","format":"string"},"document_id":{"type":"string","format":"string"}}}`) + UnlinkControlDocumentToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + UnlinkControlMeasureToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","measure_id"],"properties":{"control_id":{"type":"string","format":"string"},"measure_id":{"type":"string","format":"string"}}}`) + UnlinkControlMeasureToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + UnlinkControlSnapshotToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["control_id","snapshot_id"],"properties":{"control_id":{"type":"string","format":"string"},"snapshot_id":{"type":"string","format":"string"}}}`) + UnlinkControlSnapshotToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) UpdateAssetToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"amount":{"type":"integer","description":"Asset amount"},"asset_type":{"type":"string","enum":["PHYSICAL","VIRTUAL"]},"data_types_stored":{"type":"string","description":"Data types stored"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Asset name"},"owner_id":{"description":"Owner ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"vendor_ids":{"type":"array","description":"Vendor IDs","items":{"type":"string","format":"string"}}}}`) UpdateAssetToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["asset"],"properties":{"asset":{"type":"object","required":["id","organization_id","name","amount","owner_id","asset_type","data_types_stored","created_at","updated_at"],"properties":{"amount":{"type":"integer","description":"Asset amount"},"asset_type":{"type":"string","enum":["PHYSICAL","VIRTUAL"]},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"data_types_stored":{"type":"string","description":"Data types stored"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Asset name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}`) UpdateAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"string"},"name":{"description":"Audit name"},"state":{"description":"Audit state","anyOf":[{"type":"string","enum":["NOT_STARTED","IN_PROGRESS","COMPLETED","REJECTED","OUTDATED"]},{"type":"null","description":"No state"}]},"trust_center_visibility":{"description":"Trust center visibility","anyOf":[{"type":"string","enum":["NONE","PRIVATE","PUBLIC"]},{"type":"null","description":"No trust center visibility"}]},"valid_from":{"description":"Valid from date","format":"date-time"},"valid_until":{"description":"Valid until date","format":"date-time"}}}`) @@ -693,6 +709,54 @@ type GetRiskOutput struct { Risk *Risk `json:"risk"` } +// LinkControlAuditInput represents the schema +type LinkControlAuditInput struct { + // Audit ID + AuditID gid.GID `json:"audit_id"` + // Control ID + ControlID gid.GID `json:"control_id"` +} + +// LinkControlAuditOutput represents the schema +type LinkControlAuditOutput struct { +} + +// LinkControlDocumentInput represents the schema +type LinkControlDocumentInput struct { + // Control ID + ControlID gid.GID `json:"control_id"` + // Document ID + DocumentID gid.GID `json:"document_id"` +} + +// LinkControlDocumentOutput represents the schema +type LinkControlDocumentOutput struct { +} + +// LinkControlMeasureInput represents the schema +type LinkControlMeasureInput struct { + // Control ID + ControlID gid.GID `json:"control_id"` + // Measure ID + MeasureID gid.GID `json:"measure_id"` +} + +// LinkControlMeasureOutput represents the schema +type LinkControlMeasureOutput struct { +} + +// LinkControlSnapshotInput represents the schema +type LinkControlSnapshotInput struct { + // Control ID + ControlID gid.GID `json:"control_id"` + // Snapshot ID + SnapshotID gid.GID `json:"snapshot_id"` +} + +// LinkControlSnapshotOutput represents the schema +type LinkControlSnapshotOutput struct { +} + // ListAssetsInput represents the schema type ListAssetsInput struct { // Page cursor @@ -1147,6 +1211,54 @@ type RiskOrderBy struct { Field coredata.RiskOrderField `json:"field"` } +// UnlinkControlAuditInput represents the schema +type UnlinkControlAuditInput struct { + // Audit ID + AuditID gid.GID `json:"audit_id"` + // Control ID + ControlID gid.GID `json:"control_id"` +} + +// UnlinkControlAuditOutput represents the schema +type UnlinkControlAuditOutput struct { +} + +// UnlinkControlDocumentInput represents the schema +type UnlinkControlDocumentInput struct { + // Control ID + ControlID gid.GID `json:"control_id"` + // Document ID + DocumentID gid.GID `json:"document_id"` +} + +// UnlinkControlDocumentOutput represents the schema +type UnlinkControlDocumentOutput struct { +} + +// UnlinkControlMeasureInput represents the schema +type UnlinkControlMeasureInput struct { + // Control ID + ControlID gid.GID `json:"control_id"` + // Measure ID + MeasureID gid.GID `json:"measure_id"` +} + +// UnlinkControlMeasureOutput represents the schema +type UnlinkControlMeasureOutput struct { +} + +// UnlinkControlSnapshotInput represents the schema +type UnlinkControlSnapshotInput struct { + // Control ID + ControlID gid.GID `json:"control_id"` + // Snapshot ID + SnapshotID gid.GID `json:"snapshot_id"` +} + +// UnlinkControlSnapshotOutput represents the schema +type UnlinkControlSnapshotOutput struct { +} + // UpdateAssetInput represents the schema type UpdateAssetInput struct { // Asset amount