diff --git a/pkg/server/api/mcp/v1/schema.resolvers.go b/pkg/server/api/mcp/v1/schema.resolvers.go index de11ff4fc..3572a5a98 100644 --- a/pkg/server/api/mcp/v1/schema.resolvers.go +++ b/pkg/server/api/mcp/v1/schema.resolvers.go @@ -931,6 +931,13 @@ func (r *Resolver) AddContinualImprovementTool(ctx context.Context, req *mcp.Cal ctx, &probo.CreateContinualImprovementRequest{ OrganizationID: input.OrganizationID, + ReferenceID: input.ReferenceID, + Description: input.Description, + Source: input.Source, + OwnerID: input.OwnerID, + TargetDate: input.TargetDate, + Status: input.Status, + Priority: input.Priority, }, ) if err != nil { @@ -968,3 +975,94 @@ func (r *Resolver) UpdateContinualImprovementTool(ctx context.Context, req *mcp. ContinualImprovement: types.NewContinualImprovement(continualImprovement), }, nil } + +func (r *Resolver) ListAuditsTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListAuditsInput) (*mcp.CallToolResult, types.ListAuditsOutput, error) { + r.MustBeAuthorized(ctx, input.OrganizationID, authz.ActionListAudits) + + prb := r.ProboService(ctx, input.OrganizationID) + + pageOrderBy := page.OrderBy[coredata.AuditOrderField]{ + Field: coredata.AuditOrderFieldCreatedAt, + Direction: page.OrderDirectionDesc, + } + if input.OrderBy != nil { + pageOrderBy = page.OrderBy[coredata.AuditOrderField]{ + Field: input.OrderBy.Field, + Direction: input.OrderBy.Direction, + } + } + + cursor := types.NewCursor(input.Size, input.Cursor, pageOrderBy) + + page, err := prb.Audits.ListForOrganizationID(ctx, input.OrganizationID, cursor) + if err != nil { + panic(fmt.Errorf("cannot list organization audits: %w", err)) + } + + return nil, types.NewListAuditsOutput(page), nil +} + +func (r *Resolver) GetAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetAuditInput) (*mcp.CallToolResult, types.GetAuditOutput, error) { + r.MustBeAuthorized(ctx, input.ID, authz.ActionGet) + + prb := r.ProboService(ctx, input.ID) + + audit, err := prb.Audits.Get(ctx, input.ID) + if err != nil { + return nil, types.GetAuditOutput{}, fmt.Errorf("failed to get audit: %w", err) + } + + return nil, types.GetAuditOutput{ + Audit: types.NewAudit(audit), + }, nil +} + +func (r *Resolver) AddAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddAuditInput) (*mcp.CallToolResult, types.AddAuditOutput, error) { + r.MustBeAuthorized(ctx, input.OrganizationID, authz.ActionCreateAudit) + + svc := r.ProboService(ctx, input.OrganizationID) + + audit, err := svc.Audits.Create( + ctx, + &probo.CreateAuditRequest{ + OrganizationID: input.OrganizationID, + Name: input.Name, + ValidFrom: input.ValidFrom, + ValidUntil: input.ValidUntil, + State: input.State, + FrameworkID: input.FrameworkID, + }, + ) + if err != nil { + return nil, types.AddAuditOutput{}, fmt.Errorf("failed to create audit: %w", err) + } + + return nil, types.AddAuditOutput{ + Audit: types.NewAudit(audit), + }, nil +} + +func (r *Resolver) UpdateAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateAuditInput) (*mcp.CallToolResult, types.UpdateAuditOutput, error) { + r.MustBeAuthorized(ctx, input.ID, authz.ActionUpdateAudit) + + svc := r.ProboService(ctx, input.ID) + + audit, err := svc.Audits.Update( + ctx, + &probo.UpdateAuditRequest{ + ID: input.ID, + Name: UnwrapOmittable(input.Name), + ValidFrom: input.ValidFrom, + ValidUntil: input.ValidUntil, + State: input.State, + TrustCenterVisibility: input.TrustCenterVisibility, + }, + ) + if err != nil { + return nil, types.UpdateAuditOutput{}, fmt.Errorf("failed to update audit: %w", err) + } + + return nil, types.UpdateAuditOutput{ + Audit: types.NewAudit(audit), + }, nil +} diff --git a/pkg/server/api/mcp/v1/server/server.go b/pkg/server/api/mcp/v1/server/server.go index c236cae8d..9805a08d1 100644 --- a/pkg/server/api/mcp/v1/server/server.go +++ b/pkg/server/api/mcp/v1/server/server.go @@ -49,6 +49,10 @@ type ResolverInterface interface { GetContinualImprovementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetContinualImprovementInput) (*mcp.CallToolResult, types.GetContinualImprovementOutput, error) AddContinualImprovementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddContinualImprovementInput) (*mcp.CallToolResult, types.AddContinualImprovementOutput, error) UpdateContinualImprovementTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateContinualImprovementInput) (*mcp.CallToolResult, types.UpdateContinualImprovementOutput, error) + ListAuditsTool(ctx context.Context, req *mcp.CallToolRequest, input *types.ListAuditsInput) (*mcp.CallToolResult, types.ListAuditsOutput, error) + GetAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.GetAuditInput) (*mcp.CallToolResult, types.GetAuditOutput, error) + AddAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.AddAuditInput) (*mcp.CallToolResult, types.AddAuditOutput, error) + UpdateAuditTool(ctx context.Context, req *mcp.CallToolRequest, input *types.UpdateAuditInput) (*mcp.CallToolResult, types.UpdateAuditOutput, error) } // New creates a new MCP server instance with all handlers registered. @@ -458,4 +462,44 @@ func registerToolHandlers(server *mcp.Server, resolver ResolverInterface) { }, resolver.UpdateContinualImprovementTool, ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "listAudits", + Description: "List all audits for the organization", + InputSchema: types.ListAuditsToolInputSchema, + OutputSchema: types.ListAuditsToolOutputSchema, + }, + resolver.ListAuditsTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "getAudit", + Description: "Get an audit by ID", + InputSchema: types.GetAuditToolInputSchema, + OutputSchema: types.GetAuditToolOutputSchema, + }, + resolver.GetAuditTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "addAudit", + Description: "Add a new audit to the organization", + InputSchema: types.AddAuditToolInputSchema, + OutputSchema: types.AddAuditToolOutputSchema, + }, + resolver.AddAuditTool, + ) + mcp.AddTool( + server, + &mcp.Tool{ + Name: "updateAudit", + Description: "Update an existing audit", + InputSchema: types.UpdateAuditToolInputSchema, + OutputSchema: types.UpdateAuditToolOutputSchema, + }, + resolver.UpdateAuditTool, + ) } diff --git a/pkg/server/api/mcp/v1/specification.yaml b/pkg/server/api/mcp/v1/specification.yaml index c35a4f918..05d7df95e 100644 --- a/pkg/server/api/mcp/v1/specification.yaml +++ b/pkg/server/api/mcp/v1/specification.yaml @@ -2224,6 +2224,228 @@ components: continual_improvement: $ref: "#/components/schemas/ContinualImprovement" + AuditState: + type: string + enum: + - NOT_STARTED + - IN_PROGRESS + - COMPLETED + - REJECTED + - OUTDATED + go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.AuditState + + TrustCenterVisibility: + type: string + enum: + - NONE + - PRIVATE + - PUBLIC + go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.TrustCenterVisibility + + AuditOrderField: + type: string + enum: + - CREATED_AT + - VALID_FROM + - VALID_UNTIL + - STATE + go.probo.inc/mcpgen/type: go.probo.inc/probo/pkg/coredata.AuditOrderField + + AuditOrderBy: + type: object + required: + - field + - direction + properties: + field: + $ref: "#/components/schemas/AuditOrderField" + description: Audit order field + direction: + $ref: "#/components/schemas/OrderDirection" + description: Audit order direction + + Audit: + type: object + required: + - id + - organization_id + - framework_id + - state + - trust_center_visibility + - created_at + - updated_at + properties: + id: + $ref: "#/components/schemas/GID" + description: Audit ID + organization_id: + $ref: "#/components/schemas/GID" + description: Organization ID + framework_id: + $ref: "#/components/schemas/GID" + description: Framework ID + name: + type: + - string + - "null" + description: Audit name + valid_from: + type: + - string + - "null" + format: date-time + description: Valid from date + valid_until: + type: + - string + - "null" + format: date-time + description: Valid until date + state: + $ref: "#/components/schemas/AuditState" + description: Audit state + trust_center_visibility: + $ref: "#/components/schemas/TrustCenterVisibility" + description: Trust center visibility + created_at: + type: string + format: date-time + description: Creation timestamp + updated_at: + type: string + format: date-time + description: Update timestamp + + ListAuditsInput: + type: object + required: + - organization_id + properties: + organization_id: + $ref: "#/components/schemas/GID" + description: Organization ID + order_by: + $ref: "#/components/schemas/AuditOrderBy" + description: Audit order by + size: + type: integer + description: Page size + cursor: + $ref: "#/components/schemas/CursorKey" + description: Page cursor + + ListAuditsOutput: + type: object + required: + - audits + properties: + next_cursor: + $ref: "#/components/schemas/CursorKey" + description: Next cursor + audits: + type: array + items: + $ref: "#/components/schemas/Audit" + + GetAuditInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: Audit ID + + GetAuditOutput: + type: object + required: + - audit + properties: + audit: + $ref: "#/components/schemas/Audit" + + AddAuditInput: + type: object + required: + - organization_id + - framework_id + properties: + organization_id: + $ref: "#/components/schemas/GID" + description: Organization ID + framework_id: + $ref: "#/components/schemas/GID" + description: Framework ID + name: + type: string + description: Audit name + valid_from: + type: string + format: date-time + description: Valid from date + valid_until: + type: string + format: date-time + description: Valid until date + state: + $ref: "#/components/schemas/AuditState" + description: Audit state + + AddAuditOutput: + type: object + required: + - audit + properties: + audit: + $ref: "#/components/schemas/Audit" + + UpdateAuditInput: + type: object + required: + - id + properties: + id: + $ref: "#/components/schemas/GID" + description: Audit ID + name: + type: ["string", "null"] + description: Audit name + go.probo.inc/mcpgen/omittable: true + valid_from: + type: + - string + - "null" + format: date-time + description: Valid from date + valid_until: + type: + - string + - "null" + format: date-time + description: Valid until date + state: + anyOf: + - $ref: "#/components/schemas/AuditState" + description: Audit state + - type: "null" + description: No state + description: Audit state + trust_center_visibility: + anyOf: + - $ref: "#/components/schemas/TrustCenterVisibility" + description: Trust center visibility + - type: "null" + description: No trust center visibility + description: Trust center visibility + + UpdateAuditOutput: + type: object + required: + - audit + properties: + audit: + $ref: "#/components/schemas/Audit" + tools: - name: listOrganizations description: List all organizations the user has access to @@ -2498,3 +2720,31 @@ tools: $ref: "#/components/schemas/UpdateContinualImprovementInput" outputSchema: $ref: "#/components/schemas/UpdateContinualImprovementOutput" + - name: listAudits + description: List all audits for the organization + readonly: true + inputSchema: + $ref: "#/components/schemas/ListAuditsInput" + outputSchema: + $ref: "#/components/schemas/ListAuditsOutput" + - name: getAudit + description: Get an audit by ID + readonly: true + inputSchema: + $ref: "#/components/schemas/GetAuditInput" + outputSchema: + $ref: "#/components/schemas/GetAuditOutput" + - name: addAudit + description: Add a new audit to the organization + readonly: false + inputSchema: + $ref: "#/components/schemas/AddAuditInput" + outputSchema: + $ref: "#/components/schemas/AddAuditOutput" + - name: updateAudit + description: Update an existing audit + readonly: false + inputSchema: + $ref: "#/components/schemas/UpdateAuditInput" + outputSchema: + $ref: "#/components/schemas/UpdateAuditOutput" diff --git a/pkg/server/api/mcp/v1/types/audit.go b/pkg/server/api/mcp/v1/types/audit.go new file mode 100644 index 000000000..27ea97fc7 --- /dev/null +++ b/pkg/server/api/mcp/v1/types/audit.go @@ -0,0 +1,53 @@ +// 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. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package types + +import ( + "go.probo.inc/probo/pkg/coredata" + "go.probo.inc/probo/pkg/page" +) + +func NewAudit(a *coredata.Audit) *Audit { + return &Audit{ + ID: a.ID, + Name: a.Name, + OrganizationID: a.OrganizationID, + FrameworkID: a.FrameworkID, + State: a.State, + TrustCenterVisibility: a.TrustCenterVisibility, + ValidFrom: a.ValidFrom, + ValidUntil: a.ValidUntil, + CreatedAt: a.CreatedAt, + UpdatedAt: a.UpdatedAt, + } +} + +func NewListAuditsOutput(auditPage *page.Page[*coredata.Audit, coredata.AuditOrderField]) ListAuditsOutput { + audits := make([]*Audit, 0, len(auditPage.Data)) + for _, v := range auditPage.Data { + audits = append(audits, NewAudit(v)) + } + + var nextCursor *page.CursorKey + if len(auditPage.Data) > 0 { + cursorKey := auditPage.Data[len(auditPage.Data)-1].CursorKey(auditPage.Cursor.OrderBy.Field) + nextCursor = &cursorKey + } + + return ListAuditsOutput{ + NextCursor: nextCursor, + Audits: audits, + } +} diff --git a/pkg/server/api/mcp/v1/types/types.go b/pkg/server/api/mcp/v1/types/types.go index 5a77c3a13..f52a42c96 100644 --- a/pkg/server/api/mcp/v1/types/types.go +++ b/pkg/server/api/mcp/v1/types/types.go @@ -14,7 +14,9 @@ import ( var ( AddAssetToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id","name","amount","owner_id","asset_type","data_types_stored"],"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","description":"Vendor IDs","items":{"type":"string","format":"string"}}}}`) AddAssetToolOutputSchema = 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"}}}}}`) - AddContinualImprovementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id","reference_id","owner_id","status","priority"],"properties":{"description":{"type":"string","description":"Description"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH"]},"reference_id":{"type":"string","description":"Reference ID"},"source":{"type":"string","description":"Source"},"status":{"type":"string","enum":["OPEN","IN_PROGRESS","CLOSED"]},"target_date":{"type":"string","description":"Target date","format":"date-time"}}}`) + AddAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id","framework_id"],"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"}}}`) + AddAuditToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["audit"],"properties":{"audit":{"type":"object","required":["id","organization_id","framework_id","state","trust_center_visibility","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"framework_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"name":{"description":"Audit name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["NOT_STARTED","IN_PROGRESS","COMPLETED","REJECTED","OUTDATED"]},"trust_center_visibility":{"type":"string","enum":["NONE","PRIVATE","PUBLIC"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"},"valid_from":{"description":"Valid from date","format":"date-time"},"valid_until":{"description":"Valid until date","format":"date-time"}}}}}`) + AddContinualImprovementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id","reference_id","owner_id"],"properties":{"description":{"type":"string","description":"Description"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"priority":{"description":"Priority","anyOf":[{"type":"string","enum":["LOW","MEDIUM","HIGH"]},{"type":"null","description":"No priority"}]},"reference_id":{"type":"string","description":"Reference ID"},"source":{"type":"string","description":"Source"},"status":{"description":"Status","anyOf":[{"type":"string","enum":["OPEN","IN_PROGRESS","CLOSED"]},{"type":"null","description":"No status"}]},"target_date":{"type":"string","description":"Target date","format":"date-time"}}}`) AddContinualImprovementToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["continual_improvement"],"properties":{"continual_improvement":{"type":"object","required":["id","organization_id","reference_id","owner_id","status","priority","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Description"},"id":{"type":"string","format":"string"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH"]},"reference_id":{"type":"string","description":"Reference ID"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No snapshot"}]},"source":{"description":"Source"},"source_id":{"description":"Source ID"},"status":{"type":"string","enum":["OPEN","IN_PROGRESS","CLOSED"]},"target_date":{"description":"Target date","format":"date-time"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}`) AddDatumToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id","name","data_classification","owner_id"],"properties":{"data_classification":{"type":"string","enum":["PUBLIC","INTERNAL","CONFIDENTIAL","SECRET"]},"name":{"type":"string","description":"Datum name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"vendor_ids":{"type":"array","description":"Vendor IDs","items":{"type":"string","format":"string"}}}}`) AddDatumToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["datum"],"properties":{"datum":{"type":"object","required":["id","organization_id","name","data_classification","owner_id","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"data_classification":{"type":"string","enum":["PUBLIC","INTERNAL","CONFIDENTIAL","SECRET"]},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Datum 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","description":"No snapshot"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}`) @@ -34,6 +36,8 @@ var ( AddVendorToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["vendor"],"properties":{"vendor":{"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"}}}}}`) GetAssetToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"string"}}}`) GetAssetToolOutputSchema = 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"}}}}}`) + GetAuditToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"string"}}}`) + GetAuditToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["audit"],"properties":{"audit":{"type":"object","required":["id","organization_id","framework_id","state","trust_center_visibility","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"framework_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"name":{"description":"Audit name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["NOT_STARTED","IN_PROGRESS","COMPLETED","REJECTED","OUTDATED"]},"trust_center_visibility":{"type":"string","enum":["NONE","PRIVATE","PUBLIC"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"},"valid_from":{"description":"Valid from date","format":"date-time"},"valid_until":{"description":"Valid until date","format":"date-time"}}}}}`) GetContinualImprovementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"string"}}}`) GetContinualImprovementToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["continual_improvement"],"properties":{"continual_improvement":{"type":"object","required":["id","organization_id","reference_id","owner_id","status","priority","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Description"},"id":{"type":"string","format":"string"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH"]},"reference_id":{"type":"string","description":"Reference ID"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No snapshot"}]},"source":{"description":"Source"},"source_id":{"description":"Source ID"},"status":{"type":"string","enum":["OPEN","IN_PROGRESS","CLOSED"]},"target_date":{"description":"Target date","format":"date-time"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}`) GetDatumToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"string"}}}`) @@ -52,6 +56,8 @@ var ( 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"}}}}}`) 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"}}}`) + ListAuditsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["audits"],"properties":{"audits":{"type":"array","items":{"type":"object","required":["id","organization_id","framework_id","state","trust_center_visibility","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"framework_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"name":{"description":"Audit name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["NOT_STARTED","IN_PROGRESS","COMPLETED","REJECTED","OUTDATED"]},"trust_center_visibility":{"type":"string","enum":["NONE","PRIVATE","PUBLIC"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"},"valid_from":{"description":"Valid from date","format":"date-time"},"valid_until":{"description":"Valid until date","format":"date-time"}}}},"next_cursor":{"type":"string","format":"string"}}}`) ListContinualImprovementsToolInputSchema = 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","REFERENCE_ID","TARGET_DATE","STATUS","PRIORITY"]}}},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}}}`) ListContinualImprovementsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["continual_improvements"],"properties":{"continual_improvements":{"type":"array","items":{"type":"object","required":["id","organization_id","reference_id","owner_id","status","priority","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Description"},"id":{"type":"string","format":"string"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH"]},"reference_id":{"type":"string","description":"Reference ID"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No snapshot"}]},"source":{"description":"Source"},"source_id":{"description":"Source ID"},"status":{"type":"string","enum":["OPEN","IN_PROGRESS","CLOSED"]},"target_date":{"description":"Target date","format":"date-time"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}},"next_cursor":{"type":"string","format":"string"}}}`) ListDataToolInputSchema = 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","NAME","DATA_CLASSIFICATION"]}}},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}}}`) @@ -74,6 +80,8 @@ var ( 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"}}}}}}`) 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"}}}`) + UpdateAuditToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["audit"],"properties":{"audit":{"type":"object","required":["id","organization_id","framework_id","state","trust_center_visibility","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"framework_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"name":{"description":"Audit name"},"organization_id":{"type":"string","format":"string"},"state":{"type":"string","enum":["NOT_STARTED","IN_PROGRESS","COMPLETED","REJECTED","OUTDATED"]},"trust_center_visibility":{"type":"string","enum":["NONE","PRIVATE","PUBLIC"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"},"valid_from":{"description":"Valid from date","format":"date-time"},"valid_until":{"description":"Valid until date","format":"date-time"}}}}}`) UpdateContinualImprovementToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"description":{"description":"Description"},"id":{"type":"string","format":"string"},"owner_id":{"description":"Owner ID","anyOf":[{"type":"string","format":"string"},{"type":"null"}]},"priority":{"description":"Priority","anyOf":[{"type":"string","enum":["LOW","MEDIUM","HIGH"]},{"type":"null","description":"No priority"}]},"reference_id":{"type":"string","description":"Reference ID"},"source":{"description":"Source"},"status":{"description":"Status","anyOf":[{"type":"string","enum":["OPEN","IN_PROGRESS","CLOSED"]},{"type":"null","description":"No status"}]},"target_date":{"description":"Target date","format":"date-time"}}}`) UpdateContinualImprovementToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["continual_improvement"],"properties":{"continual_improvement":{"type":"object","required":["id","organization_id","reference_id","owner_id","status","priority","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Description"},"id":{"type":"string","format":"string"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH"]},"reference_id":{"type":"string","description":"Reference ID"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No snapshot"}]},"source":{"description":"Source"},"source_id":{"description":"Source ID"},"status":{"type":"string","enum":["OPEN","IN_PROGRESS","CLOSED"]},"target_date":{"description":"Target date","format":"date-time"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}}}`) UpdateDatumToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["id"],"properties":{"data_classification":{"type":"string","enum":["PUBLIC","INTERNAL","CONFIDENTIAL","SECRET"]},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Datum 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"}}}}`) @@ -115,6 +123,27 @@ type AddAssetOutput struct { Asset *Asset `json:"asset"` } +// AddAuditInput represents the schema +type AddAuditInput struct { + // Framework ID + FrameworkID gid.GID `json:"framework_id"` + // Audit name + Name *string `json:"name,omitempty"` + // Organization ID + OrganizationID gid.GID `json:"organization_id"` + // Audit state + State *coredata.AuditState `json:"state,omitempty"` + // Valid from date + ValidFrom *time.Time `json:"valid_from,omitempty"` + // Valid until date + ValidUntil *time.Time `json:"valid_until,omitempty"` +} + +// AddAuditOutput represents the schema +type AddAuditOutput struct { + Audit *Audit `json:"audit"` +} + // AddContinualImprovementInput represents the schema type AddContinualImprovementInput struct { // Description @@ -124,13 +153,13 @@ type AddContinualImprovementInput struct { // Owner ID OwnerID gid.GID `json:"owner_id"` // Priority - Priority coredata.ContinualImprovementPriority `json:"priority"` + Priority *coredata.ContinualImprovementPriority `json:"priority,omitempty"` // Reference ID ReferenceID string `json:"reference_id"` // Source Source *string `json:"source,omitempty"` // Status - Status coredata.ContinualImprovementStatus `json:"status"` + Status *coredata.ContinualImprovementStatus `json:"status,omitempty"` // Target date TargetDate *time.Time `json:"target_date,omitempty"` } @@ -358,6 +387,38 @@ type AssetOrderBy struct { Field coredata.AssetOrderField `json:"field"` } +// Audit represents the schema +type Audit struct { + // Creation timestamp + CreatedAt time.Time `json:"created_at"` + // Framework ID + FrameworkID gid.GID `json:"framework_id"` + // Audit ID + ID gid.GID `json:"id"` + // Audit name + Name *string `json:"name,omitempty"` + // Organization ID + OrganizationID gid.GID `json:"organization_id"` + // Audit state + State coredata.AuditState `json:"state"` + // Trust center visibility + TrustCenterVisibility coredata.TrustCenterVisibility `json:"trust_center_visibility"` + // Update timestamp + UpdatedAt time.Time `json:"updated_at"` + // Valid from date + ValidFrom *time.Time `json:"valid_from,omitempty"` + // Valid until date + ValidUntil *time.Time `json:"valid_until,omitempty"` +} + +// AuditOrderBy represents the schema +type AuditOrderBy struct { + // Audit order direction + Direction page.OrderDirection `json:"direction"` + // Audit order field + Field coredata.AuditOrderField `json:"field"` +} + // ContinualImprovement represents the schema type ContinualImprovement struct { // Creation timestamp @@ -459,6 +520,17 @@ type GetAssetOutput struct { Asset *Asset `json:"asset"` } +// GetAuditInput represents the schema +type GetAuditInput struct { + // Audit ID + ID gid.GID `json:"id"` +} + +// GetAuditOutput represents the schema +type GetAuditOutput struct { + Audit *Audit `json:"audit"` +} + // GetContinualImprovementInput represents the schema type GetContinualImprovementInput struct { // Continual improvement ID @@ -567,6 +639,25 @@ type ListAssetsOutput struct { NextCursor *page.CursorKey `json:"next_cursor,omitempty"` } +// ListAuditsInput represents the schema +type ListAuditsInput struct { + // Page cursor + Cursor *page.CursorKey `json:"cursor,omitempty"` + // Audit order by + OrderBy *AuditOrderBy `json:"order_by,omitempty"` + // Organization ID + OrganizationID gid.GID `json:"organization_id"` + // Page size + Size *int `json:"size,omitempty"` +} + +// ListAuditsOutput represents the schema +type ListAuditsOutput struct { + Audits []*Audit `json:"audits"` + // Next cursor + NextCursor *page.CursorKey `json:"next_cursor,omitempty"` +} + // ListContinualImprovementsInput represents the schema type ListContinualImprovementsInput struct { // Page cursor @@ -983,6 +1074,27 @@ type UpdateAssetOutput struct { Asset *Asset `json:"asset"` } +// UpdateAuditInput represents the schema +type UpdateAuditInput struct { + // Audit ID + ID gid.GID `json:"id"` + // Audit name + Name mcp.Omittable[*string] `json:"name,omitempty"` + // Audit state + State *coredata.AuditState `json:"state,omitempty"` + // Trust center visibility + TrustCenterVisibility *coredata.TrustCenterVisibility `json:"trust_center_visibility,omitempty"` + // Valid from date + ValidFrom *time.Time `json:"valid_from,omitempty"` + // Valid until date + ValidUntil *time.Time `json:"valid_until,omitempty"` +} + +// UpdateAuditOutput represents the schema +type UpdateAuditOutput struct { + Audit *Audit `json:"audit"` +} + // UpdateContinualImprovementInput represents the schema type UpdateContinualImprovementInput struct { // Description