Skip to main content
Glama

Update key result

update_key_result
Destructive

Update a key result for the company operator and any agent owning KR progress (progress, assignment, due date, rename, measure binding). Use when work moves a Key Result and you need to log current value, reassign, rename, fix the unit label, or bind a measure source. Prefer key_result_id — the parent objective is resolved from the KR row (no fuzzy title search). Title match is a fallback; resolution uses the EXISTING title even when renaming in the same call. A missing/archived KR returns one terminal recovery with live alternatives — do not retry the same args.

[write-tier — first use may require a manager's approval; a from-now-on approval makes future calls seamless, a just-once approval re-asks next time. Call it on the first clear ask; the card is the yes — do not re-ask in chat.]

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
unitNoUnit label for the number (e.g. "$", "%", "leads"). A label fix, allowed on a bound KR too — the source owns the number, the unit names it. Before this, a wrong unit could only be fixed by recreate-and-rebind, losing history.
monthNoYYYY-MM the current_value belongs to (default: this UTC month when current_value is set). Upserts monthly_history; live current becomes the latest month in history.
titleNoNew display title for the key result (rename)
due_dateNoDue date (YYYY-MM-DD format)
companyIdYesFreedomOS company id to act within (you must be a member). Required for company-scoped tools.
directionNoGoal direction. "at_least" (default): reach the target. "at_most": stay UNDER the target — a ceiling. A ceiling KR is on-track only while current ≤ target.
start_dateNoStart date (YYYY-MM-DD format)
assigned_toNoUser ID to assign this KR to. Use "me" or "current_user" to assign to the current user.
descriptionNoWhat the number is. Read back on get_okrs.
objective_idNoID of the parent objective (optional when key_result_id is set — id resolves the parent)
target_valueNoTarget value to achieve. 0 is a valid monthly floor.
current_valueNoManual KRs only — refused on a KR bound to a measure_source (the sweep owns current; pass measure_source "none" first to make it manual). THIS calendar month's actual unless month is set. Not YTD, not a projection.
key_result_idNoStable KR id (preferred). Parent objective is looked up from the KR row across active objectives — do not re-search by fuzzy objective title.
measure_sourceNoBind current progress to a live data source (auto-updated daily by the OKR health sweep). One of: stripe_active_subscribers, stripe_mrr, crm_active_leads, crm_webhook_leads_month, customer_evidence_count, product_telemetry_count, fcf_last_closed_month, amazon_deposits_last_closed_month, human_door_decisions_28d, factory_landings_aligned_pct_28d. Pass "none" to unbind and return the KR to manual updates. Do not bind finance/P&L here.
objective_titleNoTitle of the parent objective (optional when key_result_id is set — id resolves the parent)
key_result_titleNoTitle of the key result to update (use this OR key_result_id) — matched against the CURRENT title, even when also renaming

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / current_value / description
      Previous value: -"THIS calendar month's actual unless month is set. Not YTD, not a future projection. FCF: get_financial_summary displayed_net_cash_flow. Amazon deposits: get_monthly_trends Amazon Sales."New value: +"Manual KRs only — refused on a KR bound to a measure_source (the sweep owns current; pass measure_source \"none\" first to make it manual). THIS calendar month's actual unless month is set. Not YTD, not a projection."
    • addedInput schema / properties / direction
      Added value: +{
      +  "description": "Goal direction. \"at_least\" (default): reach the target. \"at_most\": stay UNDER the target — a ceiling. A ceiling KR is on-track only while current ≤ target.",
      +  "enum": [
      +    "at_least",
      +    "at_most"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / measure_source / description
      Previous value: -"Bind current progress to a live data source (auto-updated daily by the OKR health sweep). One of: stripe_active_subscribers, stripe_mrr, crm_active_leads. Pass \"none\" to unbind and return the KR to manual updates."New value: +"Bind current progress to a live data source (auto-updated daily by the OKR health sweep). One of: stripe_active_subscribers, stripe_mrr, crm_active_leads, crm_webhook_leads_month, customer_evidence_count, product_telemetry_count, fcf_last_closed_month, amazon_deposits_last_closed_month, human_door_decisions_28d, factory_landings_aligned_pct_28d. Pass \"none\" to unbind and return the KR to manual updates. Do not bind finance/P&L here."
    • addedInput schema / properties / unit
      Added value: +{
      +  "description": "Unit label for the number (e.g. \"$\", \"%\", \"leads\"). A label fix, allowed on a bound KR too — the source owns the number, the unit names it. Before this, a wrong unit could only be fixed by recreate-and-rebind, losing history.",
      +  "type": "string"
      +}
  2. Changed4 schema fields changed
    • changedInput schema / properties / current_value / description
      Previous value: -"Current progress value"New value: +"THIS calendar month's actual unless month is set. Not YTD, not a future projection. FCF: get_financial_summary displayed_net_cash_flow. Amazon deposits: get_monthly_trends Amazon Sales."
    • addedInput schema / properties / description
      Added value: +{
      +  "description": "What the number is. Read back on get_okrs.",
      +  "type": "string"
      +}
    • addedInput schema / properties / month
      Added value: +{
      +  "description": "YYYY-MM the current_value belongs to (default: this UTC month when current_value is set). Upserts monthly_history; live current becomes the latest month in history.",
      +  "type": "string"
      +}
    • changedInput schema / properties / target_value / description
      Previous value: -"Target value to achieve"New value: +"Target value to achieve. 0 is a valid monthly floor."
  3. Changed3 schema fields changed
    • changedInput schema / properties / key_result_id / description
      Previous value: -"ID of the key result (optional if using key_result_title)"New value: +"Stable KR id (preferred). Parent objective is looked up from the KR row across active objectives — do not re-search by fuzzy objective title."
    • changedInput schema / properties / objective_id / description
      Previous value: -"ID of the parent objective (optional if using objective_title)"New value: +"ID of the parent objective (optional when key_result_id is set — id resolves the parent)"
    • changedInput schema / properties / objective_title / description
      Previous value: -"Title of the parent objective (use this OR objective_id)"New value: +"Title of the parent objective (optional when key_result_id is set — id resolves the parent)"
  4. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag this as destructive/write-tier, and the description layers on approval behavior (from-now-on vs just-once), the 'card is the yes' instruction, and the terminal recovery behavior for missing/archived KRs with a no-retry warning. This is exactly the kind of context annotations alone cannot convey.

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?

Dense but every sentence earns its place: what it does, when to use it, key resolution, failure behavior, and approval policy. The use case is front-loaded before the operational details.

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?

For a complex 16-parameter destructive write with no output schema, the description covers key identifier choice, title fallback, missing/archived handling, rebinding/unit semantics, and the approval flow. Nothing an agent needs to invoke it correctly is missing; remaining parameter details live in the fully covered schema.

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%, so the structured field descriptions already carry the parameter-level meaning. The tool description reiterates which operations map to parameters but adds little beyond what the schema already provides.

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+resource — 'Update a key result' — and enumerates the mutable set: progress, assignment, due date, rename, measure binding. This clearly separates it from create_key_result, delete_key_result, and generic update_* siblings.

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?

States exactly when to invoke: 'Use when work moves a Key Result and you need to log current value, reassign, rename, fix the unit label, or bind a measure source.' It also gives resolution guidance — prefer key_result_id over fuzzy title search — and explains the title-match fallback semantics.

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