Skip to main content
Glama

Update project

update_project

Change a project's name, description, visibility, parent, status, or archived state through validated partial updates, leaving omitted fields untouched to prevent conflicting edits.

Instructions

Change a project's name, description, visibility, parent, status or archived state.

Use it to record a status change with its explanation ("at_risk because the vendor slipped"), to rename or re-parent a project, to publish it, or to archive it with active=false. The change is validated through POST /projects/{id}/form first, so rejected values come back as violations naming the attribute.

Only the parameters you pass are sent — omitted fields are never rewritten, so two agents editing different fields do not clobber each other. Projects carry no lockVersion upstream, so there is no version to echo and no lock parameter here.

Returns the updated project in the same shape as get_project.

Pitfalls: description and status_explanation REPLACE the stored text rather than appending to it. active=false archives, which is not deletion but does hide the project and freeze its work packages. Changing identifier is deliberately not offered — it breaks every existing link to the project.

Cross-references: get_project to read the current values first; delete_project to remove a project for good; list_projects(active=false) to find archived ones.

Input Schema

NameRequiredDescriptionDefault
nameNoNew display name. Omit to leave the name alone.
activeNofalse ARCHIVES the project — it disappears from normal listings and everything in it becomes read-only, including its subprojects. true restores it. Omit to leave it alone. Archiving is usually admin-only.
publicNoTrue publishes the project to every logged-in user, false makes it members-only. Omit to leave the visibility alone.
parent_idNoMove the project under another one: numeric id or identifier of the new parent. Pass null to detach it and make it top-level. Omit the parameter entirely (the default) to leave the hierarchy untouched.__unchanged__
descriptionNoNew description in markdown; it REPLACES the existing text, so read the current one with get_project first if you mean to extend it. Pass an empty string to clear it. Omit to leave it alone.
status_codeNoNew project status: on_track, at_risk, off_track, not_started, finished or discontinued. Only these codes are accepted. Omit to leave the status alone.
id_or_identifierYesNumeric project id or URL identifier of the project to change; both are accepted and come from list_projects or get_project.
status_explanationNoMarkdown note explaining the status, e.g. why the project is at risk. Replaces the previous explanation; pass an empty string to clear it.

Output Schema

NameRequiredDescriptionDefault
idNo
nameNo
activeNo
parentNo
publicNo
created_atNo
identifierNo
updated_atNo
descriptionNo
status_codeNo
workspace_typeNo
status_explanationNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed48 schema fields changedv0.4.0
    • removedOutput schema / description
      Removed value: -"Full project detail: the row plus text fields and timestamps."
    • removedOutput schema / properties / active / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / active / default
      Removed value: -null
    • removedOutput schema / properties / active / description
      Removed value: -"False for archived projects (read-only in the UI)."
    • addedOutput schema / properties / active / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
    • removedOutput schema / properties / created_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / created_at / default
      Removed value: -null
    • removedOutput schema / properties / created_at / description
      Removed value: -"ISO 8601 UTC timestamp."
    • addedOutput schema / properties / created_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / description / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / description / default
      Removed value: -null
    • removedOutput schema / properties / description / description
      Removed value: -"Description as markdown (raw); html is dropped."
    • addedOutput schema / properties / description / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / id / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / id / default
      Removed value: -null
    • removedOutput schema / properties / id / description
      Removed value: -"Numeric project id; accepted by every project_id parameter."
    • addedOutput schema / properties / id / type
      Added value: +[
      +  "integer",
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / identifier / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / identifier / default
      Removed value: -null
    • removedOutput schema / properties / identifier / description
      Removed value: -"URL slug from /projects/<identifier>; also accepted wherever an id is."
    • addedOutput schema / properties / identifier / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / name / default
      Removed value: -null
    • removedOutput schema / properties / name / description
      Removed value: -"Display name."
    • addedOutput schema / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / parent / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "A reference to another resource. Canonical output shape.",
      -    "properties": {
      -      "id": {
      -        "anyOf": [
      -          {
      -            "type": "integer"
      -          },
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Resource id."
      -      },
      -      "name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Human-readable name."
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "type": [
      +          "integer",
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "name": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / parent / default
      Removed value: -null
    • removedOutput schema / properties / parent / description
      Removed value: -"Parent project, when this is a subproject."
    • removedOutput schema / properties / public / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / public / default
      Removed value: -null
    • removedOutput schema / properties / public / description
      Removed value: -"True when visible to users without a membership."
    • addedOutput schema / properties / public / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
    • removedOutput schema / properties / status_code / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / status_code / default
      Removed value: -null
    • removedOutput schema / properties / status_code / description
      Removed value: -"Project status code, one of: on_track, at_risk, off_track, not_started, finished, discontinued. A code, never a translated label; null means no status has been set."
    • addedOutput schema / properties / status_code / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / status_explanation / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / status_explanation / default
      Removed value: -null
    • removedOutput schema / properties / status_explanation / description
      Removed value: -"Free-text explanation of status_code, markdown (raw)."
    • addedOutput schema / properties / status_explanation / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / updated_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / updated_at / default
      Removed value: -null
    • removedOutput schema / properties / updated_at / description
      Removed value: -"ISO 8601 UTC timestamp."
    • addedOutput schema / properties / updated_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspace_type / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / workspace_type / default
      Removed value: -null
    • removedOutput schema / properties / workspace_type / description
      Removed value: -"Workspace kind: 'project', 'program' or 'portfolio'. Pre-17 instances only have 'project'; on 17.x project listings mix all three kinds, so check this before treating a row as a plain project."
    • addedOutput schema / properties / workspace_type / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. First observedv0.1.0

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: server-side validation through POST /projects/{id}/form returning 'violations', partial-update semantics so omitted fields are never rewritten, and the absence of a lockVersion. The annotations already flag non-read-only, non-destructive, non-idempotent behavior, and the description does not contradict them, though it never addresses the idempotentHint=false claim explicitly.

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?

Front-loads the operation and use cases, then pitfalls, then cross-references — a sensible order with no filler. A few points (description replacement, active=false archiving) are restated from the schema, so it is slightly redundant but not padded.

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

Completeness5/5

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

Covers everything an agent needs for an 8-parameter mutation: partial-update safety, validation failure mode, archive side effects, return shape pointer to get_project, and sibling routing. With an output schema present, no return-value detail is owed, and what little is said is a helpful pointer rather than a substitute.

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 100% and the schema already documents each parameter thoroughly, so the baseline is 3. The description still adds cross-parameter meaning: the 'only what you pass is sent' contract (which explains parent_id's __unchanged__ sentinel versus null), the replace-not-append semantics of description and status_explanation, and the archive consequence of active=false.

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?

Opens with a specific verb and resource plus the full set of mutable attributes, so an agent immediately knows this is the partial-mutation tool for projects. It is clearly separable from get_project, create_project, copy_project and delete_project named in the description and siblings list.

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 concrete when-to-use examples (record a status change with rationale, rename, re-parent, publish, archive) and names alternatives with their conditions: get_project to read first, delete_project for permanent removal, list_projects(active=false) to find archived projects. It also states an explicit exclusion — identifier changes are deliberately unsupported.

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