Skip to main content
Glama

Server Details

Podcast intelligence for agents: transcripts, clips, speaker diarization, mention tracking.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
80.3% over 74 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.2/5.0

Scored across 38 tools

Disambiguation4/5

The set contains several adjacent capabilities (find_mentions vs search_transcripts, mention_trends vs episode_timeseries, share_of_voice vs compare_share_of_voice), but the descriptions explicitly define boundaries and include 'when not to use this tool' guidance. A few resolver/profile and meta tools still require care to distinguish, but the overlaps are mostly well signposted.

Naming Consistency4/5

Names are consistently snake_case with a particle_ prefix and generally follow particle_<domain>_<action>, making them predictable. Minor exceptions like particle_call and particle_catalog lack a domain segment, and action ordering varies, but there is no chaotic mixing of conventions.

Tool Count3/5

38 tools is heavy for a single server, even given the broad podcast-intelligence scope. The catalog and category mechanisms help, but several tools could be consolidated and the discovery burden is real; the count is borderline rather than clearly well-scoped.

Completeness4/5

Core workflows are well covered: entity/person/company/podcast resolution and profiles, episode and transcript search, mentions, trends, rankings, guests, topics, alerts CRUD, and transcription requests. There are some dangling references to tools not present in the advertised set (e.g. company_get_podcast_ad_presence, podcast_get_sponsors), presumably opt-in, which is a minor but notable gap.

Available Tools

38 tools
particle_alert_createParticle Alert CreateA
Destructive
Inspect

Create an alert that watches a single entity and sets up recurring email delivery to external recipients whenever it is mentioned on a podcast episode (kind=ENTITY_MENTION) or appears as a speaker (kind=PODCAST_SPEAKER). Pass the entity slug from a resolve tool — resolve a name with particle_entity_resolve, then create the alert with the slug it returns. An alert watches exactly one entity; to cover several entities, call this tool once per entity.

An active alert emails future matches to its configured recipients at the selected delivery cadence until paused or deleted. Only recipients verified for your organization receive alert emails; pending recipients may be saved but stay silent until verified.

When a name has no entity slug, or its entity has no podcast coverage (a startup known by a brand that differs from its legal name, a product, a drug, a code word), create a kind=KEYWORD_MENTION alert with keyword instead of entities. It fires whenever the phrase is spoken — the match particle_podcast_search_transcripts makes for a double-quoted keyword_search phrase (words adjacent and in order), not the looser unquoted match — so also set description to say what the phrase means; that is how same-name mentions of something else are filtered out.

Use the optional filters object to narrow what gets surfaced on every channel (matches list, realtime email, daily/weekly digest). Four independent axes: languages (BCP-47-like tags like ['en','pt-BR'] — empty means all languages), relevance (EVERYTHING returns on-target + incidental matches, RELEVANT narrows to on-target only — dropping passing mentions), source_popularity (ANY keeps every source, POPULAR keeps only matches from podcasts in the top 5% by chart popularity), and speaker_roles (PODCAST_SPEAKER alerts only — REPLACES the default appearance set GUEST/PANELIST/CORRESPONDENT/AUDIENCE/SOUNDBITE_SPEAKER; sending it on an ENTITY_MENTION alert errors with unprocessable_entity). ENTITY_MENTION alerts also take speaker_statement_characteristics, which fires only on mentions said a certain way: {"sentiment": ["negative"]} for negative mentions of a company, {"specificity": ["specific"], "temporal_orientation": ["future"]} for predictions about it, {"certainty": ["confident"]} for confident claims. Each mention line in the alert's matches carries its labels.

Billing: creating an active alert can move an eligible organization's subscription from its credit/trial phase to paid fixed-fee billing. Explain this possible billing change and obtain the user's explicit confirmation before creating an active alert. Creating a paused alert (is_active=false) does not trigger this billing transition.

After creation the alert immediately backfills matches from the past week (visible via particle_alert_list_matches) without sending emails for them. To see what an alert would catch BEFORE committing, use particle_alert_preview first. The created alert's id feeds particle_alert_get, particle_alert_update, particle_alert_delete, and particle_alert_list_matches.

Alerts are not covered by zero data retention: the alert's definition and its matched results are stored as part of the alerts feature.

NameRequiredDescriptionDefault
kindNoWhat signal to watch for. ENTITY_MENTION (default) fires whenever a watched entity is mentioned on a podcast episode. PODCAST_SPEAKER fires only when a watched person is themself an identified speaker: by default as guest/panelist/correspondent/audience or in an excerpted soundbite (SOUNDBITE_SPEAKER), never as host; speaker_roles replaces that set. KEYWORD_MENTION fires whenever keyword is spoken — use it when the name has no entity slug (a resolve tool finds nothing, or the right entity has no episodes). Kind is fixed at creation.
titleYesHuman-readable title for the alert (e.g. 'OpenAI mentions').
filtersNoPersistent narrowing applied to every surface the alert produces (matches list, realtime email, daily/weekly digest). Omit for no filters — every detected match is surfaced. See AlertFiltersInput for the four axes (languages, relevance, source_popularity, speaker_roles).
keywordNoKEYWORD_MENTION alerts only (and required for them): the phrase to watch, e.g. Lightfield. Matches like a double-quoted keyword_search phrase — the words adjacent and in order, ignoring case and punctuation, on whole words — in topic-discussion and interview segments, never ad reads, intros, or outros. Also set description to say what the phrase means (e.g. 'Lightfield, the AI-native CRM'); it is how same-name mentions of something else get filtered out. A phrase that matched more than 700 podcast episodes in the past week is rejected as too broad.
entitiesNoThe entity to watch, as a single slug from the resolve tools (particle_entity_resolve, particle_person_resolve, particle_company_resolve). Person, company, and place/other (knowledge-graph) slugs are all accepted; the resolved type is echoed back in the response. Exactly one for ENTITY_MENTION and PODCAST_SPEAKER — an alert watches a single entity, so create one alert per entity. Omit for KEYWORD_MENTION.
is_activeNoWhether the alert produces matches. Defaults to true. Set false to create it paused.
descriptionNoOptional longer description of what the alert is for.
notificationsNoEmail addresses for recurring alert notifications. Only recipients verified for your organization receive alert emails; pending recipients may be saved but stay silent until verified. At least one recipient must be deliverable. When omitted, defaults to your account email if available; otherwise pass at least one.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
delivery_cadenceNoHow often matches are emailed: REALTIME (default, one email per match), DAILY (one bundled email each morning), or WEEKLY (one bundled email Monday).

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint=false / destructiveHint=true annotations: discloses the possible credit-to-paid billing transition and the need for explicit user confirmation, that paused alerts avoid it, that creation backfills the past week without emailing, that unverified recipients stay silent, and that alerts are excluded from zero data retention. These are exactly the operational facts an agent cannot infer from structured fields.

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

Conciseness3/5

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

Front-loaded with purpose and rightly dense on billing/backfill, but the long filters paragraph duplicates what the schema already documents in greater depth (language tag collapsing, popularity percentile, statement characteristics), padding a description that is already the longest part of the definition.

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 10-parameter, nested-object mutation with no output schema, the description covers everything an agent needs: the resolve-then-create prerequisite chain, kind selection, billing consent, backfill behaviour, recipient verification, DZR status, and which sibling tools consume the returned alert id. Nothing material is left to inference.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds cross-parameter meaning the schema only states piecemeal — that is_active=false sidesteps the billing transition, that entities and keyword are mutually exclusive by kind, and the coupling of keyword with the free-text description field for disambiguation. It restates the filters axes, but the workflow-level framing is genuine added value.

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 ('Create an alert that watches a single entity and sets up recurring email delivery') and enumerates the three signal kinds with what each fires on. It explicitly distinguishes itself from particle_alert_preview and the resolve tools, so an agent can place it in the workflow without reading 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?

Gives explicit routing rules: resolve a name first with particle_entity_resolve and pass the slug; use KEYWORD_MENTION when no slug exists or the entity lacks podcast coverage; call once per entity to cover several; use particle_alert_preview before committing. It also states when-not (paused alerts avoid billing, speaker_roles on ENTITY_MENTION errors).

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

particle_alert_deleteParticle Alert DeleteA
Destructive
Inspect

Delete an alert. This is a soft delete: the alert stops producing matches and disappears from particle_alert_list, but its past matches and deliveries are retained for audit. To pause an alert instead of removing it, use particle_alert_update with is_active=false.

Only the alert's creator or an organization OWNER or ADMIN can delete it; an API key acts as the user who created the key. Other callers get a 403.

NameRequiredDescriptionDefault
alert_idYesAlert id to delete.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds genuinely new behavior: this is a soft delete, matches and deliveries are retained for audit, the alert disappears from particle_alert_list, and unauthorized callers get a 403. The note that an API key acts as the user who created the key is context the annotations cannot express.

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?

Three tight sentences, front-loaded with the core action and the soft-delete consequence, followed by the alternative and the permission rule. Every sentence carries information an agent needs; there is no filler.

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

Completeness5/5

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

For a single-parameter destructive tool with no output schema, the definition covers what is destroyed versus retained, where the alert disappears from, the escape hatch for pausing, and the authorization model including the 403 outcome. Nothing material 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?

There is a single parameter with 100% schema description coverage, so the schema already carries the parameter documentation and the description need not repeat it. The description implies the alert must be one the caller owns or administers, but adds no format or identifier guidance for alert_id itself, matching the baseline of 3 when the schema does the heavy lifting.

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

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+resource ('Delete an alert') and immediately qualifies the scope with the soft-delete semantics, so an agent knows exactly what operation is performed. It also names the sibling tool it is not (particle_alert_update), which is the main source of ambiguity among the alert tools.

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 gives an explicit when-not and the alternative: 'To pause an alert instead of removing it, use particle_alert_update with is_active=false.' It also states the caller conditions under which the tool is valid, so an agent can decide before invoking.

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

particle_alert_getParticle Alert GetA
Read-only
Inspect

Fetch a single alert's full configuration — title, kind, cadence, watched entities (with names), notification emails, and any active filters (languages, relevance, source_popularity, speaker_roles). The filters section is omitted when the alert carries none. By default the response is just the configuration; request include=['matches'] to embed the most recent matches it has caught and include=['deliveries'] for the email audit log. For the full, paginated match history with transcript excerpts, use particle_alert_list_matches.

NameRequiredDescriptionDefault
includeNoOptional sections to embed: 'matches' for the most recent matches the alert has caught, 'deliveries' for the email delivery audit log.
alert_idYesAlert id from particle_alert_list or particle_alert_create.
match_limitNoHow many recent matches to embed when include=matches (1-25, default 5). Use particle_alert_list_matches for full pagination and transcript windows.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations cover the read-only, non-destructive, closed-world safety profile, so the description only needs to add behavioral nuance — which it does: filters is omitted when empty, markdown is the default output, and json is described as larger and noisier for an LLM. It doesn't discuss pagination limits or error behavior for a missing alert_id, but the added context is substantive.

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?

Four sentences, front-loaded with what is returned, then conditional behavior, then the routing alternative. Every sentence carries distinct information with no filler.

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

Completeness5/5

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

No output schema exists, so the description compensates by enumerating the returned fields and explicitly stating that filters is omitted when absent. Combined with the include-based optional sections and the sibling pointer, an agent has everything needed to call 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 baseline is 3, but the description adds genuine meaning beyond the schema: the match_limit default/behavior when include=matches, the conditional relationship between include and match_limit, and the practical tradeoff of output_format='json' ('noisier for an LLM to read').

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 (fetch) and resource (a single alert's full configuration) and enumerates the concrete fields returned (title, kind, cadence, watched entities, notification emails, filters). It also names the sibling particle_alert_list_matches, so the agent can distinguish a single-alert fetch from a paginated history query.

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 describes default behavior ('response is just the configuration'), the opt-in paths with their exact parameter values (include=['matches'], include=['deliveries']), and the alternative tool with its selection condition ('for the full, paginated match history with transcript excerpts, use particle_alert_list_matches'). This is the when/when-not/alternative pattern.

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

particle_alert_listParticle Alert ListA
Read-only
Inspect

List the alerts in your project, newest first. Each entry carries the alert id — feed it into particle_alert_get for full configuration, particle_alert_list_matches for what it has caught, or particle_alert_update / particle_alert_delete to manage it.

NameRequiredDescriptionDefault
limitNoAlerts per page (1-100, default 25).
cursorNoOpaque pagination cursor from a previous response's cursor field.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), so the bar is lower, and the description adds the sort order and the fact that entries carry an id. It doesn't mention pagination behavior (cursor round-trip) or rate limits, which would raise this further.

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, zero filler, and the identification of the tool is front-loaded before the sibling routing guidance. Every clause earns its place.

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 no output schema, the description usefully discloses the ordering and that each entry includes an id, which is what an agent needs to chain calls. It stops short of describing the remaining entry fields (e.g., name, status), so it is strong but not exhaustive.

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 limit, cursor, and output_format are already fully documented in the schema. The description adds no syntax, format, or default information beyond that, leaving this at the baseline.

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 ('List the alerts in your project') plus a scope-defining detail (newest first). It also distinguishes itself from four named siblings by describing what each one does with the id this tool returns.

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

Usage Guidelines5/5

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

Explicitly routes the agent to the correct follow-up tool for each intent: particle_alert_get for configuration, particle_alert_list_matches for activity, update/delete for management. An agent can pick the right tool without opening sibling schemas.

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

particle_alert_list_matchesParticle Alert List MatchesA
Read-only
Inspect

List the matches an alert has caught, newest first — the payoff of an alert. Each match names the watched entity and the podcast episode it was detected on (with episode and podcast slugs that feed particle_podcast_get_episode and particle_podcast_resolve). Use view=detailed to include the transcript excerpts around each mention, and after/before to scope to a date range. Backfilled matches (from the past-week sweep at creation) are flagged and never triggered an email.

NameRequiredDescriptionDefault
viewNoDetail level. 'summary' (default) returns each match's entity, episode, and counts. 'detailed' also includes the transcript excerpt windows around each mention.
afterNoOnly matches detected on or after this ISO date (e.g. 2026-05-01).
limitNoMatches per page (1-100, default 25).
beforeNoOnly matches detected on or before this ISO date.
cursorNoOpaque pagination cursor from a previous response's cursor field.
alert_idYesAlert id whose matches to list.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare a safe read (readOnlyHint true, destructiveHint false), so the bar is lower, yet the description still adds real behavior: results are newest-first, and backfilled matches from the creation sweep are flagged and never sent an email. It omits pagination behavior, but the substantive disclosure here is well beyond 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?

Four sentences, front-loaded with the verb and the highest-value behavioral fact (the payoff + newest-first). Every sentence carries information; the phrasing "the payoff of an alert" is slightly decorative but not wasteful, keeping it just short of a 5.

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

Completeness5/5

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

With no output schema, the description carries the return-value burden and does so: it explains that each match names the watched entity and the episode/podcast slugs, plus what detailed view adds and how backfilled matches appear. Combined with a fully-covered input schema and read-only annotations, an agent has everything needed to call 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?

Schema description coverage is 100%, so view, after, before, limit, cursor, and output_format are all documented structurally; the description largely restates the view/after/before semantics. The only marginal addition is that episode/podcast slugs feed particle_podcast_get_episode and particle_podcast_resolve, which justifies baseline 3 rather than higher.

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 ("List the matches an alert has caught") plus ordering ("newest first") and even characterizes the payoff ("the payoff of an alert"). Combined with the name and the explicit downstream-tool references, an agent can distinguish this from particle_alert_list 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 Guidelines4/5

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

Gives concrete usage cues: use view=detailed for transcript excerpts, use after/before to scope a date range, and notes which sibling tools the returned slugs feed. It stops short of explicitly saying when not to use it or contrasting it with particle_alert_list, so it's clear context rather than full when/when-not routing.

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

particle_alert_previewParticle Alert PreviewAInspect

Preview how often an alert would fire BEFORE creating it. Sweeps the past N days (default 7, max 30) for the given entity (or keyword, for kind=KEYWORD_MENTION) and returns the total match count, a per-day breakdown, and a small sample of the most recent matches with episode context. Use this to size an alert (REALTIME vs DAILY vs WEEKLY cadence) or to confirm the entity slug watches the right thing, then call particle_alert_create with the same entity slug (for KEYWORD_MENTION, the same keyword instead). Pass the same filters you plan to save so the estimate matches what the alert would surface — the languages and speaker_roles axes narrow the sweep; relevance and source_popularity are read-time projections that don't, so the count is an upper bound when relevance=RELEVANT. Starts a background sweep and caches its progress and results; it does not create an alert or send notifications.

NameRequiredDescriptionDefault
kindNoSignal to preview. Defaults to ENTITY_MENTION.
filtersNoSame as particle_alert_create.filters. Pass the filters you intend to save so the estimate reflects what the alert would actually surface. languages, speaker_roles, source_popularity and speaker_statement_characteristics narrow the historical sweep exactly as they narrow new matches; relevance is graded only on new matches, so setting it leaves the count unchanged (the estimate is an upper bound when relevance=RELEVANT).
keywordNoSame as particle_alert_create.keyword — required for KEYWORD_MENTION. A phrase that matched more than 700 podcast episodes in the past week is rejected as too broad, as on create.
entitiesNoThe entity to preview, as a single slug (from the resolve tools), same as particle_alert_create.entities — exactly one for entity kinds, omitted for KEYWORD_MENTION.
window_daysNoHow many days back to sweep (1-30, default 7).
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.6/5.0
Behavior4/5

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

Adds meaningful behavior beyond the annotations: it is asynchronous ('Starts a background sweep and caches its progress and results'), it does not create an alert or notify anyone, and relevance=RELEVANT makes the count an upper bound. That last point is genuinely load-bearing for interpreting the number returned. It stops short of covering cost/latency or what happens on repeated calls, so it is not a full 5.

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

Conciseness4/5

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

Front-loaded with the core purpose and the create-follow-up in the first three sentences, with per-parameter caveats after. It is on the long side and restates some schema content (the narrowing-versus-projection detail appears both here and in the filters schema), so a little trimming is possible without losing 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?

With no output schema, the description carries the return-value burden and does so: total match count, per-day breakdown, and a sample of recent matches with episode context. Combined with the async/caching disclosure and the create-then-verify workflow, an agent has enough to call it and interpret the result correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a non-obvious semantic distinction the schema only partially states: languages and speaker_roles narrow the sweep while relevance and source_popularity are read-time projections that do not, making the count an upper bound under relevance=RELEVANT. It also flags the window default/max in prose, though much of the per-parameter guidance duplicates the already detailed 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?

Opens with a specific verb-plus-resource and an explicit temporal qualifier: 'Preview how often an alert would fire BEFORE creating it.' It then enumerates exactly what the sweep returns (total count, per-day breakdown, recent-match sample with episode context), which an agent cannot confuse with particle_alert_create or particle_alert_get.

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?

States the two concrete use cases ('size an alert (REALTIME vs DAILY vs WEEKLY cadence)' or 'confirm the entity slug watches the right thing') and names the follow-up sibling: 'then call particle_alert_create with the same entity slug'. It also instructs passing the same filters so the estimate matches the saved alert, and explicitly scopes the tool out of creating alerts or sending notifications.

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

particle_alert_updateParticle Alert UpdateA
Destructive
Inspect

Update an existing alert. Only the fields you pass change; the entities and notifications lists, when provided, replace the whole set (pass a single entity slug from the resolve tools, same as particle_alert_create — an alert watches exactly one entity). A KEYWORD_MENTION alert takes a new keyword instead of entities. Use is_active to pause or resume an alert without deleting it. An alert's kind is fixed at creation — to change it, create a new alert.

Notification changes affect future recurring email delivery to external recipients; resuming an alert restarts delivery to its configured destinations. Alert emails follow delivery_cadence until paused or deleted. Only recipients verified for your organization receive alert emails; pending recipients may be saved but stay silent until verified.

The optional filters object replaces the alert's filter set wholesale — omit to leave the existing filters unchanged, send {} to clear all filters. Same axes as particle_alert_create.filters: languages, relevance (EVERYTHING/RELEVANT), source_popularity (ANY/POPULAR), speaker_roles (PODCAST_SPEAKER alerts only — sending it on an ENTITY_MENTION alert returns unprocessable_entity), and speaker_statement_characteristics (ENTITY_MENTION alerts only; it applies to matches detected after the update).

Alerts are not covered by zero data retention: the alert's definition and its matched results are stored as part of the alerts feature.

NameRequiredDescriptionDefault
titleNoNew title.
filtersNoReplace the alert's filter set wholesale. Omit to leave the existing filters unchanged; send an empty object {} to clear all filters. Same four axes as particle_alert_create.filters (languages, relevance, source_popularity, speaker_roles).
keywordNoReplacement phrase for a KEYWORD_MENTION alert; omit to leave it unchanged. Not accepted on other kinds. Matches already recorded keep the phrase they fired on.
alert_idYesAlert id to update.
entitiesNoReplacement watch target as a single entity slug (from the resolve tools). When provided, replaces the entire existing watch list — exactly one entity; omit to leave entities unchanged. Not accepted on KEYWORD_MENTION alerts.
is_activeNoPause (false) or resume (true) the alert.
descriptionNoNew description.
notificationsNoReplacement recipients for recurring alert emails. Only recipients verified for your organization receive alert emails; pending recipients stay silent until verified. When provided, replaces the entire existing set; omit to leave them unchanged.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
delivery_cadenceNoNew delivery cadence.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already flag this as destructive, non-read-only and open-world, and the description adds real context beyond them: wholesale replacement of entities/notifications, the fact that filter objects replace rather than merge, ZDR exclusion, kind-dependent unprocessable_entity errors, and email verification gating. However, it never states what the response looks like or whether the caller can see prior values before overwriting a set — gaps that matter for a destructiveHint mutation.

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

Conciseness3/5

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

Well front-loaded, but long and partly redundant: the filters paragraph restates the speaker_roles / speaker_statement_characteristics restrictions that already appear verbatim in the schema descriptions. The delivery/verification paragraph repeats the `notifications` param description. Tightening would preserve meaning with less duplication.

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?

Covers the tricky parts an agent needs for a 10-param destructive mutation with nested objects: replacement semantics, kind constraints, pause semantics, filter clearing, and error conditions. Missing only the return shape (no output schema exists) and whether alert_id is org-scoped, which keeps it from a 5.

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 already 100%, so the baseline is 3; the description earns extra credit by adding cross-parameter semantics the schema cannot express — keyword vs entities mutual exclusivity by alert kind, {} clearing filters, and is_active meaning pause/resume rather than delete. It does repeat a fair amount of the schema's own enum/filter prose, which caps it below 5.

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?

Opens with a specific verb+resource ('Update an existing alert') and immediately clarifies the lifecycle boundary against particle_alert_create ('an alert's kind is fixed at creation — to change it, create a new alert'). An agent can distinguish update from create/delete/get/list without consulting any schema.

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

Usage Guidelines5/5

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

Explicitly states partial-update semantics ('Only the fields you pass change'), which params replace wholesale, and the kind-specific rule that KEYWORD_MENTION takes `keyword` while entity alerts take `entities`. It also routes the agent to particle_alert_create for kind changes and names resolve tools for slugs.

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

particle_callParticle CallA
Destructive
Inspect

Dispatch any public Particle tool by name. Compatibility fallback for harnesses that block calling tools that weren't advertised on tools/list — every public Particle tool is executable by name, so prefer calling discovered tools directly when your harness allows it. Identical metering and plan gating apply either way. Use particle_catalog to discover tool names and input schemas. A tool particle_catalog lists but your tools/list lacks (client lists go stale after a deploy) is callable here: never report it unavailable.

NameRequiredDescriptionDefault
toolYesFlat name of any public Particle tool (e.g. 'particle_podcast_get_episode'). Discover names and schemas with particle_catalog.
argumentsNoArguments object for the target tool, matching its input schema.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, and the description does not contradict them. It adds context the annotations cannot express: that metering and plan gating apply identically to direct calls, and that client tool lists go stale after a deploy. It stops short of noting that the destructive/read-only profile is inherited from the target tool, which would be the natural next clarification.

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

Conciseness4/5

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

Front-loaded with the core purpose, then the fallback rationale, then the discovery pointer and the stale-list instruction. Efficient overall, though the opening sentence and 'every public Particle tool is executable by name' partially restate each other.

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 nested-argument dispatcher with no output schema, the description covers how to find valid tool names and schemas, what billing/gating applies, and the stale-catalog edge case. The one unstated piece is that the response mirrors the target tool's own output, which an agent could reasonably wonder about.

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 properties are documented, including an example name and the instruction that 'arguments' must match the target tool's input schema. The description reinforces the discovery path via particle_catalog but adds no syntax or format detail beyond the schema, 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?

States a specific verb and resource: 'Dispatch any public Particle tool by name.' The description immediately positions it as a compatibility fallback rather than a normal tool, which cleanly distinguishes it from the concrete siblings like particle_podcast_get_episode and from the discovery sibling particle_catalog.

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?

Gives explicit when-to-use ('harnesses that block calling tools that weren't advertised on tools/list'), when-not ('prefer calling discovered tools directly when your harness allows it'), the discovery alternative ('Use particle_catalog to discover tool names and input schemas'), and an explicit instruction on the stale-list case ('never report it unavailable'). Nothing is left to inference.

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

particle_catalogParticle CatalogA
Read-only
Inspect

Browse the full Particle tool catalog. Your tools/list shows only the default categories, but EVERY public Particle tool is callable by name regardless of what was advertised — call this tool to discover the rest.

Without arguments: the categorical menu (every category with tool names, one-line summaries, and an ↳ line listing each tool's expand options). With category: the full input schema for each of that category's tools, ready to call.

Two conventions the one-line summaries don't convey, so read tools through this lens:

  • Tools are lean by default and EXPAND. Most return a minimal payload and opt into richer sections via an include array (e.g. a company's people, products, and competitors; a person's roles and podcast appearances) or change behavior via a mode/format switch. The ↳ line names these — a tool does far more than its summary alone implies.

  • Responses are a graph; slugs are edges. A slug a tool returns (person, company, podcast, episode, publisher, guest) is a valid input to the other tools, so you resolve once and then traverse: company → its people → a person's podcast appearances → that episode's transcript and every entity in it.

Categories on offer:

  • system (always-on): Discovery meta-tools: browse the full tool catalog and call any tool by name.

  • podcasts (default): Resolve podcasts, list and fetch episodes, search transcripts, and find entity mentions.

  • people (default): Resolve people and entities to canonical handles and fetch person profiles.

  • companies (default): Resolve companies and fetch company profiles with people, products, and competitors.

  • topics (default): Browse the hierarchical topic taxonomy used to classify podcast episodes.

  • podcast_rankings (default): Podcast chart rankings: current charts, movers, and ranking history.

  • podcast_trends (default): Trending entities on podcasts: daily entity charts with movement and the quote behind it.

  • podcast_guests (default): Podcast guest directory, trending guests, and per-guest appearance profiles.

  • podcast_advertising (opt-in): Podcast advertising intelligence: sponsor rosters, ad presence, and sponsor leaderboards.

  • podcast_publishers (opt-in): Podcast publisher profiles with their shows, bias profile, and suitability profile.

  • podcast_ratings (opt-in): Listener review ratings for podcasts: summaries and recent rating lists.

  • podcast_bias (opt-in): Corpus-wide political-bias views: publisher leaderboards and publishers by bias result.

  • podcast_suitability (opt-in): Corpus-wide GARM brand-suitability views: publisher leaderboards and category exposure.

  • alerts (default): Create and manage alerts that watch entities for podcast mentions or speaker appearances, preview match frequency, and review the matches an alert has caught.

  • radar (opt-in): Display selected research results as embedded Radar cards, with a Markdown fallback. Rendering is free and does not fetch data.

Opt-in categories can also be advertised on tools/list by adding ?include=<category> (comma-separated, or all) to the connection URL, or the X-Particle-Include header. ?exclude= hides default categories; ?tools=<name,...> pins the advertised list to exact tools instead. Discovery is free; tool execution is metered and plan-gated as usual.

NameRequiredDescriptionDefault
categoryNoExposure category name (e.g. 'podcast_bias'). When set, the response includes the FULL input schema for every tool in that category — call this before invoking a tool you haven't seen advertised. When omitted, returns the categorical menu: every category with its tools and one-line summaries.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/non-destructive/closed-world, yet the description still adds substantial behavior: discovery is free while execution is metered and plan-gated, and the catalog payload carries the `↳` expand-option line. It could go one step further on how large the no-argument menu response is, but the cost and response-shape context is well beyond what annotations provide.

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

Conciseness4/5

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

The leading paragraph front-loads the core insight (unadvertised tools are callable) before any detail, and the two convention bullets genuinely earn their space. The full category enumeration is somewhat redundant since the tool itself returns that menu, which costs it a point.

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 two-parameter, zero-required discovery tool with annotations covering the safety profile, the description covers what both modes return, the metering model, and the traversal model an agent needs to use the catalog effectively. Nothing about calling 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?

Schema description coverage is 100% and both parameter descriptions already cover the category-vs-menu behavior and the markdown/json tradeoff, so the schema carries this dimension. The description's added detail is really cross-catalog convention (include arrays, mode/format switches) rather than meaning for these two parameters, which is helpful context but not parameter semantics.

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 ('Browse the full Particle tool catalog') and immediately explains the distinguishing premise: tools/list is incomplete, but every public tool is callable by name. It differentiates itself from the sibling meta-tool particle_call by being the discovery half of that pair.

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 branching on when to call with no arguments (categorical menu) vs with `category` (full input schemas), plus the derived rule 'call this before invoking a tool you haven't seen advertised.' It also names the alternatives for getting the same information (?include=, ?exclude=, ?tools= URL params), so the agent can choose the right path.

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

particle_company_getParticle Company GetA
Read-only
Inspect

Return a bundled profile for one company: identifiers (slug, ticker, domain, CIK, QID, linked entity), name, and description.

Request optional sections via include: 'people' for current leadership and notable people (person slugs feed particle_person_get), 'products' for the three-level product hierarchy, 'competitors' for the competitor list, 'external_links' for the company's LinkedIn, social profiles, domain, Wikidata QID, SEC CIK and tickers. The default response is lean — include only what you need.

For sponsor/advertising analytics on this company, use particle_company_get_podcast_ad_presence instead.

NameRequiredDescriptionDefault
includeNoOptional response sections: 'people' (current leadership and notable people), 'products' (three-level product hierarchy), 'competitors' (competitor list), 'podcast_recommendations' (the ten podcasts the company could advertise on next, with the shows it already buys that led there; premium), 'external_links' (LinkedIn, social profiles, domain, Wikidata QID, SEC CIK and tickers). Default response is lean — request only what you need.
company_slugYesCompany identifier — accepts slug (e.g. 'nvidia'), domain (e.g. 'nvidia.com'), or canonical ID. If you already know the domain you can call this tool directly without first running particle_company_resolve.
product_statusNoComma-separated lifecycle filter for include=products (e.g. 'active' or 'active,announced'). Allowed values: active, announced, discontinued, rumored. Defaults to 'active'.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly, non-destructive, open-world), and the description adds useful context: the default response is lean and sections are opt-in, with a note that person slugs feed particle_person_get. Doesn't discuss rate limits, auth, or premium gating beyond the schema, so slightly short of 5.

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?

Two tight paragraphs, front-loaded with the default response shape, then the include options, then routing to the alternative. Slightly dense but every sentence carries weight.

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 read-only profile fetch with full schema coverage and no output schema, the description fully explains what returns by default, how to expand it, and where to go for adjacent data. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so baseline is 3; the description elevates by explaining the relationships between parameters — that `include` sections chain into particle_person_get and that `product_status` filters include=products. Minor gap: doesn't restate the product_status lifecycle values, but the schema does.

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 (Return) and resource (bundled profile for one company), enumerating exactly what fields come back (slug, ticker, domain, CIK, QID, name, description). Explicitly distinguishes itself from particle_company_get_podcast_ad_presence for ad analytics.

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?

Gives explicit when-to-use-the-alternative guidance ('For sponsor/advertising analytics... use particle_company_get_podcast_ad_presence instead'), notes it can be called directly with a domain without first running particle_company_resolve, and advises 'request only what you need.'

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

particle_company_get_statement_characteristicsParticle Company Get Statement CharacteristicsA
Read-only
Inspect

How a company's people speak on podcasts, together, and how that moves over time: the share of their lines that are negative, neutral or positive; hedged, neutral or confident; vague, neutral or specific; and about the past, present or future, overall and per week or month (the last year by default), with how many of the people said them. Use it for 'how confident do OpenAI's people sound lately' or 'are Microsoft's executives talking more about the future'. Pass include=['examples'] for each bucket's strongest line per outer label, with who said it (a person_slug for particle_person_get_statement_characteristics), the episode and a link that plays the moment.

The people are the ones particle_company_get lists with include=['people']: current roles by default, past ones too with include_past_roles. Shares are of their scored lines (lines too short to read carry no characteristics); low_sample marks fewer than 20 behind a share. For one person, use particle_person_get_statement_characteristics. Resolve the company first with particle_company_resolve.

NameRequiredDescriptionDefault
includeNoOptional sections: 'examples' adds each bucket's strongest line for every outer label (negative/positive, hedged/confident, vague/specific, past/future) with its episode and a link that plays it. Lean by default.
intervalNoBucket width (default month). Weeks start on Monday (UTC).
company_slugYesCompany identifier — slug from particle_company_resolve (e.g. 'microsoft'), domain (e.g. 'microsoft.com'), or canonical ID.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
published_afterNoStart of the window (ISO 8601 date or date-time). Defaults to a year before published_before.
published_beforeNoEnd of the window: a bare date includes that whole UTC day. Defaults to now.
include_past_rolesNoCount people in past roles at the company too. By default only the people in a current role count.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses the default window (last year, weekly/monthly buckets), what population is counted (current roles only unless include_past_roles), that shares are of scored lines with short lines excluded, and that `low_sample` flags fewer than 20 underlying lines. Those sampling caveats are exactly the kind of trait an agent needs to interpret the numbers honestly.

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 and example queries are front-loaded, and the two follow-up paragraphs cover population and caveats rather than restating the name. It is dense and long for a tool description — the examples paragraph could be trimmed — but nearly every sentence carries usable information.

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 analytical tool with no output schema, the description explains what the payload contains (shares per bucket per interval, speaker counts, low_sample flags) and how to enrich it with examples. It stops short of describing the response's structural shape, but the default markdown rendering and schema docs cover most of that gap.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds real meaning on top by explaining that include=['examples'] returns a strongest line per bucket with a `person_slug` usable in the person sibling, plus an episode and a playable link. It also clarifies the population semantics tied to include_past_roles, though it doesn't touch interval or output_format beyond what the schema already says.

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 framing — 'how a company's people speak on podcasts' broken into negativity, hedging, vagueness, and time orientation — and immediately names the exact metrics returned. It distinguishes itself sharply from the sibling `particle_person_get_statement_characteristics` by scoping to a whole company's people rather than one person.

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 gives concrete trigger questions ('how confident do OpenAI's people sound lately', 'are Microsoft's executives talking more about the future'), names the single-person alternative, and states the prerequisite of resolving the company first with `particle_company_resolve`. Both the when-to-use and the when-not-to-use path are explicit.

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

particle_company_resolveParticle Company ResolveA
Read-only
Inspect

Resolve a company by free-text name, ticker, SEC CIK, Wikidata QID, or domain. Returns candidates with the agent-facing identifier (slug, falling back to domain or id) you should pass to particle_company_get, particle_company_get_podcast_ad_presence, particle_podcast_find_mentions (as company_slug), or particle_podcast_list_episodes.

At least one identifier is required. Multiple are ANDed together — useful for disambiguating (e.g. ticker plus a name hint). For people or other knowledge-graph entities (not companies) use particle_entity_resolve instead.

NameRequiredDescriptionDefault
cikNoSEC Central Index Key (e.g. '0000320193'). Comma-separated for bulk.
qidNoWikidata QID (e.g. 'Q312'). Comma-separated for bulk.
limitNoMaximum candidates to return (1-25, default 5).
queryNoFree-text company name (case-insensitive). Use for human-typed names.
domainNoCompany website domain (e.g. 'apple.com'). Comma-separated for bulk.
tickerNoStock ticker symbol (e.g. 'NVDA', 'AAPL'). Comma-separated for multi-ticker lookup.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, openWorldHint, destructiveHint=false), so the bar is lower. The description still adds real context beyond them: the call returns multiple candidates and the identifier to carry forward (`slug`, with `domain`/`id` fallback). It does not discuss candidate ranking, ambiguity handling, or rate limits, which keeps it short of a 5.

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-loads the input forms and the return contract in the first sentence, then uses a short second paragraph for the AND-composition rule and the sibling redirect. No filler or restatement of the parameter list.

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

Completeness5/5

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

With no output schema, the description carries the return-value burden and does so by naming the candidate payload and the field to forward. Combined with the requiredness and ANDing rules, an agent has everything needed to call this tool and chain its result correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description contributes two facts the schema does not encode: that at least one identifier is mandatory (the schema lists zero required parameters) and that multiple identifiers are ANDed rather than ORed. These meaningfully change how an agent composes a call.

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

Purpose5/5

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

States a specific verb (resolve) and resource (company) plus the exact accepted identifier forms (name, ticker, CIK, QID, domain). It also distinguishes itself from the adjacent resolvers by explicitly routing people/other KG entities to `particle_entity_resolve`, so an agent can pick it without opening any schema.

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

Usage Guidelines5/5

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

Gives a hard precondition ('At least one identifier is required'), tells the agent identifiers are ANDed for disambiguation, and names the alternative sibling (`particle_entity_resolve`) for non-company entities. It even lists which downstream tools consume the returned identifier, which is actionable routing guidance.

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

particle_entity_getParticle Entity GetA
Read-only
Inspect

One knowledge-graph entity's profile: name, kind, description, and Wikipedia link. Use it to confirm what a slug from particle_entity_resolve actually refers to — especially for the long tail that isn't a person or company (places, organizations, events, products, concepts).

When the entity is a linked person or company the response carries the person_slug / company_slug — prefer particle_person_get / particle_company_get for those, which return the full profiles. Entity slugs feed particle_podcast_find_mentions, particle_podcast_get_episode_timeseries, and the alert tools.

NameRequiredDescriptionDefault
entity_slugYesKnowledge-graph entity slug or encoded ID from particle_entity_resolve, episode entity listings, or mention payloads (e.g. 'germany', 'bitcoin').
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.5/5.0
Behavior4/5

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

With readOnlyHint/destructiveHint already covering the safety profile, the description adds valuable payload context: the response carries person_slug/company_slug when the entity is linked, which is behavior the annotations do not convey. It stops short of describing pagination or error behavior, but for a read-only lookup this is a solid addition.

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?

Purpose and field list are front-loaded in the first clause, followed by the disambiguating condition and then downstream wiring. Every sentence carries distinct information with no filler.

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

Completeness5/5

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

For a two-parameter, read-only lookup with no output schema, the description covers what is returned, when to prefer it, when to prefer siblings, and where its slug input and output connect. Nothing material 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 coverage is 100%, and both parameters (entity_slug, output_format) are fully documented in the schema, so this is baseline. The description adds provenance for entity_slug (from particle_entity_resolve, episode listings, mention payloads) but no additional format or syntax detail beyond what the schema already states.

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 ('One knowledge-graph entity's profile') and enumerates the fields returned (name, kind, description, Wikipedia link). It distinguishes itself from siblings by naming particle_person_get/particle_company_get as the preferred tools for linked persons and companies.

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?

Gives explicit when-to-use ('confirm what a slug from particle_entity_resolve actually refers to') and identifies its niche ('the long tail that isn't a person or company'). It names the alternatives and the condition that selects them, plus the downstream tools whose input it feeds.

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

particle_entity_resolveParticle Entity ResolveA
Read-only
Inspect

Resolve any named thing — person, company, place, or other entity — by free-text name in one union search. Each candidate carries a type and the canonical slug for that type:

  • person: the canonical person slug. Feed it into particle_person_get, every person_slug parameter (particle_podcast_find_mentions, particle_podcast_search_transcripts, particle_podcast_list_episodes), or particle_podcast_get_guest's guest_slug.

  • company: the canonical company slug. Feed it into particle_company_get and every company_slug parameter.

  • place/other: a bare entity slug. Feed it into the entity_slug parameter on particle_podcast_find_mentions, particle_podcast_search_transcripts, and particle_podcast_list_episodes to filter by that entity.

Use this first whenever you only have a name and don't know what kind of thing it names. If you already know it's a person, particle_person_resolve ranks people only; for companies with a known ticker, domain, CIK, or QID, particle_company_resolve has more identifier surface.

For bulk resolution, pass a comma-separated query (e.g. "sam altman, nvidia, davos") — each name is resolved independently in a single call and limit applies per query.

NameRequiredDescriptionDefault
limitNoMaximum candidates per query (1-10, default 5).
queryYesFree-text name(s) of a person, organization, place, or company to resolve (e.g. 'sam altman', 'nvidia'). Case-insensitive. Comma-separated for bulk lookup (e.g. 'sam altman, kara swisher, marc andreessen') — each query is resolved independently and grouped in the response.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/non-destructive, so the safety profile is covered. The description adds real behavioral value: each candidate carries a `type` and canonical `slug`, and it maps each type's slug to the downstream parameters that consume it, which is more than the annotations convey.

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

Conciseness4/5

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

Front-loaded with the core purpose, then a scannable type-to-slug bullet list and a bulk-resolution note. Slightly long, but nearly every sentence carries routing information an agent needs, so there is little waste.

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 annotations covering safety and no output schema to worry about, the description supplies the missing return-shape context (candidates carry `type` and canonical `slug`) and how to consume those slugs downstream. Nothing an agent needs to call it correctly is absent.

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 coverage is 100%, so both `query` and `limit` are already fully documented, including comma-separated bulk semantics and per-query grouping. The description largely repeats that and only marginally adds the per-query behavior of `limit`, so 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?

States a specific verb ("resolve") and resource ("any named thing — person, company, place, or other entity") in one union search, and explicitly distinguishes itself from particle_person_resolve and particle_company_resolve. An agent can select this tool without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit routing rule ("Use this first whenever you only have a name and don't know what kind of thing it names") plus the conditions selecting the alternatives: person_resolve when the type is known, company_resolve when ticker/domain/CIK/QID are known. Bulk-query usage is also spelled out.

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

particle_expertise_getParticle Expertise GetA
Read-only
Inspect

Describe one occupation or field of research and, on request, who is booked under it: its parent, children and crosswalk by default; include: ["top_guests"] ranks the guests listed under it by podcast appearances in a window (default the last 30 days, at most 90), and include: ["top_podcasts"] ranks the shows that booked them. standing="established" ranks only credentialed or recognized experts — "the shows that book established finance experts" is field plus top_podcasts plus standing. A broad code covers everything below it.

Take codes from particle_expertise_resolve, which turns free text ("doctors", "finance") into them; on unresolved_reference or not_found, resolve and retry. Guest slugs work with particle_person_get (include: ["expertise"]) and particle_podcast_get_guest; podcast slugs with every podcast tool.

For a multi-criteria guest search (practicing, seniority, capacity, employer, all-time) use particle_podcast_list_guests; for one show's guest mix use particle_podcast_resolve with include: ["guest_expertise"].

NameRequiredDescriptionDefault
fieldNoA field of research's ANZSRC 2020 code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment'). Pass exactly one of occupation or field.
limitNoRows per top_ section (1-25, default 10).
sinceNoWindow start for the top_ sections (YYYY-MM-DD). Defaults to 30 days before until; the window may span at most 90 days.
untilNoWindow end for the top_ sections (YYYY-MM-DD, inclusive). Defaults to now.
includeNoOptional sections: 'top_guests' (the guests in the code most booked in the window, with appearances, shows and last appearance) and 'top_podcasts' (the shows that booked the code's guests most). Default is the code with its parent, children and crosswalk.
standingNoRank only guests whose standing is recognized this way (e.g. 'established' for credentialed experts). Applies to the top_ sections.
min_guestsNotop_podcasts keeps shows that booked at least this many distinct guests in the code in the window (default 1).
occupationNoAn occupation's SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists'). Pass exactly one of occupation or field.
min_podcastsNotop_guests keeps guests seen on at least this many distinct shows in the window (default 1); raise it to favor guests booked across the medium over a show's regulars.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the read-only/open-world safety profile, and the description adds substantial operational context: the default vs. opt-in section behavior, the 30-day default window capped at 90 days, how standing filters ranking, and the markdown-vs-json tradeoff ('JSON shape is larger and noisier for an LLM to read').

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

Conciseness4/5

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

Front-loaded with the core purpose, then routing, then alternatives — each paragraph carries distinct information and nothing is filler. It is dense with parentheticals and slightly long, but every clause earns its place.

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

Completeness5/5

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

For a 10-param, no-output-schema tool, the description covers defaults, constraints, opt-in return contents ('with appearances, shows and last appearance'), and disambiguation from four sibling tools. An agent has everything needed to call it correctly without opening 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?

Schema coverage is 100%, so the baseline is 3; the description still adds real meaning on top of the schema, e.g. min_podcasts 'raise it to favor guests booked across the medium over a show's regulars' and the window cap semantics. It stops short of exhaustively explaining every param, but the value-add is genuine.

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 ('Describe one occupation or field of research') plus what the default response contains (parent, children, crosswalk) and what opt-in sections add. It is immediately distinguishable from siblings like particle_expertise_resolve (which produces codes) and particle_person_get (which consumes slugs).

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 routes the agent: take codes from particle_expertise_resolve, retry on unresolved_reference/not_found, use particle_podcast_list_guests for multi-criteria guest search, and particle_podcast_resolve with include:['guest_expertise'] for one show's guest mix. It even names the exact invocation pattern for a common query ('the shows that book established finance experts').

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

particle_expertise_resolveParticle Expertise ResolveA
Read-only
Inspect

Turn free text into the occupation and field-of-research codes the speaker-expertise filters take. When a question restricts who is speaking by occupation, profession, credentials or industry ("doctors", "medical professionals", "economists", "people in finance", "lawyers"), the filters, not search wording, decide who speaks. guest_occupation takes the everyday word itself, so the first search can carry it without waiting for this tool: call it to see or choose among the codes, and when a filter returns unresolved_reference, then retry with the code. Codes are SOC 2018 occupations (with their ISCO-08 equivalents) and ANZSRC 2020 fields of research. 'cardiologist' finds SOC 29-1212 Cardiologists; 'finance' finds the finance fields. Each code comes back with its slug, level, parent and the parameters that accept it: occupation/field on particle_podcast_list_guests and particle_expertise_get, and guest_occupation/guest_field on particle_podcast_find_mentions, particle_podcast_list_episodes, particle_podcast_search_transcripts, particle_podcast_get_episode_timeseries and particle_podcast_resolve. Pass parent to walk the hierarchy one level down (a SOC major group's minor groups, then broad groups, then occupations; a division's groups); a group such as physicians or an everyday name such as doctors filters everything below it. A word no occupation names may name a field (oncologists finds field 3211 Oncology) or a capacity: founders comes back as the capacity executive_founder, which capacity on particle_podcast_list_guests and guest_capacity on the episode and mention tools take.

Not for people or companies — use particle_person_resolve, particle_company_resolve or particle_entity_resolve. Not the topic taxonomy either: particle_topic_browse classifies what episodes are about, these codes classify what speakers know.

NameRequiredDescriptionDefault
limitNoMaximum codes to return (1-25, default 5).
queryNoFree text naming an occupation or a field of research (e.g. 'cardiologist', 'financial analyst', 'constitutional law'). Singular or plural; words match by prefix. Omit with parent to list that code's children, or omit both to list the top level.
parentNoA code, slug or title whose children to list (e.g. '29-0000' for the healthcare occupations, or '38' for economics). With query, searches only below it.
standardNoWhich codes to search: 'occupation' (SOC 2018, with ISCO-08 equivalents), 'field' (ANZSRC 2020 fields of research), or 'any' (default) for both.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the read-only/non-destructive annotations, the description discloses the code systems in use (SOC 2018, ISCO-08, ANZSRC 2020), the returned fields per code, hierarchy traversal behavior, and the fallback to capacities such as `executive_founder`. This is substantial behavioral context for a resolver tool with no 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.

Conciseness4/5

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

The purpose and usage guidance are front-loaded, and the dense content is largely relevant for a complex resolver. It is long and includes a lengthy cross-tool parameter list, but almost every sentence carries actionable 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?

There is no output schema, but the description explains the return structure at a useful level: each code comes with slug, level, parent, and the parameters that accept it. Combined with the annotations and the detailed schema, an agent has enough information to select, call, and chain this tool correctly.

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

Parameters4/5

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

Schema coverage is already 100%, so parameter documentation is strong. The description still adds useful semantics beyond the schema, especially for `parent`: walking the SOC/ANZSRC hierarchy one level down, and the fact that a group or everyday name filters everything below it.

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

Purpose5/5

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

The description opens with a precise verb and resource: 'Turn free text into the occupation and field-of-research codes the speaker-expertise filters take.' It explicitly distinguishes this resolver from person/company/entity resolvers and from the topic taxonomy, so an agent can identify its role 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?

It gives clear when-to-use guidance: questions that restrict speakers by occupation, profession, credentials or industry. It also explains when this tool is optional, when to retry after an `unresolved_reference`, and names the sibling resolvers to use instead for people, companies, or entities.

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

particle_person_getParticle Person GetA
Read-only
Inspect

Return a person's profile: name, current role, and bio, keyed by the canonical person slug from particle_person_resolve.

Request optional sections via include: 'external_links' for LinkedIn/Wikipedia/social profiles, 'podcast_appearances' for their most recent podcast appearances (episode and podcast slugs included for follow-up calls), 'companies' for the full role history, 'sports' for an athlete's or coach's current team (NFL, MLB and NHL rosters), sports, teams (with years and leagues) and leagues, with entity slugs for particle_entity_get (only the current team says where a player is today: a team with no end year may be one they left), 'expertise' for what they know and how established they are (standing, seniority, the occupations and fields they are listed under — codes that guest_occupation/guest_field and particle_expertise_get accept). The default response is lean.

For podcast-guest analytics (appearance stats, suitability exposure, co-appearance graph) use particle_podcast_get_guest with the same slug.

NameRequiredDescriptionDefault
includeNoOptional response sections: 'external_links' (LinkedIn, Wikipedia, social profiles), 'podcast_appearances' (recent podcast appearances with episode and podcast slugs), 'companies' (the full role history, current role included and marked), 'sports' (the current team of an NFL, MLB or NHL player, sports played, and teams played for or coached with years and leagues), 'expertise' (what they know and how established they are: standing, seniority, experience, the occupations and fields they are listed under with codes the guest_ filters accept, organization, credential). Default response is lean — request only what you need.
person_slugYesCanonical person slug from particle_person_resolve (e.g. 'sam-altman'), or the encoded person ID.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

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 openWorldHint=true, so safety is covered. The description adds genuinely useful behavior beyond that: the default payload is lean, sections are opt-in, `output_format='json'` is larger/noisier and meant for programmatic chaining, and it flags that only the current team reliably indicates where a player is today whereas a team with no end year may have been left.

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 core purpose and slug provenance are front-loaded in the first sentence, and the closing sentence routes analytics cleanly. The middle paragraph is a dense wall of text with run-on clauses (notably the 'sports' enumeration) and partially repeats the schema's `include` documentation, so it is informative but not maximally tight.

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 no output schema, the description carries the burden of describing returns and does so section-by-section, plus documents the lean default and serialization choice. It omits error/invalid-slug behavior and any rate or permission notes, but an agent has enough to call this 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 description coverage is 100%, so the baseline is 3. The description goes further by enumerating what each `include` value yields and cross-referencing downstream consumers (episode/podcast slugs for follow-up calls, entity slugs for `particle_entity_get`, occupation/field codes accepted by `guest_occupation`/`guest_field` and `particle_expertise_get`), though much of this overlaps the schema's own enum description.

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 concrete verb and resource ('Return a person's profile: name, current role, and bio') and pins the keying input to the canonical slug from `particle_person_resolve`. It also distinguishes adjacent capabilities by routing analytics to `particle_podcast_get_guest` and entity lookups to `particle_entity_get`, so an agent can separate it from siblings without opening schemas.

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

Usage Guidelines4/5

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

It gives clear routing: obtain the slug via `particle_person_resolve`, use `particle_podcast_get_guest` for guest analytics, and request only the `include` sections needed since the default response is lean. There are no explicit when-not-to-use conditions (e.g. when a resolve-only answer suffices), but the context for correct use is strong.

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

particle_person_get_statement_characteristicsParticle Person Get Statement CharacteristicsA
Read-only
Inspect

How a person speaks on podcasts, and how that moves over time: the share of their lines that are negative, neutral or positive; hedged, neutral or confident; vague, neutral or specific; and about the past, present or future, overall and per week or month (the last year by default). Use it for 'is Sam Altman more cautious than he used to be', 'how often does she make predictions', or 'how positive has he been lately'. Pass include=['examples'] for each bucket's strongest line per outer label, with episode slugs for particle_podcast_get_episode and a link that plays the moment.

Shares are of the person's scored lines (lines too short to read carry no characteristics); low_sample marks fewer than 20 behind a share. To find their lines said a certain way about a topic, use particle_podcast_search_transcripts with person_slug and speaker_statement_characteristics. Resolve the person first with particle_person_resolve.

NameRequiredDescriptionDefault
includeNoOptional sections: 'examples' adds each bucket's strongest line for every outer label (negative/positive, hedged/confident, vague/specific, past/future) with its episode and a link that plays it. Lean by default.
intervalNoBucket width (default month). Weeks start on Monday (UTC).
person_slugYesPerson slug from particle_person_resolve (e.g. 'sam-altman'), or the encoded person ID.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
published_afterNoStart of the window (ISO 8601 date or date-time). Defaults to a year before published_before.
published_beforeNoEnd of the window: a bare date includes that whole UTC day. Defaults to now.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses the scoring basis (shares are of the person's scored lines; too-short lines carry no characteristics), the low_sample flag threshold of 20, the default one-year window, and exactly what include=['examples'] adds, including episode slugs and a playback link.

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

Conciseness4/5

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

Front-loaded with the semantic meaning of the output, then mechanics, then routing to alternatives. Dense but mostly earns its space; the second paragraph packs several unrelated points (scoring caveat, alternative tool, resolve prerequisite) rather than sequencing them cleanly.

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

Completeness5/5

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

With no output schema, the description carries the return-shape burden and does so: it enumerates the bucket dimensions, the overall vs per-interval breakdown, the low_sample marker, and the structure of the optional examples section. An agent can call this correctly without further documentation.

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 already 100%, so the baseline is 3; the description earns extra by explaining why to add include=['examples'] and how its output chains into particle_podcast_get_episode. It also restates the default window behavior, though interval/output_format semantics are largely left to 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?

The description names a specific resource and scope: how a person speaks on podcasts, broken into sentiment, hedging, vagueness and temporal-orientation buckets, overall and per week/month. It is clearly distinguishable from siblings such as particle_podcast_get_episode_timeseries or particle_person_get, and it explicitly is not the transcript-search tool.

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 gives concrete trigger questions ('is Sam Altman more cautious than he used to be', 'how often does she make predictions'), names the alternative path (particle_podcast_search_transcripts with person_slug and speaker_statement_characteristics) for finding specific lines, and states the prerequisite of resolving the person first.

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

particle_person_resolveParticle Person ResolveA
Read-only
Inspect

Resolve a person by free-text name. Returns ranked candidates with the canonical person slug — the stable handle accepted by particle_person_get, by every person_slug parameter (particle_podcast_find_mentions, particle_podcast_search_transcripts, particle_podcast_list_episodes), and by particle_podcast_get_guest's guest_slug.

For bulk resolution, pass a comma-separated query — each name resolves independently in one call.

For organizations, places, or mixed/unknown entity kinds use particle_entity_resolve; for companies with a known ticker or domain use particle_company_resolve.

NameRequiredDescriptionDefault
limitNoMaximum candidates per query (1-10, default 5).
queryYesFree-text person name (e.g. 'sam altman'). Case-insensitive. Comma-separated for bulk lookup — each name is resolved independently and grouped in the response.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/non-destructive, so safety is covered. The description adds genuine context beyond them: that the output is a ranked candidate list rather than a single resolution, that the slug is a stable handle accepted by several named tools, and that bulk queries resolve independently and are grouped. It stops short of noting ambiguity/failure cases (e.g. what happens when nothing matches), which keeps it off a 5.

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?

Three sentences, no filler, each doing distinct work: what it returns, the bulk mode, and the disambiguation from siblings. The routing information is last, after the core behavior is front-loaded.

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

Completeness5/5

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

For a three-parameter read-only resolver with no output schema, the description covers result shape (ranked candidates + slug), bulk behavior, and sibling disambiguation. Nothing needed to call it correctly is missing.

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

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 contributes meaning the schema does not: that the slug returned is the value to pass into person_slug and guest_slug parameters, and that comma-separated queries are resolved independently and grouped. The limit and output_format semantics are left entirely to 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 and resource ('Resolve a person by free-text name') and immediately names the return shape: ranked candidates with the canonical person slug. It also distinguishes itself from particle_entity_resolve and particle_company_resolve by entity kind, so an agent can pick it without opening any schema.

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

Usage Guidelines5/5

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

Explicit routing rules: use this for persons, particle_entity_resolve for orgs/places/mixed, particle_company_resolve for companies with known ticker or domain. It also names the bulk pattern (comma-separated query) and the downstream tools that consume the returned slug.

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

particle_podcast_compare_share_of_voiceParticle Podcast Compare Share Of VoiceA
Read-only
Inspect

Compare how two to five companies, people or entities are spoken of on podcasts, side by side: "how is NVIDIA spoken of vs AMD vs Intel?" in one call. Each subject's mention lines over the same window (default the last 30 days, at most 365) are grouped by their label on one speaker statement characteristics axis — by="sentiment" (default), certainty, specificity or temporal_orientation — and each label's share is of that subject's scored mentions, the lines that carry labels. A subject with fewer than 20 is marked low sample: read its shares as examples. By default it counts guests' and panelists' lines; speakers="all" adds hosts.

Each subject is exactly what particle_podcast_get_share_of_voice returns for it with the same arguments and by set to the axis, so the numbers agree. breakdown splits each label group by a second axis (how sure each subject's predictions are is by="temporal_orientation", breakdown="certainty"); speaker_statement_characteristics counts only lines said a certain way; podcast_slug or publisher_slug narrows to one show or network.

Pass every subject in one list, in the order to show them: a subject that matches nothing, or has no knowledge-graph entity, is an error naming it, never a silent zero. Not for who says it by occupation (particle_podcast_get_share_of_voice, one subject at a time), for the lines themselves (particle_podcast_find_mentions with the same speaker_statement_characteristics), or for mention volume over time (particle_podcast_get_mention_trends).

NameRequiredDescriptionDefault
byNoThe axis whose labels each subject's lines are grouped by: 'sentiment' (default; how negatively or positively each is spoken of), 'certainty', 'specificity' or 'temporal_orientation'.
speakersNoWhose lines count: 'guests' (default; guests and panelists) or 'all' (hosts included).
breakdownNoAlso split each label group by a second axis: by='temporal_orientation' with breakdown='certainty' is how sure each subject's predictions are. Must differ from by.
include_adsNoCount mentions inside ad reads too. Off by default: ad copy is not a speaker's voice.
entity_slugsNoTwo to five knowledge-graph entity slugs from particle_entity_resolve for anything that isn't a person or company (e.g. ["germany", "france"]).
person_slugsNoTwo to five person slugs from particle_person_resolve, in the order to compare them (e.g. ["sam-altman", "dario-amodei"]).
podcast_slugNoOnly mentions inside this podcast (slug from particle_podcast_resolve).
company_slugsNoTwo to five company slugs or domains from particle_company_resolve, in the order to compare them (e.g. ["nvidia", "amd", "intel"]). One of company_slugs, person_slugs or entity_slugs is required.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
publisher_slugNoOnly mentions on podcasts of this publisher (network), by slug.
published_afterNoOnly episodes published on or after this date (YYYY-MM-DD). Defaults to 30 days before published_before; the window may span at most 365 days.
published_beforeNoOnly episodes published on or before this date (YYYY-MM-DD). Defaults to now.
speaker_statement_characteristicsNoCount only mentions said a certain way, for every subject: {"temporal_orientation": ["future"]} compares how each subject's predictions lean. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names.

TDQS

A4.8/5.0
Behavior5/5

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

Although annotations already mark this as a safe read-only operation, the description adds substantial behavioral context: default speaker inclusion, ad exclusion, low-sample marking under 20 scored mentions, error behavior for unmatched subjects, and exact agreement with the single-subject share-of-voice tool. This goes well beyond 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 long but front-loads the core purpose and example, then organizes details about defaults, grouping axes, errors, and alternatives. It is dense but mostly earns its length for a 13-parameter nested tool, though some repetition around grouping axes could be tightened.

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

Completeness5/5

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

For a complex 13-parameter tool with nested objects and no output schema, the description covers the important behavioral surface: scope, defaults, grouping, sample-size warnings, error semantics, and relationships to sibling tools. An agent has enough information to select and 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 description coverage is 100%, so the schema carries most parameter definitions. The description still adds useful semantics: subjects must be passed in one ordered list, at least one of company/person/entity slug lists is required, and `speaker_statement_characteristics` filters counted lines rather than just annotating them.

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 action — comparing how 2–5 companies, people, or entities are spoken of on podcasts side by side — with a concrete example. It clearly distinguishes the tool from the single-subject `particle_podcast_get_share_of_voice` by emphasizing the multi-subject comparison and aligned outputs.

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 describes when to use this tool and names alternatives for adjacent tasks: single-subject occupation breakdowns, raw mentions, and volume-over-time trends. It also gives clear conditions such as default 30-day window, maximum 365 days, and low-sample behavior.

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

particle_podcast_find_mentionsParticle Podcast Find MentionsA
Read-only
Inspect

Find dialogue lines where a specific person or company is named in podcast transcripts.

Three response modes

format="summary" (default, wide scan). Returns up to limit episodes (reverse-chronological), each with metadata + the first 10 mention-only lines (just the lines naming the entity, no surrounding dialogue). Use this to see what's been said across episodes and decide which episodes are worth reading in full. Paginate older episodes with cursor.

format="detail" (narrow drill-in). Requires episode_slug. Returns the full mention windows with context_lines of surrounding dialogue around each mention. Pass one slug for a single episode, or up to 10 comma-separated slugs (e.g. episode_slug="all-in-200,all-in-201,all-in-202") to multi-get several episodes in one call. limit/cursor don't apply.

format="compact" (screening). The same episodes as summary, each with its mention count, the strings it was mentioned as, and the segments carrying the mentions (id, title, type, first mention time) — no dialogue lines at all, the smallest shape. limit and cursor page it exactly as summary. Use it to fan out over many entities or a long date range and decide where to read; the segment ids are citations, and format="detail" with the episode slug reads the lines.

Workflow

Two patterns, depending on what you already know:

  • No specific episode in mind: call format="summary" first to scan, then call format="detail" with the slug(s) of the episodes worth reading in full. For most questions (sentiment, recurring themes, who said what when), summary alone has enough signal and the second call isn't needed.

  • Already have the episode slug (e.g. user mentioned the episode by name, or you have it from another tool like particle_podcast_get_episode or particle_podcast_search_transcripts): skip summary entirely and call format="detail" with episode_slug directly.

Examples

Wide scan, then drill in: User asks "what has All-In said about OpenAI recently?". Call format="summary", company_slug="openai", podcast_slug="all-in", since="2025-11-01", limit=20. Read the mention lines per episode; if 2-3 episodes have substantive discussion, call format="detail", episode_slug="slug1,slug2,slug3" for full context in one round-trip.

Direct drill-in: User says "In All-In #200 they discuss OpenAI's strategy — pull the full quotes". Call format="detail", episode_slug="all-in-200", company_slug="openai" directly — no summary needed.

Who said it

The guest_ filters keep only the mentions a matching guest spoke: guest_field="banking-finance-and-investment" with guest_standing="established" reads what established finance experts said about a company. When the question names who speaks ("doctors", "economists", "people in finance"), resolve the words with particle_expertise_resolve first and filter by the code; on unresolved_reference, resolve and retry rather than dropping the filter. A word no occupation names may name a capacity instead ("founders", "politicians"): pass it as guest_capacity. Each episode lists its identified speakers with their occupation codes, standing and seniority. For the split of all mentions across occupations or fields use particle_podcast_get_share_of_voice.

When NOT to use this tool

For dialogue that discusses a topic without naming a specific person or company (paraphrase-tolerant search), use particle_podcast_search_transcripts instead — that one ranks segments by relevance to a free-text query.

For how often the subject comes up, or which shows mentioned it this week versus last, use particle_podcast_get_mention_trends instead of paging this tool once per period; its podcast slugs come back here as podcast_slug to read what a show said.

Strongest first

With speaker_statement_characteristics, sort="strength" puts the episodes whose mentions carry the labels most clearly first: the most clearly negative takes on a company, the most confident predictions about a drug. This is the tool for the strongest lines about a subject; particle_podcast_search_transcripts refuses a subject without a topic and sends you here.

Required inputs

One of person_slug, company_slug, or entity_slug is required: person_slug for a person, company_slug for a company, entity_slug for any other knowledge-graph entity (places, organizations, events, concepts). Resolve a name to a slug first with particle_person_resolve, particle_company_resolve, or particle_entity_resolve. Slugs are case-insensitive on input.

How each line is said. Lines in topic and interview segments end with their speaker statement characteristics, pole labels only, e.g. _[positive · confident · future]_: sentiment (negative/positive), certainty (hedged/confident), specificity (vague/specific) and temporal orientation (past/future). A pole label means the line clearly reads that way; _[neutral]_ means it leans clearly on no axis; no brackets means the line was not read (short lines, intros, ad breaks). With output_format=json they are each line's speaker_statement_characteristics object, middle labels included.

Filtering by how a line is said. Pass speaker_statement_characteristics to keep only lines said a certain way: {"sentiment": ["negative"]} for criticism, {"specificity": ["specific"], "temporal_orientation": ["future"]} for concrete predictions, {"certainty": ["confident"], "sentiment": ["positive"], "temporal_orientation": ["future"]} for a high-conviction outlook. Put the topic, never the tone, in semantic_search. Every matched or mention line then carries labels the filter accepts.

Without a topic. On particle_podcast_search_transcripts, the filter alone with episode_slug, speaker or a guest_ filter (no semantic_search or keyword_search) returns the strongest lines said that way, at most 50, strongest first: an episode's boldest predictions, or a person's most confident claims. Their Match row reads characteristics. For the strongest lines naming a person, company or entity, pass the filter with sort: "strength" on particle_podcast_find_mentions instead.

NameRequiredDescriptionDefault
roleNoConstrain how the entity participates: guest, host, panelist, correspondent, or mention.
sortNoEpisode order. 'recency' (default) is newest first. 'strength' requires speaker_statement_characteristics and puts the episodes whose mentions carry those labels most clearly first (the most clearly negative takes, the most confident predictions), each episode's mentions strongest first. Pass the same sort with a cursor.
limitNoEpisodes per page (1-50, default 10). Summary and compact modes — detail returns one episode regardless.
sinceNoOnly episodes published on or after this ISO 8601 date (e.g. 2025-01-01).
untilNoOnly episodes published on or before this ISO 8601 date.
cursorNoOpaque pagination cursor from a previous summary or compact response's cursor field. Summary and compact modes.
formatNoResponse shape. 'summary' (default) returns many episodes (reverse chron) with metadata plus the first few mention-only lines per episode — use this to scan and pick episodes to drill into. 'detail' requires episode_slug and returns one episode's full mention windows with surrounding dialogue context. 'compact' returns the same episodes as summary with the mention count and the segments carrying the mentions (id, title, type, first mention time) and no dialogue — the smallest shape, for screening many entities before reading any.
languageNoRestrict to episodes of podcasts in this language — ISO 639-1 code (e.g. 'fr'). Matches the podcast's primary language subtag, so 'fr' covers 'fr-FR'.
entity_slugNoKnowledge-graph entity slug from particle_entity_resolve for the long tail that isn't a person or company — places, organizations, events, products, concepts (e.g. 'germany'). Use person_slug for people and company_slug for companies.
guest_fieldNoOnly mentions spoken by a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve.
person_slugNoPerson slug or encoded person ID from particle_person_resolve, particle_entity_resolve, or the guest tools (e.g. 'sam-altman'). One of person_slug, company_slug, or entity_slug is required.
company_slugNoCompany slug, domain, or canonical ID (e.g. 'nvidia' or 'nvidia.com'). Resolves to the company's linked entity.
episode_slugNoEpisode slug(s) or canonical ID(s). For format='detail', required: pass one slug for a single drill-in or up to 10 comma-separated slugs (e.g. 'all-in-200,all-in-201,all-in-202') for a multi-episode drill-in in one call. For format='summary' or 'compact', optional filter to one episode.
podcast_slugNoRestrict mentions to a single podcast by slug, internal ID, or numeric iTunes ID. A particle.pro or Radar show link also works.
context_linesNoSurrounding dialogue lines around each mention (1-20, default 2). Detail mode only — ignored in summary and compact.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
guest_capacityNoOnly mentions spoken by a guest who knows their field in this capacity (e.g. 'public_official' for politicians). particle_expertise_resolve names the capacity an everyday word means.
guest_in_fieldNoOnly mentions spoken by a guest speaking within their own field (the guest the other guest_ filters select, when given).
guest_standingNoOnly mentions spoken by a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.
guest_seniorityNoOnly mentions spoken by a guest at this seniority or above.
guest_occupationNoOnly mentions spoken by a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'financial-and-investment-analysts' or 'physicians'). A word with no occupation filters by the field of research or capacity it names: 'investors' is field 350208, 'politicians' is capacity public_official.
guest_practicingNoOnly mentions spoken by a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group.
speaker_statement_characteristicsNoKeep only mentions said a certain way. This tool takes no topic text: the subject is person_slug, company_slug or entity_slug, and HOW it is spoken of goes here: criticism, skepticism or bearish takes → sentiment negative; praise, optimism or bullish takes → sentiment positive; predictions or forecasts → temporal_orientation future (add specificity specific for concrete predictions); high conviction → certainty confident; hedging → certainty hedged; concrete claims → specificity specific. Who speaks goes in the guest_ filters. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names. Every mention line carries labels the filter accepts. Needs a subject with a knowledge graph entity: one matched only by name is refused. Example, criticism of the subject: {"sentiment": ["negative"]}. To narrow to a topic as well, call particle_podcast_search_transcripts with the subject's company_slug or entity_slug, the topic in semantic_search, and this filter.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral detail absent from annotations: pagination by cursor, per-mode scoping, how mention lines are labeled with poles, what happens on unresolved_reference, and that a name-only match is refused. However, roughly a fifth of the text drifts into describing how a sibling tool (search_transcripts) behaves rather than this tool, which dilutes rather than informs this tool's behavior.

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

Conciseness3/5

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

The purpose and mode selection are correctly front-loaded under clear headers, and the three-mode framing is a useful spine. But the definition is long and partly redundant, and the closing "Without a topic" section is largely an essay about particle_podcast_search_transcripts rather than this tool — content that does not earn its place in this definition.

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 23-parameter, nested-object, no-output-schema tool, the description covers everything an agent needs to call it correctly: how to resolve slugs, how the modes differ, how to build the characteristics filter, how guest filters combine, and how to page. Nothing material is left to inference.

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 documents each of the 23 parameters, and the baseline would be 3. The description still earns above baseline by explaining cross-parameter interactions the schema only states tersely: which mode makes episode_slug required, which modes honor limit/cursor/context_lines, that sort="strength" is only valid with speaker_statement_characteristics, and the resolve-first workflow for slugs and guest filters.

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

Purpose5/5

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

The opening line states a specific verb+resource+scope: "Find dialogue lines where a specific person or company is named in podcast transcripts." It is immediately distinguishable from the siblings that also touch transcripts (search_transcripts for topic discussion, get_mention_trends for frequency), and those distinctions are made explicitly later.

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

Usage Guidelines5/5

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

Explicit when-to-use guidance is given for all three modes, plus two worked workflow patterns keyed to what the agent already knows (slug in hand vs. wide scan). A dedicated "When NOT to use this tool" section names the two alternatives and the conditions that route to them, so the choice between find_mentions, search_transcripts and get_mention_trends is unambiguous.

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

particle_podcast_get_entity_chartParticle Podcast Get Entity ChartA
Read-only
Inspect

What is trending on podcasts: Particle's daily Trends charts, which rank the entities (people, shows, films, games, books, brands, athletes, teams) that the most podcasts are talking about, with each entry's movement since the previous edition and, when the editors explained it, why it moved, backed by a verbatim podcast quote and a link that plays it.

Call with no arguments for the cross-category all chart. Pick a narrower chart with chart (its schema lists every chart and the windows it publishes): entertainment (tv-series, movies, video-games), sports leagues (nfl, nba, ...), books (fiction, nonfiction, comics-manga), and guests, which ranks people by the distinct shows they appeared on. sort=acceleration surfaces the fastest risers anywhere in the chart.

Rank does not always follow the podcast count: most charts weigh how far an entry's coverage sits above its own normal level, so a lower count can rank higher.

Each entry returns a slug. Pass an entity slug to particle_entity_get, or to particle_podcast_get_mention_trends (entity_slug) for which podcasts drive it; pass a person slug to particle_person_get or particle_podcast_get_guest; pass a quote's episode id to particle_podcast_get_episode.

Not for podcast shows' own chart positions on Apple or Spotify: use particle_podcast_get_rankings. Not for one subject you already know: use particle_podcast_get_mention_trends.

NameRequiredDescriptionDefault
sortNo'rank' (default): the chart as published. 'acceleration': the whole edition reordered by how fast each entry's coverage is growing, fastest first, so a fast riser deep in the chart surfaces; each entry keeps its published rank. Not measured on the guests chart, which stays in rank order.
chartNoWhich chart to read. Defaults to 'all'. The charts, with their group and the windows each publishes: 'all-entertainment': All Entertainment (entertainment; 7d) 'tv-series': TV Series (entertainment; 7d, 24h) 'movies': Movies (entertainment; 7d, 24h) 'video-games': Video Games (entertainment; 7d, 24h) 'guests': Guest Appearances (overall; 7d, 24h) 'all': All Entities (overall; 7d) 'all-sports': All Sports (sports; 7d) 'nfl': NFL (sports; 7d, 24h) 'nba': NBA (sports; 7d, 24h) 'mlb': MLB (sports; 7d, 24h) 'nhl': NHL (sports; 7d, 24h) 'college-football': College Football (sports; 7d, 24h) 'wnba': WNBA (sports; 7d) 'college-basketball': College Basketball (sports; 7d) 'soccer': Soccer (sports; 7d) 'golf': Golf (sports; 7d) 'tennis': Tennis (sports; 7d) 'formula-1': Formula 1 (sports; 7d) 'nascar': NASCAR (sports; 7d) 'pro-wrestling': Pro Wrestling (sports; 7d) 'fiction': Fiction (books; 7d) 'comics-manga': Comics & Manga (books; 7d) 'nonfiction': Non-Fiction (books; 7d)
limitNoHow many ranked entries to return, from rank 1 down (1-100, default 10).
windowNoMeasurement window. '7d' (default) ranks the last seven days; '24h' ranks the last day. The composite charts and most sports charts publish 7d only (see chart).
includeNoOptional sections. 'timeseries' adds each entry's daily podcast and mention counts. 'driven_by' names, on an entry that rises because of another entry's coverage (a song with its artist), the entry that drives it.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the read-only, open-world, non-destructive profile, and the description goes further with real behavioral nuance: ranks are weighted relative to an entity's own baseline so count does not determine rank, and acceleration is not measured on the guests chart. It also reveals that entries carry slugs and quote episode ids usable for chaining. It stops short of describing response shape or pagination, which keeps it below a 5.

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 purpose, then usage, then the ranking caveat, then chaining targets — a sensible order. It is dense and somewhat long, and the partial re-listing of chart categories duplicates the `chart` enum description, but every paragraph carries distinct 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 six-parameter tool with no output schema, the description covers what an entry contains (rank, movement, reason, quote, playback link, slug), how to follow up on each object type by name, and the ranking edge cases. Nothing an agent needs to select or invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds value beyond it by grouping the charts (entertainment, sports, books, guests) and explaining what guests ranks, plus the acceleration caveat affecting `sort`. It repeats a fair amount of what the enum descriptions already say, limiting the upside.

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?

Opens with a specific verb and resource: 'What is trending on podcasts... rank the entities... with movement since the previous edition and why it moved.' The entity types it covers are enumerated and it explicitly distinguishes itself from particle_podcast_get_rankings (Apple/Spotify show charts) and particle_podcast_get_mention_trends.

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

Usage Guidelines5/5

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

Explicit when-to-use: call with no arguments for the `all` chart, pick narrower charts by name with groupings listed, `sort=acceleration` for fastest risers. It also states two negative cases with named alternatives, so an agent is routed without reading either schema.

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

particle_podcast_get_episodeParticle Podcast Get EpisodeA
Read-only
Inspect

Return a bundled overview of one podcast episode: title, podcast, speakers (with entity slugs), top mentioned entities, and segment/clip counts.

By default the response is lean — counts plus the top mentioned entities. Request optional sections via include: 'segments' for the structural outline with timestamps, 'entities' for the complete entity list, 'clips' for engagement-ranked highlight clips, 'topics' for topic classifications with slugs, 'guest_expertise' for each guest's expertise and whether they spoke within their field, 'speaker_statement_characteristics' for how the episode's lines were said (label shares overall and per speaker, who is most hedged or forward-looking, and a few of its strongest predictions, confident claims, criticism and optimism lines), or 'transcript' for the dialogue transcript (narrow it by speaker or time range via transcript_speaker / transcript_start / transcript_end — full transcripts are large).

For "every line about X in this episode" use particle_podcast_find_mentions with episode_slug instead — that returns the dialogue around each mention with is_mention flags. For the ad reads inside the episode use particle_podcast_get_episode_ads (premium).

NameRequiredDescriptionDefault
includeNoOptional response sections: 'transcript' (bounded dialogue transcript — large for long episodes; narrow it with the transcript_* sub-params), 'segments' (structural outline with timestamps), 'entities' (complete mentioned-entity list instead of the top 20), 'clips' (engagement-ranked highlight clips), 'topics' (topic classifications with slugs), 'related' (the five episodes from OTHER shows most related to this one — slug, show, score, band; for the full ranked list with the basis behind each match call particle_podcast_list_related_episodes), 'guest_expertise' (each guest's expertise read and how the episode used it: whether they spoke within their field, whether the appearance was promotional, how they were introduced), 'speaker_statement_characteristics' (how the lines were said: label shares overall and per identified speaker, who is most hedged or forward-looking, and up to 5 of its strongest predictions, confident claims, criticism and optimism lines). Default response is lean — request only what you need.
episode_slugYesEpisode slug or canonical ID. A particle.pro or Radar episode link also works.
transcript_endNoTranscript range end in seconds. Lines that overlap the range are returned whole.
transcript_startNoTranscript range start in seconds. Lines that overlap the range are returned whole.
transcript_formatNoTranscript format for include=transcript. Defaults to text.
transcript_speakerNoFilter the transcript to one speaker: a name, a person slug or ID, or an entity slug or ID.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/non-destructive, so the description's real contribution is pay-per-section behavior: lean by default, opt-in sections via `include`, and the warning that full transcripts are large and should be narrowed by speaker/time range. It stops short of any rate-limit, auth, or premium-status note for this tool itself, which keeps it off a 5.

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 purpose and default behavior, then routes to alternatives — a sensible order. The long inline enumeration of every `include` value largely duplicates the schema enum description, which is the one place it spends words it doesn't need to.

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

Completeness5/5

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

With no output schema and six parameters, the description covers what comes back, what the lean default contains, how to expand it, and the size caveat on transcripts — enough for an agent to call this correctly and avoid over-fetching. The only omission ('related' in the prose include list) is fully covered by 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?

Schema description coverage is 100%, so the schema carries the baseline; the description still adds practical meaning by framing `include` as an opt-in cost/benefit tradeoff and by explaining that transcript_speaker/transcript_start/transcript_end exist to bound a large payload. Minor gap: the prose enumeration of `include` values omits 'related', which only the schema mentions.

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?

Names a specific verb and resource ('Return a bundled overview of one podcast episode') and immediately enumerates the returned fields (title, podcast, speakers with slugs, top entities, segment/clip counts). It also explicitly differentiates itself from two siblings, so an agent can pick it without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit default ('response is lean — counts plus top mentioned entities') and tells the agent exactly which alternative to use for adjacent needs: 'every line about X' → particle_podcast_find_mentions with episode_slug, and ad reads → particle_podcast_get_episode_ads (premium). The when/when-not/alternatives routing is complete.

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

particle_podcast_get_episode_timeseriesParticle Podcast Get Episode TimeseriesA
Read-only
Inspect

Time-bucketed episode counts — the purpose-built answer to "how often is X discussed over time". Counts episodes matching the same filters as particle_podcast_list_episodes (person, company, entity, podcast, keyword, language, duration, transcript availability) per day, week, or month, plus range totals. keyword_search additionally counts matching transcript segments per bucket (exact counts); semantic_search does the same by meaning, with the same similarity threshold as particle_podcast_search_transcripts (lower bounds for pathologically broad queries), and requires published_after. The two cannot be combined.

Use this for appearance, publication, or topic trend lines instead of paging particle_podcast_list_episodes, particle_podcast_find_mentions, or particle_podcast_search_transcripts once per period. For how often a person, company or brand is mentioned, use particle_podcast_get_mention_trends: it leaves ad reads out, where this tool counts an episode for a company or entity named only in its ad reads, and it says which podcasts carried the mentions. Buckets are UTC-aligned, zero-filled, and Monday-aligned for weeks; ranges are capped at 1000 buckets. At least one of podcast_slug, person_slug, company_slug, entity_slug, keyword_search, semantic_search, guest_occupation, or guest_field is required.

The guest_ filters count episodes by their guests' expertise (resolve the words to codes with particle_expertise_resolve first; on unresolved_reference, resolve and retry): guest_field alone charts how often a field's experts are booked; with company_slug it charts the company's episodes featuring those experts. They are episode-level and never check who spoke: with keyword_search, a matching segment counts when its episode had such a guest, even if the host said the words. For who said a keyword, use particle_podcast_get_share_of_voice with keyword_search.

NameRequiredDescriptionDefault
roleNoRole filter when person_slug, company_slug, or entity_slug is set.
intervalNoBucket width. Weeks start on Monday; all buckets are UTC-aligned. Defaults to week.
languageNoRestrict to episodes of podcasts in this language — ISO 639-1 code (e.g. 'fr'). Matches the podcast's primary language subtag, so 'fr' covers 'fr-FR'.
entity_slugNoKnowledge-graph entity slug from particle_entity_resolve for the long tail that isn't a person or company (e.g. 'germany'). Use person_slug for people and company_slug for companies.
guest_fieldNoOnly episodes with a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment').
person_slugNoPerson slug or encoded person ID (e.g. 'sam-altman'). Counts episodes featuring the person as a speaker — and, when the person has a linked knowledge-graph entity, episodes that mention them.
company_slugNoCompany slug, domain, or ID. Resolves to the linked entity.
max_durationNoMaximum episode duration in seconds.
min_durationNoMinimum episode duration in seconds.
podcast_slugNoPodcast slug, internal ID, or numeric iTunes ID. Restrict to one podcast. A particle.pro or Radar show link also works.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
guest_capacityNoOnly episodes with a guest who knows their field in this capacity (e.g. 'executive_founder' for founders). It narrows the other filters; particle_expertise_resolve names the capacity an everyday word means.
guest_in_fieldNoOnly episodes with a guest speaking within their own field (the guest the other guest_ filters select, when given).
guest_standingNoOnly episodes with a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.
has_transcriptNoOnly count episodes with a completed transcript.
keyword_searchNoKeyword filter over transcript content. Double-quoted substrings must appear as exact phrases; unquoted terms must all appear in one transcript segment. Adds per-bucket mention counts to the response. Cannot be combined with semantic_search.
guest_seniorityNoOnly episodes with a guest at this seniority or above.
published_afterNoInclusive range start as an ISO 8601 date or date-time. Omit to aggregate all time.
semantic_searchNoVector-similarity filter by meaning over transcript content — the counting twin of particle_podcast_search_transcripts' semantic_search, using the same similarity threshold. Describe the topic the way you'd say it to a colleague; paraphrase tolerant. Adds per-bucket mention counts to the response. Requires published_after (ranges up to ~2 years). Cannot be combined with keyword_search.
guest_occupationNoOnly episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). A word with no occupation filters by the field of research or capacity it names: 'oncologists' is field 3211, 'founders' is capacity executive_founder.
guest_practicingNoOnly episodes with a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group (e.g. '29-1212' or 'physicians').
published_beforeNoRange end as an ISO 8601 date or date-time. Defaults to now.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, non-destructive, openWorld), yet the description adds substantial non-obvious behavior: UTC-aligned zero-filled buckets, Monday-aligned weeks, a 1000-bucket cap, the ~2-year range limit on semantic search, the 'lower bounds for pathologically broad queries' caveat, and the requirement that at least one filter be supplied. It even explains the guest_ filters' episode-level semantics and the unresolved_reference retry flow.

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

Conciseness4/5

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

Front-loaded with the purpose and the when-to-use contrast before dense operational detail; the three paragraphs follow a logical progression (what it computes, when to pick it, how the guest_ filters behave). It is long, but nearly every sentence carries a decision-relevant constraint, so the length is mostly earned rather than padded.

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 22-parameter, zero-required, no-output-schema tool, the description covers the gaps that matter: it explains what the response is (per-bucket counts plus range totals and per-bucket transcript mention counts), the at-least-one-filter precondition, and the keyword/semantic mutual exclusion. Nothing an agent needs to invoke it correctly is missing.

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

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 cross-parameter meaning the schema cannot: guest_field alone charts a field's expert bookings whereas guest_field + company_slug charts company episodes with those experts, and guest_ filters never check who actually spoke. It also clarifies that keyword_search and semantic_search each attach per-bucket mention counts to the response.

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 — time-bucketed episode counts per day/week/month plus range totals — and immediately frames the use case ('how often is X discussed over time'). It explicitly names the siblings it supersedes (particle_podcast_list_episodes, particle_podcast_find_mentions, particle_podcast_search_transcripts) and the related tool it is not (particle_podcast_get_mention_trends).

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?

Gives explicit routing rules: use this for trend lines 'instead of paging' the list/search tools, use get_mention_trends when the question is about brand mentions, and get_share_of_voice when the question is who said a keyword. It also states the selection constraint (keyword_search vs semantic_search cannot be combined, semantic requires published_after) and the minimum filter requirement.

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

particle_podcast_get_guestParticle Podcast Get GuestA
Read-only
Inspect

A guest's podcast-appearance profile: lifetime stats (appearances, distinct podcasts, first/last appearance) plus their most frequent podcasts. Guests are people — the same slug works with particle_person_get for the biographical profile.

Request optional sections via include: 'appearances' for the most recent episode appearances (episode and podcast slugs included for follow-up calls), 'podcasts' for the per-podcast rollup, 'suitability' for brand-suitability exposure across the podcasts they appear on, 'recommended_podcasts' for the five shows they could plausibly appear on next — shows related to the ones they have guested on, with the venues behind each pick and each show's suitability tier, latest episode and chart breadth (the pitch list; branch on each row's band). It already leaves out every show they have appeared on, other feeds of those shows with the same host, shows that stopped publishing and UNSAFE shows, and ranks shows far smaller than their usual venues lower, so there is no need to check each pick's episodes, 'in_field_appearances' for the most recent appearances where they spoke within their own field of expertise (what they know is what the episode drew on; particle_person_get with include: ["expertise"] says what that field is).

Returns not_found for people who exist but have never appeared on a podcast — use particle_person_get for those.

NameRequiredDescriptionDefault
includeNoOptional response sections: 'appearances' (most recent episode appearances with episode/podcast slugs), 'podcasts' (per-podcast rollup of where they appear), 'suitability' (brand-suitability exposure across the podcasts they appear on), 'recommended_podcasts' (the five shows they could plausibly appear on next — shows related to the ones they have guested on, each with the venues that led there, its suitability tier, latest episode and chart breadth; shows they appeared on, same-host sibling feeds, dormant and UNSAFE shows are already left out; the pitch list), 'in_field_appearances' (most recent appearances where they spoke within their own field of expertise). Default response is the profile + lifetime stats.
guest_slugYesPerson slug (e.g. 'sam-altman') from particle_podcast_list_guests, particle_person_resolve, or particle_entity_resolve.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as a safe read-only open-world tool, but the description adds meaningful behavior: default response contents, not_found semantics, recommendation filtering rules, ranking behavior, and suitability-band interpretation. Those details go well beyond what annotations provide.

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

Conciseness4/5

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

The description is front-loaded and purpose-first, with useful routing details. It is somewhat dense and the recommended_podcasts explanation is a long run-on that restates schema details, but it contains little irrelevant content.

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

Completeness5/5

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

For a complex guest-profile tool with no output schema, the description is essentially complete: it explains default output, optional sections, special return behavior, and the related person tool. Nothing essential is missing for correct invocation.

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 documents all three parameters. The description still adds practical meaning for the include sections, especially the pitch-list semantics and filtering of recommended_podcasts, though much of the enum documentation is repeated.

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 resource and scope: a guest's podcast-appearance profile with lifetime stats and frequent podcasts. It explicitly distinguishes this from particle_person_get's biographical profile and notes the not_found case for non-guests.

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?

Tells the agent when to use this tool and when to switch to particle_person_get for people with no podcast appearances. It also explains the purpose of each optional include section, including when to ask for recommendations or in-field appearances.

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

particle_podcast_get_rankingsParticle Podcast Get RankingsA
Read-only
Inspect

Podcast chart rankings from Apple Podcasts and Spotify, in four modes:

  • chart (default): the current chart for a source/country/category slot, or — with podcast_slug — every chart slot that podcast currently holds.

  • movers: the biggest rank changes over window_days (risers, fallers, entries, exits). Most change=new entries are established shows returning to the chart; for new podcasts, launches, or debuts use change=debut — shows on that chart slot for the first time since tracking began (May 2026). A debut is per slot: a show can debut on the overall chart after months in a category, so read its episode count and, when shown, its first-episode date before calling it brand-new.

  • history: past snapshots for a chart slot, or — with podcast_slug — one podcast's chart history over time, newest first. Per-podcast history defaults to country=us; pass country for other markets. For one chart's trajectory pass source, country, and category_slug too (omit category_slug for the overall chart plus every category): 90 days of one slot fits in one page of 100, where the unfiltered history of a popular show runs to hundreds of rows. History begins in May 2026.

  • slots: the valid slot values — every source, country, and category_slug with live chart data — so filter values are discovered, not guessed. source narrows the country/category listings; other filters are ignored.

Each row carries the matched podcast_slug when the chart entry is in the catalog — feed it into particle_podcast_resolve or any podcast tool. For a single podcast's at-a-glance chart presence, particle_podcast_resolve with include: ["rankings"] is one call instead of two.

NameRequiredDescriptionDefault
modeNoWhat to return. 'chart' (default): the current chart — or, with podcast_slug, every chart slot the podcast currently holds. 'movers': biggest rank changes over window_days (risers, fallers, debuts, exits). 'history': past chart snapshots for a slot — or, with podcast_slug, one podcast's chart history. 'slots': the valid chart-slot values — every source, country, and category_slug with live data — for discovering filter values before a chart/movers/history call.
limitNoRows per page (1-100, default 25).
sinceNoMode=history only: only snapshots captured on or after this ISO 8601 timestamp.
untilNoMode=history only: only snapshots captured on or before this ISO 8601 timestamp.
changeNoMode=movers only: filter by change type. Defaults to all. 'debut': shows on this chart slot for the first time since tracking began (May 2026) — use it for 'new podcasts', 'just launched', 'debuted'. 'new': every entry, mostly established shows returning. 'reentry': only the returning ones.
cursorNoOpaque pagination cursor from a previous response.
sourceNoRanking source platform. Defaults to apple.
countryNoISO 3166-1 alpha-2 country code (e.g. 'us', 'gb', 'jp'). Defaults to us.
window_daysNoMode=movers only: comparison window in days (1-30, default 1 = vs. yesterday).
podcast_slugNoPodcast slug, internal ID, or numeric iTunes ID. With mode=chart: that podcast's current chart appearances across every slot. With mode=history: that podcast's chart history. A particle.pro or Radar show link also works.
category_slugNoCategory slug (e.g. 'comedy', 'business'). Omit for the overall chart.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly=true and destructive=false, yet the description still adds substantial behavior: tracking begins May 2026, per-podcast history silently defaults to country=us, category_slug omission means 'overall chart plus every category', slots ignores other filters, and 90 days of one slot fits in a single 100-row page. The per-slot caveat on debuts ('read its episode count and, when shown, its first-episode date before calling it brand-new') is exactly the kind of semantic trap an agent would otherwise fall into.

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

Conciseness4/5

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

Front-loaded with a mode list before any detail, and the bulleted structure maps one bullet per mode, which is easy to scan. It is long and some clauses (the debut episode-count aside, the page-of-100 justification) are dense, but each carries a real disambiguation an agent needs, so little is truly wasted.

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?

Covers mode selection, defaults, historical boundaries, pagination behavior, and one row-level fact (matched podcast_slug fed into other tools) despite having no output schema and 12 parameters. The return shape is still only partly described — rank fields, whether movers rows show deltas, and exit rows' contents are left implicit — which keeps it short of fully self-contained.

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 mode, change, source, country, category_slug and output_format are already documented and repetition earns no credit. The description does go beyond the schema on cross-parameter interactions — that history needs source+country+category_slug to describe one slot's trajectory, that source narrows but other filters are ignored in slots mode — which is genuine value. Remaining parameters (since/until/cursor/limit) get no extra semantics in the prose.

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

Purpose5/5

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

Names a specific verb and resource and then splits it into four named modes with distinct returned content, so an agent can tell chart from movers from history from slots without opening the schema. It also distinguishes itself from the sibling particle_podcast_resolve by noting that the at-a-glance case is one call there instead of two here.

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 routing for every mode: slots exists to discover filter values 'not guessed'; history should be pinned to source/country/category_slug because unfiltered history of a popular show runs hundreds of rows; change=debut is prescribed for 'new podcasts/launches' while change=new is warned as mostly returning shows. It also names the alternative tool for the single-podcast case.

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

particle_podcast_get_share_of_voiceParticle Podcast Get Share Of VoiceA
Read-only
Inspect

Split a person's, company's or entity's podcast mentions by who said them: the speakers' occupations (SOC 2018) or fields of research (ANZSRC 2020). Answers "who is talking about NVIDIA — investors, engineers, journalists?" in one call: each group's mention lines, share, distinct speakers and episodes over a window (default the last 30 days, at most 365), optionally bucketed by day, week or month. By default it counts guests' and panelists' lines at the detailed level (Chief Executives, Financial Analysts, Dietitians), each with the top-level group it sits under. speakers="all" adds hosts, who speak most mention lines and mostly code to media; level="major" gives SOC major groups or ANZSRC divisions only; podcast_slug or publisher_slug narrows to one show or network.

keyword_search splits the lines that say a word or quoted phrase instead of an entity's mentions (who talks about prior authorization?), counting a line only when its own speaker said every word in it. Its window is at most 90 days, and a word said in too many episodes is refused with a way to narrow it. This is the per-speaker answer that particle_podcast_get_episode_timeseries with keyword_search and guest_occupation cannot give: that counts matching segments in episodes with such a guest, whoever spoke them.

Shares are of the mentions spoken by someone with an expertise read, and a person listed under several codes counts in each, so shares can sum past 100%.

HOW the subject is spoken of splits the same mentions by speaker statement characteristics: by="sentiment" (or certainty, specificity, temporal_orientation) gives one group per label, breakdown splits each occupation's lines by an axis's labels (how investors vs engineers speak of NVIDIA), and speaker_statement_characteristics counts only lines said a certain way (who makes predictions about it). Label shares are of the scored mentions, the lines that carry labels; a group with fewer than 20 is marked low sample, so read it as examples. examples (1-3) quotes the lines that most clearly carry each group's or label's label, with speaker, episode and moment link. Entities and companies only, not keyword_search. To set two to five subjects' label shares side by side (NVIDIA vs AMD vs Intel), use particle_podcast_compare_share_of_voice.

Each group's code is a guest_occupation (or guest_field) value: pass it to particle_podcast_find_mentions with the same entity to read what that group said. For a keyword, particle_podcast_search_transcripts with the same keyword_search finds candidate passages: its guest filters keep segments with such a guest, so check each matching line's speaker, and host lines are not reached that way. Not for the mention lines themselves (particle_podcast_find_mentions) or for a brand's mention volume over time and the shows carrying it (particle_podcast_get_mention_trends).

NameRequiredDescriptionDefault
byNoGroup the speakers by 'occupation' (SOC 2018, default) or 'field' (ANZSRC 2020 fields of research), or group the counted lines by HOW they were said: 'sentiment', 'certainty', 'specificity' or 'temporal_orientation' gives one group per label (how negatively or positively NVIDIA is spoken of is by='sentiment'). Not with keyword_search.
levelNoGroup level: 'detailed' (default; detailed occupations or ANZSRC groups, each with the top-level group it sits under) or 'major' (SOC major groups or ANZSRC divisions only).
limitNoGroups to return, most mentioned first (1-50, default 10).
examplesNoAlso quote up to this many lines (0-3, default 0) for each group, or with breakdown for each of its labels: the quote, who said it, the episode and a timestamp linked to the moment. Strongest first: the lines that most clearly carry the label or read the way speaker_statement_characteristics asks; with neither, the newest. At most one per episode, from different speakers where it can. Not with keyword_search.
intervalNoAdd each group's mentions per day, week or month.
speakersNoWhose lines count: 'guests' (default; guests and panelists) or 'all' (hosts included). Hosts speak most mention lines and their own occupations dominate an 'all' split, so pass 'all' only when the hosts' voice is the question.
breakdownNoAlso split each group's lines by their label on this axis: by='occupation' with breakdown='sentiment' is how each occupation spoke of the subject. A group's breakdown shares are of its scored mentions, and a group with fewer than 20 is marked low sample. Must differ from by. Not with keyword_search.
entity_slugNoKnowledge-graph entity slug from particle_entity_resolve for anything that isn't a person or company (e.g. 'germany').
include_adsNoCount mentions inside ad reads too. Off by default: ad copy is not a speaker's voice.
person_slugNoPerson slug from particle_person_resolve (e.g. 'sam-altman'). One of person_slug, company_slug, entity_slug or keyword_search is required.
company_slugNoCompany slug or domain from particle_company_resolve (e.g. 'nvidia'). Resolves to the company's linked entity.
podcast_slugNoOnly mentions inside this podcast (slug from particle_podcast_resolve).
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
keyword_searchNoSplit the lines that say these words instead of an entity's mentions: every word in one line, case-insensitive; wrap words in double quotes to require them adjacent and in order. Words count as spoken, so a word with two meanings counts both. Window at most 90 days.
publisher_slugNoOnly mentions on podcasts of this publisher (network), by slug.
published_afterNoOnly episodes published on or after this date (YYYY-MM-DD). Defaults to 30 days before published_before; the window may span at most 365 days for an entity and 90 for a keyword.
published_beforeNoOnly episodes published on or before this date (YYYY-MM-DD). Defaults to now.
speaker_statement_characteristicsNoCount only mentions said a certain way: {"temporal_orientation": ["future"]} splits who makes predictions about the subject; {"sentiment": ["negative"]} who criticizes it. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names. Not with keyword_search.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the read-only/safe profile, and the description goes far beyond them: shares can sum past 100% because a person counted under several codes appears in each, groups under 20 are flagged low sample, hosts 'mostly code to media', keyword queries can be refused when a word is too common, and window limits (30 default / 365 entity / 90 keyword) are disclosed. These are the non-obvious behaviors an agent must anticipate before calling.

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

Conciseness4/5

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

Front-loaded with purpose and the canonical example question, and each paragraph owns one mode (entity split, keyword split, HOW-they-speak split, chaining/alternatives). It is long and occasionally re-explains what enum descriptions already say (keyword window, examples ordering), which keeps it short of a 5 for an 18-parameter tool.

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

Completeness5/5

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

With 18 parameters, a nested object and no output schema, the description carries the return-shape burden itself: grouped mention lines, share, distinct speakers and episode counts, optional interval buckets, and example quotes with speaker/episode/moment link. Between the body and the complete schema, an agent has everything needed to call correctly and interpret output.

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 carries per-parameter documentation and enum meanings. The description still adds cross-parameter meaning the schema does not: which modes are mutually exclusive (keyword_search vs by/examples/breakdown/speaker_statement_characteristics), how breakdown interacts with by ('must differ'), and the practical consequence of speakers='all'. Some of it (level='major', window defaults) is repetition of schema text.

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?

Opens with a specific verb and resource: 'Split a person's, company's or entity's podcast mentions by who said them', then names the exact axes (SOC 2018, ANZSRC 2020) and the question it answers. It is immediately distinguishable from find_mentions (raw lines), get_mention_trends (volume over time) and compare_share_of_voice (multi-subject), which are all named.

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 routing: use compare_share_of_voice for two-to-five subjects side by side, find_mentions with the resulting guest_occupation code to read what a group said, search_transcripts for keyword passages, and an explicit 'Not for' clause pointing at find_mentions and get_mention_trends. Preconditions such as the 90-day keyword window and the exclusion of keyword_search from the statement-characteristic modes are stated inline.

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

particle_podcast_get_transcription_requestParticle Podcast Get Transcription RequestA
Read-only
Inspect

Read where your organization's transcription request stands, by request_id or by the episode's episode_slug. Free: this is how to wait for a transcription that particle_podcast_request_transcription queued, so poll it every minute or so (a transcription usually takes 5 to 10 minutes) rather than requesting again.

state is queued (waiting its turn), admitted (being transcribed), transcribed (the episode tools now serve its transcript: particle_podcast_get_episode, particle_podcast_find_mentions, particle_podcast_search_transcripts), or failed (failure_reason says why, and the charge is refunded). By episode_slug, your organization's request answers even once the episode is transcribed; for an episode we hold that it never requested, there is no request, and state says where its transcript stands.

NameRequiredDescriptionDefault
request_idNoThe request's request_id, as particle_podcast_request_transcription returned it. Pass this or episode_slug.
episode_slugNoThe episode whose request to read: its episode_slug. Pass this or request_id.

TDQS

A4.7/5.0
Behavior5/5

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

Despite annotations already declaring readOnly/openWorld/destructive=false, the description adds substantial behavior context they do not cover: it is free to call, typical latency is 5-10 minutes, and it enumerates the full state machine (queued, admitted, transcribed, failed) with what each implies, including that failure_refund applies on failure.

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

Conciseness4/5

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

Front-loaded with the purpose and the polling instruction, and every sentence carries operational value. The final sentence about the episode_slug edge case is dense and slightly tangled ('for an episode we hold that it never requested, there is no request'), costing some readability.

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 no output schema, the description correctly supplies the return semantics (the four state values and their meanings), which is exactly what is needed for a polling tool. The one gap is that both parameters are optional and the description never states the behavior when neither or both are passed.

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 baseline is 3, but the description goes further: it explains that request_id comes from particle_podcast_request_transcription, and that episode_slug resolves your organization's request even after transcription, with an explicit edge case for episodes you never requested. It does not say what happens if both or neither key is supplied.

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 (read) plus the resource (the organization's transcription request) and the two lookup keys, so it is unmistakable against the sibling particle_podcast_request_transcription that creates the request.

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?

Gives explicit when-to-use and when-not-to-use guidance: it names itself as the way to wait on a request queued by particle_podcast_request_transcription, prescribes polling 'every minute or so', and explicitly says to poll 'rather than requesting again'. It also names the downstream tools to use once state is transcribed.

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

particle_podcast_list_clipsParticle Podcast List ClipsA
Read-only
Inspect

Browse AI-extracted highlight clips across the catalog, ranked by engagement potential — the shareable moments. Filter by podcast, episode, clip type (FUNNY, CONTROVERSIAL, INSIGHTFUL, ...), minimum engagement score, or speaker — speaker takes a person slug and returns only clips of that person talking ('an insightful Sam Altman clip').

Pass clip_id for one clip's full detail (description, social-hook intro, speaker, audio URL), plus include: ["transcript"] for its dialogue.

For text-based clip discovery — finding clips about a topic or entity — use particle_podcast_search_transcripts instead: matching clips arrive inline on each search result. Episode slugs on every row feed particle_podcast_get_episode.

NameRequiredDescriptionDefault
typeNoClip type filter.
limitNoClips per page (1-50, default 10).
cursorNoOpaque pagination cursor from a previous response.
clip_idNoReturn one clip's full detail instead of a listing. Clip IDs come from this tool, particle_podcast_get_episode with include=clips, and search-result overlapping clips.
includeNoWith clip_id only: 'transcript' attaches the clip's dialogue transcript.
speakerNoRestrict the listing to clips whose primary speaker is this person — a person slug (e.g. 'sam-altman' from particle_person_resolve), a knowledge-graph entity slug for the same person, or an ID.
episode_slugNoRestrict the listing to one episode (slug or ID). A particle.pro or Radar episode link also works.
podcast_slugNoRestrict the listing to one podcast (slug, internal ID, or numeric iTunes ID). A particle.pro or Radar show link also works.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
min_engagementNoMinimum engagement potential score (0-100). Above 70 is typical for a strong clip.

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, destructiveHint=false, openWorldHint=true, so safety is covered. The description adds real behavioral context beyond that: results are engagement-ranked, clip_id switches to a detail mode returning description, social-hook intro, speaker and audio URL, and include=['transcript'] attaches dialogue. It doesn't discuss pagination limits or ranking caveats, keeping it short of a 5.

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?

Three short paragraphs, front-loaded with what the tool does, then detail mode, then sibling routing. Dense but every sentence carries information; the parenthetical example is illustrative rather than padding. Slightly heavy on nested parentheticals, which is the only thing keeping it from 5.

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?

No output schema exists, so the description bears some burden of return-value explanation, and it delivers for the clip_id detail path while implying list rows carry episode slugs. Pagination via cursor and limit is left entirely to the schema, and the listing row shape is never described, leaving a small gap for a 10-parameter tool.

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 genuinely adds meaning: it explains that `speaker` takes a person slug and returns only clips of that person talking ('an insightful Sam Altman clip'), and that clip_id toggles a different response shape rather than filtering a list. Those are interpretive details the schema alone doesn't convey.

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 ('Browse AI-extracted highlight clips across the catalog') plus the ranking dimension ('ranked by engagement potential'), and immediately characterizes the content as 'the shareable moments'. An agent can distinguish this from particle_podcast_search_transcripts or particle_podcast_get_episode without opening either 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 routes between modes and siblings: 'For text-based clip discovery — finding clips about a topic or entity — use particle_podcast_search_transcripts instead' and notes episode slugs 'feed particle_podcast_get_episode'. The single-clip detail path (pass clip_id) is also called out with its own trigger condition.

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

particle_podcast_list_episodesParticle Podcast List EpisodesA
Read-only
Inspect

List episodes across the catalog with rich filters: by podcast, person, company, language, date range, duration, or transcript availability.

By default it lists the episodes we have ingested. Pass transcript_status with podcast_slug to reach the show's back catalogue — older episodes discovered in its feed but not transcribed, marked requestable. Their transcript, segments, speakers and entities do not exist until one is requested.

Use this for episode-level discovery when you only need metadata (title, duration, speakers, counts). For dialogue around a person in any episode, use particle_podcast_find_mentions. For ranked retrieval by topic, use particle_podcast_search_transcripts.

The guest_ filters list episodes by their guests' expertise (resolve the words to codes with particle_expertise_resolve first; on unresolved_reference, resolve and retry): guest_occupation="cardiologists" with guest_practicing=true lists episodes with a practicing cardiologist as a guest, and guest_capacity="executive_founder" lists episodes with a founder as a guest.

NameRequiredDescriptionDefault
roleNoRole filter when person_slug or company_slug is set.
limitNoEpisodes per page (1-50, default 10).
cursorNoOpaque pagination cursor from a previous response.
languageNoRestrict to episodes of podcasts in this language — ISO 639-1 code (e.g. 'fr'). Matches the podcast's primary language subtag, so 'fr' covers 'fr-FR'.
entity_slugNoKnowledge-graph entity slug from particle_entity_resolve for the long tail that isn't a person or company — places, organizations, events, products, concepts (e.g. 'germany'). Use person_slug for people and company_slug for companies.
guest_fieldNoOnly episodes with a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment').
person_slugNoPerson slug or encoded person ID from particle_person_resolve, particle_entity_resolve, or the guest tools (e.g. 'sam-altman'). Episodes featuring or mentioning the person.
company_slugNoCompany slug, domain, or ID. Resolves to the linked entity.
max_durationNoMaximum episode duration in seconds.
min_durationNoMinimum episode duration in seconds.
podcast_slugNoPodcast slug, internal ID, or numeric iTunes ID. Restrict to one podcast. A particle.pro or Radar show link also works.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
guest_capacityNoOnly episodes with a guest who knows their field in this capacity (e.g. 'executive_founder' for founders). It narrows the other filters; particle_expertise_resolve names the capacity an everyday word means.
guest_in_fieldNoOnly episodes with a guest speaking within their own field (the guest the other guest_ filters select, when given).
guest_standingNoOnly episodes with a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.
has_transcriptNoOnly include episodes with a completed transcript. Superseded by transcript_status=transcribed; do not pass both.
guest_seniorityNoOnly episodes with a guest at this seniority or above.
published_afterNoISO 8601 date or date-time.
guest_occupationNoOnly episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). A word with no occupation filters by the field of research or capacity it names: 'oncologists' is field 3211, 'founders' is capacity executive_founder.
guest_practicingNoOnly episodes with a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group (e.g. '29-1212' or 'physicians').
published_beforeNoISO 8601 date or date-time.
transcript_statusNoFilter by where episodes stand on the way to a transcript. Omitted lists the episodes we have ingested. any, untranscribed and requestable also list the podcast's back catalogue — episodes discovered in its feed but not transcribed — and require podcast_slug: any lists every discovered episode, untranscribed those without a transcript, requestable back-catalogue episodes whose transcript can be requested. transcribed lists episodes with a transcript.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/no-destruction, and the description goes well beyond them: it discloses that the default lists only ingested episodes, that transcript_status with podcast_slug reaches untranscribed back-catalogue episodes marked requestable, and that transcript, segments, speakers and entities do not exist until a request is made. It also explains output_format trade-offs for chaining.

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

Conciseness4/5

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

Front-loaded with purpose and default behavior, then alternatives, then the nuanced filter semantics — a sensible ordering for a 22-parameter tool. Some sentences are dense and could be tightened, but none are filler given the parameter surface area.

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 22-param, no-output-schema tool the description covers the hard parts: default scope, back-catalogue lifecycle, sibling routing, and the guest-filter resolution chain. It names some return fields in passing ('title, duration, speakers, counts') but stops short of describing the overall response shape, which is the only real gap.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, and the description adds real meaning on top: worked examples of filter combination (guest_occupation="cardiologists" with guest_practicing=true; guest_capacity="executive_founder"), the requirement to resolve words to codes via particle_expertise_resolve first, and the unresolved_reference retry behavior. It does not touch every one of the 22 params, but the ones it covers are the non-obvious ones.

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 ('List episodes across the catalog') plus the filterable dimensions, and explicitly distinguishes itself from two sibling tools (particle_podcast_find_mentions for dialogue, particle_podcast_search_transcripts for ranked topic retrieval). An agent can place it correctly without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions ('episode-level discovery when you only need metadata') and names the two alternatives with the conditions that select them. It also states the default mode versus the transcript_status + podcast_slug path for reaching the back catalogue, and the prerequisite resolve-and-retry flow for the guest_ filters.

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

particle_podcast_list_guestsParticle Podcast List GuestsA
Read-only
Inspect

Browse podcast guests across the catalog, in two opinionated modes:

  • directory (default): the guest directory ranked by lifetime appearances (guests with 2+ appearances).

  • trends: who's making the rounds right now — guests with appearances on 2+ distinct podcasts in the last 30 days, which surfaces cross-show press tours rather than show regulars. The press-tour shape is enforced: every in-window appearance must be on a different podcast, each needs 5+ minutes of identified speaking time, mononymous catch-all people are excluded, and the in-window rate must be a 2x spike over the guest's lifetime baseline. For the daily ranked guests chart, with movement since the previous edition and each guest's top clip, use particle_podcast_get_entity_chart with chart="guests".

podcast_slug switches the directory to one show's roster: every guest who has appeared on that podcast, ranked by appearances on the show (one-off guests included). topic_slug narrows either corpus mode to guests appearing on episodes about that topic. occupation/field (with standing, seniority, practicing, capacity, employer) keep guests by what they know: resolve the words ("doctors", "economists") to codes with particle_expertise_resolve first, and on unresolved_reference resolve and retry rather than dropping the filter. Every row names the guest's occupation codes, standing and seniority; include: ["expertise"] adds their organization.

Guest slugs ARE person slugs — feed them into particle_podcast_get_guest for the appearance profile or particle_person_get for the person profile.

NameRequiredDescriptionDefault
modeNoWhat to return. 'directory' (default): the guest directory ranked by lifetime appearances. 'trends': guests trending right now — appearances on 2+ distinct podcasts in the last 30 days (cross-show press tours, not regulars).
fieldNoOnly guests listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment'). Directory mode only.
limitNoGuests per page (1-50, default 20).
cursorNoOpaque pagination cursor from a previous response.
includeNoOptional per-guest sections: 'expertise' (widens the occupation codes, standing and seniority every row carries to the fuller one-line read with the organization). Directory mode only.
capacityNoOnly guests who know their field in this capacity. Directory mode only.
employerNoOnly guests whose organization is this company (slug from particle_company_resolve, or a domain). Directory mode only.
standingNoOnly guests whose standing is recognized this way: 'established' (conferred by others: a credential, a position, recognition in the field), 'self_described', or 'unverified'. Directory mode only.
seniorityNoOnly guests at this seniority or above. Directory mode only.
occupationNoOnly guests listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). Directory mode only.
practicingNoOnly guests who still work in the occupation. Needs a SOC 2018 occupation or group (e.g. '29-1212' Cardiologists or 'physicians'). Directory mode only.
topic_slugNoRestrict to guests with appearances on episodes classified under this topic (slug from particle_topic_browse, e.g. 'technology/artificial-intelligence'). Ignored when podcast_slug is set.
podcast_slugNoReturn one show's guest roster instead of the corpus directory: every guest who has appeared on this podcast, ranked by appearances on the show (no lifetime-appearance floor). Slug from particle_podcast_resolve. Only valid with the default directory mode. A particle.pro or Radar show link also works.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
appeared_sinceNoOnly guests with an appearance on or after this date (YYYY-MM-DD or ISO 8601). Directory mode only.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, non-destructive, open-world), and the description adds substantial behavior beyond them: the 2+ appearance floor, the in-window cross-show enforcement, the 5+ minute speaking-time requirement, mononymous-person exclusion, and the 2x spike rule. It also discloses what each row contains and what `include: ["expertise"]` widens.

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

Conciseness4/5

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

Front-loaded with the mode distinction, which is the decision an agent needs first, and every sentence carries filter or routing information. It is on the long side and some sentences (the press-tour shape) are dense enough that a skimming agent could miss the enforcement rules, keeping it shy of a 5.

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 15-parameter, zero-required tool with no output schema, the description covers mode semantics, filter interaction, resolution prerequisites, row contents, and downstream slug reuse. Nothing an agent needs to invoke it correctly is missing.

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

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 semantic value: `podcast_slug` swaps the ranking basis and lifts the lifetime floor, `topic_slug` narrows 'either corpus mode', and expertise filters are gated behind `particle_expertise_resolve` resolution. It does not explain `limit`/`cursor` or `output_format` trade-offs, which are left entirely to 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+resource ('Browse podcast guests across the catalog') and immediately distinguishes two concrete modes with their ranking rules. It even names the sibling tool to use for the adjacent daily chart use case, so an agent can differentiate without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use for each mode ('directory' for lifetime-ranked directory, 'trends' for cross-show press tours), plus an explicit alternative: use `particle_podcast_get_entity_chart` with `chart="guests"` for the daily ranked chart. It also gives recovery guidance ('on `unresolved_reference` resolve and retry rather than dropping the filter') and downstream routing via `particle_podcast_get_guest` / `particle_person_get`.

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

particle_podcast_request_transcriptionParticle Podcast Request TranscriptionA
Idempotent
Inspect

Request the transcription of a back-catalogue episode: one discovered in its podcast's feed but not yet transcribed, which particle_podcast_list_episodes (transcript_status=requestable, with podcast_slug) and particle_podcast_get_episode mark requestable. Its transcript, segments, speakers, entities and mentions do not exist until it is transcribed.

Billing: the request that queues the episode costs $0.05 per episode on every plan, charged in USD and never drawn from the included requests, and needs overage billing turned on (overage_required otherwise). Confirm the charge with the user before requesting. Every other outcome is billed as an ordinary lookup: an episode your organization already requested (the existing request is returned), one another organization's request already queued, or one we already hold.

It returns at once with the request's state: queued, admitted (being transcribed), transcribed, or failed (failure_reason says why; the charge is refunded). Transcription usually takes 5 to 10 minutes. Poll with particle_podcast_get_transcription_request, which is free; never call this tool again to poll. Once transcribed, the episode keeps its slug and every episode tool serves it: particle_podcast_get_episode, particle_podcast_find_mentions with episode_slug, and particle_podcast_search_transcripts.

NameRequiredDescriptionDefault
episode_slugYesThe episode to transcribe: the episode_slug particle_podcast_list_episodes or particle_podcast_get_episode gives an episode whose transcript is requestable (a back-catalogue episode's is its ID).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and openWorldHint=true, so the description carries the real burden and does so well: exact cost ($0.05/episode, USD, never drawn from included requests), prerequisite (overage billing must be on), refund on failure, non-charged outcomes (existing/queued/already-held requests billed as ordinary lookups), expected latency (5–10 minutes), return states (queued/admitted/transcribed/failed with failure_reason), and post-transcription discoverability across sibling tools. This is unusually complete behavioral disclosure consistent with idempotentHint=true.

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

Conciseness4/5

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

Front-loaded with the eligibility rule, then billing, then lifecycle/polling — a sensible order for an agent. The prose is dense and slightly repetitive around billing outcomes, but nearly every clause supplies a fact an agent needs to avoid a wrong or duplicate (paid) call.

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?

There is no output schema, so the description must explain return values, and it does: the immediate response carries a request state with enumerated values and failure_reason on failure. Combined with cost, prerequisites, latency and handoff to polling/discovery tools, an agent has everything needed to call this correctly and follow up.

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% for the single episode_slug parameter, so the baseline is 3; the description adds value by explaining where a valid slug comes from (list_episodes with transcript_status=requestable and podcast_slug, or get_episode) and that the episode ID serves as the slug for back-catalogue episodes. It stops short of format/syntax examples.

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 ('Request the transcription of a back-catalogue episode') and precisely scopes the eligible set: episodes found in a feed but not yet transcribed, marked requestable by particle_podcast_list_episodes (transcript_status=requestable) or particle_podcast_get_episode. It also clarifies what does not yet exist (transcript, segments, speakers, entities, mentions), so the agent can distinguish it from particle_podcast_get_transcription_request and the search/get tools.

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

Usage Guidelines5/5

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

Explicit when-to-use (only requestable back-catalogue episodes), when-not-to-use ('never call this tool again to poll'), and the named alternative for polling (particle_podcast_get_transcription_request, described as free). It also imposes a procedural precondition rarely stated so plainly: confirm the $0.05 charge with the user first.

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

particle_podcast_resolveParticle Podcast ResolveA
Read-only
Inspect

Find a podcast by free-text title, exact slug, iTunes ID, or RSS feed URL. Returns slug, title, episode count, bias, and the top recurring speakers (with entity slugs). Use the slug as the agent-facing handle to feed into other podcast tools (particle_podcast_find_mentions, particle_podcast_list_episodes, particle_podcast_get_sponsors).

Free-text matching is forgiving — typos, missing or extra words, and pasted episode titles all work. Results are ordered best-match-first; text matches carry a match_quality field, and an empty list means the catalog has no plausible candidate.

With all identifiers omitted, returns the most recently updated podcasts — useful for browsing the catalog when you don't have a name in mind. Narrow free-text browsing with topic_slug (topic concentration, descendants included), suitability_tier, or min_popularity (global popularity percentile over charting podcasts).

Optional hydrations attach extra data to each result in the same call:

  • include: ["external_links"]: third-party platform presences (directories, social profiles, video channels, publisher websites) with resolved URLs and audience metrics.

  • include: ["suitability"]: per-category brand-suitability breakdown (12 categories with prevalence, treatment, derived risk level, reasoning, and evidence excerpts) — premium-grade data, requires a plan with premium endpoints. The high-level suitability_tier enum (SAFE / LIMITED / SENSITIVE / UNSAFE) is rendered on every result without opt-in.

  • include: ["ratings_summary"]: listener-review aggregate (average stars, count, per-platform breakdown).

  • include: ["bias"]: full political-bias analysis (the high-level bias enum is always rendered without opt-in).

  • include: ["rankings"]: current chart positions across sources/countries/categories — premium-grade data, requires a plan with premium endpoints. For movers and history use particle_podcast_get_rankings.

  • include: ["format"]: the show's format profile — how often episodes feature guests, detected production formats (interview, panel, call_in, solo_narrated), ad and video presence, episode-length distribution, publishing cadence, and the publish-day pattern.

  • include: ["guest_expertise"]: the show's guest mix — shares of its analyzed guest appearances by established, senior and in-field guests and promotional appearances, and the occupations and fields it books most.

  • recent_episodes: N: inline this many of each result's most recent episodes (slug, title, published_at, duration) — skip the follow-up particle_podcast_list_episodes call when you only need the most recent tail.

Find shows by who they book with guest_occupation or guest_field (resolve the words to codes with particle_expertise_resolve first) and the share floors min_established_guest_share, min_in_field_guest_share and max_promotional_guest_share: guest_field="banking-finance-and-investment" with min_established_guest_share=0.5 finds shows that book established finance experts. For the shows that booked an occupation's or field's guests most in a recent window, use particle_expertise_get with include: ["top_podcasts"].

NameRequiredDescriptionDefault
slugNoExact slug match for a known handle (e.g. 'all-in').
limitNoMaximum candidates to return (1-25, default 5).
queryNoFree-text search across podcast titles and descriptions (case-insensitive partial match). Omit to fall back to the most recently updated podcasts.
includeNoOptional non-parameterized hydrations to attach to each result. 'external_links' adds third-party platform presences (directories, social profiles, video channels, publisher websites). 'suitability' adds the per-category brand-suitability breakdown (premium-grade data — requires a plan with premium endpoints). 'ratings_summary' adds the listener-review aggregate. 'bias' adds the full political-bias analysis. 'rankings' adds current chart positions (premium-grade data — requires a plan with premium endpoints). 'format' adds the format profile (guest frequency, interview/panel/call-in/solo formats, ads, video, episode length, cadence, publish days). 'related' adds the five most related shows (slug, score, band) — for the full ranked list with the basis behind each pair call particle_podcast_list_related. 'recommended_guests' adds the five guests the show could book next — people who have guested on its related shows but never on it (person slug, score, band, and the related shows that booked them); the booking pipeline. 'recommended_sponsors' adds the five advertisers the show could pitch — sponsors that run on its related shows but not on it (sponsor, linked company, score, band, ads and most recent ad across those shows, and which shows); the prospecting list (premium-grade data — requires a plan with premium endpoints). 'coverage' adds how much of the show's history we know of and have transcribed: discovered episodes by transcript status and by year, and whether its back catalogue (older episodes discovered in its feed but not transcribed) has been imported and is complete. 'guest_expertise' adds the show's guest mix: the shares of its analyzed guest appearances by established, senior or in-field guests and promotional appearances, and the occupations and fields it books most (codes the guest_ filters accept). 'speaker_statement_characteristics' adds how the show's lines are said over the last 365 days: each sentiment, certainty, specificity and temporal_orientation label's share of its scored lines, and for each pole label the share of profiled shows with a lower share (e.g. more forward-looking than 82% of shows) — how the show talks, not what it covers. The high-level suitability_tier and bias enums are always rendered without opt-in. Off by default; opt in only when needed.
rss_urlNoCanonical RSS feed URL. Resolves directly to the matching podcast.
itunes_idNoNumeric Apple Podcasts / iTunes ID (e.g. '1502871393'). Resolves directly to the matching podcast.
topic_slugNoFilter candidates by topic (slug from particle_topic_browse, e.g. 'technology/artificial-intelligence'). Matches podcasts where the topic — or any of its descendants — accounts for a meaningful share of episodes, ranked by concentration.
guest_fieldNoOnly shows whose analyzed guests include someone listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve.
min_popularityNoRestrict candidates to podcasts whose global popularity percentile is at least this value (0-1]. Popularity is a cume_dist ranking over currently-charting podcasts; non-charting podcasts are excluded when set. Omit or 0 to disable.
recent_episodesNoInline this many of each result's most recent episodes (slug, title, published_at, duration). 0 (default) means none — call particle_podcast_list_episodes if you need more than the inline tail. Capped at 25.
guest_occupationNoOnly shows whose analyzed guests include someone listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve.
suitability_tierNoFilter candidates by brand-suitability tier. Podcasts without a suitability analysis are excluded when set.
min_in_field_guest_shareNoOnly shows where at least this share (0-1) of analyzed guest appearances are guests speaking within their own field.
max_promotional_guest_shareNoOnly shows where at most this share (0-1) of analyzed guest appearances are promotional; 0 keeps only shows with none.
min_established_guest_shareNoOnly shows where at least this share (0-1) of analyzed guest appearances are by guests of established standing.

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial behavior beyond annotations: forgiving matching, best-match ordering, match_quality, empty-list meaning, premium-plan requirements for certain hydrations, and which fields are always rendered. Annotations already cover read-only safety, so the remaining premium/rate-limit details are not essential, but the description adds rich operational context.

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 purpose and return handle, then organizes advanced filters and hydrations clearly. It is long and somewhat duplicative with the include parameter schema, but most content is relevant and structured rather than 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 15 optional parameters, no output schema, and complex hydration options, the description is complete enough for correct invocation. It explains return fields, default browsing behavior, result ordering, premium constraints, and when to use follow-up 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. The description meaningfully supplements the schema with examples and cross-tool guidance for guest filters, topic concentration, popularity, and hydrations, though much of the include list duplicates the very detailed schema description.

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: find a podcast by title, slug, iTunes ID, or RSS URL. It also states what is returned and identifies the resulting slug as the agent-facing handle for other podcast tools, clearly distinguishing it from siblings such as list_episodes and find_mentions.

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 covers multiple usage modes: identifier lookup, forgiving free-text search, no-identifier browsing, filtering by topic/suitability/popularity/guest attributes, and optional hydrations. It also routes agents to alternatives such as particle_podcast_list_episodes when recent_episodes is insufficient and particle_expertise_get for top podcasts by guest field.

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

particle_podcast_search_transcriptsParticle Podcast Search TranscriptsA
Read-only
Inspect

Search the podcast catalog by what is said in episodes — by meaning (semantic_search), by exact phrase (keyword_search), or both at once (hybrid ranking). This is THE way to retrieve relevant dialogue, segments, and clips: each result is one segment of one episode with bounded transcript windows pinpointing the highest-relevance lines, plus any highlight clips that overlap the segment inline on the match.

Segments partition an episode's transcript — where start_line and end_line are present, every spoken line belongs to exactly one segment and one segment's end_line + 1 is the next one's start_line. They are contiguous in transcript lines, not in wall-clock seconds: the seconds between one segment's end_seconds and the next's start_seconds contain no transcribed speech. These matches do not carry the line ranges themselves — fetch them with particle_podcast_get_episode and include: ["segments"], where their absence marks an episode segmented by an earlier version, a small share of which do leave lines uncovered. Clips are sparse, engagement-ranked highlights that overlap some segments. There is no separate clip-search tool — relevant clips arrive on these matches, and a known episode's full clip list is particle_podcast_get_episode with include: ["clips"].

A match window defaults to one line of context around each matched line; raise context to widen windows in place instead of fetching the full transcript.

Screening many results? Pass format: "compact". Each match then carries only its identity — episode and podcast slugs, segment id and bounds, segment type, the segment's one-line description, and the relevance score — with no dialogue or clips, at a fraction of the size and latency of the default. Fan out compact searches over companies, themes, or dates, decide which segments matter, then read dialogue only for those: particle_podcast_get_episode with include: ["transcript"] and transcript_start/transcript_end set to the segment's bounds, or this tool again with episode_slug narrowed to that episode.

Use this for "find dialogue about a topic". For "every line naming a person or company" use particle_podcast_find_mentions instead — person_slug and company_slug here narrow ranked results, they don't drive the ranking.

Choosing your query. At least one of semantic_search or keyword_search is required, and they do different jobs:

  • semantic_search carries the idea. Write it as a sentence describing what should be discussed, in the vocabulary a speaker would use. It is paraphrase-tolerant, so it finds the topic however it happens to be worded.

  • keyword_search carries words that must be literally spoken. Every word must occur in the same passage, so it is for one or two exact tokens — a ticker, a product name — not for a description. Putting a sentence here returns nothing.

  • Use both when a topic must also contain an exact term. The result is their intersection, which is narrow by design; if that comes back empty, keyword_match: "ranked" relaxes the keyword side to a relevance hint.

Do not put a name in semantic_search. Resolve it (particle_person_resolve, particle_company_resolve, particle_entity_resolve) and pass the slug — searching for "Sam Altman" as text finds passages that sound like him, while person_slug finds the episodes actually featuring him.

The question's constraints go on the first call. Who is speaking, which person, company or show, which window or language: when the question states it, pass it from the start, because a search without it answers a different question. Hold back only the filters you add on your own (a segment_type, a role, a narrower window) until a search shows the topic has coverage: every filter compounds, and each one can remove all results. If a search returns nothing because of a filter, the error names the parameter responsible and the retry to make — act on it rather than re-issuing variations of the same query, and when a constraint the question stated is what emptied it, say so before showing anything wider.

Note on role. It describes how someone relates to the episode: guest/host/panelist/correspondent mean they spoke, mention means they were talked about. Omitting role covers both and is almost always what you want.

Who is speaking. When the question restricts who speaks by occupation, profession or industry ("medical professionals", "economists", "lawyers"), pass the words themselves as guest_occupation, which resolves an everyday word to the occupation, field or capacity it names, or a code from particle_expertise_resolve as guest_occupation/guest_field (plus guest_standing="established" or guest_practicing=true when credentials matter); never stand the profession in for a filter inside semantic_search. On unresolved_reference, resolve and retry; never drop the filter. A word no occupation names may name a capacity ("founders", "politicians"): pass it as guest_capacity. The filters AND together, so two groups ("founders and VCs") take one call each. The filters keep segments in which such a guest speaks, so a window can also carry the host's lines: each full-format match lists its identified speakers as **Speaker:** rows with their occupation codes, standing and seniority — check them before attributing a line to a credential.

How each line is said. Lines in topic and interview segments end with their speaker statement characteristics, pole labels only, e.g. _[positive · confident · future]_: sentiment (negative/positive), certainty (hedged/confident), specificity (vague/specific) and temporal orientation (past/future). A pole label means the line clearly reads that way; _[neutral]_ means it leans clearly on no axis; no brackets means the line was not read (short lines, intros, ad breaks). With output_format=json they are each line's speaker_statement_characteristics object, middle labels included.

Filtering by how a line is said. Pass speaker_statement_characteristics to keep only lines said a certain way: {"sentiment": ["negative"]} for criticism, {"specificity": ["specific"], "temporal_orientation": ["future"]} for concrete predictions, {"certainty": ["confident"], "sentiment": ["positive"], "temporal_orientation": ["future"]} for a high-conviction outlook. Put the topic, never the tone, in semantic_search. Every matched or mention line then carries labels the filter accepts.

Without a topic. On particle_podcast_search_transcripts, the filter alone with episode_slug, speaker or a guest_ filter (no semantic_search or keyword_search) returns the strongest lines said that way, at most 50, strongest first: an episode's boldest predictions, or a person's most confident claims. Their Match row reads characteristics. For the strongest lines naming a person, company or entity, pass the filter with sort: "strength" on particle_podcast_find_mentions instead.

NameRequiredDescriptionDefault
roleNoHow the entity must relate to the episode. Speaking roles: 'guest', 'host', 'panelist', 'correspondent', or 'speaker' for any of them. 'mention' means the entity is talked about rather than speaking. Omit to match both — usually what you want.
sortNoSort order. Defaults to relevance.
limitNoResults per page (1-50, default 10).
sinceNoOnly segments from episodes published on or after this ISO 8601 date.
untilNoOnly segments from episodes published on or before this ISO 8601 date.
cursorNoOpaque pagination cursor from a previous response.
formatNoResponse shape. 'full' (default) carries each match's bounded dialogue windows and overlapping clips. 'compact' returns the same ranked matches with no dialogue — episode and podcast slugs, segment id and bounds, segment type, the segment's one-line description, and the relevance score — at a fraction of the size and latency, because the transcript load and line scoring are skipped. Use it to screen many results (a fan-out over companies, themes, or dates) and read dialogue only for the survivors.
contextNoLines of surrounding dialogue around each matched line (1-15, default 1). Widens each match window in place — use a larger value instead of fetching the full transcript when a match needs more context. Ignored when format is compact.
speakerNoPerson slug or ID from particle_person_resolve (e.g. 'sam-altman'). Keeps only passages in which this person speaks a line, and only their lines can match: 'did X say Y', where person_slug is 'Y came up in an episode with X'. With keyword_search their own lines must carry every quoted phrase (and every unquoted word under keyword_match=required). A clip of them played on another show does not count, so this finds the original rather than its replays. An empty result does not prove they never said it: narrow with podcast_slug, episode_slug or dates, or try semantic_search. Cannot be combined with the guest_ filters.
languageNoRestrict to episodes of podcasts in this language — ISO 639-1 code (e.g. 'fr'). Matches the podcast's primary language subtag, so 'fr' covers 'fr-FR'.
entity_slugNoKnowledge-graph entity slug from particle_entity_resolve for the long tail that isn't a person or company — places, organizations, events, products, concepts (e.g. 'germany'). Use person_slug for people and company_slug for companies.
entity_typeNoNarrow to dialogue in episodes that mention any entity of this category — e.g. 'book', 'company', 'movie', 'school'. Use for 'discussions of X that reference some book'. Ignored when person_slug/company_slug/entity_slug names a specific entity, which is strictly narrower. Categories come from particle_catalog.
guest_fieldNoOnly episodes with a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment').
person_slugNoPerson slug or encoded person ID from particle_person_resolve, particle_entity_resolve, or the guest tools (e.g. 'sam-altman'). Filters results to dialogue featuring this person. For 'every line about X' use particle_podcast_find_mentions instead.
company_slugNoCompany slug, domain, or ID. Resolves to the company's linked entity and applies as a filter.
episode_slugNoFilter to a specific episode by slug or ID. A particle.pro or Radar episode link also works.
podcast_slugNoPodcast slug, internal ID, or numeric iTunes ID. A particle.pro or Radar show link also works.
segment_typeNoSegment type filter.
speaker_roleNoKeep only lines whose speaker held one of these roles in the episode: guest, panelist, host, correspondent, or speaker for any of them. ["guest", "panelist"] leaves out the hosts' lines, such as a news show's scripted reads. Every matched line is spoken in one of the roles. No default: omit it to keep every speaker's lines. Not role, which is how person_slug, company_slug or entity_slug relates to the episode. With speaker, keeps that person's lines in these roles; beside the guest_ filters it must name guest or panelist.
keyword_matchNoHow UNQUOTED keyword_search words are applied. 'required' (default) excludes any passage missing one of them, which also makes a hybrid call an intersection with semantic_search. Switch to 'ranked' when keyword_search is a loose bag of related words that will not co-occur — then those words only steer relevance. Quoted phrases still filter in both modes: to relax a phrase, remove its quotes rather than switching mode.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.
guest_capacityNoOnly episodes with a guest who knows their field in this capacity (e.g. 'executive_founder' for founders). It narrows the other filters; particle_expertise_resolve names the capacity an everyday word means.
guest_in_fieldNoOnly episodes with a guest speaking within their own field (the guest the other guest_ filters select, when given).
guest_standingNoOnly episodes with a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.
keyword_searchNoWords that must literally be spoken. Use for exact tokens a paraphrase would miss — tickers, product names, drug names, model numbers. Every word must appear in the same passage (see keyword_match), so keep it to the one or two words that must be said and put the rest of the idea in semantic_search. Wrap words in double quotes to also require them adjacent and in order in the segment's spoken dialogue — only for short exact strings, never for a sentence. A quoted name matches segments where the name appears in the dialogue, not segments that person speaks in; use person_slug or particle_podcast_find_mentions for a person's appearances. There is no boolean OR: 'a OR b' requires the literal word 'OR', so issue one call per alternative.
guest_seniorityNoOnly episodes with a guest at this seniority or above.
semantic_searchNoVector-similarity search by meaning. Express the query the way you'd describe the topic to a colleague — paraphrase tolerant. Combine with keyword_search for hybrid ranking. Describe a topic, not a name: to find a specific person/company/entity, filter with person_slug / company_slug / entity_slug (or use particle_podcast_find_mentions for every line about them) — and for an exact token like a ticker, use keyword_search. Describe a topic, not a tone: optimistic, skeptical, predictions and other ways something is said go in speaker_statement_characteristics ('AI drug discovery', not 'optimistic predictions about AI drug discovery').
guest_occupationNoOnly episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). A word with no occupation filters by the field of research or capacity it names: 'oncologists' is field 3211, 'founders' is capacity executive_founder.
guest_practicingNoOnly episodes with a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group (e.g. '29-1212' or 'physicians').
speaker_statement_characteristicsNoKeep only lines said a certain way. HOW something is said goes here and never in semantic_search: optimistic or bullish → sentiment positive; skeptical, critical or bearish → sentiment negative; predictions or forecasts → temporal_orientation future (add specificity specific for concrete predictions); high conviction → certainty confident; hedging → certainty hedged; concrete claims → specificity specific. The topic goes in semantic_search and who speaks in the guest_ or speaker filters. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names. Every matched line carries labels the filter accepts. Example: {"certainty": ["confident"], "temporal_orientation": ["future"]}.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only, open-world, non-destructive behavior, and the description is fully consistent with that. It adds substantial behavioral context beyond annotations: result shape, segment partition semantics, clip overlap behavior, compact-mode tradeoffs, line-characteristic labels, and error behavior when filters remove all results.

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 and organized with bold headings, and its length is justified by the tool's complexity. However, some points are repeated between the overview and the schema-like parameter notes, and the very long prose could be tighter without losing necessary guidance.

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

Completeness5/5

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

Given 30 parameters, no required fields, and no output schema, the description is unusually complete. It explains return formats, segment and clip behavior, compact screening, speaker characteristics, query construction, and filter interactions, so an agent has enough context to invoke the tool correctly.

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

Parameters5/5

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

Schema description coverage is 100%, so the schema already documents the parameters, but the description adds strategic meaning beyond those field descriptions. It clarifies semantic versus keyword search, hybrid intersection behavior, `role` versus `speaker`, guest filter interactions, `speaker_statement_characteristics`, and how constraints compound, which is valuable for a 30-parameter tool.

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: searching the podcast catalog by spoken episode content. It distinguishes semantic, keyword, and hybrid search modes in the first sentence and later names the sibling tool `particle_podcast_find_mentions` for a different retrieval need, so an agent can identify the tool's role 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?

It gives extensive when-to-use guidance: semantic vs keyword vs hybrid query construction, when to use `particle_podcast_find_mentions` instead, how to screen many results with `format: "compact"`, and how to handle filters that are stated by the question versus self-added. It also explains alternatives and retry behavior when filters empty results, leaving little to inference.

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

particle_topic_browseParticle Topic BrowseA
Read-only
Inspect

Navigate the topic taxonomy. Without parent_slug, returns the top-level roots (Politics, Business, Technology, etc.). With parent_slug set, returns the direct children of that topic. Topic slugs use a parent/child convention (e.g. politics/elections) and let agents browse the hierarchy to find well-named categories.

To find a topic by name instead of walking the tree, pass query (e.g. artificial intelligence): exact names rank first, then prefixes, then substrings (for a word of 3+ characters), each by story coverage, and parent_slug narrows the search to that subtree. The same name often sits under several parents, so read the ancestry before picking a slug. Topic slugs feed the topic_slug filters on particle_podcast_resolve and particle_podcast_list_guests.

NameRequiredDescriptionDefault
limitNoTopics per page (1-100, default 50).
queryNoFind topics by name: exact names first, then names starting with it, then (when it has a word of 3 or more characters) names containing it, each ranked by story coverage. Covers topics with at least 5 story clusters; browse with parent_slug for the long tail. Pages reach the top 200 matches.
cursorNoOpaque pagination cursor from a previous response.
parent_slugNoTopic slug or ID. Returns the direct children of this topic. Omit for top-level roots (Politics, Business, Technology, etc.). With query, limits the search to this topic's descendants.
output_formatNoOutput serialization. 'markdown' (default) returns the LLM-facing rendering. 'json' returns the structured payload as JSON text — use only for programmatic chaining where exact field extraction matters; the JSON shape is larger and noisier for an LLM to read.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only establish the read-only, non-destructive, closed-world profile. The description goes well beyond: it discloses the ranking order (exact, prefix, substring by story coverage), the query mode's coverage floor ('at least 5 story clusters'), a 200-match page ceiling, and a real caution that the same name sits under several parents so ancestry must be read first.

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?

Two tight paragraphs, front-loaded with the primary browse behavior before the query alternative. It is slightly repetitive with the schema's query-ranking wording, and the downstream-tool sentence could be trimmed, but no sentence is wasted.

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 5-param, no-required, read-only browse tool with no output schema, the description covers both modes, ranking, coverage limits, pagination ceiling, and downstream slug usage. It does not describe the shape of an individual returned topic, which is a minor gap given no output schema exists.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds genuinely non-schema meaning: the parent/child slug convention with an example ('politics/elections') and the fact that parent_slug narrows query to that subtree. Minor redundancy with the schema's own query ranking text keeps it from a 5.

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 ('Navigate the topic taxonomy') and precisely defines both operating modes: no parent_slug returns top-level roots, with parent_slug returns direct children. No sibling tool in this server does taxonomy browsing, so the agent can identify it immediately.

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 contrasts the two paths: walk the tree via parent_slug, or 'to find a topic by name instead of walking the tree, pass query.' It also names the downstream consumers ('topic_slug' filters on particle_podcast_resolve and particle_podcast_list_guests), telling the agent why it would call this before those.

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. 1 tool update
    • Addedparticle_podcast_get_entity_chart
  2. 1 tool update
    • Changedparticle_podcast_search_transcripts1 field changed
      • addedInput schema / properties / speaker_role
        Added value: +{
        +  "description": "Keep only lines whose speaker held one of these roles in the episode: guest, panelist, host, correspondent, or speaker for any of them. [\"guest\", \"panelist\"] leaves out the hosts' lines, such as a news show's scripted reads. Every matched line is spoken in one of the roles. No default: omit it to keep every speaker's lines. Not role, which is how person_slug, company_slug or entity_slug relates to the episode. With speaker, keeps that person's lines in these roles; beside the guest_ filters it must name guest or panelist.",
        +  "items": {
        +    "enum": [
        +      "guest",
        +      "panelist",
        +      "host",
        +      "correspondent",
        +      "speaker"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  3. 14 tool updates
    • Changedparticle_alert_create1 field changed
      • addedInput schema / properties / filters / properties / speaker_statement_characteristics
        Added value: +{
        +  "description": "ENTITY_MENTION alerts only — sending it on a PODCAST_SPEAKER or KEYWORD_MENTION alert returns unprocessable_entity. Keeps a match only when one of its mention lines was said the way you ask, the same filter particle_podcast_find_mentions takes: {'sentiment': ['negative']} for criticism of the watched entity, {'specificity': ['specific'], 'temporal_orientation': ['future']} for concrete predictions about it, {'certainty': ['confident']} for confident claims. Labels on one axis OR together, axes AND. Mention lines the filter does not accept are not marked as mentions and do not count. Put how something is said here, never in the alert's title or keyword.",
        +  "properties": {
        +    "certainty": {
        +      "description": "How sure the speaker sounds. 'confident' for flat assertions and high conviction; 'hedged' for maybe, I think, it could, and other hedging; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "hedged",
        +          "neutral",
        +          "confident"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sentiment": {
        +      "description": "The statement's tone. 'positive' for optimistic, bullish, approving or praising lines; 'negative' for skeptical, bearish, critical or worried ones; 'neutral' for lines that clearly lean neither way.",
        +      "items": {
        +        "enum": [
        +          "negative",
        +          "neutral",
        +          "positive"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "specificity": {
        +      "description": "Whether the line commits to something concrete. 'specific' for names, numbers, dates and mechanisms (concrete claims); 'vague' for generalities; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "vague",
        +          "neutral",
        +          "specific"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "temporal_orientation": {
        +      "description": "Where the line points in time. 'future' for predictions, forecasts, plans and expectations; 'past' for looking back; 'present' for how things are now.",
        +      "items": {
        +        "enum": [
        +          "past",
        +          "present",
        +          "future"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedparticle_alert_preview2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Same as particle_alert_create.filters. Pass the filters you intend to save so the estimate reflects what the alert would actually surface. Only languages and speaker_roles narrow the historical sweep; relevance and source_popularity are read-time projections that don't run on historical episodes, so setting them leaves the count unchanged (the estimate is an upper bound when relevance=RELEVANT)."New value: +"Same as particle_alert_create.filters. Pass the filters you intend to save so the estimate reflects what the alert would actually surface. languages, speaker_roles, source_popularity and speaker_statement_characteristics narrow the historical sweep exactly as they narrow new matches; relevance is graded only on new matches, so setting it leaves the count unchanged (the estimate is an upper bound when relevance=RELEVANT)."
      • addedInput schema / properties / filters / properties / speaker_statement_characteristics
        Added value: +{
        +  "description": "ENTITY_MENTION alerts only — sending it on a PODCAST_SPEAKER or KEYWORD_MENTION alert returns unprocessable_entity. Keeps a match only when one of its mention lines was said the way you ask, the same filter particle_podcast_find_mentions takes: {'sentiment': ['negative']} for criticism of the watched entity, {'specificity': ['specific'], 'temporal_orientation': ['future']} for concrete predictions about it, {'certainty': ['confident']} for confident claims. Labels on one axis OR together, axes AND. Mention lines the filter does not accept are not marked as mentions and do not count. Put how something is said here, never in the alert's title or keyword.",
        +  "properties": {
        +    "certainty": {
        +      "description": "How sure the speaker sounds. 'confident' for flat assertions and high conviction; 'hedged' for maybe, I think, it could, and other hedging; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "hedged",
        +          "neutral",
        +          "confident"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sentiment": {
        +      "description": "The statement's tone. 'positive' for optimistic, bullish, approving or praising lines; 'negative' for skeptical, bearish, critical or worried ones; 'neutral' for lines that clearly lean neither way.",
        +      "items": {
        +        "enum": [
        +          "negative",
        +          "neutral",
        +          "positive"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "specificity": {
        +      "description": "Whether the line commits to something concrete. 'specific' for names, numbers, dates and mechanisms (concrete claims); 'vague' for generalities; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "vague",
        +          "neutral",
        +          "specific"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "temporal_orientation": {
        +      "description": "Where the line points in time. 'future' for predictions, forecasts, plans and expectations; 'past' for looking back; 'present' for how things are now.",
        +      "items": {
        +        "enum": [
        +          "past",
        +          "present",
        +          "future"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedparticle_alert_update1 field changed
      • addedInput schema / properties / filters / properties / speaker_statement_characteristics
        Added value: +{
        +  "description": "ENTITY_MENTION alerts only — sending it on a PODCAST_SPEAKER or KEYWORD_MENTION alert returns unprocessable_entity. Keeps a match only when one of its mention lines was said the way you ask, the same filter particle_podcast_find_mentions takes: {'sentiment': ['negative']} for criticism of the watched entity, {'specificity': ['specific'], 'temporal_orientation': ['future']} for concrete predictions about it, {'certainty': ['confident']} for confident claims. Labels on one axis OR together, axes AND. Mention lines the filter does not accept are not marked as mentions and do not count. Put how something is said here, never in the alert's title or keyword.",
        +  "properties": {
        +    "certainty": {
        +      "description": "How sure the speaker sounds. 'confident' for flat assertions and high conviction; 'hedged' for maybe, I think, it could, and other hedging; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "hedged",
        +          "neutral",
        +          "confident"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sentiment": {
        +      "description": "The statement's tone. 'positive' for optimistic, bullish, approving or praising lines; 'negative' for skeptical, bearish, critical or worried ones; 'neutral' for lines that clearly lean neither way.",
        +      "items": {
        +        "enum": [
        +          "negative",
        +          "neutral",
        +          "positive"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "specificity": {
        +      "description": "Whether the line commits to something concrete. 'specific' for names, numbers, dates and mechanisms (concrete claims); 'vague' for generalities; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "vague",
        +          "neutral",
        +          "specific"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "temporal_orientation": {
        +      "description": "Where the line points in time. 'future' for predictions, forecasts, plans and expectations; 'past' for looking back; 'present' for how things are now.",
        +      "items": {
        +        "enum": [
        +          "past",
        +          "present",
        +          "future"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedparticle_company_get_statement_characteristics
    • Addedparticle_person_get_statement_characteristics
    • Addedparticle_podcast_compare_share_of_voice
    • Changedparticle_podcast_find_mentions2 fields changed
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "Episode order. 'recency' (default) is newest first. 'strength' requires speaker_statement_characteristics and puts the episodes whose mentions carry those labels most clearly first (the most clearly negative takes, the most confident predictions), each episode's mentions strongest first. Pass the same sort with a cursor.",
        +  "enum": [
        +    "recency",
        +    "strength"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / speaker_statement_characteristics
        Added value: +{
        +  "description": "Keep only mentions said a certain way. This tool takes no topic text: the subject is person_slug, company_slug or entity_slug, and HOW it is spoken of goes here: criticism, skepticism or bearish takes → sentiment negative; praise, optimism or bullish takes → sentiment positive; predictions or forecasts → temporal_orientation future (add specificity specific for concrete predictions); high conviction → certainty confident; hedging → certainty hedged; concrete claims → specificity specific. Who speaks goes in the guest_ filters. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names. Every mention line carries labels the filter accepts. Needs a subject with a knowledge graph entity: one matched only by name is refused. Example, criticism of the subject: {\"sentiment\": [\"negative\"]}. To narrow to a topic as well, call particle_podcast_search_transcripts with the subject's company_slug or entity_slug, the topic in semantic_search, and this filter.",
        +  "properties": {
        +    "certainty": {
        +      "description": "How sure the speaker sounds. 'confident' for flat assertions and high conviction; 'hedged' for maybe, I think, it could, and other hedging; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "hedged",
        +          "neutral",
        +          "confident"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sentiment": {
        +      "description": "The statement's tone. 'positive' for optimistic, bullish, approving or praising lines; 'negative' for skeptical, bearish, critical or worried ones; 'neutral' for lines that clearly lean neither way.",
        +      "items": {
        +        "enum": [
        +          "negative",
        +          "neutral",
        +          "positive"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "specificity": {
        +      "description": "Whether the line commits to something concrete. 'specific' for names, numbers, dates and mechanisms (concrete claims); 'vague' for generalities; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "vague",
        +          "neutral",
        +          "specific"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "temporal_orientation": {
        +      "description": "Where the line points in time. 'future' for predictions, forecasts, plans and expectations; 'past' for looking back; 'present' for how things are now.",
        +      "items": {
        +        "enum": [
        +          "past",
        +          "present",
        +          "future"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedparticle_podcast_get_episode2 fields changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional response sections: 'transcript' (bounded dialogue transcript — large for long episodes; narrow it with the transcript_* sub-params), 'segments' (structural outline with timestamps), 'entities' (complete mentioned-entity list instead of the top 20), 'clips' (engagement-ranked highlight clips), 'topics' (topic classifications with slugs), 'related' (the five episodes from OTHER shows most related to this one — slug, show, score, band; for the full ranked list with the basis behind each match call particle_podcast_list_related_episodes), 'guest_expertise' (each guest's expertise read and how the episode used it: whether they spoke within their field, whether the appearance was promotional, how they were introduced). Default response is lean — request only what you need."New value: +"Optional response sections: 'transcript' (bounded dialogue transcript — large for long episodes; narrow it with the transcript_* sub-params), 'segments' (structural outline with timestamps), 'entities' (complete mentioned-entity list instead of the top 20), 'clips' (engagement-ranked highlight clips), 'topics' (topic classifications with slugs), 'related' (the five episodes from OTHER shows most related to this one — slug, show, score, band; for the full ranked list with the basis behind each match call particle_podcast_list_related_episodes), 'guest_expertise' (each guest's expertise read and how the episode used it: whether they spoke within their field, whether the appearance was promotional, how they were introduced), 'speaker_statement_characteristics' (how the lines were said: label shares overall and per identified speaker, who is most hedged or forward-looking, and up to 5 of its strongest predictions, confident claims, criticism and optimism lines). Default response is lean — request only what you need."
      • changedInput schema / properties / include / items / enum
        Previous value: -[
        -  "transcript",
        -  "segments",
        -  "entities",
        -  "clips",
        -  "topics",
        -  "related",
        -  "guest_expertise"
        -]New value: +[
        +  "transcript",
        +  "segments",
        +  "entities",
        +  "clips",
        +  "topics",
        +  "related",
        +  "guest_expertise",
        +  "speaker_statement_characteristics"
        +]
    • Changedparticle_podcast_get_mention_trends2 fields changed
      • addedInput schema / properties / breakdown
        Added value: +{
        +  "description": "timeseries only: also split each bucket's mentions by their label on this speaker statement characteristics axis: breakdown='sentiment' answers 'is it spoken of more negatively this quarter?'. Each bucket's label shares are of its scored mentions, and a bucket with fewer than 20 is marked low sample. Mention counts are unchanged. Needs published_after, at most 365 days before published_before.",
        +  "enum": [
        +    "sentiment",
        +    "certainty",
        +    "specificity",
        +    "temporal_orientation"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / speaker_statement_characteristics
        Added value: +{
        +  "description": "timeseries only: count only mentions said a certain way: {\"temporal_orientation\": [\"future\"]} charts predictions about the subject; {\"sentiment\": [\"negative\"]} criticism. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names. Needs published_after, at most 365 days before published_before.",
        +  "properties": {
        +    "certainty": {
        +      "description": "How sure the speaker sounds. 'confident' for flat assertions and high conviction; 'hedged' for maybe, I think, it could, and other hedging; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "hedged",
        +          "neutral",
        +          "confident"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sentiment": {
        +      "description": "The statement's tone. 'positive' for optimistic, bullish, approving or praising lines; 'negative' for skeptical, bearish, critical or worried ones; 'neutral' for lines that clearly lean neither way.",
        +      "items": {
        +        "enum": [
        +          "negative",
        +          "neutral",
        +          "positive"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "specificity": {
        +      "description": "Whether the line commits to something concrete. 'specific' for names, numbers, dates and mechanisms (concrete claims); 'vague' for generalities; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "vague",
        +          "neutral",
        +          "specific"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "temporal_orientation": {
        +      "description": "Where the line points in time. 'future' for predictions, forecasts, plans and expectations; 'past' for looking back; 'present' for how things are now.",
        +      "items": {
        +        "enum": [
        +          "past",
        +          "present",
        +          "future"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedparticle_podcast_get_share_of_voice9 fields changed
      • addedInput schema / properties / breakdown
        Added value: +{
        +  "description": "Also split each group's lines by their label on this axis: by='occupation' with breakdown='sentiment' is how each occupation spoke of the subject. A group's breakdown shares are of its scored mentions, and a group with fewer than 20 is marked low sample. Must differ from by. Not with keyword_search.",
        +  "enum": [
        +    "sentiment",
        +    "certainty",
        +    "specificity",
        +    "temporal_orientation"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / by / description
        Previous value: -"Group the speakers by 'occupation' (SOC 2018, default) or 'field' (ANZSRC 2020 fields of research)."New value: +"Group the speakers by 'occupation' (SOC 2018, default) or 'field' (ANZSRC 2020 fields of research), or group the counted lines by HOW they were said: 'sentiment', 'certainty', 'specificity' or 'temporal_orientation' gives one group per label (how negatively or positively NVIDIA is spoken of is by='sentiment'). Not with keyword_search."
      • changedInput schema / properties / by / enum
        Previous value: -[
        -  "occupation",
        -  "field"
        -]New value: +[
        +  "occupation",
        +  "field",
        +  "sentiment",
        +  "certainty",
        +  "specificity",
        +  "temporal_orientation"
        +]
      • addedInput schema / properties / examples
        Added value: +{
        +  "description": "Also quote up to this many lines (0-3, default 0) for each group, or with breakdown for each of its labels: the quote, who said it, the episode and a timestamp linked to the moment. Strongest first: the lines that most clearly carry the label or read the way speaker_statement_characteristics asks; with neither, the newest. At most one per episode, from different speakers where it can. Not with keyword_search.",
        +  "maximum": 3,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / level / description
        Previous value: -"Group level: 'major' (default; SOC major groups or ANZSRC divisions) or 'detailed' (detailed occupations or ANZSRC groups)."New value: +"Group level: 'detailed' (default; detailed occupations or ANZSRC groups, each with the top-level group it sits under) or 'major' (SOC major groups or ANZSRC divisions only)."
      • changedInput schema / properties / level / enum
        Previous value: -[
        -  "major",
        -  "detailed"
        -]New value: +[
        +  "detailed",
        +  "major"
        +]
      • addedInput schema / properties / speaker_statement_characteristics
        Added value: +{
        +  "description": "Count only mentions said a certain way: {\"temporal_orientation\": [\"future\"]} splits who makes predictions about the subject; {\"sentiment\": [\"negative\"]} who criticizes it. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names. Not with keyword_search.",
        +  "properties": {
        +    "certainty": {
        +      "description": "How sure the speaker sounds. 'confident' for flat assertions and high conviction; 'hedged' for maybe, I think, it could, and other hedging; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "hedged",
        +          "neutral",
        +          "confident"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sentiment": {
        +      "description": "The statement's tone. 'positive' for optimistic, bullish, approving or praising lines; 'negative' for skeptical, bearish, critical or worried ones; 'neutral' for lines that clearly lean neither way.",
        +      "items": {
        +        "enum": [
        +          "negative",
        +          "neutral",
        +          "positive"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "specificity": {
        +      "description": "Whether the line commits to something concrete. 'specific' for names, numbers, dates and mechanisms (concrete claims); 'vague' for generalities; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "vague",
        +          "neutral",
        +          "specific"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "temporal_orientation": {
        +      "description": "Where the line points in time. 'future' for predictions, forecasts, plans and expectations; 'past' for looking back; 'present' for how things are now.",
        +      "items": {
        +        "enum": [
        +          "past",
        +          "present",
        +          "future"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / speakers / description
        Previous value: -"Whose lines count: 'all' (default, hosts included) or 'guests' (guests and panelists only)."New value: +"Whose lines count: 'guests' (default; guests and panelists) or 'all' (hosts included). Hosts speak most mention lines and their own occupations dominate an 'all' split, so pass 'all' only when the hosts' voice is the question."
      • changedInput schema / properties / speakers / enum
        Previous value: -[
        -  "all",
        -  "guests"
        -]New value: +[
        +  "guests",
        +  "all"
        +]
    • Addedparticle_podcast_get_transcription_request
    • Addedparticle_podcast_request_transcription
    • Changedparticle_podcast_resolve2 fields changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional non-parameterized hydrations to attach to each result. 'external_links' adds third-party platform presences (directories, social profiles, video channels, publisher websites). 'suitability' adds the per-category brand-suitability breakdown (premium-grade data — requires a plan with premium endpoints). 'ratings_summary' adds the listener-review aggregate. 'bias' adds the full political-bias analysis. 'rankings' adds current chart positions (premium-grade data — requires a plan with premium endpoints). 'format' adds the format profile (guest frequency, interview/panel/call-in/solo formats, ads, video, episode length, cadence, publish days). 'related' adds the five most related shows (slug, score, band) — for the full ranked list with the basis behind each pair call particle_podcast_list_related. 'recommended_guests' adds the five guests the show could book next — people who have guested on its related shows but never on it (person slug, score, band, and the related shows that booked them); the booking pipeline. 'recommended_sponsors' adds the five advertisers the show could pitch — sponsors that run on its related shows but not on it (sponsor, linked company, score, band, ads and most recent ad across those shows, and which shows); the prospecting list (premium-grade data — requires a plan with premium endpoints). 'coverage' adds how much of the show's history we know of and have transcribed: discovered episodes by transcript status and by year, and whether its back catalogue (older episodes discovered in its feed but not transcribed) has been imported and is complete. 'guest_expertise' adds the show's guest mix: the shares of its analyzed guest appearances by established, senior or in-field guests and promotional appearances, and the occupations and fields it books most (codes the guest_ filters accept). The high-level suitability_tier and bias enums are always rendered without opt-in. Off by default; opt in only when needed."New value: +"Optional non-parameterized hydrations to attach to each result. 'external_links' adds third-party platform presences (directories, social profiles, video channels, publisher websites). 'suitability' adds the per-category brand-suitability breakdown (premium-grade data — requires a plan with premium endpoints). 'ratings_summary' adds the listener-review aggregate. 'bias' adds the full political-bias analysis. 'rankings' adds current chart positions (premium-grade data — requires a plan with premium endpoints). 'format' adds the format profile (guest frequency, interview/panel/call-in/solo formats, ads, video, episode length, cadence, publish days). 'related' adds the five most related shows (slug, score, band) — for the full ranked list with the basis behind each pair call particle_podcast_list_related. 'recommended_guests' adds the five guests the show could book next — people who have guested on its related shows but never on it (person slug, score, band, and the related shows that booked them); the booking pipeline. 'recommended_sponsors' adds the five advertisers the show could pitch — sponsors that run on its related shows but not on it (sponsor, linked company, score, band, ads and most recent ad across those shows, and which shows); the prospecting list (premium-grade data — requires a plan with premium endpoints). 'coverage' adds how much of the show's history we know of and have transcribed: discovered episodes by transcript status and by year, and whether its back catalogue (older episodes discovered in its feed but not transcribed) has been imported and is complete. 'guest_expertise' adds the show's guest mix: the shares of its analyzed guest appearances by established, senior or in-field guests and promotional appearances, and the occupations and fields it books most (codes the guest_ filters accept). 'speaker_statement_characteristics' adds how the show's lines are said over the last 365 days: each sentiment, certainty, specificity and temporal_orientation label's share of its scored lines, and for each pole label the share of profiled shows with a lower share (e.g. more forward-looking than 82% of shows) — how the show talks, not what it covers. The high-level suitability_tier and bias enums are always rendered without opt-in. Off by default; opt in only when needed."
      • changedInput schema / properties / include / items / enum
        Previous value: -[
        -  "external_links",
        -  "suitability",
        -  "ratings_summary",
        -  "bias",
        -  "rankings",
        -  "format",
        -  "related",
        -  "recommended_guests",
        -  "recommended_sponsors",
        -  "coverage",
        -  "guest_expertise"
        -]New value: +[
        +  "external_links",
        +  "suitability",
        +  "ratings_summary",
        +  "bias",
        +  "rankings",
        +  "format",
        +  "related",
        +  "recommended_guests",
        +  "recommended_sponsors",
        +  "coverage",
        +  "guest_expertise",
        +  "speaker_statement_characteristics"
        +]
    • Changedparticle_podcast_search_transcripts2 fields changed
      • changedInput schema / properties / semantic_search / description
        Previous value: -"Vector-similarity search by meaning. Express the query the way you'd describe the topic to a colleague — paraphrase tolerant. Combine with keyword_search for hybrid ranking. Describe a topic, not a name: to find a specific person/company/entity, filter with person_slug / company_slug / entity_slug (or use particle_podcast_find_mentions for every line about them) — and for an exact token like a ticker, use keyword_search."New value: +"Vector-similarity search by meaning. Express the query the way you'd describe the topic to a colleague — paraphrase tolerant. Combine with keyword_search for hybrid ranking. Describe a topic, not a name: to find a specific person/company/entity, filter with person_slug / company_slug / entity_slug (or use particle_podcast_find_mentions for every line about them) — and for an exact token like a ticker, use keyword_search. Describe a topic, not a tone: optimistic, skeptical, predictions and other ways something is said go in speaker_statement_characteristics ('AI drug discovery', not 'optimistic predictions about AI drug discovery')."
      • addedInput schema / properties / speaker_statement_characteristics
        Added value: +{
        +  "description": "Keep only lines said a certain way. HOW something is said goes here and never in semantic_search: optimistic or bullish → sentiment positive; skeptical, critical or bearish → sentiment negative; predictions or forecasts → temporal_orientation future (add specificity specific for concrete predictions); high conviction → certainty confident; hedging → certainty hedged; concrete claims → specificity specific. The topic goes in semantic_search and who speaks in the guest_ or speaker filters. Labels listed for one axis match any of them; axes combine with AND, so add only the axes the request names. Every matched line carries labels the filter accepts. Example: {\"certainty\": [\"confident\"], \"temporal_orientation\": [\"future\"]}.",
        +  "properties": {
        +    "certainty": {
        +      "description": "How sure the speaker sounds. 'confident' for flat assertions and high conviction; 'hedged' for maybe, I think, it could, and other hedging; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "hedged",
        +          "neutral",
        +          "confident"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sentiment": {
        +      "description": "The statement's tone. 'positive' for optimistic, bullish, approving or praising lines; 'negative' for skeptical, bearish, critical or worried ones; 'neutral' for lines that clearly lean neither way.",
        +      "items": {
        +        "enum": [
        +          "negative",
        +          "neutral",
        +          "positive"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "specificity": {
        +      "description": "Whether the line commits to something concrete. 'specific' for names, numbers, dates and mechanisms (concrete claims); 'vague' for generalities; 'neutral' for neither.",
        +      "items": {
        +        "enum": [
        +          "vague",
        +          "neutral",
        +          "specific"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "temporal_orientation": {
        +      "description": "Where the line points in time. 'future' for predictions, forecasts, plans and expectations; 'past' for looking back; 'present' for how things are now.",
        +      "items": {
        +        "enum": [
        +          "past",
        +          "present",
        +          "future"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
  4. 3 tool updates
    • Changedparticle_podcast_get_guest1 field changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional response sections: 'appearances' (most recent episode appearances with episode/podcast slugs), 'podcasts' (per-podcast rollup of where they appear), 'suitability' (brand-suitability exposure across the podcasts they appear on), 'recommended_podcasts' (the five shows they could plausibly appear on next — shows related to the ones they have guested on, minus those, each with the venues that led there; the pitch list), 'in_field_appearances' (most recent appearances where they spoke within their own field of expertise). Default response is the profile + lifetime stats."New value: +"Optional response sections: 'appearances' (most recent episode appearances with episode/podcast slugs), 'podcasts' (per-podcast rollup of where they appear), 'suitability' (brand-suitability exposure across the podcasts they appear on), 'recommended_podcasts' (the five shows they could plausibly appear on next — shows related to the ones they have guested on, each with the venues that led there, its suitability tier, latest episode and chart breadth; shows they appeared on, same-host sibling feeds, dormant and UNSAFE shows are already left out; the pitch list), 'in_field_appearances' (most recent appearances where they spoke within their own field of expertise). Default response is the profile + lifetime stats."
    • Changedparticle_podcast_get_mention_trends5 fields changed
      • changedInput schema / properties / change / description
        Previous value: -"compare only: keep podcasts that are 'new' to the subject (current window only), 'continuing' (both windows) or 'dropped' (previous window only)."New value: +"compare only: keep podcasts with this label. 'new': started talking about the subject: two or more mention lines in the window, none in the lookback before it, on a show that published at least four episodes there. Use it for 'which shows started talking about X' or 'mentioned X for the first time'. 'returning': back after a gap in the lookback. 'passing': a single line, a first in the lookback. 'newly_tracked': too little published history to tell (fewer than four episodes in the lookback, which includes a monthly show over the default 90 days: pass lookback_days=180 for those). 'continuing': both windows. 'dropped': the previous window only."
      • changedInput schema / properties / change / enum
        Previous value: -[
        -  "new",
        -  "continuing",
        -  "dropped"
        -]New value: +[
        +  "new",
        +  "returning",
        +  "passing",
        +  "newly_tracked",
        +  "continuing",
        +  "dropped"
        +]
      • addedInput schema / properties / lookback_days
        Added value: +{
        +  "description": "compare only: days before published_after a podcast must not have mentioned the subject in to be 'new' (7-180, default 90; never shorter than the previous window).",
        +  "maximum": 180,
        +  "minimum": 7,
        +  "type": "integer"
        +}
      • changedInput schema / properties / role / description
        Previous value: -"Constrain how the subject participates: guest, host, panelist, correspondent, or mention."New value: +"Constrain how the subject participates: guest, host, panelist, correspondent, or mention. In compare mode the lookback's earlier-mention check counts any mention whatever the role, so a first guest appearance on a show that named the subject before is 'returning', not 'new'."
      • changedInput schema / properties / sort / description
        Previous value: -"compare only: 'mentions' (default, most current-window mention lines first), 'rising' or 'falling' (largest gain or loss from the previous window first), or 'popularity' (biggest shows first)."New value: +"compare only: 'mentions' (most current-window mention lines first), 'rising' or 'falling' (largest gain or loss from the previous window first), or 'popularity' (biggest shows first). Defaults to popularity with change 'new' or 'returning', else mentions."
    • Changedparticle_podcast_get_rankings2 fields changed
      • changedInput schema / properties / change / description
        Previous value: -"Mode=movers only: filter by change type. Defaults to all."New value: +"Mode=movers only: filter by change type. Defaults to all. 'debut': shows on this chart slot for the first time since tracking began (May 2026) — use it for 'new podcasts', 'just launched', 'debuted'. 'new': every entry, mostly established shows returning. 'reentry': only the returning ones."
      • changedInput schema / properties / change / enum
        Previous value: -[
        -  "all",
        -  "up",
        -  "down",
        -  "new",
        -  "exit"
        -]New value: +[
        +  "all",
        +  "up",
        +  "down",
        +  "new",
        +  "debut",
        +  "reentry",
        +  "exit"
        +]
  5. 1 tool update
    • Changedparticle_podcast_get_rankings1 field changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Opaque pagination cursor from a previous response. Not supported by mode=movers."New value: +"Opaque pagination cursor from a previous response."
  6. 1 tool update
    • Addedparticle_podcast_get_mention_trends
  7. 2 tool updates
    • Changedparticle_podcast_get_episode3 fields changed
      • changedInput schema / properties / transcript_end / description
        Previous value: -"Transcript end clip in seconds."New value: +"Transcript range end in seconds. Lines that overlap the range are returned whole."
      • changedInput schema / properties / transcript_speaker / description
        Previous value: -"Filter the transcript to one speaker (name or entity slug)."New value: +"Filter the transcript to one speaker: a name, a person slug or ID, or an entity slug or ID."
      • changedInput schema / properties / transcript_start / description
        Previous value: -"Transcript start clip in seconds."New value: +"Transcript range start in seconds. Lines that overlap the range are returned whole."
    • Changedparticle_podcast_search_transcripts1 field changed
      • addedInput schema / properties / speaker
        Added value: +{
        +  "description": "Person slug or ID from particle_person_resolve (e.g. 'sam-altman'). Keeps only passages in which this person speaks a line, and only their lines can match: 'did X say Y', where person_slug is 'Y came up in an episode with X'. With keyword_search their own lines must carry every quoted phrase (and every unquoted word under keyword_match=required). A clip of them played on another show does not count, so this finds the original rather than its replays. An empty result does not prove they never said it: narrow with podcast_slug, episode_slug or dates, or try semantic_search. Cannot be combined with the guest_ filters.",
        +  "type": "string"
        +}
  8. 1 tool update
    • Changedparticle_topic_browse2 fields changed
      • changedInput schema / properties / parent_slug / description
        Previous value: -"Topic slug or ID. Returns the direct children of this topic. Omit for top-level roots (Politics, Business, Technology, etc.)."New value: +"Topic slug or ID. Returns the direct children of this topic. Omit for top-level roots (Politics, Business, Technology, etc.). With query, limits the search to this topic's descendants."
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Find topics by name: exact names first, then names starting with it, then (when it has a word of 3 or more characters) names containing it, each ranked by story coverage. Covers topics with at least 5 story clusters; browse with parent_slug for the long tail. Pages reach the top 200 matches.",
        +  "maxLength": 100,
        +  "minLength": 2,
        +  "type": "string"
        +}
  9. 1 tool update
    • Changedparticle_alert_create1 field changed
      • changedInput schema / properties / kind / description
        Previous value: -"What signal to watch for. ENTITY_MENTION (default) fires whenever a watched entity is mentioned on a podcast episode. PODCAST_SPEAKER fires only when a watched person is themself an identified speaker (guest/panelist/correspondent/audience). KEYWORD_MENTION fires whenever keyword is spoken — use it when the name has no entity slug (a resolve tool finds nothing, or the right entity has no episodes). Kind is fixed at creation."New value: +"What signal to watch for. ENTITY_MENTION (default) fires whenever a watched entity is mentioned on a podcast episode. PODCAST_SPEAKER fires only when a watched person is themself an identified speaker: by default as guest/panelist/correspondent/audience or in an excerpted soundbite (SOUNDBITE_SPEAKER), never as host; speaker_roles replaces that set. KEYWORD_MENTION fires whenever keyword is spoken — use it when the name has no entity slug (a resolve tool finds nothing, or the right entity has no episodes). Kind is fixed at creation."
  10. 1 tool update
    • Changedparticle_podcast_get_share_of_voice3 fields changed
      • addedInput schema / properties / keyword_search
        Added value: +{
        +  "description": "Split the lines that say these words instead of an entity's mentions: every word in one line, case-insensitive; wrap words in double quotes to require them adjacent and in order. Words count as spoken, so a word with two meanings counts both. Window at most 90 days.",
        +  "maxLength": 500,
        +  "type": "string"
        +}
      • changedInput schema / properties / person_slug / description
        Previous value: -"Person slug from particle_person_resolve (e.g. 'sam-altman'). One of person_slug, company_slug or entity_slug is required."New value: +"Person slug from particle_person_resolve (e.g. 'sam-altman'). One of person_slug, company_slug, entity_slug or keyword_search is required."
      • changedInput schema / properties / published_after / description
        Previous value: -"Only episodes published on or after this date (YYYY-MM-DD). Defaults to 30 days before published_before; the window may span at most 365 days."New value: +"Only episodes published on or after this date (YYYY-MM-DD). Defaults to 30 days before published_before; the window may span at most 365 days for an entity and 90 for a keyword."
  11. 5 tool updates
    • Changedparticle_podcast_find_mentions3 fields changed
      • addedInput schema / properties / guest_capacity
        Added value: +{
        +  "description": "Only mentions spoken by a guest who knows their field in this capacity (e.g. 'public_official' for politicians). particle_expertise_resolve names the capacity an everyday word means.",
        +  "enum": [
        +    "researcher",
        +    "licensed_professional",
        +    "practitioner",
        +    "executive_founder",
        +    "public_official",
        +    "journalist_analyst",
        +    "creator_entertainer",
        +    "athlete_coach",
        +    "clergy",
        +    "firsthand",
        +    "layperson"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / guest_occupation / description
        Previous value: -"Only mentions spoken by a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'financial-and-investment-analysts')."New value: +"Only mentions spoken by a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'financial-and-investment-analysts' or 'physicians'). A word with no occupation filters by the field of research or capacity it names: 'investors' is field 350208, 'politicians' is capacity public_official."
      • changedInput schema / properties / guest_practicing / description
        Previous value: -"Only mentions spoken by a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation."New value: +"Only mentions spoken by a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group."
    • Changedparticle_podcast_get_episode_timeseries3 fields changed
      • addedInput schema / properties / guest_capacity
        Added value: +{
        +  "description": "Only episodes with a guest who knows their field in this capacity (e.g. 'executive_founder' for founders). It narrows the other filters; particle_expertise_resolve names the capacity an everyday word means.",
        +  "enum": [
        +    "researcher",
        +    "licensed_professional",
        +    "practitioner",
        +    "executive_founder",
        +    "public_official",
        +    "journalist_analyst",
        +    "creator_entertainer",
        +    "athlete_coach",
        +    "clergy",
        +    "firsthand",
        +    "layperson"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / guest_occupation / description
        Previous value: -"Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212')."New value: +"Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). A word with no occupation filters by the field of research or capacity it names: 'oncologists' is field 3211, 'founders' is capacity executive_founder."
      • changedInput schema / properties / guest_practicing / description
        Previous value: -"Only episodes with a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation (e.g. '29-1212')."New value: +"Only episodes with a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group (e.g. '29-1212' or 'physicians')."
    • Changedparticle_podcast_list_episodes3 fields changed
      • addedInput schema / properties / guest_capacity
        Added value: +{
        +  "description": "Only episodes with a guest who knows their field in this capacity (e.g. 'executive_founder' for founders). It narrows the other filters; particle_expertise_resolve names the capacity an everyday word means.",
        +  "enum": [
        +    "researcher",
        +    "licensed_professional",
        +    "practitioner",
        +    "executive_founder",
        +    "public_official",
        +    "journalist_analyst",
        +    "creator_entertainer",
        +    "athlete_coach",
        +    "clergy",
        +    "firsthand",
        +    "layperson"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / guest_occupation / description
        Previous value: -"Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212')."New value: +"Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). A word with no occupation filters by the field of research or capacity it names: 'oncologists' is field 3211, 'founders' is capacity executive_founder."
      • changedInput schema / properties / guest_practicing / description
        Previous value: -"Only episodes with a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation (e.g. '29-1212')."New value: +"Only episodes with a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group (e.g. '29-1212' or 'physicians')."
    • Changedparticle_podcast_list_guests2 fields changed
      • changedInput schema / properties / occupation / description
        Previous value: -"Only guests listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212'). Directory mode only."New value: +"Only guests listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). Directory mode only."
      • changedInput schema / properties / practicing / description
        Previous value: -"Only guests who still work in the occupation. Needs a detailed SOC 2018 occupation (e.g. '29-1212' Cardiologists). Directory mode only."New value: +"Only guests who still work in the occupation. Needs a SOC 2018 occupation or group (e.g. '29-1212' Cardiologists or 'physicians'). Directory mode only."
    • Changedparticle_podcast_search_transcripts3 fields changed
      • addedInput schema / properties / guest_capacity
        Added value: +{
        +  "description": "Only episodes with a guest who knows their field in this capacity (e.g. 'executive_founder' for founders). It narrows the other filters; particle_expertise_resolve names the capacity an everyday word means.",
        +  "enum": [
        +    "researcher",
        +    "licensed_professional",
        +    "practitioner",
        +    "executive_founder",
        +    "public_official",
        +    "journalist_analyst",
        +    "creator_entertainer",
        +    "athlete_coach",
        +    "clergy",
        +    "firsthand",
        +    "layperson"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / guest_occupation / description
        Previous value: -"Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212')."New value: +"Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve, or a SOC group or everyday name (e.g. 'cardiologists', '29-1212', 'physicians' or 'doctors'). A word with no occupation filters by the field of research or capacity it names: 'oncologists' is field 3211, 'founders' is capacity executive_founder."
      • changedInput schema / properties / guest_practicing / description
        Previous value: -"Only episodes with a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation (e.g. '29-1212')."New value: +"Only episodes with a guest who still works in guest_occupation, which must be a SOC 2018 occupation or group (e.g. '29-1212' or 'physicians')."
  12. 2 tool updates
    • Changedparticle_person_get1 field changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional response sections: 'external_links' (LinkedIn, Wikipedia, social profiles), 'podcast_appearances' (recent podcast appearances with episode and podcast slugs), 'companies' (the full role history, current role included and marked), 'sports' (sports played, teams played for or coached with years and leagues, from Wikidata), 'expertise' (what they know and how established they are: standing, seniority, experience, the occupations and fields they are listed under with codes the guest_ filters accept, organization, credential). Default response is lean — request only what you need."New value: +"Optional response sections: 'external_links' (LinkedIn, Wikipedia, social profiles), 'podcast_appearances' (recent podcast appearances with episode and podcast slugs), 'companies' (the full role history, current role included and marked), 'sports' (the current team of an NFL, MLB or NHL player, sports played, and teams played for or coached with years and leagues), 'expertise' (what they know and how established they are: standing, seniority, experience, the occupations and fields they are listed under with codes the guest_ filters accept, organization, credential). Default response is lean — request only what you need."
    • Changedparticle_podcast_list_guests1 field changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional per-guest sections: 'expertise' (each guest's standing, seniority, most specific occupation and field, and organization on one line). Directory mode only."New value: +"Optional per-guest sections: 'expertise' (widens the occupation codes, standing and seniority every row carries to the fuller one-line read with the organization). Directory mode only."
  13. 12 tool updates
    • Addedparticle_expertise_get
    • Addedparticle_expertise_resolve
    • Changedparticle_person_get2 fields changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional response sections: 'external_links' (LinkedIn, Wikipedia, social profiles), 'podcast_appearances' (recent podcast appearances with episode and podcast slugs), 'companies' (the full role history, current role included and marked), 'sports' (sports played, teams played for or coached with years and leagues, from Wikidata). Default response is lean — request only what you need."New value: +"Optional response sections: 'external_links' (LinkedIn, Wikipedia, social profiles), 'podcast_appearances' (recent podcast appearances with episode and podcast slugs), 'companies' (the full role history, current role included and marked), 'sports' (sports played, teams played for or coached with years and leagues, from Wikidata), 'expertise' (what they know and how established they are: standing, seniority, experience, the occupations and fields they are listed under with codes the guest_ filters accept, organization, credential). Default response is lean — request only what you need."
      • changedInput schema / properties / include / items / enum
        Previous value: -[
        -  "external_links",
        -  "podcast_appearances",
        -  "companies",
        -  "sports"
        -]New value: +[
        +  "external_links",
        +  "podcast_appearances",
        +  "companies",
        +  "sports",
        +  "expertise"
        +]
    • Changedparticle_podcast_find_mentions6 fields changed
      • addedInput schema / properties / guest_field
        Added value: +{
        +  "description": "Only mentions spoken by a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve.",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_in_field
        Added value: +{
        +  "description": "Only mentions spoken by a guest speaking within their own field (the guest the other guest_ filters select, when given).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_occupation
        Added value: +{
        +  "description": "Only mentions spoken by a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'financial-and-investment-analysts').",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_practicing
        Added value: +{
        +  "description": "Only mentions spoken by a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_seniority
        Added value: +{
        +  "description": "Only mentions spoken by a guest at this seniority or above.",
        +  "enum": [
        +    "professional",
        +    "senior",
        +    "distinguished"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_standing
        Added value: +{
        +  "description": "Only mentions spoken by a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.",
        +  "enum": [
        +    "established",
        +    "self_described",
        +    "unverified"
        +  ],
        +  "type": "string"
        +}
    • Changedparticle_podcast_get_episode2 fields changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional response sections: 'transcript' (bounded dialogue transcript — large for long episodes; narrow it with the transcript_* sub-params), 'segments' (structural outline with timestamps), 'entities' (complete mentioned-entity list instead of the top 20), 'clips' (engagement-ranked highlight clips), 'topics' (topic classifications with slugs), 'related' (the five episodes from OTHER shows most related to this one — slug, show, score, band; for the full ranked list with the basis behind each match call particle_podcast_list_related_episodes). Default response is lean — request only what you need."New value: +"Optional response sections: 'transcript' (bounded dialogue transcript — large for long episodes; narrow it with the transcript_* sub-params), 'segments' (structural outline with timestamps), 'entities' (complete mentioned-entity list instead of the top 20), 'clips' (engagement-ranked highlight clips), 'topics' (topic classifications with slugs), 'related' (the five episodes from OTHER shows most related to this one — slug, show, score, band; for the full ranked list with the basis behind each match call particle_podcast_list_related_episodes), 'guest_expertise' (each guest's expertise read and how the episode used it: whether they spoke within their field, whether the appearance was promotional, how they were introduced). Default response is lean — request only what you need."
      • changedInput schema / properties / include / items / enum
        Previous value: -[
        -  "transcript",
        -  "segments",
        -  "entities",
        -  "clips",
        -  "topics",
        -  "related"
        -]New value: +[
        +  "transcript",
        +  "segments",
        +  "entities",
        +  "clips",
        +  "topics",
        +  "related",
        +  "guest_expertise"
        +]
    • Changedparticle_podcast_get_episode_timeseries6 fields changed
      • addedInput schema / properties / guest_field
        Added value: +{
        +  "description": "Only episodes with a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment').",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_in_field
        Added value: +{
        +  "description": "Only episodes with a guest speaking within their own field (the guest the other guest_ filters select, when given).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_occupation
        Added value: +{
        +  "description": "Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212').",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_practicing
        Added value: +{
        +  "description": "Only episodes with a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation (e.g. '29-1212').",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_seniority
        Added value: +{
        +  "description": "Only episodes with a guest at this seniority or above.",
        +  "enum": [
        +    "professional",
        +    "senior",
        +    "distinguished"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_standing
        Added value: +{
        +  "description": "Only episodes with a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.",
        +  "enum": [
        +    "established",
        +    "self_described",
        +    "unverified"
        +  ],
        +  "type": "string"
        +}
    • Changedparticle_podcast_get_guest2 fields changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional response sections: 'appearances' (most recent episode appearances with episode/podcast slugs), 'podcasts' (per-podcast rollup of where they appear), 'suitability' (brand-suitability exposure across the podcasts they appear on), 'recommended_podcasts' (the five shows they could plausibly appear on next — shows related to the ones they have guested on, minus those, each with the venues that led there; the pitch list). Default response is the profile + lifetime stats."New value: +"Optional response sections: 'appearances' (most recent episode appearances with episode/podcast slugs), 'podcasts' (per-podcast rollup of where they appear), 'suitability' (brand-suitability exposure across the podcasts they appear on), 'recommended_podcasts' (the five shows they could plausibly appear on next — shows related to the ones they have guested on, minus those, each with the venues that led there; the pitch list), 'in_field_appearances' (most recent appearances where they spoke within their own field of expertise). Default response is the profile + lifetime stats."
      • changedInput schema / properties / include / items / enum
        Previous value: -[
        -  "appearances",
        -  "podcasts",
        -  "suitability",
        -  "recommended_podcasts"
        -]New value: +[
        +  "appearances",
        +  "podcasts",
        +  "suitability",
        +  "recommended_podcasts",
        +  "in_field_appearances"
        +]
    • Addedparticle_podcast_get_share_of_voice
    • Changedparticle_podcast_list_episodes6 fields changed
      • addedInput schema / properties / guest_field
        Added value: +{
        +  "description": "Only episodes with a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment').",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_in_field
        Added value: +{
        +  "description": "Only episodes with a guest speaking within their own field (the guest the other guest_ filters select, when given).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_occupation
        Added value: +{
        +  "description": "Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212').",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_practicing
        Added value: +{
        +  "description": "Only episodes with a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation (e.g. '29-1212').",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_seniority
        Added value: +{
        +  "description": "Only episodes with a guest at this seniority or above.",
        +  "enum": [
        +    "professional",
        +    "senior",
        +    "distinguished"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_standing
        Added value: +{
        +  "description": "Only episodes with a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.",
        +  "enum": [
        +    "established",
        +    "self_described",
        +    "unverified"
        +  ],
        +  "type": "string"
        +}
    • Changedparticle_podcast_list_guests9 fields changed
      • addedInput schema / properties / appeared_since
        Added value: +{
        +  "description": "Only guests with an appearance on or after this date (YYYY-MM-DD or ISO 8601). Directory mode only.",
        +  "type": "string"
        +}
      • addedInput schema / properties / capacity
        Added value: +{
        +  "description": "Only guests who know their field in this capacity. Directory mode only.",
        +  "enum": [
        +    "researcher",
        +    "licensed_professional",
        +    "practitioner",
        +    "executive_founder",
        +    "public_official",
        +    "journalist_analyst",
        +    "creator_entertainer",
        +    "athlete_coach",
        +    "clergy",
        +    "firsthand",
        +    "layperson"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / employer
        Added value: +{
        +  "description": "Only guests whose organization is this company (slug from particle_company_resolve, or a domain). Directory mode only.",
        +  "type": "string"
        +}
      • addedInput schema / properties / field
        Added value: +{
        +  "description": "Only guests listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment'). Directory mode only.",
        +  "type": "string"
        +}
      • addedInput schema / properties / include
        Added value: +{
        +  "description": "Optional per-guest sections: 'expertise' (each guest's standing, seniority, most specific occupation and field, and organization on one line). Directory mode only.",
        +  "items": {
        +    "enum": [
        +      "expertise"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / occupation
        Added value: +{
        +  "description": "Only guests listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212'). Directory mode only.",
        +  "type": "string"
        +}
      • addedInput schema / properties / practicing
        Added value: +{
        +  "description": "Only guests who still work in the occupation. Needs a detailed SOC 2018 occupation (e.g. '29-1212' Cardiologists). Directory mode only.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / seniority
        Added value: +{
        +  "description": "Only guests at this seniority or above. Directory mode only.",
        +  "enum": [
        +    "professional",
        +    "senior",
        +    "distinguished"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / standing
        Added value: +{
        +  "description": "Only guests whose standing is recognized this way: 'established' (conferred by others: a credential, a position, recognition in the field), 'self_described', or 'unverified'. Directory mode only.",
        +  "enum": [
        +    "established",
        +    "self_described",
        +    "unverified"
        +  ],
        +  "type": "string"
        +}
    • Changedparticle_podcast_resolve7 fields changed
      • addedInput schema / properties / guest_field
        Added value: +{
        +  "description": "Only shows whose analyzed guests include someone listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve.",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_occupation
        Added value: +{
        +  "description": "Only shows whose analyzed guests include someone listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve.",
        +  "type": "string"
        +}
      • changedInput schema / properties / include / description
        Previous value: -"Optional non-parameterized hydrations to attach to each result. 'external_links' adds third-party platform presences (directories, social profiles, video channels, publisher websites). 'suitability' adds the per-category brand-suitability breakdown (premium-grade data — requires a plan with premium endpoints). 'ratings_summary' adds the listener-review aggregate. 'bias' adds the full political-bias analysis. 'rankings' adds current chart positions (premium-grade data — requires a plan with premium endpoints). 'format' adds the format profile (guest frequency, interview/panel/call-in/solo formats, ads, video, episode length, cadence, publish days). 'related' adds the five most related shows (slug, score, band) — for the full ranked list with the basis behind each pair call particle_podcast_list_related. 'recommended_guests' adds the five guests the show could book next — people who have guested on its related shows but never on it (person slug, score, band, and the related shows that booked them); the booking pipeline. 'recommended_sponsors' adds the five advertisers the show could pitch — sponsors that run on its related shows but not on it (sponsor, linked company, score, band, ads and most recent ad across those shows, and which shows); the prospecting list (premium-grade data — requires a plan with premium endpoints). 'coverage' adds how much of the show's history we know of and have transcribed: discovered episodes by transcript status and by year, and whether its back catalogue (older episodes discovered in its feed but not transcribed) has been imported and is complete. The high-level suitability_tier and bias enums are always rendered without opt-in. Off by default; opt in only when needed."New value: +"Optional non-parameterized hydrations to attach to each result. 'external_links' adds third-party platform presences (directories, social profiles, video channels, publisher websites). 'suitability' adds the per-category brand-suitability breakdown (premium-grade data — requires a plan with premium endpoints). 'ratings_summary' adds the listener-review aggregate. 'bias' adds the full political-bias analysis. 'rankings' adds current chart positions (premium-grade data — requires a plan with premium endpoints). 'format' adds the format profile (guest frequency, interview/panel/call-in/solo formats, ads, video, episode length, cadence, publish days). 'related' adds the five most related shows (slug, score, band) — for the full ranked list with the basis behind each pair call particle_podcast_list_related. 'recommended_guests' adds the five guests the show could book next — people who have guested on its related shows but never on it (person slug, score, band, and the related shows that booked them); the booking pipeline. 'recommended_sponsors' adds the five advertisers the show could pitch — sponsors that run on its related shows but not on it (sponsor, linked company, score, band, ads and most recent ad across those shows, and which shows); the prospecting list (premium-grade data — requires a plan with premium endpoints). 'coverage' adds how much of the show's history we know of and have transcribed: discovered episodes by transcript status and by year, and whether its back catalogue (older episodes discovered in its feed but not transcribed) has been imported and is complete. 'guest_expertise' adds the show's guest mix: the shares of its analyzed guest appearances by established, senior or in-field guests and promotional appearances, and the occupations and fields it books most (codes the guest_ filters accept). The high-level suitability_tier and bias enums are always rendered without opt-in. Off by default; opt in only when needed."
      • changedInput schema / properties / include / items / enum
        Previous value: -[
        -  "external_links",
        -  "suitability",
        -  "ratings_summary",
        -  "bias",
        -  "rankings",
        -  "format",
        -  "related",
        -  "recommended_guests",
        -  "recommended_sponsors",
        -  "coverage"
        -]New value: +[
        +  "external_links",
        +  "suitability",
        +  "ratings_summary",
        +  "bias",
        +  "rankings",
        +  "format",
        +  "related",
        +  "recommended_guests",
        +  "recommended_sponsors",
        +  "coverage",
        +  "guest_expertise"
        +]
      • addedInput schema / properties / max_promotional_guest_share
        Added value: +{
        +  "description": "Only shows where at most this share (0-1) of analyzed guest appearances are promotional; 0 keeps only shows with none.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / min_established_guest_share
        Added value: +{
        +  "description": "Only shows where at least this share (0-1) of analyzed guest appearances are by guests of established standing.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / min_in_field_guest_share
        Added value: +{
        +  "description": "Only shows where at least this share (0-1) of analyzed guest appearances are guests speaking within their own field.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedparticle_podcast_search_transcripts6 fields changed
      • addedInput schema / properties / guest_field
        Added value: +{
        +  "description": "Only episodes with a guest listed under this ANZSRC 2020 field of research: a code, slug or title from particle_expertise_resolve (e.g. 'banking-finance-and-investment').",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_in_field
        Added value: +{
        +  "description": "Only episodes with a guest speaking within their own field (the guest the other guest_ filters select, when given).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_occupation
        Added value: +{
        +  "description": "Only episodes with a guest listed under this occupation: a SOC 2018 or ISCO-08 code, slug or title from particle_expertise_resolve (e.g. 'cardiologists' or '29-1212').",
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_practicing
        Added value: +{
        +  "description": "Only episodes with a guest who still works in guest_occupation, which must be a detailed SOC 2018 occupation (e.g. '29-1212').",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / guest_seniority
        Added value: +{
        +  "description": "Only episodes with a guest at this seniority or above.",
        +  "enum": [
        +    "professional",
        +    "senior",
        +    "distinguished"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / guest_standing
        Added value: +{
        +  "description": "Only episodes with a guest whose standing is recognized this way: 'established' (conferred by others), 'self_described', or 'unverified'.",
        +  "enum": [
        +    "established",
        +    "self_described",
        +    "unverified"
        +  ],
        +  "type": "string"
        +}
  14. 1 tool update
    • Changedparticle_person_get2 fields changed
      • changedInput schema / properties / include / description
        Previous value: -"Optional response sections: 'external_links' (LinkedIn, Wikipedia, social profiles), 'podcast_appearances' (recent podcast appearances with episode and podcast slugs), 'companies' (the full role history, current role included and marked). Default response is lean — request only what you need."New value: +"Optional response sections: 'external_links' (LinkedIn, Wikipedia, social profiles), 'podcast_appearances' (recent podcast appearances with episode and podcast slugs), 'companies' (the full role history, current role included and marked), 'sports' (sports played, teams played for or coached with years and leagues, from Wikidata). Default response is lean — request only what you need."
      • changedInput schema / properties / include / items / enum
        Previous value: -[
        -  "external_links",
        -  "podcast_appearances",
        -  "companies"
        -]New value: +[
        +  "external_links",
        +  "podcast_appearances",
        +  "companies",
        +  "sports"
        +]
  15. 2 tool updates
    • Changedparticle_alert_create1 field changed
      • changedInput schema / properties / notifications / description
        Previous value: -"Email addresses to notify. Each must already be verified for your organization (or belong to an org member). When omitted, defaults to your account email if available; otherwise pass at least one."New value: +"Email addresses for recurring alert notifications. Only recipients verified for your organization receive alert emails; pending recipients may be saved but stay silent until verified. At least one recipient must be deliverable. When omitted, defaults to your account email if available; otherwise pass at least one."
    • Changedparticle_alert_update1 field changed
      • changedInput schema / properties / notifications / description
        Previous value: -"Replacement notification emails. When provided, replaces the entire existing set; omit to leave them unchanged."New value: +"Replacement recipients for recurring alert emails. Only recipients verified for your organization receive alert emails; pending recipients stay silent until verified. When provided, replaces the entire existing set; omit to leave them unchanged."

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources