Skip to main content
Glama

projects

Projects | the caller's OWN project board with its objectives and key results, read and written deterministically (no LLM on this path): what a team agreed to achieve, what it works on, who works on it, how far along it is, and which key result each piece of work pays into. Call it for "what is my team working on", "which key result has no project behind it", "what does marketing contribute", "which projects are off track", "what is undecided", or to add or move a project, objective or key result.

PROJECTS: "list" folds the board on ONE axis, group = okr (default) | country | function | person. On person a project appears under its owner and every contributor; on the other axes once. Nothing set on the axis lands in a NAMED group ("No country set"), never dropped. Undecided projects come back in inbox. "get" returns one project with milestones and KPIs; "create" adds one; "update" changes one (stage, progress, traffic light, dates, parent, budget, effort, impact, key_result_id). A project carries a target date (due sentence derived on read), a parent (three levels at most), prerequisites (blocked_by), a budget in its own currency (never converted), effort in days and impact 1 to 5; sort = effort_impact orders by impact then effort without a score.

OBJECTIVES: "objectives" returns every objective with its key results: value, source (dataset or manual), a DERIVED status (on track, at risk, off track, no data yet; from baseline, target, direction and time left, never set by hand, and no value is never on track), guardrails, target history and the projects behind it. "create_objective" needs title; "update_objective" needs id; "create_key_result" needs objective_id, title, target; "update_key_result" needs id. Changing a target needs target_reason (ten characters or more) and is kept in a history nothing rewrites. A key result with guards_id is a GUARDRAIL: breached, the guarded key result is off track even at full attainment.

THE VALUE RULE for KPIs and key results: EITHER a typed number OR read live from a column of any dataset on this account, such as a Google Search Console, Shopify or World Bank table or an uploaded CSV (dataset_id + value_column, optionally filter_column + filter_value), never both. A value that cannot be read is null with a reason, never zero.

NEVER: it never derives the traffic light or progress of a project (a person sets both), never invents a key result (link one of the account key results by key_result_id; list returns them as key_results), and never reaches another account: a foreign id answers not found. Requires the caller's own autario account (API key or OAuth).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoThe id of the thing to read or change: the project for "get" and "update", the objective for "update_objective", the key result for "update_key_result".
kindNoIs this a project with an end, or recurring day-to-day work? Default "project".
sortNoFor "list": the order of cards inside each group. "board" (default) puts off-track work first; "effort_impact" orders by impact (5 to 1) then effort (fewest days first), unrated work last. No combined score is computed.
unitNoFor key results: the unit the number is in.
briefNoA short description of what the project is.
groupNoFor "list": which axis the cards are folded on. Default "okr", which is the axis that answers "does everything we do pay into something we agreed".
ownerNoThe one person accountable for it.
stageNoWhere it stands. A new project starts "active" (running); when the board owner switched on "New projects need admin approval", a non-admin's new project starts at "inbox" (pending review) and only an admin moves it out. "long_list" = agreed, not started; "done" = finished.
titleNoProject title. Required for "create".
actionNoWhat to do. Default "list".
formatNoOutput wire format for this MCP call. Default 'toon' (Token-Oriented Notation, fewest tokens, best for tabular rows). 'compact' = minified JSON. 'json' = pretty JSON for readability. The REST API always returns JSON regardless.
impactNoExpected impact as a judgement: 1 low, 2 some, 3 clear, 4 high, 5 very high.
statusNoThe traffic light, set by a person: on track, at risk, off track.
targetNoFor key results: the number that counts as done. Required on create.
countryNoThe region or country that runs it, in the account's own words ("DACH", "Nordics"), not an ISO code.
ends_onNoFor objectives: end of that window, YYYY-MM-DD.
baselineNoFor key results: where the number started. Attainment runs from baseline to target.
functionNoThe function that contributes it ("Marketing", "Supply chain").
directionNoFor key results: whether higher or lower is better. Default increase.
guards_idNoFor key results: makes this key result a GUARDRAIL of that key result.
parent_idNoThe project this one is part of. Projects nest at most three levels deep (programme, workstream, piece); a move that would make a fourth level or a loop is refused with a sentence. Parent progress, when the parent has none of its own, is the mean of its children and says so.
starts_onNoFor objectives: start of the window its key results are paced against, YYYY-MM-DD.
commitmentNoFor objectives: committed (expected at 1.0) or aspirational (0.7 is a good outcome). Changes the status rule of its key results, never a number.
dataset_idNoFor key results: the dataset the value is read from (any dataset on this account).
started_atNoStart date, YYYY-MM-DD.
effort_daysNoEstimated effort in person days.
target_dateNoTarget date, YYYY-MM-DD. "Due in N days" / "overdue by N days" is derived from it on every read and never stored.
contributorsNoEveryone else working on it. These names are what the person axis groups by, together with the owner.
filter_valueNoFor key results: the value filter_column must have.
manual_valueNoFor key results: the current value typed by hand. Shown as typed by hand; prefer dataset_id + value_column.
objective_idNoFor "create_key_result": the objective it belongs to. "objectives" lists them.
progress_pctNoProgress in percent, 0 to 100, set by a person. Never derived from milestones or dates.
spent_amountNoMoney spent so far, typed by a person, in budget_currency.
value_columnNoFor key results: the column of dataset_id that holds the number.
budget_amountNoBudget. Needs budget_currency. Never converted between currencies.
filter_columnNoFor key results: optional column to filter the dataset on.
key_result_idNoThe id of the key result this project pays into. "list" returns the linkable ones in `key_results`; pass one of their `id` values. Omit for work that pays into nothing yet, which is exactly what the OKR axis is there to make visible.
resources_urlNoA link to where the actual work lives (a drive folder, a board, a doc). http(s) only.
target_reasonNoFor "update_key_result": why the target moves (ten characters or more). Required whenever `target` changes; the change is kept in the key result history.
guardrail_noteNoFor key results: how this number could be reached the wrong way.
budget_currencyNoThree letter currency code of the budget, e.g. EUR.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / stage / description
      Previous value: -"Where it stands. A new project starts at \"inbox\" (it popped up, nobody decided yet); the decision is \"long_list\" (agreed, not started) or \"active\" (running)."New value: +"Where it stands. A new project starts \"active\" (running); when the board owner switched on \"New projects need admin approval\", a non-admin's new project starts at \"inbox\" (pending review) and only an admin moves it out. \"long_list\" = agreed, not started; \"done\" = finished."
  2. Changed20 schema fields changed
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "list",
      -  "get",
      -  "create",
      -  "update"
      -]New value: +[
      +  "list",
      +  "get",
      +  "create",
      +  "update",
      +  "objectives",
      +  "create_objective",
      +  "update_objective",
      +  "create_key_result",
      +  "update_key_result"
      +]
    • addedInput schema / properties / baseline
      Added value: +{
      +  "description": "For key results: where the number started. Attainment runs from baseline to target.",
      +  "type": "number"
      +}
    • addedInput schema / properties / commitment
      Added value: +{
      +  "description": "For objectives: committed (expected at 1.0) or aspirational (0.7 is a good outcome). Changes the status rule of its key results, never a number.",
      +  "enum": [
      +    "committed",
      +    "aspirational"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / dataset_id
      Added value: +{
      +  "description": "For key results: the dataset the value is read from (any dataset on this account).",
      +  "type": "string"
      +}
    • addedInput schema / properties / direction
      Added value: +{
      +  "description": "For key results: whether higher or lower is better. Default increase.",
      +  "enum": [
      +    "increase",
      +    "decrease"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / ends_on
      Added value: +{
      +  "description": "For objectives: end of that window, YYYY-MM-DD.",
      +  "type": "string"
      +}
    • addedInput schema / properties / filter_column
      Added value: +{
      +  "description": "For key results: optional column to filter the dataset on.",
      +  "type": "string"
      +}
    • addedInput schema / properties / filter_value
      Added value: +{
      +  "description": "For key results: the value filter_column must have.",
      +  "type": "string"
      +}
    • addedInput schema / properties / guardrail_note
      Added value: +{
      +  "description": "For key results: how this number could be reached the wrong way.",
      +  "type": "string"
      +}
    • addedInput schema / properties / guards_id
      Added value: +{
      +  "description": "For key results: makes this key result a GUARDRAIL of that key result.",
      +  "type": "string"
      +}
    • changedInput schema / properties / id / description
      Previous value: -"The project id. Required for \"get\" and \"update\"."New value: +"The id of the thing to read or change: the project for \"get\" and \"update\", the objective for \"update_objective\", the key result for \"update_key_result\"."
    • addedInput schema / properties / key_result_id
      Added value: +{
      +  "description": "The id of the key result this project pays into. \"list\" returns the linkable ones in `key_results`; pass one of their `id` values. Omit for work that pays into nothing yet, which is exactly what the OKR axis is there to make visible.",
      +  "type": "string"
      +}
    • addedInput schema / properties / manual_value
      Added value: +{
      +  "description": "For key results: the current value typed by hand. Shown as typed by hand; prefer dataset_id + value_column.",
      +  "type": "number"
      +}
    • addedInput schema / properties / objective_id
      Added value: +{
      +  "description": "For \"create_key_result\": the objective it belongs to. \"objectives\" lists them.",
      +  "type": "string"
      +}
    • removedInput schema / properties / okr_kr
      Removed value: -{
      -  "description": "The slug of the OKR key result this project pays into. \"list\" returns the linkable ones in `key_results`; pass one of their `slug` values. Omit for work that pays into nothing yet, which is exactly what the OKR axis is there to make visible.",
      -  "type": "string"
      -}
    • addedInput schema / properties / starts_on
      Added value: +{
      +  "description": "For objectives: start of the window its key results are paced against, YYYY-MM-DD.",
      +  "type": "string"
      +}
    • addedInput schema / properties / target
      Added value: +{
      +  "description": "For key results: the number that counts as done. Required on create.",
      +  "type": "number"
      +}
    • addedInput schema / properties / target_reason
      Added value: +{
      +  "description": "For \"update_key_result\": why the target moves (ten characters or more). Required whenever `target` changes; the change is kept in the key result history.",
      +  "type": "string"
      +}
    • addedInput schema / properties / unit
      Added value: +{
      +  "description": "For key results: the unit the number is in.",
      +  "type": "string"
      +}
    • addedInput schema / properties / value_column
      Added value: +{
      +  "description": "For key results: the column of dataset_id that holds the number.",
      +  "type": "string"
      +}
  3. Added

TDQS

A4.7/5.0
Behavior5/5

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

Annotations are sparse (only readOnlyHint, openWorldHint, idempotentHint, destructiveHint, all false), so the description carries the burden. It discloses determinism ('no LLM on this path'), derivation rules (due date, status, parent progress), the value rule (never both manual and dataset, null with reason never zero), approval-flow stage behavior, and hard constraints like currency non-conversion and max nesting depth.

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

Conciseness5/5

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

Although long, the description is front-loaded with purpose and organized into clear sections (PROJECTS, OBJECTIVES, THE VALUE RULE, NEVER). Each section earns its place by covering a distinct aspect of behavior, and the length is justified by the tool's 41-parameter complexity and absence of an output schema.

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?

With no output schema, the description explains what each action returns ('list' folds the board on one axis, 'get' returns one project with milestones and KPIs, 'objectives' returns every objective with key results and derived status). It also covers auth requirements, error-ish behavior (foreign id answers not found, loop refused), and important exclusions, making it sufficiently complete for correct invocation.

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%, so the baseline is 3, but the description adds cross-parameter meaning not in the schema: the EITHER/OR value rule for KPIs and key results, the relationship between guards_id and the guarded key result's status, and the derived behavior of sort and parent progress. This helps an agent choose between manual_value, dataset_id/value_column, and key_result_id correctly.

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?

The description opens with a specific verb/resource: 'the caller's OWN project board with its objectives and key results', and enumerates the exact queries it answers ('what is my team working on', 'which key result has no project behind it'). It clearly scopes to the caller's own account and explicitly says it never reaches another account, distinguishing it from broader analytics siblings.

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

Usage Guidelines4/5

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

It gives explicit call triggers ('Call it for...'), a full list of actions, and a 'NEVER' section that states what the tool does not do (never derives traffic light, never invents a key result, never reaches another account). It does not name sibling tools as alternatives, but the when/when-not guidance is otherwise strong.

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.

Resources