80 lines
7.7 KiB
C#
80 lines
7.7 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// MCP tools proxying Execution Services (M06 Disbursement Control, M09 Risk Management, Gating Rules BR-003).
|
|
/// </summary>
|
|
[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<Records<Disbursement[]>> 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<Records<Disbursement>> 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<McpToolResult> 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<McpToolResult> 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<McpToolResult> 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<Records<Risk[]>> 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<Records<Risk>> 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<McpToolResult> 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<McpToolResult> 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<Records<Rule[]>> 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<Records<Rule>> 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<McpToolResult> 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<McpToolResult> 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.");
|
|
}
|