Skip to main content
Glama

Create a company candidate

well_create_company_candidate

Mint a company candidate from a registry hit, the step between finding the company and creating its workspace. This is the deliberate pick the confirm-your-company card makes.

REQUIRED: registry_ref — the id of a well_search_company_registry hit. This tool hydrates that hit and mints the company as a primary (own-company) candidate. Then call well_create_company_workspace with the returned candidate_id to make it the company workspace.

Only a workspace owner or admin may mint a candidate. A caller without that role is refused, not silently ignored. When the picked company already has a confirmed company workspace, the result carries linked_to_existing_child: true and its workspace_id — switch into it with well_switch_workspace instead of creating another. Confirm the exact company with the user before calling; never pick one from a name alone.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
registry_refYesThe registry ref an earlier well_search_company_registry hit carried as its `id`.
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.
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.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNo
successYes
candidateYesThe minted candidate, projected as well_get_own_company shows a candidate; null when linked to an existing child.
workspace_idYesThe existing company workspace when linked_to_existing_child is true; null otherwise.
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
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.
linked_to_existing_childYesTrue when the picked company already has a confirmed company workspace; its id is in workspace_id.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "The 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.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_note
      Added value: +{
      +  "description": "Present only when the server opened a fresh lane, stating that no choice recorded earlier was read.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_source
      Added value: +{
      +  "description": "Where the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.",
      +  "enum": [
      +    "host_meta",
      +    "argument",
      +    "minted"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / properties / candidate / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "candidate_id": {
      -        "type": "string"
      -      },
      -      "company_id": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Null on a fresh candidate; a company row is resolved only once the workspace is created."
      -      },
      -      "confidence_score": {
      -        "type": "number"
      -      },
      -      "registered_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "role": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "primary",
      -              "sibling"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "state": {
      -        "enum": [
      -          "pending",
      -          "confirmed",
      -          "dismissed",
      -          "snoozed"
      -        ],
      -        "type": "string"
      -      },
      -      "trade_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "candidate_id",
      -      "company_id",
      -      "registered_name",
      -      "trade_name",
      -      "role",
      -      "state",
      -      "confidence_score"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "candidate_id": {
      +        "type": "string"
      +      },
      +      "company_id": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Null on a fresh candidate; a company row is resolved only once the workspace is created."
      +      },
      +      "confidence_score": {
      +        "type": "number"
      +      },
      +      "confirmable": {
      +        "type": "boolean"
      +      },
      +      "confirmable_reason": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "not_open",
      +              "not_surfaceable",
      +              "not_primary",
      +              "already_confirmed",
      +              "not_grounded"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "registered_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "role": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "primary",
      +              "sibling"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "state": {
      +        "enum": [
      +          "pending",
      +          "confirmed",
      +          "dismissed",
      +          "snoozed"
      +        ],
      +        "type": "string"
      +      },
      +      "trade_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "candidate_id",
      +      "company_id",
      +      "registered_name",
      +      "trade_name",
      +      "role",
      +      "state",
      +      "confidence_score",
      +      "confirmable",
      +      "confirmable_reason"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Added

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only indicate readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds critical behavioral details: it requires workspace owner/admin role, a caller without it is refused (not silently ignored), the tool hydrates the registry hit, and it returns linked_to_existing_child when the company already has a workspace. This goes well beyond the annotations and fully discloses side effects and access requirements.

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

Conciseness5/5

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

The description is well-structured with a clear opening, a REQUIRED callout, and short paragraphs. Every sentence carries essential information: purpose, required parameter, role constraint, edge case, and user-confirmation instruction. There is no redundancy or filler, and key constraints are front-loaded.

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?

Given the tool's complexity—a write operation with role restrictions and an output schema—the description covers all critical aspects: the workflow position, required input, permission requirements, refusal behavior, the linked-to-existing-workspace edge case, and the next step. It does not need to explain the output schema because that is provided separately. The description is complete for an agent to call this tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining that registry_ref is the id from well_search_company_registry and that the tool 'hydrates that hit', which clarifies the parameter's role in the flow. It also ties the returned candidate_id to the next tool. While the schema already documents each parameter, the description enriches the context of registry_ref and the sequence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Mint a company candidate from a registry hit', and places it in the workflow: 'the step between finding the company and creating its workspace.' It explicitly differentiates from the sibling well_create_company_workspace by naming the next step, and the phrase 'primary (own-company) candidate' distinguishes it from well_create_company. The purpose is unambiguous and distinct.

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 description gives explicit when-to-use guidance: when you have a registry hit and need to mint a candidate. It names the exact sibling to call next (well_create_company_workspace) and provides an exclusion condition: if the result carries linked_to_existing_child, switch to well_switch_workspace instead. It also instructs to confirm the company with the user before calling. No ambiguity remains.

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