Skip to main content
Glama

GoodLeads

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

TDQS

A4.4/5.0

Scored across 13 tools

Disambiguation3/5

Several tools intentionally share code paths—checkout_list and create_checkout both mint checkouts for lists, and browse_leads(summary=True) overlaps quote_list—so an agent could pick the wrong one without reading the detailed cross-references. The long descriptions do a good job of steering, but the overlaps are real and more than one or two.

Naming Consistency4/5

Most tools follow a clear verb_noun snake_case pattern (browse_leads, quote_list, list_products), and the intent is readable. Deviations like data_quality_scorecard (noun-only) and checkout_list (a noun masquerading as a verb) break the pattern slightly, but the overall convention is consistent.

Tool Count5/5

Thirteen tools is within the ideal range for a lead-data platform, and each major capability—browse, quote, checkout, schema, explanation, quality, discovery—has a dedicated tool. A little redundancy exists between create_checkout and checkout_list, but the count is well-scoped.

Completeness4/5

The core lifecycle is covered: discover, shape, browse/quote, and buy, plus lookup and data-quality tooling. Minor gaps remain—no saved-list management tool and no order-history/re-download tool—but agents can work around them via inline shapes and the described receipt flow.

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 for new businesses" / "decision-makers" = filter
`contact_relevance_tier in ["Decision Maker", "Likely Decision Maker"]` —
our scored is-this-the-right-person opinion, available in EVERY state.
(`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.
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"]},
    ])

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; `missing_stage` eq; `created_at` gt, gte, lt, lte, between; `geo_polygon` within; `geo_radius` within; `has_phone_or_email` eq. `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
        77 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 71 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); 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.
    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_non_operatingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is higher, but the description adds substantial behavioral context: only sellable records are billed or delivered, keyless callers see masked contacts, zero_reasons appear for impossible filters, and records appear the morning after state publication. It also discloses 422-versus-500 behavior, canonical vocabulary handling, and access-level differences, all 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?

Although long, the description is dense and efficiently structured with clear sections: core contract, canonical vocabulary, filter grammar, worked example, args, and returns. Every block earns its place by addressing a real decision an agent must make; there is no filler or restatement of schema fields.

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 12 parameters, 0% schema description coverage, and no actual schema descriptions, the description is exceptionally complete. It covers selection modes, summary contract fields, billing rules, filter operators by type, pseudo-fields, sorting semantics, response structure, access-level masking, freshness metadata, and error behavior. Nothing an agent needs to call this tool correctly appears 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 description coverage is 0%, so the description carries the full burden for 12 parameters. The Args section explains each parameter's semantics, including mutual exclusivity of list_id with state/states/filters, page_size caps by tier, sort field ordering rules, lane meanings, cap shape, and summary implication. It even documents edge cases like unknown field/direction returning a 422 and the total-order tiebreak on lead_ref ASC.

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: 'Browse leads — rows for a shape or a saved list, or (summary=True) its counts, facets and price.' It clearly distinguishes the row contract from the summary contract and signals that this is the lead-browsing entry point, not checkout or field discovery. It is far more than a restatement of the title and stands apart from siblings like find_lead_by_glid and create_checkout.

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 provides two alternative ways to select records ('a saved list' vs 'an inline shape'), when to use summary, and when to pass lane/cap. It names related tools where relevant: 'Use list_filterable_fields to discover the 77 fields' and 'To buy, hand the same list / shape, lane and cap to create_checkout.' It also gives exclusions and defaults, such as omitting both state and states for every live state.

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).

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`), `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
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), so the description carries the full burden, and it does so richly. It discloses the critical behavior that no charge happens until a human completes checkout, that payment is via Stripe hosted page, that the file arrives about a minute after payment, and that after-payment enrichment may cause additional billing under a ceiling. It also explains the billing base ('sellable' not 'matching') and the 30-day replacement guarantee. This goes far beyond the annotation fields.

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 very long (over 800 words) and packs in a lot of detail. It is well-structured with clear paragraphs for pricing, delivery, and return fields, and it front-loads the primary purpose. However, its length may overwhelm an agent when parsing quickly, and some details (e.g., the exact sample-link URL) could be moved to an out-of-band reference. It is not concise, though it is efficient in that every sentence adds information.

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

Completeness5/5

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

The description covers everything an agent needs to invoke the tool correctly: how to define the list, what parameters to use, what the return structure is, edge cases like 409 conflicts and 30-day guarantees, and even a sample file link for preview. The output schema exists and the description enumerates the fields returned. No important behavioral or operational context 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 description maps most parameters to their meaning: list_id, filters+states, lane, cap, delivery, crm_connection_id, connector_crm_name. It even explains the cap format and the pricing rule. However, it does not explicitly explain the customer_email parameter, which appears in the schema but is absent from the description. Given schema coverage is 0%, the description compensates well for the other eight parameters but leaves one 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 description opens with a specific verb and resource: 'Turn a quoted list into a payment link a person completes.' It clearly states the tool creates a one-time checkout link, and contrasts with a standing order on the same list. It also situates itself relative to quote_list by saying the list is quoted through the same summary path. This fully distinguishes it 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?

Explicit when-to-use guidance is given: 'this tool sells the one-time purchase' and how to set up standing orders later via the receipt. It explains two ways to pass the list (list_id or inline filters+states), how to pick a lane, and what happens if the price changes (409 with fresh quote). It also tells the agent how to handle the URL: 'Hand the URL to your human; do not represent the purchase as complete until they confirm payment.' This is actionable and complete.

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 product or listAInspect

Mint a hosted Stripe Checkout link — for a shelf product, or for a list you shaped.

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, prefer the dedicated buying journey: `interpret_list` (the
buyer's words → a shape) → `quote_list` (graded counts + the price) →
`checkout_list` (this link, for a list). This tool remains for shelf
products (`product_id` from `list_products`, priced per list by the same
graded rule) and keeps accepting a list for compatibility — the list path
is the same code as `checkout_list`.

Two things you can buy:
  * a shelf product — `product_id` from `list_products`. `period`: `monthly` = a standing order billed each period; absent = a one-time purchase.
    The reply says which: `billing` (`monthly` | `one_time`), `price_cents`
    and a `note` that reads "This link starts a monthly standing order at
    $X per period" when the product carries a period; or
  * 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.

`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, for a list: `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). For a shelf
product: `checkout_url`, `order_id`, `session_id`, `billing`, `price_cents`,
`note`. 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
product_idNo
customer_emailNo
crm_connection_idNo
connector_crm_nameNo

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?

The annotations only say readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds substantial behavioral detail: creating the link charges nobody, payment happens only on human completion, stale quotes return 409, billing base is `sellable` not `matching`, selected records are frozen, delivery fires automatically on payment, and invalid contact data is replaced within 30 days. This goes far beyond the annotations and gives an agent trustworthy expectations.

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 the critical no-charge caveat, then organized into clear sections for the two buyable paths, delivery, and return fields. It is verbose and repeats return-value details that the output schema likely already provides, but the structure keeps the extra length navigable. A tighter version could trim the return-field enumeration without loss.

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 10 optional parameters, no required fields, and sparse annotations, the description covers pricing rules, quote validity, 409 conflict behavior, delivery modes, billing basis, post-payment delivery timing, and replacement guarantees. The only notable gaps are customer_email and the `period` schema mismatch, but the overall context is sufficient for an agent to invoke the tool correctly and anticipate outcomes.

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 description coverage, the description carries the burden of explaining parameters, and it largely succeeds: it maps product_id to shelf products, list_id and inline filters/states to list purchases, lane and cap to quote shaping, and delivery/crm_connection_id/connector_crm_name to delivery behavior. However, it omits customer_email entirely and references a `period` option that does not appear in the input schema, which creates minor ambiguity. Despite that, it compensates impressively for the sparse 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 sentence names an exact operation and resource: "Mint a hosted Stripe Checkout link — for a shelf product, or for a list you shaped." It also differentiates from the sibling checkout_list by explaining that the list path uses the same code and remains for compatibility. The two purchase modes are explicitly laid out, so an agent knows exactly what the tool offers.

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 clearly says when to prefer the dedicated journey: "For new work, prefer the dedicated buying journey: interpret_list → quote_list → checkout_list." It then states when to use this tool instead: shelf products, or list compatibility. This is explicit routing guidance with named alternatives, not merely implied context.

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), 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. The all-states form evaluates the full book
        (~800k records, ~40s) — when you only need one state, pass it:
        per-state responses return in seconds.
    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).
ParametersJSON Schema
NameRequiredDescriptionDefault
stateNo
sample_limitNo

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?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is fully consistent with these. It adds substantial behavioral detail: coverage deliberately does not affect the headline score, paid enrichment stages are reported but unscored, unmeasured stages are listed with reasons, and check results include browse_filters for surgical repair runs. This goes well 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.

Conciseness4/5

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

The description is long but earns its length given the tool's subtle coverage semantics and non-obvious behavior around paid vs free stages. It front-loads the core purpose, then organizes details into Args and Returns sections. It could be tightened with bullets, but every sentence carries meaningful operational information.

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

Completeness5/5

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

For a tool with only two parameters and an output schema, the description is complete. It explains the return shapes for single-state vs all-states calls, the _meta provenance block, per-check sample offenders, browse_filters usage, and the reasoning behind coverage not moving the score. An agent has everything needed to invoke the tool correctly and interpret its results.

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 carries the full burden. It fully documents both parameters: state is a two-letter code with the omit-to-get-all behavior, explicit performance implications, and default behavior (worst score first); sample_limit is given with its range (0–50) and default (8). This is excellent compensation for the bare schema.

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 tool's job: grading data quality for a state with a 0–100 score and per-dimension breakdown. It names the specific resource (records a buyer would receive) and the verb ('grades'), and provides the intended question it answers. However, it does not explicitly differentiate itself from siblings like browse_leads or list_filterable_fields, though the unique purpose is largely self-evident.

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 practical usage guidance: use it to answer 'how clean is the data we're selling in {state}?' and to track quality work. It also clearly instructs when to pass a state versus omit it, including performance tradeoffs (~800k records/40s vs seconds). It does not explicitly mention when not to use this tool or name alternative tools, but the context is clear enough for an agent to select it correctly.

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 — call this to explain or vet us; to price a list, start with interpret_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.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: an explicit provenance guarantee — 'The surface never silently answers from local data' — and clarifies which database it reads (production or explicitly opted-in local). This explains the openWorldHint=false annotation usefully.

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?

Front-loaded with the purpose, which is good. However, the middle section is rambling and grammatically awkward — 'Leads with what the buyer gets and how to act on it, then the mechanics:' — where 'Leads' is ambiguous (verb vs. noun) and the sentence structure is tangled. The description runs ~100 words and would benefit from tightening.

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 0-parameter meta tool with a rich annotation set and an output schema present, the description covers the essentials: what it does, when to use it, what it reads, and the built-in guarantees. It mentions 'the tools available' but doesn't enumerate them, relying on sibling context; this is a minor gap, not a blocker.

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 0 parameters, so per the rubric the baseline is 4. There is nothing the description could add about parameters, and the schema (no properties) makes this unambiguous. No penalty applies.

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?

Front-loads a specific purpose — 'What GoodLeads is — call this to explain or vet us' — with a clear verb (explain/vet) and resource. Explicitly flags what it is NOT for ('to price a list, start with interpret_list'), distinguishing it from the same-named sibling. The meta-nature (describing the surface itself) is clearly separated from navigate/price/checkout 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?

Gives an explicit trigger ('call this to explain or vet us') and names an alternative for a specific scenario (interpret_list for pricing). It also tells the agent what the call will surface (database provenance, contract, available tools). It doesn't enumerate when-not-to-use cases against other siblings like explain_concept, but the core trigger and one key exclusion are clear.

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). 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?

Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses return shape, the `_meta` provenance block, freshness/source behaviors, and raises ValueError for malformed or unmatched IDs. This gives complete behavioral expectations.

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 structured with a lead sentence, use-case context, Args, and Returns. Every sentence adds operational value, and there is no redundant repetition of the schema or annotations.

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 one-parameter lookup with rich annotations and an output schema, the description is complete: it covers when to use it, how to format the parameter, what the response contains, and what errors can occur. Nothing essential 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?

The input schema only provides the property name, but the description fully compensates by explaining the format (`GL-CO-00042`), case-insensitivity, and that it maps to the `lead_ref` field. This is exactly what an agent needs to construct a valid call.

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 operation ('One record in full, by its Lead ID') and immediately gives an example ID format. It clearly distinguishes this from listing/browsing tools by framing it as a targeted lookup when you already hold a Lead ID.

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 says 'Use this when you already hold a Lead ID' and explains what data you get. It does not name sibling tools or exclusions, but the intended context is clear enough to route an agent appropriately.

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 77 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 71 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; `missing_stage` eq; `created_at` gt, gte, lt, lte, between; `geo_polygon` within; `geo_radius` within; `has_phone_or_email` eq. `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.7/5.0
Behavior5/5

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

Annotations already declare `readOnlyHint=true`, `idempotentHint=true`, and `destructiveHint=false`, and the description adds substantial behavioral detail beyond that: it documents the enforced operator sets, masked fields and keyless-caller redaction, canonical-vocabulary behavior, null semantics for negative operators, and the guarantee that invalid (field, op) pairs return a 422 naming the row rather than a 500. This gives an agent a strong and accurate model of what the endpoint will and will not do.

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 front-loaded with the core purpose and a direct usage instruction before going into detailed reference material. Every major block maps to a section value, and the prose is dense rather than padded. It could be modestly trimmed without losing value, but for a contract-heavy reference tool the length is largely 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?

With no output schema, the description carries the full burden of explaining return shapes, and it does so thoroughly across all three sections. It also covers error semantics, masked-field constraints, canonical-vocabulary flags, and how the contract applies across browse, summary, export, checkout, and pipeline scoping. For a single-parameter introspection tool, nothing critical 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?

The schema only defines `section` as a string with a default, giving no description of valid values. The description fully compensates by defining each section value (`fields`, `grammar`, `recipes`) and elaborating what each returns, including nested structures and field-level meaning. With 0% schema description coverage, this is exactly the parameter-level guidance 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?

The description clearly identifies the tool as the source of the filter contract from the schema endpoint, covering fields, grammar, or recipes. It explicitly ties usage to building `browse_leads` filters, which distinguishes it from sibling tools such as `browse_leads` and `list_live_states`. The verb 'list' is augmented with concrete resource and payload detail, so an agent can tell exactly what this tool returns.

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 an explicit when-to-use instruction: 'Call this before building `browse_leads` filters you haven't used before.' It also explains that the same payload backs browse, summary, export, checkout, and pipeline scoping. It does not explicitly state when not to use it or name alternative lookup tools, but the usage context is clear enough for an agent to decide appropriately.

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 productsA
Read-onlyIdempotent
Inspect

The pre-shaped shelf — ready-made business type × state lists.

Each product is a ready-made list of newly formed businesses for one
business type in one state (or across every live state). Returns `product_id`,
`name`, `description`, `state` (null = all live states), `lead_count`,
`price_cents`, `period` and `stripe_price_id`. `period`: `monthly` = a standing order billed each period; absent = a one-time purchase.
`stripe_price_id` is Stripe's own id for that price (null until the
catalog syncs) — informational, never something to pass back. Pricing
everywhere follows the one graded rule —
per record, by what the record carries (name + address; plus one verified
phone or email; plus both, verified) — and only sellable records (the
filing names a person) are ever billed. For a shape of your own, or to
see live graded counts and the exact price before buying, prefer the
buying journey: `list_starters` (the shelf with live counts) or
`interpret_list` → `quote_list` → `checkout_list`. Evaluate before
buying: `browse_leads` with the same vertical/state shows real masked
records for free. To buy a shelf product as-is, pass its `product_id`
to `create_checkout`.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is known. The description adds substantial behavioral context: the meaning of `period` (monthly standing order vs one-time), that `stripe_price_id` is informational and never to be passed back, the graded pricing rule, and that only sellable records are billed. No contradictions 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 longer than average but well-structured, moving from purpose to fields to pricing to alternatives. Every sentence carries information; there's no fluff. However, it could be more concise by separating the pricing rule into a supplementary sentence, yet as is it's efficient for the complexity it covers.

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 there is no output schema, the description fully covers the return fields (`product_id`, `name`, `description`, `state`, `lead_count`, `price_cents`, `period`, `stripe_price_id`) and explains their semantics. It also explains the pricing model, when to use alternatives, and how to buy. For a zero-parameter read-only list tool, nothing essential 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?

There are zero parameters, so per the rubric the baseline is 4. The description doesn't need to document any input semantics because none exist; it focuses on output and usage, which is appropriate.

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 clear, specific statement: 'The pre-shaped shelf — ready-made business type × state lists.' It names the resource (shelf products), the verb (lists), and the structure (business type × state). It also differentiates from siblings by naming alternatives like list_starters and interpret_list, so an agent can tell them apart.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool versus alternatives: 'For a shape of your own, or to see live graded counts and the exact price before buying, prefer the buying journey: list_starters ... or interpret_list → quote_list → checkout_list.' It also gives the purchase path: 'To buy a shelf product as-is, pass its product_id to create_checkout.' This leaves no ambiguity about selection.

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`.

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).
    lane: `all` / `best` / `contact` — asks for a `quote`.
    cap: `{"type": "count|budget", "value": <int>}` — the dial the quote
        is solved against.

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
include_heldNo

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 declare read-only and idempotent; the description adds extensive behavioral context: quote_valid_until freshness, zero_reasons with nearest_alternative, forecast basis, ceiling_cents, and the rule that only sellable records are billed. It also warns 'Quote the server's numbers, never arithmetic of your own.' This goes far beyond the annotations and does not contradict them.

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 front-loaded with a one-line summary and then organized into billing, return fields, and args. There is some extra sales-oriented prose (e.g., 'The close is two questions...') that goes beyond operational necessity, making it slightly less concise than it could be, but the structure is well-sectioned and each part earns its place.

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?

It covers inputs, outputs, pricing, freshness, error conditions (422 for keyless callers), and points to list_filterable_fields for filter syntax. It even provides a sample file URL to inspect the exact record shape. Given the tool's complexity and 0% schema coverage, nothing an agent needs 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.

Parameters5/5

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

Schema coverage is 0%, so the description fully compensates. The Args section explains each parameter: list_id mutual exclusivity, states default, filters contract, include_held default, lane allowed values, and cap structure. It also maps parameters to output behavior (e.g., 'quote present when lane or cap is given').

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 immediately states 'What this list costs before anyone pays: how many records name a person, and the price by grade.' This is a clear, specific verb (quote) plus resource (list) with a distinct scope. It also differentiates from checkout_list by saying 'to buy exactly what was quoted...', so an agent can tell quote from purchase.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use scenarios: pass a saved list or an inline shape, omit states for all live states, use lanes/ caps. It even names the alternative for the next step: 'hand the same list / shape, lane and cap to checkout_list.' It also includes a warning about billing discipline and what not to present, making usage boundaries clear.

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. 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
    25
    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
    233
    2
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources