diff --git a/pkg/probo/state_of_applicability_service.go b/pkg/probo/state_of_applicability_service.go index eda361119..0cfcbf6d0 100644 --- a/pkg/probo/state_of_applicability_service.go +++ b/pkg/probo/state_of_applicability_service.go @@ -272,6 +272,25 @@ func (s StateOfApplicabilityService) Delete( return nil } +func (s StateOfApplicabilityService) GetApplicabilityStatement( + ctx context.Context, + applicabilityStatementID gid.GID, +) (*coredata.ApplicabilityStatement, error) { + applicabilityStatement := &coredata.ApplicabilityStatement{} + + err := s.svc.pg.WithConn( + ctx, + func(conn pg.Conn) error { + return applicabilityStatement.LoadByID(ctx, conn, s.svc.scope, applicabilityStatementID) + }, + ) + if err != nil { + return nil, err + } + + return applicabilityStatement, nil +} + func (s StateOfApplicabilityService) ListApplicabilityStatements( ctx context.Context, stateOfApplicabilityID gid.GID, diff --git a/pkg/server/api/mcp/v1/schema.resolvers.go b/pkg/server/api/mcp/v1/schema.resolvers.go index 877ab7fb2..dfb42b28c 100644 --- a/pkg/server/api/mcp/v1/schema.resolvers.go +++ b/pkg/server/api/mcp/v1/schema.resolvers.go @@ -6,6 +6,7 @@ package mcp_v1 import ( "context" + "encoding/base64" "errors" "fmt" "time" @@ -2592,3 +2593,215 @@ func (r *Resolver) DeleteDataProtectionImpactAssessmentTool(ctx context.Context, DeletedDataProtectionImpactAssessmentID: input.ID, }, nil } + +func (r *Resolver) ListStatesOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListStatesOfApplicabilityInput) (*mcp.CallToolResult, types.ListStatesOfApplicabilityOutput, error) { + r.MustAuthorize(ctx, input.OrganizationID, probo.ActionStateOfApplicabilityList) + + prb := r.ProboService(ctx, input.OrganizationID) + + pageOrderBy := page.OrderBy[coredata.StateOfApplicabilityOrderField]{ + Field: coredata.StateOfApplicabilityOrderFieldCreatedAt, + Direction: page.OrderDirectionDesc, + } + if input.OrderBy != nil { + pageOrderBy = page.OrderBy[coredata.StateOfApplicabilityOrderField]{ + Field: input.OrderBy.Field, + Direction: input.OrderBy.Direction, + } + } + + cursor := types.NewCursor(input.Size, input.Cursor, pageOrderBy) + + pg, err := prb.StatesOfApplicability.ListForOrganizationID(ctx, input.OrganizationID, cursor, coredata.NewStateOfApplicabilityFilter(nil)) + if err != nil { + return nil, types.ListStatesOfApplicabilityOutput{}, fmt.Errorf("failed to list states of applicability: %w", err) + } + + return nil, types.NewListStatesOfApplicabilityOutput(pg), nil +} + +func (r *Resolver) GetStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetStateOfApplicabilityInput) (*mcp.CallToolResult, types.GetStateOfApplicabilityOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityGet) + + prb := r.ProboService(ctx, input.ID) + + soa, err := prb.StatesOfApplicability.Get(ctx, input.ID) + if err != nil { + return nil, types.GetStateOfApplicabilityOutput{}, fmt.Errorf("failed to get state of applicability: %w", err) + } + + return nil, types.GetStateOfApplicabilityOutput{ + StateOfApplicability: types.NewStateOfApplicability(soa), + }, nil +} + +func (r *Resolver) AddStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddStateOfApplicabilityInput) (*mcp.CallToolResult, types.AddStateOfApplicabilityOutput, error) { + r.MustAuthorize(ctx, input.OrganizationID, probo.ActionStateOfApplicabilityCreate) + + svc := r.ProboService(ctx, input.OrganizationID) + + soa, err := svc.StatesOfApplicability.Create(ctx, probo.CreateStateOfApplicabilityRequest{ + OrganizationID: input.OrganizationID, + Name: input.Name, + OwnerID: input.OwnerID, + }) + if err != nil { + return nil, types.AddStateOfApplicabilityOutput{}, fmt.Errorf("failed to create state of applicability: %w", err) + } + + return nil, types.AddStateOfApplicabilityOutput{ + StateOfApplicability: types.NewStateOfApplicability(soa), + }, nil +} + +func (r *Resolver) UpdateStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateStateOfApplicabilityInput) (*mcp.CallToolResult, types.UpdateStateOfApplicabilityOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityUpdate) + + svc := r.ProboService(ctx, input.ID) + + soa, err := svc.StatesOfApplicability.Update(ctx, probo.UpdateStateOfApplicabilityRequest{ + StateOfApplicabilityID: input.ID, + Name: input.Name, + OwnerID: input.OwnerID, + }) + if err != nil { + return nil, types.UpdateStateOfApplicabilityOutput{}, fmt.Errorf("failed to update state of applicability: %w", err) + } + + return nil, types.UpdateStateOfApplicabilityOutput{ + StateOfApplicability: types.NewStateOfApplicability(soa), + }, nil +} + +func (r *Resolver) DeleteStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteStateOfApplicabilityInput) (*mcp.CallToolResult, types.DeleteStateOfApplicabilityOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityDelete) + + svc := r.ProboService(ctx, input.ID) + + err := svc.StatesOfApplicability.Delete(ctx, input.ID) + if err != nil { + return nil, types.DeleteStateOfApplicabilityOutput{}, fmt.Errorf("failed to delete state of applicability: %w", err) + } + + return nil, types.DeleteStateOfApplicabilityOutput{ + DeletedStateOfApplicabilityID: input.ID, + }, nil +} + +func (r *Resolver) ExportStateOfApplicabilityPDFTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ExportStateOfApplicabilityPDFInput) (*mcp.CallToolResult, types.ExportStateOfApplicabilityPDFOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionStateOfApplicabilityExport) + + svc := r.ProboService(ctx, input.ID) + + soa, err := svc.StatesOfApplicability.Get(ctx, input.ID) + if err != nil { + return nil, types.ExportStateOfApplicabilityPDFOutput{}, fmt.Errorf("failed to get state of applicability: %w", err) + } + + pdfData, err := svc.StatesOfApplicability.ExportPDF(ctx, input.ID) + if err != nil { + return nil, types.ExportStateOfApplicabilityPDFOutput{}, fmt.Errorf("failed to export state of applicability PDF: %w", err) + } + + return nil, types.ExportStateOfApplicabilityPDFOutput{ + PdfBase64: base64.StdEncoding.EncodeToString(pdfData), + Filename: soa.Name + ".pdf", + }, nil +} + +func (r *Resolver) ListApplicabilityStatementsTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListApplicabilityStatementsInput) (*mcp.CallToolResult, types.ListApplicabilityStatementsOutput, error) { + r.MustAuthorize(ctx, input.StateOfApplicabilityID, probo.ActionApplicabilityStatementList) + + prb := r.ProboService(ctx, input.StateOfApplicabilityID) + + pageOrderBy := page.OrderBy[coredata.ApplicabilityStatementOrderField]{ + Field: coredata.ApplicabilityStatementOrderFieldControlSectionTitle, + Direction: page.OrderDirectionAsc, + } + if input.OrderBy != nil { + pageOrderBy = page.OrderBy[coredata.ApplicabilityStatementOrderField]{ + Field: input.OrderBy.Field, + Direction: input.OrderBy.Direction, + } + } + + cursor := types.NewCursor(input.Size, input.Cursor, pageOrderBy) + + pg, err := prb.StatesOfApplicability.ListApplicabilityStatements(ctx, input.StateOfApplicabilityID, cursor) + if err != nil { + return nil, types.ListApplicabilityStatementsOutput{}, fmt.Errorf("failed to list applicability statements: %w", err) + } + + return nil, types.NewListApplicabilityStatementsOutput(pg), nil +} + +func (r *Resolver) GetApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetApplicabilityStatementInput) (*mcp.CallToolResult, types.GetApplicabilityStatementOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionApplicabilityStatementGet) + + prb := r.ProboService(ctx, input.ID) + + stmt, err := prb.StatesOfApplicability.GetApplicabilityStatement(ctx, input.ID) + if err != nil { + return nil, types.GetApplicabilityStatementOutput{}, fmt.Errorf("failed to get applicability statement: %w", err) + } + + return nil, types.GetApplicabilityStatementOutput{ + ApplicabilityStatement: types.NewApplicabilityStatement(stmt), + }, nil +} + +func (r *Resolver) AddApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddApplicabilityStatementInput) (*mcp.CallToolResult, types.AddApplicabilityStatementOutput, error) { + r.MustAuthorize(ctx, input.StateOfApplicabilityID, probo.ActionApplicabilityStatementCreate) + + svc := r.ProboService(ctx, input.StateOfApplicabilityID) + + stmt, err := svc.StatesOfApplicability.CreateApplicabilityStatement( + ctx, + input.StateOfApplicabilityID, + input.ControlID, + input.Applicability, + input.Justification, + ) + if err != nil { + return nil, types.AddApplicabilityStatementOutput{}, fmt.Errorf("failed to create applicability statement: %w", err) + } + + return nil, types.AddApplicabilityStatementOutput{ + ApplicabilityStatement: types.NewApplicabilityStatement(stmt), + }, nil +} + +func (r *Resolver) UpdateApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateApplicabilityStatementInput) (*mcp.CallToolResult, types.UpdateApplicabilityStatementOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionApplicabilityStatementUpdate) + + svc := r.ProboService(ctx, input.ID) + + stmt, err := svc.StatesOfApplicability.UpdateApplicabilityStatement( + ctx, + input.ID, + input.Applicability, + input.Justification, + ) + if err != nil { + return nil, types.UpdateApplicabilityStatementOutput{}, fmt.Errorf("failed to update applicability statement: %w", err) + } + + return nil, types.UpdateApplicabilityStatementOutput{ + ApplicabilityStatement: types.NewApplicabilityStatement(stmt), + }, nil +} + +func (r *Resolver) DeleteApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteApplicabilityStatementInput) (*mcp.CallToolResult, types.DeleteApplicabilityStatementOutput, error) { + r.MustAuthorize(ctx, input.ID, probo.ActionApplicabilityStatementDelete) + + svc := r.ProboService(ctx, input.ID) + + err := svc.StatesOfApplicability.DeleteApplicabilityStatement(ctx, input.ID) + if err != nil { + return nil, types.DeleteApplicabilityStatementOutput{}, fmt.Errorf("failed to delete applicability statement: %w", err) + } + + return nil, types.DeleteApplicabilityStatementOutput{ + DeletedApplicabilityStatementID: input.ID, + }, nil +} diff --git a/pkg/server/api/mcp/v1/server/server.go b/pkg/server/api/mcp/v1/server/server.go index 58bd8ea46..25d8fcb31 100644 --- a/pkg/server/api/mcp/v1/server/server.go +++ b/pkg/server/api/mcp/v1/server/server.go @@ -117,6 +117,17 @@ type ResolverInterface interface { UpdateMeetingTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateMeetingInput) (*mcp.CallToolResult, types.UpdateMeetingOutput, error) DeleteMeetingTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteMeetingInput) (*mcp.CallToolResult, types.DeleteMeetingOutput, error) ListMeetingAttendeesTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListMeetingAttendeesInput) (*mcp.CallToolResult, types.ListMeetingAttendeesOutput, error) + ListStatesOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListStatesOfApplicabilityInput) (*mcp.CallToolResult, types.ListStatesOfApplicabilityOutput, error) + GetStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetStateOfApplicabilityInput) (*mcp.CallToolResult, types.GetStateOfApplicabilityOutput, error) + AddStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddStateOfApplicabilityInput) (*mcp.CallToolResult, types.AddStateOfApplicabilityOutput, error) + UpdateStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateStateOfApplicabilityInput) (*mcp.CallToolResult, types.UpdateStateOfApplicabilityOutput, error) + DeleteStateOfApplicabilityTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteStateOfApplicabilityInput) (*mcp.CallToolResult, types.DeleteStateOfApplicabilityOutput, error) + ExportStateOfApplicabilityPDFTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ExportStateOfApplicabilityPDFInput) (*mcp.CallToolResult, types.ExportStateOfApplicabilityPDFOutput, error) + ListApplicabilityStatementsTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListApplicabilityStatementsInput) (*mcp.CallToolResult, types.ListApplicabilityStatementsOutput, error) + GetApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetApplicabilityStatementInput) (*mcp.CallToolResult, types.GetApplicabilityStatementOutput, error) + AddApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddApplicabilityStatementInput) (*mcp.CallToolResult, types.AddApplicabilityStatementOutput, error) + UpdateApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateApplicabilityStatementInput) (*mcp.CallToolResult, types.UpdateApplicabilityStatementOutput, error) + DeleteApplicabilityStatementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.DeleteApplicabilityStatementInput) (*mcp.CallToolResult, types.DeleteApplicabilityStatementOutput, error) } // New creates a new MCP server instance with all handlers registered. @@ -1396,6 +1407,142 @@ func registerToolHandlers(server *mcp.Server, resolver ResolverInterface) { }, resolver.ListMeetingAttendeesTool, ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "listStatesOfApplicability", + Description: "List all states of applicability for the organization", + InputSchema: types.ListStatesOfApplicabilityToolInputSchema, + OutputSchema: types.ListStatesOfApplicabilityToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + ReadOnlyHint: true, + IdempotentHint: true, + }, + }, + resolver.ListStatesOfApplicabilityTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "getStateOfApplicability", + Description: "Get a state of applicability by ID", + InputSchema: types.GetStateOfApplicabilityToolInputSchema, + OutputSchema: types.GetStateOfApplicabilityToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + ReadOnlyHint: true, + IdempotentHint: true, + }, + }, + resolver.GetStateOfApplicabilityTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "addStateOfApplicability", + Description: "Add a new state of applicability to the organization", + InputSchema: types.AddStateOfApplicabilityToolInputSchema, + OutputSchema: types.AddStateOfApplicabilityToolOutputSchema, + }, + resolver.AddStateOfApplicabilityTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "updateStateOfApplicability", + Description: "Update an existing state of applicability", + InputSchema: types.UpdateStateOfApplicabilityToolInputSchema, + OutputSchema: types.UpdateStateOfApplicabilityToolOutputSchema, + }, + resolver.UpdateStateOfApplicabilityTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "deleteStateOfApplicability", + Description: "Delete a state of applicability", + InputSchema: types.DeleteStateOfApplicabilityToolInputSchema, + OutputSchema: types.DeleteStateOfApplicabilityToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + DestructiveHint: boolPtr(true), + }, + }, + resolver.DeleteStateOfApplicabilityTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "exportStateOfApplicabilityPDF", + Description: "Export a state of applicability as a PDF document", + InputSchema: types.ExportStateOfApplicabilityPDFToolInputSchema, + OutputSchema: types.ExportStateOfApplicabilityPDFToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + ReadOnlyHint: true, + IdempotentHint: true, + }, + }, + resolver.ExportStateOfApplicabilityPDFTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "listApplicabilityStatements", + Description: "List all applicability statements for a state of applicability", + InputSchema: types.ListApplicabilityStatementsToolInputSchema, + OutputSchema: types.ListApplicabilityStatementsToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + ReadOnlyHint: true, + IdempotentHint: true, + }, + }, + resolver.ListApplicabilityStatementsTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "getApplicabilityStatement", + Description: "Get an applicability statement by ID", + InputSchema: types.GetApplicabilityStatementToolInputSchema, + OutputSchema: types.GetApplicabilityStatementToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + ReadOnlyHint: true, + IdempotentHint: true, + }, + }, + resolver.GetApplicabilityStatementTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "addApplicabilityStatement", + Description: "Add a control to a state of applicability with an applicability decision", + InputSchema: types.AddApplicabilityStatementToolInputSchema, + OutputSchema: types.AddApplicabilityStatementToolOutputSchema, + }, + resolver.AddApplicabilityStatementTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "updateApplicabilityStatement", + Description: "Update the applicability and justification of an applicability statement", + InputSchema: types.UpdateApplicabilityStatementToolInputSchema, + OutputSchema: types.UpdateApplicabilityStatementToolOutputSchema, + }, + resolver.UpdateApplicabilityStatementTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "deleteApplicabilityStatement", + Description: "Delete an applicability statement from a state of applicability", + InputSchema: types.DeleteApplicabilityStatementToolInputSchema, + OutputSchema: types.DeleteApplicabilityStatementToolOutputSchema, + Annotations: &mcp.ToolAnnotations{ + DestructiveHint: boolPtr(true), + }, + }, + resolver.DeleteApplicabilityStatementTool, + ) } func boolPtr(b bool) *bool { diff --git a/pkg/server/api/mcp/v1/specification.yaml b/pkg/server/api/mcp/v1/specification.yaml index a73cd14c1..13a5ca29a 100644 --- a/pkg/server/api/mcp/v1/specification.yaml +++ b/pkg/server/api/mcp/v1/specification.yaml @@ -5387,6 +5387,385 @@ components: $ref: "#/components/schemas/Profile" description: List of attendee profiles + StateOfApplicabilityOrderField: + type: string + enum: + - CREATED_AT + - NAME + go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.StateOfApplicabilityOrderField + + StateOfApplicabilityOrderBy: + type: object + required: + - field + - direction + properties: + field: + $ref: "#/components/schemas/StateOfApplicabilityOrderField" + description: State of applicability order field + direction: + $ref: "#/components/schemas/OrderDirection" + description: Order direction + + StateOfApplicability: + type: object + required: + - id + - organization_id + - name + - owner_id + - created_at + - updated_at + properties: + id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + organization_id: + $ref: "#/components/schemas/GID" + description: Organization ID + name: + type: string + description: State of applicability name + owner_id: + $ref: "#/components/schemas/GID" + description: Owner profile ID + snapshot_id: + anyOf: + - $ref: "#/components/schemas/GID" + - type: "null" + description: Snapshot ID + created_at: + type: string + format: date-time + description: Creation timestamp + updated_at: + type: string + format: date-time + description: Update timestamp + + ListStatesOfApplicabilityInput: + type: object + required: + - organization_id + properties: + organization_id: + $ref: "#/components/schemas/GID" + description: Organization ID + order_by: + $ref: "#/components/schemas/StateOfApplicabilityOrderBy" + description: Order by + size: + type: integer + description: Page size + cursor: + $ref: "#/components/schemas/CursorKey" + description: Page cursor + + ListStatesOfApplicabilityOutput: + type: object + required: + - states_of_applicability + properties: + next_cursor: + $ref: "#/components/schemas/CursorKey" + description: Next cursor + states_of_applicability: + type: array + items: + $ref: "#/components/schemas/StateOfApplicability" + + GetStateOfApplicabilityInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + + GetStateOfApplicabilityOutput: + type: object + required: + - state_of_applicability + properties: + state_of_applicability: + $ref: "#/components/schemas/StateOfApplicability" + + AddStateOfApplicabilityInput: + type: object + required: + - organization_id + - name + - owner_id + properties: + organization_id: + $ref: "#/components/schemas/GID" + description: Organization ID + name: + type: string + description: State of applicability name + owner_id: + $ref: "#/components/schemas/GID" + description: Owner profile ID + + AddStateOfApplicabilityOutput: + type: object + required: + - state_of_applicability + properties: + state_of_applicability: + $ref: "#/components/schemas/StateOfApplicability" + + UpdateStateOfApplicabilityInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + name: + type: string + description: State of applicability name + owner_id: + $ref: "#/components/schemas/GID" + description: Owner profile ID + + UpdateStateOfApplicabilityOutput: + type: object + required: + - state_of_applicability + properties: + state_of_applicability: + $ref: "#/components/schemas/StateOfApplicability" + + DeleteStateOfApplicabilityInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + + DeleteStateOfApplicabilityOutput: + type: object + required: + - deleted_state_of_applicability_id + properties: + deleted_state_of_applicability_id: + $ref: "#/components/schemas/GID" + description: Deleted state of applicability ID + + ExportStateOfApplicabilityPDFInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + + ExportStateOfApplicabilityPDFOutput: + type: object + required: + - pdf_base64 + - filename + properties: + pdf_base64: + type: string + description: Base64-encoded PDF content + filename: + type: string + description: Suggested filename for the PDF + + ApplicabilityStatementOrderField: + type: string + enum: + - CREATED_AT + - CONTROL_SECTION_TITLE + go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.ApplicabilityStatementOrderField + + ApplicabilityStatementOrderBy: + type: object + required: + - field + - direction + properties: + field: + $ref: "#/components/schemas/ApplicabilityStatementOrderField" + description: Applicability statement order field + direction: + $ref: "#/components/schemas/OrderDirection" + description: Order direction + + ApplicabilityStatement: + type: object + required: + - id + - state_of_applicability_id + - control_id + - organization_id + - applicability + - created_at + - updated_at + properties: + id: + $ref: "#/components/schemas/GID" + description: Applicability statement ID + state_of_applicability_id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + organization_id: + $ref: "#/components/schemas/GID" + description: Organization ID + snapshot_id: + anyOf: + - $ref: "#/components/schemas/GID" + - type: "null" + description: Snapshot ID + applicability: + type: boolean + description: Whether the control is applicable + justification: + anyOf: + - type: string + - type: "null" + description: Justification for the applicability decision + created_at: + type: string + format: date-time + description: Creation timestamp + updated_at: + type: string + format: date-time + description: Update timestamp + + ListApplicabilityStatementsInput: + type: object + required: + - state_of_applicability_id + properties: + state_of_applicability_id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + order_by: + $ref: "#/components/schemas/ApplicabilityStatementOrderBy" + description: Order by + size: + type: integer + description: Page size + cursor: + $ref: "#/components/schemas/CursorKey" + description: Page cursor + + ListApplicabilityStatementsOutput: + type: object + required: + - applicability_statements + properties: + next_cursor: + $ref: "#/components/schemas/CursorKey" + description: Next cursor + applicability_statements: + type: array + items: + $ref: "#/components/schemas/ApplicabilityStatement" + + GetApplicabilityStatementInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: Applicability statement ID + + GetApplicabilityStatementOutput: + type: object + required: + - applicability_statement + properties: + applicability_statement: + $ref: "#/components/schemas/ApplicabilityStatement" + + AddApplicabilityStatementInput: + type: object + required: + - state_of_applicability_id + - control_id + - applicability + properties: + state_of_applicability_id: + $ref: "#/components/schemas/GID" + description: State of applicability ID + control_id: + $ref: "#/components/schemas/GID" + description: Control ID + applicability: + type: boolean + description: Whether the control is applicable + justification: + anyOf: + - type: string + - type: "null" + description: Justification for the applicability decision + + AddApplicabilityStatementOutput: + type: object + required: + - applicability_statement + properties: + applicability_statement: + $ref: "#/components/schemas/ApplicabilityStatement" + + UpdateApplicabilityStatementInput: + type: object + required: + - id + - applicability + properties: + id: + $ref: "#/components/schemas/GID" + description: Applicability statement ID + applicability: + type: boolean + description: Whether the control is applicable + justification: + anyOf: + - type: string + - type: "null" + description: Justification for the applicability decision + + UpdateApplicabilityStatementOutput: + type: object + required: + - applicability_statement + properties: + applicability_statement: + $ref: "#/components/schemas/ApplicabilityStatement" + + DeleteApplicabilityStatementInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: Applicability statement ID + + DeleteApplicabilityStatementOutput: + type: object + required: + - deleted_applicability_statement_id + properties: + deleted_applicability_statement_id: + $ref: "#/components/schemas/GID" + description: Deleted applicability statement ID + tools: - name: listOrganizations description: List all organizations the user has access to @@ -6293,3 +6672,98 @@ tools: $ref: "#/components/schemas/ListMeetingAttendeesInput" outputSchema: $ref: "#/components/schemas/ListMeetingAttendeesOutput" + - name: listStatesOfApplicability + description: List all states of applicability for the organization + hints: + readonly: true + idempotent: true + inputSchema: + $ref: "#/components/schemas/ListStatesOfApplicabilityInput" + outputSchema: + $ref: "#/components/schemas/ListStatesOfApplicabilityOutput" + - name: getStateOfApplicability + description: Get a state of applicability by ID + hints: + readonly: true + idempotent: true + inputSchema: + $ref: "#/components/schemas/GetStateOfApplicabilityInput" + outputSchema: + $ref: "#/components/schemas/GetStateOfApplicabilityOutput" + - name: addStateOfApplicability + description: Add a new state of applicability to the organization + hints: + readonly: false + inputSchema: + $ref: "#/components/schemas/AddStateOfApplicabilityInput" + outputSchema: + $ref: "#/components/schemas/AddStateOfApplicabilityOutput" + - name: updateStateOfApplicability + description: Update an existing state of applicability + hints: + readonly: false + inputSchema: + $ref: "#/components/schemas/UpdateStateOfApplicabilityInput" + outputSchema: + $ref: "#/components/schemas/UpdateStateOfApplicabilityOutput" + - name: deleteStateOfApplicability + description: Delete a state of applicability + hints: + readonly: false + destructive: true + inputSchema: + $ref: "#/components/schemas/DeleteStateOfApplicabilityInput" + outputSchema: + $ref: "#/components/schemas/DeleteStateOfApplicabilityOutput" + - name: exportStateOfApplicabilityPDF + description: Export a state of applicability as a PDF document + hints: + readonly: true + idempotent: true + inputSchema: + $ref: "#/components/schemas/ExportStateOfApplicabilityPDFInput" + outputSchema: + $ref: "#/components/schemas/ExportStateOfApplicabilityPDFOutput" + - name: listApplicabilityStatements + description: List all applicability statements for a state of applicability + hints: + readonly: true + idempotent: true + inputSchema: + $ref: "#/components/schemas/ListApplicabilityStatementsInput" + outputSchema: + $ref: "#/components/schemas/ListApplicabilityStatementsOutput" + - name: getApplicabilityStatement + description: Get an applicability statement by ID + hints: + readonly: true + idempotent: true + inputSchema: + $ref: "#/components/schemas/GetApplicabilityStatementInput" + outputSchema: + $ref: "#/components/schemas/GetApplicabilityStatementOutput" + - name: addApplicabilityStatement + description: Add a control to a state of applicability with an applicability decision + hints: + readonly: false + inputSchema: + $ref: "#/components/schemas/AddApplicabilityStatementInput" + outputSchema: + $ref: "#/components/schemas/AddApplicabilityStatementOutput" + - name: updateApplicabilityStatement + description: Update the applicability and justification of an applicability statement + hints: + readonly: false + inputSchema: + $ref: "#/components/schemas/UpdateApplicabilityStatementInput" + outputSchema: + $ref: "#/components/schemas/UpdateApplicabilityStatementOutput" + - name: deleteApplicabilityStatement + description: Delete an applicability statement from a state of applicability + hints: + readonly: false + destructive: true + inputSchema: + $ref: "#/components/schemas/DeleteApplicabilityStatementInput" + outputSchema: + $ref: "#/components/schemas/DeleteApplicabilityStatementOutput" diff --git a/pkg/server/api/mcp/v1/types/state_of_applicability.go b/pkg/server/api/mcp/v1/types/state_of_applicability.go new file mode 100644 index 000000000..17910b3e8 --- /dev/null +++ b/pkg/server/api/mcp/v1/types/state_of_applicability.go @@ -0,0 +1,77 @@ +// Copyright (c) 2025 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package types + +import ( + "go.probo.inc/probo/pkg/coredata" + "go.probo.inc/probo/pkg/page" +) + +func NewStateOfApplicability(s *coredata.StateOfApplicability) *StateOfApplicability { + return &StateOfApplicability{ + ID: s.ID, + OrganizationID: s.OrganizationID, + Name: s.Name, + OwnerID: s.OwnerID, + SnapshotID: s.SnapshotID, + CreatedAt: s.CreatedAt, + UpdatedAt: s.UpdatedAt, + } +} + +func NewListStatesOfApplicabilityOutput(pg *page.Page[*coredata.StateOfApplicability, coredata.StateOfApplicabilityOrderField]) ListStatesOfApplicabilityOutput { + items := make([]*StateOfApplicability, 0, len(pg.Data)) + for _, v := range pg.Data { + items = append(items, NewStateOfApplicability(v)) + } + var nextCursor *page.CursorKey + if len(pg.Data) > 0 { + cursorKey := pg.Data[len(pg.Data)-1].CursorKey(pg.Cursor.OrderBy.Field) + nextCursor = &cursorKey + } + return ListStatesOfApplicabilityOutput{ + NextCursor: nextCursor, + StatesOfApplicability: items, + } +} + +func NewApplicabilityStatement(a *coredata.ApplicabilityStatement) *ApplicabilityStatement { + return &ApplicabilityStatement{ + ID: a.ID, + StateOfApplicabilityID: a.StateOfApplicabilityID, + ControlID: a.ControlID, + OrganizationID: a.OrganizationID, + SnapshotID: a.SnapshotID, + Applicability: a.Applicability, + Justification: a.Justification, + CreatedAt: a.CreatedAt, + UpdatedAt: a.UpdatedAt, + } +} + +func NewListApplicabilityStatementsOutput(pg *page.Page[*coredata.ApplicabilityStatement, coredata.ApplicabilityStatementOrderField]) ListApplicabilityStatementsOutput { + items := make([]*ApplicabilityStatement, 0, len(pg.Data)) + for _, v := range pg.Data { + items = append(items, NewApplicabilityStatement(v)) + } + var nextCursor *page.CursorKey + if len(pg.Data) > 0 { + cursorKey := pg.Data[len(pg.Data)-1].CursorKey(pg.Cursor.OrderBy.Field) + nextCursor = &cursorKey + } + return ListApplicabilityStatementsOutput{ + NextCursor: nextCursor, + ApplicabilityStatements: items, + } +} diff --git a/pkg/server/api/mcp/v1/types/types.go b/pkg/server/api/mcp/v1/types/types.go index ae129871d..8592c8b03 100644 --- a/pkg/server/api/mcp/v1/types/types.go +++ b/pkg/server/api/mcp/v1/types/types.go @@ -15,6 +15,8 @@ import ( // Tool input schemas var ( + AddApplicabilityStatementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"applicability":{"type":"boolean","description":"Whether the control is applicable"},"control_id":{"type":"string","format":"string"},"justification":{"description":"Justification for the applicability decision","anyOf":[{"type":"string"},{"type":"null"}]},"state_of_applicability_id":{"type":"string","format":"string"}},"required":["state_of_applicability_id","control_id","applicability"]}`) + AddApplicabilityStatementToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"applicability_statement":{"type":"object","properties":{"applicability":{"type":"boolean","description":"Whether the control is applicable"},"control_id":{"type":"string","format":"string"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"justification":{"description":"Justification for the applicability decision","anyOf":[{"type":"string"},{"type":"null"}]},"organization_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"state_of_applicability_id":{"type":"string","format":"string"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","state_of_applicability_id","control_id","organization_id","applicability","created_at","updated_at"]}},"required":["applicability_statement"]}`) AddAssetToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"amount":{"type":"integer","description":"Asset amount"},"asset_type":{"type":"string","enum":["PHYSICAL","VIRTUAL"]},"data_types_stored":{"type":"string","description":"Data types stored"},"name":{"type":"string","description":"Asset name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"vendor_ids":{"type":"array","items":{"type":"string","format":"string"},"description":"Vendor IDs"}},"required":["organization_id","name","amount","owner_id","asset_type","data_types_stored"]}`) AddAssetToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"asset":{"type":"object","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"}},"required":["id","organization_id","name","amount","owner_id","asset_type","data_types_stored","created_at","updated_at"]}},"required":["asset"]}`) AddAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"framework_id":{"type":"string","format":"string"},"name":{"type":"string","description":"Audit name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["NOT_STARTED","IN_PROGRESS","COMPLETED","REJECTED","OUTDATED"]},"valid_from":{"type":"string","description":"Valid from date","format":"date-time"},"valid_until":{"type":"string","description":"Valid until date","format":"date-time"}},"required":["organization_id","framework_id"]}`) @@ -43,6 +45,8 @@ var ( AddProcessingActivityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"processing_activity":{"type":"object","properties":{"consent_evidence_link":{"description":"Consent evidence link"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"data_protection_impact_assessment_needed":{"type":"string","enum":["NEEDED","NOT_NEEDED"]},"data_protection_officer_id":{"description":"Data protection officer profile ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"data_subject_category":{"description":"Data subject category"},"id":{"type":"string","format":"string"},"international_transfers":{"type":"boolean","description":"International transfers"},"last_review_date":{"description":"Last review date","format":"date-time"},"lawful_basis":{"type":"string","enum":["LEGITIMATE_INTEREST","CONSENT","CONTRACTUAL_NECESSITY","LEGAL_OBLIGATION","VITAL_INTERESTS","PUBLIC_TASK"]},"location":{"description":"Location"},"name":{"type":"string","description":"Name"},"next_review_date":{"description":"Next review date","format":"date-time"},"organization_id":{"type":"string","format":"string"},"personal_data_category":{"description":"Personal data category"},"purpose":{"description":"Purpose"},"recipients":{"description":"Recipients"},"retention_period":{"description":"Retention period"},"role":{"type":"string","enum":["CONTROLLER","PROCESSOR"]},"security_measures":{"description":"Security measures"},"special_or_criminal_data":{"type":"string","enum":["YES","NO","POSSIBLE"]},"transfer_impact_assessment_needed":{"type":"string","enum":["NEEDED","NOT_NEEDED"]},"transfer_safeguard":{"description":"Transfer safeguard","anyOf":[{"type":"string","enum":["STANDARD_CONTRACTUAL_CLAUSES","BINDING_CORPORATE_RULES","ADEQUACY_DECISION","DEROGATIONS","CODES_OF_CONDUCT","CERTIFICATION_MECHANISMS"]},{"type":"null"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","special_or_criminal_data","lawful_basis","international_transfers","data_protection_impact_assessment_needed","transfer_impact_assessment_needed","role","created_at","updated_at"]}},"required":["processing_activity"]}`) AddRiskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"category":{"type":"string","description":"Risk category"},"description":{"type":"string","description":"Risk description"},"inherent_impact":{"type":"integer","description":"Inherent impact"},"inherent_likelihood":{"type":"integer","description":"Inherent likelihood"},"name":{"type":"string","description":"Risk name"},"note":{"type":"string","description":"Risk note"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"residual_impact":{"type":"integer","description":"Residual impact"},"residual_likelihood":{"type":"integer","description":"Residual likelihood"},"treatment":{"type":"string","enum":["MITIGATED","ACCEPTED","AVOIDED","TRANSFERRED"]}},"required":["organization_id","name","category","treatment","inherent_likelihood","inherent_impact"]}`) AddRiskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"risk":{"type":"object","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"}},"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"]}},"required":["risk"]}`) + AddStateOfApplicabilityToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"name":{"type":"string","description":"State of applicability name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"}},"required":["organization_id","name","owner_id"]}`) + AddStateOfApplicabilityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"state_of_applicability":{"type":"object","properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"State of applicability name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","owner_id","created_at","updated_at"]}},"required":["state_of_applicability"]}`) AddTaskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"assigned_to_id":{"description":"Assigned to person ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"Not assigned"}]},"deadline":{"type":"string","description":"Deadline","format":"date-time"},"description":{"type":"string","description":"Task description"},"measure_id":{"description":"Measure ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No measure"}]},"name":{"type":"string","description":"Task name"},"organization_id":{"type":"string","format":"string"},"time_estimate":{"type":"string","description":"A duration"}},"required":["organization_id","name"]}`) AddTaskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"task":{"type":"object","properties":{"assigned_to_id":{"description":"Assigned to person ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"Not assigned"}]},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"deadline":{"description":"Deadline","anyOf":[{"type":"string","description":"Deadline","format":"date-time"},{"type":"null","description":"No deadline"}]},"description":{"description":"Task description","anyOf":[{"type":"string","description":"Task description"},{"type":"null","description":"No description"}]},"id":{"type":"string","format":"string"},"measure_id":{"description":"Measure ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No measure"}]},"name":{"type":"string","description":"Task name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["TODO","DONE"]},"time_estimate":{"description":"Time estimate","anyOf":[{"type":"string","description":"A duration"},{"type":"null","description":"No time estimate"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","state","created_at","updated_at"]}},"required":["task"]}`) AddTransferImpactAssessmentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"data_subjects":{"type":"string"},"legal_mechanism":{"type":"string"},"local_law_risk":{"type":"string"},"processing_activity_id":{"type":"string","format":"string"},"supplementary_measures":{"type":"string"},"transfer":{"type":"string"}},"required":["processing_activity_id"]}`) @@ -57,6 +61,8 @@ var ( CreateDraftDocumentVersionToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"document_version":{"type":"object","properties":{"approver_ids":{"type":"array","items":{"type":"string","format":"string"},"description":"Approver IDs"},"changelog":{"type":"string","description":"Changelog"},"classification":{"type":"string","enum":["PUBLIC","INTERNAL","CONFIDENTIAL","SECRET"]},"content":{"type":"string","description":"Document content"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"document_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"organization_id":{"type":"string","format":"string"},"published_at":{"description":"Published timestamp","format":"date-time"},"status":{"type":"string","enum":["DRAFT","PUBLISHED"]},"title":{"type":"string","description":"Document version title"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"},"version_number":{"type":"integer","description":"Version number"}},"required":["id","organization_id","document_id","title","approver_ids","version_number","classification","content","changelog","status","created_at","updated_at"]}},"required":["document_version"]}`) CreateUserToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"additional_email_addresses":{"type":"array","items":{"type":"string","format":"string"},"description":"Additional email addresses"},"contract_end_date":{"description":"Contract end date","format":"date-time"},"contract_start_date":{"description":"Contract start date","format":"date-time"},"email_address":{"type":"string","format":"string"},"full_name":{"type":"string","description":"Full name"},"kind":{"type":"string","enum":["EMPLOYEE","CONTRACTOR","SERVICE_ACCOUNT"]},"organization_id":{"type":"string","format":"string"},"position":{"description":"Position"},"role":{"type":"string","enum":["OWNER","ADMIN","EMPLOYEE","VIEWER","AUDITOR"]}},"required":["organization_id","full_name","email_address","role","kind"]}`) CreateUserToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"user":{"type":"object","properties":{"additional_email_addresses":{"type":"array","items":{"type":"string","format":"string"},"description":"Additional email addresses"},"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"},"email_address":{"type":"string","format":"string"},"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"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","full_name","email_address","additional_email_addresses","kind","created_at","updated_at"]}},"required":["user"]}`) + DeleteApplicabilityStatementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) + DeleteApplicabilityStatementToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_applicability_statement_id":{"type":"string","format":"string"}},"required":["deleted_applicability_statement_id"]}`) DeleteDataProtectionImpactAssessmentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) DeleteDataProtectionImpactAssessmentToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_data_protection_impact_assessment_id":{"type":"string","format":"string"}},"required":["deleted_data_protection_impact_assessment_id"]}`) DeleteDocumentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"document_id":{"type":"string","format":"string"}},"required":["document_id"]}`) @@ -71,10 +77,16 @@ var ( DeleteProcessingActivityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_processing_activity_id":{"type":"string","format":"string"}},"required":["deleted_processing_activity_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"]}`) + DeleteStateOfApplicabilityToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) + DeleteStateOfApplicabilityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_state_of_applicability_id":{"type":"string","format":"string"}},"required":["deleted_state_of_applicability_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"]}`) DeleteTransferImpactAssessmentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) DeleteTransferImpactAssessmentToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"deleted_transfer_impact_assessment_id":{"type":"string","format":"string"}},"required":["deleted_transfer_impact_assessment_id"]}`) + ExportStateOfApplicabilityPDFToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) + ExportStateOfApplicabilityPDFToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"filename":{"type":"string","description":"Suggested filename for the PDF"},"pdf_base64":{"type":"string","description":"Base64-encoded PDF content"}},"required":["pdf_base64","filename"]}`) + GetApplicabilityStatementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) + GetApplicabilityStatementToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"applicability_statement":{"type":"object","properties":{"applicability":{"type":"boolean","description":"Whether the control is applicable"},"control_id":{"type":"string","format":"string"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"justification":{"description":"Justification for the applicability decision","anyOf":[{"type":"string"},{"type":"null"}]},"organization_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"state_of_applicability_id":{"type":"string","format":"string"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","state_of_applicability_id","control_id","organization_id","applicability","created_at","updated_at"]}},"required":["applicability_statement"]}`) GetAssetToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) GetAssetToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"asset":{"type":"object","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"}},"required":["id","organization_id","name","amount","owner_id","asset_type","data_types_stored","created_at","updated_at"]}},"required":["asset"]}`) GetAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) @@ -109,6 +121,8 @@ var ( GetRiskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"risk":{"type":"object","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"}},"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"]}},"required":["risk"]}`) GetSnapshotToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) GetSnapshotToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"snapshot":{"type":"object","properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Snapshot description","anyOf":[{"type":"string","description":"Snapshot description"},{"type":"null","description":"No description"}]},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Snapshot name"},"organization_id":{"type":"string","format":"string"},"type":{"type":"string","enum":["RISKS","VENDORS","ASSETS","DATA","NONCONFORMITIES","OBLIGATIONS","CONTINUAL_IMPROVEMENTS","PROCESSING_ACTIVITIES","STATES_OF_APPLICABILITY"]}},"required":["id","organization_id","name","type","created_at"]}},"required":["snapshot"]}`) + GetStateOfApplicabilityToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) + GetStateOfApplicabilityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"state_of_applicability":{"type":"object","properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"State of applicability name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","owner_id","created_at","updated_at"]}},"required":["state_of_applicability"]}`) GetTaskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) GetTaskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"task":{"type":"object","properties":{"assigned_to_id":{"description":"Assigned to person ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"Not assigned"}]},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"deadline":{"description":"Deadline","anyOf":[{"type":"string","description":"Deadline","format":"date-time"},{"type":"null","description":"No deadline"}]},"description":{"description":"Task description","anyOf":[{"type":"string","description":"Task description"},{"type":"null","description":"No description"}]},"id":{"type":"string","format":"string"},"measure_id":{"description":"Measure ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No measure"}]},"name":{"type":"string","description":"Task name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["TODO","DONE"]},"time_estimate":{"description":"Time estimate","anyOf":[{"type":"string","description":"A duration"},{"type":"null","description":"No time estimate"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","state","created_at","updated_at"]}},"required":["task"]}`) GetTransferImpactAssessmentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"}},"required":["id"]}`) @@ -125,6 +139,8 @@ var ( LinkControlMeasureToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) LinkControlSnapshotToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"control_id":{"type":"string","format":"string"},"snapshot_id":{"type":"string","format":"string"}},"required":["control_id","snapshot_id"]}`) LinkControlSnapshotToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + ListApplicabilityStatementsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"cursor":{"type":"string","format":"string"},"order_by":{"type":"object","properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","CONTROL_SECTION_TITLE"]}},"required":["field","direction"]},"size":{"type":"integer","description":"Page size"},"state_of_applicability_id":{"type":"string","format":"string"}},"required":["state_of_applicability_id"]}`) + ListApplicabilityStatementsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"applicability_statements":{"type":"array","items":{"type":"object","properties":{"applicability":{"type":"boolean","description":"Whether the control is applicable"},"control_id":{"type":"string","format":"string"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"justification":{"description":"Justification for the applicability decision","anyOf":[{"type":"string"},{"type":"null"}]},"organization_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"state_of_applicability_id":{"type":"string","format":"string"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","state_of_applicability_id","control_id","organization_id","applicability","created_at","updated_at"]}},"next_cursor":{"type":"string","format":"string"}},"required":["applicability_statements"]}`) ListAssetsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"cursor":{"type":"string","format":"string"},"filter":{"type":"object","properties":{"snapshot_id":{"type":"string","format":"string"}}},"order_by":{"type":"object","properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","AMOUNT"]}},"required":["field","direction"]},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}},"required":["organization_id"]}`) ListAssetsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"assets":{"type":"array","items":{"type":"object","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"}},"required":["id","organization_id","name","amount","owner_id","asset_type","data_types_stored","created_at","updated_at"]}},"next_cursor":{"type":"string","format":"string"}},"required":["assets"]}`) ListAuditsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"cursor":{"type":"string","format":"string"},"order_by":{"type":"object","properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","VALID_FROM","VALID_UNTIL","STATE"]}},"required":["field","direction"]},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}},"required":["organization_id"]}`) @@ -163,6 +179,8 @@ var ( ListRisksToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"next_cursor":{"type":"string","format":"string"},"risks":{"type":"array","items":{"type":"object","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"}},"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"]}}},"required":["risks"]}`) ListSnapshotsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"cursor":{"type":"string","format":"string"},"order_by":{"type":"object","properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","NAME","TYPE"]}},"required":["field","direction"]},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}},"required":["organization_id"]}`) ListSnapshotsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"next_cursor":{"description":"Next page cursor","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"snapshots":{"type":"array","items":{"type":"object","properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Snapshot description","anyOf":[{"type":"string","description":"Snapshot description"},{"type":"null","description":"No description"}]},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Snapshot name"},"organization_id":{"type":"string","format":"string"},"type":{"type":"string","enum":["RISKS","VENDORS","ASSETS","DATA","NONCONFORMITIES","OBLIGATIONS","CONTINUAL_IMPROVEMENTS","PROCESSING_ACTIVITIES","STATES_OF_APPLICABILITY"]}},"required":["id","organization_id","name","type","created_at"]},"description":"List of snapshots"}},"required":["snapshots"]}`) + ListStatesOfApplicabilityToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"cursor":{"type":"string","format":"string"},"order_by":{"type":"object","properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","NAME"]}},"required":["field","direction"]},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}},"required":["organization_id"]}`) + ListStatesOfApplicabilityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"next_cursor":{"type":"string","format":"string"},"states_of_applicability":{"type":"array","items":{"type":"object","properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"State of applicability name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","owner_id","created_at","updated_at"]}}},"required":["states_of_applicability"]}`) ListTasksToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"cursor":{"type":"string","format":"string"},"measure_id":{"type":"string","format":"string"},"order_by":{"type":"object","properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT"]}},"required":["field","direction"]},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}},"required":["organization_id"]}`) ListTasksToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"next_cursor":{"description":"Next page cursor","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"tasks":{"type":"array","items":{"type":"object","properties":{"assigned_to_id":{"description":"Assigned to person ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"Not assigned"}]},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"deadline":{"description":"Deadline","anyOf":[{"type":"string","description":"Deadline","format":"date-time"},{"type":"null","description":"No deadline"}]},"description":{"description":"Task description","anyOf":[{"type":"string","description":"Task description"},{"type":"null","description":"No description"}]},"id":{"type":"string","format":"string"},"measure_id":{"description":"Measure ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No measure"}]},"name":{"type":"string","description":"Task name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["TODO","DONE"]},"time_estimate":{"description":"Time estimate","anyOf":[{"type":"string","description":"A duration"},{"type":"null","description":"No time estimate"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","state","created_at","updated_at"]},"description":"List of tasks"}},"required":["tasks"]}`) ListTransferImpactAssessmentsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"cursor":{"type":"string","format":"string"},"filter":{"type":"object","properties":{"snapshot_id":{"type":"string","format":"string"}}},"order_by":{"type":"object","properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT"]}},"required":["field","direction"]},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer"}},"required":["organization_id"]}`) @@ -189,6 +207,8 @@ var ( UnlinkControlMeasureToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) UnlinkControlSnapshotToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"control_id":{"type":"string","format":"string"},"snapshot_id":{"type":"string","format":"string"}},"required":["control_id","snapshot_id"]}`) UnlinkControlSnapshotToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object"}`) + UpdateApplicabilityStatementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"applicability":{"type":"boolean","description":"Whether the control is applicable"},"id":{"type":"string","format":"string"},"justification":{"description":"Justification for the applicability decision","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","applicability"]}`) + UpdateApplicabilityStatementToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"applicability_statement":{"type":"object","properties":{"applicability":{"type":"boolean","description":"Whether the control is applicable"},"control_id":{"type":"string","format":"string"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"justification":{"description":"Justification for the applicability decision","anyOf":[{"type":"string"},{"type":"null"}]},"organization_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"state_of_applicability_id":{"type":"string","format":"string"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","state_of_applicability_id","control_id","organization_id","applicability","created_at","updated_at"]}},"required":["applicability_statement"]}`) UpdateAssetToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","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","items":{"type":"string","format":"string"},"description":"Vendor IDs"}},"required":["id"]}`) UpdateAssetToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"asset":{"type":"object","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"}},"required":["id","organization_id","name","amount","owner_id","asset_type","data_types_stored","created_at","updated_at"]}},"required":["asset"]}`) UpdateAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","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"}},"required":["id"]}`) @@ -221,6 +241,8 @@ var ( UpdateProcessingActivityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"processing_activity":{"type":"object","properties":{"consent_evidence_link":{"description":"Consent evidence link"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"data_protection_impact_assessment_needed":{"type":"string","enum":["NEEDED","NOT_NEEDED"]},"data_protection_officer_id":{"description":"Data protection officer profile ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"data_subject_category":{"description":"Data subject category"},"id":{"type":"string","format":"string"},"international_transfers":{"type":"boolean","description":"International transfers"},"last_review_date":{"description":"Last review date","format":"date-time"},"lawful_basis":{"type":"string","enum":["LEGITIMATE_INTEREST","CONSENT","CONTRACTUAL_NECESSITY","LEGAL_OBLIGATION","VITAL_INTERESTS","PUBLIC_TASK"]},"location":{"description":"Location"},"name":{"type":"string","description":"Name"},"next_review_date":{"description":"Next review date","format":"date-time"},"organization_id":{"type":"string","format":"string"},"personal_data_category":{"description":"Personal data category"},"purpose":{"description":"Purpose"},"recipients":{"description":"Recipients"},"retention_period":{"description":"Retention period"},"role":{"type":"string","enum":["CONTROLLER","PROCESSOR"]},"security_measures":{"description":"Security measures"},"special_or_criminal_data":{"type":"string","enum":["YES","NO","POSSIBLE"]},"transfer_impact_assessment_needed":{"type":"string","enum":["NEEDED","NOT_NEEDED"]},"transfer_safeguard":{"description":"Transfer safeguard","anyOf":[{"type":"string","enum":["STANDARD_CONTRACTUAL_CLAUSES","BINDING_CORPORATE_RULES","ADEQUACY_DECISION","DEROGATIONS","CODES_OF_CONDUCT","CERTIFICATION_MECHANISMS"]},{"type":"null"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","special_or_criminal_data","lawful_basis","international_transfers","data_protection_impact_assessment_needed","transfer_impact_assessment_needed","role","created_at","updated_at"]}},"required":["processing_activity"]}`) UpdateRiskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"category":{"type":"string","description":"Risk category"},"description":{"description":"Risk description"},"id":{"type":"string","format":"string"},"inherent_impact":{"type":"integer","description":"Inherent impact"},"inherent_likelihood":{"type":"integer","description":"Inherent likelihood"},"name":{"type":"string","description":"Risk name"},"note":{"type":"string","description":"Risk note"},"owner_id":{"description":"Owner ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"residual_impact":{"type":"integer","description":"Residual impact"},"residual_likelihood":{"type":"integer","description":"Residual likelihood"},"treatment":{"type":"string","enum":["MITIGATED","ACCEPTED","AVOIDED","TRANSFERRED"]}},"required":["id"]}`) UpdateRiskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"risk":{"type":"object","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"}},"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"]}},"required":["risk"]}`) + UpdateStateOfApplicabilityToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"id":{"type":"string","format":"string"},"name":{"type":"string","description":"State of applicability name"},"owner_id":{"type":"string","format":"string"}},"required":["id"]}`) + UpdateStateOfApplicabilityToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"state_of_applicability":{"type":"object","properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"State of applicability name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","owner_id","created_at","updated_at"]}},"required":["state_of_applicability"]}`) UpdateTaskToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"assigned_to_id":{"description":"Assigned to person ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"Not assigned"}]},"deadline":{"description":"Deadline","anyOf":[{"type":"string","description":"Deadline","format":"date-time"},{"type":"null","description":"No deadline"}]},"description":{"description":"Task description"},"id":{"type":"string","format":"string"},"measure_id":{"description":"Measure ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No measure"}]},"name":{"type":"string","description":"Task name"},"state":{"description":"Task state","anyOf":[{"type":"string","enum":["TODO","DONE"]},{"type":"null","description":"No state"}]},"time_estimate":{"description":"Time estimate","anyOf":[{"type":"string","description":"A duration"},{"type":"null","description":"No time estimate"}]}},"required":["id"]}`) UpdateTaskToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"task":{"type":"object","properties":{"assigned_to_id":{"description":"Assigned to person ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"Not assigned"}]},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"deadline":{"description":"Deadline","anyOf":[{"type":"string","description":"Deadline","format":"date-time"},{"type":"null","description":"No deadline"}]},"description":{"description":"Task description","anyOf":[{"type":"string","description":"Task description"},{"type":"null","description":"No description"}]},"id":{"type":"string","format":"string"},"measure_id":{"description":"Measure ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No measure"}]},"name":{"type":"string","description":"Task name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["TODO","DONE"]},"time_estimate":{"description":"Time estimate","anyOf":[{"type":"string","description":"A duration"},{"type":"null","description":"No time estimate"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}},"required":["id","organization_id","name","state","created_at","updated_at"]}},"required":["task"]}`) UpdateTransferImpactAssessmentToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","properties":{"data_subjects":true,"id":{"type":"string","format":"string"},"legal_mechanism":true,"local_law_risk":true,"supplementary_measures":true,"transfer":true},"required":["id"]}`) @@ -531,6 +553,23 @@ func (e VendorCategory) MarshalJSON() ([]byte, error) { return json.Marshal(string(e)) } +// AddApplicabilityStatementInput represents the schema +type AddApplicabilityStatementInput struct { + // Whether the control is applicable + Applicability bool `json:"applicability"` + // Control ID + ControlID gid.GID `json:"control_id"` + // Justification for the applicability decision + Justification *string `json:"justification,omitempty"` + // State of applicability ID + StateOfApplicabilityID gid.GID `json:"state_of_applicability_id"` +} + +// AddApplicabilityStatementOutput represents the schema +type AddApplicabilityStatementOutput struct { + ApplicabilityStatement *ApplicabilityStatement `json:"applicability_statement"` +} + // AddAssetInput represents the schema type AddAssetInput struct { // Asset amount @@ -872,6 +911,21 @@ type AddRiskOutput struct { Risk *Risk `json:"risk"` } +// AddStateOfApplicabilityInput represents the schema +type AddStateOfApplicabilityInput struct { + // State of applicability name + Name string `json:"name"` + // Organization ID + OrganizationID gid.GID `json:"organization_id"` + // Owner profile ID + OwnerID gid.GID `json:"owner_id"` +} + +// AddStateOfApplicabilityOutput represents the schema +type AddStateOfApplicabilityOutput struct { + StateOfApplicability *StateOfApplicability `json:"state_of_applicability"` +} + // AddTaskInput represents the schema type AddTaskInput struct { // Assigned to person ID @@ -959,6 +1013,36 @@ type AddVendorOutput struct { Vendor *Vendor `json:"vendor"` } +// ApplicabilityStatement represents the schema +type ApplicabilityStatement struct { + // Whether the control is applicable + Applicability bool `json:"applicability"` + // Control ID + ControlID gid.GID `json:"control_id"` + // Creation timestamp + CreatedAt time.Time `json:"created_at"` + // Applicability statement ID + ID gid.GID `json:"id"` + // Justification for the applicability decision + Justification *string `json:"justification,omitempty"` + // Organization ID + OrganizationID gid.GID `json:"organization_id"` + // Snapshot ID + SnapshotID *gid.GID `json:"snapshot_id,omitempty"` + // State of applicability ID + StateOfApplicabilityID gid.GID `json:"state_of_applicability_id"` + // Update timestamp + UpdatedAt time.Time `json:"updated_at"` +} + +// ApplicabilityStatementOrderBy represents the schema +type ApplicabilityStatementOrderBy struct { + // Order direction + Direction page.OrderDirection `json:"direction"` + // Applicability statement order field + Field coredata.ApplicabilityStatementOrderField `json:"field"` +} + // Asset represents the schema type Asset struct { // Asset amount @@ -1200,6 +1284,18 @@ type DatumOrderBy struct { Field coredata.DatumOrderField `json:"field"` } +// DeleteApplicabilityStatementInput represents the schema +type DeleteApplicabilityStatementInput struct { + // Applicability statement ID + ID gid.GID `json:"id"` +} + +// DeleteApplicabilityStatementOutput represents the schema +type DeleteApplicabilityStatementOutput struct { + // Deleted applicability statement ID + DeletedApplicabilityStatementID gid.GID `json:"deleted_applicability_statement_id"` +} + // DeleteDataProtectionImpactAssessmentInput represents the schema type DeleteDataProtectionImpactAssessmentInput struct { ID gid.GID `json:"id"` @@ -1282,6 +1378,18 @@ type DeleteRiskOutput struct { DeletedRiskID gid.GID `json:"deleted_risk_id"` } +// DeleteStateOfApplicabilityInput represents the schema +type DeleteStateOfApplicabilityInput struct { + // State of applicability ID + ID gid.GID `json:"id"` +} + +// DeleteStateOfApplicabilityOutput represents the schema +type DeleteStateOfApplicabilityOutput struct { + // Deleted state of applicability ID + DeletedStateOfApplicabilityID gid.GID `json:"deleted_state_of_applicability_id"` +} + // DeleteTaskInput represents the schema type DeleteTaskInput struct { // Task ID @@ -1404,6 +1512,20 @@ type DocumentVersionSignatureOrderBy struct { Field coredata.DocumentVersionSignatureOrderField `json:"field"` } +// ExportStateOfApplicabilityPDFInput represents the schema +type ExportStateOfApplicabilityPDFInput struct { + // State of applicability ID + ID gid.GID `json:"id"` +} + +// ExportStateOfApplicabilityPDFOutput represents the schema +type ExportStateOfApplicabilityPDFOutput struct { + // Suggested filename for the PDF + Filename string `json:"filename"` + // Base64-encoded PDF content + PdfBase64 string `json:"pdf_base64"` +} + // Framework represents the schema type Framework struct { // Creation timestamp @@ -1428,6 +1550,17 @@ type FrameworkOrderBy struct { Field coredata.FrameworkOrderField `json:"field"` } +// GetApplicabilityStatementInput represents the schema +type GetApplicabilityStatementInput struct { + // Applicability statement ID + ID gid.GID `json:"id"` +} + +// GetApplicabilityStatementOutput represents the schema +type GetApplicabilityStatementOutput struct { + ApplicabilityStatement *ApplicabilityStatement `json:"applicability_statement"` +} + // GetAssetInput represents the schema type GetAssetInput struct { // Asset ID @@ -1625,6 +1758,17 @@ type GetSnapshotOutput struct { Snapshot *Snapshot `json:"snapshot"` } +// GetStateOfApplicabilityInput represents the schema +type GetStateOfApplicabilityInput struct { + // State of applicability ID + ID gid.GID `json:"id"` +} + +// GetStateOfApplicabilityOutput represents the schema +type GetStateOfApplicabilityOutput struct { + StateOfApplicability *StateOfApplicability `json:"state_of_applicability"` +} + // GetTaskInput represents the schema type GetTaskInput struct { // Task ID @@ -1719,6 +1863,25 @@ type LinkControlSnapshotInput struct { type LinkControlSnapshotOutput struct { } +// ListApplicabilityStatementsInput represents the schema +type ListApplicabilityStatementsInput struct { + // Page cursor + Cursor *page.CursorKey `json:"cursor,omitempty"` + // Order by + OrderBy *ApplicabilityStatementOrderBy `json:"order_by,omitempty"` + // Page size + Size *int `json:"size,omitempty"` + // State of applicability ID + StateOfApplicabilityID gid.GID `json:"state_of_applicability_id"` +} + +// ListApplicabilityStatementsOutput represents the schema +type ListApplicabilityStatementsOutput struct { + ApplicabilityStatements []*ApplicabilityStatement `json:"applicability_statements"` + // Next cursor + NextCursor *page.CursorKey `json:"next_cursor,omitempty"` +} + // ListAssetsInput represents the schema type ListAssetsInput struct { // Page cursor @@ -2076,6 +2239,25 @@ type ListSnapshotsOutput struct { Snapshots []*Snapshot `json:"snapshots"` } +// ListStatesOfApplicabilityInput represents the schema +type ListStatesOfApplicabilityInput struct { + // Page cursor + Cursor *page.CursorKey `json:"cursor,omitempty"` + // Order by + OrderBy *StateOfApplicabilityOrderBy `json:"order_by,omitempty"` + // Organization ID + OrganizationID gid.GID `json:"organization_id"` + // Page size + Size *int `json:"size,omitempty"` +} + +// ListStatesOfApplicabilityOutput represents the schema +type ListStatesOfApplicabilityOutput struct { + // Next cursor + NextCursor *page.CursorKey `json:"next_cursor,omitempty"` + StatesOfApplicability []*StateOfApplicability `json:"states_of_applicability"` +} + // ListTasksInput represents the schema type ListTasksInput struct { // Page cursor @@ -2513,6 +2695,32 @@ type SnapshotOrderBy struct { Field coredata.SnapshotOrderField `json:"field"` } +// StateOfApplicability represents the schema +type StateOfApplicability struct { + // Creation timestamp + CreatedAt time.Time `json:"created_at"` + // State of applicability ID + ID gid.GID `json:"id"` + // State of applicability name + Name string `json:"name"` + // Organization ID + OrganizationID gid.GID `json:"organization_id"` + // Owner profile ID + OwnerID gid.GID `json:"owner_id"` + // Snapshot ID + SnapshotID *gid.GID `json:"snapshot_id,omitempty"` + // Update timestamp + UpdatedAt time.Time `json:"updated_at"` +} + +// StateOfApplicabilityOrderBy represents the schema +type StateOfApplicabilityOrderBy struct { + // Order direction + Direction page.OrderDirection `json:"direction"` + // State of applicability order field + Field coredata.StateOfApplicabilityOrderField `json:"field"` +} + // TakeSnapshotInput represents the schema type TakeSnapshotInput struct { // Snapshot description @@ -2643,6 +2851,21 @@ type UnlinkControlSnapshotInput struct { type UnlinkControlSnapshotOutput struct { } +// UpdateApplicabilityStatementInput represents the schema +type UpdateApplicabilityStatementInput struct { + // Whether the control is applicable + Applicability bool `json:"applicability"` + // Applicability statement ID + ID gid.GID `json:"id"` + // Justification for the applicability decision + Justification *string `json:"justification,omitempty"` +} + +// UpdateApplicabilityStatementOutput represents the schema +type UpdateApplicabilityStatementOutput struct { + ApplicabilityStatement *ApplicabilityStatement `json:"applicability_statement"` +} + // UpdateAssetInput represents the schema type UpdateAssetInput struct { // Asset amount @@ -3012,6 +3235,21 @@ type UpdateRiskOutput struct { Risk *Risk `json:"risk"` } +// UpdateStateOfApplicabilityInput represents the schema +type UpdateStateOfApplicabilityInput struct { + // State of applicability ID + ID gid.GID `json:"id"` + // State of applicability name + Name *string `json:"name,omitempty"` + // Owner profile ID + OwnerID *gid.GID `json:"owner_id,omitempty"` +} + +// UpdateStateOfApplicabilityOutput represents the schema +type UpdateStateOfApplicabilityOutput struct { + StateOfApplicability *StateOfApplicability `json:"state_of_applicability"` +} + // UpdateTaskInput represents the schema type UpdateTaskInput struct { // Assigned to person ID