Skip to main content
Glama

Create project

well_create_project

Create a project in the current workspace. A project is any tracked business object with a name, a kind and a status. Each kind has 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.

Use this tool when the user asks to create, add or start tracking one of these. A deal is a project Well tracks itself, and Well creates its own deal unless a live connected CRM has a deal create in Well (Attio today): create one here when the person names a deal and no such CRM is connected. With a live Attio connection, a deal the person names goes through that connector's create (well_invoke_connector_tool, after its confirmation card in Well); this tool never writes a second deal in Well for it. Another connected CRM, or an Attio connection that needs a reconnect or is in error, keeps the deal in Well.

REQUIRED: name and kind, and status for every kind but a deal. A deal with no status opens as active. The user's own word names the kind, in any language: "Crée le projet Refonte site web" and "Create the project Website redesign" are kind project. When the user creates a project and names no status, send status "active" (in progress): the call fails without a status, and the saved line names that status. Ask the user for the kind when they did not say it, and for the status only when the kind is neither a project nor a deal; never guess either. OPTIONAL: only the fields the kind takes, listed above. Dates are YYYY-MM-DD. A deal needs an amount; a non-null amount needs its currency. probability is a percentage from 0 through 100 with at most two decimals. position is a whole number from 0. billing_method (a project only) is how the work is priced: project_rate, service_rate, person_rate, fixed_fee, non_billable. For a campaign, channel is one of google_ads, linkedin_ads, reddit_ads, chatgpt_ads, meta_ads, tiktok_ads, pinterest_ads and objective is one of awareness, traffic, engagement, leads, sales; included_audience_project_id and excluded_audience_project_id each name a live audience of this workspace. A flow may set trigger_audience_project_id to a live audience of this workspace. parent_project_id, stage_project_id, owner_person_id, counterparty_company_id and counterparty_person_id are ids of this workspace: use one-row well_query_records lookups to resolve them; a deal takes one counterparty, a company or a contact. An experiment may set experiment_outcome to keep, revert, iterate; keep it null when no result is known. An ad set may include or exclude live audiences with included_audience_project_id and excluded_audience_project_id. When the person names the client ("for Client G"), look it up by that name and send its id as counterparty_company_id or counterparty_person_id. When the lookup finds no such company or contact, create nothing: say that Well holds no client of that name and ask whether to add it. Never save the project without the client the person named.

A field the kind does not take, or a status it does not hold, fails and nothing is written. A won or lost deal is closed on the day it is set. On WhatsApp, the person's complete typed order approves the create and writes at once. If a required value is missing, the tool returns missing_fields before any approval or write: ask for only that value, keep the same pending order and resolved ids, then call again with the answer. For a deal, ask for amount first; wait to ask for currency until the person has supplied the amount. A typed order that includes an amount without its currency asks only for the currency. Other surfaces still use their normal approval. Two live pipelines, stages of one pipeline, or cost centers of one parent cannot share a name: the call then fails, and well_list_projects finds the existing one.

Returns { success: true, project } on success, { success: false, error, missing_fields } when it needs one value, or { success: false, error } on another failure.

Input Schema

NameRequiredDescriptionDefault
kindYesWhat 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.
nameYesThe project's name, unique per kind among the workspace's live structural projects.
amountNoThe stated amount as a decimal string: a deal's value or a project's budget. Only a deal or a project has one, and it needs a currency.
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.
currencyNoThe ISO 4217 currency of amount, e.g. EUR.
end_dateNoThe last day, YYYY-MM-DD; not before start_date.
positionNoThe slot inside the stage (deal) or pipeline (stage), lowest first; a whole number from 0.
objectiveNoThe campaign objective: awareness, traffic, engagement, leads, sales. Only a campaign takes it; null clears it.
start_dateNoThe first day, YYYY-MM-DD.
probabilityNoA deal's win chance as a percentage from 0 through 100 with at most two decimals.
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_idNoA deal's owner: the person_id of a contact of this workspace.
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_idNoThe pipeline stage a deal sits on: the project_id of a live pipeline_stage of this workspace.
parent_project_idNoThe project this one nests under, from the same workspace; the kind decides which parent it takes.
experiment_outcomeNoThe experiment result: keep, revert, iterate. Only an experiment takes it; null clears it.
counterparty_person_idNoThe contact a deal or project is with: a person_id of this workspace. Not with counterparty_company_id.
counterparty_company_idNoThe company a deal or project is with: a company_id of this workspace. Not with counterparty_person_id.
trigger_audience_project_idNoA live audience project_id in this workspace that triggers a flow; null clears it.
excluded_audience_project_idNoA live audience project_id in this workspace to exclude from a campaign or ad set; null clears it.
included_audience_project_idNoA live audience project_id in this workspace to include in a campaign or ad set; null clears it.

Output Schema

NameRequiredDescriptionDefault
codeNo
errorNo
projectNo
successYes
reply_linesNo
missing_fieldsNo
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. Changed8 schema fields changed
    • changedInput schema / properties / excluded_audience_project_id / description
      Previous value: -"A live audience project_id in this workspace to exclude from a campaign; null clears it."New value: +"A live audience project_id in this workspace to exclude from a campaign or ad set; null clears it."
    • 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 / included_audience_project_id / description
      Previous value: -"A live audience project_id in this workspace to include in a campaign; null clears it."New value: +"A live audience project_id in this workspace to include in a campaign or ad set; 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. Changed2 schema fields changed
    • 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. Changed11 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"
      +    }
      +  ],
      +  "description": "A live audience project_id in this workspace to exclude from a campaign; null clears it."
      +}
    • 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"
      +    }
      +  ],
      +  "description": "A live audience project_id in this workspace to include in a campaign; null clears it."
      +}
    • 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"
      +    }
      +  ],
      +  "description": "A live audience project_id in this workspace that triggers a flow; null clears it."
      +}
    • 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. Changed4 schema fields changed
    • 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. Changed1 schema field changed
    • changedInput schema / required
      Previous value: -[
      -  "name",
      -  "kind",
      -  "status"
      -]New value: +[
      +  "name",
      +  "kind"
      +]
  9. Changed3 schema fields changed
    • addedOutput schema / properties / missing_fields
      Added value: +{
      +  "items": {
      +    "enum": [
      +      "name",
      +      "kind",
      +      "status",
      +      "amount",
      +      "currency"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • 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"
      +]
  10. Changed21 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"
      +    }
      +  ],
      +  "description": "The company a deal or project is with: a company_id of this workspace. Not with counterparty_person_id."
      +}
    • 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"
      +    }
      +  ],
      +  "description": "The contact a deal or project is with: a person_id of this workspace. Not with counterparty_company_id."
      +}
    • changedInput schema / properties / end_date / description
      Previous value: -"The last day, YYYY-MM-DD; not before start_date. A cost_center, property, pipeline or pipeline_stage has none."New value: +"The last day, YYYY-MM-DD; not before start_date."
    • changedInput schema / properties / kind / description
      Previous value: -"What the project is: campaign, ad, audience, flow, deal, cost_center, project, property, pipeline or pipeline_stage. 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. Ask the user when it is not clear."
    • changedInput schema / properties / name / description
      Previous value: -"The project's name. A pipeline, pipeline stage or cost center name is unique among its live siblings of the same kind; other kinds may share a name."New value: +"The project's name, unique per kind among the workspace's live structural projects."
    • 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"
      +    }
      +  ],
      +  "description": "A deal's owner: the person_id of a contact of this workspace."
      +}
    • changedInput schema / properties / parent_project_id / description
      Previous value: -"The project this one nests under, from the same workspace: a project under a project, a cost_center under a cost_center, an ad under a campaign, a pipeline_stage under a pipeline (required for a stage). Other kinds do not nest."New value: +"The project this one nests under, from the same workspace; the kind decides which parent it takes."
    • addedInput schema / properties / position
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The slot inside the stage (deal) or pipeline (stage), lowest first; a whole number from 0."
      +}
    • addedInput schema / properties / probability
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "multipleOf": 0.01,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "A deal's win chance as a percentage from 0 through 100 with at most two decimals."
      +}
    • 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"
      +    }
      +  ],
      +  "description": "The pipeline stage a deal sits on: the project_id of a live pipeline_stage of this workspace."
      +}
    • changedInput schema / properties / start_date / description
      Previous value: -"The first day, YYYY-MM-DD. Only a project, campaign, ad, audience or flow has one."New value: +"The first day, YYYY-MM-DD."
    • changedInput schema / properties / status / description
      Previous value: -"Where the project stands. A deal: draft, active, paused, won, lost or archived. A cost_center, property, pipeline or pipeline_stage: active or archived. Any other kind: draft, active, paused, completed or archived. Ask the user when it is not clear."New 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"
      +]
  11. Changed9 schema fields changed
    • changedInput schema / properties / amount / description
      Previous value: -"The stated amount, a deal value or a budget, as a decimal string. A stated amount needs a currency."New value: +"The stated amount as a decimal string: a deal's value or a project's budget. Only a deal or a project has one, and it needs a currency."
    • changedInput schema / properties / end_date / description
      Previous value: -"The last day, YYYY-MM-DD; not before start_date."New value: +"The last day, YYYY-MM-DD; not before start_date. A cost_center, property, pipeline or pipeline_stage has none."
    • changedInput schema / properties / kind / description
      Previous value: -"What the project is: campaign, ad, audience, flow, deal, cost_center, project or property. Ask the user when it is not clear."New value: +"What the project is: campaign, ad, audience, flow, deal, cost_center, project, property, pipeline or pipeline_stage. Ask the user when it is not clear."
    • 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"
      +]
    • changedInput schema / properties / name / description
      Previous value: -"The project's name, unique per kind among the workspace's live projects."New value: +"The project's name. A pipeline, pipeline stage or cost center name is unique among its live siblings of the same kind; other kinds may share a name."
    • changedInput schema / properties / parent_project_id / description
      Previous value: -"The project this one nests under, from the same workspace."New value: +"The project this one nests under, from the same workspace: a project under a project, a cost_center under a cost_center, an ad under a campaign, a pipeline_stage under a pipeline (required for a stage). Other kinds do not nest."
    • changedInput schema / properties / start_date / description
      Previous value: -"The first day, YYYY-MM-DD."New value: +"The first day, YYYY-MM-DD. Only a project, campaign, ad, audience or flow has one."
    • changedInput schema / properties / status / description
      Previous value: -"Where the project stands: draft, active, paused, won, lost, completed or archived. Ask the user when it is not clear."New value: +"Where the project stands. A deal: draft, active, paused, won, lost or archived. A cost_center, property, pipeline or pipeline_stage: active or archived. Any other kind: draft, active, paused, completed or archived. Ask the user when it is not clear."
    • 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"
      +]
  12. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, destructiveHint=false and openWorldHint=false; the description adds substantial behavior beyond that: invalid fields or statuses fail with nothing written, missing_fields is returned before any approval or write, WhatsApp typed orders auto-approve while other surfaces use normal approval, unique-name constraints per parent, and a won/lost deal is closed on the day it is set. The explicit return shapes ({ success, project }, { success:false, error, missing_fields }) also tell the agent how to recover.

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?

It is front-loaded well (purpose, kind table, when-to-use, required, optional, failure modes, returns), but it is long even for a 25-parameter tool and contains genuine repetition: the audience include/exclude fields are explained in the kind table and again in two later paragraphs, and date formats are restated. Several sentences could be merged without losing information.

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 twelve-kind, 25-parameter mutation tool this is complete: it covers required vs optional per kind, validation rules, id resolution, duplicate-name failure handling, the approval/confirmation flow per surface, and error recovery via missing_fields. Return values are also summarized even though an output schema 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 100%, so a 3 would be the baseline, but the description goes well beyond it: it specifies which fields each of the twelve kinds accepts, that status is required for every kind except a deal (which defaults to active), that an amount requires a currency and the currency should be asked only after the amount, and that id fields must be resolved via one-row well_query_records lookups. The client-name resolution rule ('look it up by that name and send its id') adds semantics no schema field description carries.

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 ('Create a project in the current workspace') and immediately defines what a project is ('any tracked business object with a name, a kind and a status'). The per-kind table makes the resource taxonomy unambiguous, so an agent can distinguish this from well_update_project, well_get_project, or well_create_task_project without opening another 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?

Explicitly states when to use it ('when the user asks to create, add or start tracking one of these') and routes around the main alternative: deals go through well_invoke_connector_tool when a live Attio connection exists, and stay here otherwise. It also names well_list_projects for the duplicate-name failure case and gives ask-vs-guess rules per field, which is unusually complete guidance.

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