using PostFundManagement.Application.Abstractions.Services; using PostFundManagement.Application.Extensions; using PostFundManagement.Application.Services.Projects; using PostFundManagement.Domain; using PostFundManagement.Domain.Models; namespace PostFundManagement.Application.Mcp; /// /// MCP tools proxying Project & Programme Management Services (M04 WBS/Activities, M07 Milestones, M10 Compliance, M13 Beneficiaries, M15 Change Control, M16 Issues, M17 Site Visits). /// [McpServerToolType] public class ProjectsMcpTools(IProjectService service) { [McpServerTool(Name = "projects_get_projects", Title = "Get Projects", ReadOnly = true)] [Description("Retrieves a paginated list of funded projects (Module M04).")] public async Task> GetProjectsAsync([Description("Page index (1-based)")] int page = 1, [Description("Page size (1-100)")] int pageSize = 50, CancellationToken cancellationToken = default) => (await service.GetProjectsAsync(new Pagination(page, pageSize), cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_project", Title = "Get Project by ID", ReadOnly = true)] [Description("Retrieves comprehensive details of a project by its hash identifier.")] public async Task> GetProjectAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetProjectAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_project", Title = "Create Project", Destructive = false)] [Description("Creates and initializes a funded project under an active award/programme (Module M04).")] public async Task CreateProjectAsync([Description("Project creation request")] CreateProjectRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateProjectAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Project successfully created."); [McpServerTool(Name = "projects_update_project", Title = "Update Project", Destructive = false)] [Description("Updates project baseline configuration, scope, and objectives.")] public async Task UpdateProjectAsync([Description("Project update request")] UpdateProjectRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.UpdateProjectAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Project details successfully updated."); [McpServerTool(Name = "projects_update_project_status", Title = "Update Project Status", Destructive = false)] [Description("Transitions a project's lifecycle status (e.g. Inception, Active, Under Review, Closeout, Completed).")] public async Task UpdateProjectStatusAsync([Description("Status update request")] UpdateProjectStatusRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.UpdateProjectStatusAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult("Project status successfully updated."); [McpServerTool(Name = "projects_get_programmes", Title = "Get Funding Programmes", ReadOnly = true)] [Description("Retrieves a paginated list of overarching funding programmes.")] public async Task> GetProgrammesAsync([Description("Page index (1-based)")] int page = 1, [Description("Page size (1-100)")] int pageSize = 50, CancellationToken cancellationToken = default) => (await service.GetProgrammesAsync(new Pagination(page, pageSize), cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_programme", Title = "Get Programme by ID", ReadOnly = true)] [Description("Retrieves details of a funding programme by its hash identifier.")] public async Task> GetProgrammeAsync([Description("Programme hash identifier")] string programmeIdHash, CancellationToken cancellationToken = default) => (await service.GetProgrammeAsync(programmeIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_programme", Title = "Create Programme", Destructive = false)] [Description("Creates a new funding programme governing awards and portfolios.")] public async Task CreateProgrammeAsync([Description("Programme creation parameters")] CreateProgrammeRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateProgrammeAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_update_programme", Title = "Update Programme", Destructive = false)] [Description("Updates details of an existing funding programme.")] public async Task UpdateProgrammeAsync([Description("Programme update parameters")] UpdateProgrammeRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.UpdateProgrammeAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_programme_projects", Title = "Get Projects by Programme", ReadOnly = true)] [Description("Retrieves all projects associated with a given funding programme.")] public async Task> GetProgrammeProjectsAsync([Description("Programme hash identifier")] string programmeIdHash, CancellationToken cancellationToken = default) => (await service.GetProgrammeProjectsAsync(programmeIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_activities", Title = "Get Project Activities", ReadOnly = true)] [Description("Retrieves the work breakdown structure (WBS) activities for a project.")] public async Task> GetActivitiesAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetActivitiesAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_activity", Title = "Get Activity by ID", ReadOnly = true)] [Description("Retrieves details of a project activity by its hash identifier.")] public async Task> GetActivityAsync([Description("Activity hash identifier")] string activityIdHash, CancellationToken cancellationToken = default) => (await service.GetActivityAsync(activityIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_activity", Title = "Create Project Activity", Destructive = false)] [Description("Creates a new work breakdown structure (WBS) activity under a project.")] public async Task CreateActivityAsync([Description("Activity creation request")] CreateActivityRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateActivityAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_update_activity", Title = "Update Project Activity", Destructive = false)] [Description("Updates progress, timeline, and status of a project activity.")] public async Task UpdateActivityAsync([Description("Activity update request")] UpdateActivityRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.UpdateActivityAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_project_milestones", Title = "Get Project Milestones", ReadOnly = true)] [Description("Retrieves all delivery and disbursement gating milestones for a project (Module M07).")] public async Task> GetProjectMilestonesAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetProjectMilestonesAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_milestones", Title = "Get All Milestones", ReadOnly = true)] [Description("Retrieves a paginated list of milestones across the portfolio.")] public async Task> GetMilestonesAsync([Description("Page index (1-based)")] int page = 1, [Description("Page size (1-100)")] int pageSize = 50, CancellationToken cancellationToken = default) => (await service.GetMilestonesAsync(new Pagination(page, pageSize), cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_milestone", Title = "Get Milestone by ID", ReadOnly = true)] [Description("Retrieves details of a project milestone by its hash identifier.")] public async Task> GetMilestoneAsync([Description("Milestone hash identifier")] string milestoneIdHash, CancellationToken cancellationToken = default) => (await service.GetMilestoneAsync(milestoneIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_update_milestone", Title = "Update Milestone", Destructive = false)] [Description("Updates milestone progress, delivery dates, verification status, and completion state.")] public async Task UpdateMilestoneAsync([Description("Milestone update request")] UpdateMilestoneRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.UpdateMilestoneAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_project_risks", Title = "Get Project Risks", ReadOnly = true)] [Description("Retrieves risk register items specifically identified for a project.")] public async Task> GetProjectRisksAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetProjectRisksAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_project_indicators", Title = "Get Project Indicators", ReadOnly = true)] [Description("Retrieves M&E performance indicators configured for a project (Module M08).")] public async Task> GetProjectIndicatorsAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetProjectIndicatorsAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_beneficiaries", Title = "Get Beneficiaries", ReadOnly = true)] [Description("Retrieves POPIA-compliant beneficiary demographic records for a project (Module M13).")] public async Task> GetBeneficiariesAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetBeneficiariesAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_beneficiary", Title = "Register Beneficiary Group", Destructive = false)] [Description("Registers reach and demographic beneficiary data for a project (Module M13).")] public async Task CreateBeneficiaryAsync([Description("Beneficiary registration request")] CreateBeneficiaryRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateBeneficiaryAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_change_requests", Title = "Get Change Requests", ReadOnly = true)] [Description("Retrieves project scope, timeline, and budget change requests (Module M15).")] public async Task> GetChangeRequestsAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetChangeRequestsAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_change_request", Title = "Submit Change Request", Destructive = false)] [Description("Submits a formal change request for project scope, budget, or timeline amendment.")] public async Task CreateChangeRequestAsync([Description("Change request details")] CreateChangeRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateChangeRequestAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_compliance_items", Title = "Get Compliance Items", ReadOnly = true)] [Description("Retrieves statutory, tax, and ESG compliance checklist items for a project (Module M10).")] public async Task> GetComplianceItemsAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetComplianceItemsAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_compliance_item", Title = "Create Compliance Item", Destructive = false)] [Description("Creates a compliance or statutory requirement item for monitoring.")] public async Task CreateComplianceItemAsync([Description("Compliance item details")] CreateComplianceItemRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateComplianceItemAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_issues", Title = "Get Project Issues", ReadOnly = true)] [Description("Retrieves operational issue log items and blockers for a project (Module M16).")] public async Task> GetIssuesAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetIssuesAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_issue", Title = "Log Issue", Destructive = false)] [Description("Logs an operational issue or bottleneck against a project for management tracking.")] public async Task CreateIssueAsync([Description("Issue log request")] CreateIssueRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateIssueAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_get_site_visits", Title = "Get Site Visits", ReadOnly = true)] [Description("Retrieves scheduled and completed physical or virtual monitoring site visits (Module M17).")] public async Task> GetSiteVisitsAsync([Description("Project hash identifier")] string projectIdHash, CancellationToken cancellationToken = default) => (await service.GetSiteVisitsAsync(projectIdHash, cancellationToken)).ToMcpResult(); [McpServerTool(Name = "projects_create_site_visit", Title = "Schedule Site Visit", Destructive = false)] [Description("Schedules an in-person or remote monitoring site inspection for milestone verification.")] public async Task CreateSiteVisitAsync([Description("Site visit schedule request")] CreateSiteVisitRequest request, [Description("Optional acting user ID; defaults to System user if omitted")] Guid? userId = null, CancellationToken cancellationToken = default) => (await service.CreateSiteVisitAsync(request, userId ?? SystemUser, cancellationToken)).ToMcpResult(); }