Narrareach
Server Details
Draft, schedule, and analyze content for Substack, Medium, LinkedIn, X, Bluesky, and Threads. Review and edit drafts, schedule notes and articles, check publishing readiness, and inspect available performance data. Actions are scoped to your account and authorized team workspaces. Requires an eligible Narrareach account, OAuth sign-in, and connected platform accounts; capabilities vary by platform. Docs: https://www.narrareach.com/api-docs
- Status
- Healthy
- Uptime
- 99.9% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 82 tools
The descriptions are unusually explicit about boundaries (e.g. add_platform_to_scheduled_note explicitly says 'use this, not schedule_note'), which helps a lot. However, there are several genuine near-duplicates: cancel_scheduled_item vs cancel_scheduled_post, and the trio amend_scheduled_item / reschedule_scheduled_item / amend_scheduled_note_content all operate on scheduled items with subtle distinctions an agent must parse carefully. verify_substack also overlaps the four dedicated verification tools as a 'compatibility' alias.
The vast majority follow a clean verb_noun snake_case pattern (schedule_note, get_draft, update_voice_rule, list_social_accounts). A few outliers like verify_substack and the noun-phrase style of get_ai_visibility_audit are minor deviations but still readable.
82 tools is far beyond a coherent single agent surface; the rubric treats 50+ as an extreme mismatch. The domain is genuinely broad (scheduling, voice, analytics, reader inbox, verification, media, transcripts), so some breadth is earned, but the count is still excessive and fragments related operations across many tools.
Coverage is broad and deep across the publishing lifecycle: drafts, scheduling, rescheduling, cancellation, verification, voice profile management, analytics, reader activity, media upload and transcripts. Minor gaps exist (no hard delete, no explicit unpublish), but core workflows have no dead ends.
Available Tools
82 toolsadd_platform_to_scheduled_noteAdd platform to scheduled noteAIdempotentInspect
Add a platform (or another account on a platform) to a Note that is already scheduled, so it posts there at the same time as the Note's other versions. Use this, not schedule_note, whenever the writer wants an already scheduled Note to also go to X, LinkedIn, Bluesky, Threads, Instagram, Facebook, TikTok or Pinterest: schedule_note would create a separate Note. Pass the id of any scheduled version of the Note (from list_scheduled_items, list_notes or schedule_note) and the platform. Without content the text is taken from the Note's versions (the same platform's version, else the longest that fits) and, if every version is too long, shortened to fit with adjustedPlatforms and warnings returned; content you pass is sent as written and must fit the platform's limit. When the writer has several accounts on the platform, name one with accountId (list_social_accounts; list_instagram_destinations for Instagram; list_linkedin_destinations for LinkedIn, with linkedInOrganizationUrn for a Company Page); without one the call is refused with the accounts to choose from. Ask the writer, never pick. Refused when the Note already goes to that platform or account (or posted there in the last day), when its time has passed or changed, or for Substack. Returns the new version(s) and their scheduled time. Safe to retry: pass a clientRequestId and reuse it only when retrying the same add (same Note and time, platform, account and content); a repeat returns the version already added (replayed: true), and the id reused for any other add is refused. Personal account only.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of any scheduled version of the Note, from list_scheduled_items, list_notes or schedule_note. | |
| content | No | Optional text written for this platform, sent as written; it must fit the platform's limit (Bluesky 300, Threads 500, LinkedIn 3000, X 25000). When the Note quotes a Substack Note or post, its link is added as the last line (and counts). Omit to use the Note's own text. | |
| platform | Yes | The platform to add. | |
| accountId | No | Account to post from: an accountId from list_social_accounts (Threads, Facebook, TikTok, Pinterest, X), list_instagram_destinations (Instagram) or list_linkedin_destinations (LinkedIn). Required when the writer has several accounts on the platform. | |
| clientRequestId | No | Optional id for this add (8 to 80 letters, numbers, hyphens or underscores). Reuse it only to retry the same add (same Note and time, platform, account and content); a repeat returns the version already added, and any other add with it is refused. | |
| linkedInOrganizationUrn | No | LinkedIn Company Page URN from list_linkedin_destinations, with its accountId. |
Output Schema
| Name | Required | Description |
|---|---|---|
| added | Yes | |
| noteId | Yes | |
| draftId | Yes | |
| platform | Yes | |
| replayed | Yes | |
| timezone | Yes | |
| versions | Yes | |
| warnings | Yes | |
| scheduledFor | Yes | |
| connectedAccount | No | |
| adjustedPlatforms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds what the annotations carry. It discloses refusal conditions (already goes to that platform/account or posted in the last day, time passed or changed, Substack), the idempotency contract with clientRequestId and the replayed:true response, and the content fallback logic. These are exactly the behavioral traits an agent cannot derive from readOnlyHint/idempotentHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the sibling distinction before the operational detail, and each sentence carries real information (refusals, idempotency, content sourcing). It is dense and reads as one long block rather than clearly segmented sections, which taxes scanning, but there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the description still notes it returns the new version(s) and scheduled time. Combined with the refusal conditions, account-selection path, and idempotency rules, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics beyond the schema: the omission-fallback rule for content ('the same platform's version, else the longest that fits... shortened to fit with adjustedPlatforms and warnings'), and the account-selection requirement. It clarifies behavior rather than merely restating field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a platform (or another account on a platform) to a Note that is already scheduled') plus the downstream effect ('so it posts there at the same time as the Note's other versions'). It explicitly distinguishes itself from the nearest sibling, schedule_note, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule ('Use this, not schedule_note, whenever...') and explains what schedule_note would do instead (create a separate Note). It also enumerates the platforms in scope and the operating rule 'Ask the writer, never pick', leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_voice_materialAdd voice materialAIdempotentInspect
Save something real the writer has just told you to their material bank: a story they lived, a number they measured, an opinion they hold, or an example they use. Future drafts draw on it instead of making things up. Save only what the writer supplied; never add anything you wrote or assumed.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The material in the writer's own words, short enough to stand alone. | |
| type | Yes | What kind of material this is. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | |
| material | Yes | |
| alreadySaved | Yes | |
| materialCount | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive, idempotent, closed-world write. Beyond that, the description discloses the downstream effect ('Future drafts draw on it instead of making things up') and a hard authorship constraint, which are genuine behavioral traits not derivable from the annotations. It says nothing about duplicate handling, whether entries can be edited or removed, or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The what/where is front-loaded and the fabrication prohibition closes it, so the most consequential rule is the last thing read before acting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the schema fully documents all four parameters. The description covers purpose, effect, and the core constraint, leaving only secondary gaps: duplicate/repeat behavior for an idempotent write, and the workspace-versus-personal-account scoping that the writer/workspace params imply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes slightly beyond the schema by defining what each enum value actually means in practice (a story they lived, a number they measured, an opinion they hold, an example they use), which reduces misclassification between 'opinion' and 'example'. The writer/workspace scoping parameters are untouched.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Save ... to their material bank') and enumerates the four material kinds (story, number, opinion, example), so the agent knows exactly what lands in the bank. It does not name a sibling such as save_voice_preference or update_voice_rule, so the boundary between 'material' and 'voice rule/preference' must be inferred from the resource noun alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('something real the writer has just told you') and an explicit exclusion ('Save only what the writer supplied; never add anything you wrote or assumed'), which is the key failure mode for this tool. It never names an alternative tool or states what to do when the writer's input is not real material, so routing against siblings is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amend_scheduled_itemPreview or amend scheduled itemADestructiveIdempotentInspect
Preview or amend the time or timezone of a scheduled Note or Article using its exact current revision. apply defaults to false for a non-mutating preview; apply=true performs the amendment after client-side confirmation. Successful retries are desired-state idempotent, and applied changes are reread and verified. Cover, content, paywall, email-delivery, and destination rewrites are unsupported.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| kind | No | ||
| apply | No | ||
| timezone | No | Optional IANA timezone for scheduledFor. | |
| scheduledFor | Yes | New future local wall-clock date/time in the item timezone unless timezone is supplied. | |
| expectedRevision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| after | Yes | |
| before | Yes | |
| status | Yes | |
| applied | Yes | |
| proposed | Yes | |
| nextAction | Yes | |
| confirmation | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing idempotent desired-state retries, that applied changes are reread and verified, and the explicit list of unsupported rewrites (cover, content, paywall, email-delivery, destination). This adds real behavioral context, though the safety profile (destructiveHint, openWorldHint) is already carried by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, with the core action and scope stated first and constraints following. Every clause earns its place, though the single run-on sentence packs several distinct ideas together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return values need not be explained, and the description covers preview vs mutation, idempotency, verification, and unsupported operations. The main remaining gap is routing guidance relative to the similar reschedule_scheduled_item sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description compensates partially by clarifying apply's default and semantics and expectedRevision as the exact current revision. But id and kind receive no explanation anywhere, so the description does not fully close the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (preview/amend) and resource (scheduled Note or Article) with a clear scope restriction (time or timezone only via exact current revision). However, it never distinguishes itself from the sibling reschedule_scheduled_item, which sounds like an overlapping operation, leaving the agent to guess which to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the two modes: apply=false for non-mutating preview and apply=true to perform the amendment after client-side confirmation. It gives clear context for when each path is appropriate, though it does not name an alternative sibling tool or state when to prefer it over reschedule_scheduled_item.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amend_scheduled_note_contentPreview or amend queued LinkedIn post textADestructiveIdempotentInspect
Preview or replace the text of an untouched, text-only queued LinkedIn post using its scheduled Note id and exact current revision. Changes the queued delivery snapshot, not a shared draft. apply defaults to false for a non-mutating preview; apply=true performs the replacement after client-side confirmation. Provider-accepted, in-flight, media-bearing, and Article schedules are unsupported.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| apply | No | ||
| content | Yes | Full replacement plain text, not a patch. | |
| expectedRevision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| after | Yes | |
| before | Yes | |
| status | Yes | |
| applied | Yes | |
| proposed | Yes | |
| confirmation | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds crucial nuance: destructive behavior is conditional on apply=true, apply defaults to false for a non-mutating preview, and replacement follows client-side confirmation. It also clarifies the mutation targets the queued delivery snapshot rather than a shared draft, which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with no filler; the preview/replace distinction and constraints are front-loaded. Slightly information-heavy but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Given the annotations and schema, the description covers purpose, applicability constraints, mutation semantics, and the preview/apply switch, making it largely self-sufficient; only explicit alternative routing to amend_scheduled_item is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (content only), so the description must compensate and largely does: it explains id as the scheduled Note id, expectedRevision as the exact current revision, and apply's default and semantics. It adds meaningful meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair ('preview or replace') and a precise resource ('the text of an untouched, text-only queued LinkedIn post'), plus the required identifiers. It differentiates from shared drafts ('not a shared draft') but never names the closest sibling, amend_scheduled_item, so the sibling distinction is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (untouched, text-only queued post with exact revision) and when-not (provider-accepted, in-flight, media-bearing, and Article schedules unsupported). It also clarifies the apply=false preview path versus the apply=true mutation path, 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.
archive_draftArchive draftADestructiveIdempotentInspect
Archive an owned draft so it no longer appears in draft lists. Active scheduled items must be cancelled first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Draft id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| status | Yes | |
| updatedAt | No | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety and repeat-call profile is covered. The description's added value — that archiving removes the draft from lists and requires prior cancellation of scheduled items — is genuine behavioral context, but it does not explain what the flag does or whether the archive is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the action and its effect front-loaded, then the precondition. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. With annotations covering destructiveness and idempotency and the precondition stated, everything needed to call this correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter 'id' is fully documented in the schema. The description references an 'owned draft' but adds no format or syntax detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (archive) and resource (draft), and adds a scoping detail ('owned') plus an observable effect ('no longer appears in draft lists'). It does not name a sibling like cancel_scheduled_item or update_draft, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use: active scheduled items must be cancelled first, which implicitly routes the agent to cancel_scheduled_item/cancel_scheduled_post. It does not state when NOT to archive or contrast with update_draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_scheduled_itemCancel scheduled itemCDestructiveInspect
Cancel a scheduled note or article, with optional kind or automatic detection by id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| kind | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| status | Yes | |
| message | No | |
| remoteEditUrl | No | |
| alreadyCancelled | No | |
| connectedAccount | No | |
| distributionKind | No | |
| cancellationQueued | No | |
| remoteDraftRetained | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true and readOnlyHint=false, so the safety profile is covered. The description adds essentially nothing beyond them: it does not say whether cancellation is reversible, what happens to the underlying content, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The trailing clause 'with optional kind or automatic detection by id' is slightly dense but still earns its place by clarifying parameter behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be described, but for a destructive, non-idempotent mutation the definition should disclose side effects or preconditions. Nothing about post-cancel state, error conditions, or how it differs from cancel_scheduled_post is provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It usefully explains that kind is optional and can be auto-detected from the id, which is genuine added meaning, but the id parameter's format/expected value is left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Cancel) and resource (scheduled note or article), making the intent clear. It does not differentiate from the very close sibling cancel_scheduled_post, which the agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus cancel_scheduled_post or amend/reschedule_scheduled_item, and no stated prerequisites (e.g., item must be in scheduled state). The only usage-adjacent hint is that kind may be omitted, which is really a parameter detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_scheduled_postCancel scheduled postADestructiveInspect
Cancel a pending scheduled post. Already-published posts cannot be cancelled. Returns the new status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ScheduledPost id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| status | Yes | |
| alreadyCancelled | No | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so the safety profile is covered. The description adds real value on top: the precondition that only pending posts are cancellable and that the new status is returned, which an agent needs to interpret the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the precondition, then the return. Nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations cover the destructive/idempotency profile. The main remaining gap is sibling disambiguation from cancel_scheduled_item, which the description never addresses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter ('id') and schema description coverage is 100%, so the schema fully documents it. The description adds no format, constraint, or lookup guidance for the id, leaving this at the baseline for fully-covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb+resource ('Cancel a pending scheduled post'), immediately telling the agent what happens. However, it does nothing to distinguish itself from the sibling cancel_scheduled_item, which likely has near-identical semantics, so the agent gets no help choosing between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States one exclusion — already-published posts cannot be cancelled — which is useful negative guidance. But it names no alternative for those cases and gives no other context about when to prefer this over cancel_scheduled_item or reschedule_scheduled_item.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_substack_verificationCancel a Substack code requestADestructiveIdempotentInspect
Cancel the selected code request for the connected account owner. Does not cancel article schedules, delete drafts, or disconnect Substack. Use only when the user wants to cancel this verification request.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The code request id returned for this same connection. | |
| connectionId | Yes | The exact Substack connection from the publishing response or get_user_profile. | |
| scheduledPostId | No | The exact saved article job from the publishing response. Pass it to resume that same job after verification. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| method | No | |
| message | Yes | |
| required | No | |
| verified | No | |
| cancelled | No | |
| challenge | No | |
| expiresAt | No | |
| connection | No | |
| nextAction | No | |
| instruction | No | |
| publication | Yes | |
| connectionId | Yes | |
| articleRecovery | No | |
| resumedArticles | No | |
| scheduledPostId | No | |
| connectedAccount | No | |
| deliveryConfirmed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The description goes beyond them by delimiting the blast radius — it cancels only the code request and does not touch schedules, drafts, or the Substack connection — which is exactly the kind of added context that matters for a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action front-loaded, followed by exclusions and a usage gate. No filler, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers scope, exclusions, and the trigger condition. It stops short of mentioning the resume-after-verification flow implied by scheduledPostId, but that is already carried in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains id, connectionId, and scheduledPostId in detail. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Cancel the selected code request') scoped to the connected account owner, and explicitly fences itself off from adjacent mutations (article schedules, drafts, disconnecting Substack). An agent can distinguish it from cancel_scheduled_item/cancel_scheduled_post without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear directive: 'Use only when the user wants to cancel this verification request,' which is a real when-to-use constraint. It does not, however, name the sibling alternative (e.g. complete_substack_verification or get_substack_verification_status) for the case where the user wants to proceed rather than cancel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_substack_verificationSubmit your Substack codeAInspect
Submit the six-digit code the connected account owner provides in this conversation for the same connection and code request. Never guess or automatically repeat a code. Confirmation can resume previously approved articles waiting on this connection; it is not proof of publication. Check an existing schedule afterward, or retry the same saved draft with its original settings if no schedule exists.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The code request id returned for this same connection. | |
| code | Yes | The six-digit code supplied by the user. Never echo it back. | |
| connectionId | Yes | The exact Substack connection from the publishing response or get_user_profile. | |
| scheduledPostId | No | The exact saved article job from the publishing response. Pass it to resume that same job after verification. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| method | No | |
| message | Yes | |
| required | No | |
| verified | No | |
| cancelled | No | |
| challenge | No | |
| expiresAt | No | |
| connection | No | |
| nextAction | No | |
| instruction | No | |
| publication | Yes | |
| connectionId | Yes | |
| articleRecovery | No | |
| resumedArticles | No | |
| scheduledPostId | No | |
| connectedAccount | No | |
| deliveryConfirmed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation/no-idempotency/open-world profile, and the description adds real value beyond that: confirmation can resume previously approved articles waiting on the connection, and 'it is not proof of publication' guards against a false-success read. The never-repeat-a-code caution is an extra behavioral constraint 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, action front-loaded, no filler. The 'never guess' prohibition and the after-care sentence are both load-bearing; the only mild redundancy is the dual mention of the same connection/code request.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, non-idempotent step in a multi-tool verification flow, the description covers the key side effect (resuming pending articles), the failure mode (not proof of publication), and the follow-up path. An output schema exists, so return values need no explanation here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines id, code, connectionId, and scheduledPostId. The description gestures at the connection/code-request linkage and at retrying the saved draft, but adds no syntax or format detail beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('submit the six-digit code') and pins the scope to 'the same connection and code request.' It is clearly separable from start_/cancel_/get_substack_verification_status by virtue of being the code-submission step, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not guidance ('Never guess or automatically repeat a code') and post-call guidance ('check an existing schedule afterward, or retry the same saved draft'). What's missing is an explicit pointer to start_substack_verification/get_substack_verification_status as the prerequisite steps, so the ordering is only implied by 'same connection and code request.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_article_from_noteCreate article from noteAIdempotentInspect
Create a linked article draft from a saved note. Preserves the note; repeated requests open the same article without overwriting edits. Does not publish.
| Name | Required | Description | Default |
|---|---|---|---|
| writer | No | ||
| draftId | Yes | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| versions | Yes | |
| articleId | Yes | |
| articleLinks | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, and destructive=false. The description adds genuine behavioral detail beyond them: the note is preserved, repeated requests open the same article without overwriting edits, and the tool does not publish. This is meaningful context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with zero filler. The core action comes first, followed by the preservation and idempotency guarantees and the no-publish boundary, each earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the key mutation semantics (preservation, idempotency, no publish). The one gap is that the parameters, especially the required draftId, are left undefined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (writer, draftId, workspace) have 0% schema description coverage, and the description explains none of them. It never clarifies that draftId is the required note/draft reference or what writer and workspace control, so the required input's meaning must be guessed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a linked article draft from a saved note'), which is clear and distinguishes the source (a note) from a generic draft. It does not explicitly name a sibling like create_draft or schedule_article, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'from a saved note' and 'Does not publish', which hints that schedule_article handles publishing. However, there is no explicit when-to-use guidance or naming of alternatives such as create_draft vs create_article_from_note, leaving the agent to infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draftCreate draftBInspect
Create a new draft owned by the authenticated user. Returns the created draft id and title.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Draft title. | |
| contentHtml | No | Optional HTML body. If omitted, the draft starts empty. Plain text is also accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| createdAt | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, non-destructive, non-idempotent write, and the description adds that the draft is owned by the authenticated user and returns id/title. It does not warn that repeated calls create duplicate drafts (relevant given idempotentHint=false), so it adds only modest value 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scoped by ownership; no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-required-parameter create tool with full annotations and an output schema (so return values need not be described), the description covers purpose and ownership adequately. It is only missing guidance on when this is the right creation tool among the create_* siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so title and contentHtml semantics are already fully documented in the schema. The description adds no field-level meaning, which is the expected 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new draft') plus ownership scope ('owned by the authenticated user'), which distinguishes it from list_drafts/get_draft/update_draft. It does not explicitly differentiate from the sibling create_article_from_note, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as create_article_from_note, nor any prerequisites or exclusions. The context is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_generated_notesCreate generated notesAInspect
Generate short notes in the writer's voice with Narrareach's note generator, from their own writing (source "profile") or from an article or post you pass in. Each note comes with a suggested time that avoids what is already on their calendar. This saves and schedules nothing: show the notes to the writer, then schedule each one they approve with schedule_note, passing the note as content, the platforms, its suggestedTime unchanged as scheduledFor (it is an absolute time) unless the writer picks another, the same workspace you used here, and this result's requestId as generationId. To schedule several approved notes at once, use schedule_notes with the same fields per note and a clientRequestId for each. Use create_draft only to keep a note unscheduled in the personal account (no workspace); it cannot save into a team workspace. Up to 10 notes per call and 20 calls per day; a call can take a minute or two.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days ahead to spread the suggested times over. Defaults to 7. | |
| tone | No | Optional tone. Defaults to PEER_TO_PEER. | |
| count | No | How many notes to generate. Defaults to 5. Some may be left out if they fail quality checks. | |
| source | No | What to generate from. "profile" (default) uses the writer's own writing and voice; the others need postContent and postTitle. | |
| postUrl | No | Optional link to that article or post, so notes can point to it. | |
| timezone | No | Optional IANA time zone used when the writer has no saved posting schedule, such as America/Toronto. | |
| platforms | No | Optional platforms the notes are for, so they fit each platform's length limit. | |
| postTitle | No | The title of that article or post. Required unless source is "profile". | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. | |
| postContent | No | The article or post text to draw notes from. Required unless source is "profile". | |
| cadenceResolution | No | What to do when the count does not fit the writer's usual posting rhythm: "extend_window" (default) spreads notes over more days; "increase_daily" posts more each day. | |
| customInstructions | No | Optional instructions from the writer for this batch, in their words. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tone | Yes | |
| notes | Yes | |
| source | Yes | |
| cadence | No | |
| persona | Yes | |
| quality | Yes | |
| requestId | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond annotations: it persists nothing, enforces up to 10 notes per call and 20 calls per day, and a call can take a minute or two. It also explains the chaining contract (pass note as content, suggestedTime unchanged as scheduledFor, requestId as generationId). Doesn't contradict the readOnlyHint=false/destructiveHint=false profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the scheduling workflow, then limits. It's a dense single paragraph but every clause earns its place; a slightly tighter structure with the limits broken out would be the only improvement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, non-mutating generation tool with an output schema, it covers purpose, downstream workflow, rate limits, latency, and workspace-scoping caveats. Nothing an agent needs to invoke and chain it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description adds value by tying parameters to the downstream call (workspace, platforms, suggestedTime as an absolute time). It meaningfully clarifies how the schema fields carry into scheduling rather than restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Generate short notes in the writer's voice') plus the two source modes (own writing/profile vs. a passed-in article or post). It also distinguishes itself from siblings by explicitly noting it 'saves and schedules nothing,' separating it from schedule_note and create_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: show notes to the writer, then schedule approved ones with schedule_note (or schedule_notes for batches), and use create_draft only to keep an unscheduled note in the personal account since it cannot save into a team workspace. When/when-not and alternatives are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reader_reply_draftCreate reader reply draftAInspect
Save an owned comment reply for review. Generates in the writer’s voice when text is omitted. Returns the comment, parent note, and linked article for review. Does not publish.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| activityId | Yes | ||
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| draft | Yes | |
| context | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is partly covered. The description still adds real behavior the annotations don't: voice-based generation when text is omitted, the returned artifacts, and the key negative 'Does not publish' that bounds the side effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and ending with the critical 'Does not publish' constraint. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema present, the description needn't explain return shape, yet it still names the returned artifacts. It is complete enough to call the tool correctly, with the only gap being the undocumented connection/activity parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters, so the description must carry the load. It only addresses one parameter ('Generates in the writer's voice when text is omitted'), implicitly conveying that text is optional and auto-filled, while activityId and substackConnectionId go entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Save) plus resource (owned comment reply / reader reply draft) with the lifecycle stage (for review) called out. It implicitly distinguishes itself from the send/publish sibling with 'Does not publish', but it doesn't name any alternative explicitly, so it falls just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Save ... for review' and 'Does not publish' imply you reach for this when you want an unpublished draft rather than a sent reply, but there is no explicit when-to-use guidance or mention of alternatives like update_reader_reply_draft, send_reader_reply_draft, or reply_to_reader_activity. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decide_voice_suggestionDecide voice suggestionAInspect
Record the writer's answer to one suggestion from get_voice_profile. Ask the writer first and call this only after they answer: "approve" adds it as a rule (pass text if they reword it), "dismiss" means they said no, "later" asks again in a week. One suggestion per call. Never decide for the writer.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Only with "approve": the rule in the writer's own wording, if they changed it. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| decision | Yes | What the writer said. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. | |
| suggestionId | Yes | The suggestion id from get_voice_profile. |
Output Schema
| Name | Required | Description |
|---|---|---|
| undo | Yes | |
| status | Yes | |
| decision | Yes | |
| ruleCount | Yes | |
| connectedAccount | No | |
| suggestionsRemaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare that this is not read-only, not idempotent, and not destructive. The description adds useful behavioral context beyond that: 'approve' creates a rule, 'later' defers for a week, and only one suggestion can be decided per call. It does not cover permissions or auth requirements, but it adds meaningful workflow behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it names the action first, then gives usage rules and decision semantics. Every sentence contributes directly to correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, annotations, and output schema, the description provides everything an agent needs to call this tool correctly. It covers when to call, how to interpret decisions, one-per-call behavior, and the do-not-decide-for-the-writer constraint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description still adds semantic value by clarifying that text is only used with 'approve' and only when the writer rewords the rule, and by explaining the behavioral effect of each decision enum. It does not add much for writer/workspace beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Record the writer's answer to one suggestion from get_voice_profile.' It distinguishes the tool from siblings by tying it directly to the suggestion workflow and clarifying that it records one decision per call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage conditions: ask the writer first, call only after they answer, and never decide for the writer. It also defines what each decision value means in workflow terms, leaving no ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ai_visibility_auditAudit article for AI search visibilityARead-onlyIdempotentInspect
Check an article draft for what helps Google, AI Overviews, ChatGPT search and Perplexity find and cite it: an opening that answers first, descriptive headings, links, sourced figures, lists, image alt text, one call to action, and title length. Call it before scheduling an article or when the writer asks how to make a post easier to find. Advisory only: it never changes the draft or blocks scheduling. Offer the topFixes, check needsJudgment yourself, never invent facts, and for a published article give the writer revised sections to paste into the live post instead of calling update_draft.
| Name | Required | Description | Default |
|---|---|---|---|
| draftId | Yes | Article draft id from list_drafts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| audit | Yes | |
| title | Yes | |
| status | Yes | |
| draftId | Yes | |
| message | Yes | |
| published | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds what they cannot: it is advisory only, never modifies the draft, never blocks scheduling, and it instructs the agent how to handle output (offer topFixes, evaluate needsJudgment itself, never invent facts). That output-handling guidance is genuinely beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded: purpose and checklist first, then usage triggers, then behavioral constraints and edge cases. Each sentence carries distinct information, though the checklist enumeration and the trailing instructions could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. The description covers the audit scope, when to invoke, the advisory/no-side-effect guarantee, and the published-article edge case — everything an agent needs to call and act on this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single draftId parameter is fully documented in the schema ('Article draft id from list_drafts'). The description adds no format, sourcing, or validation detail for the parameter, so the schema does all the work — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (audit an article draft for AI search visibility) and enumerates the exact signals it inspects — opening answers, headings, links, sourced figures, lists, alt text, CTA, title length. This makes it immediately distinguishable from siblings like get_draft (retrieval) and update_draft (mutation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers — 'call it before scheduling an article' and 'when the writer asks how to make a post easier to find' — plus an explicit alternative for the published-article case ('give the writer revised sections to paste... instead of calling update_draft'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audience_overviewGet Audience overviewARead-onlyIdempotentInspect
Check whether Audience is ready for a Substack publication and which filters it supports: the filter columns with their operators and values, plus how many subscriber tags and saved segments the publication has. Counts only; never returns subscribers. Workspace owner only, on a plan that includes agents.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. Audience is for the workspace owner only. | |
| publicationId | No | Optional connected Substack publication: its id, handle, URL, or name. Defaults to the default publication, or the only one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ready | Yes | |
| columns | Yes | |
| tagCount | Yes | |
| transport | Yes | |
| publicationId | Yes | |
| connectedAccount | No | |
| savedSegmentCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds real value beyond them: the privacy guarantee that only counts are returned and no subscriber rows leak, plus the owner-only and plan-tier authorization requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary answer (is Audience ready), followed by the payload summary and then the hard constraints. The single long opening sentence is dense but every clause earns its place; the brevity of the follow-on clauses keeps it tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and the description still flags what is not returned. Requirements (owner-only, plan tier) and scope (counts versus subscriber data) are covered; only error/readiness-failure behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are optional with their own documented defaults, so the baseline is 3. The description reinforces the ownership constraint on workspace but adds no syntax, format, or fallback 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.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource — verifies Audience readiness for a Substack publication and enumerates exactly what it returns (filter columns with operators/values, tag and segment counts). 'Counts only; never returns subscribers' sharply distinguishes it from preview_audience_segment, which an agent could otherwise confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames the use case clearly (a readiness/preflight check) and states the eligibility gate: workspace owner only, on a plan that includes agents. It stops short of naming when to use this instead of preview_audience_segment or what to do if the readiness check fails, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draftGet draftBRead-onlyInspect
Get a single draft by id, including full HTML content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Draft id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| meta | Yes | A JSON value stored by Narrareach. |
| title | Yes | |
| status | Yes | |
| createdAt | Yes | |
| updatedAt | Yes | |
| contentHtml | Yes | |
| contentJson | Yes | A JSON value stored by Narrareach. |
| publishedTo | Yes | |
| aiVisibility | Yes | |
| publishedCount | Yes | |
| lastPublishedAt | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered without the description. The description's one added fact, that the response includes full HTML content, is useful context about payload weight, but it says nothing about size limits, permissions, or error behavior on a missing id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, and the payload note is appended rather than buried. Nothing is wasted and nothing extra is needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations covering safety and an output schema covering the return shape, the description says enough to call it correctly. The only mild shortfall is the absence of any guidance on obtaining the id or handling a missing draft.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter 'id' is documented in-schema as the draft id. The description only echoes that with 'by id', adding no format or sourcing detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (a single draft) plus the retrieval key (id), which cleanly separates it from list_drafts. It does not name any sibling explicitly, but the word 'single' plus 'by id' makes the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains no when-to-use or when-not-to-use guidance; it only restates the operation. The only implicit signal is that an id must already be in hand (presumably from list_drafts or create_draft), but that routing is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_import_statusGet import statusARead-onlyIdempotentInspect
Read where the writer’s imports stand: the onboarding writing import, Substack imports (pages, notes, and articles imported, and whether voice preparation ran), blog automation sources (status, last sync, item counts), and social history imports. Statuses, counts, and error categories only; no imported text. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. In a team workspace only the owner can read import status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| contentSources | Yes | |
| writingImports | Yes | |
| substackImports | Yes | |
| connectedAccount | No | |
| socialHistoryImports | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely new context: that it returns statuses, counts, and error categories only, and explicitly no imported text content, which sets expectations about output and privacy. It does not restate the permission rule (owner-only in team workspaces), so it falls 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with the primary resource scope and the coverage is efficient in two sentences. Minor waste: the trailing 'Read-only' duplicates the readOnlyHint annotation rather than adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary, and the description covers the breadth of import categories well. For a read-only status tool the only notable omission is a pointer to the related verification-status sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage; the schema fully documents the optional workspace selector and the owner-only read rule. The description adds no syntax or format detail about that parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and enumerates the exact resource scope: onboarding writing import, Substack imports, blog automation sources, and social history imports. No sibling covers the same ground (get_substack_verification_status is about verification, get_platform_analytics about metrics), so an agent can distinguish 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope enumeration implies when this tool is relevant, but there is no explicit when-to-use/when-not statement and no named alternative for related queries like Substack verification status. Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_noteGet noteARead-onlyInspect
Get a single scheduled or posted note by id, including full content, recent stored metric snapshots (with Substack follows and subscriptions), platformMetrics, the connected account it names (socialAccountId) and why it is waiting if held (failureCode).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ScheduledAutoPost id. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| draft | Yes | |
| error | Yes | |
| quote | Yes | |
| status | Yes | |
| content | Yes | |
| context | Yes | |
| itemUrl | Yes | |
| postUrl | Yes | |
| platform | Yes | |
| postedAt | Yes | |
| timezone | Yes | |
| createdAt | Yes | |
| updatedAt | Yes | |
| retryCount | Yes | |
| contentHash | Yes | |
| contentJson | Yes | A JSON value stored by Narrareach. |
| contentMeta | Yes | A JSON value stored by Narrareach. |
| contentType | Yes | |
| scheduledFor | Yes | |
| externalPostId | Yes | |
| platformMetrics | Yes | |
| connectedAccount | No | |
| distributionKind | Yes | |
| performanceSnapshots | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is read-only, non-destructive, and closed-world. The description adds some useful context by noting stored metric snapshots and failureCode for held notes, but it does not cover auth requirements, rate limits, or freshness beyond 'stored'; since an output schema exists, much of the return-field listing is redundant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no filler, starting with the core action. The long trailing enumeration of return fields is somewhat redundant given the output schema, but the description remains compact and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with full schema coverage, annotations, and an output schema, the description is sufficient to understand what it fetches and key returned/held-note details. It is only missing explicit sibling routing guidance, which keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both id and workspace. The description only says 'by id' and adds no meaning about the workspace parameter or id format beyond what the schema provides, which matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get a single scheduled or posted note by id.' The singular, id-based scope distinguishes it from list-oriented siblings such as list_notes and list_scheduled_posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'by id' and 'single ... note'; the description does not explicitly say when to use this versus list_notes, get_draft, or get_scheduled_item_readiness. It gives enough context to infer a direct lookup when an id is known, but no explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_platform_analyticsGet platform analyticsARead-onlyIdempotentInspect
Read analytics for a connected platform. Returns account-level summary data where available, otherwise stored Narrareach note performance and connection readiness. Reads stored data and never refreshes connections (X adds live account numbers when its token is current); for Medium, call refresh_medium_stats first if no stats are stored. Note metrics: impressions and clicks are null when the platform does not report them, not 0. For SUBSTACK, benchmark is the latest saved notes benchmark (see its analysedAt); refresh it with refresh_substack_benchmark. For Substack notes, clicks is the total_clicks count Substack reports for the note; Substack does not document which clicks it includes, and impressions are not available.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | ||
| recentLimit | No | How many recent posts/notes to include. Default 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| handle | No | |
| reason | No | |
| source | No | |
| totals | No | |
| message | No | |
| profile | No | |
| summary | No | |
| platform | Yes | |
| username | No | |
| verified | No | |
| benchmark | No | |
| connected | Yes | |
| fetchedAt | No | |
| followers | No | |
| following | No | |
| readiness | No | |
| growthData | No | |
| tweetCount | No | |
| cachedStats | No | A JSON value stored by Narrareach. |
| displayName | No | |
| publication | No | |
| recentNotes | No | |
| recentPosts | No | |
| statsCachedAt | No | |
| engagementData | No | |
| profilePicture | No | |
| connectedAccount | No | |
| verifiedFollowers | No | |
| analyticsAvailable | No | |
| needsExtensionSync | No | |
| postAnalyticsAvailable | No | |
| profileAnalyticsAvailable | No | |
| officialAnalyticsAvailable | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description goes well beyond them: it clarifies it reads stored data and never refreshes connections, that X injects live numbers only when the token is current, and that null metrics mean 'not reported' rather than zero. These are non-obvious behaviors an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then layered with platform-specific caveats that each carry information. It is dense and runs long, but every sentence earns its place by disambiguating a metric or precondition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be restated, yet the description still usefully explains null-vs-zero metric semantics. It covers X, Medium and Substack thoroughly; the remaining platforms get no equivalent treatment, which is the only meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents recentLimit but leaves platform as a bare enum. The description compensates by attaching per-platform semantics (X token dependency, Medium storage precondition, Substack benchmark and clicks ambiguity) that explain what selecting a platform actually yields, adding real meaning beyond the enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read analytics for a connected platform') and immediately scopes the return ('account-level summary data where available, otherwise stored note performance and connection readiness'). This cleanly separates it from siblings like get_stats_insights and the refresh_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing guidance: 'for Medium, call refresh_medium_stats first if no stats are stored' and points to refresh_substack_benchmark for benchmark freshness. It establishes clear context for when to reach for this tool versus the refreshers, though it offers no explicit exclusions or guidance for the other eight platforms.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_posting_scheduleGet posting scheduleARead-onlyIdempotentInspect
Read the writer's Note posting schedule: the saved cadence (preferred times, posts per day, days of the week, weekend skipping), the effective schedule Narrareach uses (the default when nothing is saved), the schedule timezone, the next open queue slot, and the open slots for the next few days. To add a Note to the queue, pass nextOpenSlot.scheduledFor (or an openSlots entry's scheduledFor) unchanged to schedule_note's scheduledFor. In a team workspace the queue is the owner's, so members read the owner's schedule.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Days of open slots to list, starting today in the schedule timezone. Defaults to 7. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | Yes | |
| saved | Yes | |
| whose | Yes | |
| timezone | Yes | |
| effective | Yes | |
| openSlots | Yes | |
| nextOpenSlot | Yes | |
| hasSavedCadence | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: the distinction between the saved cadence and the effective schedule (default when nothing is saved), and the team-workspace rule that the queue belongs to the owner, so members read the owner's schedule. It does not mention rate limits or freshness, hence not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the read purpose, then the operational guidance and the team-workspace caveat. Every sentence carries information, though the long parenthetical enumeration of return fields makes the first sentence dense. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, yet it does so usefully; the two parameters are fully documented in the schema and the 'days' window is echoed as 'next few days'. The cross-tool handoff instruction and the team-ownership rule close the remaining gaps an agent would face.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so a 3 is the baseline. The description goes beyond it by explaining the purpose of the returned slot values and warning that scheduledFor must be passed 'unchanged' to schedule_note, which is a semantic constraint the schema cannot express. It adds modest but genuine meaning over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (read) and resource (the writer's Note posting schedule), then enumerates exactly what is returned: saved cadence, effective schedule, timezone, next open queue slot, and open slots. This clearly distinguishes it from update_posting_schedule and list_scheduled_items, which an agent can rule out 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit downstream guidance: to add a Note to the queue, pass nextOpenSlot.scheduledFor or an openSlots entry's scheduledFor unchanged to schedule_note's scheduledFor. That is a concrete use case plus the alternative tool to hand off to. It stops short of stating when not to call it (e.g., versus list_scheduled_items for already-queued items), so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_research_desk_answerGet Research Desk answerARead-onlyIdempotentInspect
Check on a Research Desk question started with start_research_desk_question. While done is false the desk is still researching: call again every 10 to 20 seconds, and do not start a new question meanwhile. Once done is true, answer is the desk's reply and noteIdeas are Notes it wrote for the writer to review; nothing is scheduled until the writer does it. failureMessage explains a question that could not be answered.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The runId returned by start_research_desk_question. | |
| workspace | No | Optional authorized team workspace name or id the question was asked in. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| done | Yes | |
| runId | Yes | |
| answer | Yes | |
| status | Yes | |
| progress | Yes | |
| noteIdeas | Yes | |
| failureReason | Yes | |
| conversationId | Yes | |
| failureMessage | Yes | |
| proposedActions | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), yet the description adds genuinely new operational context: the repeated-polling requirement, the guarantee that nothing is scheduled until the writer acts, and how an unanswerable question surfaces via failureMessage. That is well beyond what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then polling behavior, then output interpretation. Every clause carries distinct information (cadence, stop condition, no-side-effect guarantee, failure channel) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists (so return values need not be explained), the description supplies the interpretive frame — what done, answer, noteIdeas and failureMessage mean for the caller's next action. Nothing needed to invoke and act on this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so runId's provenance and workspace's account-selection semantics are already documented in the schema. The description only alludes to runId indirectly and says nothing extra about workspace, so it does not add meaning beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check on a Research Desk question') and ties it to the exact originating tool, start_research_desk_question, so it is unmistakable against the many other get_* siblings. The polling nature of the tool is clear from the first sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit polling cadence (every 10 to 20 seconds), the loop exit condition (done becomes true), and an explicit exclusion ('do not start a new question meanwhile'). This is exactly the when/when-not guidance an agent needs for an async job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduled_item_readinessCheck scheduled item readinessBRead-onlyIdempotentInspect
Inspect one scheduled Note or Article using stored Narrareach evidence without contacting a provider. Returns revision, draftId, destination, timing, cover, subscribe controls, paywall, email delivery, stored remote receipt, issues, and next action. Article draft content is local and is not a provider-verified copy; queued Note content is stored on the scheduled Note.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| kind | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| title | Yes | |
| checks | Yes | |
| issues | Yes | |
| status | Yes | |
| draftId | Yes | |
| itemUrl | Yes | |
| revision | Yes | |
| timezone | Yes | |
| platforms | Yes | |
| readiness | Yes | |
| nextAction | Yes | |
| deliveryNote | Yes | |
| destinations | Yes | |
| scheduledFor | Yes | |
| schemaVersion | Yes | |
| accountCanChange | Yes | |
| connectedAccount | No | |
| articleBodySource | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds real value beyond them: it states the tool uses stored evidence and does not contact a provider, and it warns that Article draft content is local rather than a provider-verified copy. It stops short of describing failure modes or staleness beyond that caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the operation and its key constraint, then return fields, then a caveat. The long comma-separated return-field list is somewhat dense but each clause is informative given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate returns, yet it helpfully orients the reader. Annotations cover the safety profile and the provider-contact caveat is disclosed. The main gap is the undocumented required 'id' parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters. The description implies the kind dimension via 'Note or Article' (matching the kind enum) but never explains the required 'id' — what it identifies or its format — so it does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Inspect') and resource ('one scheduled Note or Article'), with the scope 'readiness' anchored to stored Narrareach evidence. The singular framing implicitly contrasts with the plural sibling list_scheduled_items, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance or alternatives; the only conditional is 'without contacting a provider,' which describes execution rather than selection. An agent gets no signal about when to prefer this over get_draft, get_note, or list_scheduled_items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_settingsGet settingsARead-onlyIdempotentInspect
Read the writer's main Narrareach Settings: preferences (preferredTimezone, capitalizeGeneratedNotes, articleLinkPlacement, and tagArticleLinksWithUtm for UTM tags on article links), the default account on each platform (Substack publication, LinkedIn destination, Instagram, and Threads, Facebook, TikTok, Pinterest and X accounts), connection health per platform, and email notification settings. Reads what Narrareach has stored; it does not refresh connections with any platform. Change preferences with update_settings. Personal account only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| connections | Yes | |
| howToChange | Yes | |
| preferences | Yes | |
| notifications | Yes | |
| defaultAccounts | Yes | |
| connectedAccount | No | |
| articleConnections | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: it reads only what Narrareach has persisted and does not live-refresh platform connections, and it scopes itself to the personal account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, but front-loaded with the verb+resource and the field inventory that an agent needs. The enumeration of every platform (Substack, LinkedIn, Instagram, Threads, Facebook, TikTok, Pinterest, X) is longer than strictly necessary, though it is informative rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be described. The description covers scope, the mutation alternative, the stored-vs-live distinction, and the personal-account limitation, leaving no meaningful gap for a parameterless read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema confirms an empty object, so there is nothing for the description to disambiguate. The baseline for a parameterless tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Read") and resource ("the writer's main Narrareach Settings") and then enumerates exactly what is included: preferences, per-platform default accounts, connection health, and email notification settings. It clearly distinguishes itself from update_settings, the sibling that mutates the same resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes mutation to the alternative ("Change preferences with update_settings") and states a boundary condition ("Reads what Narrareach has stored; it does not refresh connections with any platform"), which implicitly points at the refresh_* siblings. It does not, however, spell out when a caller should prefer this over adjacent read tools like get_user_profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_insightsGet Stats insightsARead-onlyIdempotentInspect
Read stored Narrareach Stats for a period: reach, engagement, conversion, publishing rhythm, engagement peak, other-writers timing benchmark, and latest audience snapshot. Does not live-fetch Substack or per-platform account analytics.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Inclusive end date (YYYY-MM-DD). Required when period is custom. Must be a completed day. | |
| from | No | Inclusive start date (YYYY-MM-DD). Required when period is custom. | |
| period | No | Stats window. Defaults to 30d. custom requires from and to as complete YYYY-MM-DD dates. | |
| platforms | No | Connected platforms to include. Defaults to every connected platform the caller can read. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. | |
| contentTypes | No | Optional content types: article, note, social_post. | |
| publicationId | No | Optional Substack publication id. Team authors can only read an assigned publication. |
Output Schema
| Name | Required | Description |
|---|---|---|
| scope | Yes | |
| audience | Yes | |
| outcomes | Yes | |
| generatedAt | Yes | |
| nicheTiming | Yes | |
| schemaVersion | Yes | |
| engagementPeak | No | |
| connectedAccount | No | |
| platformPerformance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so safety is covered. The description adds genuinely useful context beyond them: this reads a stored snapshot rather than live-fetching, which explains staleness and latency expectations. It does not mention pagination or auth/workspace scoping nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with scope and the stored-vs-live distinction front-loaded. The metric enumeration earns its space by telling the agent what a call yields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 optional params and an output schema present, the description needn't explain return values, and it correctly covers scope plus the live-data exclusion. It is nearly complete; only explicit guidance on combining workspace/publicationId scoping is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 7 parameters (period, from/to, platforms, workspace, contentTypes, publicationId) are already documented with defaults, enums, and constraints. The description adds no syntax, format, or interaction 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (stored Narrareach Stats) and enumerates the exact metric families returned. It also draws a boundary against live per-platform analytics, which cleanly separates it from sibling get_platform_analytics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-not condition ("Does not live-fetch Substack or per-platform account analytics"), routing the agent to the alternative for live data. It never names the sibling tool explicitly and offers no positive 'use this when' trigger phrase, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stats_snapshotGet daily audience statsARead-onlyIdempotentInspect
Read the stored daily audience series for a period: subscribers, paid subscribers, followers, email open rate, unsubscribes, impressions, engagements, and (for the owner) ARR and Medium earnings, one point per day, plus the latest point and the change over the period. Reads what Narrareach has stored; it does not live-fetch Substack. Team members see only their assigned publication, without ARR or account-wide fields.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Days of history. Defaults to 30. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. | |
| publicationId | No | Optional Substack publication id. Team members can only read an assigned publication. |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | Yes | |
| change | Yes | |
| latest | Yes | |
| snapshots | Yes | |
| publication | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description's 'reads stored, does not live-fetch' is consistent with openWorldHint=false. It adds genuinely non-structured behavior: team members see only their assigned publication and no ARR or account-wide fields, while the owner sees ARR and Medium earnings. That authorization/field-visibility disclosure is the kind of context annotations cannot carry. It stops short of describing freshness/lag of the stored series.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences that are dense but front-loaded: payload first, data-source caveat second, permission boundaries last. The long metric enumeration is load-bearing in an output-schema world but is on the edge of redundancy given the schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still lists them; the more valuable coverage is the scope/permission statement (owner vs team, no ARR for team members), which nothing else provides. For a zero-required-param read tool this is close to complete, with only data-freshness/lag left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with days, workspace, and publicationId all documented in the schema (including the 365 maximum and defaults), so the baseline is 3. The description's 'for a period' loosely maps to days and 'their assigned publication' reinforces publicationId, but it adds no syntax, format, or interaction detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Read the stored daily audience series' — and enumerates the exact metrics returned, which is far more specific than a restatement of the title. It does not name or differentiate itself from close siblings such as get_stats_insights, get_audience_overview, or get_platform_analytics, so an agent must infer the boundary from content rather than being told.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Reads what Narrareach has stored; it does not live-fetch Substack' implicitly tells the agent this is the cached/reporting path and nudges fresh-data needs toward refresh_* tools, but it never names an alternative or states a when-not condition. The permission scoping sentence is context, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_substack_verification_statusCheck Substack verificationARead-onlyIdempotentInspect
Read whether your connected Substack publication needs a code and whether a code request is waiting. Does not request a code, change the connection, or publish. Only the connected account owner can check it. If a code is waiting, ask for it in a normal chat message and wait for the reply; do not send another code.
| Name | Required | Description | Default |
|---|---|---|---|
| connectionId | Yes | The exact Substack connection from the publishing response or get_user_profile. | |
| scheduledPostId | No | The exact saved article job from the publishing response. Pass it to resume that same job after verification. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| method | No | |
| message | Yes | |
| required | No | |
| verified | No | |
| cancelled | No | |
| challenge | No | |
| expiresAt | No | |
| connection | No | |
| nextAction | No | |
| instruction | No | |
| publication | Yes | |
| connectionId | Yes | |
| articleRecovery | No | |
| resumedArticles | No | |
| scheduledPostId | No | |
| connectedAccount | No | |
| deliveryConfirmed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the bar is lower, yet the description still adds value: it states the operation is non-mutating, discloses the owner-only authorization constraint, and tells the agent not to trigger a redundant code request. It does not describe rate limits or latency, but for a read-only status probe that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences with zero filler; the core read purpose is front-loaded and the exclusions plus the follow-up instruction are ordered by importance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers the key non-obvious behaviors (owner-only access, no side effects, do-not-resend-code). What remains unspecified is minor, e.g. the relationship between the check and the subsequent complete_substack_verification step.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so connectionId and scheduledPostId are already documented in the schema, including where to source them and what scheduledPostId does. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (Substack verification status) with two precise sub-questions: whether a code is needed and whether a request is waiting. It explicitly disambiguates from the sibling mutation tools (start_substack_verification, cancel_substack_verification, complete_substack_verification) by declaring what it does NOT do: request a code, change the connection, or publish.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: only the account owner may check, and if a code is waiting, ask for it in a normal chat message rather than sending another code. It does not name the alternative tool (start_substack_verification) for requesting a code, so the routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcriptGet transcriptAIdempotentInspect
Get the transcript of a YouTube video, a podcast episode (an RSS feed, an Apple Podcasts link, or an episode page that links its audio), or a direct link to an audio file, so you can quote, summarise or repurpose it. Pass url, or uploadUrl for a file the writer uploaded to Narrareach. For a feed or show, episode picks an episode by title or guid; the latest is used otherwise. Short sources come back ready with the text. Long audio is transcribed in the background: the result is status processing with a transcriptId, so call get_transcript_status with it every 20 seconds or so until it is ready. Spotify links cannot be transcribed. A transcript someone already requested is returned from the cache and does not count against the allowance. When the day's audio minutes are used up, podcast feed and Apple Podcasts links are refused, even for an episode already in the cache; cached YouTube videos, audio file links (with or without an extension) and uploads still work. Uses the connected writer's own daily transcript allowance (YouTube requests and audio minutes, reset at midnight UTC), not a team workspace owner's; available on the Revenue Writer plan and above. Counts as five requests against the rate limit.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A YouTube video, podcast feed or episode, Apple Podcasts link, or direct https link to an audio file (MP3, M4A, WAV, Ogg, WebM or FLAC). Pass url or uploadUrl, not both. | |
| episode | No | For a podcast feed or show: the episode title or guid. Defaults to the latest episode. | |
| maxChars | No | Characters of transcript text to return. Defaults to 60,000; truncated is true when there is more. | |
| uploadUrl | No | The URL of an audio or video file the writer uploaded to Narrareach (for example with upload_media). Only the uploader can read its transcript. Pass url or uploadUrl, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | |
| title | No | |
| cached | No | |
| status | Yes | |
| language | No | |
| sourceUrl | No | |
| truncated | No | |
| sourceType | No | |
| transcriptId | Yes | |
| durationSeconds | No | |
| connectedAccount | No | |
| pollAfterSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, idempotent=true, destructive=false; the description goes far beyond by disclosing cache reuse, that cached results don't consume allowance, per-source quota refusal rules, midnight-UTC reset, plan gating (Revenue Writer+), and that a call costs five rate-limit requests. It also explains the asynchronous processing contract (status processing + transcriptId).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and accepted sources, and almost every sentence carries distinct operational information (async flow, cache, quota, rate limit). It is dense — the quota/plan/rate-limit tail is a long run-on that could be split for scanability, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with an output schema, the description supplies everything an agent needs: input acceptance rules, the async polling path, failure modes (Spotify, exhausted allowance), and cost/plan constraints. 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.
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 the url/uploadUrl exclusivity in operational terms and clarifying that episode defaults to the latest when omitted. It does not add anything beyond the schema for maxChars, which caps it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the transcript') and enumerates the exact source types accepted (YouTube video, podcast RSS, Apple Podcasts link, episode page, direct audio file). The named purpose (quote, summarise, repurpose) plus the explicit handoff to get_transcript_status makes it distinguishable from every sibling at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when to use url vs uploadUrl, how episode resolution works for feeds, what to do for long audio (poll get_transcript_status every ~20s), and a hard exclusion ('Spotify links cannot be transcribed'). It also states quota-exhaustion behaviour per source type, so an agent knows which inputs will still succeed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcript_statusGet transcript statusARead-onlyIdempotentInspect
Check on a transcript that get_transcript returned as processing. While status is processing, call again every 20 seconds or so; long audio can take several minutes. Once ready, the result has the text. Reading a transcript does not use the allowance.
| Name | Required | Description | Default |
|---|---|---|---|
| maxChars | No | Characters of transcript text to return. Defaults to 60,000; truncated is true when there is more. | |
| transcriptId | Yes | The transcriptId returned by get_transcript. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | |
| title | No | |
| cached | No | |
| status | Yes | |
| language | No | |
| sourceUrl | No | |
| truncated | No | |
| sourceType | No | |
| transcriptId | Yes | |
| durationSeconds | No | |
| connectedAccount | No | |
| pollAfterSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description must add value beyond that. It does: polling cadence, latency expectations, and the important billing note that 'reading a transcript does not use the allowance.' It briefly notes the ready-state result contains the text, though it does not describe failure/error states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the trigger condition before the polling guidance, and every sentence carries actionable information (trigger, cadence, duration, billing). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary. The description covers the lifecycle of the poll (when to call, how often, when done) plus the quota behavior, giving the agent 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.
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 transcriptId and maxChars fully. The description references the transcriptId's origin ('returned by get_transcript' via the sibling) but adds no syntax or semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('check on a transcript') and explicitly ties it to the sibling get_transcript by describing the situation it operates on ('a transcript that get_transcript returned as processing'). An agent can distinguish it from get_transcript 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it (after get_transcript reports processing), the polling cadence ('call again every 20 seconds or so'), and the expected duration ('long audio can take several minutes'), which also implies when to stop polling. 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.
get_user_profileGet user profileARead-onlyInspect
Get the authenticated Narrareach user — name, email, timezone, plan, connected platforms, Substack publications, and any team workspaces/writers available for multi-writer scheduling on this connection.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| plan | Yes | |
| Yes | ||
| timezone | Yes | |
| createdAt | Yes | |
| xConnection | Yes | |
| integrations | Yes | |
| teamScheduling | Yes | |
| siteConnections | Yes | |
| connectedAccount | No | |
| connectedPlatforms | Yes | |
| subscriptionStatus | Yes | |
| substackPublications | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered without the description. The text adds useful context that this is the *authenticated* user (auth requirement) and that workspaces are scoped "on this connection", but it mostly restates return contents that the output schema already defines.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and resource first, followed by the field enumeration. The field list is long but each item is load-bearing information about what the profile yields, so there is no real padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema defining the return shape and annotations covering safety, the description only needs to orient the agent — which it does. The remaining gap is the absence of when-to-use guidance relative to adjacent read tools, which keeps it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies. Schema coverage is 100% and additionalProperties is false, so no compensating detail is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ("Get") plus a precisely scoped resource ("the authenticated Narrareach user"), and it enumerates exactly what the profile contains: name, email, timezone, plan, platforms, publications, workspaces. No sibling (e.g. get_voice_profile, list_workspaces) competes for the same job, so the agent can select this unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — the agent infers you call this to obtain the current user's identity/context. There is no statement of when to prefer it over get_voice_profile, list_workspaces, or list_social_accounts, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_voice_profileGet voice profileARead-onlyIdempotentInspect
Read the writer's voice profile: how they sound, their do/don't rules, topics, stances, real material, instructions, and a few of their own posts as examples. Call this before drafting or rewriting anything in the writer's voice. The material bank shows the most recent 30 items; pass detail "full" for all of them.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Optional. "full" returns every item in the material bank, not only the most recent 30. Defaults to "summary". | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| niche | Yes | |
| rules | Yes | |
| whose | Yes | |
| topics | Yes | |
| canSave | Yes | |
| pageUrl | Yes | |
| stances | Yes | |
| audience | Yes | |
| examples | Yes | |
| howToUse | Yes | |
| material | Yes | |
| howYouSound | Yes | |
| suggestions | Yes | |
| instructions | Yes | |
| materialTotal | Yes | |
| connectedAccount | No | |
| howToHandleSuggestions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond them: the material bank is truncated to the 30 most recent items unless "full" is passed, which tells the agent what the default result actually contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first enumerates the resource contents, the second front-loads the call-before-drafting directive and the detail flag. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and annotations carry the safety profile. What remains — when to call it and how the detail flag affects output — is covered, leaving nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents detail, writer, and workspace fully, including the 30-item cap and the "me" value. The description only restates the detail="full" behavior, adding essentially nothing the schema does not already say. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (writer's voice profile), then enumerates what the profile contains: sound, do/don't rules, topics, stances, real material, instructions, and example posts. This distinguishes it clearly from siblings like list_voice_examples, list_voice_changes, and update_voice_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, actionable trigger: "Call this before drafting or rewriting anything in the writer's voice." It does not name when-not to use it or point to sibling alternatives (e.g. list_voice_examples for examples alone), so it stops short of the 5 bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_content_versionsList related content versionsBRead-onlyIdempotentInspect
List a note and its linked article with independent statuses and destinations.
| Name | Required | Description | Default |
|---|---|---|---|
| writer | No | ||
| draftId | Yes | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| versions | Yes | |
| articleId | Yes | |
| articleLinks | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds the useful nuance that the note and linked article carry independent statuses and destinations, but says nothing about pagination, result shape, or auth/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding. It is efficient, though the phrasing 'list a note and its linked article' reads slightly awkwardly for a listing operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the read-only nature is covered by annotations. However, with 0% parameter documentation and no usage context, the definition is thinner than a three-parameter tool warrants.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters (writer, draftId, workspace), and the description names none of them. It only implies via 'a note' that draftId selects the subject, leaving writer and workspace entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and clarifies that the resource is a note plus its linked article with independent statuses and destinations, which resolves the ambiguity of the name 'content versions'. It is clear but does not explicitly distinguish itself from siblings like get_note or get_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as get_note or get_draft. The agent must infer that this is the tool for inspecting a note/article pair's publication state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_creator_matchesList creator matchesARead-onlyIdempotentInspect
List Substack’s creator matches for a publication: other writers whose audience overlaps, with their public profile, subscriber label, overlap counts, and whether this publication already messaged them. Read-only; it never sends a message. Workspace owner only, on a plan that includes agents.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. Audience is for the workspace owner only. | |
| publicationId | No | Optional connected Substack publication: its id, handle, URL, or name. Defaults to the default publication, or the only one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| matches | Yes | |
| publicationId | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the bar is lower; the description still adds real context by asserting it 'never sends a message' and by stating the owner-only and plan-gating constraints. It does not cover pagination or result limits, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, and the trailing clause about read-only behavior is short and earns its place. Slightly dense with enumerated fields but no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile; the description supplies permission and plan prerequisites plus the overlap semantics. Only the lack of pagination/volume guidance and any sibling prioritization keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the workspace and publicationId semantics are already fully documented in the schema, and the description adds no format or defaulting detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List Substack's creator matches for a publication') and defines what a match actually is ('other writers whose audience overlaps'), plus enumerates the returned fields. That scope is distinct from siblings like list_notes or list_social_accounts, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies prerequisites ('Workspace owner only, on a plan that includes agents') but never says when to prefer this over alternatives such as get_audience_overview or preview_audience_segment. Usage is implied by the resource name rather than contrasted with neighbors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draftsList draftsARead-onlyInspect
List the authenticated user's drafts, newest first. Excludes archived drafts and returns compact summaries without full HTML content.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of drafts to return (1–100). Default 25. | |
| query | No | Optional case-insensitive substring match against the draft title. | |
| status | No | Optional status filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| drafts | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive safety profile, so the description correctly focuses on extra behavior: newest-first ordering, exclusion of archived drafts, and compact summaries without full HTML. The archived-exclusion sits in mild tension with the ARCHIVED value in the status enum, which is worth clarifying but is not an annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: scope and ordering first, then exclusions and return-shape caveats. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described; the description still adds the useful note that summaries omit HTML. With full annotation and schema coverage plus only three simple parameters, the definition is nearly complete, missing only a hint about the archived-filter interaction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, query, and status are fully documented in the schema. The description adds no format or syntax detail beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource scoped to the authenticated user, plus ordering (newest first). It is clearly distinguishable from get_draft (single) and list_notes (different resource), though it never explicitly names those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the tool lists the current user's drafts and nothing more. There is no explicit when-to-use, no guidance on choosing this over get_draft for a single draft, and no mention of pagination strategy given the absence of a cursor parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hashtag_setsList hashtag setsARead-onlyIdempotentInspect
Personal saved hashtag sets. Saving sets never inserts hashtags into content or publishes anything. Up to 20 sets, 30 hashtags per set.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| sets | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds capacity limits (20 sets, 30 hashtags per set) and a note that saving sets has no publishing side effect, but it does not describe listing behavior, return format, or pagination beyond what the output schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no waste and is reasonably front-loaded. The middle sentence about saving behavior is slightly tangential for a list tool, but it remains concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only list tool with an output schema and clear annotations, the description supplies the relevant domain constraints (capacity limits) and safety context. Nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has zero parameters, so the baseline is 4. There is no parameter information for the description to add or omit, and it appropriately does not discuss parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource clearly ('Personal saved hashtag sets') and implies retrieval, so the agent knows it lists saved hashtag collections. However, it does not explicitly name the verb 'list' nor distinguish itself from the sibling save_hashtag_sets, which is the most likely alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus save_hashtag_sets or other list tools. The mention of saving behavior does not help an agent decide when listing is appropriate, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_inspiration_postsList inspiration postsBRead-onlyInspect
List posts the user has saved to their inspiration library (newest first).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter to posts containing this tag. | |
| limit | No | Default 25. | |
| platform | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| posts | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description usefully adds that results come from the user's saved library and are returned newest-first, but says nothing about pagination, result caps beyond 'limit', or how tag/platform filters interact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly written sentence with the resource and the ordering constraint front-loaded. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and all three parameters are optional. Still, for a filtered list tool the description omits pagination behavior, whether tag and platform combine, and any sense of result volume — modest gaps for an otherwise simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: tag and limit carry descriptions, but the platform enum parameter has none (its enum values are largely self-explanatory). The description adds no parameter-level detail at all, so the schema does the work and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and a specific resource (posts saved to the user's inspiration library), plus result ordering (newest first). This differentiates it from sibling list_* tools like list_drafts, list_notes, and list_scheduled_posts, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no routing against the many sibling list tools (list_drafts, list_notes, list_reader_activities, etc.). An agent must infer from the resource name alone that this is the tool for saved inspiration content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instagram_destinationsList Instagram destinationsARead-onlyIdempotentInspect
List the connected Instagram accounts available for Notes. Returns each accountId for schedule_note.instagramDestinations, how many accounts one Note may target, and defaultDestination: the account a Note posts to when instagramDestinations is omitted. When defaultIsAmbiguous is true several accounts are connected and none is marked default, so ask the writer which account to use and pass it explicitly.
| Name | Required | Description | Default |
|---|---|---|---|
| writer | No | Optional team writer name, handle, or id within the authorized workspace. | |
| workspace | No | Optional authorized team workspace name or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| context | Yes | |
| destinations | Yes | |
| connectedAccount | No | |
| defaultDestination | Yes | |
| defaultIsAmbiguous | Yes | |
| maxDestinationsPerNote | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, idempotent, closed-world read, so the safety profile is covered. The description goes further by disclosing the semantics of defaultDestination and the defaultIsAmbiguous flag, including the recommended agent action, which is genuine behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with no filler. The core purpose leads, followed by return contents, followed by the conditional edge case — a clean front-loaded ordering.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description is not obligated to enumerate return fields, yet it still clarifies the two semantics an agent could misread (defaultDestination fallback and defaultIsAmbiguous). Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the writer and workspace parameters are fully documented in the schema; baseline 3 applies. The description adds no additional meaning about how those filters behave or what happens when they are omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the connected Instagram accounts available for Notes') and immediately scopes it by naming the downstream consumer, schedule_note.instagramDestinations. The Instagram-specific naming naturally separates it from the LinkedIn/Medium destination siblings without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the context of use (obtaining accountId values for schedule_note.instagramDestinations) and gives an explicit conditional rule: when defaultIsAmbiguous is true, ask the writer and pass the account explicitly. It does not name alternative tools or state when not to call it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_linkedin_article_destinationsList LinkedIn Article destinationsBDestructiveInspect
List personal profiles and Company Pages available for LinkedIn Articles. With authorUrn, also returns newsletters owned by that author.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Refresh verified destinations from LinkedIn instead of reusing the recent session-bound list. | |
| authorUrn | No | Optional author URN returned by this tool. When supplied, Narrareach also returns newsletters owned by that profile or Page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| authors | Yes | |
| warning | No | |
| newsletters | Yes | |
| connectedAccount | No | |
| pageRefreshFailed | No | |
| articleSessionActive | No | |
| usingSavedDestinations | No | |
| newsletterRefreshFailed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, yet the description frames the tool as a plain enumeration and never explains what is destructive or mutated (the refresh parameter's cache/session side effect is the only hint). The description does add the conditional authorUrn behavior, but the safety-relevant behavior implied by the annotations is left unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the base behavior front-loaded and the conditional authorUrn branch second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema and an output schema present, the description does not need to describe return values; it correctly limits itself to scope plus the authorUrn branch. The remaining gap is routing context — no comparison against the sibling destination-listing tool and no reconciliation of the destructive annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are fully documented there, including the authorUrn newsletter behavior that the description merely restates. The description adds no syntax, defaults, or edge-case semantics 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ('List') with a specific resource ('personal profiles and Company Pages available for LinkedIn Articles') and adds the conditional newsletter behavior. An agent knows exactly what comes back. It stops short of a 5 because it never names the closely related sibling list_linkedin_destinations, so the distinction between 'all destinations' and 'destinations valid for Articles' must be inferred from the scope phrase alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope phrase 'available for LinkedIn Articles' weakly implies the calling context (picking a destination when publishing an article), but there is no explicit when-to-use, no prerequisites, and no mention of the alternative list_linkedin_destinations. An agent must guess which of the two list tools to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_linkedin_destinationsList LinkedIn destinationsBDestructiveInspect
Refresh and list LinkedIn personal profiles and Company Pages available for Notes. Returns accountId, organizationUrn for Pages, and the configured default destination.
| Name | Required | Description | Default |
|---|---|---|---|
| writer | No | Optional team writer name, handle, or id within the authorized workspace. | |
| workspace | No | Optional authorized team workspace name or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| context | Yes | |
| destinations | Yes | |
| connectedAccount | No | |
| defaultDestination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=true, and the description's 'Refresh' wording is consistent with a non-read-only operation. It also adds useful return context (accountId, organizationUrn, default destination). However, the surprising destructiveHint=true for a list-style tool is never explained, nor are auth/workspace requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the scope and the return payload front-loaded. Nothing in the text is redundant or wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return fields need not be restated, yet the description is otherwise thin on behavior for a tool whose annotations flag it as destructive and non-idempotent. The unexplained destructive hint leaves a real gap for an agent deciding whether to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the optional writer and workspace parameters are already documented in the schema. The description adds nothing about these parameters, which is acceptable given the schema coverage but yields only the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (refresh and list) and resource (LinkedIn personal profiles and Company Pages), and scopes it with 'available for Notes', which implicitly separates it from list_linkedin_article_destinations. It does not name any sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no reference to the nearest alternatives (list_linkedin_article_destinations, list_social_accounts). An agent must infer that this is the pre-scheduling lookup for LinkedIn notes rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_medium_publicationsList Medium publicationsARead-onlyIdempotentInspect
List Medium publications available to the connected account with writer access or higher. Uses the saved list unless refresh is true. Returns publication ids and canPublish: true indicates direct publishing permission; false indicates editorial review with content unpublished until editor acceptance.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Check Medium for publication changes instead of using the saved list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| connected | Yes | |
| publications | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds genuinely useful behavior beyond them: the result is served from a cached saved list unless refresh is set, and canPublish=false means editorial review with content held unpublished until editor acceptance. That caching/staleness disclosure is the kind of trait 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the scope and followed by the caching rule and output interpretation. Nothing is padding, though the second sentence is dense and partly restates the schema's refresh semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be enumerated, yet the description still supplies the one interpretation that matters (canPublish meaning) plus the cache/refresh behavior. Combined with rich annotations and full schema coverage, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, so the schema already defines refresh. The description's 'Uses the saved list unless refresh is true' paraphrases the schema rather than adding format or side-effect detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (List) and resource (Medium publications) and scopes it precisely: publications with writer access or higher on the connected account. That resource is clearly distinct from siblings like list_linkedin_destinations or list_workspaces, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear operational condition — 'Uses the saved list unless refresh is true' — and explains what the output means for the publish decision (canPublish true/false). It stops short of naming alternatives or when-not-to-use guidance, so it is strong context without explicit exclusion rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesList notesARead-onlyInspect
List the user’s notes across every supported note platform. Includes scheduled, failed, and posted notes with the latest stored engagement snapshot when available. For Substack notes, engagement includes follows, freeSubscriptions and paidSubscriptions: what Substack attributes to that note. platformMetrics holds the latest saves, views, reach, follows and reposts the platform reported for posts on other platforms. Unreported metrics are null, not 0. Each note carries socialAccountId (the connected account it names on Threads, Facebook, TikTok, Pinterest or X; null means the only account or the default), failureCode (why a held note is waiting) and tags (the draft’s content tags). With status POSTED, notes are newest first and from/to filter by posted time; otherwise by scheduled time, soonest first. Page with page.nextCursor. Only notes sent through Narrareach are listed.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Optional inclusive end: YYYY-MM-DD (covers that whole UTC day) or an ISO 8601 date-time. | |
| tag | No | Optional content tag name (case-insensitive) or id. Returns notes whose draft carries the tag. | |
| from | No | Optional inclusive start: YYYY-MM-DD or an ISO 8601 date-time. Posted time when status is POSTED, otherwise scheduled time. | |
| limit | No | Default 25. | |
| query | No | Optional case-insensitive substring match against the note content or title. | |
| cursor | No | page.nextCursor from a previous call with the same filters. | |
| status | No | ||
| writer | No | Optional authorized team writer name, handle, or id. "me" selects the linked voice. Requires workspace. | |
| platform | No | ||
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| count | Yes | |
| notes | Yes | |
| context | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/no-destructive, so the description carries most of the behavioral load and does so well: it discloses that scheduled, failed and posted notes are all returned, that metrics are a stored snapshot, that unreported metrics are null rather than 0, the sort direction per status, and cursor pagination. It stops short of stating freshness guarantees or auth/rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, but the middle is a dense run-on about output fields (socialAccountId, failureCode, platformMetrics, tags) that duplicates an existing output schema, plus a cursor-pagination sentence the schema already covers. Several sentences do not earn their place against the structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter read-only list tool, the description covers scope, filtering, ordering and pagination adequately, and an output schema exists so return values need not be explained. The main gap is guidance on choosing this tool over the other list_* tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3. The description largely restates what the schema already says (from/to meaning by status, page.nextCursor, workspace absence selecting the personal account, writer requiring a workspace) and adds only the ordering rule, which is not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the user's notes") and adds scope that separates it from nearby siblings: notes across every supported platform, including scheduled/failed/posted, and only those sent through Narrareach. It never names a sibling (list_scheduled_items, list_social_posts, get_note) to route the agent, so differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the status/platform/tag/query filters and the ordering rule, which hint at when this tool applies. There is no explicit when-to-use, when-not-to-use, or alternative named among the many list_* siblings, so an agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reader_activitiesList reader activitiesARead-onlyIdempotentInspect
Read stored Substack likes, comments, restacks, and other notifications for the authenticated Narrareach account. This tool does not fetch new activity from Substack. Each item has type (LIKE, COMMENT, RESTACK, or OTHER), kind (the Substack notification type), and label (a short description). OTHER covers notifications that are not note likes, note replies, or restacks: follows, free and paid subscriptions, likes and replies on posts and comments, mentions, chat activity, live streams, and system notices such as a scheduled note being sent. Many OTHER items have no content; read kind and label to see what they are. Only COMMENT items with canReply true can be replied to. The inbox contains new activity; history contains the initial import and items already handled or replied to. Either can contain recent activity. sort=time returns newest first. range.page and range.all show the date ranges for the returned page and the requested state. Check sync.lastSyncedAt and sync.refreshRecommended for freshness; results may not include the latest activity.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | time | |
| type | No | all | |
| limit | No | ||
| state | No | inbox | |
| cursor | No | ||
| intent | No | ||
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| sync | Yes | |
| range | Yes | |
| summary | Yes | |
| activities | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, and the description adds rich behavior beyond them: the meaning of OTHER, that many OTHER items carry no content, the canReply gate for COMMENT, inbox vs history contents, sort semantics, and sync.lastSyncedAt/refreshRecommended freshness caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose and the fetch caveat come first, then type/kind/label semantics, then state and sort behavior. Dense but nearly every sentence delivers usable information; the OTHER enumeration runs slightly long but is justified by the schema gap.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the safety profile, so the remaining burden is behavioral and param-level. The description handles behavior, state, and freshness well but leaves several filter params unexplained, so it is not fully complete for a 7-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 params, so the description carries the full burden, yet it only meaningfully explains type, sort=time, and state. limit, cursor, intent (an 8-value enum), and substackConnectionId are left entirely undocumented, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read stored Substack likes, comments, restacks, and other notifications') and immediately draws a scope boundary ('does not fetch new activity from Substack'), separating it from refresh/fetch-flavored siblings. An agent can distinguish it from reply_to_reader_activity and update_reader_activity without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong conditional context: inbox vs history semantics, 'Either can contain recent activity', and 'Only COMMENT items with canReply true can be replied to' (implying the reply tool). It stops short of naming the alternative tools (reply_to_reader_activity, update_reader_activity) or stating exclusions explicitly, so it lands just below the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reader_reply_draftsList reader reply draftsBRead-onlyIdempotentInspect
List saved reply drafts for the selected publication, filtered by status. Does not publish or change drafts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | ||
| activityId | No | ||
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| drafts | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false. The description adds that it 'does not publish or change drafts', which reinforces the read-only nature but is largely redundant. No additional behavioral details such as pagination, default limit, or authentication requirements are provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and scope, then a clarifying non-mutation statement. No wasted words or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, annotations cover safety, and an output schema exists so return values need not be explained. However, with 0% schema description coverage, the description fails to document three of four parameters, leaving an agent without enough semantic detail to invoke the tool confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'filtered by status' (one of four parameters) but offers no explanation of limit, activityId, or substackConnectionId. The semantics of three parameters are left entirely opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'List' and resource 'saved reply drafts' with scope 'for the selected publication' and filtering by status. It distinguishes from write operations (create/update/send) by being a list operation, but does not explicitly differentiate from sibling list_drafts or list_reader_activities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives like list_drafts, list_reader_activities, or create_reader_reply_draft. The only hint is 'filtered by status', which does not explain selection criteria or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_itemsList scheduled itemsBRead-onlyIdempotentInspect
List Notes and Articles in one bounded schedule view with destination, content-readiness checks, stored provider receipt state, and next action. workspace and writer scope authorized team Notes; team Articles remain private to their owner. Each Note destination carries accountId (the connected account it names; null means the only account or the default) and accountCanChange. A held Note reports why in issues (social_account_choice_required, social_account_disconnected, missed_while_account_unavailable, x_account_changed) with a writer-facing deliveryNote. Reads stored evidence without contacting a provider.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No | ||
| kind | No | ||
| limit | No | ||
| status | No | active | |
| writer | No | Optional authorized team writer name, handle, or id. "me" selects the linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| items | Yes | |
| context | Yes | |
| schemaVersion | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, yet the description adds real context: it reads stored evidence without contacting a provider, notes can be held, and held notes report enumerated reasons with a writer-facing deliveryNote. This meaningfully exceeds the annotation surface, though much of it drifts toward return-value territory the output schema already covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb+resource, then layers scope and state semantics in a few dense sentences. It is jargon-heavy but every sentence carries information; nothing reads as filler beyond the parenthetical reason list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values need not be documented, yet the description still spends most of its length on them while leaving the input filters under-specified. For a 7-parameter, 0-required list tool it covers scope adequately but is incomplete on filtering behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 29% (writer and workspace are documented; to, from, kind, limit, and status are not). The description compensates only for the writer/workspace authorization semantics and describes accountId/accountCanChange, which are output fields, not the undocumented input filters, leaving the date-range, kind, status and limit parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource scope (Notes and Articles in a bounded schedule view) and enumerates what the view carries. An agent can grasp what comes back, though it never names the nearest sibling (list_scheduled_posts) to disambiguate 'items' from 'posts'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'one bounded schedule view' implies when this list is appropriate, and the scope rules (workspace/writer team Notes vs private team Articles) hint at authorization context. However, there is no explicit when-to-use/when-not, and no routing to alternatives such as list_scheduled_posts or get_scheduled_item_readiness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_postsList scheduled postsBRead-onlyInspect
List scheduled posts for the authenticated user, ordered by scheduled time ascending.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ISO datetime; only return posts at/before this time. | |
| from | No | ISO datetime; only return posts at/after this time. | |
| limit | No | Default 25. | |
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| posts | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the ascending-ordering behavior, which is useful context beyond the annotations, but says nothing about pagination or result limits behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the resource and ordering front-loaded and no wasted words. It is arguably too terse given the sibling ambiguity, but structurally clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations cover the safety profile. The remaining gap is the lack of sibling disambiguation and usage guidance for a list tool with four filter parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%: the to/from/limit parameters are documented in the schema, and status carries an enum. The description adds no parameter-level detail, but with high schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('scheduled posts'), plus the scope (authenticated user) and ordering (scheduled time ascending). However, it does not distinguish itself from the very similar sibling 'list_scheduled_items', leaving the agent to infer the difference between a 'post' and an 'item'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, despite the presence of near-neighbors like list_scheduled_items and list_social_posts. There are also no exclusions or prerequisites stated, so selection relies entirely on the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_social_accountsList social accountsARead-onlyIdempotentInspect
List the connected Threads, Facebook, TikTok, Pinterest and X accounts a Note can be sent to. Returns one entry per platform with each accountId for schedule_note.socialAccountIds, defaultAccountId (the account used when none is named), and accountChoiceRequired: true when several accounts are connected and none is the default, in which case ask the writer which account and pass it in socialAccountIds. X is listed only when the writer has added X accounts for posting from more than one; a writer who uses a single X connection has no X entry and needs no socialAccountIds for X. Instagram and LinkedIn have their own tools: list_instagram_destinations and list_linkedin_destinations. The default account is set, and accounts are connected or reconnected, by the writer in Narrareach Settings; no tool does either.
| Name | Required | Description | Default |
|---|---|---|---|
| writer | No | Optional team writer name, handle, or id within the authorized workspace. | |
| workspace | No | Optional authorized team workspace name or id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| context | Yes | |
| platforms | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, and the description adds substantial behavioral context beyond them: the per-platform entry shape, the meaning of defaultAccountId, the accountChoiceRequired flag and required follow-up action, and the fact that no tool connects accounts or sets defaults (that happens in Narrareach Settings).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core purpose and return shape come first, then the routing alternatives, then the account-choice rule. Every sentence carries distinct guidance with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still explains the returned fields relevant to the follow-up call (accountId, defaultAccountId, accountChoiceRequired). Combined with sibling routing and the Settings caveat, nothing needed to call or chain the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both optional parameters (writer, workspace), so the schema carries the semantics and baseline 3 applies. The description references socialAccountIds and accountId, but those belong to schedule_note rather than this tool's inputs, so it adds no direct meaning to writer/workspace.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('connected Threads, Facebook, TikTok, Pinterest and X accounts a Note can be sent to'), including the platform scope that separates it from its Instagram/LinkedIn counterparts. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the sibling alternatives explicitly (list_instagram_destinations, list_linkedin_destinations) and explains the downstream condition: when accountChoiceRequired is true, ask the writer and pass the chosen account in schedule_note.socialAccountIds. It also documents the X-only-when-multiple-connections edge case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_social_postsList social postsARead-onlyIdempotentInspect
List the writer’s own posts on connected Instagram, Threads, Facebook, LinkedIn, Bluesky, Pinterest, TikTok and X accounts, including posts published outside Narrareach, newest first, with the latest metrics each platform reported (likes, comments, shares, saves, sends, clicks, views, reach, impressions, follows, reposts). source says whether the post went out through Narrareach. Metrics a platform does not report are null, not 0 (for example, Threads has no reach and Bluesky only likes, comments and shares); on X the view count is impressions. Filter by platform, source, and from/to on published time; page with page.nextCursor. Personal account only; Substack is covered by list_notes and get_platform_analytics.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Optional inclusive end: YYYY-MM-DD (covers that whole UTC day) or an ISO 8601 date-time. | |
| from | No | Optional inclusive start on published time: YYYY-MM-DD or an ISO 8601 date-time. | |
| limit | No | ||
| cursor | No | page.nextCursor from a previous call with the same filters. | |
| source | No | all | |
| platform | No | ||
| includeDeleted | No | Include posts the platform reports as deleted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| posts | Yes | |
| available | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint/idempotentHint, non-destructive), so the remaining burden is on semantics, and the description delivers: null-vs-0 metric convention, platform-specific gaps (Threads has no reach, Bluesky only likes/comments/shares), X views mapped to impressions, inclusion of posts published outside Narrareach, and pagination via page.nextCursor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb, resource, and scope, then flows into metric semantics and filtering. The enumerated metric list is slightly heavy, but nearly every clause carries operational meaning rather than restating the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be described, yet the description still covers the non-obvious parts of the payload (metric nullability, per-platform differences, source attribution). Combined with filter and cursor guidance, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, and the description compensates well: it explains what 'source' means, that platform/source/from/to are filters on published time, and that pagination uses page.nextCursor from a prior identical-filter call. It adds little on limit or includeDeleted, which the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the writer's own posts') plus the exact set of connected platforms, the ordering (newest first), and the metric payload. An agent can immediately tell this apart from list_scheduled_posts, list_inspiration_posts, and list_notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear exclusion ('Personal account only; Substack is covered by list_notes and get_platform_analytics') and explains how to narrow results via platform/source/date filters. It stops short of routing against other near siblings such as list_scheduled_posts or list_inspiration_posts, so it is strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_topic_suggestionsList topic suggestionsARead-onlyIdempotentInspect
Suggest timely topics the writer could write about now, for each of their content pillars (their profile themes and the tags they use most). Each suggestion has the topic, its pillar, a fit score (0 to 100), why it is timely now, a suggested angle, and evidence: the trend sources and headline links behind it. Show the evidence links so the writer can check them; do not present a suggestion as fact beyond what they say. pillars lists the writer's pillars with their ids; pass pillarId to see one. When recommendations is empty, emptyReason says why: refreshing means the writer's niches are still being searched, so call again in about 30 seconds; unknown_pillar means that pillarId is not one of theirs, so call again without it; no_trends or no_matches mean nothing timely fits right now, so do not retry soon; no_pillars and no_profile mean the writer needs themes or a niche on their Narrareach profile; check_unavailable means try again later. To draft Notes on a suggestion in the writer's voice, call create_generated_notes with source "articles", postTitle set to the topic (trimmed to 300 characters), postContent set to its whyNow, its suggestedAngle, and each headline title with its URL (one per line; a headline without a URL by its title only), postUrl set to the first link's URL (left out when that link has none), and customInstructions "Use only the facts in this text; do not add any." The generator writes from that text and checks the notes against it, so the evidence goes with the notes. Each create_generated_notes call costs 10 requests against the rate limit. Available on the Revenue Writer plan and above, on the writer's own plan. Counts as three requests against the rate limit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many suggestions to return, 1 to 20. Defaults to 10. | |
| pillarId | No | Optional pillar id from the pillars in an earlier result. Omit for suggestions across every pillar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| region | Yes | |
| pillars | Yes | |
| sources | Yes | |
| fetchedAt | Yes | |
| emptyReason | Yes | |
| recommendations | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/openWorld/idempotent/non-destructive), the description discloses plan gating (Revenue Writer and above, on the writer's own plan) and rate-limit cost (three requests per call), plus the 10-request cost of the follow-on create_generated_notes call. It also explains the transient 'refreshing' state, which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the purpose and the fields, then the pillarId guidance, then the emptyReason handling. It is dense and mostly earns its length, but the long create_generated_notes paragraph reads as instructions that arguably belong to that tool and makes the block heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description summarizes the return shape (topic, pillar, fit score, whyNow, angle, evidence links) and covers error states, plan eligibility, rate-limit cost, and the ethical constraint of showing evidence links rather than asserting facts. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents limit and pillarId, giving a baseline of 3. The description adds real meaning by explaining where pillarId comes from ('from the pillars in an earlier result') and its scoping effect, and reinforces the truncation/format hints carried with suggestions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource (suggest timely topics per content pillar) and enumerates the returned fields, so an agent knows exactly what it produces. It is clear without naming any sibling like list_inspiration_posts or list_creator_matches, so it stops short of the explicit sibling differentiation a 5 requires.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use and when-not-to-use guidance: pass pillarId to scope to one pillar, omit it for all; and it decodes every emptyReason (refreshing -> retry in ~30s, unknown_pillar -> retry without it, no_trends/no_matches -> do not retry soon, check_unavailable -> try later). It even routes the agent onward to create_generated_notes with the exact argument mapping, which is unusually actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voice_changesList voice changesARead-onlyIdempotentInspect
List recent changes to the writer's voice profile, newest first: what changed, who made it, where (the Voice page, an assistant, the API), and when. Only the newest change can be undone; pass its id to undo_voice_change.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional number of changes, 1-20. Defaults to 10. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| whose | Yes | |
| changes | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful non-annotation context: the newest-first ordering and the constraint that only the most recent change is reversible, which materially shapes how an agent uses the results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The ordering and returned fields are front-loaded, and the second sentence carries only the actionable undo constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations cover the safety profile. The description supplies the remaining essentials: what the list contains, its ordering, and how it feeds undo_voice_change.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – limit, writer and workspace are all documented in the schema, including the 'me' selector and the workspace requirement. The description adds no parameter-level detail beyond ordering, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list changes to the writer's voice profile) plus the ordering (newest first) and the exact payload fields (what, who, where, when). This clearly distinguishes it from get_voice_profile (current state) and list_voice_examples (materials), both present as siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context and explicitly routes the follow-up action: only the newest change can be undone, and its id should be passed to undo_voice_change. It does not, however, state when to prefer this audit-log tool over get_voice_profile or how it relates to the voice-editing siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voice_examplesList voice examplesARead-onlyIdempotentInspect
List the writer's own posts, newest first, that can be pinned as examples of how they sound, with the example ids update_voice_examples takes. Search by text or date and page with nextCursor. Also returns which posts are pinned and which are excluded. Posts outside the writer's main languages, that read like a reply to someone else, or that began as a Narrareach draft (startedFromDraft) are marked: they are never chosen automatically but can be pinned. A note sent to several platforms is listed once, as its Substack copy when there is one.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Optional latest post date: YYYY-MM-DD (UTC, through the end of the day) or an ISO date-time with offset. | |
| from | No | Optional earliest post date: YYYY-MM-DD (UTC) or an ISO date-time with offset. | |
| query | No | Optional text to search the posts for. | |
| cursor | No | Optional nextCursor from the previous page. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| pageSize | No | Optional posts per page, 1-20. Defaults to 10. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| whose | Yes | |
| pinned | Yes | |
| removed | Yes | |
| examples | Yes | |
| pinLimit | Yes | |
| nextCursor | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds real value beyond them: newest-first ordering, the marking/exclusion rule, the dedup rule that a multi-platform note appears once as its Substack copy, and cursor paging via nextCursor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose and workflow linkage before the exclusion and dedup details. Slightly dense in the third sentence, but every clause carries usable information about how results are shaped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, yet the description still conveys ordering, filtering, paging, pin/exclusion status, and dedup behavior. Combined with annotations covering the safety profile, an agent has everything needed to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the date formats, pageSize bounds, and cursor semantics. The description only adds a high-level gloss ('search by text or date and page with nextCursor') without syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the writer's own posts') plus the exact downstream consumer ('the example ids update_voice_examples takes'), which separates it from siblings like list_voice_changes or list_inspiration_posts. The ordering ('newest first') and filterability are stated up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly ties the tool to the update_voice_examples workflow and explains that marked posts are 'never chosen automatically but can be pinned,' which tells the agent how to treat results. It lacks an explicit 'do not use this for X' exclusion against sibling list tools, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList workspacesARead-onlyInspect
Discover the authenticated account’s personal context and authorized team workspaces, writers, and publications. Returns workspace and writer identifiers for team scheduling; no login switch is required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| routing | Yes | |
| defaultContext | Yes | |
| teamWorkspaces | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real context beyond them: it returns identifiers only and requires no login switch, meaning it exposes all authorized contexts in one call. It does not mention pagination or ordering, but for a no-param read this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the scope statement front-loaded and the auth note second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only tool with an output schema and full annotation coverage, the description supplies enough to call it correctly. The only gap is routing guidance relative to the other list_* tools, which is not strictly required here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the schema baseline is 4 and there is nothing for the description to disambiguate. The description instead characterizes the return payload, which the output schema covers, so no additional credit or penalty applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear resource set — workspaces, writers, publications — and what it returns (identifiers for team scheduling). 'Discover' is a slightly softer verb than 'list', but the object is concrete enough that an agent can distinguish it from siblings like list_medium_publications or list_linkedin_destinations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for team scheduling' implies when this tool is useful (before scheduling team content), but no alternative or exclusion is named, and the many list_* siblings are not addressed. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_publishing_studioOpen writing and scheduling studioARead-onlyIdempotentInspect
Open a ChatGPT panel to start original long-form articles and short-form posts in the user’s saved voice, or an authorized team writer’s voice. Reads connected account and available writers. Does not draft, save, schedule or publish content. The user sends a writing brief back to the conversation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| view | Yes | |
| accountName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond annotations: it opens a panel, reads connected account and available writers, does not draft/save/schedule/publish, and the user sends a writing brief back to the conversation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences, front-loads the core action, and each sentence adds useful scope, limitation, or interaction detail. There is no repetitive or wasted language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a zero-parameter UI-opening tool with rich annotations and an output schema, the description is complete enough. It explains what the tool opens, what it reads, what it does not do, and what the user does next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to document. The schema is also fully described with no required fields, making the baseline score appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Open a ChatGPT panel to start original long-form articles and short-form posts.' It also distinguishes the tool from sibling content-management tools by explicitly stating what it does not do: 'Does not draft, save, schedule or publish content.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: start long-form articles or short-form posts in the user's saved voice or an authorized team writer's voice. It also provides a strong when-not boundary by excluding drafting, saving, scheduling, and publishing, though it does not name specific alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_audience_segmentPreview Audience segmentARead-onlyIdempotentInspect
Count how many subscribers match a set of filters, without listing them. Columns: type (is, is_not, is_any_of); started_at (on, before, after); activity (gt, gte, lt, lte, is, is_not). Each column at most once; combine Type values with is_any_of. Returns the count and a plain-language rule. Never returns subscribers or emails. Workspace owner only, on a plan that includes agents.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. Audience is for the workspace owner only. | |
| predicates | Yes | Filters, all of which must match. | |
| includeAuthor | No | Include the publication’s own author in the count. Defaults to false. | |
| publicationId | No | Optional connected Substack publication: its id, handle, URL, or name. Defaults to the default publication, or the only one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| lastSync | Yes | |
| exclusions | Yes | |
| completeness | Yes | |
| predicateHash | Yes | |
| publicationId | Yes | |
| interpretedRule | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the description adds genuine extra context: the output is a count plus a plain-language rule, subscriber identities are never exposed, and there are auth/plan prerequisites. That is exactly the kind of information 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior and output shape come first, followed by the operator table, structural constraints, privacy guarantee, and auth requirements. Every sentence is terse and load-bearing, with no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter read tool with an output schema, everything an agent needs is present: what is counted, what is returned, what is never returned, filter combination rules, and permission/plan prerequisites. The maxItems and includeAuthor details are adequately handled by the schema itself.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is documented, so the baseline is 3. The description goes beyond that by enumerating the valid operators per column (is/is_not/is_any_of, on/before/after, gt/gte/lt/lte/is/is_not) and the one-column-once constraint, which compensates for the schema delegating operator enumeration to get_audience_overview.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Count how many subscribers match a set of filters') and immediately bounds the scope with 'without listing them'. The description also distinguishes the output from listing-style siblings by saying it never returns subscribers or emails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: workspace-owner-only permission, a required plan that includes agents, and structural rules ('Each column at most once'). It does not explicitly name a sibling to use instead for listing subscribers or for browsing the audience, so the when-not case is only implied by 'without listing them'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_note_quotePreview a Note quoteARead-onlyIdempotentInspect
Check a public Substack Note link or Substack post/article link before quoting it. Read-only: nothing is scheduled and publishable is always false. Returns kind ("note" or "post") and what the quote card shows. To schedule a note that quotes it, pass the same link as quoteUrl to schedule_note or a schedule_notes item, and leave it out of the note text.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| workspaceId | No | Authorized workspace id from list_workspaces; omit for the default workspace. | |
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| quote | No | |
| status | Yes | |
| message | Yes | |
| publishable | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral context: 'nothing is scheduled and publishable is always false,' and explains what the return value shows (kind and quote card). This goes beyond the safety profile without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the core purpose. Each sentence adds value: purpose, read-only guarantee, return values, and follow-up usage. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, rich annotations, and presence of an output schema, the description covers purpose, usage, and behavior well. The only gap is the lack of explanation for the 'substackConnectionId' parameter, but overall it provides enough for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (33%). The description compensates for the 'url' parameter by specifying it's a public Substack Note or post/article link, but it does not explain 'substackConnectionId' at all. Partial compensation keeps it at a minimum viable level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Check) and resource (public Substack Note link or Substack post/article link), and clearly frames the purpose as previewing before quoting. It distinguishes itself from scheduling tools by noting that schedule_note or schedule_notes should be used to actually schedule the quote.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use (before quoting) and how to proceed afterward (pass the link as quoteUrl to schedule_note or schedule_notes). It does not explicitly state when not to use or name an alternative tool for the same preview purpose, but the guidance is strong enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_publishing_planReview articles and short posts before schedulingARead-onlyIdempotentInspect
Show exact proposed schedule_note and schedule_article calls for the writer to review in ChatGPT. No scheduling occurs. Include full inline content (not draftId), explicit dates with UTC offsets, time zones, selected account identifiers (never implicit multi-account defaults), and explicit subscriber-email/audience/SEO choices for articles. Each note needs clientRequestId. For unsupported advanced options, review in the conversation instead. The panel sends user approval or requested changes back to the conversation; execute scheduling only after that approval. Voice selection comes from open_publishing_studio. Article scheduling is personal-account only.
| Name | Required | Description | Default |
|---|---|---|---|
| calls | Yes | ||
| voice | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| view | Yes | |
| accountName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, but the description adds material behavior: nothing is scheduled, approval or change requests flow back through the conversation, and article scheduling is restricted to personal accounts. That is context an agent cannot derive from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the 'no scheduling' guarantee are front-loaded in the first two sentences, and every later sentence carries a rule. The middle sentence is a long comma-separated list that is dense to parse, which keeps this short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich nested input schema, an output schema, and full annotation coverage, the description supplies the workflow, the approval gate, and the account/SEO constraints an agent needs. The remaining detail about return payloads lives in the output schema, so nothing critical is missing, though the per-platform edge cases are left to the schema text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema coverage is 0%, but the description compensates with construction rules for the calls payload: full inline content rather than draftId, explicit dates with UTC offsets, time zones, explicit account identifiers rather than implicit multi-account defaults, subscriber-email/audience/SEO choices for articles, and clientRequestId on each note. It also explains where the voice object's value comes from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource: it shows the exact schedule_note and schedule_article calls for review, and immediately declares 'No scheduling occurs.' This cleanly separates it from the schedule_note/schedule_article siblings that actually execute.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says when to use it (before scheduling, for writer review), when to route elsewhere ('For unsupported advanced options, review in the conversation instead'), names the prerequisite tool for voice ('Voice selection comes from open_publishing_studio'), and states the sequencing rule: execute scheduling only after the panel returns approval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_publishing_studio_eventRecord publishing panel diagnosticsARead-onlyIdempotentInspect
Record a bounded, content-free client-reported panel event. Does not approve, schedule, or publish anything. Intended only for the app UI.
| Name | Required | Description | Default |
|---|---|---|---|
| event | Yes | ||
| studioOperationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| recorded | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds useful behavioral context beyond that: events are content-free/bounded and the call will not mutate publishing state. It does not describe where events go or how failures are surfaced, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no filler, with the core action front-loaded and the disambiguation and audience following. Every sentence adds distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, simple tool with an output schema present (so returns needn't be explained), the description covers purpose, non-mutation, and intended caller. The main remaining gap is that the parameters are undocumented in both schema and description, but the overall picture is sufficient to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning and it does not. It conveys only that payloads are 'content-free' but never explains the 'event' enum values or the meaning/format of 'studioOperationId'. The agent gets no help interpreting the two required fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Record ... panel event') and immediately bounds the scope ('bounded, content-free, client-reported'). It also disambiguates from the sibling scheduling/publishing tools by explicitly denying 'approve, schedule, or publish' behavior, so an agent can tell what this is without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context and exclusions: it is diagnostics recording, must not be used to approve/schedule/publish, and is 'Intended only for the app UI.' This tells the agent when it applies, but names no alternative tool and gives no explicit trigger conditions, so it stops short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_medium_statsRefresh Medium statsADestructiveInspect
Sync the writer's Medium stats from Medium and store them, then return them in the same shape as get_platform_analytics for MEDIUM. Use when get_platform_analytics reports no stored Medium stats, or the writer asks for fresh numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| recentLimit | No | How many recent posts to include. Default 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| handle | No | |
| reason | No | |
| source | No | |
| totals | No | |
| message | No | |
| profile | No | |
| summary | No | |
| platform | Yes | |
| username | No | |
| verified | No | |
| benchmark | No | |
| connected | Yes | |
| fetchedAt | No | |
| followers | No | |
| following | No | |
| readiness | No | |
| growthData | No | |
| tweetCount | No | |
| cachedStats | No | A JSON value stored by Narrareach. |
| displayName | No | |
| publication | No | |
| recentNotes | No | |
| recentPosts | No | |
| statsCachedAt | No | |
| engagementData | No | |
| profilePicture | No | |
| connectedAccount | No | |
| verifiedFollowers | No | |
| analyticsAvailable | No | |
| needsExtensionSync | No | |
| postAnalyticsAvailable | No | |
| profileAnalyticsAvailable | No | |
| officialAnalyticsAvailable | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a non-readOnly, destructive, openWorld operation. The description discloses that it syncs/stores data from an external system, which aligns with openWorldHint and the destructive/write nature. It doesn't detail the exact effects of storing (overwrite vs merge) beyond 'store them', so a small gap remains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the operation and immediately followed by the usage condition. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and a single well-described parameter, the description covers the essential 'what' and 'when'. However, it omits behavioral details like whether syncing overwrites existing stats or whether it may fail under certain conditions, which could matter for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is fully documented in the schema. The description adds no additional parameter semantics beyond what the schema provides, fitting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Sync the writer's Medium stats from Medium and store them, then return them.' It also distinguishes itself from the sibling get_platform_analytics by clarifying that it fetches fresh data rather than reading stored data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the condition for use: 'when get_platform_analytics reports no stored Medium stats, or the writer asks for fresh numbers.' This routes the agent correctly against the sibling read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_substack_benchmarkRefresh Substack notes benchmarkAInspect
Recompute the Substack Notes benchmark from the latest public notes and save it. Scores up to 10 recent notes against the content baseline. Defaults to the publication of the saved benchmark, then the default connected Substack publication. Personal account only. Limited to once every 6 hours; when limited, returns the saved benchmark unchanged with rateLimited true. Never publishes.
| Name | Required | Description | Default |
|---|---|---|---|
| publicationUrl | No | Optional Substack publication URL, custom domain, or @handle to benchmark instead of the default publication. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| handle | Yes | |
| message | Yes | |
| avgScore | Yes | |
| noteCount | Yes | |
| refreshed | Yes | True when a new benchmark was computed and saved. |
| analysedAt | Yes | |
| rateLimited | Yes | True when the 6-hour limit applied and the saved benchmark was returned unchanged. |
| baselineScore | Yes | |
| nextRefreshAt | Yes | |
| publicationUrl | Yes | |
| connectedAccount | No | |
| retryAfterSeconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-destructive write operation, and the description adds substantial context beyond that: it scores up to 10 recent notes, resolves the target publication in a specific default order, enforces a 6-hour rate limit, returns the saved benchmark unchanged with 'rateLimited: true' when throttled, and explicitly states 'Never publishes.' This goes well beyond the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six compact sentences, each delivering essential information: purpose, scoring scope, default resolution, account restriction, rate limit behavior, and safety guarantee. The purpose is front-loaded and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation. The description covers mutation behavior, rate limiting, default target resolution, account constraints, and explicit safety (never publishes), which is complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single parameter is already well defined. The description adds value by clarifying the default resolution order – 'the publication of the saved benchmark, then the default connected Substack publication' – which the schema only refers to vaguely as 'the default publication.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Recompute') and resource ('Substack Notes benchmark'), plus the save action and scoring scope. No sibling tool performs benchmarking, so it is clearly distinguished from the surrounding automation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear operating context: personal account only, limited to once every 6 hours, and the fallback when rate limited. However, it does not explicitly say when to use this tool versus alternatives, though no alternative benchmark tool exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_voice_materialRemove voice materialADestructiveIdempotentInspect
Remove one item from the writer's material bank, when the writer asks you to drop it. Use the material id from get_voice_profile (pass detail "full" to see every item). The writer can undo it.
| Name | Required | Description | Default |
|---|---|---|---|
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. | |
| materialId | Yes | The material id from get_voice_profile. |
Output Schema
| Name | Required | Description |
|---|---|---|
| undo | Yes | |
| changed | Yes | |
| materialCount | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so safety is covered; the description adds the genuinely new behavioral fact that the removal is reversible ("The writer can undo it"), which no annotation conveys. Permissions/scope behavior is still left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, action and scope front-loaded, with the undo note as a useful trailer; no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need not be described, all three params are schema-documented, and the description covers purpose, trigger, id source, and reversibility. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds an actionable tip beyond the schema by telling the agent to pass detail "full" to get_voice_profile in order to see every item's id. writer and workspace 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Remove) and resource (one item from the writer's material bank), and the singular scope distinguishes it from add_voice_material and remove_voice_rule 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition ("when the writer asks you to drop it") and routes the agent to get_voice_profile for the id, but does not explicitly contrast this with the nearest alternatives such as remove_voice_rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_voice_ruleRemove voice ruleADestructiveIdempotentInspect
Remove one rule from the writer's voice profile, when the writer asks you to drop it. Use the rule id from get_voice_profile. The writer can undo it.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleId | Yes | The rule id from get_voice_profile. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| undo | Yes | |
| changed | Yes | |
| ruleCount | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine value beyond them by disclosing reversibility ('The writer can undo it') and reinforcing that only a single rule is affected, which is not stated in the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and trigger, followed by the id source and the reversibility note. Every sentence adds information and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations carry the safety profile; the description supplies trigger, id provenance and reversibility. Minor gap: it says nothing about what the writer sees if the ruleId is unknown or already removed, though the idempotent annotation partly covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, and the description only echoes the sourcing of ruleId ('from get_voice_profile'). That is mild reinforcement rather than new meaning, so the baseline 3 for high-coverage schemas applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('remove') and resource ('one rule from the writer's voice profile') with an explicit scope of a single rule, which cleanly separates it from update_voice_rule (editing), add_voice_material (adding) and undo_voice_change (reverting). An agent can pick it out of the dense sibling list without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition ('when the writer asks you to drop it') and names the prerequisite tool that supplies the id ('Use the rule id from get_voice_profile'). It does not spell out when to prefer update_voice_rule (edit instead of delete) or undo_voice_change (revert instead of remove), so the exclusion side is inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_reader_activityReply to reader activityCDestructiveInspect
Publish a reply to an owned Substack comment activity. A successful reply moves the activity to History.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| activityId | Yes | ||
| idempotencyKey | No | ||
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| replyId | Yes | |
| success | Yes | |
| requestId | Yes | |
| deduplicated | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds a genuine behavioral fact beyond that: a successful reply moves the activity to History, which tells the agent the operation mutates activity state. It stops short of describing failure modes or permission requirements, so it is good but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the state consequence; no filler. It errs on the side of under-specification rather than bloat, but nothing written is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent, destructive publish operation with four undocumented parameters, the description is too thin. An output schema exists, so return values need not be explained, but ownership/connection selection and idempotency behavior are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters (activityId, text, idempotencyKey, substackConnectionId), and the description explains none of them. It never says which connection is used, what the idempotency key does, or the 5000-character limit. With zero schema coverage, the description had the full burden and did not carry it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Publish a reply to an owned Substack comment activity'), which is clear and specific. However, it does not distinguish itself from its closest siblings such as send_reader_reply_draft or create_reader_reply_draft, leaving the agent to infer the difference between replying directly versus drafting then sending.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'owned' hints at a precondition, but there is no explicit when-to-use guidance, no mention of prerequisites, and no routing to alternatives like send_reader_reply_draft or create_reader_reply_draft. The agent must infer the entire selection logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_scheduled_itemReschedule scheduled itemADestructiveInspect
Reschedule a scheduled note or article, with optional kind or automatic detection by id. Pending LinkedIn session sync leaves the existing schedule unchanged. Returns the outcome and informational advisories.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| kind | No | ||
| timezone | No | Optional updated IANA timezone the scheduledFor time above is expressed in. Defaults to the item's existing timezone. | |
| scheduledFor | Yes | New future local wall-clock date/time interpreted in timezone, including DST; defaults to the existing item timezone. A Z or explicit UTC offset represents an absolute instant. LinkedIn articles require at least 20 minutes of lead time. |
Output Schema
| Name | Required | Description |
|---|---|---|
| item | Yes | |
| kind | Yes | |
| warnings | No | |
| advisories | No | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructiveHint=true, idempotentHint=false, openWorldHint=true), so the bar is lower, yet the description still adds real behavior: a pending LinkedIn session sync leaves the existing schedule unchanged, and the response carries outcome plus advisories. It does not explain why the call is destructive (what prior schedule is overwritten) or the failure/partial-success semantics beyond the LinkedIn note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core action front-loaded and no filler. 'Informational advisories' is slightly vague, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so explaining return values is unnecessary and the description's brief mention suffices. The LinkedIn 20-minute lead time and timezone defaults are in the schema. Remaining gap is the unexplained id parameter and no statement of what the existing schedule is replaced with.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Half the parameters are undocumented in the schema; the description compensates only for kind, clarifying that omitting it triggers automatic detection by id. The required id parameter has no explanation anywhere (entity type, format, where to obtain it), and timezone/scheduledFor semantics live in the schema rather than the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Reschedule a scheduled note or article') and names the relevant sub-resources. The verb alone separates it from the amend_* and cancel_* siblings, but no sibling is named explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Optional kind or automatic detection by id' implies when to supply kind versus letting it infer. However, there is no guidance on when to reschedule versus amend_scheduled_item or cancel_scheduled_item + re-schedule, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_hashtag_setsSave hashtag setsBIdempotentInspect
Personal saved hashtag sets. Saving sets never inserts hashtags into content or publishes anything. Up to 20 sets, 30 hashtags per set.
| Name | Required | Description | Default |
|---|---|---|---|
| sets | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| sets | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=true; the description usefully adds that saving never inserts hashtags into content or publishes anything, directly addressing the main side-effect fear for a write tool. It does not, however, explain whether existing sets are replaced or appended to, which matters given 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and the most important behavioral guarantee, with no filler. Slightly terse at the cost of completeness, but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the limits plus no-publish guarantee cover the essentials for a single-parameter write. The definition still leaves overwrite/append semantics and hashtag formatting unstated, which an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does surface the key caps ('Up to 20 sets, 30 hashtags per set') that match the schema's maxItems limits, but it says nothing about the name field, hashtag format (with or without '#'), or whether the payload replaces existing saved sets.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource precisely ('Personal saved hashtag sets') and implies the save/store action, which is enough to distinguish it from the read-only sibling list_hashtag_sets. It does not explicitly name that sibling, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisite or permission notes, and no reference to the alternative list_hashtag_sets for reading sets back. The only usage-adjacent signal is the reassurance about side effects, which is behavioral rather than situational.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_voice_preferenceSave voice preferenceAIdempotentInspect
Save one writing preference the writer has just stated in their own words in this conversation, such as "stop ending with a moral" or "I write in short paragraphs". It becomes a rule in their voice profile and applies to future drafts. Do not infer a preference from a single edit, and do not save anything the writer did not say. Style only: it cannot allow invented facts, stories, quotes, or numbers. The writer can undo it on the Voice page in Narrareach.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Whether the writer wants this done or avoided. | |
| text | Yes | The preference as one short, standalone rule, in the writer's words where possible. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rule | Yes | |
| undo | Yes | |
| saved | Yes | |
| ruleCount | Yes | |
| alreadySaved | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/idempotent/non-destructive behavior, but the description adds real context beyond them: the preference becomes a rule in the voice profile and applies to future drafts, it is style-only and cannot introduce invented facts/quotes/numbers, and it is reversible via the Voice page. That downstream effect and reversibility are not derivable from the annotations, though the text never states auth/workspace prerequisites that the schema hints at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and each following sentence carries a distinct constraint (effect, exclusions, style-only boundary, undo path). It runs slightly long for a four-parameter tool, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema already describing returns, the description covers what an agent needs: what qualifies, what is forbidden, what the saved rule affects, and that it can be undone. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description slightly exceeds it by clarifying the semantics of 'text' (the writer's own words, a single standalone rule) and illustrating the do/dont distinction that the 'kind' enum encodes. It adds examples and constraints rather than merely restating the schema, but does not fully explain the writer/workspace selectors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (save one writing preference stated by the writer) plus concrete examples ('stop ending with a moral', 'I write in short paragraphs'), so an agent immediately knows this captures a single conversational preference rather than a sample or an inferred edit. The scope word 'one' and 'just stated... in this conversation' distinguishes it from add_voice_material and update_voice_rule without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('just stated in their own words in this conversation') and clear when-not conditions ('Do not infer a preference from a single edit', 'do not save anything the writer did not say'). It does not name the sibling alternatives (update_voice_rule, decide_voice_suggestion) an agent might otherwise pick, so routing is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_articleSchedule articleAInspect
Schedule an article to Substack, Medium, LinkedIn Articles, X, WordPress, or Ghost. WordPress and Ghost support publishMode draft, which saves a remote draft without publishing or emailing. Creates an article draft when draftId is absent. Supports cover and inline images, Substack-only inline video, and destination-specific SEO metadata. Substack supports native paywall and subscribe controls at explicit positions in contentHtml; ordinary links remain links. Audience and email delivery are controlled by the supplied fields. LinkedIn Articles requires a separate browser-session connection from regular posts; pending session sync saves new input as a draft without scheduling. Returns scheduling outcomes and advisories.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tag list for newly created drafts. Substack receives all supplied tags. Medium receives its supported first 5 topics and returns a warning when extras are omitted. The saved draft remains unchanged. | |
| media | No | Optional inline images or Substack article videos for a newly created draft. Replaces {{media:N}} placeholders in array order; leftovers are appended. kind defaults to image; video requires Substack as the sole platform. Supports public URLs, data URIs, and base64 bytes. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url. | |
| title | No | Required when creating a new draft. | |
| draftId | No | Optional existing article draft id to schedule as-is. | |
| subtitle | No | Optional article subtitle for newly created drafts. Substack omits subtitles over 250 characters and returns a warning without changing the saved draft. | |
| timezone | No | IANA timezone the scheduledFor time(s) above are expressed in (e.g. "Europe/London"). Default UTC. | |
| platforms | Yes | ||
| coverImage | No | Optional cover image for a newly created draft, placed at the top of the published body. Supports public HTTPS URLs, data URIs, or base64 image bytes. URL ingestion depends on source-host access. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url. | |
| contentHtml | No | Required when creating a new draft. Supports public <img> or <video> elements and {{media:N}} placeholders resolved from media entries. Video articles require Substack as the sole platform. Native Substack paywall markup is <hr data-type="paywall"> at the selected paragraph boundary, or a single {{NARRAREACH_PAYWALL}} token; paywallMarker supports custom tokens. Native subscribe block markup is <div data-type="button" data-kind="subscribeCaption" data-text="Subscribe" data-caption="Your caption"></div> with HTML-escaped attribute values. data-kind="subscribe" represents a button without caption. Ordinary links remain links. | |
| publication | No | Substack destination as a publication name, handle, or URL, for example "AI Newsroom", "@theainewsroom", or "https://theainewsroom.substack.com". Optional when exactly one active Substack publication is connected; Narrareach selects it automatically. Required when more than one active Substack publication is connected, except that when it is missing Narrareach uses the publication the writer scheduled or published to most recently and says so in substackPublicationSelection.message, with publicationChoices listing the others; tell the writer which one was used. If there is no previous choice, the value is ambiguous, or Narrareach cannot confirm the session publishes there, nothing is scheduled and the result has requiresPublicationChoice: true with publicationChoices (name, handle, url, substackConnectionId). Ask which one they want, then call again with publication set to the chosen handle (and draftId when a draft was already saved). | |
| publishMode | No | Only valid when all selected destinations are WordPress or Ghost. Defaults to publish; draft saves a remote draft at the scheduled time without publication. | |
| scheduledFor | No | Shared local wall-clock publishing date/time interpreted in timezone, including DST. A Z or explicit UTC offset represents an absolute instant. LinkedIn articles require at least 20 minutes of lead time. | |
| isPaidContent | No | Whether the Substack article is paid-only. Default false. | |
| paywallMarker | No | Optional custom marker in contentHtml where the selected free preview ends; must appear exactly once. The standard {{NARRAREACH_PAYWALL}} marker is recognized without this field. Creates a native paywall and enables paid access without changing sendToNewsletter. | |
| sendToNewsletter | No | Substack email delivery setting. Default true. | |
| addSearchMetadata | No | Generate SEO titles, descriptions, and a Substack slug for supported article destinations. SEO metadata is generated automatically on Revenue Writer, Full Agentic Mode, and Teams & Agencies, and for trials or other accounts with article SEO access. Set this option to false to turn it off. X does not support separate article SEO settings. | |
| linkedinAuthorUrn | No | LinkedIn personal profile or Company Page author URN belonging to the connected LinkedIn Articles account. | |
| platformSchedules | No | Optional per-platform overrides taking precedence over scheduledFor. Same wall-clock + timezone rule applies to each scheduledFor here; LinkedIn entries require at least 20 minutes of lead time. | |
| mediumPublicationId | No | Optional authorized Medium publication id when platforms includes MEDIUM. Absent means the personal profile. Writer-only access submits for editorial review and leaves the story unscheduled until acceptance. Explicit publication rejection allows personal-profile delivery with a warning; ambiguous submissions remain unpublished for review. Draft-only delivery does not submit to a publication. | |
| substackConnectionId | No | Exact Substack connection identifier, retained for backward compatibility, for example publicationChoices[].substackConnectionId from a requiresPublicationChoice result. publication is the preferred public destination selector; when both are given they must name the same publication. | |
| linkedinNewsletterUrn | No | LinkedIn newsletter URN belonging to the connected LinkedIn Articles account. Required when linkedinPublicationType is newsletter. | |
| mediumNotifyFollowers | No | Whether to email Medium subscribers about this story. Only valid when platforms includes MEDIUM. Defaults to false (no email). Best-effort: a failure to apply this setting never blocks the publish/schedule and is reported as a warning. | |
| linkedinPublicationType | No | LinkedIn destination type. Defaults to an individual article; newsletter represents a user-selected newsletter destination. | |
| linkedinShareCommentary | No | Optional LinkedIn share text used when publishing a LinkedIn article. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| count | Yes | |
| posts | Yes | |
| message | No | |
| nextStep | No | |
| warnings | Yes | |
| advisories | No | |
| choiceScope | No | |
| aiVisibility | No | |
| createdDraft | Yes | |
| connectedAccount | No | |
| publicationChoices | No | |
| substackPublication | Yes | |
| publicationChoiceReason | No | |
| requiresPublicationChoice | No | |
| substackPublicationSelection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-idempotent, non-destructive write, and the description adds meaningful behavior: pending session sync saves input as a draft without scheduling, warnings don't alter saved drafts, and it returns scheduling outcomes and advisories. It could say more about failure/permission behavior, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and each subsequent sentence carries distinct information (draft creation, images/video, paywall, session sync, returns). It is dense and long, but given 24 parameters the length is largely justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still covers the key edge cases (draft vs publish, video restrictions, Substack paywall, publication selection). Complete enough for correct invocation, with only minor gaps around permission/auth requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 96%, so the schema already documents nearly every parameter thoroughly. The description adds only light cross-cutting context (audience/email controlled by supplied fields) rather than new per-parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Schedule) plus resource (an article) and enumerates the exact destinations (Substack, Medium, LinkedIn Articles, X, WordPress, Ghost). This cleanly distinguishes it from siblings like schedule_note/schedule_notes and create_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides rich contextual guidance: when draftId is absent it creates a draft, publishMode draft applies only to WordPress/Ghost, LinkedIn Articles needs a separate browser session, and Substack multi-publication ambiguity is handled. It stops short of explicit when-to-use-vs-alternative routing against sibling tools, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_noteSchedule noteAInspect
Schedule a note to any combination of Substack, LinkedIn, X, Bluesky, Threads, Instagram, Facebook, TikTok, and Pinterest; Instagram, TikTok, and Pinterest require an image or video. Creates a note draft when draftId is absent. Character limits: Bluesky 300, Threads 500, LinkedIn 3000, X 25000 (posted as a thread). Explicit platformVersions must fit their limits; otherwise overlong platform text is shortened at a sentence boundary, with adjustedPlatforms and warnings returned. When a writer has several connected accounts on Threads, Facebook, TikTok, Pinterest or X, the Note goes to the default account unless socialAccountIds names one from list_social_accounts; with several and no default the request is refused until one is named. Authorized team routing uses workspace and writer. Substack Notes publish from the verified connected profile, not a publication page. Safe to retry: pass a new clientRequestId for each note and reuse it when retrying that note, and a repeat returns the original result instead of scheduling again. Even without one, a note with the same text, platform and time as one scheduled in the last 24 hours is not copied: the result has duplicate: true and the existing schedule ids. To quote a Substack Note or post (like "Restack with a note"), pass its link as quoteUrl rather than in content. To schedule several notes, prefer schedule_notes. To send a Note that is already scheduled to another platform or account, use add_platform_to_scheduled_note instead: scheduling it again creates a separate Note.
| Name | Required | Description | Default |
|---|---|---|---|
| media | No | Optional media objects supporting image or video bytes as data URIs or base64, or public HTTPS URLs. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url. | |
| title | No | Used only when creating a new note draft. | |
| writer | No | Authorized team writer name, handle, or id. "me" selects the linked team voice. Required when a team workspace has multiple writers. | |
| content | No | Used only when creating a new note draft. | |
| draftId | No | Optional existing note draft id to schedule as-is. | |
| quoteUrl | No | Optional public Substack Note link (https://substack.com/@writer/note/c-123) or Substack post/article link (https://publication.substack.com/p/slug, or the publication's custom domain) to quote. Substack shows it as a quoted card under the note, like "Restack with a note". Do not also put the link in content; if it is there it is taken out. Requires SUBSTACK in platforms; every other platform gets the link at the end of its text instead. Cannot be combined with draftId. Nothing is scheduled when the Note or post cannot be found or is not public. Use preview_note_quote to check a link first. | |
| timezone | No | IANA timezone the scheduledFor time above is expressed in (e.g. "Europe/London"). Default UTC. | |
| imageUrls | No | Optional image URLs or image data URIs to attach to the scheduled note. | |
| platforms | Yes | ||
| videoUrls | No | Optional video URLs or video data URIs to attach to the scheduled note. | |
| workspace | No | Authorized team workspace name or id for team scheduling. Absence selects the authenticated user’s personal account. | |
| firstReply | No | Optional first reply for supported destinations. An invalid reply is omitted per platform without cancelling the root post. | |
| publication | No | Substack publication name, handle, or URL selected by the user. Optional when exactly one active Substack publication is connected: Narrareach uses it when its session is ready and says which one was used in substackPublicationSelection.message (source "sole_connection"); if the session needs a sync or the profile cannot be verified, nothing is scheduled and the result says what to fix. In a team workspace with one publication, or when a writer who is also a team member omits workspace, nothing is scheduled until the writer confirms it (requiresPublicationChoice: true, publicationChoiceReason: "confirmation_required"). Notes publish from the profile signed in to that connection, including publications sharing one login. Unverified or mismatched profile identity returns action_required without publishing. Notes are profile-level: when it is missing and all of the writer’s publications are signed in to one Substack profile, no choice is needed and the note posts from that profile. Only when the publications span two or more Substack profiles does the writer choose a profile: Narrareach uses the one they chose most recently (and says so in substackPublicationSelection.message), or, with no previous choice, nothing is scheduled and the result has requiresPublicationChoice: true, choiceScope: "profile" and publicationChoices (one per profile); ask the user, then call again with substackConnectionId set to the chosen publicationChoices[].substackConnectionId. An ambiguous publication value also returns publicationChoices. | |
| generationId | No | Optional. Pass the generationId from create_generated_notes when scheduling a generated note: the requestId that create_generated_notes returned. Used only to measure how generated notes are used; it does not change what is scheduled. | |
| scheduledFor | Yes | Local wall-clock publishing date/time interpreted in timezone, including DST (e.g. "2026-07-01T14:30:00" means 2:30 PM). A Z or explicit UTC offset represents an absolute instant instead. | |
| shortVersion | No | One short text for several platforms, e.g. { "text": "...", "platforms": ["X", "BLUESKY", "THREADS"] }, while the other platforms post content as written. Saved as one shared short version the writer edits once in the app. It must fit the tightest platform it goes to (X 280 as one post, Bluesky 300, Threads 500, LinkedIn 3000) or nothing is scheduled. A platform in it cannot also be in platformVersions. | |
| clientRequestId | No | Optional but recommended: your own id for this note, 8 to 80 letters, numbers, hyphens or underscores. Use a new one for each note and the same one when retrying it (for example after a timeout or a rate-limit pause): the retry returns the original result and schedules nothing again. Reusing it with different text, platforms or time is refused. | |
| threadsTopicTag | No | Optional Threads topic tag. Threads must be selected; maximum 50 characters. | |
| platformVersions | No | Optional platform-specific text keyed by platform, e.g. { "BLUESKY": "..." }. Each supplied version must fit its limit (Bluesky 300, Threads 500, LinkedIn 3000, X 25000) or nothing is scheduled. Saved as the draft’s platform-specific version. | |
| socialAccountIds | No | Optional account to post to on Threads, Facebook, TikTok, Pinterest or X, keyed by platform, e.g. { "THREADS": "<accountId>" }, with accountId values from list_social_accounts. Omit a platform to use its only account or its default. Required for a platform where list_social_accounts reports accountChoiceRequired; ask the writer which account rather than picking one. | |
| linkedInAccountId | No | Optional LinkedIn account id for a connected LinkedIn destination. Absence of both this field and linkedInOrganizationUrn selects the configured default. | |
| substackConnectionId | No | Exact Substack connection identifier, retained for backward compatibility, for example publicationChoices[].substackConnectionId from a requiresPublicationChoice result. publication is the preferred public destination selector; when both are given they must name the same publication. | |
| instagramDestinations | No | Instagram destinations with accountId returned by list_instagram_destinations and optional independent caption. Each account receives its own delivery receipt. | |
| linkedInOrganizationUrn | No | Optional LinkedIn Company Page URN for a connected LinkedIn destination. Requires linkedInAccountId. | |
| confirmProfileDestination | No | Deprecated compatibility field. It is ignored and does not override Substack profile routing safety. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| count | No | |
| notes | No | |
| quote | No | |
| status | No | |
| context | No | |
| message | No | |
| nextStep | No | |
| replayed | No | |
| warnings | No | |
| duplicate | No | |
| firstReply | No | |
| choiceScope | No | |
| sideEffects | No | |
| createdDraft | No | |
| actionMessage | No | |
| supersededIds | No | |
| preservedDraft | No | |
| clientRequestId | No | |
| threadsTopicTag | No | |
| connectedAccount | No | |
| adjustedPlatforms | No | |
| preservedSchedule | No | |
| confirmationPrompt | No | |
| connectionWarnings | No | |
| duplicatePlatforms | No | |
| publicationChoices | No | |
| existingScheduleIds | No | |
| linkedinDestination | No | |
| proposedDestination | No | |
| substackPublication | No | |
| requestedPublication | No | |
| requiresConfirmation | No | |
| publicationChoiceReason | No | |
| substackNoteDestination | No | |
| requiresPublicationChoice | No | |
| substackPublicationSelection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only flag read-only=false, idempotent=false, openWorld=true). It discloses per-platform character limits with shortening-at-sentence-boundary behavior (adjustedPlatforms, warnings), the account-default/refusal rule when multiple connected accounts exist, retry semantics via clientRequestId, 24-hour duplicate detection returning duplicate:true, quote-link handling, and Substack profile/team routing. No contradiction with idempotentHint=false since it stresses each new note needs a fresh clientRequestId.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and platform list, then edge cases. Dense but justified for a 25-parameter tool; a few details (e.g. per-platform character limits) repeat what platformVersions already documents in the schema, which is the only mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description still surfaces the key result signals (adjustedPlatforms, warnings, duplicate, requiresPublicationChoice, publicationChoices). Combined with the schema's 96% coverage, an agent has everything needed to schedule correctly, including retry, dedup, and account-routing safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 96%, so the schema carries the per-parameter burden; the description still adds cross-parameter meaning such as required media for Instagram/TikTok/Pinterest, the draftId-vs-content creation split, the shared short-version constraint, and clientRequestId retry reuse. It adds value beyond the schema but largely restates per-field rules that the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Schedule a note") and enumerates the destinations, immediately distinguishing the tool. It also names the sibling alternatives (schedule_notes for bulk, add_platform_to_scheduled_note for cross-platform re-sends), so an agent can tell it apart from related tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use-next guidance: "To schedule several notes, prefer schedule_notes" and "To send a Note that is already scheduled... use add_platform_to_scheduled_note instead," plus the routing condition for socialAccountIds (name one from list_social_accounts when several exist and no default). Alternatives and exclusions are spelled out, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_notesSchedule notesAInspect
Schedule up to 50 notes in one call, each exactly as schedule_note would (same platforms, limits, account defaults and Substack profile rules). Every note is checked first, and each gets its own result: scheduled (scheduleIds), duplicate (already scheduled with the same text, platform and time, so existingScheduleIds are returned and nothing is copied), or failed (reason says what to fix). One bad note does not stop the others. A note can quote a Substack Note or post with quoteUrl, as in schedule_note. Give every note its own clientRequestId and reuse the same ids when retrying the batch, so notes that already went through are returned rather than scheduled again. workspace, writer and publication apply to every note. For media, platformVersions, first replies or account choices, use schedule_note for that note.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | Yes | ||
| writer | No | Authorized team writer name, handle, or id for every note. Required when a team workspace has multiple writers. | |
| workspace | No | Authorized team workspace name or id for every note. Absence selects the authenticated user’s personal account. | |
| publication | No | Substack publication name, handle, or URL for every note that includes SUBSTACK. Optional when schedule_note would not ask for one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| summary | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, idempotent=false, destructive=false, openWorld=true. The description adds substantial behavior beyond that: per-note outcomes (scheduled/duplicate/failed), partial-failure semantics ("one bad note does not stop the others"), duplicate detection keyed on text+platform+time, and the clientRequestId idempotency mechanism. This is rich disclosure, not a restatement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the sibling alternative are front-loaded, and nearly every clause carries information. It is dense, single-paragraph prose with no visual structure, which slightly hurts scanability for a tool this complex.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, yet the description still summarizes the result shape (scheduleIds, existingScheduleIds, reason). Combined with the alternatives and retry guidance, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% (baseline 3), but the description adds real meaning: it explains that workspace, writer and publication apply to every note, that quoteUrl behaves as in schedule_note, and how clientRequestId drives safe retries. These clarify batch-level scoping the schema doesn't fully spell out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with explicit scope ("Schedule up to 50 notes in one call") and frames itself as the batch counterpart to schedule_note. An agent can distinguish it from the single-note sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: "For media, platformVersions, first replies or account choices, use schedule_note for that note." It also gives the retry protocol (reuse the same clientRequestIds) and the duplicate-handling condition, 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.
send_reader_reply_draftSend reader reply draftADestructiveIdempotentInspect
Publish one saved reply only after the user has reviewed and approved its full text and target comment. Supply updatedAt as expectedUpdatedAt. SENDING is unconfirmed: inspect the thread, never create a replacement to retry. Recovery is available only in the Narrareach app: open Activity, check reply status, then confirm the reply did not post.
| Name | Required | Description | Default |
|---|---|---|---|
| draftId | Yes | ||
| expectedUpdatedAt | Yes | ||
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| draft | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations, which only declare the write/destructive/open-world/idempotent profile. The description discloses the unconfirmed-send failure mode, warns against creating a replacement to retry, explains the expectedUpdatedAt concurrency guard, and gives an app-only recovery path (Activity > check status > confirm no post) — exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tight, front-loaded prose where each clause carries operational meaning (precondition, concurrency, retry warning, recovery). The final recovery sentence is dense but earns its place; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers precondition, concurrency, retry, and recovery. The only real gap is the unexplained substackConnectionId parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the parameter burden. It explains expectedUpdatedAt well ('supply updatedAt as expectedUpdatedAt'), but leaves draftId and substackConnectionId undefined, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Publish one saved reply', which clearly distinguishes this terminal publish action from create_reader_reply_draft, update_reader_reply_draft, and list_reader_reply_drafts. It does not explicitly name those siblings, so an agent must infer the boundary, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition: use only after the user has reviewed and approved the full text and target comment. This is strong context but stops short of naming the alternative action (e.g., update the draft first) that an agent should take when approval is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_substack_verificationRequest a Substack codeAInspect
Request verification for the selected Substack connection after its owner asks to continue. Returns an email or authenticator code prompt, or verified: true when Substack confirms without a code. Confirmation can resume previously approved articles waiting on this connection. Does not create a new schedule. Check existing article status before retrying. When a code is needed, ask in a normal chat message, end your turn, and wait for the user’s reply. If a code prompt closes without an answer, keep waiting in the conversation; do not request another code or retry publishing.
| Name | Required | Description | Default |
|---|---|---|---|
| connectionId | Yes | The exact Substack connection from the publishing response or get_user_profile. | |
| scheduledPostId | No | The exact saved article job from the publishing response. Pass it to resume that same job after verification. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| method | No | |
| message | Yes | |
| required | No | |
| verified | No | |
| cancelled | No | |
| challenge | No | |
| expiresAt | No | |
| connection | No | |
| nextAction | No | |
| instruction | No | |
| publication | Yes | |
| connectionId | Yes | |
| articleRecovery | No | |
| resumedArticles | No | |
| scheduledPostId | No | |
| connectedAccount | No | |
| deliveryConfirmed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (non-read-only, non-idempotent, open-world, non-destructive), and the description adds substantial context on top: the two possible outcomes (code prompt vs. verified: true), the side effect of resuming previously approved articles, the explicit absence of schedule creation, and the retry/idempotency hazard around re-requesting codes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences, all load-bearing, with the return-shape and scope statements front-loaded ahead of the workflow instructions. The final sentence about code prompts closing without an answer is slightly long but covers a real failure mode an agent would otherwise get wrong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the brief mention of return values is bonus rather than a gap. Combined with the 100%-covered schema and the annotations, the description covers trigger, outcome, side effects, and retry hazards — nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both connectionId and scheduledPostId are already fully documented in the schema itself, including where to obtain them. The description only restates the resume semantics of scheduledPostId that the schema already spells out, adding no syntax or format detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Request verification for the selected Substack connection') and scopes it to the point after its owner asks to continue. It implicitly separates itself from publishing actions ('Does not create a new schedule'), but never names the adjacent siblings it must be distinguished from, such as get_substack_verification_status or complete_substack_verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger ('after its owner asks to continue'), explicit pre-check ('Check existing article status before retrying') and explicit prohibitions ('do not request another code or retry publishing'). The turn-taking instruction — ask in a normal chat message, end your turn, wait — is unambiguous operational guidance an agent could not infer otherwise.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_voice_changeUndo voice changeADestructiveInspect
Undo the most recent change to the writer's voice profile, when the writer asks you to. It undoes one change, whoever made it, and can itself be undone. Only the most recent change can be undone, so nothing saved after it is lost. Pass changeId from list_voice_changes to undo that change only if it is still the most recent.
| Name | Required | Description | Default |
|---|---|---|---|
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| changeId | No | Optional change id from list_voice_changes. The undo is refused if another change has been made since. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| change | Yes | |
| undone | Yes | |
| ruleCount | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=false, which alone would make an agent cautious. The description adds genuinely new behavioral context: the undo covers one change regardless of who made it, the undo is itself reversible, and the safety property that nothing saved after the undone change is lost. That reframes a 'destructive' call as a safe, recoverable one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action and the trigger. The third sentence ('Only the most recent change can be undone, so nothing saved after it is lost') partially restates the scope already given in sentence one, a small redundancy, but every sentence otherwise earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description only needs to supply intent, trigger, constraints and reversibility — all present. An agent can call this correctly and set expectations about failure modes without further information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so writer, changeId and workspace are already documented with their fallback semantics ('me', personal account, refusal if stale). The description mostly restates the changeId staleness rule rather than adding syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (undo) and resource (the most recent change to the writer's voice profile) with precise scope. It is clearly distinguishable from siblings like update_voice_profile, list_voice_changes and save_voice_preference 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the writer asks you to'), an explicit constraint ('Only the most recent change can be undone'), and routes to the alternative tool list_voice_changes for obtaining a changeId. The refusal condition ('only if it is still the most recent') tells the agent when this call will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draftUpdate draftADestructiveInspect
Update an unscheduled draft. Only the provided fields are changed. Cannot edit drafts owned by other users. An active scheduled Article must be cancelled or amended through a provider-safe schedule workflow; changing its local draft would not reliably update the provider copy.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Draft id. | |
| title | No | New title. | |
| coverImage | No | Attach or replace an article cover using a public URL, data URI, or base64 image bytes. Protected source hosts may reject URL ingestion. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url. | |
| contentHtml | No | New HTML body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| updatedAt | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds non-obvious context: only provided fields change (partial update), ownership restriction across users, and the provider-copy caveat. It does not, however, disclose whether the operation is reversible or what auth/scope is required beyond ownership.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the primary action and scope; the provider-safe caveat is appropriately placed last. No filler, though the final sentence is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description covers the critical caveats an agent needs: partial-update semantics, ownership restrictions, and the scheduled-Article provider-sync hazard. Given a mutation tool with rich annotations, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each field ('Draft id.', 'New title.', 'New HTML body.', coverImage semantics) is documented in-schema, including the upload_media workflow hint. The description adds the general rule 'Only the provided fields are changed', which aligns with but does not extend the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update an unscheduled draft') and constrains the scope to unscheduled drafts, distinguishing it from get_draft, list_drafts, and the schedule_* siblings. The redirect note about active scheduled Articles further separates it from amend_scheduled_item.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when NOT to use it ('An active scheduled Article must be cancelled or amended through a provider-safe schedule workflow'), routing to amend/cancel siblings. However, it does not name the specific alternative tool (e.g. amend_scheduled_item) by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_posting_scheduleUpdate posting scheduleAIdempotentInspect
Save the writer's Note posting cadence for future notes: preferred times, posts per day, days of the week, weekend skipping, schedule mode and timezone. Fields left out keep their saved values. Notes already scheduled are not moved. Only the account owner can change it (the personal account, or the owner of a team workspace). Returns the saved schedule and the next open slot.
| Name | Required | Description | Default |
|---|---|---|---|
| timezone | No | IANA timezone for the times, for example America/Toronto. | |
| timeSlots | No | Preferred posting times in the schedule timezone, for example [{ "hour": 9, "minute": 0 }, { "hour": 17, "minute": 30 }]. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user’s personal account. | |
| daysOfWeek | No | Days to post, 0 (Sunday) to 6 (Saturday). null posts every day. | |
| postsPerDay | No | Notes per day. Uses the earliest times first and cannot exceed the number of timeSlots. | |
| scheduleMode | No | optimized for suggested times, custom for times the writer chose. | |
| skipWeekends | No | Skip Saturday and Sunday. |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | |
| message | Yes | |
| timezone | Yes | |
| effective | Yes | |
| notesMoved | Yes | |
| nextOpenSlot | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: partial-update behavior ("Fields left out keep their saved values"), that existing scheduled notes are unaffected, an authorization requirement (owner-only, personal or team workspace owner), and the return payload. These are exactly the traits an agent needs before invoking a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with what gets saved, then partial-update semantics, immutability, permissions, and return value. No filler; every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage, an output schema, and annotations covering the safety profile, the description fills the remaining gaps (partial update, permission model, side-effect scope). Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already fully documented (including examples, bounds, and the enum meaning). The description lists the same fields but adds no syntax or format meaning beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Save the writer's Note posting cadence for future notes") and enumerates the settings it governs (times, posts per day, days, weekend skipping, mode, timezone). The write semantics clearly distinguish it from the read counterpart get_posting_schedule without needing to name it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear scope ("for future notes") and an explicit boundary ("Notes already scheduled are not moved"), which tells the agent when this tool does NOT apply. It stops short of naming the alternative tools (get_posting_schedule, reschedule_scheduled_item) for adjacent tasks, so routing isn't fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_reader_activityUpdate reader activityCDestructiveIdempotentInspect
Move an owned reader activity item to Inbox or History.
| Name | Required | Description | Default |
|---|---|---|---|
| activityId | Yes | ||
| triageState | Yes | ||
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| triageState | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description only adds the 'owned' ownership qualifier and the destination names; it does not explain the consequence of a destructive 'move to History' or whether the change is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is efficient, though it leans toward under-specification rather than economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with an output schema available, the description should at least clarify the effect of the state change and the third parameter. With 0% schema coverage and no usage guidance, an agent lacks enough to call this confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load and does not. It implies the activityId (owned reader activity item) and the triageState destinations (Inbox/History), but gives no format for activityId and never mentions substackConnectionId at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (move), a specific resource (owned reader activity item), and the destination states (Inbox or History). It is clear enough to distinguish from list_reader_activities and reply_to_reader_activity, though it never names or explicitly contrasts those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as list_reader_activities or reply_to_reader_activity. The agent must infer the use case entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_reader_reply_draftUpdate reader reply draftBInspect
Edit an unsent reply draft and record the revision. Supply its current updatedAt as expectedUpdatedAt. Does not publish.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| draftId | Yes | ||
| expectedUpdatedAt | Yes | ||
| substackConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| draft | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false. The description adds that it records the revision and does not publish – useful context beyond annotations. However, it doesn't mention permission requirements, rate limits, or what happens on a missing/expired expectedUpdatedAt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no waste. The purpose comes first, then the concurrency-token instruction, then a scope boundary. Well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values don't need explanation. But for a 4-parameter mutation tool with 0% schema coverage, the description omits critical parameter semantics (what 'text' represents, whether substackConnectionId is required). It covers the concurrency token but leaves gaps for an agent to fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only explains expectedUpdatedAt (its purpose as a concurrency token). The other three parameters – text, draftId, substackConnectionId – have no semantic guidance in the description. With zero schema coverage, the description should do more to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: 'Edit an unsent reply draft and record the revision.' It distinguishes itself from send_reader_reply_draft by noting 'Does not publish.' It could be clearer about how it differs from update_draft or create_reader_reply_draft, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Edit an unsent reply draft' implies usage – you use it on drafts that haven't been sent. But there's no explicit when-to-use vs alternatives guidance, and no mention of what happens if the draft was already sent. The 'Does not publish' note provides a soft boundary against send_reader_reply_draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_scheduled_note_accountChange scheduled note accountADestructiveIdempotentInspect
Send an already scheduled Note from a different connected account on Threads, Facebook, TikTok, Pinterest, X or Instagram. Use the scheduled Note id and an accountId from list_social_accounts, or from list_instagram_destinations for Instagram (an account outside the plan is refused). Each Instagram account a Note goes to is its own scheduled Note: change the one for the account the writer named, not another version of the same Note. Works only while the Note has not started sending. A Note already scheduled for that account from the same draft is refused as a duplicate. A Note held for an account choice resumes if its time is still ahead; if its time has passed, the result has needsNewTime: true and the Note must be rescheduled. Only change the account the writer asked for. Personal account only: it changes Notes you own, not a team workspace's.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Scheduled Note id, from list_scheduled_items or schedule_note. | |
| accountId | Yes | accountId from list_social_accounts for the Note's platform, or from list_instagram_destinations for Instagram. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| changed | Yes | |
| resumed | Yes | |
| platform | Yes | |
| accountId | Yes | |
| needsNewTime | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, idempotentHint=true, but the description adds substantial context the annotations cannot: the personal-account-only scope (no team workspaces), per-Instagram-account scheduled Note semantics, duplicate rejection, and the needsNewTime result on a passed send time.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and platform list are front-loaded, and most sentences carry operational weight. However, 'Only change the account the writer asked for' largely repeats the earlier per-account sentence, adding mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool that is destructive but idempotent, the description covers preconditions, failure modes, account source alternatives and the reschedule-on-passed-time path. Since an output schema exists, return values need no further explanation, leaving no meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the accountId source lists. The description reinforces the accountId origin but adds little syntax or format detail beyond what the structured fields provide, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (change the sending account of an already scheduled Note) and enumerates supported platforms. It is clearly distinguishable from siblings like amend_scheduled_item_content, reschedule_scheduled_item and cancel_scheduled_item.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to list_social_accounts and list_instagram_destinations for the accountId, states the precondition ('works only while the Note has not started sending'), and describes refusal cases (out-of-plan account, duplicate). It also covers the needsNewTime rescheduling path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_settingsUpdate settingsADestructiveIdempotentInspect
Change the writer's preferences: preferredTimezone, capitalizeGeneratedNotes, articleLinkPlacement (where article links go in Notes: COMMENT or BODY), and tagArticleLinksWithUtm (add UTM tags to article links). Only the fields passed change; call get_settings first and change only what the writer asked for. Default accounts, connections, notifications, billing and security cannot be changed here: the writer changes them in Narrareach Settings. To move one scheduled Note to another connected account, use update_scheduled_note_account. Personal account only.
| Name | Required | Description | Default |
|---|---|---|---|
| preferredTimezone | No | IANA timezone used for scheduling and stats, for example America/Toronto. | |
| articleLinkPlacement | No | Where the article link goes when a Note promotes an article: COMMENT (first comment) or BODY (in the Note). | |
| tagArticleLinksWithUtm | No | Whether links to the writer's own articles get UTM tags so traffic can be attributed. | |
| capitalizeGeneratedNotes | No | Whether generated Notes use standard capitalization (false leaves the generated casing unchanged). |
Output Schema
| Name | Required | Description |
|---|---|---|
| updated | Yes | |
| preferences | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the mutation/idempotency profile, and the description adds real value beyond them: partial-update semantics ("Only the fields passed change"), a scope restriction ("Personal account only"), and an explicit exclusion list for settings managed elsewhere. It does not explain reversibility of a destructive-flagged change, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense but purposeful sentences, front-loaded with the changeable fields and followed by workflow and exclusions. The mention of "Narrareach Settings" is slightly verbose branding but the content is not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described. The description covers scope, partial-update behavior, workflow ordering, exclusions, and the sibling alternative, so an agent has everything required to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters with formats and enum values. The description restates the field list and glosses articleLinkPlacement's COMMENT/BODY meaning, adding only marginal context over the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific verb (change) and the exact resources (preferredTimezone, capitalizeGeneratedNotes, articleLinkPlacement, tagArticleLinksWithUtm), and explicitly differentiates itself from siblings like get_settings and update_scheduled_note_account. An agent can distinguish this from any other update tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit workflow ("call get_settings first and change only what the writer asked for"), enumerates what cannot be changed here and redirects to Narrareach Settings, and routes one adjacent case to update_scheduled_note_account. When-to-use, when-not-to-use, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_voice_examplesUpdate voice examplesAIdempotentInspect
Choose which of the writer's own posts show how they sound, when the writer asks you to: pin posts so they are used first (up to 6), unpin them, exclude posts that are not how they sound, restore excluded posts, or reset to their most recent posts. Example ids come from list_voice_examples. One call is one change the writer can undo.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | No | Example ids to pin. | |
| reset | No | true clears every pin and exclusion, back to the writer's most recent posts. Applied before the lists. | |
| unpin | No | Pinned example ids to unpin. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| exclude | No | Example ids the writer says are not how they sound. They are never used as examples. | |
| restore | No | Excluded example ids to allow again. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| undo | Yes | |
| pinned | Yes | |
| changed | Yes | |
| removed | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (not read-only, not destructive, idempotent), and the description adds beyond that: the pin cap ('up to 6'), the fact that exclusions are permanent ('never used as examples'), and that each call is a single undoable change. It doesn't state permission or workspace requirements beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the enumeration of actions are front-loaded, and the undo guarantee is a well-placed short follow-up sentence. The first sentence is long and list-heavy, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all seven optional parameters' effects at the operation level and, since an output schema exists, needn't describe return values. Minor gap: no guidance on combining actions in one call beyond the reset-precedence note already in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already spells out each parameter's meaning (including 'never used as examples' and reset precedence), so the description mostly repeats it. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set (pin/unpin/exclude/restore/reset) on a specific resource (the writer's own example posts) and explains the effect ('show how they sound'). It also routes to list_voice_examples as the id source, distinguishing it from the read-only sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger — 'when the writer asks you to' — and enumerates the five sub-actions with their intent, plus where ids come from. It stops short of naming when NOT to use it versus adjacent tools like add_voice_material or update_voice_stances.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_voice_profileUpdate voice profileAIdempotentInspect
Set sections of the writer's voice profile when the writer asks you to: how they sound, their niche, their audience, their instructions for drafts, or their topics. Pass only the sections to change; each replaces what is there (topics replaces the whole list). Use the writer's own words and never fill a section in on your own. Style only: it cannot allow invented facts, stories, quotes, or numbers. One call is one change the writer can undo.
| Name | Required | Description | Default |
|---|---|---|---|
| niche | No | What the writer writes about. Empty or null clears it. | |
| topics | No | The full list of topics the writer covers. Replaces the current list. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| audience | No | Who the writer writes for. Empty or null clears it. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. | |
| howYouSound | No | How the writer sounds, in their words. An empty string clears it. | |
| instructions | No | Standing instructions for drafts, in the writer's words. An empty string clears them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| undo | Yes | |
| changed | Yes | |
| profile | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false; the description goes beyond them by disclosing replacement semantics ('each replaces what is there', 'topics replaces the whole list') and reversibility ('One call is one change the writer can undo'), which links it to undo_voice_change. It is also candid about the style-only limit (no invented facts, stories, quotes, or numbers). It does not explicitly state permission/workspace requirements for mutation, though the schema hints at them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the section list, then the operational rules, then the constraint. Every sentence carries a distinct rule; the style-only caveat is slightly compressed but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, full schema descriptions, and an output schema present, the description supplies exactly the missing pieces: trigger context, partial-update semantics, replacement behavior, and undo-ability. An agent has enough to call it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the empty/null clearing behavior and the topics-replaces-list rule. The description reinforces replace semantics but adds no syntax, format, or length guidance beyond the structured data, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and resource (sections of the writer's voice profile) and enumerates exactly which sections are editable (how they sound, niche, audience, instructions, topics). This lets an agent distinguish it from siblings like update_voice_rule, update_voice_stances, and update_voice_examples without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger condition ('when the writer asks you to'), explicit partial-update instruction ('Pass only the sections to change'), and an explicit prohibition ('never fill a section in on your own'). It also distinguishes scope from related tools by naming the section set it owns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_voice_ruleUpdate voice ruleAIdempotentInspect
Reword one rule in the writer's voice profile, when the writer asks you to change it. Use the rule id from get_voice_profile. Style only: a rule cannot allow invented facts, stories, quotes, or numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The new wording, as the writer wants it. | |
| ruleId | Yes | The rule id from get_voice_profile. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| undo | Yes | |
| changed | Yes | |
| ruleCount | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a write (readOnlyHint=false) that is idempotent and non-destructive, so the safety profile is covered. The description adds a genuine content constraint not present in structured data: rules are style-only and may not permit invented facts, stories, quotes, or numbers. It does not discuss auth/workspace permissions beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and scope, then trigger and id source, then the content constraint. No filler or repetition of schema/annotation data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering returns and annotations covering the safety profile, the description supplies purpose, trigger, id source, and a content constraint. It omits whether the edit is reversible (undo_voice_change exists), a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond it by telling the agent where ruleId originates (get_voice_profile) and by constraining the text parameter to style-only wording, adding meaning the schema's maxLength/description does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Reword) and resource (one rule in the writer's voice profile), and the singular scope distinguishes it from siblings like add_voice_material and remove_voice_rule. An agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"when the writer asks you to change it" gives a clear trigger condition, and it points to get_voice_profile as the source of the rule id. It stops short of naming explicit exclusions (e.g. use remove_voice_rule to delete, add_voice_material to append), so it is clear context without full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_voice_stancesUpdate voice stancesAIdempotentInspect
Add or remove stances in the writer's voice profile: what they believe ("believe") or would never say ("never"). Add only stances the writer has stated in their own words; never infer one. Stance ids for removal come from get_voice_profile. One call is one change the writer can undo.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Stances to add, each with kind ("believe" or "never") and the stance in the writer's words. | |
| remove | No | Stance ids from get_voice_profile to remove. | |
| writer | No | Optional team writer name, handle, or id within the workspace. "me" selects your linked voice. Requires workspace. | |
| workspace | No | Optional authorized team workspace name or id. Absence selects the authenticated user's personal account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| undo | Yes | |
| changed | Yes | |
| stances | Yes | |
| stanceCount | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true). The description adds genuinely new behavioral context beyond them: each call is a single, undoable change, which connects the agent to undo_voice_change. It does not, however, describe what happens on duplicate adds or partial failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the operation and its scope, with no repetition of schema or annotation content. Each sentence carries a distinct rule (what, how to source text, where ids come from, reversibility).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema is present, so return values need no explanation, and annotations cover the safety profile. For a mutation tool with full schema coverage, the remaining description burden is the sourcing rule and undoability, both of which are supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond it by constraining the semantics of the free-text 'add' payload (must be the writer's own words, never inferred) and by explaining the provenance of the 'remove' ids, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (add/remove) and a precise resource (stances in the writer's voice profile), then defines the two stance kinds inline. This cleanly separates it from siblings like update_voice_profile, update_voice_rule, and save_voice_preference without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a real usage rule ('Add only stances the writer has stated in their own words; never infer one') and routes id acquisition to get_voice_profile. It stops short of naming the closest alternative tools (e.g. update_voice_rule) or stating when not to use this one, so it is clear context but not full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaUpload mediaAInspect
Upload one image or video for later scheduling from a public HTTPS URL, data URI, base64 bytes, or a file the user attached in the chat. In ChatGPT, pass an attached image or video in file. URL ingestion depends on the source host allowing automated access. Files that exist only in your client (sandbox paths, local disk) are unreachable as url or data: use file where supported, send their bytes as a data URI or base64, or ask the user for a public HTTPS link, such as a Canva download or share link. Success is confirmed only by the returned publicUrl. Returns a public media URL. API documentation: https://www.narrareach.com/api-docs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public HTTPS media URL. | |
| data | No | Data URI or raw base64 media bytes; blob:, file:, and sandbox: references are unsupported. Use only when the client sends the exact file bytes: base64 written out or reconstructed by the assistant arrives cut short or altered, and an incomplete image is rejected. | |
| file | No | A file the user attached in the chat, passed by the client (ChatGPT). Use instead of url or data for attachments. | |
| kind | Yes | ||
| fileName | No | Optional original file name for storage diagnostics. | |
| mimeType | No | Required for raw base64. Example: image/png. | |
| sourceType | No | Optional. Inferred from data/url when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| size | Yes | |
| sha256 | Yes | |
| uploaded | Yes | |
| publicUrl | Yes | |
| contentType | Yes | |
| connectedAccount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (readOnly=false, openWorld=true, idempotent=false, destructive=false), so the description is free to add ingestion behavior instead of repeating it. It does so usefully: URL ingestion fails if the source host blocks automated access, truncated or altered base64 is rejected, and success is confirmed only by the returned publicUrl. Missing auth/permission and size/rate-limit context keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the ingestion options are front-loaded, and every sentence carries routing or failure information. The only waste is mild redundancy at the end, where 'Success is confirmed only by the returned publicUrl' and 'Returns a public media URL' say nearly the same thing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it correctly points to the success signal anyway. For a 7-parameter tool with nested objects and two enums, it covers ingestion modes, client-specific behavior, and failure conditions completely enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (86%), so the baseline is 3, but the description adds real value beyond the schema: it prescribes which input mode fits which situation (ChatGPT attachments via 'file', client-local paths unusable as url/data) and warns that reconstructed base64 arrives cut short. It does not restate the enum values or nested file fields, which the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Upload one image or video') plus scope ('for later scheduling'), and it is clearly distinguished from every sibling, none of which ingest media. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing rules across the mutually exclusive inputs: use 'file' for chat attachments, 'url' only for public HTTPS sources, and 'data' only when exact bytes are available. It also names the fallback when none apply (ask the user for a public HTTPS link such as a Canva share link) and states the URL-host access precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_substackConfirm your Substack connectionADestructiveInspect
Compatibility tool for existing connections. New clients can use get_substack_verification_status, start_substack_verification, complete_substack_verification, and cancel_substack_verification for individual operations. Confirm Substack without leaving this conversation or signing in again. Use the exact connectionId from the publishing response or get_user_profile. Check status first. When the user wants to continue, use start to request a code, then ask them for it here. If start returns verified: true, skip code entry. Ask in a normal chat message and wait for the user’s reply; if a prompt closes without an answer, keep waiting in chat without requesting another code. Use complete with the returned id and the code they provide. Never guess a code, repeat submissions automatically, or send the code to another tool. Only the connected account owner can confirm. After completion, poll the existing schedule if its ID is known. Otherwise promptly retry the same saved draft with the original settings; the scheduler checks for an existing matching schedule before creating one. Verification is not proof of scheduling or publishing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Code request id returned by start or status. Required for complete and cancel. | |
| code | No | The six-digit code supplied by the user. Required only for complete. Never echo it back. | |
| action | Yes | ||
| connectionId | Yes | The exact Substack connection to confirm. | |
| scheduledPostId | No | The exact saved article job from the publishing response. Pass it to resume that same job after verification. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| method | No | |
| message | Yes | |
| required | No | |
| verified | No | |
| cancelled | No | |
| challenge | No | |
| expiresAt | No | |
| connection | No | |
| nextAction | No | |
| instruction | No | |
| publication | Yes | |
| connectionId | Yes | |
| articleRecovery | No | |
| resumedArticles | No | |
| scheduledPostId | No | |
| connectedAccount | No | |
| deliveryConfirmed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, non-idempotent, open-world. The description adds real behavioral context beyond them: the account-owner-only authorization requirement, the instruction not to auto-repeat submissions, the handling of closed prompts, and the caveat that 'Verification is not proof of scheduling or publishing.' It does not explain what the destructive flag actually destroys, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and alternative tools are front-loaded before the workflow detail, and most sentences carry operational weight. It is a dense single paragraph, however, and the workflow/constraint sentences could be structured more scannably for a four-action tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a multi-action tool with 5 params, the description covers the full lifecycle (status, start, complete, cancel), the code-entry loop, failure handling, and post-completion scheduling behavior — everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3. The description still adds value by telling the agent where connectionId comes from ('the publishing response or get_user_profile') and how scheduledPostId is used to 'resume that same job after verification' — sourcing and intent the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Confirm Substack connection') and explicitly frames the tool as a compatibility wrapper for existing connections. It also names the four sibling tools (get/start/complete/cancel_substack_verification) that new clients should use for individual operations, so an agent can distinguish it from them 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing ('New clients can use ... for individual operations'), sequencing ('Check status first', 'use start to request a code'), and a clear step-by-step workflow through status/start/complete/cancel. It also states exclusions and anti-patterns ('Never guess a code, repeat submissions automatically, or send the code to another tool').
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.
3 tool updates
- Added
open_publishing_studio - Added
preview_publishing_plan - Added
record_publishing_studio_event
3 tool updates
- Changed
get_settings1 field changed- changed
Output schema / properties / defaultAccounts / properties / linkedin / properties / defaultDestination / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accountId": { - "type": "string" - }, - "isDefault": { - "type": "boolean" - }, - "kind": { - "enum": [ - "profile", - "page" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "organizationUrn": { - "type": "string" - } - }, - "required": [ - "accountId", - "label", - "kind", - "isDefault" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "accountId": { + "type": "string" + }, + "aliasAccountIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "isDefault": { + "type": "boolean" + }, + "kind": { + "enum": [ + "profile", + "page" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "organizationUrn": { + "type": "string" + } + }, + "required": [ + "accountId", + "label", + "kind", + "isDefault" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_linkedin_destinations2 fields changed- changed
Output schema / properties / defaultDestination / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accountId": { - "type": "string" - }, - "isDefault": { - "type": "boolean" - }, - "kind": { - "enum": [ - "profile", - "page" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "organizationUrn": { - "type": "string" - } - }, - "required": [ - "accountId", - "label", - "kind", - "isDefault" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "accountId": { + "type": "string" + }, + "aliasAccountIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "isDefault": { + "type": "boolean" + }, + "kind": { + "enum": [ + "profile", + "page" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "organizationUrn": { + "type": "string" + } + }, + "required": [ + "accountId", + "label", + "kind", + "isDefault" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / destinations / items / properties / aliasAccountIdsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
schedule_note1 field changed- changed
Output schema / properties / linkedinDestination / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "accountId": { - "type": "string" - }, - "isDefault": { - "type": "boolean" - }, - "kind": { - "enum": [ - "profile", - "page" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "organizationUrn": { - "type": "string" - } - }, - "required": [ - "accountId", - "label", - "kind", - "isDefault" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "accountId": { + "type": "string" + }, + "aliasAccountIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "isDefault": { + "type": "boolean" + }, + "kind": { + "enum": [ + "profile", + "page" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "organizationUrn": { + "type": "string" + } + }, + "required": [ + "accountId", + "label", + "kind", + "isDefault" + ], + "type": "object" + }, + { + "type": "null" + } +]
3 tool updates
- Added
get_ai_visibility_audit - Changed
get_draft2 fields changed- added
Output schema / properties / aiVisibilityAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "detail": { + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "pass", + "weak", + "missing" + ], + "type": "string" + } + }, + "required": [ + "id", + "status", + "detail" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "type": "string" + }, + "needsJudgment": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topFixes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "wordCount": { + "type": "integer" + } + }, + "required": [ + "wordCount", + "checks", + "topFixes", + "needsJudgment", + "guidance" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "id", - "title", - "status", - "createdAt", - "updatedAt", - "publishedTo", - "publishedCount", - "lastPublishedAt", - "contentHtml", - "contentJson", - "meta" -]New value: +[ + "id", + "title", + "status", + "createdAt", + "updatedAt", + "publishedTo", + "publishedCount", + "lastPublishedAt", + "contentHtml", + "contentJson", + "meta", + "aiVisibility" +]
- Changed
schedule_article1 field changed- added
Output schema / properties / aiVisibilityAdded value: +{ + "additionalProperties": false, + "properties": { + "checks": { + "items": { + "additionalProperties": false, + "properties": { + "detail": { + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "pass", + "weak", + "missing" + ], + "type": "string" + } + }, + "required": [ + "id", + "status", + "detail" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "type": "string" + }, + "needsJudgment": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topFixes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "wordCount": { + "type": "integer" + } + }, + "required": [ + "wordCount", + "checks", + "topFixes", + "needsJudgment", + "guidance" + ], + "type": "object" +}
3 tool updates
- Added
add_platform_to_scheduled_note - Changed
schedule_note1 field changed- added
Input schema / properties / shortVersionAdded value: +{ + "additionalProperties": false, + "description": "One short text for several platforms, e.g. { \"text\": \"...\", \"platforms\": [\"X\", \"BLUESKY\", \"THREADS\"] }, while the other platforms post content as written. Saved as one shared short version the writer edits once in the app. It must fit the tightest platform it goes to (X 280 as one post, Bluesky 300, Threads 500, LinkedIn 3000) or nothing is scheduled. A platform in it cannot also be in platformVersions.", + "properties": { + "platforms": { + "items": { + "enum": [ + "X", + "BLUESKY", + "THREADS", + "LINKEDIN" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "platforms" + ], + "type": "object" +}
- Changed
schedule_notes3 fields changed- added
Input schema / properties / notes / items / properties / shortVersionAdded value: +{ + "additionalProperties": false, + "description": "One short text for several platforms, e.g. { \"text\": \"...\", \"platforms\": [\"X\", \"BLUESKY\", \"THREADS\"] }, while the other platforms post content as written. Saved as one shared short version the writer edits once in the app. It must fit the tightest platform it goes to (X 280 as one post, Bluesky 300, Threads 500, LinkedIn 3000) or nothing is scheduled. A platform in it cannot also be in platformVersions.", + "properties": { + "platforms": { + "items": { + "enum": [ + "X", + "BLUESKY", + "THREADS", + "LINKEDIN" + ], + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "platforms" + ], + "type": "object" +} - added
Output schema / properties / results / items / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "index", - "status", - "clientRequestId", - "platforms", - "scheduledFor", - "scheduleIds", - "existingScheduleIds", - "supersededIds", - "code", - "reason" -]New value: +[ + "index", + "status", + "clientRequestId", + "platforms", + "scheduledFor", + "scheduleIds", + "existingScheduleIds", + "supersededIds", + "warnings", + "code", + "reason" +]
1 tool update
- Changed
update_scheduled_note_account1 field changed- changed
Input schema / properties / accountId / descriptionPrevious value: -"accountId from list_social_accounts for the Note's platform."New value: +"accountId from list_social_accounts for the Note's platform, or from list_instagram_destinations for Instagram."
6 tool updates
- Changed
get_note2 fields changed- added
Output schema / properties / quoteAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "note", + "post" + ], + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "kind" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "context", - "id", - "itemUrl", - "platform", - "status", - "contentType", - "content", - "contentJson", - "contentMeta", - "distributionKind", - "contentHash", - "scheduledFor", - "timezone", - "postedAt", - "postUrl", - "externalPostId", - "error", - "retryCount", - "createdAt", - "updatedAt", - "draft", - "performanceSnapshots", - "platformMetrics" -]New value: +[ + "context", + "id", + "itemUrl", + "platform", + "status", + "contentType", + "content", + "contentJson", + "contentMeta", + "distributionKind", + "quote", + "contentHash", + "scheduledFor", + "timezone", + "postedAt", + "postUrl", + "externalPostId", + "error", + "retryCount", + "createdAt", + "updatedAt", + "draft", + "performanceSnapshots", + "platformMetrics" +]
- Changed
list_notes2 fields changed- added
Output schema / properties / notes / items / properties / quoteAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "note", + "post" + ], + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "kind" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / notes / items / requiredPrevious value: -[ - "id", - "itemUrl", - "type", - "platform", - "status", - "scheduledFor", - "timezone", - "postedAt", - "postUrl", - "externalPostId", - "error", - "failureCode", - "socialAccountId", - "contentType", - "distributionKind", - "restackSourceCommentId", - "content", - "draft", - "engagement", - "platformMetrics", - "tags" -]New value: +[ + "id", + "itemUrl", + "type", + "platform", + "status", + "scheduledFor", + "timezone", + "postedAt", + "postUrl", + "externalPostId", + "error", + "failureCode", + "socialAccountId", + "contentType", + "distributionKind", + "restackSourceCommentId", + "quote", + "content", + "draft", + "engagement", + "platformMetrics", + "tags" +]
- Changed
list_voice_examples2 fields changed- added
Output schema / properties / examples / items / properties / startedFromDraftAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / examples / items / requiredPrevious value: -[ - "exampleId", - "text", - "platform", - "postedAt", - "pinned", - "inMainLanguage", - "readsAsReply" -]New value: +[ + "exampleId", + "text", + "platform", + "postedAt", + "pinned", + "inMainLanguage", + "readsAsReply", + "startedFromDraft" +]
- Changed
reschedule_scheduled_item1 field changed- changed
Output schema / properties / item / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "contentType": { - "type": "string" - }, - "distributionKind": { - "anyOf": [ - { - "enum": [ - "substack_restack" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "draft": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "id", - "title" - ], - "type": "object" - }, - "engagement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "clicks": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "comments": { - "type": "integer" - }, - "follows": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "freeSubscriptions": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "impressions": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "likes": { - "type": "integer" - }, - "paidSubscriptions": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recordedAt": { - "format": "date-time", - "type": "string" - }, - "shares": { - "type": "integer" - } - }, - "required": [ - "likes", - "comments", - "shares", - "impressions", - "clicks", - "follows", - "freeSubscriptions", - "paidSubscriptions", - "recordedAt" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "externalPostId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "failureCode": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "itemUrl": { - "type": "string" - }, - "platform": { - "type": "string" - }, - "platformMetrics": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "clicks": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "comments": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "follows": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "impressions": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "likes": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "observedAt": { - "format": "date-time", - "type": "string" - }, - "reach": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reposts": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "saves": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "sends": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "shares": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "views": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "likes", - "comments", - "shares", - "saves", - "sends", - "clicks", - "views", - "reach", - "impressions", - "follows", - "reposts", - "observedAt" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "postUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "postedAt": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "restackSourceCommentId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "scheduledFor": { - "format": "date-time", - "type": "string" - }, - "socialAccountId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string" - }, - "timezone": { - "type": "string" - }, - "type": { - "const": "note", - "type": "string" - } - }, - "required": [ - "id", - "itemUrl", - "type", - "platform", - "status", - "scheduledFor", - "timezone", - "postedAt", - "postUrl", - "externalPostId", - "error", - "failureCode", - "socialAccountId", - "contentType", - "distributionKind", - "restackSourceCommentId", - "content", - "draft", - "engagement", - "platformMetrics" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "deliveryNote": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "draft": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "id", - "title" - ], - "type": "object" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "heldForEditorialReview": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "itemUrl": { - "type": "string" - }, - "outcome": { - "enum": [ - "saved_draft" - ], - "type": "string" - }, - "platforms": { - "items": { - "type": "string" - }, - "type": "array" - }, - "publishedAt": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "recurringScheduleId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "remoteEditUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "scheduledFor": { - "format": "date-time", - "type": "string" - }, - "status": { - "type": "string" - }, - "substackDelivery": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "note": { - "type": "string" - }, - "requiresVerification": { - "type": "boolean" - }, - "state": { - "enum": [ - "waiting", - "publishing", - "verifying" - ], - "type": "string" - }, - "verification": { - "additionalProperties": false, - "properties": { - "action": { - "type": "string" - }, - "connectionId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "endpoint": { - "type": "string" - }, - "instruction": { - "type": "string" - }, - "scheduledPostId": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "tools": { - "additionalProperties": false, - "properties": { - "cancel": { - "type": "string" - }, - "complete": { - "type": "string" - }, - "start": { - "type": "string" - }, - "status": { - "type": "string" - } - }, - "required": [ - "status", - "start", - "complete", - "cancel" - ], - "type": "object" - } - }, - "required": [ - "connectionId", - "tool", - "endpoint", - "action", - "instruction" - ], - "type": "object" - }, - "verificationUrl": { - "type": "string" - } - }, - "required": [ - "state", - "note", - "requiresVerification" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "timezone": { - "type": "string" - }, - "type": { - "const": "article", - "type": "string" - } - }, - "required": [ - "substackDelivery", - "heldForEditorialReview", - "deliveryNote", - "id", - "itemUrl", - "type", - "status", - "scheduledFor", - "timezone", - "publishedAt", - "error", - "platforms", - "recurringScheduleId", - "draft" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "distributionKind": { + "anyOf": [ + { + "enum": [ + "substack_restack" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "draft": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "engagement": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "clicks": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "comments": { + "type": "integer" + }, + "follows": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "freeSubscriptions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "impressions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "likes": { + "type": "integer" + }, + "paidSubscriptions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "recordedAt": { + "format": "date-time", + "type": "string" + }, + "shares": { + "type": "integer" + } + }, + "required": [ + "likes", + "comments", + "shares", + "impressions", + "clicks", + "follows", + "freeSubscriptions", + "paidSubscriptions", + "recordedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "externalPostId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "failureCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "itemUrl": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "platformMetrics": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "clicks": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "comments": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "follows": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "impressions": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "likes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "format": "date-time", + "type": "string" + }, + "reach": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "reposts": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "saves": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "sends": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "shares": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "views": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "likes", + "comments", + "shares", + "saves", + "sends", + "clicks", + "views", + "reach", + "impressions", + "follows", + "reposts", + "observedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "postUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postedAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "quote": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "note", + "post" + ], + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "kind" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "restackSourceCommentId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledFor": { + "format": "date-time", + "type": "string" + }, + "socialAccountId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": "string" + }, + "timezone": { + "type": "string" + }, + "type": { + "const": "note", + "type": "string" + } + }, + "required": [ + "id", + "itemUrl", + "type", + "platform", + "status", + "scheduledFor", + "timezone", + "postedAt", + "postUrl", + "externalPostId", + "error", + "failureCode", + "socialAccountId", + "contentType", + "distributionKind", + "restackSourceCommentId", + "quote", + "content", + "draft", + "engagement", + "platformMetrics" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "deliveryNote": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "draft": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heldForEditorialReview": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "itemUrl": { + "type": "string" + }, + "outcome": { + "enum": [ + "saved_draft" + ], + "type": "string" + }, + "platforms": { + "items": { + "type": "string" + }, + "type": "array" + }, + "publishedAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "recurringScheduleId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "remoteEditUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledFor": { + "format": "date-time", + "type": "string" + }, + "status": { + "type": "string" + }, + "substackDelivery": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "requiresVerification": { + "type": "boolean" + }, + "state": { + "enum": [ + "waiting", + "publishing", + "verifying" + ], + "type": "string" + }, + "verification": { + "additionalProperties": false, + "properties": { + "action": { + "type": "string" + }, + "connectionId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "endpoint": { + "type": "string" + }, + "instruction": { + "type": "string" + }, + "scheduledPostId": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "tools": { + "additionalProperties": false, + "properties": { + "cancel": { + "type": "string" + }, + "complete": { + "type": "string" + }, + "start": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "status", + "start", + "complete", + "cancel" + ], + "type": "object" + } + }, + "required": [ + "connectionId", + "tool", + "endpoint", + "action", + "instruction" + ], + "type": "object" + }, + "verificationUrl": { + "type": "string" + } + }, + "required": [ + "state", + "note", + "requiresVerification" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "timezone": { + "type": "string" + }, + "type": { + "const": "article", + "type": "string" + } + }, + "required": [ + "substackDelivery", + "heldForEditorialReview", + "deliveryNote", + "id", + "itemUrl", + "type", + "status", + "scheduledFor", + "timezone", + "publishedAt", + "error", + "platforms", + "recurringScheduleId", + "draft" + ], + "type": "object" + } +]
- Changed
schedule_note4 fields changed- added
Input schema / properties / quoteUrlAdded value: +{ + "description": "Optional public Substack Note link (https://substack.com/@writer/note/c-123) or Substack post/article link (https://publication.substack.com/p/slug, or the publication's custom domain) to quote. Substack shows it as a quoted card under the note, like \"Restack with a note\". Do not also put the link in content; if it is there it is taken out. Requires SUBSTACK in platforms; every other platform gets the link at the end of its text instead. Cannot be combined with draftId. Nothing is scheduled when the Note or post cannot be found or is not public. Use preview_note_quote to check a link first.", + "maxLength": 2048, + "minLength": 1, + "type": "string" +} - added
Output schema / properties / notes / items / properties / quoteAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "note", + "post" + ], + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "kind" + ], + "type": "object" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / notes / items / requiredPrevious value: -[ - "id", - "itemUrl", - "type", - "platform", - "status", - "scheduledFor", - "timezone", - "postedAt", - "postUrl", - "externalPostId", - "error", - "failureCode", - "socialAccountId", - "contentType", - "distributionKind", - "restackSourceCommentId", - "content", - "draft", - "engagement", - "platformMetrics" -]New value: +[ + "id", + "itemUrl", + "type", + "platform", + "status", + "scheduledFor", + "timezone", + "postedAt", + "postUrl", + "externalPostId", + "error", + "failureCode", + "socialAccountId", + "contentType", + "distributionKind", + "restackSourceCommentId", + "quote", + "content", + "draft", + "engagement", + "platformMetrics" +] - added
Output schema / properties / quoteAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "note", + "post" + ], + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "kind" + ], + "type": "object" + }, + { + "type": "null" + } + ] +}
- Changed
schedule_notes1 field changed- added
Input schema / properties / notes / items / properties / quoteUrlAdded value: +{ + "description": "Optional public Substack Note link (https://substack.com/@writer/note/c-123) or Substack post/article link (https://publication.substack.com/p/slug, or the publication's custom domain) to quote. Substack shows it as a quoted card under the note, like \"Restack with a note\". Do not also put the link in content; if it is there it is taken out. Requires SUBSTACK in platforms; every other platform gets the link at the end of its text instead. Cannot be combined with draftId. Nothing is scheduled when the Note or post cannot be found or is not public. Use preview_note_quote to check a link first.", + "maxLength": 2048, + "minLength": 1, + "type": "string" +}
1 tool update
- Added
list_topic_suggestions
2 tool updates
- Added
get_transcript - Added
get_transcript_status
2 tool updates
- Changed
schedule_note7 fields changed- added
Input schema / properties / clientRequestIdAdded value: +{ + "description": "Optional but recommended: your own id for this note, 8 to 80 letters, numbers, hyphens or underscores. Use a new one for each note and the same one when retrying it (for example after a timeout or a rate-limit pause): the retry returns the original result and schedules nothing again. Reusing it with different text, platforms or time is refused.", + "pattern": "^[A-Za-z0-9_-]{8,80}$", + "type": "string" +} - added
Output schema / properties / clientRequestIdAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / duplicateAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / duplicatePlatformsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / existingScheduleIdsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / replayedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / supersededIdsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Added
schedule_notes
1 tool update
- Changed
schedule_note1 field changed- added
Input schema / properties / generationIdAdded value: +{ + "description": "Optional. Pass the generationId from create_generated_notes when scheduling a generated note: the requestId that create_generated_notes returned. Used only to measure how generated notes are used; it does not change what is scheduled.", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" +}
1 tool update
- Added
get_research_desk_answer
1 tool update
- Added
create_generated_notes
15 tool updates
- Added
get_audience_overview - Added
get_import_status - Added
get_posting_schedule - Added
get_stats_snapshot - Changed
get_voice_profile7 fields changed- added
Input schema / properties / detailAdded value: +{ + "description": "Optional. \"full\" returns every item in the material bank, not only the most recent 30. Defaults to \"summary\".", + "enum": [ + "summary", + "full" + ], + "type": "string" +} - added
Output schema / properties / material / items / properties / idAdded value: +{ + "type": "string" +} - changed
Output schema / properties / material / items / requiredPrevious value: -[ - "type", - "text" -]New value: +[ + "id", + "type", + "text" +] - added
Output schema / properties / materialTotalAdded value: +{ + "type": "integer" +} - added
Output schema / properties / stances / items / properties / idAdded value: +{ + "type": "string" +} - changed
Output schema / properties / stances / items / requiredPrevious value: -[ - "kind", - "text" -]New value: +[ + "id", + "kind", + "text" +] - changed
Output schema / requiredPrevious value: -[ - "whose", - "howYouSound", - "niche", - "audience", - "rules", - "topics", - "stances", - "material", - "instructions", - "examples", - "canSave", - "howToUse", - "suggestions", - "howToHandleSuggestions", - "pageUrl" -]New value: +[ + "whose", + "howYouSound", + "niche", + "audience", + "rules", + "topics", + "stances", + "material", + "materialTotal", + "instructions", + "examples", + "canSave", + "howToUse", + "suggestions", + "howToHandleSuggestions", + "pageUrl" +]
- Added
list_creator_matches - Added
list_voice_changes - Added
list_voice_examples - Added
preview_audience_segment - Added
remove_voice_material - Changed
undo_voice_change1 field changed- added
Input schema / properties / changeIdAdded value: +{ + "description": "Optional change id from list_voice_changes. The undo is refused if another change has been made since.", + "maxLength": 64, + "type": "string" +}
- Added
update_posting_schedule - Added
update_voice_examples - Added
update_voice_profile - Added
update_voice_stances
7 tool updates
- Changed
cancel_substack_verification3 fields changed- added
Input schema / properties / scheduledPostIdAdded value: +{ + "description": "The exact saved article job from the publishing response. Pass it to resume that same job after verification.", + "maxLength": 64, + "minLength": 1, + "type": "string" +} - changed
Output schema / properties / challenge / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string" - }, - "id": { - "type": "string" - }, - "method": { - "anyOf": [ - { - "enum": [ - "email", - "totp" - ], - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "id", - "method", - "expiresAt" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "anyOf": [ + { + "enum": [ + "email", + "totp" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledPostId": { + "type": "string" + } + }, + "required": [ + "id", + "method", + "expiresAt" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / scheduledPostIdAdded value: +{ + "type": "string" +}
- Changed
complete_substack_verification3 fields changed- added
Input schema / properties / scheduledPostIdAdded value: +{ + "description": "The exact saved article job from the publishing response. Pass it to resume that same job after verification.", + "maxLength": 64, + "minLength": 1, + "type": "string" +} - changed
Output schema / properties / challenge / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string" - }, - "id": { - "type": "string" - }, - "method": { - "anyOf": [ - { - "enum": [ - "email", - "totp" - ], - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "id", - "method", - "expiresAt" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "anyOf": [ + { + "enum": [ + "email", + "totp" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledPostId": { + "type": "string" + } + }, + "required": [ + "id", + "method", + "expiresAt" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / scheduledPostIdAdded value: +{ + "type": "string" +}
- Changed
get_substack_verification_status3 fields changed- added
Input schema / properties / scheduledPostIdAdded value: +{ + "description": "The exact saved article job from the publishing response. Pass it to resume that same job after verification.", + "maxLength": 64, + "minLength": 1, + "type": "string" +} - changed
Output schema / properties / challenge / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string" - }, - "id": { - "type": "string" - }, - "method": { - "anyOf": [ - { - "enum": [ - "email", - "totp" - ], - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "id", - "method", - "expiresAt" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "anyOf": [ + { + "enum": [ + "email", + "totp" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledPostId": { + "type": "string" + } + }, + "required": [ + "id", + "method", + "expiresAt" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / scheduledPostIdAdded value: +{ + "type": "string" +}
- Changed
reschedule_scheduled_item1 field changed- changed
Output schema / properties / item / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "contentType": { - "type": "string" - }, - "distributionKind": { - "anyOf": [ - { - "enum": [ - "substack_restack" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "draft": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "id", - "title" - ], - "type": "object" - }, - "engagement": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "clicks": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "comments": { - "type": "integer" - }, - "follows": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "freeSubscriptions": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "impressions": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "likes": { - "type": "integer" - }, - "paidSubscriptions": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "recordedAt": { - "format": "date-time", - "type": "string" - }, - "shares": { - "type": "integer" - } - }, - "required": [ - "likes", - "comments", - "shares", - "impressions", - "clicks", - "follows", - "freeSubscriptions", - "paidSubscriptions", - "recordedAt" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "externalPostId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "failureCode": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "itemUrl": { - "type": "string" - }, - "platform": { - "type": "string" - }, - "platformMetrics": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "clicks": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "comments": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "follows": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "impressions": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "likes": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "observedAt": { - "format": "date-time", - "type": "string" - }, - "reach": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "reposts": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "saves": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "sends": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "shares": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "views": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "likes", - "comments", - "shares", - "saves", - "sends", - "clicks", - "views", - "reach", - "impressions", - "follows", - "reposts", - "observedAt" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "postUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "postedAt": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "restackSourceCommentId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "scheduledFor": { - "format": "date-time", - "type": "string" - }, - "socialAccountId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string" - }, - "timezone": { - "type": "string" - }, - "type": { - "const": "note", - "type": "string" - } - }, - "required": [ - "id", - "itemUrl", - "type", - "platform", - "status", - "scheduledFor", - "timezone", - "postedAt", - "postUrl", - "externalPostId", - "error", - "failureCode", - "socialAccountId", - "contentType", - "distributionKind", - "restackSourceCommentId", - "content", - "draft", - "engagement", - "platformMetrics" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "deliveryNote": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "draft": { - "additionalProperties": false, - "properties": { - "id": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "id", - "title" - ], - "type": "object" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "heldForEditorialReview": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "itemUrl": { - "type": "string" - }, - "outcome": { - "enum": [ - "saved_draft" - ], - "type": "string" - }, - "platforms": { - "items": { - "type": "string" - }, - "type": "array" - }, - "publishedAt": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "recurringScheduleId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "remoteEditUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "scheduledFor": { - "format": "date-time", - "type": "string" - }, - "status": { - "type": "string" - }, - "substackDelivery": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "note": { - "type": "string" - }, - "requiresVerification": { - "type": "boolean" - }, - "state": { - "enum": [ - "waiting", - "publishing", - "verifying" - ], - "type": "string" - }, - "verification": { - "additionalProperties": false, - "properties": { - "action": { - "type": "string" - }, - "connectionId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "endpoint": { - "type": "string" - }, - "instruction": { - "type": "string" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "connectionId", - "tool", - "endpoint", - "action", - "instruction" - ], - "type": "object" - }, - "verificationUrl": { - "type": "string" - } - }, - "required": [ - "state", - "note", - "requiresVerification" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "timezone": { - "type": "string" - }, - "type": { - "const": "article", - "type": "string" - } - }, - "required": [ - "substackDelivery", - "heldForEditorialReview", - "deliveryNote", - "id", - "itemUrl", - "type", - "status", - "scheduledFor", - "timezone", - "publishedAt", - "error", - "platforms", - "recurringScheduleId", - "draft" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "distributionKind": { + "anyOf": [ + { + "enum": [ + "substack_restack" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "draft": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "engagement": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "clicks": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "comments": { + "type": "integer" + }, + "follows": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "freeSubscriptions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "impressions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "likes": { + "type": "integer" + }, + "paidSubscriptions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "recordedAt": { + "format": "date-time", + "type": "string" + }, + "shares": { + "type": "integer" + } + }, + "required": [ + "likes", + "comments", + "shares", + "impressions", + "clicks", + "follows", + "freeSubscriptions", + "paidSubscriptions", + "recordedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "externalPostId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "failureCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "itemUrl": { + "type": "string" + }, + "platform": { + "type": "string" + }, + "platformMetrics": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "clicks": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "comments": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "follows": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "impressions": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "likes": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "observedAt": { + "format": "date-time", + "type": "string" + }, + "reach": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "reposts": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "saves": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "sends": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "shares": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "views": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "likes", + "comments", + "shares", + "saves", + "sends", + "clicks", + "views", + "reach", + "impressions", + "follows", + "reposts", + "observedAt" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "postUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "postedAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "restackSourceCommentId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledFor": { + "format": "date-time", + "type": "string" + }, + "socialAccountId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": "string" + }, + "timezone": { + "type": "string" + }, + "type": { + "const": "note", + "type": "string" + } + }, + "required": [ + "id", + "itemUrl", + "type", + "platform", + "status", + "scheduledFor", + "timezone", + "postedAt", + "postUrl", + "externalPostId", + "error", + "failureCode", + "socialAccountId", + "contentType", + "distributionKind", + "restackSourceCommentId", + "content", + "draft", + "engagement", + "platformMetrics" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "deliveryNote": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "draft": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "heldForEditorialReview": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "itemUrl": { + "type": "string" + }, + "outcome": { + "enum": [ + "saved_draft" + ], + "type": "string" + }, + "platforms": { + "items": { + "type": "string" + }, + "type": "array" + }, + "publishedAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "recurringScheduleId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "remoteEditUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledFor": { + "format": "date-time", + "type": "string" + }, + "status": { + "type": "string" + }, + "substackDelivery": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "requiresVerification": { + "type": "boolean" + }, + "state": { + "enum": [ + "waiting", + "publishing", + "verifying" + ], + "type": "string" + }, + "verification": { + "additionalProperties": false, + "properties": { + "action": { + "type": "string" + }, + "connectionId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "endpoint": { + "type": "string" + }, + "instruction": { + "type": "string" + }, + "scheduledPostId": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "tools": { + "additionalProperties": false, + "properties": { + "cancel": { + "type": "string" + }, + "complete": { + "type": "string" + }, + "start": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "status", + "start", + "complete", + "cancel" + ], + "type": "object" + } + }, + "required": [ + "connectionId", + "tool", + "endpoint", + "action", + "instruction" + ], + "type": "object" + }, + "verificationUrl": { + "type": "string" + } + }, + "required": [ + "state", + "note", + "requiresVerification" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "timezone": { + "type": "string" + }, + "type": { + "const": "article", + "type": "string" + } + }, + "required": [ + "substackDelivery", + "heldForEditorialReview", + "deliveryNote", + "id", + "itemUrl", + "type", + "status", + "scheduledFor", + "timezone", + "publishedAt", + "error", + "platforms", + "recurringScheduleId", + "draft" + ], + "type": "object" + } +]
- Changed
schedule_article1 field changed- changed
Output schema / properties / posts / items / properties / substackDelivery / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "note": { - "type": "string" - }, - "requiresVerification": { - "type": "boolean" - }, - "state": { - "enum": [ - "waiting", - "publishing", - "verifying" - ], - "type": "string" - }, - "verification": { - "additionalProperties": false, - "properties": { - "action": { - "type": "string" - }, - "connectionId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "endpoint": { - "type": "string" - }, - "instruction": { - "type": "string" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "connectionId", - "tool", - "endpoint", - "action", - "instruction" - ], - "type": "object" - }, - "verificationUrl": { - "type": "string" - } - }, - "required": [ - "state", - "note", - "requiresVerification" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "requiresVerification": { + "type": "boolean" + }, + "state": { + "enum": [ + "waiting", + "publishing", + "verifying" + ], + "type": "string" + }, + "verification": { + "additionalProperties": false, + "properties": { + "action": { + "type": "string" + }, + "connectionId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "endpoint": { + "type": "string" + }, + "instruction": { + "type": "string" + }, + "scheduledPostId": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "tools": { + "additionalProperties": false, + "properties": { + "cancel": { + "type": "string" + }, + "complete": { + "type": "string" + }, + "start": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "status", + "start", + "complete", + "cancel" + ], + "type": "object" + } + }, + "required": [ + "connectionId", + "tool", + "endpoint", + "action", + "instruction" + ], + "type": "object" + }, + "verificationUrl": { + "type": "string" + } + }, + "required": [ + "state", + "note", + "requiresVerification" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
start_substack_verification3 fields changed- added
Input schema / properties / scheduledPostIdAdded value: +{ + "description": "The exact saved article job from the publishing response. Pass it to resume that same job after verification.", + "maxLength": 64, + "minLength": 1, + "type": "string" +} - changed
Output schema / properties / challenge / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string" - }, - "id": { - "type": "string" - }, - "method": { - "anyOf": [ - { - "enum": [ - "email", - "totp" - ], - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "id", - "method", - "expiresAt" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "anyOf": [ + { + "enum": [ + "email", + "totp" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledPostId": { + "type": "string" + } + }, + "required": [ + "id", + "method", + "expiresAt" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / scheduledPostIdAdded value: +{ + "type": "string" +}
- Changed
verify_substack3 fields changed- added
Input schema / properties / scheduledPostIdAdded value: +{ + "description": "The exact saved article job from the publishing response. Pass it to resume that same job after verification.", + "maxLength": 64, + "minLength": 1, + "type": "string" +} - changed
Output schema / properties / challenge / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "expiresAt": { - "format": "date-time", - "type": "string" - }, - "id": { - "type": "string" - }, - "method": { - "anyOf": [ - { - "enum": [ - "email", - "totp" - ], - "type": "string" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "id", - "method", - "expiresAt" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "expiresAt": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "method": { + "anyOf": [ + { + "enum": [ + "email", + "totp" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledPostId": { + "type": "string" + } + }, + "required": [ + "id", + "method", + "expiresAt" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / scheduledPostIdAdded value: +{ + "type": "string" +}
2 tool updates
- Changed
list_reader_activities3 fields changed- added
Output schema / properties / activities / items / properties / kindAdded value: +{ + "type": "string" +} - added
Output schema / properties / activities / items / properties / labelAdded value: +{ + "type": "string" +} - changed
Output schema / properties / activities / items / requiredPrevious value: -[ - "intent", - "intentConfidence", - "id", - "type", - "triageState", - "senderCount", - "occurredAt", - "content", - "targetContent", - "canReply", - "actors" -]New value: +[ + "intent", + "intentConfidence", + "id", + "type", + "kind", + "label", + "triageState", + "senderCount", + "occurredAt", + "content", + "targetContent", + "canReply", + "actors" +]
- Changed
schedule_article1 field changed- changed
Input schema / properties / addSearchMetadata / descriptionPrevious value: -"Generate SEO titles, descriptions, and a Substack slug for supported article destinations. In MCP it defaults to true when the account has article SEO access; pass false to skip. Readers do not see these fields; they help search engines and AI tools understand the article. X does not expose separate article SEO settings."New value: +"Generate SEO titles, descriptions, and a Substack slug for supported article destinations. SEO metadata is generated automatically on Revenue Writer, Full Agentic Mode, and Teams & Agencies, and for trials or other accounts with article SEO access. Set this option to false to turn it off. X does not support separate article SEO settings."
1 tool update
- Changed
list_reader_activities2 fields changed- added
Output schema / properties / rangeAdded value: +{ + "additionalProperties": false, + "properties": { + "all": { + "additionalProperties": false, + "properties": { + "newestOccurredAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "oldestOccurredAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "newestOccurredAt", + "oldestOccurredAt" + ], + "type": "object" + }, + "page": { + "additionalProperties": false, + "properties": { + "newestOccurredAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "oldestOccurredAt": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "newestOccurredAt", + "oldestOccurredAt" + ], + "type": "object" + }, + "state": { + "enum": [ + "inbox", + "history" + ], + "type": "string" + } + }, + "required": [ + "state", + "page", + "all" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "activities", - "page", - "summary", - "sync" -]New value: +[ + "activities", + "page", + "summary", + "range", + "sync" +]
2 tool updates
- Added
get_settings - Added
update_settings
1 tool update
- Added
list_social_posts
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npmMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.164 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.