Skip to main content
Glama

update_project

DestructiveIdempotent

Partially update one project: name, description, status (PLANNING/ACTIVE/ON_HOLD/COMPLETED/CANCELLED), startDate, endDate, budget (number or null), color, retainedLogic (true: the remaining work of a started task waits on its links, so a late predecessor pushes it; false: a started task holds). Only supplied fields change. startDate and endDate are the project's own target dates: writing them moves no task, so the plan's tasks keep their dates even when they then sit long before the new finish. move_project is the tool that shifts the plan itself (every task without actual work, durations and links kept). Caller must have project.edit on the project. Project progress is not writable here: it is derived from the progress of the tasks underneath, so it changes through update_task rather than through this tool.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "projectId": "<projectId>"
    },
    "name": "update_project"
  }
}

Input Schema

NameRequiredDescriptionDefault
nameNo2-255 chars.
colorNo
budgetNo
statusNo
endDateNoISO date, the project's target finish. Moves no task (move_project shifts the schedule). Must be after startDate when both are set.
feeAmountNoFIXED_FEE / MILESTONE: the sold fee, distinct from budget (the cost plan).
projectIdYes
startDateNoISO date.
statusDateNoISO date the schedule is reported "as of" (MS Project Status Date, P6 Data Date). null clears, meaning today.
descriptionNo
billingModelNoHow the project bills: TIME_AND_MATERIALS (hours x rate), FIXED_FEE (feeAmount recognised by approved-hours share of estimatedHours, capped), RETAINER (retainerAmount per retainerPeriod, over-servicing above retainerIncludedHours), MILESTONE (milestoneSchedule amounts recognised as linked milestones complete). Changing it clears the other models' terms.
retainedLogicNoHow a started task meets its links. true (retained logic): its remaining work waits on its incoming links, so a late predecessor pushes it. false (the default): it holds at its actual start. Takes effect on the next reschedule, and only while the server switch retained_logic_enabled is on.
estimatedHoursNoFIXED_FEE: hours the fee was priced on.
retainerAmountNoRETAINER: fee per period.
retainerPeriodNo
milestoneScheduleNoMILESTONE: [{ label, amount, milestoneId? }], each milestone linked at most once.
retainerIncludedHoursNoRETAINER: hours the fee covers per period.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / endDate / description
      Previous value: -"ISO date - must be after startDate when both set."New value: +"ISO date, the project's target finish. Moves no task (move_project shifts the schedule). Must be after startDate when both are set."
  2. Changed1 schema field changed
    • addedInput schema / properties / retainedLogic
      Added value: +{
      +  "description": "How a started task meets its links. true (retained logic): its remaining work waits on its incoming links, so a late predecessor pushes it. false (the default): it holds at its actual start. Takes effect on the next reschedule, and only while the server switch retained_logic_enabled is on.",
      +  "type": "boolean"
      +}
  3. Changed9 schema fields changed
    • addedInput schema / properties / billingModel
      Added value: +{
      +  "description": "How the project bills: TIME_AND_MATERIALS (hours x rate), FIXED_FEE (feeAmount recognised by approved-hours share of estimatedHours, capped), RETAINER (retainerAmount per retainerPeriod, over-servicing above retainerIncludedHours), MILESTONE (milestoneSchedule amounts recognised as linked milestones complete). Changing it clears the other models' terms.",
      +  "enum": [
      +    "TIME_AND_MATERIALS",
      +    "FIXED_FEE",
      +    "RETAINER",
      +    "MILESTONE"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / estimatedHours
      Added value: +{
      +  "description": "FIXED_FEE: hours the fee was priced on.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / feeAmount
      Added value: +{
      +  "description": "FIXED_FEE / MILESTONE: the sold fee, distinct from budget (the cost plan).",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / milestoneSchedule
      Added value: +{
      +  "description": "MILESTONE: [{ label, amount, milestoneId? }], each milestone linked at most once.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "type": "number"
      +      },
      +      "label": {
      +        "type": "string"
      +      },
      +      "milestoneId": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "label",
      +      "amount"
      +    ],
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • removedInput schema / properties / progress
      Removed value: -{
      -  "description": "Integer 0-100.",
      -  "type": "number"
      -}
    • addedInput schema / properties / retainerAmount
      Added value: +{
      +  "description": "RETAINER: fee per period.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / retainerIncludedHours
      Added value: +{
      +  "description": "RETAINER: hours the fee covers per period.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / retainerPeriod
      Added value: +{
      +  "enum": [
      +    "WEEK",
      +    "MONTH",
      +    "QUARTER",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / statusDate
      Added value: +{
      +  "description": "ISO date the schedule is reported \"as of\" (MS Project Status Date, P6 Data Date). null clears, meaning today.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  4. Added

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, destructive=true, idempotent=true), the description adds the partial-update guarantee ('Only supplied fields change'), the authorization requirement, and the important side-effect nuance that writing startDate/endDate moves no tasks. It does not spell out the destructive consequences the destructiveHint implies, such as what a status flip to COMPLETED or CANCELLED does, so it stops just short of full coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the writable-field list comes first, then the field semantics, then the move_project alternative, then the permission requirement. The retainedLogic sentence largely restates the schema description verbatim, which is the one clearly redundant stretch, but the rest of the text earns its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter mutation tool with one required field and no output schema, the description covers what an agent most needs: partial semantics, permissions, date-vs-schedule behavior, the sibling that actually reschedules, and the derived-field exclusion. Missing are the consequences of destructive transitions (status change, billingModel switch clearing other terms, which the schema mentions but the description does not reinforce).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 65%, and the description compensates by explaining the semantics of the trickiest fields: startDate/endDate are target dates that reschedule nothing, and retainedLogic changes only take effect on the next reschedule (and only when the server switch is on). The billing-related parameters (feeAmount, billingModel, retainer*, milestoneSchedule) are left entirely to the schema, which does document them, so no meaning is lost but the description adds nothing there.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Partially update one project') and enumerates the writable surface (name, description, status, startDate, endDate, budget, color, retainedLogic). It also draws a hard boundary against the two nearest siblings: move_project shifts the schedule, and project progress is not writable here but flows through update_task.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use routing: use this tool to change the project's own target dates, use move_project when the plan itself must shift. It also names an exclusion (progress is not writable here, use update_task) and the precondition (caller must have project.edit on the project).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.