Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Microsoft Project

NUGET · HORIZUNMSPROJECTMCP · SCANNED SEP 20

Audit, reschedule and author Microsoft Project schedules. No Java, no Project install.

0 this week 78 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security88
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Install-script risk not yet assessed.Unverified
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency45
Schema Quality & AI Usability68
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5013 tokens (~200/item across 25 items; 25 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
  • Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 25 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 25 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the Microsoft Project MCP server?

Microsoft Project runs locally as a NuGet package, launched with dnx HorizunMsProjectMcp@1.0.2 --yes. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

nuget · HorizunMsProjectMcp

# add to Claude Code
claude mcp add horizungroup-horizun-msproject-mcp -- dnx HorizunMsProjectMcp@1.0.2 --yes
// .cursor/mcp.json
{
  "mcpServers": {
    "horizungroup-horizun-msproject-mcp": {
      "command": "dnx",
      "args": [
        "HorizunMsProjectMcp@1.0.2",
        "--yes"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "horizungroup-horizun-msproject-mcp": {
      "command": "dnx",
      "args": [
        "HorizunMsProjectMcp@1.0.2",
        "--yes"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add horizungroup-horizun-msproject-mcp -- dnx HorizunMsProjectMcp@1.0.2 --yes
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "horizungroup-horizun-msproject-mcp": {
      "type": "local",
      "command": [
        "dnx",
        "HorizunMsProjectMcp@1.0.2",
        "--yes"
      ],
      "enabled": true
    }
  }
}
# ~/.hermes/config.yaml
mcp_servers:
  horizungroup-horizun-msproject-mcp:
    command: "dnx"
    args: ["HorizunMsProjectMcp@1.0.2", "--yes"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "horizungroup-horizun-msproject-mcp": {
      "Transport": "stdio",
      "Command": "dnx",
      "Arguments": [
        "HorizunMsProjectMcp@1.0.2",
        "--yes"
      ]
    }
  }
}
// mcp.json
{
  "mcpServers": {
    "horizungroup-horizun-msproject-mcp": {
      "command": "dnx",
      "args": [
        "HorizunMsProjectMcp@1.0.2",
        "--yes"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 17 Sept 26 +1
    • Stability: 0.97 → pass security
  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 10 Sept 26 +1
    • Stability: 0.97 → pass security
  • 8 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed nuget/HorizunMsProjectMcp@1.0.2

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem nuget
Reason Package not fetched

Background: How many MCP packages publish verified provenance →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 25 exposed · ~5,013 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
baseline_compare ~182

Earned-value analysis against a stored baseline: BCWS, BCWP, ACWP, schedule and cost variance, SPI, CPI, EAC and TCPI, for the whole project and optionally per top-level WBS branch, plus the tasks with the worst slippage. This is the number a project board asks for and what feeds the S-curve. Says so plainly when no baseline is stored rather than returning zeros that look real.

NameTypeReqDescription
baselineintegerWhich baseline to measure against: 0 (the main one, default) through 10.
byBranchbooleanAlso break the metrics down by top-level WBS branch. Defaults to true.
handlestringyesDocument handle from project_open.
statusDatestring|nullStatus date, yyyy-MM-dd. Defaults to the project's own status date, then today.

No output schema declared.

No examples provided.

bim_link ~219

Tie schedule tasks to the model elements they build, matching on a shared code (HRZ_COD_PRES, a keynote, a budget code). op='suggest' proposes the mapping from an element export and separates out anything that matched only on a code prefix for you to confirm; 'set' stores it; 'get' reads it back; 'clear' removes it. The mapping lives in a sidecar next to the schedule, so re-exporting the model never touches the planner's file.

NameTypeReqDescription
codeFieldstringTask custom field holding the code, e.g. 'Text1'. Defaults to Text1.
elementsPathstring|nullPath to the element export (JSON array or CSV with elementId, code, quantity, unit). Required for suggest.
handlestringyesDocument handle from project_open.
opstringsuggest, set, get, or clear.
reviewBelownumberMappings below this confidence are listed for review instead of stored. Defaults to 100.

No output schema declared.

No examples provided.

bim_sync ~219

Move data across the schedule/model boundary, in either direction. direction='model_to_schedule' turns measured quantities into duration proposals at a stated productivity rate — proposals only, which you then apply with tasks_write. direction='schedule_to_model' writes one row per element carrying its task's dates and progress: that file drives 4D animation in Navisworks, element parameters in Revit, and the progress dashboard in Power BI.

NameTypeReqDescription
defaultProductivitynumberProductivity to use when a unit is not listed. Defaults to 1.
directionstringyesmodel_to_schedule or schedule_to_model.
handlestringyesDocument handle from project_open.
outputPathstring|nullOutput path for schedule_to_model (.csv or .json).
productivityobject|nullProductivity per day per unit, e.g. {"m3": 25, "m2": 120}. Used by model_to_schedule.
statusDatestring|nullStatus date used to classify element progress, yyyy-MM-dd.

No output schema declared.

No examples provided.

calendars_write ~98

Manage working calendars: create and delete them, and add non-working exceptions for holidays, site shutdowns or a rainy season. The weekly working-hours pattern itself is not editable here. Verified and dry-runnable exactly as tasks_write describes.

NameTypeReqDescription
dryRunbooleanSimulate against a copy and report the impact without committing.
handlestringyesDocument handle from project_open.
opsarrayyesThe calendar operations to apply.

No output schema declared.

No examples provided.

links_query ~195

Read the dependency network. Almost always you want the subgraph around a few tasks rather than every link, so pass uids and a depth. drivingOnly returns just the chain that actually pushes the finish date, which is what you want when asking why the project ends when it does.

NameTypeReqDescription
cursorintegerRow offset from a previous nextCursor.
depthintegerHow many hops out from the seed tasks. 0 = immediate neighbours only. Defaults to 1.
directionstring'pred', 'succ', or 'both' (default).
drivingOnlybooleanReturn only the driving chain that sets the project finish date.
handlestringyesDocument handle from project_open.
limitintegerMaximum rows. Defaults to 200.
uidsarray|nullCentre the subgraph on these task uids. Omit for the whole network.

No output schema declared.

No examples provided.

links_write ~93

Add, remove, and change dependencies in one batch. Cycles are detected and refused before anything is applied, with the offending chain named in the rejection. Verified and dry-runnable exactly as tasks_write describes.

NameTypeReqDescription
dryRunbooleanSimulate against a copy and report the impact without committing.
handlestringyesDocument handle from project_open.
opsarrayyesThe dependency operations to apply.

No output schema declared.

No examples provided.

project_export ~166

Export the schedule for another tool. 'mspdi' and 'mpx' write real schedule files; 'csv' and 'json' write a flat task table; 'pbip_dataset' writes the shaped dataset our Power BI report consumes — tasks, assignments, earned value and the S-curve — rather than a raw dump.

NameTypeReqDescription
formatstringcsv, json or pbip_dataset for a flat table; mspdi, mpx, mpp, xer, pmxml, planner or sdef for a real schedule file.
handlestringyesDocument handle from project_open.
pathstringyesOutput file path.
statusDatestring|nullStatus date used for the earned-value block in pbip_dataset, yyyy-MM-dd.

No output schema declared.

No examples provided.

project_health ~135

Diagnose what this server can do on this machine. Call it first in every session. Reports the active backend, runtime, whether Microsoft Project is installed AND whether its COM server actually starts, and a capability matrix the other tools honour. When something is wrong it returns the exact diagnosis and a repair path, not a stack trace. Pass deep=true to genuinely launch Microsoft Project instead of only reading its registration — slower and visible on screen, but the only way to know COM works.

NameTypeReqDescription
deepbooleanLaunch the Microsoft Project COM server for real instead of only inspecting its registration. Starts Project and closes it again. Defaults to false.

No output schema declared.

No examples provided.

project_import ~124

Bring updates in from a CSV or JSON file — typically progress collected in the field. Runs plan-first: by default it matches rows to tasks by uid and returns the field-by-field diff without changing anything. Pass apply=true once you have read the plan, and the changes go through tasks_write so every one of them is verified by re-reading the model.

NameTypeReqDescription
applybooleanApply the plan. Defaults to false — plan only.
handlestringyesDocument handle from project_open.
pathstringyesPath to the CSV or JSON file to import.

No output schema declared.

No examples provided.

project_info ~69

Summarise an open schedule: dates, counts, calendars, which baselines actually hold data, and the aliases of the custom fields. Read this before tasks_query — without the aliases nobody can tell what Text1 means in this particular schedule.

NameTypeReqDescription
handlestringyesDocument handle from project_open.

No output schema declared.

No examples provided.

project_open ~220

Open a schedule — or start a new one — and get a handle for every other tool. Reads .mpp, .mpt, .mpx, MSPDI .xml, Primavera .xer and .pmxml, Asta .pp and more, with no Microsoft Project needed. Returns a fingerprint of the file; later writes revalidate it and refuse if the file changed on disk in the meantime, so a stale handle can never overwrite somebody else's edits. Pass create=true to begin an empty schedule at that path instead of reading one.

NameTypeReqDescription
createbooleanStart a new empty schedule instead of reading an existing file. Refuses to clobber an existing file.
modestring'readwrite' (default) or 'readonly'. A read-only handle refuses every write tool.
namestring|nullProject name for a newly created schedule.
pathstringyesAbsolute path to the schedule file.
startDatestring|nullProject start date for a newly created schedule, yyyy-MM-dd.

No output schema declared.

No examples provided.

project_save ~198

Save or close an open schedule. Never saves on its own — closing with unsaved changes requires either saving first or passing discardChanges=true, so work is never silently lost. Note that no library can author native .mpp; use format='mspdi' for a .xml Microsoft Project opens natively.

NameTypeReqDescription
discardChangesbooleanAllow close to drop unsaved changes. Defaults to false.
formatstringOutput format: 'mspdi' (default, .xml), 'mpx', or 'json'.
handlestringyesDocument handle from project_open.
keepOpenbooleanKeep the handle open after saving. Defaults to true.
opstring'save' (write back over the original path), 'save_as' (write to path), or 'close'.
pathstring|nullTarget path for save_as. Ignored for save and close.

No output schema declared.

No examples provided.

resources_query ~166

Read resources, their assignments, and who is overbooked. Overallocation is computed day by day from the assignment spans — Microsoft Project's file format carries no such flag, so this is a real calculation rather than a field read.

NameTypeReqDescription
cursorintegerRow offset from a previous nextCursor.
handlestringyesDocument handle from project_open.
includeAssignmentsbooleanInclude each resource's assignments. Off by default — they are bulky.
limitintegerMaximum rows. Defaults to 50.
namestring|nullName substring filter.
overallocatedOnlybooleanOnly resources that are overbooked on at least one day.
typestring|nullFilter by type: work, material, or cost.

No output schema declared.

No examples provided.

resources_write ~83

Create, update, and delete resources, and assign or unassign them to tasks, in one batch. Verified and dry-runnable exactly as tasks_write describes.

NameTypeReqDescription
dryRunbooleanSimulate against a copy and report the impact without committing.
handlestringyesDocument handle from project_open.
opsarrayyesThe resource operations to apply.

No output schema declared.

No examples provided.

schedule_analyze ~120

Answer questions about the schedule without downloading it. Computes the critical path, the float distribution, the driving (longest) path, day-by-day resource overallocation, milestone status against deadlines and baseline, and the health of the dependency network. Ask for only the aspects you need — each one is computed independently.

NameTypeReqDescription
aspectsarray|nullWhich analyses to run: critical_path, float_distribution, longest_path, overallocation, milestones, dependency_health. Omit for all except longest_path.
handlestringyesDocument handle from project_open.

No output schema declared.

No examples provided.

schedule_generate ~353

Build a new schedule from an activity library produced by schedule_learn. Each activity gets the duration its history says it takes, and the dependencies that usually surround it are recreated between the activities you asked for. Returns an open handle, so run schedule_qa on it before trusting it and adjust with tasks_write — this is a first draft grounded in what actually happened on past projects, not a finished programme.

NameTypeReqDescription
activitiesarray|nullActivity keys to include, as listed in the library. Omit to use every activity in it.
durationBasisstring'median' (default) for a normal run, or 'p80' to plan with contingency.
libraryPathstringyesPath to the library JSON from schedule_learn.
namestring|nullName for the new project.
outputPathstringyesPath for the new schedule. Refuses to overwrite an existing file.
quantitiesobject|nullMeasured quantities per activity key, e.g. {"VACIADO LOSA": 340}. Where the library learned a productivity rate for that activity, the duration is sized from the quantity instead of copied from histo…
startDatestringyesProject start date, yyyy-MM-dd.
unitLabelstringWord naming a unit, used in the task names: 'apto', 'piso', 'torre'. Defaults to 'unidad'.
unitsintegerHow many units to build — apartments, floors, blocks. Activities the library found to repeat unit by unit are created once per unit and chained, which is how construction schedules are actually shape…

No output schema declared.

No examples provided.

schedule_learn ~262

Mine finished schedules for how long each kind of activity actually takes and what usually comes before and after it. Reads any number of .mpp, MSPDI or Primavera files, normalises task names so the same activity matches across projects and units, and reports each activity's duration distribution — median, 80th percentile, range — together with its typical predecessors and successors and the lag between them. Save the result and hand it to schedule_generate to build a new schedule from experience rather than from a blank page.

NameTypeReqDescription
codeFieldstring|nullCustom field holding the budget code, e.g. 'Text1', to carry into the library.
minOccurrencesintegerIgnore activities seen fewer times than this. Defaults to 3.
pathsarrayyesPaths of past schedules to learn from.
quantitySourcesarray|nullElement exports (the same CSV or JSON bim_link reads) carrying measured quantities per code. Supply them together with codeField and the library reports a productivity rate per activity — how much a…
savePathstring|nullWhere to save the library as JSON. Omit to return it without saving.

No output schema declared.

No examples provided.

schedule_qa ~204

Run the DCMA 14-point schedule assessment plus Horizun's own rules, and report what is wrong with the schedule. This is the industry standard for judging whether a schedule can be run on: missing logic, leads and lags, hard constraints, high float and duration, negative float, invalid dates, unresourced work, missed baseline tasks, CPLI and BEI. Checks that genuinely cannot be evaluated (no baseline stored, no scheduling engine) are reported as not evaluated with the reason — never as a pass.

NameTypeReqDescription
budgetCodeFieldstring|nullCustom field carrying the budget code, e.g. 'Text1'. Supply it to also check that every task is tied to the cost model — the same code the BIM tools match on.
handlestringyesDocument handle from project_open.
statusDatestring|nullStatus date for the progress checks, yyyy-MM-dd. Defaults to the project's own status date, then today.

No output schema declared.

No examples provided.

schedule_recovery ~205

Work out what is late, what it is costing the finish date, and which changes to the logic would actually recover time. Lists the late work ordered by how much of the schedule is stuck behind it, then measures recovery levers — removing lag on the driving chain, overlapping finish-to-start hand-offs, compressing the longest critical tasks. Every option is applied to a throwaway copy, rescheduled, and reported with the finish date it genuinely produces; an option that recovers nothing says so rather than being offered as advice. Nothing is written to the open document.

NameTypeReqDescription
handlestringyesDocument handle from project_open.
maxOptionsintegerHow many recovery options to return. Defaults to 5.
statusDatestring|nullStatus date, yyyy-MM-dd. Defaults to the project's own, then today.
targetFinishstring|nullThe date you need to finish by, yyyy-MM-dd. Adds the gap to the report.

No output schema declared.

No examples provided.

schedule_sequence ~447

Recover the logic a schedule is missing by reading the order its own dates already state. A schedule whose work was laid out in the right order but never linked is a bar chart, not a network: nothing moves when anything slips, float reads as enormous, and any target date computed over it is arithmetic. This finds the repeating groups — apartments, floors, spans, wells, whatever the work repeats over — reads the order each one runs in, keeps only the orderings the repetitions agree on, and proposes the missing links. It never invents an order the dates do not state and never proposes a link where a path already exists. Defaults to proposing only; pass apply=true to write them, verified.

NameTypeReqDescription
applybooleanWrite the proposed links instead of only reporting them. Defaults to false.
groupBystring'unit' (default) groups by the identifier that varies between repetitions — the number at the end of a task name. 'parent' groups by the WBS parent instead.
groupDepthintegerHow far down the WBS the grouping branch sits — the tower, phase or building a unit number is unique within. Defaults to 2. Raise it where units repeat within a deeper branch; lower it where one numb…
handlestringyesDocument handle from project_open.
maxLinksintegerMaximum links to propose in one pass. Defaults to 500.
minAgreementnumberHow strongly the repetitions must agree on an ordering before it is trusted, 0-1. Defaults to 0.8. Lower it only where the variation between units is genuine.
preserveDatesbooleanCarry the existing gap between each pair as lag so no date moves. Off by default: it sounds like the safe choice and measurably is not, because it turns every recovered link into a positive lag. On a…

No output schema declared.

No examples provided.

schedule_target ~142

Test a schedule against a date you have been given. Reports whether the target is achievable, how many working days short it falls, the driving chain with the dates each task would have to hit, and every task the network does not actually hold in place — work with no predecessor or no successor, which never moves when its neighbours do and makes any target date arithmetic rather than a plan. Read-only.

NameTypeReqDescription
anchorstring'finish' (default) to test a completion date, or 'start' to test a start date.
handlestringyesDocument handle from project_open.
targetstringyesThe target date, yyyy-MM-dd.

No output schema declared.

No examples provided.

schedule_update ~241

Engine-level operations that take no per-task payload: save or clear a baseline, set the status date, reschedule incomplete work, level resources, or force a recalculation. Levelling and rescheduling are the two that do the most damage by accident, so they require a dry run to be seen first. Operations that need Microsoft Project's scheduling engine are refused outright on the MPXJ backend rather than approximated.

NameTypeReqDescription
baselineintegerBaseline slot 0-10 for save_baseline and clear_baseline. Defaults to 0.
dryRunbooleanSimulate against a copy and report the impact without committing.
handlestringyesDocument handle from project_open.
opstringyessave_baseline, clear_baseline, set_status_date, reschedule_incomplete, level_resources, or recalculate.
overwriteBaselinebooleanAllow save_baseline to replace a baseline that already holds data. Off by default: overwriting one destroys the original plan every variance is measured against.
statusDatestring|nullStatus date for set_status_date and reschedule_incomplete, yyyy-MM-dd.

No output schema declared.

No examples provided.

tasks_query ~481

The workhorse read. Filter, sort, and page through tasks without pulling the whole schedule into context. Every task is identified by its stable uid — the id field is the row number and shifts when tasks are inserted, so never use it to address a task in a write. Defaults to a compact field set and 50 rows; ask for more only when you need it.

NameTypeReqDescription
criticalboolean|nulltrue = only critical tasks, false = only non-critical, null = both.
cursorintegerRow offset from a previous nextCursor.
customFieldstring|nullCustom field filter, e.g. 'Text1'. Pair with customValue.
customValuestring|nullValue the custom field must contain.
dateFieldstring|nullDate filter field: start, finish, baseline_finish, or deadline.
dateFromstring|nullDate filter lower bound, yyyy-MM-dd.
dateTostring|nullDate filter upper bound, yyyy-MM-dd.
handlestringyesDocument handle from project_open.
includeCustombooleanInclude the Text1..Text30 custom fields on each row. Off by default — they are bulky.
limitintegerMaximum rows to return. Defaults to 50.
maxFloatDaysnumber|nullOnly tasks whose float is at or below this many days — use 0 to find the driving work.
milestoneboolean|nulltrue = only milestones, false = exclude milestones, null = both.
minDurationDaysnumber|nullOnly tasks whose duration exceeds this many days.
resourcestring|nullOnly tasks this resource is assigned to (name substring).
shapestringShape: flat (default), leaf_only, or summary_only.
sortstringSort by start (default), finish, float, duration, or wbs.
statusstring|nullStatus filter: not_started, in_progress, complete, or late.
textstring|nullCase-insensitive substring match on name and notes.
uidsarray|nullRestrict to these task uids.
wbsPrefixstring|nullOnly tasks whose WBS starts with this prefix, e.g. '1.2'.

No output schema declared.

No examples provided.

tasks_write ~174

Create, update, delete and re-outline tasks in one batch. Progress (percentComplete, actual dates) is an ordinary update. Tasks are addressed by their stable uid — never by row id. Every change is re-read from the model after the write and only then counted as applied; anything the schedule refused comes back under 'rejected' with the reason and what the value actually became. Pass dryRun=true to run the whole batch against a throwaway copy and see the impact — how many tasks move, how far the finish date shifts, whether the critical path changes — without touching the open document.

NameTypeReqDescription
dryRunbooleanSimulate against a copy and report the impact without committing.
handlestringyesDocument handle from project_open.
opsarrayyesThe operations to apply, in order.

No output schema declared.

No examples provided.

timephased_query ~217

Work or cost spread over time — the S-curve. Kept separate from the other reads because it is the expensive one: it refuses ranges that would generate an unreasonable number of buckets and tells you to coarsen the granularity instead of quietly returning tens of thousands of rows.

NameTypeReqDescription
fromstring|nullRange start, yyyy-MM-dd. Defaults to the project start.
granularitystring'day', 'week' (default), or 'month'.
handlestringyesDocument handle from project_open.
measurestring'work' (default), 'cost', 'duration', 'baseline_work', or 'baseline_cost'. Use 'duration' on a schedule with no loaded hours or costs — many carry neither, and it is the only curve they can produce.
tostring|nullRange end, yyyy-MM-dd. Defaults to the project finish.
uidsarray|nullRestrict to these task uids. Omit for the whole project.

No output schema declared.

No examples provided.

Common questions

What is the Microsoft Project MCP server?

Microsoft Project is an MCP server listed in the public MCP registry as io.github.HorizunGroup/horizun-msproject-mcp. Audit, reschedule and author Microsoft Project schedules. No Java, no Project install. This page covers its NuGet package (HorizunMsProjectMcp).

Is the Microsoft Project MCP server safe to use?

Microsoft Project scores 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Microsoft Project MCP server expose?

Microsoft Project exposes 25 tools: project_health, bim_link, schedule_qa, calendars_write, schedule_update, and 20 more. Their descriptions and schemas cost roughly 5,013 tokens of context every time the server is loaded.

Is the Microsoft Project MCP server still maintained?

Microsoft Project is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Microsoft Project MCP server under?

Microsoft Project declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.