Added MCp support
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// MCP tools proxying Project & Programme Management Services (M04 WBS/Activities, M07 Milestones, M10 Compliance, M13 Beneficiaries, M15 Change Control, M16 Issues, M17 Site Visits).
|
||||
/// </summary>
|
||||
[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<Records<Project[]>> 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<Records<Project>> 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<McpToolResult> 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<McpToolResult> 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<McpToolResult> 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<Records<Programme[]>> 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<Records<Programme>> 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<McpToolResult> 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<McpToolResult> 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<Records<Project[]>> 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<Records<Domain.Models.Activity[]>> 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<Records<Domain.Models.Activity>> 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<McpToolResult> 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<McpToolResult> 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<Records<Milestone[]>> 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<Records<Milestone[]>> 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<Records<Milestone>> 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<McpToolResult> 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<Records<Risk[]>> 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<Records<Indicator[]>> 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<Records<Beneficiary[]>> 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<McpToolResult> 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<Records<ChangeRequest[]>> 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<McpToolResult> 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<Records<ComplianceItem[]>> 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<McpToolResult> 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<Records<Issue[]>> 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<McpToolResult> 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<Records<SiteVisit[]>> 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<McpToolResult> 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();
|
||||
}
|
||||
Reference in New Issue
Block a user