doola
Server Details
Form a Wyoming LLC from a conversation: name, industry, members, ownership, and state filing.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- doolahq/plugins
- GitHub Stars
- 0
TDQS
Scored across 12 tools
Most tools have crisply distinct purposes, and the descriptions explicitly disambiguate the risky pairs (get_company_info vs get_company_onboarding_status, list_companies vs switch_active_company). The weakest boundary is start_formation versus start_new_company — both initiate a Wyoming LLC flow and only the 'second company' framing separates them, so an agent could plausibly pick the wrong one.
Every tool is snake_case with a leading imperative verb (create_, get_, list_, save_, search_, start_, submit_, switch_, verify_, report_), and noun phrases map predictably to the resource or action. No camelCase or stylistic mixing anywhere in the set.
Twelve tools sit comfortably in the well-scoped range and map one-to-one onto distinct stages of a formation workflow rather than duplicating surface area. Each tool, including the escape hatch report_missing_capability, earns its place.
The surface covers the full happy path end to end: onboarding routing, company selection/creation, data collection, industry lookup, checkout, payment verification, submission, and post-formation info retrieval. Gaps are minor but real — no tool to retrieve filed documents/EIN letter, check filing progress with the state, or cancel/amend a formation, leaving agents to redirect users to the dashboard for those needs.
Available Tools
12 toolscreate_checkout_sessionCreate Checkout LinkAInspect
Accepts doola's Terms of Service (https://www.doola.com/terms-of-service) for the Starter package on the user's behalf and creates the Stripe checkout for the formation. Show the user doola's Terms of Service (https://www.doola.com/terms-of-service) and ask whether they agree. Only once they say yes, call create_checkout_session with {termsAccepted: true}. Returns pricing (the first-year list price: quote pricing.summary VERBATIM and never call it 'charged today'), chargeSummary (what Stripe charges today after any discount: quote it VERBATIM), checkoutUrl (paste it verbatim into your reply, never a placeholder), checkoutSessionId (keep it for verify_payment), and companyId / companyName (the company being paid for: name it to the user). Refused with PRECONDITIONS_NOT_MET until start_formation has saved the name, country and company name.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. | |
| termsAccepted | No | true only after the user has seen the Terms of Service link and agreed to it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | Structured error code when error=true (e.g. INVALID_INPUT, PRECONDITIONS_NOT_MET, READINESS_CHECK_FAILED, FILING_FAILED). |
| error | No | true if the call failed |
| saved | No | What this call saved. |
| message | No | Human-readable status or instruction. |
| missing | No | Prerequisites still unmet, in flow order. Empty when only filing remains. |
| pricing | No | First-year list price. Quote `summary` verbatim; never call it 'charged today'. |
| nextStep | No | The tool to call next; null when the flow is complete. |
| companyId | No | The company the call acted on. |
| nextAction | No | Imperative for the agent — follow verbatim. |
| checkoutUrl | No | Stripe checkout link. Paste it verbatim into the reply. |
| companyName | No | Name of the company the call acted on. Name it to the user. |
| nextQuestion | No | Question to ask the user verbatim before the next call. |
| chargeSummary | No | What Stripe charges today, after any discount. Quote it verbatim. |
| nextActionInput | No | {tool, arguments} template for the next call. Replace every <placeholder> in arguments with the user's real answer. |
| checkoutSessionId | No | Pass it to verify_payment once the user has paid. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, destructiveHint=false, openWorldHint=true; the description goes well beyond by disclosing that it legally accepts Terms of Service on the user's behalf, that it creates a real Stripe checkout, the refusal code, and the prerequisite gate. It also tells the agent exactly how to quote the returned pricing fields (verbatim, never 'charged today'), which is behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the safety gate, then the return-field quoting rules and the refusal condition — all operationally necessary. The Terms of Service link and the 'show and ask the user' instruction are repeated twice, minor redundancy in an otherwise dense description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers preprequisites, consent gating, refusal behavior, and how to use each returned field, so an agent can act correctly without further lookup. Return-value handling is spelled out even though an output schema exists, which is appropriate for a payment-related side effect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 operational meaning for termsAccepted by tying it to a user-confirmation workflow rather than just a boolean flag. It adds nothing for context/llm_model, but those are analytics-only and already self-documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action chain: accepts the Terms of Service on the user's behalf and creates the Stripe checkout for the formation, plus names the company being paid for. It is clearly separable from siblings by naming verify_payment for the returned session ID and start_formation as the prerequisite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit gating workflow: show the ToS link, ask the user, and only call with {termsAccepted: true} after they say yes. It also states the exact refusal condition (PRECONDITIONS_NOT_MET until start_formation has saved name, country, and company name), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_infoGet Company DetailsARead-onlyInspect
Returns the active company's full profile — basic info (name, state, entity type, EIN, industry, dashboard status, formation filing date), member list, responsible party, addresses, name options, and provisioned services. Mirrors what the customer sees on /web's Company Information page (https://app.doola.com/company). Use when the customer asks 'tell me about my company', 'what's my EIN?', 'who are the members?', or similar — distinct from get_company_onboarding_status which returns derived next-step routing rather than raw company data. To inspect a different company, call switch_active_company first.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| EIN | No | EIN if assigned |
| name | No | Company name (primary selection) |
| error | No | true if an error occurred |
| state | No | Formation state (e.g. WY) |
| members | No | LLC members with ownership percentages. |
| message | No | Error message if error=true |
| industry | No | NAICS industry name set on the company |
| companyId | No | Active companyId |
| entityType | No | Entity type (e.g. LLC, CCorp) |
| dashboardStatus | No | Formation dashboard status string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so safe-read is established; the description adds genuinely new scope constraints — it only ever reads the *active* company and requires `switch_active_company` to change target. It doesn't mention auth/permission requirements or whether inactive/dissolved companies are visible, which is the remaining gap for a data-retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first clause, then field inventory, then usage cues and the sibling exclusion in the final sentences. The long parenthetical field list and the URL mirror reference are slightly padded, but each sentence carries routing or scoping information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover safety; the description supplies the active-company scoping and sibling routing that structured fields don't. The one omission an agent might want is whether inactive/other-company data is reachable without switching, which is only implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (`context`, `llm_model`) are analytics-only plumbing fully documented inline, so the schema carries the burden. The description contributes nothing about parameters, and none is really needed; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Returns the active company's full profile") and enumerates the concrete data returned: basic info fields, members, responsible party, addresses, name options, provisioned services. It explicitly names the sibling it is not — `get_company_onboarding_status` — and explains the distinction (derived routing vs. raw data), so an agent can differentiate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger utterances ("tell me about my company", "what's my EIN?", "who are the members?") plus an explicit exclusion against the nearest sibling. It also states a prerequisite path for the alternative case: call `switch_active_company` first to inspect a different company. When-to-use, when-not, and alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_onboarding_statusCheck Formation ProgressARead-onlyInspect
Canonical 'where am I?' entry point — call this ONCE per user session, at the start, right after the OAuth handshake. No arguments required; customerId is read from the bearer. The response's suggestedNextStep (the tool to call next) and nextActionInput (a {tool, arguments} template: call that tool and replace every in arguments with the user's real answer) drive the next call.
DO NOT call this before every formation call. Each formation tool's response already carries nextAction + nextActionInput — trust that and move on. Re-calling get_company_onboarding_status between steps just adds latency and burns rate limit without changing the plan.
Only call this AGAIN when one of these is true: (a) the user returns mid-flow after a long pause and asks 'where are we?', (b) you need to verify state after an unexpected error or a failed call, or (c) the user switched companies via switch_active_company. Outside those cases, treat the first call's state as authoritative for the rest of the session.
Derivation mirrors /web's onboarding routing (Company.gql): each step is marked completed when its corresponding Company / Customer field is populated. If the customer has no active company yet (post-OAuth, pre-formation), the response points at start_formation.
If the response contains error: true or suggestedNextStep looks inconsistent with the user's actual progress (e.g. you just saved the company name but the response steers you back to it), the upstream data fetch likely transiently failed. Wait ~10 seconds and call this tool again before deciding what to do next — do NOT redo earlier steps the user has already completed.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| No | Customer email | |
| error | No | true if an error occurred |
| message | No | Human-readable status or instruction |
| blockers | No | Prerequisites still unmet, in flow order. Same vocabulary as the `missing` array submit_for_review returns. Empty array when formation is fully complete. |
| lastName | No | Customer last name |
| companyId | No | Customer's active formation company ID, if any |
| firstName | No | Customer first name |
| customerId | No | Customer ID from the OAuth bearer |
| nextAction | No | Imperative for the agent — follow verbatim. Null when formation is complete. |
| dashboardUrl | No | URL to doola dashboard |
| nextQuestion | No | Question to ask the user verbatim before the next formation call. Null when no question is needed. |
| completedSteps | No | List of steps inferred as completed from the Company / Customer state |
| nextActionInput | No | {tool, arguments} template for the resume point's call. Replace every <placeholder> in arguments with the user's real answer. Null when formation is complete. |
| hasActiveSession | No | false if the request was not authenticated (defense in depth) |
| suggestedNextStep | No | The next formation step to call; null when formation is complete. |
| countryOfResidence | No | ISO Alpha-3 country code if set |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, yet the description adds real operational context: implicit auth via bearer (no customerId argument), the derivation rule (steps complete when Company/Customer fields are populated), the effect of re-calling (rate limit), and an error-recovery protocol (error:true or inconsistent suggestedNextStep → wait ~10s and retry rather than redo steps). This is well past what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core instruction and no filler, but the central 'do not call between steps' rule is stated twice (paragraph two and again in the 'only call AGAIN when…' paragraph), which costs a bit of length without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description explains the two fields that actually drive agent behavior (suggestedNextStep and the {tool, arguments} placeholder template in nextActionInput) and covers the failure path. Nothing an agent needs to act correctly on this response is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only params are analytics-only (context, llm_model), so the schema carries that burden. The description adds the one non-obvious semantic point — no arguments are needed because customerId is derived from the bearer token — which prevents an agent from hunting for a customer identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific role — the canonical 'where am I?' entry point for formation/onboarding progress — and immediately disambiguates from the sibling formation tools by saying their responses already carry nextAction. An agent can tell instantly what this returns and why it differs from start_formation, save_company_details, or switch_active_company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-call (once per session, right after OAuth), when NOT to call (between formation steps, with a stated reason: latency and rate-limit burn), and an exhaustive enumeration of the three re-call conditions. It also names the downstream alternative (start_formation) for the pre-formation case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_companiesList CompaniesARead-onlyInspect
Returns every company the authenticated customer owns — call when the user asks 'which companies do I have?', wants to switch context, or before starting a brand-new formation so you know whether a previous attempt is already in progress. The entry with isActive: true is the one every other formation tool currently operates on; call switch_active_company to point at a different one. To create a new in-progress company, call start_new_company.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | true if an error occurred |
| message | No | Error message if error=true |
| companies | No | Companies belonging to the customer. |
| activeCompanyId | No | The companyId formation tools currently target. Empty when the customer has no companies yet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish that this is a safe read-only operation, and the description adds crucial behavioral context: the entry with isActive true is the target of all other formation tools. That relationship is not captured by annotations or schema and materially affects how an agent should use the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds only high-value routing and active-company context. Every sentence contributes to correct tool selection or interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, an output schema covering return values, and 100% parameter description coverage, the description supplies the remaining critical context about active-company semantics and sibling-tool routing. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters are optional analytics-only fields. The description does not add meaning beyond the schema, but the schema already carries the necessary semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: returns every company the authenticated customer owns. It clearly distinguishes this inventory operation from sibling tools like switch_active_company and start_new_company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names three triggering situations: the user asks which companies they have, wants to switch context, or is about to start a new formation. It also routes the agent to switch_active_company for changing the active company and start_new_company for creating a new one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_missing_capabilityReport Missing CapabilityAInspect
Call this when the user wants something none of the other tools can do. Describe the goal and the kind of tool that would help in context. Doing so records the request for doola's team and changes nothing on the customer's account. It returns no new tools, so after calling it tell the user this isn't available here and point them to the doola dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Your goal and what kind of tool would help accomplish it. Describe it in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | Acknowledgement of the report. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false / destructiveHint=false; the description adds the crucial context of what the write actually does ('records the request for doola's team'), that it 'changes nothing on the customer's account', and that no new tools are returned despite an output schema existing. That is exactly the extra behavioral detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences ordered trigger → input → side effect → follow-up. Every sentence carries information an agent needs, and the invocation condition is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter reporting tool with an output schema, the description covers everything needed: when to call, what to put in the required field, what the call does to the account, and what to tell the user afterward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already spells out both `context` (including the PII prohibition) and `llm_model`. The description only restates that the goal and desired tool type go in `context`, so the baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (record a request for a capability that doesn't exist) and explicitly positions it as the fallback when 'none of the other tools can do' what the user wants, which cleanly separates it from every sibling like start_formation or verify_payment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('when the user wants something none of the other tools can do') and explicit post-conditions for how to proceed afterward ('tell the user this isn't available here and point them to the doola dashboard'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_company_detailsSave Company DetailsADestructiveInspect
Saves the company's post-payment details: industry and description, backup names, registered and mailing addresses, members with their ownership, and the IRS responsible party. Every field is optional and is saved as given, so save each answer as soon as the user gives it; the response lists what is still missing and its nextAction / nextActionInput name the next step. Refused with PRECONDITIONS_NOT_MET until verify_payment has confirmed payment.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| members | No | Every member of the LLC, each a person. Replaces the saved members as a whole, so always send all of them. A company as a member is set up from the doola dashboard instead. | |
| industry | No | Industry, verbatim from the search_industries list. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. | |
| description | No | What the business does, 50 characters max. Send with industry. | |
| alternateNames | No | Up to two backup company names, without the LLC suffix. The primary name is kept as saved. | |
| mailingAddress | No | Where bank cards and IRS mail go. Must be in the US; use provider registeredAgent when the user has no US address. | |
| sellingPlatform | No | Where the business sells, e.g. Amazon or Shopify. Optional. | |
| responsibleParty | No | The person the IRS treats as responsible for the company. | |
| registeredAddress | No | The company's Wyoming registered address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | Structured error code when error=true (e.g. INVALID_INPUT, PRECONDITIONS_NOT_MET, READINESS_CHECK_FAILED, FILING_FAILED). |
| error | No | true if the call failed |
| saved | No | What this call saved. |
| message | No | Human-readable status or instruction. |
| missing | No | Prerequisites still unmet, in flow order. Empty when only filing remains. |
| nextStep | No | The tool to call next; null when the flow is complete. |
| companyId | No | The company the call acted on. |
| nextAction | No | Imperative for the agent — follow verbatim. |
| companyName | No | Name of the company the call acted on. Name it to the user. |
| nextQuestion | No | Question to ask the user verbatim before the next call. |
| nextActionInput | No | {tool, arguments} template for the next call. Replace every <placeholder> in arguments with the user's real answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false; the description adds real value on top by disclosing the all-optional/partial-save semantics, the PRECONDITIONS_NOT_MET failure mode, and that the response carries a `missing` list plus nextAction/nextActionInput. It stops short of warning that `members` replaces the entire saved member set, which is the most consequential destructive behavior and matters most for a tool annotated destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the resource, then behavior, then the gate. Every sentence carries distinct information — no restatement of the title and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation with an output schema, the description covers purpose, incremental calling pattern, precondition gate, and error code, so an agent can call it correctly. The one omission is the destructive overwrite semantics of `members` and of re-saved fields, which the agent must learn from the schema rather than the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains enums, formats, and per-field constraints. The description contributes only the general framing that every field is optional and persisted as given; it adds no field-level meaning beyond what the schema states (e.g. industry must come from search_industries, members must total 100%).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Saves) and a specific resource (the company's post-payment details), then enumerates exactly which fields belong to that bundle: industry/description, backup names, addresses, members with ownership, and the IRS responsible party. An agent can tell this apart from read-side siblings like get_company_info or get_company_onboarding_status without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit calling cadence ('save each answer as soon as the user gives it'), an explicit precondition ('Refused with PRECONDITIONS_NOT_MET until verify_payment has confirmed payment'), and names the next-step driver in the response. This is when-to-use, prerequisite, and follow-on routing in one place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_industriesSearch IndustriesARead-onlyInspect
Lists the industries a company can be filed under. Match the user's description of their business against the list, offer the 3-5 closest entries, and pass the one they pick, verbatim, as industry to save_company_details. Read-only; takes no arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | Structured error code when error=true (e.g. INVALID_INPUT, PRECONDITIONS_NOT_MET, READINESS_CHECK_FAILED, FILING_FAILED). |
| error | No | true if the call failed |
| saved | No | What this call saved. |
| message | No | Human-readable status or instruction. |
| missing | No | Prerequisites still unmet, in flow order. Empty when only filing remains. |
| nextStep | No | The tool to call next; null when the flow is complete. |
| companyId | No | The company the call acted on. |
| nextAction | No | Imperative for the agent — follow verbatim. |
| companyName | No | Name of the company the call acted on. Name it to the user. |
| nextQuestion | No | Question to ask the user verbatim before the next call. |
| nextActionInput | No | {tool, arguments} template for the next call. Replace every <placeholder> in arguments with the user's real answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so 'Read-only; takes no arguments' largely restates structured data. The genuine value-add is the verbatim-pass-through rule, which warns the agent not to paraphrase or normalize the returned value — a real failure mode. It does not describe the shape of the returned list, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler: purpose first, then the workflow, then the read-only note. Every sentence carries distinct information and the actionable instruction is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, and the description supplies the one thing the schema cannot: what to do with the results. Only minor gap is no hint about how large the list is or whether it is exhaustive, which affects how the agent should present candidates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both optional analytics parameters are fully documented in the schema, and the 0-required baseline applies. The description adds nothing about `context` or `llm_model`, and 'takes no arguments' is mildly imprecise given two optional params exist — though it correctly signals no substantive input is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the industries a company can be filed under') with the scoping detail that this is the enumeration used for company filing. It is unmistakably distinct from save_company_details and the other siblings, which all deal with company records rather than the reference list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit multi-step usage pattern: match the user's business description against the list, offer 3-5 closest entries, and pass the chosen value verbatim as `industry` to save_company_details. The downstream sibling and the condition for calling it are both named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_formationStart LLC FormationAInspect
Starts the user's Wyoming LLC formation: saves their legal name (only when the profile lacks it), their country of residence and the company name, and sets Wyoming as the formation state. Every field is optional and is saved as given, so call it as soon as you have an answer; call it with {} to set the state when nextAction says so. Never invent a company name. The response's nextAction and nextActionInput name the next step.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| lastName | No | Legal last name as on the user's ID. Only needed when the profile lacks it; send with firstName. | |
| firstName | No | Legal first name as on the user's ID. Only needed when the profile lacks it; send with lastName. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. | |
| companyName | No | The company name the user chose, without the LLC suffix. Never invent or suggest one. | |
| countryOfResidence | No | Country the user personally lives in, ISO 3166-1 alpha-3 (e.g. USA, GBR, BRA). |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | Structured error code when error=true (e.g. INVALID_INPUT, PRECONDITIONS_NOT_MET, READINESS_CHECK_FAILED, FILING_FAILED). |
| error | No | true if the call failed |
| saved | No | What this call saved. |
| message | No | Human-readable status or instruction. |
| missing | No | Prerequisites still unmet, in flow order. Empty when only filing remains. |
| nextStep | No | The tool to call next; null when the flow is complete. |
| companyId | No | The company the call acted on. |
| nextAction | No | Imperative for the agent — follow verbatim. |
| companyName | No | Name of the company the call acted on. Name it to the user. |
| nextQuestion | No | Question to ask the user verbatim before the next call. |
| nextActionInput | No | {tool, arguments} template for the next call. Replace every <placeholder> in arguments with the user's real answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real behavioral context on top: all fields optional, values saved as given (persistence semantics), partial-profile handling, and that the response's nextAction drives the next step. It stops short of covering repeated-invocation behavior (whether re-calling restarts or merges state), which matters for a 'start formation' mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with zero redundancy: purpose, call timing, safety constraint, and return routing, in that priority order. The most decision-relevant instruction ('call it as soon as you have an answer') is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param mutation tool with full schema coverage, an output schema, and annotations, the description supplies everything an agent still needs: when to call, the empty-object case, the no-fabrication rule, and where the next step comes from. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema, including the firstName/lastName pairing and the 'never invent' constraint on companyName. The description mostly restates those same constraints rather than adding syntax, format, or interaction rules beyond them. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Starts the user's Wyoming LLC formation', then enumerates exactly what gets persisted (legal name, country of residence, company name, formation state). It does not explicitly differentiate itself from siblings like submit_formation, start_new_company, or save_company_details, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete call timing ('call it as soon as you have an answer') and a specific edge case ('call it with {} to set the state when nextAction says so'). It also states the conditional-save rule for the legal name. It never names an alternative sibling or says when NOT to use this tool, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_new_companyStart a New CompanyAInspect
Begin a brand-new Wyoming LLC formation alongside any existing companies the customer already has — call when the customer explicitly asks to form a SECOND (or further) company. Creates an empty in-progress Company row, links it to the customer, and pins it as the active company so the next tool calls operate on it. After this, follow the standard formation flow from its first step; the response names it. The previously active company is untouched and remains in list_companies — the customer can switch back via switch_active_company.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | true if an error occurred |
| message | No | Error message if error=true |
| companyId | No | KSUID of the newly-created company, now the active company |
| nextAction | No | Imperative for the agent — follow verbatim. |
| nextQuestion | No | Question to ask the user verbatim before the next call. |
| nextActionInput | No | {tool, arguments} template for the next call. Replace every <placeholder> in arguments with the user's real answer. |
| suggestedNextStep | No | The tool for the new company's first formation step |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), it discloses the concrete side effects: an empty in-progress Company row is created, linked to the customer, and pinned as active. It also reassures that the previously active company is untouched and recoverable, which is exactly the state-change context an agent needs before a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the trigger condition before the mechanics and follow-on flow. Every clause carries distinct information (scope, side effect, next step, recovery path) with no restatement of the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-mutating tool with an output schema, the description covers the trigger, the created state, the active-company side effect, and the next action. Return values are named only as needed ('the response names it') rather than re-specifying the schema, which is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (context, llm_model) are optional analytics-only fields already documented in the schema. The description adds nothing about them, so baseline 3 applies — the schema does all the work and the description does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (begin a brand-new Wyoming LLC formation) and scopes it explicitly to a second-or-further company, which separates it from the first-company formation path. It also names two siblings (list_companies, switch_active_company) so an agent can place it in the tool graph without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('call when the customer explicitly asks to form a SECOND (or further) company'), names the alternatives for viewing and switching companies, and prescribes the follow-on step ('follow the standard formation flow from its first step'). Nothing about when or when-not to call is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_formationSubmit FormationADestructiveInspect
Files the Wyoming LLC with the state through doola's registered agent and emails the SS-4 and Form 8821 to the responsible party for signing. Filing cannot be undone. Call it ONLY after presenting a complete summary table of everything collected and the user explicitly replied 'submit', with {userConfirmed: true}. Refused with PRECONDITIONS_NOT_MET, listing missing, while any earlier step is incomplete.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. | |
| userConfirmed | Yes | true only after the user reviewed the summary and replied 'submit'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | Structured error code when error=true (e.g. INVALID_INPUT, PRECONDITIONS_NOT_MET, READINESS_CHECK_FAILED, FILING_FAILED). |
| error | No | true if the call failed |
| saved | No | What this call saved. |
| message | No | Human-readable status or instruction. |
| missing | No | Prerequisites still unmet, in flow order. Empty when only filing remains. |
| nextStep | No | The tool to call next; null when the flow is complete. |
| companyId | No | The company the call acted on. |
| nextAction | No | Imperative for the agent — follow verbatim. |
| companyName | No | Name of the company the call acted on. Name it to the user. |
| nextQuestion | No | Question to ask the user verbatim before the next call. |
| nextActionInput | No | {tool, arguments} template for the next call. Replace every <placeholder> in arguments with the user's real answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive and openWorld, but the description adds the concrete stakes: the filing cannot be undone, external emails are dispatched to a third party for signing, and premature calls are rejected with a structured preconditions error. That is substantive context beyond the hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: what it does and its side effects, the precondition for calling, and the refusal behavior. The most important constraint (irreversibility) is front-loaded in sentence one and the hard gate follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an irreversible, externally visible action, the description covers effect, side channels, gating condition, and error semantics; the output schema handles return values. Nothing an agent needs before invoking is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, including the exact meaning of userConfirmed. The description reinforces userConfirmed by tying it to the summary-table presentation, but adds nothing for context or llm_model. Baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource chain: files the Wyoming LLC with the state via doola's registered agent and emails SS-4 and Form 8821 to the responsible party. The side effects alone distinguish it from siblings like start_formation or create_checkout_session, which prepare or pay rather than file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit gate: call ONLY after presenting a complete summary table and receiving an explicit 'submit' reply, with the {userConfirmed: true} flag. It also names the failure mode (PRECONDITIONS_NOT_MET with a `missing` list) so the agent knows what to expect if it calls early.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_active_companySwitch Active CompanyAInspect
Point the formation tools at a different company the customer already owns. Use when the customer asks to manage / continue / inspect a specific company by name or ID. The companyId must come from list_companies — unknown IDs are rejected. After switching, the response carries the same shape as get_company_onboarding_status for the new active company, so the agent knows immediately which step to resume from. The override is process-local; if the customer reconnects and ends up on a different MCP replica, just call this tool again.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| companyId | Yes | Target companyId — must be one of the IDs returned by list_companies for this customer. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. |
Output Schema
| Name | Required | Description |
|---|---|---|
| No | Customer email | |
| error | No | true if an error occurred |
| message | No | Human-readable status or instruction |
| blockers | No | Prerequisites still unmet, in flow order. Same vocabulary as the `missing` array submit_for_review returns. Empty array when formation is fully complete. |
| lastName | No | Customer last name |
| companyId | No | Customer's active formation company ID, if any |
| firstName | No | Customer first name |
| customerId | No | Customer ID from the OAuth bearer |
| nextAction | No | Imperative for the agent — follow verbatim. Null when formation is complete. |
| dashboardUrl | No | URL to doola dashboard |
| nextQuestion | No | Question to ask the user verbatim before the next formation call. Null when no question is needed. |
| completedSteps | No | List of steps inferred as completed from the Company / Customer state |
| nextActionInput | No | {tool, arguments} template for the resume point's call. Replace every <placeholder> in arguments with the user's real answer. Null when formation is complete. |
| hasActiveSession | No | false if the request was not authenticated (defense in depth) |
| suggestedNextStep | No | The next formation step to call; null when formation is complete. |
| countryOfResidence | No | ISO Alpha-3 country code if set |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=false, openWorld=false) by disclosing that the switch is a process-local override, that it may be lost on a different MCP replica and should simply be re-invoked, and that unknown IDs are rejected. It also tells the agent the response mirrors get_company_onboarding_status, which is exactly the context a mutating tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the action and the trigger condition, then the ID constraint, then the return-shape and replica caveats. Every sentence carries information an agent needs at decision time.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and the description still explains that the response matches get_company_onboarding_status, telling the agent how to use the result to resume onboarding. Prerequisite sourcing, error behavior, and state lifetime are all covered for this stateful switch operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline applies; the companyId constraint is already documented in the schema. The description repeats the list_companies provenance rule and adds the consequence ('unknown IDs are rejected'), which is useful but only marginally beyond the schema, and it says nothing about the analytics-only fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('point the formation tools at') and resource ('a different company the customer already owns'), making the scope of the change unambiguous. It is clearly distinct from siblings like list_companies (discovery) and get_company_onboarding_status (status read).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it when the customer asks to manage/continue/inspect a specific company by name or ID, and routes to list_companies as the required source of IDs. It also covers the reconnect/replica retry case, though it never states when not to use it (e.g., when the company is already active).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_paymentVerify PaymentAInspect
Checks with Stripe whether the formation checkout was paid. Call it once the user says they've paid, with the checkoutSessionId create_checkout_session returned. Do NOT ask any post-payment question until it returns paymentStatus=Complete. A confirmed payment makes the company it paid for the active one, so the post-payment tools write to it.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Optional, for analytics only. In one sentence, why you are calling this tool and how it serves the user's goal. Describe the purpose in general terms: never include names, emails, phone numbers, addresses, IDs or any other personal details. | |
| llm_model | No | Optional, for analytics only. Your exact model identifier from your system prompt (e.g. "claude-opus-4-8"), or "unknown" if unsure. Never guess. | |
| checkoutSessionId | Yes | The checkoutSessionId from the create_checkout_session response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | Structured error code when error=true (e.g. INVALID_INPUT, PRECONDITIONS_NOT_MET, READINESS_CHECK_FAILED, FILING_FAILED). |
| error | No | true if the call failed |
| saved | No | What this call saved. |
| message | No | Human-readable status or instruction. |
| missing | No | Prerequisites still unmet, in flow order. Empty when only filing remains. |
| nextStep | No | The tool to call next; null when the flow is complete. |
| companyId | No | The company the call acted on. |
| nextAction | No | Imperative for the agent — follow verbatim. |
| companyName | No | Name of the company the call acted on. Name it to the user. |
| nextQuestion | No | Question to ask the user verbatim before the next call. |
| nextActionInput | No | {tool, arguments} template for the next call. Replace every <placeholder> in arguments with the user's real answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, and the description goes further by disclosing the state side effect: a confirmed payment makes that company active and causes post-payment tools to write to it. It also surfaces the gating semantics tied to paymentStatus=Complete, which no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then the trigger, the gate, and the side effect. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no elaboration, yet the description still names the decisive paymentStatus value. For a payment-verification step with real state consequences, the agent has everything required to call it correctly and to sequence follow-up tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters including the analytics fields. The description adds only the provenance of checkoutSessionId, which the schema itself already states, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Checks with Stripe whether the formation checkout was paid') and implicitly contrasts with create_checkout_session by consuming its output. An agent can distinguish it from sibling tools without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('once the user says they've paid'), the required input source (checkoutSessionId from create_checkout_session), and a hard exclusion ('Do NOT ask any post-payment question until it returns paymentStatus=Complete'). This is exactly the when/when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
- First observed
create_checkout_session - First observed
get_company_info - First observed
get_company_onboarding_status - First observed
list_companies - First observed
report_missing_capability - First observed
save_company_details - First observed
search_industries - First observed
start_formation - First observed
start_new_company - First observed
submit_formation - First observed
switch_active_company - First observed
verify_payment
Related MCP Connectors
US LLC formation for non-residents: no SSN, plus EIN, banking, ITIN and annual renewals.
A legal home for AI agents: Wyoming $299 or Nevis LLC. Free diagnostic; agents pay in USDC/USDT.
US LLC filing fees, annual-report deadlines and naming-rule checks, from official state sources.
Form and manage a Delaware C-Corp from your agent. Setup: https://corply.dev/skills.md
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceEnables AI agents to explore and prototype Wyoming DAO LLC formation workflows in a sandbox environment.2MIT- AlicenseNot gradedqualityBmaintenanceEnables voice-first assistants to answer small-business compliance questions for Idaho and New Mexico LLCs, returning short spoken checklists, the next filing deadline, plain-language explanations of terms, and quick website accessibility checks. Every fee and rule is cited to a statute or official source, and unsupported states or unverified details are labeled unknown.MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to autonomously form and govern real legal companies (Wyoming or Nevis LLCs) with agent-specific charters, containing liability and proving authority through MCP tools.1-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query New York State's live business register for any LLC's county on file, 120-day publication deadline and price, and to check name availability, get formation and filing quotes, and view monthly formation statistics. Every tool is read-only, and the remote server needs no account, API key, or installation.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.