Skip to main content
Glama

Server Details

Find new business owner contacts the morning the state posts a filing. Preview free, pay per record.

Ownership verified
Status
Healthy
Uptime
99.9% over 22 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.1/5.0

Scored across 13 tools

Disambiguation2/5

Several tools overlap heavily: checkout_list and create_checkout are explicitly the same code path, list_products and list_starters return the same live shelf document, and browse_leads(summary=True) overlaps with quote_list. An agent can easily misselect among near-duplicate tools despite descriptions that acknowledge the duplication.

Naming Consistency4/5

Names are consistently lower snake_case and mostly readable, but they do not follow one strict verb_noun pattern. Some are verb-led (browse_leads, quote_list), some are list-prefixed (list_starters), and others are noun phrases or mixed forms (data_quality_scorecard, find_lead_by_glid).

Tool Count4/5

Thirteen tools is reasonable for a lead-commerce surface covering discovery, filtering, pricing, checkout, lookup, and data quality. However, the count is slightly inflated by compatibility/duplicate tools such as create_checkout and list_products, so not every tool earns a distinct place.

Completeness3/5

The core browse → interpret → quote → checkout flow is well covered, with useful supporting tools for schema, concepts, state availability, and data quality. Notable gaps remain around post-purchase order management: no explicit tool to check order status, retrieve a purchased file/receipt, manage saved lists, or manage standing orders and CRM connections beyond checkout parameters.

Available Tools

13 tools
browse_leadsBrowse leadsA
Read-onlyIdempotent
Inspect

Browse leads — rows for a shape or a saved list, or (summary=True) its counts, facets and price.

Two ways to say which records, one contract underneath:
  * a saved list — `list_id`, the 8-char id in `#browse?list=<id>`. Its states,
    filters, sort and inactive-or-holding toggle are read from the list;
    pass nothing else about the shape.
  * an inline shape — `filters` plus `state` (one state) or `states`
    (several); omit both for every live state (CO, CT, FL, NY, TX, VA).

`summary=True` returns the summary contract instead of rows — the same
numbers the buying surface shows, from the same code path: `matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`,
`facets`, `prices`, `quote` (present when `lane` or `cap` is given),
`exact`, `computed_at`, `quote_valid_until`, `per_state`. **Only `sellable`
— a matching record whose filing names a person — is ever billed or
delivered; never quote `matching` as a price.** name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). Lanes: `all` / `best` / `contact`
(`all` = every sellable record at the name-and-address price; `best` =
each record at its own grade, verified first; `contact` = only records
with a verified phone or email). Cap: `{"type": "count|budget", "value"}`
— records for count, cents for budget. To buy, hand the same list / shape,
lane and cap to `create_checkout`.

Speak the canonical vocabulary — it is the same across every state:
`status` and `entity_type` take canonical values (`"active"`, `"LLC"`),
so `entity_type = "LLC"` matches Colorado's raw `DLLC`, Florida's `FLAL`,
and New York's spelled-out form alike; state-specific raw codes live
behind `status_raw` / `entity_type_raw` if you ever need them.
"Contacts" is the buyer's word for the records themselves — every record
names a person, so "contacts for new salons" needs no extra filter.
"Decision-makers" = filter
`contact_relevance_tier in ["Decision Maker", "Likely Decision Maker"]` —
our scored is-this-the-right-person opinion, available in EVERY state;
apply it when the buyer asks for decision-makers, never silently.
(`role_is_decision_maker: true` is the stricter, title-attested variant:
it means the state's own filing lists an authority title. Several states —
Colorado and New York among them — publish no officer titles at all, so
filtering on it there returns zero and silently drops real decision-makers.
Layer it on top only when you specifically want title-attested records.)
When a filter touches a (field, value) the requested state never populates
by design (e.g. `entity_type="SOLE_PROP"` in TX), the payload additionally
carries `zero_reasons` — machine-readable notes saying WHY the count is
zero and the nearest alternative; the key is absent otherwise. A
`formation_date` window that holds nothing explains itself the same way
on a summary: whether it ends before our earliest matching record, and
what the same filters match without the date limit.
Add `has_phone` / `has_email` for reachable ones. Worked example — active
LLC decision-makers with a phone, across all states, excluding two sectors:

    browse_leads(filters=[
        {"field": "status", "op": "eq", "value": "active"},
        {"field": "entity_type", "op": "eq", "value": "LLC"},
        {"field": "contact_relevance_tier", "op": "in",
         "value": ["Decision Maker", "Likely Decision Maker"]},
        {"field": "has_phone", "op": "eq", "value": true},
        {"field": "industry_sector", "op": "not_in",
         "value": ["Real Estate", "Finance"]},
    ])

`filing_kind` says what the state filing did. The default is Just started
(`formation`) — a business that did not exist before its filing — so a plain
call never returns an existing business that the state gave a new document
number. Widen with `include_existing=True` (every existing business with a
new filing at once) or by name: `filing_kind in ["registration", "conversion",
"name_change", "reinstatement", "address_change"]` returns existing businesses
the state published a fresh event about; `lead_class` on every row carries
the answer in the buyer's words — `Just started`, `New to <state>` (the
record's own state), `Established business, new entity`, `New trade name`,
`Back in business`, `Moved`. Never mix the two in one order — they are priced and
sold as separate lists. Closed businesses (`dissolution`) are excluded unless
named or `include_non_operating=True`. Every row also carries `last_event`
and `last_event_date` — the most recent thing the state published and the day
it published it.

Same owner: `cluster_size >= 2` is every business whose owner filed more
than one, so one call reaches the set; `cluster_code` is the record's place
in that group (`XF-O` / `XP-O` / `XM-O` an operating business, the `-V` codes
a holding company built around one). Blank on a single, so a filter on either
never matches a business with no related filing. `new_business_tier`
(`Confirmed new` … `Established`, newest first) is how sure we are the
business is genuinely new — filter on it, never sort by it; an empty result on
a fresh cohort means the score has not reached it yet.

Filter grammar (rendered from the schema — `list_filterable_fields(section="grammar")` is the full contract): a leaf is `{"field", "op", "value"}`; the top-level filters list is an implicit `and` group; group nodes `{"op": "and", "filters": [...]}` and `{"op": "or", "filters": [...]}` nest one or more children, `{"op": "not", "filters": [<one leaf or group>]}` negates exactly one. Operators by field type — text: eq, neq, in, not_in, contains, does_not_contain, exists, missing; number: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; date: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; boolean: eq, neq; geo: within. Narrower pseudo-fields — `run_manifest_id` eq; `cluster_ref` eq; `missing_stage` eq; `created_at` gt, gte, lt, lte, between; `geo_polygon` within; `geo_radius` within; `has_phone_or_email` eq; `filing_kind` eq, neq, in, not_in; `new_business_tier` eq, neq, in, not_in. `neq`, `not_in`, `does_not_contain`, `not` keep rows where the field has no value. `exists` / `missing` take no value; `in` / `not_in` take a non-empty list; `between` takes `[start, end]`, both required. A (field, op) pair outside its type's row is a 422 naming the row, never a 500. Records appear here the morning after the state posts them — speed is measured from publication, never from filing.

Args:
    state: Two-letter state code (e.g. `FL`, `CO`) for one state.
    states: Several state codes (rows or summary). Omit both `state` and
        `states` for every live state.
    list_id: A saved list id. Mutually exclusive with `state` / `states` /
        `filters` — the list already carries them.
    filters: Filter clauses in the grammar above (leaves and `and` / `or` /
        `not` groups). Use `list_filterable_fields` to discover the
        85 fields, each one's enforced operators and allowed values.
    page: 1-based page number.
    page_size: Rows per page (1–200 with a key; capped at 25 on the free
        tier, default 50).
    sort: `[{"field", "dir"}]`, one or more keys over any of the 76 sortable fields (`asc` / `desc`); a bare field name still works with `sort_dir`. Tier fields sort by rank (reachability_tier On Fire > Very Hot > Hot > Warm > Cold; contact_relevance_tier Decision Maker > Likely Decision Maker > Probable Contact > Uncertain Contact > Unlikely Decision Maker; contact_confidence_tier Verified Contact > Likely Contact > Possible Contact > Uncertain Contact; industry_confidence_tier confirmed > likely > possible > unknown; new_business_tier Confirmed new > Likely new > Uncertain > Likely established > Established); lead_ref ASC is always appended (total order). An unknown field or direction is a 422 listing the sortable fields — never a silent fallback. Default `reachability_score` descending.
    sort_dir: `asc` or `desc` (default `desc`) — used when `sort` is a bare field name.
    include_non_operating: Include inactive or holding businesses
        (default False — only the records we sell). A saved list's own
        toggle wins when `list_id` is given.
    include_existing: Include existing businesses with a new filing —
        opening a location here, formed in another state, back in
        business, a new entity, moved, a new trade name (default False —
        Just started only). Naming a `filing_kind` implies it.
    summary: Return the summary contract (counts, facets, prices, quote)
        instead of rows. Implied when `lane` or `cap` is given.
    lane: `all` / `best` / `contact` — asks the summary for a `quote`.
    cap: `{"type": "count|budget", "value": <int>}` — the dial the quote is
        solved against (records for count, cents for budget).

Returns:
    Rows: `{"items": [...], "total", "page", "page_size", "pages", "access_level",
    "_meta"}`. `_meta` is the provenance block every read carries:
    `schema_version` (the read-contract version — pin migrations to it),
    `freshness.data_refreshed_at` (when this state's data was last worked),
    `source` (public registry + derived-field attribution), `score_versions`,
    and `access_level` (preview = masked contacts, full = keyed). Keyless
    callers see `contact_name`, `email_primary`, `phone_primary` masked and may not filter the summary on them (422).
    Summary: the contract described above.
ParametersJSON Schema
NameRequiredDescriptionDefault
capNo
laneNo
pageNo
sortNo
stateNo
statesNo
filtersNo
list_idNo
summaryNo
sort_dirNodesc
page_sizeNo
include_existingNo
include_non_operatingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses billing rules, free-tier masking, 422 error behavior, freshness timing, zero_reasons, default exclusions, and sort order guarantees. It also warns that quote matching is never a price and that decision-maker filters should never be applied silently. No contradiction with annotations exists.

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

Conciseness4/5

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

The description is long, but it is organized into labeled sections and every block carries operational meaning. Some redundancy exists, such as repeating filing_kind examples and the same filter semantics in prose and grammar, but given the tool's complexity and zero schema coverage, the length is justified.

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?

The description covers all 13 parameters, both row and summary return contracts, error semantics, pricing, privacy restrictions, provenance metadata, and domain-specific vocabularies. It is sufficient for an agent to call the tool correctly without any additional documentation.

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 0%, and the description fully compensates: every parameter is explained, including the shape of cap, lane values, sort field/direction syntax, page_size limits, and the filter grammar. It even defines named values like contact_relevance_tier and canonical entity_type values, which the loose schema cannot express.

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 opening line states the exact function: browse leads rows for a shape or saved list, or a summary with counts, facets, and price. It introduces the two mutually exclusive input modes and explicitly separates row retrieval from summary retrieval, making the tool's purpose unambiguous.

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 detailed when-to-use guidance: saved list vs inline shape, when to omit state filters, when summary is implied by lane/cap, and when to use include_existing vs default filing_kind. It also points to list_filterable_fields for field discovery and to create_checkout for the buying path, explicitly routing to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

checkout_listCheckout link for a listAInspect

Turn a quoted list into a payment link a person completes — the buyer gets the file within a minute of paying.

Creating the link costs nothing and charges nobody — payment only happens
if a human opens the returned `checkout_url` and completes it on Stripe's
hosted page. Hand the URL to your human; do not represent the purchase as
complete until they confirm payment. Nothing is charged until a person completes checkout; the file arrives about a minute after they pay; if we find a phone or email on the records after that, the updated file replaces it on the order's receipt page within a few hours and the receipt shows what was found and billed. A hard bounce, a disconnected phone or the wrong person is replaced within 30 days; what you buy is yours to re-download any time.

Pass a saved list (`list_id`, `#browse?list=<id>`) or the inline shape
`filters` + `states` (omit `states` for every live state:
CO, CT, FL, NY, TX, VA), a `lane` (`all` / `best` / `contact`) and an optional `cap`
(`{"type": "count|budget", "value"}` — records for count, cents for
budget). The list is quoted through the same summary path `quote_list`
uses, then checkout is opened against exactly that quote — if the price
rule or the count moved in between, the server answers 409 with the fresh
quote and nothing is minted. **Billing base is `sellable` (a matching
record whose filing names a person), never `matching`.** name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). The
selected records are frozen when the link is minted, so what is billed is
what is delivered. After payment we go find a phone and email on every
record bought without one: the buyer authorizes a ceiling (`ceiling_cents` —
today's total plus the forecast upgrades), is charged `charged_now_cents` for
what exists now, and later only what we find, at that grade's price and
never above the ceiling. Every record ships the owner's name and mailing address plus the business facts — the business name, entity type and status, the state filing number and formation date, the industry with its NAICS, SIC and Google Business codes, the registered agent, the Lead Reference, and the Reachability, Contact Relevance and Contact Confidence scores; open the exact file before paying (ten made-up records, every column): https://app.goodleads.club/api/v1/commerce/sample-file?format=xlsx (or format=csv). A standing order on the same list (new matches on a
daily / weekly / monthly / quarterly cadence, billed monthly by the record
actually delivered, at the same graded rule) is set up from the paid
order's receipt — this tool sells the one-time purchase.

`delivery`: `file` (the customer workbook — CSV / Excel / JSON, yours to
re-download any time), `crm` (push into `crm_connection_id`), or
`connector` (the file ships today and `connector_crm_name` is recorded as
a request for that CRM).

`include_existing`: the order is Just started only — brand-new businesses —
unless you pass this (or name `filing_kind` / `business_origin` in
`filters`); then existing businesses with a new filing are in the file too,
labeled, and the file's Read Me says you asked for them.

`offer_code`: the offer code your human was given, if any — the same one
you quoted with. Every grade then bills at the lower of list and the
offer; a code bound to one buyer needs their `customer_email`; a code
that cannot cover the whole list answers with the cap to set.

Returns: `checkout_url`, `order_id`, `session_id`, `records`,
`total_cents`, `currency`, `lines` (one per grade), `lane`, `cap`,
`price_rule_version`, `quote_valid_until`, `computed_at`, `exact`,
`counts` (`matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`), `offer` (when a code priced it), `saved_list` (`id`, `url`, `name`, and the
one-time `claim_token` when this call saved an inline shape as a list),
`after_payment` and `guarantee` (the two sentences above, to relay), and —
when there are records to find on after payment — `ceiling_cents`,
`charged_now_cents` and `ceiling_note`.
ParametersJSON Schema
NameRequiredDescriptionDefault
capNo
laneNobest
statesNo
filtersNo
list_idNo
deliveryNofile
offer_codeNo
customer_emailNo
include_existingNo
crm_connection_idNo
connector_crm_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses that creating the link does not charge anyone, that payment only occurs when a human completes Stripe's hosted page, and that the file arrives about a minute after payment. It also explains post-payment enrichment, the ceiling charging model, replacement guarantees, and the traceability of records. These details go far beyond the sparse annotations (readOnlyHint=false, idempotent=false, destructive=false) and set accurate expectations for a state-changing commerce tool.

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

Conciseness2/5

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

The description is over 800 words and repeats the same charging and delivery timing facts multiple times (e.g., 'Nothing is charged until a person completes checkout' appears in different wording throughout). It also includes a sample file URL and extensive pricing details that could be moved to linked documentation or the output schema. While front-loaded, many sentences do not earn their place, making it bloated rather than concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex commerce tool with 11 parameters and no schema descriptions, this description covers every parameter, the full return field list, pricing rules, post-payment behavior, delivery options, and guarantees. It even provides a sample file URL and explains the difference from standing orders. No critical information is missing for an agent to call it correctly.

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?

With 0% schema description coverage, the description fully compensates by explaining every parameter: lane's allowed values, cap's object shape and unit semantics, delivery modes and their effects, include_existing's filter behavior, offer_code and customer_email requirements, the live states list, and crm/connector parameters. It gives exact formats and example values, which is far more than the bare schema titles provide.

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 first sentence clearly states the tool converts a quoted list into a payment link the buyer completes, with the file delivered within a minute. This is a specific verb and resource, and it distinguishes the tool from quote_list, which only produces a quote. The purpose is unmistakable even without reading the rest of the long description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete usage guidance: pass a saved list_id or inline filters/states, specifies acceptable lane values, and explains the one-time purchase nature while noting that standing orders are set up from the paid order's receipt. It also warns about 409 responses when the quote is stale. However, it never names an alternative tool like create_checkout, so an agent must infer when to prefer this over a sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_checkoutCheckout link for a list (older name)AInspect

Mint a hosted Stripe Checkout link for a list you shaped — the same code as checkout_list.

Creating the link costs nothing and charges nobody — payment only happens
if a human opens the returned `checkout_url` and completes it on Stripe's
hosted page. Hand the URL to your human; do not represent the purchase as
complete until they confirm payment.

For new work, use the dedicated buying journey: `interpret_list` (the
buyer's words → a shape) or `list_starters` (ready-made lists with live
counts) → `quote_list` (graded counts + the price) → `checkout_list`
(this link). This tool keeps accepting a list for compatibility — the
list path is the same code as `checkout_list`.

What you can buy: a list — `list_id` (a saved list, `#browse?list=<id>`) or the
inline shape `filters` + `states` (omit `states` for every live state:
CO, CT, FL, NY, TX, VA), with a `lane` (`all` / `best` / `contact`) and an optional `cap`
(`{"type": "count|budget", "value"}` — records for count, cents for budget).
The list is quoted through the same summary code path `browse_leads(summary=True)`
uses, then checkout is opened against exactly that quote — if the price
rule or the count moved in between, the server answers 409 with the
fresh quote and nothing is minted. **Billing base is `sellable` (a
matching record whose filing names a person), never `matching`.**
name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). The selected records are frozen when the link is minted, so
what is billed is what is delivered.

`product_id` buys nothing: fixed-price shelf products were replaced by
starter lists with live counts. Passing one returns an error that names
the next calls — `list_starters` (or `interpret_list`), `quote_list`,
`checkout_list`. Every purchase is one-time; a standing order is set up
from a paid order's receipt, billed monthly for the records actually
delivered.

`delivery`: `file` (the customer workbook — CSV / Excel / JSON, durable
re-download), `crm` (push into `crm_connection_id`), or `connector`
(the file ships today and `connector_crm_name` is recorded as a request
for that CRM). Delivery fires automatically on payment, typically within
a minute.

Returns: `checkout_url`, `order_id`, `session_id`, `records`,
`total_cents`, `currency`, `lines` (one per grade), `lane`, `cap`,
`price_rule_version`, `quote_valid_until` (counts refresh tomorrow
morning; the quote holds until then — and the frozen selection holds for
the life of the checkout session), `computed_at`, `exact`, `counts`
(`matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`), and `saved_list` (`id`, `url`, `name`, and the one-time
`claim_token` when this call saved an inline shape as a list).
Nothing is charged until a person completes checkout; the file arrives about a minute after they pay; if we find a phone or email on the records after that, the updated file replaces it on the order's receipt page within a few hours and the receipt shows what was found and billed. A hard bounce, a disconnected phone or the wrong person is replaced within 30 days; what you buy is yours to re-download any time.
ParametersJSON Schema
NameRequiredDescriptionDefault
capNo
laneNobest
statesNo
filtersNo
list_idNo
deliveryNofile
offer_codeNo
product_idNo
customer_emailNo
crm_connection_idNo
connector_crm_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations are minimal (all false hints), so the description carries the full burden and exceeds it. It discloses that payment only happens on Stripe's hosted page, that billing base is `sellable` not `matching`, that a 409 is returned if the quote changed, that records are frozen at mint time, that delivery fires automatically, and even covers replacement/bounce policy. No contradiction with annotations.

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?

The description is dense and informative but noticeably long and somewhat repetitive: 'the same code as `checkout_list`' appears twice, and the return-field enumeration overlaps with the provided output schema. It is well-paragraphed and front-loaded, but it could be tightened without losing value.

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 an 11-parameter tool with no schema description coverage, the description is remarkably complete. It covers pricing, quote validity, delivery timing, error behavior, standing orders, and edge cases like state omission. The output schema already exists, so the detailed return list is bonus context rather than a required gap.

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?

With 0% schema coverage, the description must compensate and mostly does: it explains `list_id` vs inline `filters` + `states`, `lane` values, `cap` shapes, `delivery` modes, `product_id` deprecation, and CRM-related parameters. It leaves `offer_code` and `customer_email` undocumented, which is a small gap in an otherwise thorough parameter treatment.

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 specific verb and resource: 'Mint a hosted Stripe Checkout link for a list.' It immediately distinguishes itself by stating it is the 'older name' and 'the same code as `checkout_list`,' so an agent can clearly tell this tool apart from its sibling despite overlapping functionality.

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 explicitly lays out the recommended buying journey (`interpret_list` or `list_starters` → `quote_list` → `checkout_list`) and says this tool remains for compatibility. It also warns that `product_id` should not be used and names the alternative calls in the error path, giving clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_quality_scorecardData quality scorecardA
Read-onlyIdempotent
Inspect

How clean is the data a buyer would receive in a state — numbers, not adjectives.

The scorecard grades the records a buyer would receive on mechanical
conformance across four dimensions — format (state/phone/email/zip),
completeness (a name for who filed it, an address present), consistency (names in
CRM-ready Title Case, not ALL-CAPS; the address's own state agrees with its
ZIP), and standardization (how much of the
state's raw status / entity-type vocabulary is mapped into the canonical
cross-state values that `status` / `entity_type` filters match on — an
unmapped row is one a canonical filter silently misses). It returns an
overall 0–100 score, the
per-dimension breakdown, and per-check pass rates with sample offenders you
can click through. Use it to answer "how clean is the data we're selling in
{state}?" and to track data-quality work the way classification is tracked.

The payload also carries a fifth, record-centric **coverage** dimension
(the `coverage` block + `dimensions.coverage`): per pipeline stage, how
many records that brain has NEVER stamped (`gap`), plus a stale-version
count where the brain persists one. Free-chain checks are scored; paid
stages (skip trace / gap-fill / validation / LLM passes) are reported but
unscored — enrichment is spent per order, so an un-enriched set of records
is posture, not a defect. Coverage deliberately does not move the headline
`score`. Each check includes `browse_filters` (a `missing_stage` filter):
the exact set of records works on `browse_leads` and scopes a surgical repair run
on the pipeline trigger. Stages whose brains leave no per-record mark are
listed under `coverage.unmeasured` with reasons rather than pretended into
numbers.

Args:
    state: Two-letter state code (e.g. `FL`, `CO`). Omit to get every state,
        worst score first.
    sample_limit: Max sample offenders to return per check (0–50, default 8).

Returns:
    A scorecard dict for one state, or `{"states": [...]}` for all states.
    Either shape carries a `_meta` provenance block (schema_version,
    freshness, source, score_versions, access_level). Served from a cache
    refreshed in the background: `computed_at` / `age_seconds` date it,
    `stale: true` means the refresh is behind (report the numbers with their
    age), `status: "computing"` means none exists yet. Never call it again for a fresher one.
ParametersJSON Schema
NameRequiredDescriptionDefault
stateNo
sample_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent safety, and the description goes well beyond them: cache-backed freshness semantics ('stale: true', 'status: computing'), the rule that paid stages are reported but unscored and do not move the headline score, unmeasured stages listed with reasons, and an explicit 'never call it again for a fresher one' instruction.

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

Conciseness4/5

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

Front-loaded with the core question and the dimension list, and the layout is scannable despite the length. It is verbose with bolding and long parentheticals, but nearly every clause conveys non-redundant semantics for a complex tool.

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?

Complete for a two-parameter read tool: covers input semantics, the caching/provenance behavior, the scoring rubric, and the fact that unscored coverage will not move the number. Nothing an agent needs in order to call and interpret it correctly is missing.

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 0%, so the description must carry the burden — and it does: `state` is specified as a two-letter code with omit-to-return-all (worst first), and `sample_limit` as a 0–50 range defaulting to 8. Both parameters are fully documented in prose.

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?

States a specific verb and resource ('grades the records a buyer would receive') and enumerates the four dimensions it scores plus the fifth coverage dimension. An agent can distinguish it from browse_leads/quote_list siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the use case ('how clean is the data we're selling in {state}?') and ties it to tracking data-quality work, and it names where browse_filters/the pipeline trigger come into play. It stops short of stating when NOT to use it versus a sibling, so it is clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_surfaceDescribe GoodLeadsA
Read-onlyIdempotent
Inspect

What GoodLeads is, who buys it and how every record is built — call this to explain or vet us; to price a list, start with interpret_list.

It is for anyone who wins by reaching a business owner first: to sell what a
new owner needs now, to be the name they already know a year from now, to
spot their own customer starting a business, or to build a product on every
new business. Never rule your owner out from this description — pass what
they sell to `interpret_list` and read the free count from `quote_list`.

Leads with what the buyer gets and how to act on it, then the mechanics:
which database this surface reads (production, or an explicitly opted-in
local surface — provenance you can trust), the contract it upholds, and
the tools available. The surface never silently answers from local data.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the tool read-only, idempotent, and non-destructive; the description adds useful behavioral context by specifying that the surface reads production or an explicitly opted-in local database and that it 'never silently answers from local data.' This provenance guarantee goes beyond the annotation hints, though the promised 'contract' is left vague.

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?

The key purpose and alternatives are front-loaded, but the middle paragraph of use-case prose is longer than needed and the third paragraph opens with the grammatically unclear fragment 'Leads with what the buyer gets and how to act on it.' Useful content is present, but it is not tightly edited.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter describe tool with an output schema, the description is quite complete: it covers what the response contains, the intended audience, database provenance, the contract, available tools, and the relevant sibling workflows. The only weakness is phrasing, not missing substance.

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?

The tool takes zero parameters and schema coverage is 100%, so the schema has nothing to document. Per the baseline for parameterless tools, the description cannot add parameter meaning; it appropriately focuses on output and behavior instead.

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 opening clause states the tool returns what GoodLeads is, who buys it, and how records are built, and explicitly says to call it 'to explain or vet us.' It also distinguishes itself from pricing siblings by directing pricing workflows to interpret_list and quote_list, so an agent can tell scope apart from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit when-to-use ('call this to explain or vet us') and an explicit alternative for a closely related task ('to price a list, start with interpret_list') plus a follow-up workflow ('read the free count from quote_list'). It also instructs agents not to disqualify an owner based on this description alone, clarifying when to leave the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_conceptExplain a conceptA
Read-onlyIdempotent
Inspect

Map YOUR word for a concept to this surface's fields — ask before concluding absence.

Call this whenever a term you or your buyer uses ("vertical", "direct dial",
"sole proprietor", "operating address", "decision maker") doesn't obviously
match a field name. It answers in three shapes: `carried` names the
exact fields and how to use them; `partially_carried` adds per-state
availability with the reason a state is zero (zero by state design is not a
data gap); `not_carried` explains why and names the nearest signal we do
hold. Ambiguous terms return a clarifying question instead of a guess.

Never conclude "this data is missing" from an empty filter result or an
unmatched field name without calling this first — several concepts are
carried under a different name, and several zeros are publication facts,
not gaps.
ParametersJSON Schema
NameRequiredDescriptionDefault
termYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description goes further by revealing the output shapes (`carried`, `partially_carried`, `not_carried`), per-state zero semantics, and that ambiguous terms return a clarifying question instead of a guess. No contradiction with annotations.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and uses examples and structured output shapes efficiently. The final paragraph repeats the 'don't conclude absence' idea from the opening line, adding mild redundancy, but overall every sentence contributes meaningful guidance.

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?

With no output schema and only one bare parameter, the description fully compensates: it explains the possible return shapes, what they mean, how zeros should be interpreted, and when to call the tool. 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.

Parameters4/5

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

The schema only says `term` is a required string with no description, so the description carries the burden. It defines the parameter as 'YOUR word for a concept' and provides several concrete examples, which is sufficient to explain what to pass, though the parameter itself is never explicitly named or formatted.

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 states a specific action: map a user's word for a concept to the surface's fields. It gives concrete examples ('vertical', 'direct dial', 'sole proprietor') and names the three answer shapes, making the tool's role unmistakable and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to call this tool whenever a term does not obviously match a field name, and gives a strong when-not directive: never conclude data is missing without calling it first. It does not compare against specific sibling tools, so the 'alternatives' part is implied rather than named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_lead_by_glidLook up one lead by IDA
Read-onlyIdempotent
Inspect

One record in full, by its Lead ID (e.g. GL-CO-00042).

Use this when you already hold a Lead ID — from a file, a CRM, a receipt —
and want everything we know about that business and its owner: the
business, the primary contact, both scores, every attribute, and where
each field came from.

Args:
    glid: The Lead ID, e.g. `GL-CO-00042` — the `lead_ref` field on every
        record. Case-insensitive.

Returns:
    The full lead detail dict, including a `_meta` provenance block
    (schema_version, freshness incl. this record's last update, source,
    score_versions, access_level). Includes `history`: every event the state
    has published about this business, newest first, each with
    `published_date`, `event` (plain words) and `effective_date` when it
    differs; for a business that changed form, `prior_entity_ref` and
    `prior_entity_formation_date` name the record it came from. The
    `entity` carries `filing_kind` and `lead_class`. The history is free
    without a key; only the person is masked. Raises ValueError if the id
    is not shaped like a Lead ID or no record matches.
ParametersJSON Schema
NameRequiredDescriptionDefault
glidYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With annotations already marking it read-only and idempotent, the description adds substantial behavior: case-insensitive ID matching, ValueError on malformed or unmatched IDs, free history with only the person masked, newest-first ordering, and a _meta provenance block. This goes well beyond the annotation safety profile and prepares the agent for error cases and output shape.

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 front-loaded with the one-sentence purpose and usage condition, then organized into Args and Returns sections. Although the Returns section is detailed, every clause conveys a decision-relevant behavior (ordering, masking, errors, provenance), so no sentence feels wasted.

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 single-parameter lookup tool with no parameter schema description, the description is complete: it covers ID format, input source, output contents, provenance, history, access/masking, and error behavior. An agent has everything needed to decide to call it and to interpret the result.

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?

The sole parameter `glid` has no description in the schema (0% coverage), so the description carries the full burden. It explains the parameter means the Lead ID, gives a concrete example (`GL-CO-00042`), maps it to the `lead_ref` field on every record, and notes case-insensitivity. This fully compensates for the schema gap.

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 opening sentence names the exact operation and resource: 'One record in full, by its Lead ID' with format. The description then specifies precisely what is returned (business, contact, scores, attributes, provenance), which distinguishes this from list/browse siblings like browse_leads. This is a specific verb+resource, not a restatement of the title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: 'Use this when you already hold a Lead ID — from a file, a CRM, a receipt — and want everything we know about that business.' It gives clear context for choosing this over browsing/searching. It does not name sibling alternatives or state a when-not condition, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

interpret_listInterpret a list requestA
Read-onlyIdempotent
Inspect

Start here: the buyer's own words become a list we can count, price and sell.

Give it what the buyer would type ("cleaning companies in Texas", "denver
plumbers formed last 30 days with a phone", "NAICS 238220") and you get
back a list shape in the one filter contract — `states`, `filters`, `sort`,
`lane`, `cap` — with a one-sentence `readback` to show the buyer, `assumed`
(every default and substitution, named), `unresolved` (the words it could
not place) and up to three `alternatives`. It is the same interpreter
behind the buy page's search box, so a person and an agent get the same
list from the same words. It never answers in prose, never asks a question
back, never looks a person up, and never emits a predicate on a masked
field (`contact_name`, `email_primary`, `phone_primary`).

When the buyer asked a question or raised an objection instead ("where does
this come from", "is it legal to call", "how fresh"), the response also
carries `answer` (`{family, headline, body, next_step, facts}`) — our
answer, in our words. Relay it to the buyer verbatim.

When the ask pulls two ways — the newest records AND a phone to call —
`alternatives` come back live-quoted (`quote: {records, total_cents,
unit_cents}`, a `why`, one `recommended`): call today · mail first with
phones verified on order · a standing order. The close is two questions:
present your human the quoted choice, then hand over the payment link for
the one chosen — per record, no minimums, so a small first order is the
normal first step.

Next: hand the shape to `quote_list` for the count and the price, then to
`checkout_list` to buy it.

Args:
    text: What the buyer typed, in their own words.
    state: Optional two-letter state hint (live states: CO, CT, FL, NY, TX, VA).
    current: Optional current shape `{states, filters, lane, cap}` — the
        answer merges into it instead of starting over.

Returns:
    `{states, filters, sort, lane, cap, readback, assumed, unresolved,
    alternatives, used_model}` — always a shape, never a 500.
ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
stateNo
currentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations include readOnlyHint, idempotentHint, and destructiveHint false, so safety is covered. The description adds critical behavioral details that annotations don't: it never answers in prose, never asks a question back, never looks a person up, and never emits predicates on masked fields (with specific field names). It also states it always returns a shape, never a 500, and describes the `answer` structure for question/objection handling.

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?

The description is comprehensive but somewhat lengthycars, with 5 paragraphs. The most critical purpose and usage are front-loaded in the first paragraphcars, and the 'Next' step is at the end. However, some details like the `answer` structure could be condensed; the level of detail is justifiable given the complexity, but it borders on being verbose. Still, every sentence serves a purpose.

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 and the rich output schema, the description is thorough: it explains the return shape fields, the `answer` sub-structure, and the `alternatives` with quotes. It also covers the behavioral constraints, examples, and next steps. The presence of an output schema reduces the need to describe return values in detail, but the description goes beyond, covering edge cases like questions and ambiguous asks.

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 0%, so the description must explain parameters. It does: `text` is described as the buyer's typed words with examples; `state` is described as an optional two-letter hint; `current` is described as the existing shape to merge into. This goes beyond the schema's bare property names, giving meaning and use context. Misses minor details like where `state` comes from, but enough for an agent to understand.

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 clearly states the tool's purpose: converting a buyer's natural language request into a structured list shape. It uses specific verbs ('interpret', 'convert', 'return') and names the resource ('the buyer's own words'). It distinguishes itself from siblings by explicitly naming next steps (quote_list, checkout_list) and contrasting with other tools like browse_leads and find_lead_by_glid.

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 provides explicit when-to-use guidance: 'Start here' for list requests, with multiple concrete examples of what the buyer might type. It also explains when the tool handles questions/objections, and when the tool should be used for ambiguous asks with alternatives. It also names alternatives: 'Next: hand the shape to quote_list' implies use this before those, and mentions what it never does (never asks questions, never looks up a person), clarifying when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filterable_fieldsFilterable fields and grammarA
Read-onlyIdempotent
Inspect

The filter contract, from the schema endpoint (GET /api/v1/schema/attributes?include=grammar): fields, grammar, or recipes.

Call this before building `browse_leads` filters you haven't used before.

Args:
    section: `fields` (default) — every one of the 85 filterable
        fields as `{"field", "label", "type", "operators", "sortable",
        "masked", "allowed_values"?, "description", "job", "absence",
        "synonyms"}`: `operators` is the ENFORCED set for that field (its
        type's row, or a narrower pseudo-field override), `sortable`
        flags the 76 fields `sort` accepts, `masked` flags
        `contact_name`, `email_primary`, `phone_primary` (redacted for keyless callers, who may not filter the
        summary on them), `allowed_values` lists the vocabulary where it is
        enumerable (tiers in rank order, canonical `status` / `entity_type`
        values — identical across all states), `job` names the jobs-ladder
        step the field serves (LINK / CHOOSE / REACH, or IDENTITY),
        `absence` states what a zero/null means per state where states
        differ, and `synonyms` lists the buyer words that name this field;
        canonical-vocabulary fields additionally carry `"canonical": true`,
        the `"values"` list and a `"raw_variant"` naming the sibling field
        that filters the raw state-specific SOS codes.
        `grammar` — the leaf and group shapes (`and` / `or` / `not`), the
        operator row per field type and the pseudo-field overrides, the
        null semantics of the negative operators, and the sort contract
        (multi-key shape, rank-ordered tier fields, tiebreaker) — plus
        `sortable_fields` and `masked_fields` projected from the same
        response. Filter grammar (rendered from the schema — `list_filterable_fields(section="grammar")` is the full contract): a leaf is `{"field", "op", "value"}`; the top-level filters list is an implicit `and` group; group nodes `{"op": "and", "filters": [...]}` and `{"op": "or", "filters": [...]}` nest one or more children, `{"op": "not", "filters": [<one leaf or group>]}` negates exactly one. Operators by field type — text: eq, neq, in, not_in, contains, does_not_contain, exists, missing; number: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; date: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; boolean: eq, neq; geo: within. Narrower pseudo-fields — `run_manifest_id` eq; `cluster_ref` eq; `missing_stage` eq; `created_at` gt, gte, lt, lte, between; `geo_polygon` within; `geo_radius` within; `has_phone_or_email` eq; `filing_kind` eq, neq, in, not_in; `new_business_tier` eq, neq, in, not_in. `neq`, `not_in`, `does_not_contain`, `not` keep rows where the field has no value. `exists` / `missing` take no value; `in` / `not_in` take a non-empty list; `between` takes `[start, end]`, both required. A (field, op) pair outside its type's row is a 422 naming the row, never a 500.
        `recipes` — the outcome-recipe bank (`GET /api/v1/schema/recipes`):
        jobs-to-be-done answered with the exact filters, what each score
        means for that job, and the load-bearing caveats.

The same payload backs the Browse UI's filter builder, so anything listed
here works on browse, summary, export, checkout and pipeline scoping alike.
ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNofields

TDQS

A4.8/5.0
Behavior5/5

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

The description goes far beyond the readOnly/idempotent annotations, disclosing redaction behavior for keyless callers, enforced operator sets and pseudo-field overrides, null semantics for negated operators, and the concrete 422-vs-500 error contract. It also reveals the response structure, including canonical fields and raw_variant relationships. This is unusually rich behavioral disclosure.

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 long, but it is a grammar contract, so the length is justified and well-organized with bolded section labels. The front-loaded summary tells the agent what the tool is and when to call it before diving into the detailed argument spec. Every sentence adds necessary reference information rather than padding.

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 tool with no output schema, the description completely documents the return shapes, the grammar, the operator rows, pseudo-field overrides, sorting behavior, and error semantics. It also ties the tool to the recipe bank and UI behavior, leaving no obvious gap an agent would need to probe at runtime. This is fully adequate for safe invocation.

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?

The input schema has only one optional parameter with 0% schema coverage, so the description carries the full burden. It defines the three allowed section values ('fields', 'grammar', 'recipes'), states the default, and explains in detail what payload each section returns. An agent can confidently choose a section without any ambiguity.

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 names a specific verb and resource: it lists the filterable fields, grammar, or recipes from the schema endpoint. It is immediately distinguishable from data tools like browse_leads and create_checkout, and even tells the agent to call it before building browse_leads filters. This is a precise, unambiguous definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it: 'Call this before building browse_leads filters you haven't used before.' It also notes the same payload backs the Browse UI and that listed fields work across browse, summary, export, checkout, and pipeline scoping. It does not spell out explicit when-not-to-use scenarios, but the guidance is clear enough for model selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_live_statesLive statesA
Read-onlyIdempotent
Inspect

Where we are live right now — the state codes, read from production, never a cached page.

Call it before promising a buyer a state: a state not in this list is not
live yet. Returns `[{"state": "CO"}, ...]` — codes only, no counts. For how
many records a state holds, `quote_list` (or `browse_leads(summary=True)`)
on that state returns the live graded counts.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral detail: data is read live from production, never cached, and the result is codes only with no counts. This goes beyond what annotations provide.

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?

Every sentence earns its place: what it returns, when to call it, the exact output shape, and what to use instead for counts. The core message is front-loaded and there is no filler.

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?

Despite having no output schema, the description gives the exact return format. It also tells the agent how to interpret the list and how to get count data elsewhere. Nothing needed for correct invocation is missing.

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?

The tool has zero parameters, so there is no parameter semantics to elaborate. The description compensates by documenting the return shape exactly, which is the only operational detail an agent needs.

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?

States exactly what the tool does: returns live state codes from production, never from cache. Differentiates from siblings by emphasizing it is the authoritative source for currently-live states and pointing to quote_list/browse_leads for counts.

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 tells the agent when to call it — before promising a buyer a state — and gives a clear decision rule: a state not in the list is not live yet. It also names alternatives for count-related needs, so usage context is fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_productsShelf (starter lists)A
Read-onlyIdempotent
Inspect

The shelf — ready-made business type × state lists, with live counts.

Returns the same live document `list_starters` returns —
`{"count": N, "starters": [...]}`, one entry per (state, business type)
with its display `label`, the exact `filters` it opens with, the graded
counts (`matching`, `sellable`, `verified_one`, `verified_both`) and
`price_from_cents` (the name-and-address grade — the floor, not a flat
price) — plus a `note`. The shelf is the starter lists: every count here is live, the price is quoted per record by `quote_list`, and the payment link comes from `checkout_list`. Every purchase is one-time; a buyer who wants new filings to keep coming sets up a standing order from a paid order's receipt, billed monthly for the records actually delivered.
There are no fixed-price products and nothing here carries a
`product_id`: pass a starter's `filters` to `quote_list` for the exact
count and price, then to `checkout_list` for the link. name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block).
Only sellable records (the filing names a person) are ever billed, and
the selected records are frozen when the link is minted, so what is
billed is what is delivered. Evaluate before buying: `browse_leads` with
the same `filters` shows real masked records for free.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations, the description discloses live counts, absence of product_id, the pricing rule, one-time vs standing order billing, sellable-record billing, and record freezing when a link is minted. This is rich behavioral context that materially helps an agent understand what the tool and its outputs mean.

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?

The description is front-loaded with the core definition and uses line breaks to structure topics, but it is long and somewhat repetitive, e.g. 'The shelf is the starter lists' restates the opening and the pricing/billing details could be trimmed. Most sentences earn their place, but the overall length is heavier than necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the return shape, the meaning of each count, pricing, billing behavior, freezing, and the recommended preview path, so an agent can use the tool and its output effectively. The only notable gap is the unresolved relationship with list_starters, which prevents a perfect score.

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?

The tool has zero parameters and the schema coverage is trivially 100%, so there is nothing to document. Per the baseline for no-parameter tools, a 4 is appropriate; the description even explains how the output's filters become parameters for quote_list and checkout_list.

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

Purpose4/5

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

The description clearly identifies the resource as the shelf of ready-made business type × state lists with live counts, and states that it returns the same document as list_starters. However, it does not differentiate list_products from list_starters; it explicitly equates them, so an agent is left unsure which sibling to prefer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful downstream context: pass filters to quote_list for pricing, use checkout_list for payment, and preview with browse_leads. But it never says when to call list_products versus list_starters, and there is no explicit when-not or alternative-selection guidance for this tool itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_startersStarter listsA
Read-onlyIdempotent
Inspect

Ready-made lists to start from: every live state × business type, with live counts and a starting price.

Returns one document: `{"count": N, "starters": [...]}` — one entry per
(state, business type): the display `label`, the exact `filters` the card
opens with, the graded counts (`matching`, `sellable`, `verified_one`,
`verified_both`) and `price_from_cents` (the name-and-address grade —
the floor, not a flat price; the full price ladder comes from `quote_list`).
Show these to a buyer who has not said what they want yet, then narrow
with `interpret_list` or your own filters and price the result with
`quote_list`. Counts come from live inventory, cached server-side for a
few hours — never a stale copy from a marketing page.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint), the description discloses additional behavioral traits: it returns a single document with a specific structure, the price is a floor not a flat price, and counts are cached server-side for a few hours from live inventory, explicitly avoiding stale marketing-page data. This adds significant transparency beyond the structured annotations.

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 front-loaded with the core purpose, then provides a compact yet detailed breakdown of the return format, field semantics, usage guidance, and caching behavior. Each sentence carries essential information; there is no fluff or redundancy. The structure is logical: what, return shape, field explanations, usage, and freshness.

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 tool with no input parameters and a rich output, the description is exceptionally complete. It covers the exact return structure, field meanings (including the nuance of price_from_cents), how to use it in a buyer journey, and even notes about data freshness. The presence of an output schema (mentioned in signals) is further complemented by the inline return example. Nothing an agent needs to call this correctly is missing.

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?

The tool has zero input parameters, so the baseline is 4. The description does not need to explain parameters, and it correctly focuses on the output structure. Since there are no parameters, the description cannot add value here, but it also does not miss anything.

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 clearly states the tool's purpose: it returns ready-made lists for every live state × business type, with live counts and a starting price. It differentiates itself from siblings by explicitly contrasting with quote_list (full price ladder) and interpret_list (narrowing). The verb 'list' and resource 'starters' are specific, and the scope is unambiguous.

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 provides explicit usage context: 'Show these to a buyer who has not said what they want yet, then narrow with interpret_list or your own filters and price the result with quote_list.' This tells the agent exactly when to use this tool and how it fits into a workflow, including an alternative (interpret_list for narrowing) and a follow-up (quote_list for pricing).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

quote_listQuote a listA
Read-onlyIdempotent
Inspect

What this list costs before anyone pays: how many records name a person, and the price by grade.

Pass a saved list (`list_id`, the 8-char id in `#browse?list=<id>`) or an inline
shape (`filters` + `states`; omit `states` for every live state:
CO, CT, FL, NY, TX, VA). You get the same numbers the buy page shows a person:
`matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`, `facets`, `prices` (the live graded price rule +
`price_rule_version`), `quote` (present when `lane` or `cap` is given),
`exact`, `computed_at`, `quote_valid_until` (counts refresh tomorrow
morning; the quote holds until then), `per_state`, and the `_meta`
provenance block every read carries (schema_version, freshness, source,
access_level). When a count is zero by design the payload adds
`zero_reasons` — a state that never publishes the value, or a channel
asked of records too new to carry one yet: the morning after the
state posts a filing the record carries the name and mailing address;
phone and email are verified when you order. Each reason names the
widened count (`nearest_alternative`, e.g. "last 90 days: 99 with a
phone") and the filters that reach it (`alternative_filters`) — relay it
instead of a silent $0.

**Billing discipline — read before quoting money to anyone.** Only
`sellable` records — matching records whose filing names a person — are
ever billed or delivered. `matching` includes `unnamed` records with no
person to reach; it is never a billable count and must never be presented
as one. Every price line is computed from `sellable` and its grades:
name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). Lanes: `all` / `best` / `contact` (`all` = every sellable record at the
name-and-address grade; `best` = each record at its own grade, verified
first; `contact` = only records with a verified phone or email — add a
`has_email` filter for emailable now, `has_phone` for callable now). Cap:
`{"type": "count|budget", "value"}` — records for count, cents for
budget. Quote the server's numbers, never arithmetic of your own.

Each `quote.lines[]` entry carries `ships` (what a record at that grade
ships with, in the buyer's words — a name-and-address record never ships a
phone or email), and the summary carries `forecast` ({checked,
phone_expected, email_expected, both_expected, basis, as_of}): how many of
the records still to find on would come back with a verified phone or email,
from our measured outcomes on comparable records — relay it with its basis.
`ceiling_cents` is the most a buyer can be charged: today's total plus the forecast upgrades, charged only for what we find. Every record ships the owner's name and mailing address plus the business facts — the business name, entity type and status, the state filing number and formation date, the industry with its NAICS, SIC and Google Business codes, the registered agent, the Lead Reference, and the Reachability, Contact Relevance and Contact Confidence scores; open the exact file before paying (ten made-up records, every column): https://app.goodleads.club/api/v1/commerce/sample-file?format=xlsx (or format=csv).

The close is two questions: put the quoted choice in front of your human
— callable now (a verified phone), emailable now (a verified email, verified
for deliverability and recent activity), or newest, mail-first — plus a
standing order, then hand over the payment link for the one chosen — per
record, no minimums, so a small first order is the normal first step.

Next: to buy exactly what was quoted, hand the same list / shape, lane and
cap to `checkout_list`.

**Offer codes.** If your human was given an offer code — a price we agreed
with them, like `GL-7K3Q9M` — pass it as `offer_code` here AND on
`checkout_list`, so the quote and the payment link carry the same price.
A code is a ceiling: every grade bills at the lower of list and the
offer, never above list, and the reply adds an `offer` block (what is
left on it, when it expires). A code that cannot be used answers with
the reason in plain words — relay it, then quote again without the
code for list price.

Args:
    list_id: A saved list id. Mutually exclusive with `states` / `filters`.
    states: State codes for an inline shape; omit for every live state.
    filters: Filter clauses in the one contract (see `list_filterable_fields`).
    include_held: Include inactive-or-holding entities (default False).
    include_existing: Include existing businesses with a new filing (a
        registration, a conversion, a reinstatement, a move, a rename) —
        the default quotes Just started only, exactly as Browse and the
        file do. Naming `filing_kind` / `business_origin` in `filters`
        widens on its own.
    lane: `all` / `best` / `contact` — asks for a `quote`.
    cap: `{"type": "count|budget", "value": <int>}` — the dial the quote
        is solved against.
    offer_code: The offer code your human was given, if any.

Returns:
    The summary contract described above. Keyless callers may not filter
    on `contact_name`, `email_primary`, `phone_primary` (422).
ParametersJSON Schema
NameRequiredDescriptionDefault
capNo
laneNo
statesNo
filtersNo
list_idNo
offer_codeNo
include_heldNo
include_existingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this read-only, idempotent, and non-destructive; the description adds substantial behavioral context beyond that: quote_valid_until and next-morning refresh, forecast provenance and ceiling_cents, offer code ceiling behavior, zero_reasons semantics, and the 422 for keyless callers filtering on certain fields. It does not contradict any annotation.

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

Conciseness4/5

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

The description is long, but it is organized with clear sections (billing discipline, lanes, cap, offer codes, Args, Returns) and front-loaded with the core purpose. Some prose is verbose — e.g., the repeated guidance and sales-style close — but the tool is genuinely complex enough to warrant most of the detail.

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 billing-aware quote tool with 8 parameters and a rich output contract, the description covers how quotes are computed, what is billable, how prices are calculated, lane/cap mechanics, offer code handling, a sample file, and the handoff to checkout_list. An agent has enough to call this correctly without needing the output schema.

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 description coverage is 0%, so the description fully carries parameter meaning. The Args block explains every parameter: list_id's mutual exclusivity, states' live-state default, filters referencing list_filterable_fields, include_held and include_existing semantics, lane values, cap shape, and offer_code behavior. This goes well beyond the bare schema.

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 first line — 'What this list costs before anyone pays' — names a specific verb and resource (quoting a list) and the description consistently explains it computes price by grade. It also separates itself from its sibling checkout_list by noting the next step is to 'hand the same list / shape, lane and cap to checkout_list' when actually buying.

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 explicitly tells the agent when to use quote_list vs checkout_list, how to pass a saved list vs an inline shape, when to include or omit states, how lanes and caps select the quote, and when to pass offer_code. It also warns to 'quote the server's numbers, never arithmetic of your own' and to relay zero_reasons instead of a silent $0.

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.

  1. 2 tool updates
    • Changedcheckout_list1 field changed
      • addedInput schema / properties / include_existing
        Added value: +{
        +  "default": false,
        +  "title": "Include Existing",
        +  "type": "boolean"
        +}
    • Changedquote_list1 field changed
      • addedInput schema / properties / include_existing
        Added value: +{
        +  "default": false,
        +  "title": "Include Existing",
        +  "type": "boolean"
        +}
  2. 1 tool update
    • Changedbrowse_leads1 field changed
      • addedInput schema / properties / include_existing
        Added value: +{
        +  "default": false,
        +  "title": "Include Existing",
        +  "type": "boolean"
        +}
  3. 3 tool updates
    • Changedcheckout_list1 field changed
      • addedInput schema / properties / offer_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Offer Code"
        +}
    • Changedcreate_checkout1 field changed
      • addedInput schema / properties / offer_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Offer Code"
        +}
    • Changedquote_list1 field changed
      • addedInput schema / properties / offer_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Offer Code"
        +}
  4. 1 tool update
    • Changedlist_products1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "list_productsDictOutput",
        +  "type": "object"
        +}
  5. 13 tool updates
    • First observedbrowse_leads
    • First observedcheckout_list
    • First observedcreate_checkout
    • First observeddata_quality_scorecard
    • First observeddescribe_surface
    • First observedexplain_concept
    • First observedfind_lead_by_glid
    • First observedinterpret_list
    • First observedlist_filterable_fields
    • First observedlist_live_states
    • First observedlist_products
    • First observedlist_starters
    • First observedquote_list

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Real-time B2B company firmographics, headcount tier, ARR estimate, tech stack adoption, and verified C-Level executive contact emails for AI SDRs and sales automation.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to verify and search business entities across US state and international company registries, providing real-time confirmation of legal existence, status, and filings.
    9
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Search companies, officers, and filing history across 140+ jurisdictions worldwide using the OpenCorporates API.
    5
    26 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides real-time business event intelligence and AI-scored sales leads to help users track funding rounds, acquisitions, and executive hires. It enables AI agents to generate strategic market briefs and manage company watchlists for predictive business insights.
    7
    61 npm
    3
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources