ITM Platform MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | HTTP listen port for self-hosted HTTP server | |
| ITM_TOKEN | No | Alternative authentication token (used instead of API key) | |
| LOG_LEVEL | No | Pino log level: debug, info, warn, error | |
| ITM_UI_URL | No | Optional ITM Platform UI base URL, enables deep links in responses | |
| ITM_API_KEY | No | Your personal API key from ITM Platform | |
| ITM_API_URL | No | The ITM Platform API gateway URL | |
| ITM_COMPANY | No | Your company/account slug | |
| ITM_AUTH_URL | No | OAuth authorization server URL for token exchange (self-hosted HTTP) | |
| MCP_SERVER_URL | No | Public MCP server URL used as the OAuth audience (self-hosted HTTP) | |
| ITM_AUDIT_ENABLED | No | Enables server-side audit logging when set to 'true' | |
| ITM_AUTH_PUBLIC_URL | No | Public OAuth URL advertised to AI clients (self-hosted HTTP) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_projectsA | Find projects by name, status, type, or date range. Returns id, name, status, progress, dates, managers. Filterable fields: name, statusLabel, customTypeLabel, startDate, endDate. |
| get_projectA | Get project details by ID with subcomponent counts. Budget can be included via include: ["budget"]. For tasks, risks, issues, purchases, and revenues use the dedicated tools: list_project_tasks, get_project_risks, get_project_issues, get_project_purchases, get_project_revenues. |
| search_servicesB | Find services by name, status, type, or date range. Same query shape as search_projects but for services. |
| get_serviceA | Get service details by ID with subcomponent counts. Budget can be included via include: ["budget"]. For activities, purchases, and revenues use the dedicated tools: list_service_activities, get_service_purchases, get_service_revenues. |
| list_service_activitiesA | List activities for a service with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| get_service_purchasesB | Get purchase orders for a service with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| get_service_revenuesA | Get revenue items for a service with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| list_project_tasksA | List tasks for a project with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| get_taskA | Get full detail of a single task from v2 REST (source of truth, not affected by DataMart sync delay). Returns dates, status, type, priority, kind, parent task, sprint, and has-subcomponent flags. Use list_project_tasks or search_tasks first to discover task IDs. |
| search_tasksA | Search tasks across all projects in the account (DataMart). Filters combine with AND. Returns { items, total, limit, skip, hasMore } where each item is { projectId, projectName, task }. Results may lag writes by up to 60 seconds (DataMart eventual consistency); use get_task for the confirmed state of one task. Default limit: 50, max: 200. |
| get_project_budgetA | Get budget summary for a project. Returns four budget objects: budgetTopDown (planned), budgetBottomUp (estimated), budgetPeriodEndClose (forecast), budgetActual (spent). |
| get_project_purchasesB | Get purchase orders for a project with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| get_project_revenuesA | Get revenue items for a project with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| get_project_risksB | Get risks for a project with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| get_riskA | Get full detail of a single risk from v2 REST (source of truth). Includes mitigation and contingency plans, probability, impact, level, occurrence cost, and manager. Use get_project_risks first to discover risk IDs. |
| get_issueA | Get full detail of a single issue from v2 REST (source of truth). Includes type, status, manager, management cost/hours, project impact, final resolution, and custom fields. Use get_project_issues first to discover issue IDs. |
| get_project_issuesA | Get issues for a project with pagination. Returns { items, total, limit, skip, hasMore }. Default limit: 50, max: 200. |
| list_task_progressA | List the progress (seguimiento/follow-up) history for a task, newest first. Task progress is a time-series of entries, not a single task field; this is why update_task rejects PercentComplete. |
| get_project_progressA | Get the project progress report: expected curve, baseline curve, and follow-up history (date + percentage). includeEntries true adds the full Seguimiento entries (ProjectProgressId, assessment, descriptions) for update_project_progress. |
| create_task_progressA | Report progress on a task by creating a new progress (seguimiento/follow-up) entry. This is the correct way to set a task's completion percentage: it triggers task status transitions (100% completes the task, dropping below 100% reopens it), parent task rollups, automatic project progress, events, and notifications. Discover assessmentId values with get_reference_data entity "assessments". |
| update_task_progressA | Update an existing task progress (seguimiento/follow-up) entry via PATCH; send only the fields to change. Find the progressId with list_task_progress. |
| create_project_progressA | Create a project-level progress (Seguimiento) entry: the project status report with report date, completion percentage, assessment rating, and status description. Independent from per-task progress. WARNING: percentage 100 automatically CLOSES the project, which blocks further time entry; log hours first (reopen with update_project if needed). Assessment IDs: get_reference_data entity "assessments". |
| update_project_progressA | Update an existing project-level progress (Seguimiento) entry; send only the fields to change. Find the progressId with get_project_progress includeEntries true. |
| get_task_effortA | Read task effort by assigned user and professional category: planned estimates, accepted actual effort, and worked time. teamMembers lists assignees (UserId, name, email); TaskUserId is the assignment key. Estimates are written with update_task_effort. |
| update_task_effortA | Set planned effort for assigned users; never logs worked time or changes accepted effort or billing. Find assignees with get_task_effort and assign missing users with update_task first. Unlisted users stay unchanged. Unless taskTotalEstimate is supplied, the total is recomputed from user and unassigned-category estimates. Regular tasks only. |
| log_time_entryA | Log actual worked hours on a task for one user and date. ITM Platform stores ONE total per user+task+date: mode "add" adds to it, "set" replaces it (0:00 clears). The response echoes the previous and new totals. The user must be assigned to the task (TaskMembers on update_task) and the project status must allow time entry (closed projects block it). userId defaults to the session user; another user requires a Company Admin or Full Access license and the hours are attributed to that user. |
| aggregate_portfolioA | Portfolio-level analytics: group projects by any field and compute metrics (count, avgProgress, totalBudget, totalActual). Uses DataMart aggregation -- no REST equivalent. Available groupBy fields: statusLabel, priorityLabel, methodology, customTypeLabel, isClosed, managers.name. |
| query_datamartA | Run a custom query against ITM DataMart (MongoDB-backed). For advanced analysis beyond typed tools. Operations:
Allowed filter operators: $eq, $ne, $in, $nin, $gt, $gte, $lt, $lte, $regex, $options, $exists, $not, $and, $or, $nor Allowed pipeline stages: $match, $project, $group, $sort, $limit, $skip, $unwind, $addFields, $set, $unset Banned: $lookup, $merge, $out, $function, $accumulator, $where, $facet Key fields: id, name, code, componentType, statusLabel, priorityLabel, percentComplete, startDate, endDate, methodology, managers, budgetTopDown, budgetActual, customFields (object keyed by field display name; see get_custom_fields). Projecting full embedded arrays (tasks: 1, risks: 1, etc.) is rejected as too large; use dot notation (e.g. "tasks.name": 1) or the subcomponent tools with limit/skip. This account defines custom fields. In DataMart documents they live under "customFields", an object keyed by the field's display name. Keys present (with component counts):
|
| search_usersA | Find team members by name or email. Returns user ID, display name, email (the username) and IsNonLoginUser. Non-login users have an empty EmailAddress: address them by UserId in TaskManagers/TaskMembers. Uses projected v2 REST search (not DataMart). |
| get_userA | Get details for a single user by ID. Returns full user profile including roles, categories, and contact info. |
| get_reference_dataA | Get reference IDs for statuses, types, priorities, risks, issues, purchases, revenues, and assessments. Use assessments for task progress; activitystatuses/servicetypes for service writes; and riskstatuses, risktypes, riskimpacts, riskprobabilities, or risklevels for risks. Where BaseId exists, write tools accept either localized Id or BaseId and normalize as needed. |
| get_custom_fieldsA | Get the account's custom field definitions for an entity type: project, task, risk, issue, service, activity, purchase, or revenue. Returns Id, BaseId, Name, TypeId, TypeName (Text, Number, Percentage, Date, HTML, RYGList, DropDownList, List), Description, Required. VALUES live in DataMart under "customFields", keyed by the display Name exactly as returned here (case- and accent-sensitive, may contain trailing spaces). Query via query_datamart, e.g. project {"customFields": 1} or where {"customFields.": ...}. On multilingual accounts the key follows each component's language; fetch definitions per languageId to learn the variant names of the same BaseId. Dropdown values: get_custom_field_options. |
| get_custom_field_optionsA | Get the selectable options of a dropdown custom field (RYGList, DropDownList, or List types), using the BaseId returned by get_custom_fields. Returns Id, BaseId, Text, Color (RYG lists), SortOrder, IsDefault. The option Text is the value stored in DataMart "customFields" for the component. |
| create_projectA | Create a new project. Name and TypeId are required (entity "getprojecttypes"). ProjectMethodTypeId selects the methodology: 1=Waterfall (default when omitted), 2=Kanban (created with default board columns). Status cannot be set at creation (the account default status applies); change it with update_project. The caller becomes project manager when their license allows it. |
| create_taskA | Create a regular task, milestone, or summary task. KindId: 1=Milestone, 2=Summary, 3/default=Task (not the TypeId). Waterfall regular tasks require StatusId, StartDate, and EndDate; milestones require EndDate; summaries require StatusId. Kanban supports regular tasks only and uses board defaults. ParentId creates Waterfall hierarchy. AutomaticProgress statuses create 100% progress; a later lower report needs a later ReportDate. Use get_reference_data for valid IDs. |
| update_taskA | Update task fields via PATCH; send only the fields to change. KindId changes the task kind (1=Milestone, 2=Summary, 3=Task; not TypeId) and ParentId moves the task under a summary task; both are Waterfall-only. Converting to a milestone requires equal StartDate and EndDate in the same call. A status with AutomaticProgress (such as Completed) creates a 100% progress entry; a later lower report only takes effect with a later ReportDate (percentComplete tracks the latest entry by ReportDate). |
| create_riskA | Log a new risk in a project. TypeId, StatusId, ImpactId, ProbabilityId, and LevelId are all required. Discover IDs with get_reference_data (entities "riskstatuses", "risktypes", "riskimpacts", "riskprobabilities", "risklevels"); localized Ids are normalized automatically. |
| create_issueA | Log a new issue in a project. Discover IDs with get_reference_data (entities "issuestatuses", "issuetypes"); localized Ids are normalized automatically. |
| update_projectB | Update project fields via PATCH; send only the fields to change. |
| update_riskA | Update risk fields; send only the fields to change. Discover IDs with get_reference_data (entities "riskstatuses", "risktypes", "riskimpacts", "riskprobabilities", "risklevels"); localized Ids are normalized automatically. |
| update_issueA | Update issue fields via PATCH; send only the fields to change. Discover IDs with get_reference_data (entities "issuestatuses", "issuetypes"); localized Ids are normalized automatically. |
| create_serviceA | Create a new service. Name and TypeId are required; use get_reference_data with entity "servicetypes" to discover valid service type IDs. The service is always created with the account default status; call update_service afterwards to change it. |
| update_serviceA | Update service fields via PATCH; send only the fields to change. Status IDs come from get_reference_data entity "projectstatuses". |
| create_activityA | Create a new activity in a service. Activities form a flat list (no milestones, summaries, or hierarchy). Name, StatusId, StartDate, and EndDate are required. Activity statuses differ from task statuses; use get_reference_data with entity "activitystatuses" to discover valid IDs. |
| update_activityB | Update activity fields via PATCH; send only the fields to change. Activity statuses differ from task statuses (entity "activitystatuses"). |
| bulk_update_task_statusA | Apply one status to many tasks of a project in one call (faster than looping update_task). Collect task IDs via list_project_tasks or search_tasks; chunk into calls of at most 100 IDs. Resolve valid status IDs via get_reference_data (entity "gettaskstatuses"): statuses differ between Waterfall and Kanban projects, and Kanban projects interpret statusId as the Kanban column ID, so pass projectMethodTypeId (1=Waterfall, 2=Kanban) or use statusName instead. Always check the failed array; retrying a failed chunk is safe. |
| bulk_update_activity_statusA | Apply one status to many activities of a service in a single call. Collect activity IDs first via list_service_activities, then chunk into calls of at most 100 IDs. Resolve valid activity status IDs via get_reference_data with entity "activitystatuses" (activity statuses differ from task statuses), or pass statusName. Always check the failed array; retrying a failed chunk is safe. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| project_status | Generate a status report for a project. Fetches project details, budget, tasks, risks, and issues using dedicated tools. |
| portfolio_overview | Portfolio health overview. Aggregates projects by status and methodology, summarizes budget variance. |
| team_workload | Team workload overview. Shows user assignments and project involvement. |
| risk_analysis | Risk assessment for a project. Fetches risks, issues, and budget data to analyze risk exposure. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| schema-component | DataMart component schema (projects/services) -- available fields, types, and enums |
| schema-task | DataMart task schema -- fields available on task subcomponents |
| schema-purchase | DataMart purchase schema -- fields available on purchase subcomponents |
| schema-risk | DataMart risk schema -- fields available on risk subcomponents |
| schema-issue | DataMart issue schema -- fields available on issue subcomponents |
TDQS
Scored across 47 tools
Most tools target clear resource+action pairs and the descriptions explicitly clarify boundaries, such as list_project_tasks vs search_tasks vs get_task, and create_task_progress vs update_task_progress vs update_task. The main ambiguity comes from query_datamart and aggregate_portfolio, which overlap conceptually with typed reporting tools, but they are positioned as advanced/analytics escape hatches.
Tool names consistently use snake_case verb_noun patterns such as search_projects, get_project, create_task, update_risk, list_task_progress, and bulk_update_task_status. Variations like search vs list vs get are used semantically and remain predictable across the large surface.
With 47 tools, the surface is very heavy for an agent to navigate reliably. The domain is broad enough to justify many tools, but this count exceeds a comfortable scoped set and increases selection cost and maintenance complexity.
Coverage is strong across projects, services, tasks, risks, issues, activities, progress, effort, time entry, budgets, custom fields, users, and DataMart queries. The notable gaps are the absence of explicit delete/archive operations and read-only coverage for purchases/revenues, though many lifecycle needs can be handled through status updates or related write tools.