Skip to main content
Glama

Server Details

Access Versium's B2B2C identity graph directly through your AI agent. Generate targeted lead lists, enrich records with contact and firmographic data, validate emails, and size audiences — all through natural language. No manual exports or API coding required. Requires an active Versium REACH subscription with API access.

Ownership verified
Status
Healthy
Uptime
98.9% over 74 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.7/5.0

Scored across 25 tools

Disambiguation4/5

Most tools have clearly distinct targets: list/project CRUD, job lifecycle, listgen estimation vs. options, and ad-export options/status/start are well separated, and the append tools even carry explicit trigger phrases ('B2B2C', 'C2B'). The main soft spot is among the enrichment appends, where contact_append (address/email/phone), demographic_append (household/lifestyle), and b2b2c_append/c2b_append operate on overlapping consumer/business records and require reading descriptions carefully to choose correctly.

Naming Consistency3/5

There is a readable grouping (all *_append tools, all b2b_/b2c_listgen_* tools, verb_noun for REACH resources), but conventions are genuinely mixed across the set. Verb-first names (list_lists, show_list, create_job, preview_list) coexist with noun-first names (contact_append, email_validation, job_status, ads_export_status), and the same ad-export domain uses both ads_export_options and export_list_to_ads.

Tool Count3/5

At 25 tools this sits at the heavy end of the acceptable range, though the server legitimately spans several sub-domains (listgen, enrichment appends, list/job/project management, ad exports, docs). A few pairs feel like they could be consolidated or folded (e.g., b2b/b2c estimate+options quartet, ads_export_options vs. ads_export_status), which pushes it to borderline rather than well-scoped.

Completeness3/5

The core workflow is fully covered: import or generate a list, setup_list, create_job, job_status, preview_list, then export to ads with status polling. However, lifecycle gaps are notable — there is no delete/archive for lists or projects, no job cancellation or job listing, and no way to download/export a finished list's data outside of ad platforms, leaving agents at dead ends for cleanup and result retrieval.

Available Tools

25 tools
ads_export_optionsAds Export Options Mcp ToolA
Read-onlyIdempotent
Inspect
Discover where a list can go in an Ad Platform Export: the ad platforms REACH supports, whether the user has connected each one, and the ad accounts of connected platforms.

Pass `platform` and `account_id` to also get that account's existing Ad Platform Audiences, which `export_list_to_ads` can add to with `audience_id`. Pass `list_id` to see whether that list can be exported to each platform, and why not: only a list with Online Audience output can be, each platform has a minimum record count, and an expired list (`list_expired`, past its `expires_at`) can't be exported at all, so the user needs a new list, for example by running the job again.

An unconnected platform is listed with `connected: false`. Connecting happens only in the REACH web app, on the Integrations page; ask the user to do it there.
NameRequiredDescriptionDefault
list_idNoReport whether this list can be exported to each platform
platformNoOnly this platform
account_idNoWith platform: also list this ad account's existing Ad Platform Audiences

Output Schema

NameRequiredDescription
list_idNo
platformsNo

TDQS

A4.8/5.0
Behavior5/5

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

With readOnlyHint and destructiveHint=false already covering safety, the description adds substantial behavioral context: unconnected platforms are returned as connected:false, connecting only happens in the REACH web app, expired lists cannot be exported, each platform has a minimum record count, and only lists with Online Audience output are eligible. These are business rules not present in annotations or schema.

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 purpose and then organized into parameter-driven use cases and eligibility constraints. Every sentence is informative, though the middle paragraph is dense and could be slightly tighter for readability.

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 an output schema exists, return-value details are not required in the description. The description nevertheless covers eligibility rules, connection handling, and the relationship to export_list_to_ads, making it complete for an agent to call and interpret this read-only discovery tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are already well documented. The description still adds cross-tool semantics: platform+account_id yields Ad Platform Audiences that export_list_to_ads can consume via audience_id, and list_id produces per-platform eligibility with failure reasons. This meaningfully exceeds the schema alone.

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 uses a specific verb ('Discover where a list can go in an Ad Platform Export') and enumerates exactly what is returned: supported platforms, connection status, ad accounts, existing audiences, and per-list export eligibility. This clearly distinguishes it from the sibling export_list_to_ads, which performs the actual export, and from ads_export_status.

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?

It explicitly states the conditional calls: pass platform and account_id to retrieve that account's existing Ad Platform Audiences, and pass list_id to check exportability with reasons. It also explains what to do when a platform is unconnected (direct the user to the REACH web app Integrations page), leaving no ambiguity about when and how to use this tool versus export_list_to_ads.

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

ads_export_statusAds Export Status Mcp ToolA
Read-onlyIdempotent
Inspect
Check an Ad Platform Export started with `export_list_to_ads`, by its `history_id`.

`status` moves from queued through uploading to success or failed. On success, `audience_id` is the Ad Platform Audience in the user's ad account; on failure, `error_message` says what to do next.
NameRequiredDescriptionDefault
platformYes
history_idYesFrom `export_list_to_ads`

Output Schema

NameRequiredDescription
statusNo
list_idNo
platformNo
account_idNo
history_idNo
audience_idNoThe Ad Platform Audience the export created or added to, once it succeeds
error_messageNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive behavior. The description adds useful lifecycle context: `status` moves from queued to uploading to success or failed, and it explains the success and failure result fields. It does not mention polling cadence or auth requirements, but those are not critical given the annotations and output schema.

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 two tightly written sentences. It front-loads the action and provides the status lifecycle and result interpretation without unnecessary text.

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 simple two-parameter schema, rich annotations, and an output schema, the description covers the essential operational context: what is being checked, the status progression, and what success/failure returns mean. Nothing an agent needs in order 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.

Parameters3/5

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

`history_id` is clarified as coming from `export_list_to_ads`, which is useful beyond the schema's own parameter description. However, `platform` is only covered by the enum in the schema, and the description does not explain its semantics or how platform affects the check.

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 verb and resource: checking an Ad Platform Export by `history_id`. It explicitly ties the tool to `export_list_to_ads`, which distinguishes it from sibling tools such as `ads_export_options` and `job_status`.

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 clearly says to use this tool for an export started with `export_list_to_ads`, giving the prerequisite context. It does not explicitly discuss when to prefer alternatives such as `job_status`, so it falls short of full alternative routing guidance.

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

b2b2c_appendB2 B2 C Append Mcp ToolA
Read-onlyIdempotent
Inspect
Enrich a business contact in a marketing list with their consumer-side profile, so B2B audiences can be reached through consumer channels: with a LinkedIn URL or a name + city/state, append business email plus consumer mobile phone, consumer email, and consumer address data in a single match.
Use this tool when users ask for 'B2B2C', 'b2b2c', or 'Business to Business to Consumer' data.

**Tips for Best Results:**
- Provide a LinkedIn URL (format: linkedin.com/in/username) for the best match quality
- Alternatively provide first name, last name, city, and state together
- Choose one or more outputs; use `required_outputs` to return only records that matched those outputs
NameRequiredDescriptionDefault
zipNo5 digit ZIP code
cityNoCity name
lastNoA person's last name
emailNoA known email address for the contact
firstNoA person's first name
stateNoTwo-character state code (US)
li_urlNoA LinkedIn URL (accepts https://www.linkedin.com/in/username, www.linkedin.com/in/username, or linkedin.com/in/username)
addressNoStreet address
countryNoTwo-character country code (currently only US data is supported)
outputsYesContact data to return: business_email, consumer_mobile, consumer_email, consumer_address
required_outputsNoSubset of outputs a record must have to be returned
cfg_max_emails_b2cNoMaximum consumer email addresses to return per record
cfg_max_phones_b2cNoMaximum consumer phone numbers to return per record

Output Schema

NameRequiredDescription
resultsNoRecords returned by the Operations API. Record fields pass through unchanged.
query_idNo
warningsNo
input_queryNo
num_matchesNoNumber of matching queries.
num_resultsNoNumber of records returned.
match_countsNoSparse match counts. An absent key means zero.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds behavioral context beyond annotations: it explains the enrichment process, the role of required_outputs in filtering results, and the configurable maximum outputs (cfg_max_emails_b2c, cfg_max_phones_b2c). It does not contradict annotations and adds useful operational details, though it doesn't cover every edge case (e.g., error handling or rate limits).

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 well-structured with a clear purpose statement, usage guidance, and a bulleted 'Tips for Best Results' section. It is slightly longer than necessary but every sentence adds value, and the tips are practical. The front-loading of the core purpose and usage condition is effective.

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 that an output schema exists (per context signals), the description does not need to explain return values. It covers input options, output selection, configuration parameters, and the matching strategy. The description is complete enough for an agent to know how to invoke the tool correctly, including the US-only limitation (noted in the schema) and the required outputs behavior.

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

Parameters5/5

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

Schema coverage is 100% and every parameter has a description. The description adds significant semantic value by explaining the two primary input modes (LinkedIn URL vs. name+city/state) and the purpose of required_outputs, which is not fully apparent from the schema alone. It also clarifies the relationship between outputs and required_outputs, making parameter usage unambiguous.

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: enriching a business contact with consumer-side profile data, specifying the resource (business contact) and the action (append consumer data). It also names the target use case (B2B2C) and the data types involved, making it distinct from the sibling tools like c2b_append or contact_append.

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 the tool ('when users ask for B2B2C...') and provides best-practice tips for input formats (LinkedIn URL vs. name+city/state). However, it does not mention when not to use it or name alternative tools, which would earn a 5. The usage context is clear but lacks explicit exclusion criteria.

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

b2b_listgen_estimateB2B Listgen Estimate Mcp ToolA
Read-onlyIdempotent
Inspect
Estimate business contact audience sizes with firmographic and role-based targeting using Versium's B2B Persona Audience Builder (B2B Listgen) API.

**Tips for Best Results:**
- Start with a single output type and add filters incrementally
- Combine geography with company size or industry filters for precise targeting
- Use title_seniority for leadership focus, or department for functional targeting
- Provide SIC codes when you need strict industry alignment
- To check values for fields with large, high-cardinality option sets, call the B2B Persona Listgen Options tool
- Toggle `cfg_b2cloc` to switch between business-location and home-location targeting
NameRequiredDescriptionDefault
d_sicNoLegacy 4-digit SIC codes
d_zipNoU.S. ZIP codes (5-digit codes)
outputNoCampaign type specification. Must include exactly one: "email" or "oa". Email should almost always be used; OA can ONLY be used for audience targeting in ad platforms and will return hashed data
d_naicsNoRaw 2- to 6-digit NAICS codes. Use the options tool to retrieve valid values
d_stateNoU.S. states (2-letter codes)
rd_roleNoJob roles. Use the options tool to retrieve valid values
d_countyNoU.S. counties (full county names)
cfg_b2clocNoWhether location filters apply to business location (0) or employee home location (1)
max_recordsNoCap the number of records returned by the eventual list build
d_city_stateNoU.S. City and state combinations, e.g. "Austin, TX"
d_salesvolumeNoCompany revenue range, in the format "min-max" (e.g. "100000-1000000" for $100K to $1M)
rd_departmentNoJob departments. Use the options tool to retrieve valid values
d_numemployeesNoCompany size range, in the format "min-max" (e.g. "100-50000")
rd_title_seniorityNoTitle seniority levels

Output Schema

NameRequiredDescription
resultsNo
query_idNo
warningsNo
input_queryNo
num_matchesNo
num_resultsNo
match_countsNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds valuable context by framing the operation as an estimate of audience sizes rather than a list build. It also discloses the cfg_b2cloc behavior for switching between business-location and home-location targeting, which is useful beyond the schema.

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 a clear purpose sentence and then organized into concise, scannable bullet tips. Each tip earns its place by providing actionable guidance for a complex 14-parameter tool, with no redundant 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?

Given the tool's complexity, the description is complete: it states the core purpose, offers filter selection strategies, points to the options tool for valid values, and clarifies location targeting behavior. The output schema and annotations cover return values and safety, so the description does not need to repeat those.

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 description coverage is 100%, so the baseline is 3, but the description adds meaningful parameter guidance: it explains when to use title_seniority vs department, when to provide SIC codes, and how to interpret cfg_b2cloc. These tips go beyond the schema definitions by linking parameters to targeting strategies.

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: 'Estimate business contact audience sizes with firmographic and role-based targeting using Versium's B2B Persona Audience Builder (B2B Listgen) API.' This clearly distinguishes the tool from siblings like b2c_listgen_estimate (B2C) and b2b_listgen_options (options lookup).

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 'Tips for Best Results' section provides concrete guidance on when to use specific filters, such as using title_seniority for leadership focus, department for functional targeting, and SIC codes for strict industry alignment. It also explicitly directs users to call the B2B Persona Listgen Options tool for high-cardinality field values, though it does not explicitly contrast with the B2C sibling tool.

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

b2b_listgen_optionsB2B Listgen Options Mcp ToolA
Read-onlyIdempotent
Inspect

Return allowed option values for B2B Persona Listgen filter fields such as NAICS, department and role.

Use this tool when you need the valid values for large, high-cardinality fields too big to embed directly in tool schemas.

NameRequiredDescriptionDefault
fieldNoThe field for which options are requested
limitNoMaximum number of returned values. Optional; default 50
queryNoCase-insensitive substring to filter option values. Optional
offsetNoPagination offset. Optional; default 0

Output Schema

NameRequiredDescription
fieldNo
queryNo
offsetNo
valuesNo
returnedNo
next_offsetNo
total_matchesNo

TDQS

A4/5.0
Behavior3/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 context about high-cardinality fields but doesn't disclose pagination behavior or response format beyond what the schema implies. With annotations covering the safety aspects, a 3 is appropriate.

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 two sentences, front-loaded with the purpose, and every word earns its place. The first sentence states what it does, the second explains when to use it. No fluff.

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 tool has an output schema, so return values are documented. The description covers purpose and usage context. With 100% schema coverage and good annotations, the description is complete enough for an agent to select and invoke the tool correctly. The only minor gap is not listing example field values, but that's not necessary.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are documented in the schema. The description adds the context that fields like NAICS are high-cardinality, which helps understand why the tool exists, but doesn't add parameter-specific meaning beyond the schema. Baseline 3 is correct.

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 returns allowed option values for B2B Persona Listgen filter fields, naming specific examples (NAICS, department, role). It distinguishes itself from the sibling b2c_listgen_options by specifying B2B, and the verb 'Return' is specific to the resource.

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 'Use this tool when you need the valid values for large, high-cardinality fields too big to embed directly in tool schemas,' which provides clear context for when to use it. It doesn't explicitly mention alternatives or when not to use it, but the context is sufficient given the sibling tools.

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

b2c_listgen_estimateB2C Listgen Estimate Mcp ToolA
Read-onlyIdempotent
Inspect
Estimate consumer audience sizes using Versium's Consumer Audience Builder (B2C Listgen) API. Supports the configuration and demographic filter set

For fields with large, high-cardinality option sets (e.g. esthhldincome), use the Consumer Audience Options tool to retrieve available values
Any property restricted to `enum: ["Y"]` is enabled by sending `"Y"`. For example, pet owners who golf in Washington use `{"state":["WA"],"d_pets":"Y","d_golf":"Y"}`.
Call `b2c_listgen_options` with `field: "attribute_flags"` when you need the human-readable meanings of those flag names.

**Tips for Best Results:**
- Start with a single output type and add filters incrementally
- Combine geography with age, income, or lifestyle filters for precise targeting
- Leverage lifestyle and interest filters to reach specific consumer segments
NameRequiredDescriptionDefault
d_ageNoAge range in years (single value or min-max, e.g., "35-45")
d_lorNoLength of residence in years (single value or range)
d_zipNoArray of 5-digit ZIP codes to filter by
d_golfNo
d_newsNo
d_petsNo
d_sohoNo
d_stateNoArray of 2-letter state codes to filter by
d_countyNoArray of county,state combinations (e.g., "King, WA")
d_genderNoGender filter (M=Male, F=Female)
d_travelNo
d_fishingNo
d_huntingNo
d_ownrentNoHome ownership status codes (H=Owner, R=Renter, 9=Probable Owner)
d_exerciseNo
d_languageNoLanguage codes. See values in options tool
d_networthNoEstimated net worth range using codes. See values in options tool
d_shootingNo
d_auto_yearNoAutomobile year range (single year or min-max)
d_educationNoEducation level codes: A=High School, B=College, C=Graduate, D=Technical/Vocational
d_gardeningNo
d_hhld_sizeNoHousehold size range (1-9, e.g., "2-4"); 9 means 9 or more
d_home_yearNoYear home was built (single year or range)
d_magazinesNo
d_refi_dateNoRefinance date or date range using YYYYMMDD format
max_recordsNoCap the number of records returned by the eventual list build
d_city_stateNoArray of city,state combinations (e.g., "Seattle, WA")
d_home_valueNoHome value range. See values in options tool
d_occupationNoOccupation codes. See values in options tool
max_coverageNoRequest append processing for selected channels (must overlap required/optional fields)
cfg_zipradiusNoRadius expansion (pseudo-miles) applied around supplied ZIP or city/state centers
d_creditlinesNoNumber of credit lines range (e.g. "0-5")
d_electronicsNo
d_loantovalueNoLoan-to-value percentage as single value or range (0-100)
d_motorcyclesNo
d_refi_amountNoRefinance amount in thousands (single value or range)
d_senior_hhldNo
d_apparel_mensNo
d_donation_envNo
d_dwellingtypeNoDwelling type codes (M=Multi Family, S=Single Family, U=Unknown)
d_num_childrenNoNumber of children range (0-8, e.g., "2-3")
d_singleparentNo
d_workingwomanNo
d_esthhldincomeNoEstimated household income range using codes. See values in options tool
d_maritalstatusNoMarital status codes (M=Married, S=Single, A=Married (Inferred), B=Single (Inferred))
d_mortgage_rateNoMortgage interest rate percentage (e.g., "6.75%", "10%")
optional_fieldsNoOptional contact fields to include when available
required_fieldsNoRequired output contact fields. Must include at least one. Recommended to include address for estimate calls for geo info. IMPORTANT: Unlike the B2B Persona API, this field along with optional_fields are used to define output instead of the "output" parameter
cfg_require_nameNoSet to true to require full names in the output
d_apparel_womensNo
d_auto_makemodelNoAuto make and model combo(s) (e.g. "Ford:Escape")
d_mailorderbuyerNo
d_mortgage2_dateNoSecond mortgage date in YYYYMMDD format
d_mortgage2_rateNoSecond mortgage interest rate percentage
d_refi_loan_typeNoRefinance loan type codes. See values in options tool
d_refi_rate_typeNoRefinance rate type codes. A=Adjustable, B=Balloon, F=Fixed, U=Unknown
cfg_require_emailNoSet to true to require email addresses in the output
cfg_require_phoneNoSet to true to require phone numbers in the output
contacts_per_addrNoMaximum contacts per street address (0=unlimited, 1=one contact per address)
d_cardholder_bankNo
d_lifestyle_musicNo
d_mortgage_amountNoMortgage amount in thousands (use values like "50" or "400")
d_onlinepurchaserNo
d_youngadult_hhldNo
rcfg_phone_formatNoSet to 1 to prefix returned phone numbers with the country code
d_donation_animalsNo
d_home_improvementNo
d_investing_activeNo
d_lifestyle_sportsNo
d_mortgage2_amountNoSecond mortgage amount in thousands
cfg_require_addressNoSet to true to require mailing addresses in the output
cfg_zipradius_focusNoLimits radius expansion to ZIP, city/state, or none
d_donation_childrenNo
d_donation_intl_aidNo
d_home_market_valueNoHome market value range. See values in options tool
d_lifestyle_cookingNo
d_lifestyle_outdoorNo
d_lifestyle_readingNo
d_cardholder_upscaleNo
d_donation_communityNo
d_home_purchase_dateNoHome purchase date in YYYYMMDD format
d_lifestyle_antiquesNo
d_mortgage_rate_typeNoMortgage rate type codes. A=Adjustable, B=Balloon, F=Fixed, U=Unknown
include_filter_attrsNoInclude selected filter attributes as columns in the final audience
d_home_purchase_priceNoHome purchase price in thousands
d_mortgage2_loan_typeNoSecond mortgage loan type codes. See values in options tool
d_mortgage2_rate_typeNoSecond mortgage rate type codes. A=Adjustable, B=Balloon, F=Fixed, U=Unknown
d_lifestyle_decoratingNo
d_presence_of_childrenNo
d_donation_arts_cultureNo
d_donation_env_wildlifeNo
include_demo_categoriesNoDemographic category summaries to include in the response. Recommended to include at least one with estimate calls for audience insights in the preview response
d_lifestyle_arts_generalNo
d_mortgage_purchase_dateNoMortgage purchase date in YYYYMMDD format
d_mortgage_purchase_loan_type_codeNoMortgage purchase loan type codes. See values in options tool

Output Schema

NameRequiredDescription
resultsNo
query_idNo
warningsNo
input_queryNo
num_matchesNo
num_resultsNo
match_countsNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, which matches an 'estimate' operation, and the description adds non-obvious model semantics: the enum ["Y"] flag convention with a concrete Washington/golf/pets example. It does not disclose cost/credit consumption, whether estimates create a persistent job, or rate limits — meaningful context for a 95-parameter sizing call that the annotations do not cover.

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 purpose is front-loaded in sentence one, followed by scoped operational notes and a short tips block, with no filler. Minor inefficiency: the options tool is referred to both as 'Consumer Audience Options tool' and `b2c_listgen_options`, and the 'Tips' bullets are somewhat generic.

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

Completeness3/5

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

An output schema exists so return-value explanation is correctly omitted, and the description handles enum-flag semantics well. But for a 95-parameter, zero-required tool it never states what a minimal valid call looks like or which of required_fields/optional_fields/max_coverage must be coordinated — the coordination rule lives only in the schema's required_fields text, not in the description.

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 95 parameters including 54 enums and only 57% schema description coverage, the description carries real weight by explaining the shared `enum: ["Y"]` activation convention and routing ambiguous code sets (income, net worth, home value, occupation, attribute_flags) to the options tool. That single convention covers a large share of the otherwise undescribed boolean-style flags, though no guidance is given on safe defaults or minimal viable filter sets.

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 first sentence gives a specific verb (estimate) and resource (consumer audience sizes) and names the backing API (Versium Consumer Audience Builder / B2C Listgen), so the agent knows this is a sizing/estimate call over demographic filters. It implicitly separates from b2b_listgen_estimate via 'consumer,' but never names that sibling or explains the consumer-vs-business split explicitly.

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?

It gives real procedural guidance — look up high-cardinality values (e.g., esthhldincome) via the options tool, call b2c_listgen_options with field: "attribute_flags" for flag meanings, and a 'Tips' list recommending incremental filter building. However, these are all intra-tool/parameter hints; there is no guidance on when to use this estimate versus sibling tools like preview_list, setup_list, or b2b_listgen_estimate, and no stated exclusions.

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

b2c_listgen_optionsB2C Listgen Options Mcp ToolA
Read-onlyIdempotent
Inspect

Return allowed option values for Consumer Audience Builder (B2C Listgen) fields

Use this tool when you need the valid values for large, high-cardinality fields too big to embed directly in tool schemas

NameRequiredDescriptionDefault
fieldNoThe field for which options are requested
limitNoMaximum number of returned values. Optional; default 50
queryNoCase-insensitive substring to filter option values. Optional
offsetNoPagination offset. Optional; default 0

Output Schema

NameRequiredDescription
fieldNo
queryNo
offsetNo
valuesNo
returnedNo
next_offsetNo
total_matchesNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful context about high-cardinality fields and why the options cannot be embedded in schemas. No contradictions exist between the description and 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 two sentences long, front-loaded with the core purpose, and contains no filler or redundant material. Every sentence contributes meaning.

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 tool is a simple read-only options lookup with full schema coverage, rich annotation coverage, and an output schema. The description explains both the core function and appropriate use, making it complete for an agent to understand and invoke the tool correctly.

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

Parameters3/5

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

All 4 parameters already have complete descriptions in the input schema, so the description does not need to repeat parameter details. However, it also adds little beyond the schema; for example, it does not clarify which fields are valid or that `field` is semantically required despite the schema listing no required parameters.

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 uses a specific verb and resource: 'Return allowed option values for Consumer Audience Builder (B2C Listgen) fields.' It clearly identifies the consumer/B2C scope, distinguishing it from the sibling b2b_listgen_options tool.

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 the tool: 'Use this tool when you need the valid values for large, high-cardinality fields too big to embed directly in tool schemas.' It provides a clear context but does not explicitly mention alternatives or when not to use it, such as pointing to the B2B sibling tool.

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

c2b_appendC2B Append Mcp ToolA
Read-onlyIdempotent
Inspect
Enrich consumer marketing records with business demographics for B2B segmentation. Match the record with a LinkedIn URL, or with first name, last name, and one of: email, phone, or city and state. Appends job title, seniority, department, business email, LinkedIn profile, and complete business information.
Use this tool when users ask for 'C2B', 'c2b', or 'Consumer to Business Person' data

**Tips for Best Results:**
- Provide full name and consumer email for best match quality
- LinkedIn URLs must be in format: linkedin.com/in/username
- Use `rcfg_require_email` to return only records with business email
- Use `rcfg_require_value` to filter by job title, department, or other attributes
NameRequiredDescriptionDefault
cityNoA person's city
lastNoA person's last name
emailNoA valid consumer email address
firstNoA person's first name
phoneNoA person's phone number
stateNoA person's two-letter state code
domainNoA business domain
li_urlNoA LinkedIn URL (accepts https://www.linkedin.com/in/username, www.linkedin.com/in/username, or linkedin.com/in/username)
rcfg_max_timeNoMaximum allowed API run time (in seconds)
rcfg_require_emailNoReturns only records with email (set to 1 to enable)
rcfg_require_valueNoField/value requirements in "Field=Value" format. Example: ["Title=Manager"]

Output Schema

NameRequiredDescription
resultsNoRecords returned by the Operations API. Record fields pass through unchanged.
query_idNo
warningsNo
input_queryNo
num_matchesNoNumber of matching queries.
num_resultsNoNumber of records returned.
match_countsNoSparse match counts. An absent key means zero.

TDQS

A4.4/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, covering the safety profile. The description adds context about matching logic (LinkedIn URL or name+contact) and output fields, which clarifies what the tool returns. No contradiction with annotations exists; the words 'enrich' and 'appends' could be ambiguous, but annotations resolve that it is a read-only enrichment.

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 moderately detailed but well-structured: the main purpose is front-loaded, followed by the usage trigger and bulleted tips. Each section contributes relevant guidance; there is little fluff, though the LinkedIn URL format tip somewhat repeats the schema. Overall it is efficiently organized.

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?

Given the tool's complexity (11 parameters, a complex anyOf requirement, and an output schema), the description covers the critical matching conditions and best practices well. It does not discuss error scenarios or rate limits, but the annotations and output schema handle safety and return structure. For this complexity, the description is sufficiently complete.

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 100% schema description coverage, baseline is 3. The description adds significant value beyond the schema by explaining the acceptable matching combinations (anyOf: LinkedIn URL, or first/last plus email/phone/city+state) in plain language. It also clarifies the use of rcfg_require_email and rcfg_require_value with practical examples, which helps an agent select parameters correctly.

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 function: enrich consumer marketing records with business demographics for B2B segmentation. It lists specific appended fields (job title, seniority, department, business email, LinkedIn profile) and distinguishes itself from siblings through the explicit C2B (Consumer to Business) focus. The name and title align with this purpose.

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 provides an explicit trigger: 'Use this tool when users ask for C2B, c2b, or Consumer to Business Person data.' It also includes practical best-practice tips (e.g., provide full name and email for best match quality). However, it does not name sibling alternatives or explicitly state when not to use this tool, so it lacks exclusions.

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

contact_appendContact Append Mcp ToolA
Read-onlyIdempotent
Inspect
Enrich marketing contact records with mailing address, email, and phone for outreach and audience building

**Tips for Best Results:**
- Provide as many input fields as possible to improve match quality
- Use `indiv` match type when targeting a specific person
- Request one output type per call when optimizing for match quality (especially for phone outputs)
- Set `cfg_maxrecs` when more than one record is acceptable
NameRequiredDescriptionDefault
zipNo5 digit ZIP code
cityNoCity name
lastNoPerson's last name
emailNoEmail address to enrich
firstNoPerson's first name
phoneNo10 digit phone number without formatting
stateNoTwo-character state code (US)
addressNoStreet address (line 1)
outputsYesTypes of contact data to return. Choose at least one output type
address_2NoApartment or unit number
match_typeNoMatch at household (hhld) or individual (indiv) levelhhld
cfg_maxrecsNoMaximum number of records to return
cfg_requiredNoComma or semi-colon separated response fields that must be populated for a record to be returned
rcfg_max_emailsNoMaximum number of emails per record (use with email_multiple)
rcfg_exclude_domainsNoDomains to exclude from alternate email results

Output Schema

NameRequiredDescription
resultsNoRecords returned by the Operations API. Record fields pass through unchanged.
query_idNo
warningsNo
input_queryNo
num_matchesNoNumber of matching queries.
num_resultsNoNumber of records returned.
match_countsNoSparse match counts. An absent key means zero.

TDQS

A3.6/5.0
Behavior3/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 and there is no contradiction. The description adds operational context around match quality and output cardinality, but it does not describe the actual lookup/return behavior or any additional side-effect considerations beyond what annotations already 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?

The purpose is stated in one front-loaded sentence, followed by four scannable bullet-point tips. There is no fluff, repetition, or redundant restating of the schema. Every sentence contributes actionable information, and the format is easy for an agent to parse.

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

Completeness3/5

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

The schema is 100% covered and an output schema exists, so many invocation details are already structured. The description adds useful operational tips, but given 20 siblings including several other append tools, it should explicitly state when contact_append is the right choice versus b2b2c, c2b, demographic, or firmographic append. It also omits the US-only scope that is visible in the schema.

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?

All 15 parameters have rich schema descriptions, so the baseline is 3. The description adds meaningful usage semantics by explaining when to use indiv, how output type selection affects match quality, and when to raise cfg_maxrecs. This goes beyond the schema's structural descriptions without needing to compensate for any gaps.

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 starts with a specific verb ('Enrich') and a clear resource ('marketing contact records'), and names the output types (mailing address, email, phone). It is unmistakable what the tool does, but it does not explicitly contrast contact_append with the many sibling append tools, so it misses the top score.

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 'Tips for Best Results' provide practical guidance on parameter usage: use indiv for a specific person, request one output type per call for phone match quality, and set cfg_maxrecs for multiple acceptable records. However, there is no guidance on when to choose this tool over sibling append tools like b2b2c_append or c2b_append, nor any when-not-to-use conditions.

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

create_jobCreate Job Mcp ToolAInspect
Create a listgen job, or a batch enrichment job over one of the user's lists.

For enrichment, run `setup_list` on the list first. Use `project_id` when possible. For charge-on-finish jobs, tell the user about usage and only submit `usage_consent_confirmed = true` after they consent. The `consent_required_job_types` meta field lists them; for contact_append it depends on `sub_jobs`.
NameRequiredDescriptionDefault
nameYesOutput list name
configYesListgen: the exact input shape documented by `b2b_listgen_estimate` or `b2c_listgen_estimate`, without nesting or renaming fields; b2b_listgen requires `output`, b2c_listgen requires `required_fields`, max_records defaults to 10000 (max 50000). Enrichment: contact_append and demographic_append require `match_type` and `sub_jobs`; email_validation allows `include_alternate`; others take {}.
job_typeYesEnrichment types match the real-time tool names
project_idNoExisting project for the output list
project_nameNoProject to find or create when there is no project_id
input_list_idNoList to enrich (enrichment types)
idempotency_keyNoReuse on retry; the same key and arguments return the original job
usage_consent_confirmedNoTrue once the user consents to usage charges; required for charge-on-finish jobs

Output Schema

NameRequiredDescription
job_idNo
job_guidNo
job_stateNo
list_nameNo
project_idNo
job_operationNo
output_list_idNo
output_list_expires_atNoISO-8601 expiration timestamp for the output list
output_list_is_expiredNoWhether the output list has expired

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, non-idempotent operation. The description adds important behavioral context beyond annotations: setup prerequisites and charge-on-finish consent requirements, including the `consent_required_job_types` meta field.

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 purpose is front-loaded in the first sentence, followed by actionable prerequisites and consent guidance. The description is appropriately sized with little waste, though it could trim minor phrasing.

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?

Given the rich input schema, output schema, and annotations, the description covers the key workflow details an agent needs: listgen vs enrichment, setup_list prerequisite, project selection preference, and consent handling. Remaining details such as job polling are covered by output schema and sibling tools.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds workflow meaning beyond the schema: use `project_id` when possible, run `setup_list` before enrichment, and only set consent after user approval. It also references the `consent_required_job_types` meta field.

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 states a specific verb and resource: "Create a listgen job, or a batch enrichment job over one of the user's lists." It is clear enough to distinguish creation from inspection/status siblings, but it does not explicitly name alternatives such as the estimate or job_status 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 gives concrete prerequisites: run `setup_list` first for enrichment, prefer `project_id` when possible, and obtain consent before setting `usage_consent_confirmed = true`. It does not explicitly state when not to use this tool or name alternative sibling tools.

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

create_projectCreate Project Mcp ToolAInspect

Create a new REACH project for the authenticated user.

Use this tool when a user asks to create a project container before working with lists.

NameRequiredDescriptionDefault
project_nameYesProject name

Output Schema

NameRequiredDescription
created_atNoISO-8601 creation timestamp
project_idNo
project_nameNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already indicate non-read-only and non-destructive behavior, lowering the burden. The description adds the auth context ('for the authenticated user') but does not disclose other behaviors like name uniqueness or error handling. This is adequate but not rich.

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 two sentences, front-loaded with the primary action, and every word serves a purpose. No fluff or repetition.

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 simple one-parameter tool with an output schema present, the description covers purpose, usage trigger, and authentication context. There is no need to describe return values because the output schema exists.

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

Parameters3/5

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

The schema already provides 100% coverage of the single parameter ('Project name'). The description does not add significant additional meaning beyond calling it a 'project container,' so it stays at the baseline of 3.

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 specific action ('Create a new REACH project') and resource ('project'), and the addition of 'for the authenticated user' clarifies scope. It distinguishes itself from siblings like list_projects and show_project by being the create operation.

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 usage trigger: 'Use this tool when a user asks to create a project container before working with lists.' This provides clear context, though it does not explicitly mention alternatives or 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.

demographic_appendDemographic Append Mcp ToolA
Read-onlyIdempotent
Inspect
Append consumer marketing records with household and lifestyle insights for audience segmentation, across demographic and lifestyle categories

**Tips for Best Results:**
- Request only the insight categories you need to keep responses focused
- Combine name, location, and digital identifiers (email or phone) for higher match confidence
- Use `cfg_required` or `rcfg_require_value` to enforce must-have attributes in the response
NameRequiredDescriptionDefault
zipNo5 digit ZIP code
cityNoCity name
lastNoPerson's last name
emailNoEmail address to enrich
firstNoPerson's first name
phoneNo10 digit phone number without formatting
stateNoTwo-character state code (US)
addressNoStreet address (line 1)
outputsYesInsight categories to return. Choose at least one category
address_2NoApartment or unit number
match_typeNoMatch at household (hhld) or individual (indiv) levelhhld
cfg_maxrecsNoMaximum number of records to return
cfg_requiredNoComma or semi-colon separated response fields that must be populated for a record to be returned
rcfg_require_valueNoField/value requirements in "Field=Value" format. Example: ["Language=Spanish"]

Output Schema

NameRequiredDescription
resultsNoRecords returned by the Operations API. Record fields pass through unchanged.
query_idNo
warningsNo
input_queryNo
num_matchesNoNumber of matching queries.
num_resultsNoNumber of records returned.
match_countsNoSparse match counts. An absent key means zero.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely non-structured behavior: that match confidence rises with more identifiers, and that cfg_required/rcfg_require_value can suppress records, which affects what the agent gets back. It does not say what happens on a no-match record.

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?

Purpose is front-loaded in the first sentence, with configuration tips scoped under a clear heading. Content is well sized for a 14-parameter tool; only minor overhead from leading whitespace and the redundant title restatement.

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?

With an output schema present, the description needn't document return values, and annotations cover safety. It covers purpose, matching strategy, and result filtering adequately; the notable remaining gap is behavior on unmatched records and any cost/credit implications of an enrichment call.

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 description coverage is 100%, so the baseline is 3. The tips go beyond field definitions by advising which parameters to combine for higher match confidence and by explaining the practical role of cfg_required and rcfg_require_value as response filters, adding strategy the schema does not convey.

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?

States a specific verb and resource ('Append consumer marketing records') plus the data domain (household and lifestyle insights) and the intended use case (audience segmentation). This implicitly differentiates it from b2b or firmographic append siblings, but never names them explicitly.

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 tips give input-strategy guidance (request only needed categories, combine identifiers, enforce required fields), which tells the agent how to call it well. However, there is no explicit statement of when to prefer this tool over contact_append, b2c_listgen_*, or the B2B append siblings, so tool selection is left to inference from the name.

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

email_validationEmail Validation Mcp ToolA
Read-onlyIdempotent
Inspect
Validate email addresses and optionally get alternate valid emails using Versium's Email Validation API. Returns validation status, sub-status, and whether the email is valid for mailing.

**Tips for Best Results:**
- Provide a valid email address or MD5/SHA256 hashed email (HEM)
- Use `include_alternate` to get an alternate valid email if the input is invalid
- Provide additional contact info (name, address) to improve alternate email matching
- Use `rcfg_exclude_domains` to filter out unwanted email domains from alternates
NameRequiredDescriptionDefault
zipNo5 digit US ZIP code
cityNoCity name
lastNoPerson's last name (helps find alternate email)
emailYesEmail address to validate. Can also be an MD5 or SHA256 hashed email (HEM).
firstNoPerson's first name (helps find alternate email)
phoneNo10 digit phone number
stateNoUS state two-letter abbreviation
addressNoStreet address (helps find alternate email)
address_2NoApartment or unit number
rcfg_snake_caseNoReturn response field names in snake_case instead of "Title Case With Spaces".
include_alternateNoWhether to include an alternate valid email in the response if the input email is invalid.
rcfg_exclude_domainsNoDomains to exclude from alternate email results (e.g., aol.com, yahoo.com). Only applies when include_alternate is true.

Output Schema

NameRequiredDescription
resultsNoRecords returned by the Operations API. Record fields pass through unchanged.
query_idNo
warningsNo
input_queryNo
num_matchesNoNumber of matching queries.
num_resultsNoNumber of records returned.
match_countsNoSparse match counts. An absent key means zero.

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It reveals that the tool returns validation status and whether the email is valid for mailing, and explains the optional alternate-email behavior. However, it doesn't disclose error handling, rate limits, or any side effects, but for a read-only validation tool this is acceptable. It adds moderate value beyond the schema.

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 concise with a clear main line and a bulleted list of tips. It is front-loaded with the primary purpose guide. Each tip is relevant and adds value. Slightly long but well-structured.

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?

With 12 parameters and an output schema, the description covers enough context: it explains the core behavior, optional alternate email feature, and tips for better results. It doesn't delve into output format, but the output schema likely covers that. For a tool with this complexity, the description is adequate and complete.

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 covers the parameters well (100% have descriptions), so the baseline is 3. The description adds value by clarifying the purpose of additional contact info ('improve alternate email matching') and explains how rcfg_exclude_domains works. This goes beyond schema descriptions, justifying a slightly higher score.

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: 'Validate email addresses and optionally get alternate valid emails using Versium's Email Validation API.' It specifies the verb (validate), the resource (email addresses), and the API used aids in distinguishing it from sibling tools like data append 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?

The description includes 'Tips for Best Results' which provides practical usage guidance, such as using hashed emails, including additional contact info for better alternates, and filtering domains. While it doesn't explicitly state when not to use the tool or compare to alternatives, the context is clear enough for tool selection among the sibling tools.

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

export_list_to_adsExport List To Ads Mcp ToolA
Destructive
Inspect
Start an Ad Platform Export: push a list's Online Audience to the user's connected ad account as an Ad Platform Audience. Not billed.

Find the platform, `account_id` and, to add to an existing Ad Platform Audience, its `audience_id` with `ads_export_options`. Pass `audience_name` to create a new Ad Platform Audience instead. The export runs in the background; check it with `ads_export_status` and the returned `history_id`.

Only one export of a list to a platform runs at a time. When one is already running, no new export starts: `already_in_progress` is true and the response describes the running export, whose account and audience may differ from this request.
NameRequiredDescriptionDefault
list_idYes
platformYes
account_idYesAd account ID from `ads_export_options`
audience_idNoExisting Ad Platform Audience to add the list to, from `ads_export_options`. Pass this or audience_name, not both.
audience_nameNoName for a new Ad Platform Audience. Pass this or audience_id, not both.

Output Schema

NameRequiredDescription
statusNo
list_idNo
messageNo
platformNo
account_idNoThe export's target ad account
history_idNoPass to `ads_export_status`
audience_idNoThe existing Ad Platform Audience the export adds to
audience_nameNoThe name of the Ad Platform Audience the export creates
already_in_progressNoTrue when no new export started because one was already running; the other fields then describe that export

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial context beyond annotations: 'Not billed', background/async execution, and the single-concurrent-export rule with the already_in_progress response including the possibility that the running export's account/audience differ from the request. These are non-obvious behavioral traits that annotations (destructive/not-idempotent) do not convey.

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-loads the core action, then prerequisites, then the async/concurrency caveat. Well organized and largely waste-free, though the three-paragraph split is slightly longer than strictly necessary.

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 destructive, non-idempotent mutation tool with an output schema already covering returns, the description still supplies everything an agent needs: prerequisites, async follow-up via history_id, and the concurrency edge case. Complete against the available structured data.

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 60%; the description compensates by explaining where account_id/audience_id come from (ads_export_options) and the mutually exclusive audience_id vs audience_name semantics. list_id and platform rely on the enum and general context, but the description's mapping of audience_name to 'create new' adds real meaning beyond the 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?

States a specific verb (start/push) and resource (Ad Platform Export / Online Audience to ad account), and clearly distinguishes itself from siblings ads_export_options, ads_export_status, and the append tools. An agent can identify the exact action without opening the schema.

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

Usage Guidelines5/5

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

Explicitly says how to find platform/account_id/audience_id via ads_export_options, when to use audience_name vs audience_id (create new vs add existing, not both), and to check progress with ads_export_status. Also documents the concurrent-export exclusion. Nothing left to inference.

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

firmographic_appendFirmographic Append Mcp ToolA
Read-onlyIdempotent
Inspect
Enrich business records with firmographics for account targeting and segmentation: company details, location, industry classifications, employee counts, and revenue data.

**Tips for Best Results:**
- Provide domain for fastest, most accurate results
- For business name searches, include complete address information or phone number
- Use `rcfg_require_value` to filter for specific industries or business characteristics
NameRequiredDescriptionDefault
zipNoA 5 digit zip code
cityNoA city name
emailNoA valid business email address
phoneNoA valid 10 digit business phone number
stateNoA US state two letter abbreviation
domainNoA business domain
addressNoAn address (street address line 1)
businessNoA business name
rcfg_max_timeNoMaximum allowed API run time (in seconds)
rcfg_require_valueNoField/value requirements in "Field=Value" format. Example: ["Industry=Technology"].

Output Schema

NameRequiredDescription
resultsNoRecords returned by the Operations API. Record fields pass through unchanged.
query_idNo
warningsNo
input_queryNo
num_matchesNoNumber of matching queries.
num_resultsNoNumber of records returned.
match_countsNoSparse match counts. An absent key means zero.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description is not expected to restate those. The description adds context about typical use cases (account targeting/segmentation) and tips that imply behavior (e.g., domain yields fastest results). However, it does not disclose potential limitations, such as behavior with incomplete inputs or whether results may vary. The bar is lower due to annotations, but the description adds only modest behavioral context beyond 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 compact and front-loaded with the core purpose, followed by a clearly separated 'Tips for Best Results' section. Each sentence is purposeful and provides actionable guidance. The structure is easy to scan, and there is no redundant filler, though the tips could be seen as slightly verbose for some users.

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 tool has 10 optional parameters and an output schema exists. The description explains the overall function, provides strategic tips on parameter selection, and mentions filtering via rcfg_require_value. It does not elaborate on return formats (handled by output schema) or edge cases, but for a read-only enrichment tool with high schema coverage and annotations, the context is sufficiently complete for an agent to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so all parameters are described in the schema. The description adds value by linking certain parameters to usage tips: domain for speed, address/phone for business name searches, and rcfg_require_value for filtering. This goes beyond the schema's basic field descriptions and helps the agent understand parameter interactions, though it doesn't cover every combination.

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 states the tool's purpose: to enrich business records with firmographic data such as company details, location, industry, employee counts, and revenue. The verb 'enrich' and resource 'business records' are specific, and the listed fields distinguish it from other append tools. However, it does not explicitly differentiate itself from sibling tools like b2b2c_append, though the term 'firmographic' inherently signals the data type.

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 provides actionable tips on how to get best results (e.g., provide domain for fastest results, include address/phone for business name searches, use rcfg_require_value for filtering). These are usage instructions but not guidance on when to choose this tool over alternatives like b2b2c_append or contact_append. There is no explicit 'when to use' or 'when not to use' statement, leaving selection to inference.

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

import_cloud_listImport Cloud List Mcp ToolAInspect
Import a Google Drive or OneDrive file into REACH as a new list, using the Google Sheets or OneDrive account the user connected in REACH.

REACH doesn't browse drives: find the file with a Google Drive or OneDrive/Microsoft 365 MCP server, then pass its `url`, or `provider` and `file_id` (plus `drive_id` for OneDrive files outside the user's own drive). Next, call `setup_list` with the returned `list_id`, then `create_job`.

Supported: Google Sheets, .csv and .xlsx files on Google Drive; .csv and .xlsx files on OneDrive. Rows beyond the user's upload limit are dropped; `record_count` reflects what was kept.
NameRequiredDescriptionDefault
urlNoLink to a Google Sheets or Google Drive file, or a OneDrive/SharePoint file. Use instead of provider and file_id.
file_idNoThe Drive file ID, or the OneDrive driveItem id
drive_idNoOneDrive only: the item's driveId (parentReference.driveId)
providerNoRequired with file_id; not used with url
project_idNoProject to create the list in
sheet_nameNoSheet (tab) to import from a spreadsheet or .xlsx file; required when it has more than one. Ignored for CSV.
project_nameNoProject to find or create when there is no project_id

Output Schema

NameRequiredDescription
sourceNo
list_idNo
list_urlNo
list_nameNo
has_headerNoREACH's guess at whether the first row is a header
header_rowNo
project_idNo
sample_rowsNoThe first data rows, positional
record_countNoRows imported, excluding the header row when has_header is true

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare openWorld=true, non-idempotent, non-destructive, so the safety profile is covered. The description adds real behavior the annotations cannot: it requires a pre-connected Google/OneDrive account, specifies which file types are supported per provider, and discloses that rows beyond the upload limit are silently dropped with record_count reflecting only what was kept. That truncation warning is the highest-value disclosure here; only error/re-import behavior is left unstated.

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?

Front-loaded purpose, then prerequisite, then the exact call chain, then supported types, then the truncation caveat. Every sentence carries operational information and none repeats the schema or annotations.

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 7-parameter, open-world, non-idempotent import with an output schema, the description covers purpose, prerequisites, next calls, supported formats, and the data-loss caveat. What remains (e.g., empty/error file behavior, sheet_name requirement for multi-tab files) is already handled by the 100%-covered schema, so the gaps are minor.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already explains url, file_id, provider, and sheet_name. The description adds a condition the schema does not spell out: drive_id is needed specifically for OneDrive files outside the user's own drive, and it frames url versus provider+file_id as mutually exclusive paths. That is genuine added meaning over the field descriptions.

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 ('Import a Google Drive or OneDrive file into REACH as a new list') and immediately scopes who performs it ('using the account the user connected'). The workflow sentences make it unmistakable against siblings like setup_list and create_job, which are named as the next steps rather than alternatives.

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 how to get here ('REACH doesn't browse drives: find the file with a Google Drive or OneDrive/Microsoft 365 MCP server'), what to pass, and what to call afterwards ('setup_list with the returned list_id, then create_job'). This is a full usage contract, not an implied one.

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

ip_to_domain_appendIp To Domain Append Mcp ToolA
Read-onlyIdempotent
Inspect
Discover business domains and firmographic information from IP addresses using Versium's IP-to-Domain API. Accepts an IPv4 address and returns up to 3 associated business domains with details like company name, address, industry, employee count, and revenue.

**Tips for Best Results:**
- Provide a valid IPv4 address for best results
- Useful for identifying businesses from web traffic or server information
- Returns comprehensive firmographic data similar to domain-based lookups
NameRequiredDescriptionDefault
ipYesIPv4 address to query for associated business domains.
rcfg_max_timeNoMaximum allowed API run time in seconds (optional).

Output Schema

NameRequiredDescription
resultsNoRecords returned by the Operations API. Record fields pass through unchanged.
query_idNo
warningsNo
input_queryNo
num_matchesNoNumber of matching queries.
num_resultsNoNumber of records returned.
match_countsNoSparse match counts. An absent key means zero.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds the output cardinality limit ('up to 3 associated business domains') and the range of returned firmographic attributes, which is useful beyond the annotations. It does not discuss edge cases like invalid IPs, but the schema pattern covers input format.

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 a clear one-sentence summary followed by a short tips section. The last bullet and IP-validity tip are somewhat redundant with earlier content, but the overall length is reasonable and scannable.

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 simple 2-parameter lookup with a single required field, an output schema, and strong annotations, the description covers purpose, expected output, and practical use. It could be more complete by naming sibling alternatives or clearly scoping when not to use it, but nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (ip and rcfg_max_time) already have meaningful descriptions. The tool description adds no parameter-level detail beyond the schema, matching the baseline for high schema coverage.

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 uses a specific verb ('Discover') and resource ('business domains and firmographic information from IP addresses'), clearly distinguishing this from sibling append/list tools by the IP-to-domain lookup mechanism. It states the core action and result (up to 3 domains with firmographic details).

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 'Tips for Best Results' section gives clear use context: use for identifying businesses from web traffic or server information. It does not explicitly name alternatives or when-not-to-use scenarios, so it falls just 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.

job_statusJob Status Mcp ToolA
Read-onlyIdempotent
Inspect
Check the status of an existing job after `create_job`.

Use this tool to poll progress, ETA, and output list readiness while a job is running or after it finishes.
NameRequiredDescriptionDefault
job_idYesPositive integer job ID (must be ≥ 1)

Output Schema

NameRequiredDescription
job_idNo
job_guidNo
list_urlNo
job_stateNo
created_atNoISO-8601 creation timestamp
finished_atNoISO-8601 completion timestamp
job_operationNo
output_list_idNo
est_sec_remainingNo
output_file_readyNo
progress_percentageNo
output_list_expires_atNoISO-8601 expiration timestamp for the output list
output_list_is_expiredNoWhether the output list has expired

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, establishing it as a safe, non-mutating read. The description adds value by specifying what status includes (progress, ETA, output list readiness) and clarifies it works for both running and finished jobs. This complements rather than repeats the 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?

Two sentences, both purposeful. The first identifies the action and the prerequisite (after create_job), the second specifies use cases. No wasted words, and the core purpose is front-loaded.

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 tool is simple (one parameter) and has an output schema, so return value details are unnecessary. The description states what status information is available and when to poll. It doesn't mention error handling (e.g., invalid job ID), but that's minor given the schema and annotations.

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

Parameters3/5

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

The schema covers the single parameter (job_id) with a description ('Positive integer job ID (must be ≥ 1)') at 100% coverage. The description adds no extra parameter meaning beyond the tool's purpose, so the baseline 3 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?

The description clearly states the tool checks the status of an existing job, specifically after create_job. It lists the concrete outputs (progress, ETA, output list readiness) and distinguishes it from creation and list-management siblings by focusing on polling existing jobs.

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 use it for polling progress, ETA, and output list readiness while a job is running or after it finishes. It doesn't mention when not to use it or name alternatives, but the context 'after create_job' implicitly excludes creation and other operations. Given the sibling list has no other status tool, this is adequate.

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

list_listsList Lists Mcp ToolA
Read-onlyIdempotent
Inspect

List REACH lists for the authenticated user.

Optionally filter by project or name prefix.

NameRequiredDescriptionDefault
limitNoMaximum number of returned lists
searchNoOptional prefix search on list name
project_idNoOptional project ID to restrict results to a specific project

Output Schema

NameRequiredDescription
listsYesList summaries

TDQS

A3.5/5.0
Behavior3/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 clear. The description adds that it returns lists for the authenticated user and supports optional filtering, but does not disclose pagination behavior, ordering, or what happens when no filters are provided. With annotations covering safety, a 3 is appropriate.

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 two short sentences, front-loaded with the main action and resource. The second sentence adds filter options concisely. No wasted words, though it could have been slightly more informative about behavior.

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 read-only list tool with a full output schema and 100% parameter schema coverage, the description is adequate. It covers the core purpose and optional filters. It doesn't mention pagination or default behavior, but the output schema and annotations fill in much of the context. Slightly more detail on result ordering or default scope would push it higher.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (limit, search, project_id) are already documented in the schema. The description mentions 'filter by project or name prefix' which maps to project_id and search, adding slight context but not much beyond the schema. Baseline 3 is correct.

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 states a specific verb ('List') and resource ('REACH lists') and notes it is for the authenticated user. It distinguishes itself from siblings like show_list and preview_list by indicating it lists multiple lists, though it doesn't explicitly name alternatives. The title is redundant but the description adds clarity.

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 implies usage context: listing lists for the authenticated user, with optional filters. It does not explicitly state when to use this tool versus alternatives like show_list or preview_list, nor does it mention exclusions. The optional filters give some context but no direct comparison to siblings.

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

list_projectsList Projects Mcp ToolA
Read-onlyIdempotent
Inspect
List REACH projects for the authenticated user.

Use this tool to find the right project before calling `show_project`.
NameRequiredDescriptionDefault
limitNoMaximum number of returned projects
searchNoOptional prefix search on project name

Output Schema

NameRequiredDescription
projectsYesProject summaries. created_at is an ISO-8601 timestamp.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds limited behavioral context beyond the annotations, such as the 'REACH' qualifier and the fact that it's for the authenticated user, but it doesn't elaborate on pagination, rate limits, or other behaviors. It's not contradictory and adequately supports the 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 remarkably concise, consisting of just two sentences. The first states the core action, and the second offers actionable guidance. No unnecessary words, perfectly front-loaded 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 simple read-only tool with two well-documented optional parameters, an output schema, and rich annotations, the description is complete. It explains the tool's purpose and provides a usage hint, covering all necessary aspects for an agent to use it correctly.

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

Parameters3/5

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

The input schema provides complete descriptions for both parameters ('Maximum number of returned projects' and 'Optional prefix search on project name'), giving 100% schema coverage. The description adds no additional parameter-level detail, which is acceptable as the schema already does the heavy lifting.

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 verb ('List'), the resource ('REACH projects'), and the scope ('for the authenticated user'). It also differentiates from siblings by indicating its role in preparation for `show_project`, making its 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 Guidelines4/5

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

The description provides a clear use case: 'Use this tool to find the right project before calling show_project.' This gives contextual guidance for when to use it, though it does not explicitly exclude alternatives or mention contrast with other list-type tools (e.g., list_lists), keeping it from a perfect score.

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

preview_listPreview List Mcp ToolA
Read-onlyIdempotent
Inspect
Preview a sample of rows from a REACH list.

Use this tool to inspect the actual data rows in a list. Returns a row sample
from the list file. The optional `count` parameter is a hint for how many rows
to return; the actual number may differ depending on list type and backend
preview behavior. When omitted, the service default applies.
NameRequiredDescriptionDefault
countNoHint for number of rows to return (1–25). Actual rows may vary by list type. When omitted the service default is used.
list_idYesPositive integer list ID (must be ≥ 1)

Output Schema

NameRequiredDescription
rowsNo
list_idNo
list_urlNo
returned_rowsNo

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral nuance beyond the annotations, including that the count parameter is only a hint, the actual row count may differ by list type and backend behavior, and a service default applies when omitted. This is helpful and consistent with the 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 concise and front-loaded with the primary purpose. It covers sample behavior, count variability, and default behavior in four short sentences. There is slight redundancy between 'Preview a sample of rows' and 'Returns a row sample', but no substantial waste.

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 simple two-parameter read-only preview tool with full schema coverage and an output schema, the description context is appropriately complete. It explains the extent of the sample, the count limitations, and backend variability. It does not address all possible sibling distinctions, but that is not essential for using this tool correctly.

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

Parameters3/5

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

The schema already has 100% coverage for both list_id and count, including the hint-like nature of count. The description mostly paraphrases what the schema already states, reinforcing that count is a hint and varies, but it does not add additional meaning beyond the structured schema. Baseline 3 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 clearly states the tool 'Preview a sample of rows from a REACH list' and further clarifies that it inspects the actual data rows. This specific verb-resource combination differentiates it from siblings like show_list, which likely shows list metadata or structure rather than row samples.

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 a concise use case: 'Use this tool to inspect the actual data rows in a list.' This provides clear context for when the tool is appropriate. It does not explicitly mention when not to use it or name alternatives, but the usage context is sufficient for a read-only preview tool.

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

setup_listSetup List Mcp ToolA
Destructive
Inspect
Map a REACH list's columns to the input fields a job type reads, so `create_job` can run on it.

1. Call without `header_map`; this call changes nothing. When `already_mapped` is true, `header_map` is the list's saved mapping: go to `create_job`. Otherwise `header_map` is REACH's guess, shown with `sample_rows`.
2. Confirm doubtful columns and any unmapped needed field with the user against `sample_rows`, then call again with `header_map` to apply it. The list needs every field of at least one of `required_field_sets`.
3. When `is_valid_for_job_type` is true, call `create_job`, which still checks the list's size, export status and the account's access.

REACH-generated lists keep the mapping their job gave them; only Data Workbench output, lists with a field mapped to several columns, and b2b2c_append accept a new one.
NameRequiredDescriptionDefault
list_idYesList to set up, from `list_lists` or `show_list`
job_typeYesThe `create_job` job_type this list will feed
has_headerNoApplied with `header_map`: whether the file's first row is a header. Defaults to REACH's guess.
header_mapNoInput field name to zero-based column index, e.g. {"first": 0, "email": 3}. Omit to see the guess; pass to apply.

Output Schema

NameRequiredDescription
appliedNoTrue when this call saved `header_map` to the list; false for a guess
list_idNo
job_typeNo
has_headerNo
header_mapNoInput field name to zero-based column index: the saved mapping, the guess, or the mapping just applied
sample_rowsNoThe file's first rows, positional, including the header row when there is one
allowed_fieldsNo
already_mappedNoTrue when the list's saved mapping already passes `create_job`'s mapping and data-type checks for job_type; `header_map` is then that mapping
validation_errorsNo
required_field_setsNo
is_valid_for_job_typeNoWhether the list as saved now passes `create_job`'s mapping and data-type checks for job_type

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare destructiveHint=true, and the description adds the crucial nuance that the call without `header_map` changes nothing — a dry-run mode the annotations alone would obscure. It also notes that `create_job` re-validates size, export status, and account access, so this tool isn't the last gate. It stops short of explaining what an applied mapping overwrites on the underlying list.

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?

Opens with a single-sentence purpose, then numbers the workflow steps so the two-phase call pattern is front-loaded. The closing paragraph on which lists accept a new mapping is dense but every sentence informs the call decision.

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 an output schema present, the description correctly avoids documenting return values and instead explains how to use the response fields it references. For a stateful, dry-run-then-apply mutation tool, the agent has everything needed to sequence the calls.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: `header_map` omission versus passing it defines the preview/apply split, and the response fields `already_mapped`, `sample_rows`, and `is_valid_for_job_type` are given operational meaning. `has_header` is only loosely covered ("applied with header_map").

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 ("Map a REACH list's columns to the input fields a job type reads") plus the downstream purpose (so `create_job` can run). It clearly separates this tool from siblings like `create_job`, `preview_list`, and `show_list` by naming their roles explicitly.

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?

Provides an explicit three-step workflow with a no-op first call, when to consult `sample_rows`, when to apply `header_map`, and when to hand off to `create_job`. It also states exclusions: REACH-generated lists keep their mapping, while only Data Workbench output and b2b2c_append-style lists accept a new one.

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

show_listShow List Mcp ToolA
Read-onlyIdempotent
Inspect

Show one REACH list and a summary of its latest job.

Use this tool when you already know the list ID and need full metadata plus job status.

NameRequiredDescriptionDefault
list_idYesPositive integer list ID (must be ≥ 1)

Output Schema

NameRequiredDescription
listNo
job_summaryNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=trueais, so the safety profile is covered. The description adds value by specifying the exact scope of the result – one list plus summary of latest job – which goes beyond the annotations. 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.

Conciseness5/5

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

Two sentences, front-loaded with what it returns and when to use it. No wasted words.

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, read-only, idempotent tool with an output schema, the description plus annotations fully cover what an agent needs to know. It states scope, return content, and selection condition.

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

Parameters3/5

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

Input schema covers the single parameter with type, minimum, and a description that already conveys the list ID must be a positive integer. The description adds no extra semantics but none are needed at 100% coverage.

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 ('Show') and resource ('one REACH list') plus what it returns ('summary of its latest job'). Distinguishes itself from sibling tools by requiring a known list ID and returning full metadata, which separates it from preview_list and list_lists.

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 when to use the tool: when the list ID is already known and full metadata plus job status is needed. It doesn't name the alternatives it excludes (e.g., list_lists, job_status), but the context is clear enough for an agent to route to it.

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

show_projectShow Project Mcp ToolA
Read-onlyIdempotent
Inspect

Show one REACH project and a small summary of its lists.

Use this tool when you already know the project ID and need counts plus a recent-list preview.

NameRequiredDescriptionDefault
project_idYesPositive integer project ID (must be ≥ 1)

Output Schema

NameRequiredDescription
projectNo
list_summaryNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already confirm read-only, non-destructive, and idempotent behavior. The description adds detail about the output nature ('small summary', 'counts', 'recent-list preview'), giving further clarity without contradicting 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 concise, using two short sentences with no redundant information. It is well-structured and directly addresses the tool's purpose and usage.

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?

While an output schema exists (so return values need not be detailed), the description gives sufficient context about what the summary contains ('counts', 'recent-list preview'). It is complete enough for an agent to understand the tool's functional scope, though edge cases like error handling are not mentioned.

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

Parameters3/5

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

The only parameter project_id is fully described in the schema with type and constraints. The description does not add extra semantic meaning beyond 'Positive integer project ID', so the baseline score of 3 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 clearly states the tool's function: showing one REACH project and a summary of its lists. It distinguishes from sibling tools like list_projects by specifying a single project and the inclusion of list summaries.

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 usage condition is given: 'Use this tool when you already know the project ID and need counts plus a recent-list preview.' This clearly indicates when to choose this tool over alternatives.

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. 3 tool updates
    • Changedb2c_listgen_estimate16 fields changed
      • removedInput schema / properties / d_creditrating
        Removed value: -{
        -  "description": "Credit rating range. See values in options tool",
        -  "pattern": "^[A-H](-[A-H])?$",
        -  "type": "string"
        -}
      • removedInput schema / properties / d_donation_health
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_donation_political
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_donation_political_conservative
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_donation_political_liberal
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_donation_religion
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_donation_unspecified
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_donation_veterans
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_ethnicgroup
        Removed value: -{
        -  "description": "Ethnic group codes. See values in options tool",
        -  "items": {
        -    "pattern": "^[A-Z]$",
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / d_hhldveteran
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_lifestyle_health_beauty
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_military_history
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / d_political_party
        Removed value: -{
        -  "description": "Political party affiliation values",
        -  "items": {
        -    "enum": [
        -      "REPUBLICAN",
        -      "DEMOCRAT",
        -      "LIBERTARIAN",
        -      "GREEN",
        -      "INDEPENDENT",
        -      "REFORM",
        -      "NO AFFILIATION"
        -    ],
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / d_religion
        Removed value: -{
        -  "description": "Religion codes. See values in options tool",
        -  "items": {
        -    "pattern": "^[A-Z]$",
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / d_weightloss
        Removed value: -{
        -  "enum": [
        -    "Y"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / include_demo_categories / items / enum
        Previous value: -[
        -  "b2cDemographic",
        -  "b2cHouseFinAuto",
        -  "b2cLifestyleInterest",
        -  "b2cPoliticalDonor",
        -  "firmographic"
        -]New value: +[
        +  "b2cDemographic",
        +  "b2cHouseFinAuto",
        +  "b2cLifestyleInterest",
        +  "firmographic"
        +]
    • Changedcreate_job1 field changed
      • addedInput schema / properties / idempotency_key
        Added value: +{
        +  "description": "Reuse on retry; the same key and arguments return the original job",
        +  "maxLength": 255,
        +  "type": "string"
        +}
    • Changeddemographic_append1 field changed
      • changedInput schema / properties / outputs / items / enum
        Previous value: -[
        -  "demographic",
        -  "financial",
        -  "lifestyle",
        -  "political",
        -  "full_demographic"
        -]New value: +[
        +  "demographic",
        +  "lifestyle"
        +]
  2. 6 tool updates
    • Addedads_export_options
    • Addedads_export_status
    • Changedcreate_job7 fields changed
      • changedInput schema / properties / config / description
        Previous value: -"Nested job config using the exact input shape documented by `b2b_listgen_estimate` or `b2c_listgen_estimate` for the selected job_type, without nesting or renaming fields. b2b_listgen requires `output`. b2c_listgen requires `required_fields`. max_records defaults to 10000 and may not exceed 50000."New value: +"Listgen: the exact input shape documented by `b2b_listgen_estimate` or `b2c_listgen_estimate`, without nesting or renaming fields; b2b_listgen requires `output`, b2c_listgen requires `required_fields`, max_records defaults to 10000 (max 50000). Enrichment: contact_append and demographic_append require `match_type` and `sub_jobs`; email_validation allows `include_alternate`; others take {}."
      • addedInput schema / properties / input_list_id
        Added value: +{
        +  "description": "List to enrich (enrichment types)",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / job_type / description
        Previous value: -"Selects the internal operation branch for the nested config payload"New value: +"Enrichment types match the real-time tool names"
      • changedInput schema / properties / job_type / enum
        Previous value: -[
        -  "b2b_listgen",
        -  "b2c_listgen"
        -]New value: +[
        +  "b2b_listgen",
        +  "b2c_listgen",
        +  "contact_append",
        +  "b2b2c_append",
        +  "c2b_append",
        +  "demographic_append",
        +  "firmographic_append",
        +  "ip_to_domain_append",
        +  "email_validation"
        +]
      • changedInput schema / properties / project_id / description
        Previous value: -"Preferred project target when the user already has a project"New value: +"Existing project for the output list"
      • changedInput schema / properties / project_name / description
        Previous value: -"Fallback project name when the user wants MCP to create/find the project"New value: +"Project to find or create when there is no project_id"
      • changedInput schema / properties / usage_consent_confirmed / description
        Previous value: -"Set to true to confirm the user has consented to usage charges. Required for job types that bill upon completion."New value: +"True once the user consents to usage charges; required for charge-on-finish jobs"
    • Addedexport_list_to_ads
    • Addedimport_cloud_list
    • Addedsetup_list
  3. 1 tool update
    • Changedcontact_append1 field changed
      • removedInput schema / properties / usage_consent_confirmed
        Removed value: -{
        -  "description": "Required for email outputs after the user explicitly agrees to usage charges",
        -  "type": "boolean"
        -}
  4. 1 tool update
    • Changedcontact_append2 fields changed
      • addedInput schema / properties / cfg_required
        Added value: +{
        +  "description": "Comma or semi-colon separated response fields that must be populated for a record to be returned",
        +  "type": "string"
        +}
      • addedInput schema / properties / usage_consent_confirmed
        Added value: +{
        +  "description": "Required for email outputs after the user explicitly agrees to usage charges",
        +  "type": "boolean"
        +}
  5. 4 tool updates
    • Changedcreate_job2 fields changed
      • addedOutput schema / properties / output_list_expires_at
        Added value: +{
        +  "description": "ISO-8601 expiration timestamp for the output list",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / output_list_is_expired
        Added value: +{
        +  "description": "Whether the output list has expired",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
    • Changedjob_status2 fields changed
      • addedOutput schema / properties / output_list_expires_at
        Added value: +{
        +  "description": "ISO-8601 expiration timestamp for the output list",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / output_list_is_expired
        Added value: +{
        +  "description": "Whether the output list has expired",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
    • Changedlist_lists2 fields changed
      • changedOutput schema / properties / lists / description
        Previous value: -"List summaries. created_at is an ISO-8601 timestamp."New value: +"List summaries"
      • addedOutput schema / properties / lists / items / properties
        Added value: +{
        +  "created_at": {
        +    "description": "ISO-8601 creation timestamp",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "expires_at": {
        +    "description": "ISO-8601 expiration timestamp",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "file_ready": {
        +    "type": [
        +      "boolean",
        +      "null"
        +    ]
        +  },
        +  "is_expired": {
        +    "type": [
        +      "boolean",
        +      "null"
        +    ]
        +  },
        +  "latest_job_operation": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "latest_job_state": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "list_id": {
        +    "type": [
        +      "integer",
        +      "null"
        +    ]
        +  },
        +  "list_name": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "project_id": {
        +    "type": [
        +      "integer",
        +      "null"
        +    ]
        +  },
        +  "project_name": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "record_count": {
        +    "type": [
        +      "integer",
        +      "null"
        +    ]
        +  }
        +}
    • Changedshow_list2 fields changed
      • addedOutput schema / properties / list / properties / expires_at
        Added value: +{
        +  "description": "ISO-8601 expiration timestamp",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / list / properties / is_expired
        Added value: +{
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
  6. 1 tool update
    • Changedb2c_listgen_estimate1 field changed
      • addedInput schema / properties / d_hhld_size
        Added value: +{
        +  "description": "Household size range (1-9, e.g., \"2-4\"); 9 means 9 or more",
        +  "pattern": "^[1-9]-[1-9]$",
        +  "type": "string"
        +}
  7. 1 tool update
    • Addedb2b2c_append
  8. 19 tool updates
    • Changedb2b_listgen_estimate1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "properties": {
        +        "estimated_credits": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_match_credits": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_record_count": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_records_available": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_time": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_time_in_seconds": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "preview": {
        +          "items": {
        +            "items": {
        +              "type": [
        +                "string",
        +                "integer",
        +                "number",
        +                "boolean",
        +                "object",
        +                "array",
        +                "null"
        +              ]
        +            },
        +            "type": "array"
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedb2b_listgen_options1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "field": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_offset": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "offset": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "returned": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "total_matches": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "values": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedb2c_listgen_estimate54 fields changed
      • removedInput schema / properties / d_apparel_mens / description
        Removed value: -"Set to \"Y\" to include households associated with men's apparel interest."
      • removedInput schema / properties / d_apparel_womens / description
        Removed value: -"Set to \"Y\" to include households associated with women's apparel interest."
      • removedInput schema / properties / d_cardholder_bank / description
        Removed value: -"Set to \"Y\" to include households associated with bank card ownership."
      • removedInput schema / properties / d_cardholder_upscale / description
        Removed value: -"Set to \"Y\" to include households associated with upscale card ownership."
      • removedInput schema / properties / d_donation_animals / description
        Removed value: -"Set to \"Y\" to include households associated with animal welfare donors."
      • removedInput schema / properties / d_donation_arts_culture / description
        Removed value: -"Set to \"Y\" to include households associated with arts and culture donors."
      • removedInput schema / properties / d_donation_children / description
        Removed value: -"Set to \"Y\" to include households associated with children's causes donors."
      • removedInput schema / properties / d_donation_community / description
        Removed value: -"Set to \"Y\" to include households associated with community organization donors."
      • removedInput schema / properties / d_donation_env / description
        Removed value: -"Set to \"Y\" to include households associated with environmental donors."
      • removedInput schema / properties / d_donation_env_wildlife / description
        Removed value: -"Set to \"Y\" to include households associated with environmental or wildlife donors."
      • removedInput schema / properties / d_donation_health / description
        Removed value: -"Set to \"Y\" to include households associated with health-related donors."
      • removedInput schema / properties / d_donation_intl_aid / description
        Removed value: -"Set to \"Y\" to include households associated with international aid donors."
      • removedInput schema / properties / d_donation_political / description
        Removed value: -"Set to \"Y\" to include households associated with general political donors."
      • removedInput schema / properties / d_donation_political_conservative / description
        Removed value: -"Set to \"Y\" to include households associated with conservative political donors."
      • removedInput schema / properties / d_donation_political_liberal / description
        Removed value: -"Set to \"Y\" to include households associated with liberal political donors."
      • removedInput schema / properties / d_donation_religion / description
        Removed value: -"Set to \"Y\" to include households associated with religious donors."
      • removedInput schema / properties / d_donation_unspecified / description
        Removed value: -"Set to \"Y\" to include households associated with unspecified cause donors."
      • removedInput schema / properties / d_donation_veterans / description
        Removed value: -"Set to \"Y\" to include households associated with veteran support donors."
      • removedInput schema / properties / d_electronics / description
        Removed value: -"Set to \"Y\" to include households associated with consumer electronics interest."
      • removedInput schema / properties / d_exercise / description
        Removed value: -"Set to \"Y\" to include households associated with fitness and exercise interest."
      • removedInput schema / properties / d_fishing / description
        Removed value: -"Set to \"Y\" to include households associated with fishing interest."
      • removedInput schema / properties / d_gardening / description
        Removed value: -"Set to \"Y\" to include households associated with gardening interest."
      • removedInput schema / properties / d_golf / description
        Removed value: -"Set to \"Y\" to include households associated with golf interest."
      • removedInput schema / properties / d_hhldveteran / description
        Removed value: -"Set to \"Y\" to include households associated with veteran households."
      • removedInput schema / properties / d_home_improvement / description
        Removed value: -"Set to \"Y\" to include households associated with home improvement interest."
      • removedInput schema / properties / d_hunting / description
        Removed value: -"Set to \"Y\" to include households associated with hunting interest."
      • removedInput schema / properties / d_investing_active / description
        Removed value: -"Set to \"Y\" to include households associated with active investing interest."
      • removedInput schema / properties / d_lifestyle_antiques / description
        Removed value: -"Set to \"Y\" to include households associated with antiques interest."
      • removedInput schema / properties / d_lifestyle_arts_general / description
        Removed value: -"Set to \"Y\" to include households associated with arts interest."
      • removedInput schema / properties / d_lifestyle_cooking / description
        Removed value: -"Set to \"Y\" to include households associated with cooking interest."
      • removedInput schema / properties / d_lifestyle_decorating / description
        Removed value: -"Set to \"Y\" to include households associated with decorating interest."
      • removedInput schema / properties / d_lifestyle_health_beauty / description
        Removed value: -"Set to \"Y\" to include households associated with health and beauty interest."
      • removedInput schema / properties / d_lifestyle_music / description
        Removed value: -"Set to \"Y\" to include households associated with music interest."
      • removedInput schema / properties / d_lifestyle_outdoor / description
        Removed value: -"Set to \"Y\" to include households associated with outdoor recreation interest."
      • removedInput schema / properties / d_lifestyle_reading / description
        Removed value: -"Set to \"Y\" to include households associated with reading interest."
      • removedInput schema / properties / d_lifestyle_sports / description
        Removed value: -"Set to \"Y\" to include households associated with general sports interest."
      • removedInput schema / properties / d_magazines / description
        Removed value: -"Set to \"Y\" to include households associated with magazine subscriptions."
      • removedInput schema / properties / d_mailorderbuyer / description
        Removed value: -"Set to \"Y\" to include households associated with mail order purchasing activity."
      • removedInput schema / properties / d_military_history / description
        Removed value: -"Set to \"Y\" to include households associated with military history households."
      • removedInput schema / properties / d_motorcycles / description
        Removed value: -"Set to \"Y\" to include households associated with motorcycle interest."
      • removedInput schema / properties / d_news / description
        Removed value: -"Set to \"Y\" to include households associated with current affairs engagement."
      • removedInput schema / properties / d_onlinepurchaser / description
        Removed value: -"Set to \"Y\" to include households associated with online purchasing activity."
      • removedInput schema / properties / d_pets / description
        Removed value: -"Set to \"Y\" to include households associated with pet ownership."
      • removedInput schema / properties / d_presence_of_children / description
        Removed value: -"Set to \"Y\" to include households with children present"
      • removedInput schema / properties / d_senior_hhld / description
        Removed value: -"Set to \"Y\" to include households associated with senior households."
      • removedInput schema / properties / d_shooting / description
        Removed value: -"Set to \"Y\" to include households associated with shooting sports interest."
      • removedInput schema / properties / d_singleparent / description
        Removed value: -"Set to \"Y\" to include households associated with single parent households."
      • removedInput schema / properties / d_soho / description
        Removed value: -"Set to \"Y\" to include households associated with small office/home office households."
      • removedInput schema / properties / d_travel / description
        Removed value: -"Set to \"Y\" to include households associated with travel interest."
      • removedInput schema / properties / d_weightloss / description
        Removed value: -"Set to \"Y\" to include households associated with dieting and weight loss interest."
      • removedInput schema / properties / d_workingwoman / description
        Removed value: -"Set to \"Y\" to include households associated with working women households."
      • removedInput schema / properties / d_youngadult_hhld / description
        Removed value: -"Set to \"Y\" to include households associated with young adult households."
      • removedInput schema / properties / rcfg_max_time
        Removed value: -{
        -  "description": "Maximum allowed API run time in seconds",
        -  "minimum": 0.1,
        -  "type": "number"
        -}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "properties": {
        +        "estimated_credits": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_match_credits": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_record_count": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_records_available": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_time": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "estimated_time_in_seconds": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "preview": {
        +          "items": {
        +            "items": {
        +              "type": [
        +                "string",
        +                "integer",
        +                "number",
        +                "boolean",
        +                "object",
        +                "array",
        +                "null"
        +              ]
        +            },
        +            "type": "array"
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedb2c_listgen_options1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "field": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "next_offset": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "offset": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "returned": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "total_matches": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "values": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedc2b_append5 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "first",
        +      "last",
        +      "email"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "first",
        +      "last",
        +      "phone"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "first",
        +      "last",
        +      "city",
        +      "state"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "li_url"
        +    ]
        +  }
        +]
      • addedInput schema / properties / city
        Added value: +{
        +  "description": "A person's city",
        +  "type": "string"
        +}
      • addedInput schema / properties / phone
        Added value: +{
        +  "description": "A person's phone number",
        +  "type": "string"
        +}
      • addedInput schema / properties / state
        Added value: +{
        +  "description": "A person's two-letter state code",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "description": "Sparse match counts. An absent key means zero.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "description": "Number of matching queries.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "description": "Number of records returned.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "description": "Records returned by the Operations API. Record fields pass through unchanged.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcontact_append1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "description": "Sparse match counts. An absent key means zero.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "description": "Number of matching queries.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "description": "Number of records returned.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "description": "Records returned by the Operations API. Record fields pass through unchanged.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcreate_job4 fields changed
      • removedInput schema / properties / config / additionalProperties
        Removed value: -false
      • changedInput schema / properties / config / description
        Previous value: -"Nested job config. Supply fields matching the selected job_type. b2b_listgen requires `output`. b2c_listgen requires `required_fields`. max_records defaults to 10000 and may not exceed 50000."New value: +"Nested job config using the exact input shape documented by `b2b_listgen_estimate` or `b2c_listgen_estimate` for the selected job_type, without nesting or renaming fields. b2b_listgen requires `output`. b2c_listgen requires `required_fields`. max_records defaults to 10000 and may not exceed 50000."
      • removedInput schema / properties / config / properties
        Removed value: -{
        -  "cfg_b2cloc": {
        -    "description": "Whether location filters apply to business location (0) or employee home location (1)",
        -    "enum": [
        -      0,
        -      1
        -    ],
        -    "type": "integer"
        -  },
        -  "cfg_require_address": {
        -    "description": "Set to true to require mailing addresses in the output",
        -    "type": "boolean"
        -  },
        -  "cfg_require_email": {
        -    "description": "Set to true to require email addresses in the output",
        -    "type": "boolean"
        -  },
        -  "cfg_require_name": {
        -    "description": "Set to true to require full names in the output",
        -    "type": "boolean"
        -  },
        -  "cfg_require_phone": {
        -    "description": "Set to true to require phone numbers in the output",
        -    "type": "boolean"
        -  },
        -  "cfg_zipradius": {
        -    "description": "Radius expansion (pseudo-miles) applied around supplied ZIP or city/state centers",
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  "cfg_zipradius_focus": {
        -    "description": "Limits radius expansion to ZIP, city/state, or none",
        -    "enum": [
        -      "zip",
        -      "citystate",
        -      "none"
        -    ],
        -    "type": "string"
        -  },
        -  "contacts_per_addr": {
        -    "description": "Maximum contacts per street address (0=unlimited, 1=one contact per address)",
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  "d_age": {
        -    "description": "Age range in years (single value or min-max, e.g., \"35-45\")",
        -    "pattern": "^\\d{1,3}(-\\d{1,3})?$",
        -    "type": "string"
        -  },
        -  "d_apparel_mens": {
        -    "description": "Set to \"Y\" to include households associated with men's apparel interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_apparel_womens": {
        -    "description": "Set to \"Y\" to include households associated with women's apparel interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_auto_makemodel": {
        -    "description": "Auto make and model combo(s) (e.g. \"Ford:Escape\")",
        -    "items": {
        -      "pattern": "^[^:]+[:][^:]+$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_auto_year": {
        -    "description": "Automobile year range (single year or min-max)",
        -    "pattern": "^\\d{4}(-\\d{4})?$",
        -    "type": "string"
        -  },
        -  "d_cardholder_bank": {
        -    "description": "Set to \"Y\" to include households associated with bank card ownership.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_cardholder_upscale": {
        -    "description": "Set to \"Y\" to include households associated with upscale card ownership.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_city_state": {
        -    "description": "Array of city,state combinations (e.g., \"Seattle, WA\")",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_county": {
        -    "description": "County filters. For b2b_listgen use full county names. For b2c_listgen use county,state combinations (for example, \"King, WA\").",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_creditlines": {
        -    "description": "Number of credit lines range (e.g. \"0-5\")",
        -    "pattern": "^\\d-\\d$",
        -    "type": "string"
        -  },
        -  "d_creditrating": {
        -    "description": "Credit rating range. See values in options tool",
        -    "pattern": "^[A-H](-[A-H])?$",
        -    "type": "string"
        -  },
        -  "d_donation_animals": {
        -    "description": "Set to \"Y\" to include households associated with animal welfare donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_arts_culture": {
        -    "description": "Set to \"Y\" to include households associated with arts and culture donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_children": {
        -    "description": "Set to \"Y\" to include households associated with children's causes donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_community": {
        -    "description": "Set to \"Y\" to include households associated with community organization donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_env": {
        -    "description": "Set to \"Y\" to include households associated with environmental donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_env_wildlife": {
        -    "description": "Set to \"Y\" to include households associated with environmental or wildlife donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_health": {
        -    "description": "Set to \"Y\" to include households associated with health-related donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_intl_aid": {
        -    "description": "Set to \"Y\" to include households associated with international aid donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_political": {
        -    "description": "Set to \"Y\" to include households associated with general political donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_political_conservative": {
        -    "description": "Set to \"Y\" to include households associated with conservative political donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_political_liberal": {
        -    "description": "Set to \"Y\" to include households associated with liberal political donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_religion": {
        -    "description": "Set to \"Y\" to include households associated with religious donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_unspecified": {
        -    "description": "Set to \"Y\" to include households associated with unspecified cause donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_donation_veterans": {
        -    "description": "Set to \"Y\" to include households associated with veteran support donors.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_dwellingtype": {
        -    "description": "Dwelling type codes (M=Multi Family, S=Single Family, U=Unknown)",
        -    "enum": [
        -      "M",
        -      "S",
        -      "U"
        -    ],
        -    "type": "string"
        -  },
        -  "d_education": {
        -    "description": "Education level codes: A=High School, B=College, C=Graduate, D=Technical/Vocational",
        -    "items": {
        -      "enum": [
        -        "A",
        -        "B",
        -        "C",
        -        "D"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_electronics": {
        -    "description": "Set to \"Y\" to include households associated with consumer electronics interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_esthhldincome": {
        -    "description": "Estimated household income range using codes. See values in options tool",
        -    "pattern": "^[A-S](-[A-S])?$",
        -    "type": "string"
        -  },
        -  "d_ethnicgroup": {
        -    "description": "Ethnic group codes. See values in options tool",
        -    "items": {
        -      "pattern": "^[A-Z]$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_exercise": {
        -    "description": "Set to \"Y\" to include households associated with fitness and exercise interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_fishing": {
        -    "description": "Set to \"Y\" to include households associated with fishing interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_gardening": {
        -    "description": "Set to \"Y\" to include households associated with gardening interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_gender": {
        -    "description": "Gender filter (M=Male, F=Female)",
        -    "enum": [
        -      "M",
        -      "F"
        -    ],
        -    "type": "string"
        -  },
        -  "d_golf": {
        -    "description": "Set to \"Y\" to include households associated with golf interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_hhldveteran": {
        -    "description": "Set to \"Y\" to include households associated with veteran households.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_home_improvement": {
        -    "description": "Set to \"Y\" to include households associated with home improvement interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_home_market_value": {
        -    "description": "Home market value range. See values in options tool",
        -    "pattern": "^[A-S](-[A-S])?$",
        -    "type": "string"
        -  },
        -  "d_home_purchase_date": {
        -    "description": "Home purchase date in YYYYMMDD format",
        -    "pattern": "^\\d{8}$",
        -    "type": "string"
        -  },
        -  "d_home_purchase_price": {
        -    "description": "Home purchase price in thousands",
        -    "enum": [
        -      "1",
        -      "50",
        -      "100",
        -      "150",
        -      "200",
        -      "250",
        -      "300",
        -      "400",
        -      "500",
        -      "600",
        -      "700",
        -      "800",
        -      "900",
        -      "1000",
        -      "1100",
        -      "1200",
        -      "1300",
        -      "1400",
        -      "1500",
        -      "1600",
        -      "1700",
        -      "1800",
        -      "1900",
        -      "2000"
        -    ],
        -    "type": "string"
        -  },
        -  "d_home_value": {
        -    "description": "Home value range. See values in options tool",
        -    "pattern": "^[A-S](-[A-S])?$",
        -    "type": "string"
        -  },
        -  "d_home_year": {
        -    "description": "Year home was built (single year or range)",
        -    "pattern": "^\\d{4}(-\\d{4})?$",
        -    "type": "string"
        -  },
        -  "d_hunting": {
        -    "description": "Set to \"Y\" to include households associated with hunting interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_investing_active": {
        -    "description": "Set to \"Y\" to include households associated with active investing interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_language": {
        -    "description": "Language codes. See values in options tool",
        -    "items": {
        -      "pattern": "^[A-Z0-9]{2}$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_lifestyle_antiques": {
        -    "description": "Set to \"Y\" to include households associated with antiques interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_arts_general": {
        -    "description": "Set to \"Y\" to include households associated with arts interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_cooking": {
        -    "description": "Set to \"Y\" to include households associated with cooking interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_decorating": {
        -    "description": "Set to \"Y\" to include households associated with decorating interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_health_beauty": {
        -    "description": "Set to \"Y\" to include households associated with health and beauty interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_music": {
        -    "description": "Set to \"Y\" to include households associated with music interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_outdoor": {
        -    "description": "Set to \"Y\" to include households associated with outdoor recreation interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_reading": {
        -    "description": "Set to \"Y\" to include households associated with reading interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_lifestyle_sports": {
        -    "description": "Set to \"Y\" to include households associated with general sports interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_loantovalue": {
        -    "description": "Loan-to-value percentage as single value or range (0-100)",
        -    "pattern": "^\\d{1,3}(-\\d{1,3})?$",
        -    "type": "string"
        -  },
        -  "d_lor": {
        -    "description": "Length of residence in years (single value or range)",
        -    "pattern": "^\\d{1,3}(-\\d{1,3})?$",
        -    "type": "string"
        -  },
        -  "d_magazines": {
        -    "description": "Set to \"Y\" to include households associated with magazine subscriptions.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_mailorderbuyer": {
        -    "description": "Set to \"Y\" to include households associated with mail order purchasing activity.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_maritalstatus": {
        -    "description": "Marital status codes (M=Married, S=Single, A=Married (Inferred), B=Single (Inferred))",
        -    "items": {
        -      "enum": [
        -        "M",
        -        "S",
        -        "A",
        -        "B"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_military_history": {
        -    "description": "Set to \"Y\" to include households associated with military history households.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_mortgage2_amount": {
        -    "description": "Second mortgage amount in thousands",
        -    "enum": [
        -      "1",
        -      "50",
        -      "100",
        -      "150",
        -      "200",
        -      "250",
        -      "300",
        -      "400",
        -      "500",
        -      "600",
        -      "700",
        -      "800",
        -      "900",
        -      "1000"
        -    ],
        -    "type": "string"
        -  },
        -  "d_mortgage2_date": {
        -    "description": "Second mortgage date in YYYYMMDD format",
        -    "pattern": "^\\d{8}$",
        -    "type": "string"
        -  },
        -  "d_mortgage2_loan_type": {
        -    "description": "Second mortgage loan type codes. See values in options tool",
        -    "enum": [
        -      "5",
        -      "C",
        -      "F",
        -      "P",
        -      "S",
        -      "V",
        -      "W"
        -    ],
        -    "type": "string"
        -  },
        -  "d_mortgage2_rate": {
        -    "description": "Second mortgage interest rate percentage",
        -    "pattern": "^\\d{1,2}(\\.\\d{1,2})?%$",
        -    "type": "string"
        -  },
        -  "d_mortgage2_rate_type": {
        -    "description": "Second mortgage rate type codes. A=Adjustable, B=Balloon, F=Fixed, U=Unknown",
        -    "enum": [
        -      "A",
        -      "B",
        -      "F",
        -      "U"
        -    ],
        -    "type": "string"
        -  },
        -  "d_mortgage_amount": {
        -    "description": "Mortgage amount in thousands (use values like \"50\" or \"400\")",
        -    "enum": [
        -      "1",
        -      "50",
        -      "100",
        -      "150",
        -      "200",
        -      "250",
        -      "300",
        -      "400",
        -      "500",
        -      "600",
        -      "700",
        -      "800",
        -      "900",
        -      "1000"
        -    ],
        -    "type": "string"
        -  },
        -  "d_mortgage_purchase_date": {
        -    "description": "Mortgage purchase date in YYYYMMDD format",
        -    "pattern": "^\\d{8}$",
        -    "type": "string"
        -  },
        -  "d_mortgage_purchase_loan_type_code": {
        -    "description": "Mortgage purchase loan type codes. See values in options tool",
        -    "enum": [
        -      "5",
        -      "C",
        -      "F",
        -      "P",
        -      "S",
        -      "V",
        -      "W"
        -    ],
        -    "type": "string"
        -  },
        -  "d_mortgage_rate": {
        -    "description": "Mortgage interest rate percentage (e.g., \"6.75%\", \"10%\")",
        -    "pattern": "^\\d{1,2}(\\.\\d{1,2})?%$",
        -    "type": "string"
        -  },
        -  "d_mortgage_rate_type": {
        -    "description": "Mortgage rate type codes. A=Adjustable, B=Balloon, F=Fixed, U=Unknown",
        -    "enum": [
        -      "A",
        -      "B",
        -      "F",
        -      "U"
        -    ],
        -    "type": "string"
        -  },
        -  "d_motorcycles": {
        -    "description": "Set to \"Y\" to include households associated with motorcycle interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_naics": {
        -    "description": "Raw 2- to 6-digit NAICS codes. Use the options tool to retrieve valid values",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_networth": {
        -    "description": "Estimated net worth range using codes. See values in options tool",
        -    "pattern": "^[A-I](-[A-I])?$",
        -    "type": "string"
        -  },
        -  "d_news": {
        -    "description": "Set to \"Y\" to include households associated with current affairs engagement.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_num_children": {
        -    "description": "Number of children range (0-8, e.g., \"2-3\")",
        -    "pattern": "^[0-9](-[0-9])?$",
        -    "type": "string"
        -  },
        -  "d_numemployees": {
        -    "description": "Company size range, in the format \"min-max\" (e.g. \"100-50000\")",
        -    "type": "string"
        -  },
        -  "d_occupation": {
        -    "description": "Occupation codes. See values in options tool",
        -    "items": {
        -      "pattern": "^[A-Z]$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_onlinepurchaser": {
        -    "description": "Set to \"Y\" to include households associated with online purchasing activity.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_ownrent": {
        -    "description": "Home ownership status codes (H=Owner, R=Renter, 9=Probable Owner)",
        -    "items": {
        -      "enum": [
        -        "H",
        -        "R",
        -        "9"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_pets": {
        -    "description": "Set to \"Y\" to include households associated with pet ownership.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_political_party": {
        -    "description": "Political party affiliation values",
        -    "items": {
        -      "enum": [
        -        "REPUBLICAN",
        -        "DEMOCRAT",
        -        "LIBERTARIAN",
        -        "GREEN",
        -        "INDEPENDENT",
        -        "REFORM",
        -        "NO AFFILIATION"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_presence_of_children": {
        -    "description": "Set to \"Y\" to include households with children present",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_refi_amount": {
        -    "description": "Refinance amount in thousands (single value or range)",
        -    "pattern": "^\\d+(-\\d+)?$",
        -    "type": "string"
        -  },
        -  "d_refi_date": {
        -    "description": "Refinance date or date range using YYYYMMDD format",
        -    "pattern": "^\\d{8}(-\\d{8})?$",
        -    "type": "string"
        -  },
        -  "d_refi_loan_type": {
        -    "description": "Refinance loan type codes. See values in options tool",
        -    "enum": [
        -      "5",
        -      "C",
        -      "F",
        -      "P",
        -      "S",
        -      "U",
        -      "W"
        -    ],
        -    "type": "string"
        -  },
        -  "d_refi_rate_type": {
        -    "description": "Refinance rate type codes. A=Adjustable, B=Balloon, F=Fixed, U=Unknown",
        -    "enum": [
        -      "A",
        -      "B",
        -      "F",
        -      "U"
        -    ],
        -    "type": "string"
        -  },
        -  "d_religion": {
        -    "description": "Religion codes. See values in options tool",
        -    "items": {
        -      "pattern": "^[A-Z]$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_salesvolume": {
        -    "description": "Company revenue range, in the format \"min-max\" (e.g. \"100000-1000000\" for $100K to $1M)",
        -    "type": "string"
        -  },
        -  "d_senior_hhld": {
        -    "description": "Set to \"Y\" to include households associated with senior households.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_shooting": {
        -    "description": "Set to \"Y\" to include households associated with shooting sports interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_sic": {
        -    "description": "Legacy 4-digit SIC codes",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_singleparent": {
        -    "description": "Set to \"Y\" to include households associated with single parent households.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_soho": {
        -    "description": "Set to \"Y\" to include households associated with small office/home office households.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_state": {
        -    "description": "Array of 2-letter state codes to filter by",
        -    "items": {
        -      "pattern": "^[A-Z]{2}$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "d_travel": {
        -    "description": "Set to \"Y\" to include households associated with travel interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_weightloss": {
        -    "description": "Set to \"Y\" to include households associated with dieting and weight loss interest.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_workingwoman": {
        -    "description": "Set to \"Y\" to include households associated with working women households.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_youngadult_hhld": {
        -    "description": "Set to \"Y\" to include households associated with young adult households.",
        -    "enum": [
        -      "Y"
        -    ],
        -    "type": "string"
        -  },
        -  "d_zip": {
        -    "description": "Array of 5-digit ZIP codes to filter by",
        -    "items": {
        -      "pattern": "^\\d{5}$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "include_demo_categories": {
        -    "description": "Demographic category summaries to include in the response. Recommended to include at least one with estimate calls for audience insights in the preview response",
        -    "items": {
        -      "enum": [
        -        "b2cDemographic",
        -        "b2cHouseFinAuto",
        -        "b2cLifestyleInterest",
        -        "b2cPoliticalDonor",
        -        "firmographic"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "include_filter_attrs": {
        -    "description": "Include selected filter attributes as columns in the final audience",
        -    "type": "boolean"
        -  },
        -  "max_coverage": {
        -    "description": "Request append processing for selected channels (must overlap required/optional fields)",
        -    "items": {
        -      "enum": [
        -        "email",
        -        "phone",
        -        "phone_multiple",
        -        "phone_mobile",
        -        "phone_multiple_mobile",
        -        "oa"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "max_records": {
        -    "description": "Cap the number of records returned by the eventual list build",
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  "optional_fields": {
        -    "description": "Optional contact fields to include when available",
        -    "items": {
        -      "enum": [
        -        "address",
        -        "email",
        -        "phone",
        -        "phone_multiple",
        -        "phone_mobile",
        -        "phone_multiple_mobile",
        -        "oa"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "output": {
        -    "description": "Campaign type specification. Must include exactly one: \"email\" or \"oa\". Email should almost always be used; OA can ONLY be used for audience targeting in ad platforms and will return hashed data",
        -    "items": {
        -      "enum": [
        -        "email",
        -        "oa"
        -      ],
        -      "type": "string"
        -    },
        -    "maxItems": 1,
        -    "minItems": 1,
        -    "type": "array"
        -  },
        -  "rcfg_max_time": {
        -    "description": "Maximum allowed API run time in seconds",
        -    "minimum": 0.1,
        -    "type": "number"
        -  },
        -  "rcfg_phone_format": {
        -    "description": "Set to 1 to prefix returned phone numbers with the country code",
        -    "enum": [
        -      1
        -    ],
        -    "type": "integer"
        -  },
        -  "rd_department": {
        -    "description": "Job departments. Use the options tool to retrieve valid values",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "rd_role": {
        -    "description": "Job roles. Use the options tool to retrieve valid values",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "rd_title_seniority": {
        -    "description": "Title seniority levels",
        -    "items": {
        -      "enum": [
        -        "Owner/President",
        -        "C-Level",
        -        "VP/Sr. Executive",
        -        "Director",
        -        "Manager",
        -        "Non-Manager"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "required_fields": {
        -    "description": "Required output contact fields. Must include at least one. Recommended to include address for estimate calls for geo info. IMPORTANT: Unlike the B2B Persona API, this field along with optional_fields are used to define output instead of the \"output\" parameter",
        -    "items": {
        -      "enum": [
        -        "address",
        -        "email",
        -        "phone",
        -        "phone_multiple",
        -        "phone_mobile",
        -        "phone_multiple_mobile",
        -        "oa"
        -      ],
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "job_guid": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "job_id": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "job_operation": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "job_state": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "list_name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "output_list_id": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "project_id": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcreate_project1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "created_at": {
        +      "description": "ISO-8601 creation timestamp",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "project_id": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "project_name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changeddemographic_append1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "description": "Sparse match counts. An absent key means zero.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "description": "Number of matching queries.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "description": "Number of records returned.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "description": "Records returned by the Operations API. Record fields pass through unchanged.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changeddocs_search1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "results": {
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changedemail_validation1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "description": "Sparse match counts. An absent key means zero.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "description": "Number of matching queries.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "description": "Number of records returned.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "description": "Records returned by the Operations API. Record fields pass through unchanged.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedfirmographic_append1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "description": "Sparse match counts. An absent key means zero.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "description": "Number of matching queries.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "description": "Number of records returned.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "description": "Records returned by the Operations API. Record fields pass through unchanged.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedip_to_domain_append1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "input_query": {
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "match_counts": {
        +      "description": "Sparse match counts. An absent key means zero.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "num_matches": {
        +      "description": "Number of matching queries.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "num_results": {
        +      "description": "Number of records returned.",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "query_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "results": {
        +      "description": "Records returned by the Operations API. Record fields pass through unchanged.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "integer",
        +          "number",
        +          "boolean",
        +          "object",
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedjob_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "created_at": {
        +      "description": "ISO-8601 creation timestamp",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "est_sec_remaining": {
        +      "type": [
        +        "integer",
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "finished_at": {
        +      "description": "ISO-8601 completion timestamp",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "job_guid": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "job_id": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "job_operation": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "job_state": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "list_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "output_file_ready": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "output_list_id": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "progress_percentage": {
        +      "type": [
        +        "integer",
        +        "number",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_lists1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "lists": {
        +      "description": "List summaries. created_at is an ISO-8601 timestamp.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "lists"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_projects1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "projects": {
        +      "description": "Project summaries. created_at is an ISO-8601 timestamp.",
        +      "items": {
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "projects"
        +  ],
        +  "type": "object"
        +}
    • Changedpreview_list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "list_id": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "list_url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "returned_rows": {
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "rows": {
        +      "items": {
        +        "items": {
        +          "type": [
        +            "string",
        +            "integer",
        +            "number",
        +            "boolean",
        +            "object",
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedshow_list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "job_summary": {
        +      "properties": {
        +        "latest_job_created_at": {
        +          "description": "ISO-8601 creation timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "latest_job_finished_at": {
        +          "description": "ISO-8601 completion timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "latest_job_id": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "latest_job_operation": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "latest_job_state": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "list": {
        +      "properties": {
        +        "created_at": {
        +          "description": "ISO-8601 creation timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "file_ready": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "list_id": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "list_name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "list_url": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "project_id": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "project_name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "record_count": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "source": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedshow_project1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "list_summary": {
        +      "properties": {
        +        "processing_lists": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "recent_lists": {
        +          "items": {
        +            "type": "object"
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "total_lists": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "project": {
        +      "properties": {
        +        "created_at": {
        +          "description": "ISO-8601 creation timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "favorite": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "project_id": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "project_name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "updated_at": {
        +          "description": "ISO-8601 update timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
  9. 19 tool updates
    • First observedb2b_listgen_estimate
    • First observedb2b_listgen_options
    • First observedb2c_listgen_estimate
    • First observedb2c_listgen_options
    • First observedc2b_append
    • First observedcontact_append
    • First observedcreate_job
    • First observedcreate_project
    • First observeddemographic_append
    • First observeddocs_search
    • First observedemail_validation
    • First observedfirmographic_append
    • First observedip_to_domain_append
    • First observedjob_status
    • First observedlist_lists
    • First observedlist_projects
    • First observedpreview_list
    • First observedshow_list
    • First observedshow_project

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    18 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources