Skip to main content
Glama

Update project

well_update_project
Destructive

Change a project of the current workspace: its name, kind, status, dates, amount and currency, the project it nests under, for a project how its work is priced (billing_method), for a campaign its channel (google_ads, linkedin_ads, reddit_ads, chatgpt_ads, meta_ads, tiktok_ads, pinterest_ads), objective (awareness, traffic, engagement, leads, sales), included and excluded audiences, for a flow its trigger audience, for a pipeline its paid stage, for a pipeline stage its win chance (probability), and for a deal its stage, owner, counterparty, win probability and position.

Use this tool when the user asks to rename a project, move it to another status (for example mark a deal won or lost), move a deal to another stage, change its dates, amount, owner, counterparty or chance, set how a project is billed, set a stage's win chance, name the stage of a pipeline that means paid, or nest it under another project. Find the project_id first with a one-row well_query_records lookup.

REQUIRED: project_id. OPTIONAL (only the fields the user wants changed): hidden, name, kind, status, start_date, end_date (YYYY-MM-DD), amount (a decimal string; the resulting project needs a currency), currency, parent_project_id, stage_project_id, owner_person_id, counterparty_company_id, counterparty_person_id, probability (a percentage from 0 through 100, at most two decimals; on a deal its own chance, on a pipeline stage the chance its open deals count at), position (a whole number from 0), billing_method (a project only: project_rate, service_rate, person_rate, fixed_fee, non_billable), channel and objective (a campaign only), included_audience_project_id and excluded_audience_project_id (a campaign or an ad set), trigger_audience_project_id (a flow only), paid_stage_project_id (a pipeline only: one of its own stages). Audience ids must name live audiences of this workspace. The ids are ids of this workspace. Use one-row well_query_records lookups to resolve them. Pass null to clear an optional field; an explicit null is a complete change.

Each kind takes its own parent, statuses and fields: deal: no parent; status draft, active, paused, won, lost, archived; takes owner_person_id, counterparty_company_id, counterparty_person_id, stage_project_id, probability, position, end_date, amount, currency. pipeline: no parent; status active, archived; takes paid_stage_project_id. pipeline_stage: nests under a pipeline; status active, archived; takes position, probability. cost_center: may nest under a cost_center; status active, archived; takes no other field. property: no parent; status active, archived; takes no other field. project: may nest under a project; status draft, active, paused, completed, archived; takes counterparty_company_id, counterparty_person_id, start_date, end_date, amount, currency, billing_method. campaign: no parent; status draft, active, paused, completed, archived; takes start_date, end_date, channel, objective, included_audience_project_id, excluded_audience_project_id. audience: no parent; status draft, active, paused, completed, archived; takes start_date, end_date. flow: no parent; status draft, active, paused, completed, archived; takes start_date, end_date, trigger_audience_project_id. ad_set: nests under a campaign; status draft, active, paused, completed, archived; takes start_date, end_date, included_audience_project_id, excluded_audience_project_id. ad: may nest under a campaign or ad_set; status draft, active, paused, completed, archived; takes start_date, end_date. experiment: no parent; status draft, active, paused, completed, archived; takes start_date, end_date, experiment_outcome. Only an experiment takes experiment_outcome (keep, revert, iterate); an ad set may include or exclude live audiences. Pass null to clear either optional field. A status moves along the kind's own path: a deal opens from draft, closes won or lost from active or paused, and a closed deal reopens to active before anything else; an archived project reopens to active. A field the kind does not take, or a move it does not allow, fails and nothing is written.

A pipeline's paid stage is where Well moves a deal of that pipeline on its own, once the bank settles an invoice of the deal's counterparty company, or of a company its counterparty contact works for: an invoice that reads paid with a confirmed bank payment, never one only marked paid. Well tries the move right after such a payment saves, and right after a change names the paid stage or a deal's counterparty. That try can miss a deal: when many payments save at once, past the first 200 deals one try reads, after a restart, for a deal created with a counterparty already settled, or for a deal a person moves onto a stage before the paid stage. A deal the try misses moves only once Well's hourly catch-up is armed. Well moves each deal once, never moves a deal to an earlier stage, never moves a lost or archived deal, and the deal's history shows Well made the move. To take a deal Well moved off the paid stage, move it with stage_project_id: Well leaves it where the person put it. A deal Well never moved, for example one a person put on the paid stage by hand, goes onto the paid stage at Well's next try while its invoice reads settled.

A pipeline stage's win chance is a workspace-wide setting: only an owner or an admin of the workspace can set or clear it, and it changes for the whole workspace. On WhatsApp, a complete typed order from an owner or an admin that names the stage and the new percent saves at once, and the reply says "Saved: now counts at % for the whole workspace." Any other stage order asks for one confirm first, and the confirm card names the workspace, the stage and the old and new percent.

A project a connected tool synced in (synced: true) keeps name, kind, parent_project_id, amount, currency, end_date, stage_project_id, owner_person_id, counterparty_company_id, counterparty_person_id, channel, objective, included_audience_project_id, excluded_audience_project_id, trigger_audience_project_id from that tool: a change that names any of them fails, even beside others, and the user changes them in that tool. status, probability, position, start_date, billing_method, experiment_outcome, paid_stage_project_id, hidden change in Well on a synced project too. A patch is complete when it names the fields to change; do not ask for fields it leaves alone. On WhatsApp, the person's complete typed change approves and writes at once, except a stage's win chance, which saves at once only in the complete typed order above. Other surfaces still use their normal approval.

hidden: true hides the project from Well's lists and figures and keeps it; hidden: false shows it again. It works on a synced project too, since no sync writes it. When the person asks to delete a synced project, well_delete_project refuses and offers this hide: ask the person, then call this tool with only project_id and hidden: true.

Returns { success: true, project } on success, or { success: false, error } on failure.

Input Schema

NameRequiredDescriptionDefault
kindNoWhat the project is: deal, pipeline, pipeline_stage, cost_center, property, project, campaign, audience, flow, ad_set, ad, experiment. Ask the user when it is not clear.
nameNo
amountNo
hiddenNotrue hides the row from Well's lists and figures and keeps it, with every value a connected tool wrote; false shows it again. Omit to leave it as it is.
statusNoWhere the project stands: draft, active, paused, won, lost, archived, completed. A kind holds only some of them. Ask the user when it is not clear.
channelNoThe ad platform a campaign runs on: google_ads, linkedin_ads, reddit_ads, chatgpt_ads, meta_ads, tiktok_ads, pinterest_ads. Only a campaign takes it; null clears it.
currencyNo
end_dateNo
positionNo
objectiveNoThe campaign objective: awareness, traffic, engagement, leads, sales. Only a campaign takes it; null clears it.
project_idYesThe project to change, from a one-row well_query_records lookup.
start_dateNo
probabilityNo
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several — a write lands in exactly one workspace and this call would not say which.
billing_methodNoHow the work of a project is priced: project_rate, service_rate, person_rate, fixed_fee, non_billable. Only a project takes it; null clears it.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
owner_person_idNo
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.
stage_project_idNo
parent_project_idNo
experiment_outcomeNoThe experiment result: keep, revert, iterate. Only an experiment takes it; null clears it.
paid_stage_project_idNoOn a pipeline: the project_id of its own stage that means paid. A deal of the pipeline moves onto it once the bank settles the creator's invoice; null clears it.
counterparty_person_idNo
counterparty_company_idNo
trigger_audience_project_idNo
excluded_audience_project_idNo
included_audience_project_idNo

Output Schema

NameRequiredDescriptionDefault
codeNo
errorNo
projectNo
successYes
previousNo
reply_linesNo
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
near_candidatesNo
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.
near_candidates_truncatedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / channel / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "google_ads",
      -      "linkedin_ads",
      -      "reddit_ads",
      -      "chatgpt_ads"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "google_ads",
      +      "linkedin_ads",
      +      "reddit_ads",
      +      "chatgpt_ads",
      +      "meta_ads",
      +      "tiktok_ads",
      +      "pinterest_ads"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / channel / description
      Previous value: -"The ad platform a campaign runs on: google_ads, linkedin_ads, reddit_ads, chatgpt_ads. Only a campaign takes it; null clears it."New value: +"The ad platform a campaign runs on: google_ads, linkedin_ads, reddit_ads, chatgpt_ads, meta_ads, tiktok_ads, pinterest_ads. Only a campaign takes it; null clears it."
  2. Changed6 schema fields changed
    • addedInput schema / properties / experiment_outcome
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "keep",
      +        "revert",
      +        "iterate"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The experiment result: keep, revert, iterate. Only an experiment takes it; null clears it."
      +}
    • changedInput schema / properties / kind / description
      Previous value: -"What the project is: deal, pipeline, pipeline_stage, cost_center, property, project, campaign, audience, flow, ad_set, ad. Ask the user when it is not clear."New value: +"What the project is: deal, pipeline, pipeline_stage, cost_center, property, project, campaign, audience, flow, ad_set, ad, experiment. Ask the user when it is not clear."
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "campaign",
      -  "ad_set",
      -  "ad",
      -  "audience",
      -  "flow",
      -  "deal",
      -  "cost_center",
      -  "project",
      -  "property",
      -  "pipeline",
      -  "pipeline_stage"
      -]New value: +[
      +  "campaign",
      +  "ad_set",
      +  "ad",
      +  "audience",
      +  "flow",
      +  "deal",
      +  "cost_center",
      +  "project",
      +  "property",
      +  "pipeline",
      +  "pipeline_stage",
      +  "experiment"
      +]
    • addedOutput schema / properties / project / properties / experiment_outcome
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "keep",
      +        "revert",
      +        "iterate"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / project / properties / kind / enum
      Previous value: -[
      -  "campaign",
      -  "ad_set",
      -  "ad",
      -  "audience",
      -  "flow",
      -  "deal",
      -  "cost_center",
      -  "project",
      -  "property",
      -  "pipeline",
      -  "pipeline_stage"
      -]New value: +[
      +  "campaign",
      +  "ad_set",
      +  "ad",
      +  "audience",
      +  "flow",
      +  "deal",
      +  "cost_center",
      +  "project",
      +  "property",
      +  "pipeline",
      +  "pipeline_stage",
      +  "experiment"
      +]
    • changedOutput schema / properties / project / required
      Previous value: -[
      -  "project_id",
      -  "name",
      -  "kind",
      -  "status",
      -  "start_date",
      -  "end_date",
      -  "amount",
      -  "currency",
      -  "parent_project_id",
      -  "owner_person_id",
      -  "counterparty_company_id",
      -  "counterparty_company_name",
      -  "counterparty_person_id",
      -  "counterparty_person_name",
      -  "stage_project_id",
      -  "stage_name",
      -  "probability",
      -  "position",
      -  "billing_method",
      -  "channel",
      -  "objective",
      -  "included_audience_project_id",
      -  "excluded_audience_project_id",
      -  "trigger_audience_project_id",
      -  "paid_stage_project_id",
      -  "synced",
      -  "hidden",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "project_id",
      +  "name",
      +  "kind",
      +  "status",
      +  "start_date",
      +  "end_date",
      +  "amount",
      +  "currency",
      +  "parent_project_id",
      +  "owner_person_id",
      +  "counterparty_company_id",
      +  "counterparty_company_name",
      +  "counterparty_person_id",
      +  "counterparty_person_name",
      +  "stage_project_id",
      +  "stage_name",
      +  "probability",
      +  "position",
      +  "billing_method",
      +  "channel",
      +  "objective",
      +  "experiment_outcome",
      +  "included_audience_project_id",
      +  "excluded_audience_project_id",
      +  "trigger_audience_project_id",
      +  "paid_stage_project_id",
      +  "synced",
      +  "hidden",
      +  "created_at",
      +  "updated_at"
      +]
  3. Changed3 schema fields changed
    • addedInput schema / properties / paid_stage_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "On a pipeline: the project_id of its own stage that means paid. A deal of the pipeline moves onto it once the bank settles the creator's invoice; null clears it."
      +}
    • addedOutput schema / properties / project / properties / paid_stage_project_id
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / project / required
      Previous value: -[
      -  "project_id",
      -  "name",
      -  "kind",
      -  "status",
      -  "start_date",
      -  "end_date",
      -  "amount",
      -  "currency",
      -  "parent_project_id",
      -  "owner_person_id",
      -  "counterparty_company_id",
      -  "counterparty_company_name",
      -  "counterparty_person_id",
      -  "counterparty_person_name",
      -  "stage_project_id",
      -  "stage_name",
      -  "probability",
      -  "position",
      -  "billing_method",
      -  "channel",
      -  "objective",
      -  "included_audience_project_id",
      -  "excluded_audience_project_id",
      -  "trigger_audience_project_id",
      -  "synced",
      -  "hidden",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "project_id",
      +  "name",
      +  "kind",
      +  "status",
      +  "start_date",
      +  "end_date",
      +  "amount",
      +  "currency",
      +  "parent_project_id",
      +  "owner_person_id",
      +  "counterparty_company_id",
      +  "counterparty_company_name",
      +  "counterparty_person_id",
      +  "counterparty_person_name",
      +  "stage_project_id",
      +  "stage_name",
      +  "probability",
      +  "position",
      +  "billing_method",
      +  "channel",
      +  "objective",
      +  "included_audience_project_id",
      +  "excluded_audience_project_id",
      +  "trigger_audience_project_id",
      +  "paid_stage_project_id",
      +  "synced",
      +  "hidden",
      +  "created_at",
      +  "updated_at"
      +]
  4. Changed3 schema fields changed
    • changedInput schema / properties / kind / description
      Previous value: -"What the project is: deal, pipeline, pipeline_stage, cost_center, property, project, campaign, audience, flow, ad. Ask the user when it is not clear."New value: +"What the project is: deal, pipeline, pipeline_stage, cost_center, property, project, campaign, audience, flow, ad_set, ad. Ask the user when it is not clear."
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "campaign",
      -  "ad",
      -  "audience",
      -  "flow",
      -  "deal",
      -  "cost_center",
      -  "project",
      -  "property",
      -  "pipeline",
      -  "pipeline_stage"
      -]New value: +[
      +  "campaign",
      +  "ad_set",
      +  "ad",
      +  "audience",
      +  "flow",
      +  "deal",
      +  "cost_center",
      +  "project",
      +  "property",
      +  "pipeline",
      +  "pipeline_stage"
      +]
    • changedOutput schema / properties / project / properties / kind / enum
      Previous value: -[
      -  "campaign",
      -  "ad",
      -  "audience",
      -  "flow",
      -  "deal",
      -  "cost_center",
      -  "project",
      -  "property",
      -  "pipeline",
      -  "pipeline_stage"
      -]New value: +[
      +  "campaign",
      +  "ad_set",
      +  "ad",
      +  "audience",
      +  "flow",
      +  "deal",
      +  "cost_center",
      +  "project",
      +  "property",
      +  "pipeline",
      +  "pipeline_stage"
      +]
  5. Changed42 schema fields changed
    • removedInput schema / properties / end_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / end_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / start_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / start_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / code
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / near_candidates
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "company_id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "company_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / near_candidates_truncated
      Added value: +{
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / project / properties / amount / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / amount / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / channel / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / channel / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / counterparty_company_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / counterparty_company_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / counterparty_company_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / counterparty_company_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / counterparty_person_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / counterparty_person_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / counterparty_person_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / counterparty_person_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / end_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / end_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / excluded_audience_project_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / excluded_audience_project_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / included_audience_project_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / included_audience_project_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / objective / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / objective / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / owner_person_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / owner_person_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / parent_project_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / parent_project_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / stage_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / stage_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / stage_project_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / stage_project_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / start_date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / start_date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / trigger_audience_project_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / trigger_audience_project_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / project / properties / updated_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / project / properties / updated_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / reply_lines
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  6. Changed12 schema fields changed
    • addedInput schema / properties / channel
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "google_ads",
      +        "linkedin_ads",
      +        "reddit_ads",
      +        "chatgpt_ads"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The ad platform a campaign runs on: google_ads, linkedin_ads, reddit_ads, chatgpt_ads. Only a campaign takes it; null clears it."
      +}
    • addedInput schema / properties / excluded_audience_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / included_audience_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / objective
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "awareness",
      +        "traffic",
      +        "engagement",
      +        "leads",
      +        "sales"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The campaign objective: awareness, traffic, engagement, leads, sales. Only a campaign takes it; null clears it."
      +}
    • addedInput schema / properties / trigger_audience_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / previous
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "status": {
      +      "enum": [
      +        "draft",
      +        "active",
      +        "paused",
      +        "won",
      +        "lost",
      +        "completed",
      +        "archived"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "status"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / project / properties / channel
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / excluded_audience_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / included_audience_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / objective
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / trigger_audience_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / project / required
      Previous value: -[
      -  "project_id",
      -  "name",
      -  "kind",
      -  "status",
      -  "start_date",
      -  "end_date",
      -  "amount",
      -  "currency",
      -  "parent_project_id",
      -  "owner_person_id",
      -  "counterparty_company_id",
      -  "counterparty_company_name",
      -  "counterparty_person_id",
      -  "counterparty_person_name",
      -  "stage_project_id",
      -  "stage_name",
      -  "probability",
      -  "position",
      -  "billing_method",
      -  "synced",
      -  "hidden",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "project_id",
      +  "name",
      +  "kind",
      +  "status",
      +  "start_date",
      +  "end_date",
      +  "amount",
      +  "currency",
      +  "parent_project_id",
      +  "owner_person_id",
      +  "counterparty_company_id",
      +  "counterparty_company_name",
      +  "counterparty_person_id",
      +  "counterparty_person_name",
      +  "stage_project_id",
      +  "stage_name",
      +  "probability",
      +  "position",
      +  "billing_method",
      +  "channel",
      +  "objective",
      +  "included_audience_project_id",
      +  "excluded_audience_project_id",
      +  "trigger_audience_project_id",
      +  "synced",
      +  "hidden",
      +  "created_at",
      +  "updated_at"
      +]
  7. Changed5 schema fields changed
    • addedInput schema / properties / hidden
      Added value: +{
      +  "description": "true hides the row from Well's lists and figures and keeps it, with every value a connected tool wrote; false shows it again. Omit to leave it as it is.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / project / properties / counterparty_company_name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / counterparty_person_name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / hidden
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / project / required
      Previous value: -[
      -  "project_id",
      -  "name",
      -  "kind",
      -  "status",
      -  "start_date",
      -  "end_date",
      -  "amount",
      -  "currency",
      -  "parent_project_id",
      -  "owner_person_id",
      -  "counterparty_company_id",
      -  "counterparty_person_id",
      -  "stage_project_id",
      -  "stage_name",
      -  "probability",
      -  "position",
      -  "billing_method",
      -  "synced",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "project_id",
      +  "name",
      +  "kind",
      +  "status",
      +  "start_date",
      +  "end_date",
      +  "amount",
      +  "currency",
      +  "parent_project_id",
      +  "owner_person_id",
      +  "counterparty_company_id",
      +  "counterparty_company_name",
      +  "counterparty_person_id",
      +  "counterparty_person_name",
      +  "stage_project_id",
      +  "stage_name",
      +  "probability",
      +  "position",
      +  "billing_method",
      +  "synced",
      +  "hidden",
      +  "created_at",
      +  "updated_at"
      +]
  8. Changed3 schema fields changed
    • changedInput schema / properties / project_id / description
      Previous value: -"The project to change, from well_list_projects."New value: +"The project to change, from a one-row well_query_records lookup."
    • addedOutput schema / properties / project / properties / stage_name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / project / required
      Previous value: -[
      -  "project_id",
      -  "name",
      -  "kind",
      -  "status",
      -  "start_date",
      -  "end_date",
      -  "amount",
      -  "currency",
      -  "parent_project_id",
      -  "owner_person_id",
      -  "counterparty_company_id",
      -  "counterparty_person_id",
      -  "stage_project_id",
      -  "probability",
      -  "position",
      -  "billing_method",
      -  "synced",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "project_id",
      +  "name",
      +  "kind",
      +  "status",
      +  "start_date",
      +  "end_date",
      +  "amount",
      +  "currency",
      +  "parent_project_id",
      +  "owner_person_id",
      +  "counterparty_company_id",
      +  "counterparty_person_id",
      +  "stage_project_id",
      +  "stage_name",
      +  "probability",
      +  "position",
      +  "billing_method",
      +  "synced",
      +  "created_at",
      +  "updated_at"
      +]
  9. Changed17 schema fields changed
    • addedInput schema / properties / billing_method
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "project_rate",
      +        "service_rate",
      +        "person_rate",
      +        "fixed_fee",
      +        "non_billable"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "How the work of a project is priced: project_rate, service_rate, person_rate, fixed_fee, non_billable. Only a project takes it; null clears it."
      +}
    • addedInput schema / properties / counterparty_company_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / counterparty_person_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / kind / description
      Added value: +"What the project is: deal, pipeline, pipeline_stage, cost_center, property, project, campaign, audience, flow, ad. Ask the user when it is not clear."
    • addedInput schema / properties / owner_person_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / position
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / probability
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "multipleOf": 0.01,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / stage_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedInput schema / properties / status / description
      Added value: +"Where the project stands: draft, active, paused, won, lost, archived, completed. A kind holds only some of them. Ask the user when it is not clear."
    • addedOutput schema / properties / project / properties / billing_method
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "project_rate",
      +        "service_rate",
      +        "person_rate",
      +        "fixed_fee",
      +        "non_billable"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / counterparty_company_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / counterparty_person_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / owner_person_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / position
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / probability
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / project / properties / stage_project_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / project / required
      Previous value: -[
      -  "project_id",
      -  "name",
      -  "kind",
      -  "status",
      -  "start_date",
      -  "end_date",
      -  "amount",
      -  "currency",
      -  "parent_project_id",
      -  "synced",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "project_id",
      +  "name",
      +  "kind",
      +  "status",
      +  "start_date",
      +  "end_date",
      +  "amount",
      +  "currency",
      +  "parent_project_id",
      +  "owner_person_id",
      +  "counterparty_company_id",
      +  "counterparty_person_id",
      +  "stage_project_id",
      +  "probability",
      +  "position",
      +  "billing_method",
      +  "synced",
      +  "created_at",
      +  "updated_at"
      +]
  10. Changed2 schema fields changed
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "campaign",
      -  "ad",
      -  "audience",
      -  "flow",
      -  "deal",
      -  "cost_center",
      -  "project",
      -  "property"
      -]New value: +[
      +  "campaign",
      +  "ad",
      +  "audience",
      +  "flow",
      +  "deal",
      +  "cost_center",
      +  "project",
      +  "property",
      +  "pipeline",
      +  "pipeline_stage"
      +]
    • changedOutput schema / properties / project / properties / kind / enum
      Previous value: -[
      -  "campaign",
      -  "ad",
      -  "audience",
      -  "flow",
      -  "deal",
      -  "cost_center",
      -  "project",
      -  "property"
      -]New value: +[
      +  "campaign",
      +  "ad",
      +  "audience",
      +  "flow",
      +  "deal",
      +  "cost_center",
      +  "project",
      +  "property",
      +  "pipeline",
      +  "pipeline_stage"
      +]
  11. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare that this is a destructive write; the description adds the failure model ('A field the kind does not take, or a move it does not allow, fails and nothing is written'), the full status-move path per kind, the synced-project field lockout, the paid-stage automation with its miss conditions and hourly catch-up, the owner/admin gate on pipeline-stage probability, and the distinct WhatsApp approval flows.

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

Conciseness3/5

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

Information density is high but the structure fights the reader: the purpose is buried in a 70-word first sentence, the twelve-kind block is an undifferentiated wall of text, and 'Pass null to clear' is stated three separate times. It could be trimmed substantially without losing meaning, though it is not padded with fluff.

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 28-parameter polymorphic mutation tool with a destructive hint, the description covers the full decision surface an agent needs: valid fields per kind, allowed transitions, sync lockout, approval behavior, hidden semantics, and a one-line return shape even though an output schema already exists.

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

Parameters5/5

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

Schema coverage is only 46% across 28 parameters, so the description must carry the load and largely does: per-kind applicability for every field, probability's meaning on a deal versus a pipeline stage, amount needing a currency, audience ids needing live workspace audiences, and explicit null-clears-a-field semantics that the schema does not state.

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 ('Change a project of the current workspace') and enumerates the mutable surface across every kind, so an agent can tell this apart from well_create_project, well_delete_project and well_update_project_budget. The scope is unambiguous even though the opening sentence is a run-on.

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?

The second paragraph is an explicit when-to-use list with concrete user phrasings (rename, mark a deal won or lost, move a deal to another stage, set a stage's win chance, nest under another project). It also states the prerequisite step (resolve project_id via a one-row well_query_records lookup) and routes the delete case to this tool's hidden:true path.

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