Skip to main content
Glama

Get project

get_project
Read-onlyIdempotent

Fetch full details for one OpenProject project by numeric ID or URL identifier, including description, status, parent, and timestamps, to inspect or verify it after listing projects.

Instructions

Read one project in full.

Use it after list_projects when you need the description, the status explanation or the parent of a specific project — or to verify that an id or identifier a user gave you actually resolves.

Returns {id, identifier, name, active, public, parent, status_code, workspace_type, description, status_explanation, created_at, updated_at}. Rich text comes back as markdown raw; html is dropped.

Pitfalls: status_code is one of on_track, at_risk, off_track, not_started, finished, discontinued — an empty status_code means the project has no status set, not "on track". A 404 here means the id/identifier is wrong or the project is archived and invisible to this user; the error hint says which spelling to try next.

For the ids valid inside this project (types, versions, categories, time-entry activities) call get_project_metadata(project_id=...); for its work packages call list_work_packages(project=...).

Input Schema

NameRequiredDescriptionDefault
id_or_identifierYesNumeric project id (e.g. 7) or the URL identifier (e.g. 'demo-project'). Both are accepted; identifiers come from list_projects, and are the slug in /projects/<identifier>, not the display name.

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
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substance beyond them: rich text is returned as markdown with html dropped, an empty status_code means no status rather than 'on track', and a 404 means a bad id or an archived/invisible project with an error hint. Those are exactly the behavioral traps an agent would otherwise hit at runtime.

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?

Well front-loaded: purpose first, then usage, then return shape, then pitfalls, then alternatives. Most sentences earn their place, though the explicit return-field list is somewhat redundant given an output schema exists, and the parenthetical enumerations add bulk.

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 purpose, trigger conditions, failure mode (404 with hint), field semantics (status_code), and next-step tools, which is more than enough for a single-parameter read tool. Redundancy with the output schema on the return field list is the only, and harmless, excess.

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

Parameters3/5

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

Schema description coverage is 100% and the parameter doc already explains the integer-id vs. slug-identifier duality, so the description mostly repeats it. It does add a diagnostic angle by tying a 404 to a wrong id/identifier spelling, but it offers no new syntax or format detail beyond the schema, making baseline 3 correct.

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 ('Read one project in full') and explicitly contrasts with the sibling list_projects by saying to use it *after* listing. The enumerated return fields further pin down what 'full' means, so an agent can distinguish it from list_projects, update_project, or get_project_metadata without opening any schema.

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 a concrete trigger ('after list_projects when you need the description, the status explanation or the parent') plus a second use case (resolving an id/identifier a user supplied). It also routes to the correct alternatives: get_project_metadata for ids valid inside the project and list_work_packages for work packages, so the agent knows when not to use this tool.

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