using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Execution; using PostFundManagement.Domain; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Mcp; /// /// MCP tools proxying Execution Services (M06 Disbursement Control, M09 Risk Management, Gating Rules BR-003). /// [McpServerToolType] public class ExecutionMcpTools(IExecutionService service) { [McpServerTool(Name = "execution_get_disbursements", Title = "Get Disbursements", ReadOnly = true)] [Description("Retrieves a paginated list of disbursement tranche and drawdown records (Module M06).")] public async Task> GetDisbursementsAsync([Description("Page index (1-based)")] int page = 1, [Description("Page size (1-100)")] int pageSize = 50, CancellationToken cancellationToken = default) => (await service.GetDisbursementsAsync(new Pagination(page, pageSize), cancellationToken)).ToMcpResult(); [McpServerTool(Name = "execution_get_disbursement", Title = "Get Disbursement by ID", ReadOnly = true)] [Description("Retrieves details of a disbursement request by its hash identifier.")] public async Task> GetDisbursementAsync([Description("Disbursement hash identifier")] string disbursementIdHash, CancellationToken cancellationToken = default) => (await service.GetDisbursementAsync(disbursementIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "execution_create_disbursement", Title = "Create Disbursement Request", Destructive = false)] [Description("Submits a drawdown / payment disbursement request linked to a satisfied milestone (BR-003, Module M06).")] public async Task CreateDisbursementAsync([Description("Disbursement request details")] CreateDisbursementRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateDisbursementAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Disbursement request successfully created."); [McpServerTool(Name = "execution_approve_disbursement", Title = "Approve Disbursement", Destructive = false)] [Description("Formally approves release of funds for a disbursement tranche after verifying milestone evidence and conditions precedent (BR-003, AT-03).")] public async Task ApproveDisbursementAsync([Description("Disbursement hash identifier")] string disbursementIdHash, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.ApproveDisbursementAsync(disbursementIdHash, userId ?? SystemUser, cancellationToken)).ToMcpResult("Disbursement tranche successfully approved for release."); [McpServerTool(Name = "execution_update_disbursement", Title = "Update Disbursement", Destructive = false)] [Description("Updates metadata, bank payment references, or status of a disbursement tranche.")] public async Task UpdateDisbursementAsync([Description("Disbursement update request")] UpdateDisbursementRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.UpdateDisbursementAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Disbursement record successfully updated."); [McpServerTool(Name = "execution_get_risks", Title = "Get Risk Register", ReadOnly = true)] [Description("Retrieves a paginated list of risks identified across portfolio projects (Module M09).")] public async Task> GetRisksAsync([Description("Page index (1-based)")] int page = 1, [Description("Page size (1-100)")] int pageSize = 50, CancellationToken cancellationToken = default) => (await service.GetRisksAsync(new Pagination(page, pageSize), cancellationToken)).ToMcpResult(); [McpServerTool(Name = "execution_get_risk", Title = "Get Risk by ID", ReadOnly = true)] [Description("Retrieves details of a project risk, including likelihood, impact, score, and mitigations.")] public async Task> GetRiskAsync([Description("Risk hash identifier")] string riskIdHash, CancellationToken cancellationToken = default) => (await service.GetRiskAsync(riskIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "execution_create_risk", Title = "Log Risk", Destructive = false)] [Description("Logs a new risk event with likelihood, severity, residual risk, and mitigation action plan (Module M09).")] public async Task CreateRiskAsync([Description("Risk log request")] CreateRiskRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateRiskAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Risk record successfully created."); [McpServerTool(Name = "execution_update_risk", Title = "Update Risk & Mitigation", Destructive = false)] [Description("Updates a risk's assessment score, status, or mitigation progress.")] public async Task UpdateRiskAsync([Description("Risk update parameters")] UpdateRiskRequest request, CancellationToken cancellationToken = default) => (await service.UpdateRiskAsync(request, cancellationToken)).ToMcpResult("Risk record successfully updated."); [McpServerTool(Name = "execution_get_rules", Title = "Get Gating Rules", ReadOnly = true)] [Description("Retrieves configurable gating and compliance validation rules (Module M06 / BR-003).")] public async Task> GetRulesAsync([Description("Page index (1-based)")] int page = 1, [Description("Page size (1-100)")] int pageSize = 50, CancellationToken cancellationToken = default) => (await service.GetRulesAsync(new Pagination(page, pageSize), cancellationToken)).ToMcpResult(); [McpServerTool(Name = "execution_get_rule", Title = "Get Rule by ID", ReadOnly = true)] [Description("Retrieves details of a gating validation rule by hash identifier.")] public async Task> GetRuleAsync([Description("Rule hash identifier")] string ruleIdHash, CancellationToken cancellationToken = default) => (await service.GetRuleAsync(ruleIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "execution_create_rule", Title = "Create Gating Rule", Destructive = false)] [Description("Defines a new business or compliance gating rule governing disbursement release.")] public async Task CreateRuleAsync([Description("Rule creation request")] CreateRuleRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateRuleAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Gating rule successfully created."); [McpServerTool(Name = "execution_update_rule", Title = "Update Gating Rule", Destructive = false)] [Description("Updates the logic or parameters of an existing gating rule.")] public async Task UpdateRuleAsync([Description("Rule update request")] UpdateRuleRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.UpdateRuleAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Gating rule successfully updated."); }