Niche — Editorial Intelligence
Server Details
Find the stories worth writing about: discover emerging stories, rank the angle, draft from sources.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.7/5 across 25 of 25 tools scored. Lowest: 4.1/5.
Most tools have clearly distinct purposes, with detailed descriptions that explain when to use each. Some overlap exists (e.g., multiple brand kit tools, two drafting tools, two research tools) but the descriptions effectively differentiate them.
All tool names follow a consistent niche_verb_noun pattern in snake_case. Verbs are mostly single words, and the pattern is predictable, aiding agent selection.
25 tools is on the higher side, but given the broad scope covering discovery, drafting, rendering, brand management, and session control, the count is justified. Each tool serves a distinct step in the editorial workflow.
The tool surface covers the entire content creation lifecycle from signal scanning to publishing, including brand setup, asset handling, and session management. No obvious gaps are present for the stated purpose of editorial intelligence and content generation.
Available Tools
25 toolsniche_add_outputAdd an outputAInspect
Add an output cell to a session that's already reached CP3. Use this when the user picked a small initial cell set, previewed the drafts, and now wants another surface (e.g. the session started with linkedin:text_post and the user wants to add instagram:carousel too).
Text-only cells (linkedin:text_post, x:thread, long_form_article, etc.): generates text via the matching generator if it hasn't run yet, then creates the Output row. This call blocks synchronously ~20-30s when it must run a new generator family (no status to poll); it returns fast when that family already generated. Idempotent: if the cell is already on the session, returns the existing Output unchanged.
Asset cells (linkedin:image_post, x:reel, instagram:image_post, etc.): creates the text Output row; image-bearing cells auto-attach a free branded card (static_urls populated without an explicit render, swappable anytime), while video/reel assets are never auto-rendered. The response's next_step says exactly what to call for more: niche_render_image_card (cell plus an explicit background: 'photo' or 'brand_color') or niche_render_reel (cell). The response's copy_lineage says whether this cell drafted fresh text or shares its generator family's existing copy.
Remove: pass remove_cell to delete a produced cell the user no longer wants on this run. Idempotent: a clean message when the cell isn't present.
Errors: 400 if session is pre-CP3; 422 if cell is invalid.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | No | Cell to add. Must be one of the valid cells (see niche_signal_scan's target_outputs for the list). | |
| session_id | Yes | ||
| remove_cell | No | Cell to remove from this run (deletes the produced output). Idempotent: a no-op message when the cell isn't present. Pass this instead of `cell` to remove rather than add. | |
| estimate_only | No | When true, return the credit cost of adding this cell without creating a row or generating. Returns 0 when the cell's platform family already generated (text is reused). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses synchronous blocking behavior for text generation, idempotency for existing cells, credit cost estimation via estimate_only, and error codes. Annotations indicate readOnlyHint=false and destructiveHint=false, and the description adds behavioral context without 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?
The description is detailed and front-loaded with purpose, but somewhat lengthy. Every sentence adds value, but could be slightly more concise. Structure is logical, covering use case, behavior, and error handling.
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 has no output schema, but the description explains response fields (next_step, copy_lineage) and covers errors, idempotency, and synchronous behavior. It is complete for a complex 4-parameter 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 75%, and the description adds significant context: it explains valid cells reference, remove_cell behavior, and estimate_only purpose. It also clarifies text vs asset cell behaviors beyond schema 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?
The description clearly states the tool adds an output cell to a session at CP3, distinguishing it from siblings by specifying the precondition and action. It also mentions removal via remove_cell, providing a specific verb and 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?
The description explicitly states when to use ('when the user picked a small initial cell set...and now wants another surface'), covers preconditions (CP3), and mentions error cases (400 if pre-CP3, 422 if invalid cell). It implicitly references alternatives like niche_render_image_card and niche_render_reel but does not explicitly contrast with all siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_angle_proposePropose anglesAInspect
Niche content angles: pick a story from the discovery slate and surface the strongest angles worth publishing, the editorial-judgment step that turns a development into a piece. Returns five angles[], each with frame, hook, tension, cta_direction, and cta_variants (a swap palette). niche_session_state then carries an angle_recommendation (recommended_angle_id plus reasoning); when a brand profile is bound it is brand-fit-scored, otherwise recommended_angle_id is null with recommendation_basis='default_ordering' (no invented pick). Returns immediately with status=cp2_generating; poll niche_session_state until angles[] is populated.
Custom framing (provenance-preserving): to draft your own angle on this researched story, not one of the proposed five, pass custom_framing (after the story is locked and angles are ready). The framing is shaped onto the real story and drafted on this session, so the trust block keeps the story's actual sources. Use this instead of niche_draft_direct when you have a researched story in hand; draft_direct works from your take alone, so it has no researched sources to cite.
Regenerate: pass regenerate=true (story locked, angles ready) for a fresh set of five angles on the same story; pair with lens to steer the rerun. Capped per session and metered like a generation.
| Name | Required | Description | Default |
|---|---|---|---|
| lens | No | Optional steer for a regenerate run (e.g. 'more contrarian', 'lead with the data'). Only read when regenerate is true. | |
| story_id | Yes | id from niche_session_state.stories[].id | |
| regenerate | No | Generate a fresh set of angles on the locked story instead of returning the existing set. Requires the story locked and angles ready. Capped per session; metered like a generation. | |
| session_id | Yes | ||
| custom_framing | No | Optional. Your own angle in a sentence ('the contrarian take: X is overhyped because Y'). When set, drafts that angle on the real story (provenance preserved) instead of returning the proposed five. Requires the story locked and angles ready (cp2_awaiting_angle). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only show mutability; description adds that it returns immediately with status cp2_generating, that polling is needed, and mentions capping and metering. No contradictions.
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-structured with clear sections, but slightly verbose. Could be trimmed without losing clarity, but still effective.
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?
Comprehensive for a tool with no output schema: explains return format (angles array), states polling needed, and covers edge cases like null recommended_angle_id.
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?
Even with 80% schema coverage, description adds meaningful context for custom_framing and regenerate parameters, including conditions and behavior. Lens is clarified as only read when regenerate=true.
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 clearly states it picks a story from the discovery slate and surfaces the strongest angles, which is a specific verb-resource combination. It is distinguished from sibling tool niche_draft_direct by explaining when to use custom_framing instead.
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 when to use custom_framing (vs draft_direct), when to use regenerate, and that polling is required. Provides clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_attach_imageAttach a user-supplied photoAInspect
Upload or attach a user-supplied or externally-designed image (bring-your-own asset) to a post: the creator's own visual (a product shot, their actual work, a card designed elsewhere) instead of an AI-generated image (niche_render_image_card photo, paid) or a flat brand card. Free, with no image-generation spend. For a visual-product maker the real piece is the sale.
Input modes, in order of preference: (1) upload_ref, the FAST path for an agent that built the asset itself and can run a shell: POST the raw file to /asset/upload (multipart/form-data, your bearer token) to get back an upload_ref, then pass it here. The bytes travel over HTTP and never round-trip through the model as base64, so it's effectively instant for a real graphic. (2) image_url, a fetchable https URL (the server fetches + stores it; for an asset that already lives on the web). (3) image: {mime_type, data_base64}, inline base64, fine for small images only. (4) image_chunk, the no-shell FALLBACK: upload bounded chunks of base64. It still re-types the bytes through the model (slow), so use it only when the agent has no shell to curl with. Split the file's bytes into ~32-48KB pieces, base64 EACH independently, send in order, each with a sha256 of that piece's raw bytes so the server catches a mis-transcribed chunk and has you resend just that one (this is what makes the slow path reliable). Omit upload_id on the first chunk; the response returns one to pass on the rest. Set final:true on the last chunk (optionally with total_sha256); that call assembles, validates, and attaches.
The cell's output must already exist (use niche_add_output first if needed). Sets it as the post's image; publishes with the caption. A dimension_note warns if the image's aspect won't fit the cell. Undo-able (the prior image is kept in history).
| Name | Required | Description | Default |
|---|---|---|---|
| cell | Yes | Post cell to attach onto (e.g. 'linkedin:image_post', 'x:image_post', 'instagram:image_post'). | |
| image | No | Inline image as base64: {mime_type, data_base64} (plus optional name). Max 8MB, but large inline payloads are unreliable over MCP, so prefer upload_ref or image_url. One of upload_ref / image_url / image / image_chunk is required. | |
| image_url | No | A fetchable image URL (https). For an asset that already lives on the web: the server fetches and stores it, so you don't inline a large base64 payload. One of upload_ref / image_url / image / image_chunk is required. | |
| session_id | Yes | ||
| upload_ref | No | FAST bring-your-own path. First POST the raw file to /asset/upload (multipart/form-data field 'file', Authorization: Bearer <token>); the response returns an upload_ref. Pass it here. The bytes go over HTTP, not through the model, so it's instant for a real graphic. Preferred whenever the agent can run a shell. | |
| image_chunk | No | Chunked upload for bring-your-own bytes you hold locally (no URL). Split the file's BYTES into ~32-48KB pieces, base64-encode EACH piece, send in order. Always include a per-chunk `sha256` (hex of that piece's raw bytes): the server verifies it and rejects a mis-transcribed chunk so you resend just that one, which is what makes this path reliable (valid base64 can still decode to wrong bytes and silently corrupt the image). Omit upload_id on the first chunk (the response returns one); set final:true on the last, optionally with `total_sha256` of the whole file. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant context beyond annotations: describes mutation (attaches image), undo capability, server behavior for chunks (verification, resend logic), and warnings about image aspect fit. No contradiction with annotations (readOnlyHint=false, destructiveHint=false).
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 structured with numbered input modes and clear sections, but it is quite verbose. However, the detail is necessary given the tool's complexity. Front-loaded with purpose.
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?
Comprehensive coverage of all aspects: input modes with rationale, preconditions, error handling, integrity checks, and side effects (undo). Although no output schema, the description explains the result (image attached, published).
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?
Even with 83% schema coverage, the description enriches parameter meaning with detailed explanations for each input mode, chunking mechanics (size, sha256, sequencing), and how to use upload_ref. The description compensates for the remaining uncovered parameters with clear context.
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 clearly states the tool attaches a user-supplied image to a post cell, distinguishing it from sibling tools like niche_render_image_card (AI-generated) and niche_add_output (prerequisite). The verb 'attach' is specific and the resource is well-defined.
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 explicit when-to-use guidance for each input mode (upload_ref > image_url > image > image_chunk fallback), states prerequisite (cell output must exist via niche_add_output), and explains when not to use (e.g., for AI-generated images). Alternatives and exclusions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_brand_kit_guided_setupBrand kit guided setupARead-onlyInspect
Return a structured question chain the agent walks the user through to populate the BrandKit, VoiceProfile, and (optionally) BrandProfile. Each entry carries an intent describing what the answer is for (so the agent paraphrases in its own voice based on the conversation it's already having) plus a prompt_hint fallback for agents that relay tools verbatim.
Use this when the agent is helping a new user set up Niche and wants a predictable, brand-aware Q&A sequence instead of improvising. Tiered by impact:
Tier 0 (primary): URL ingest, fills 70-90% in one ask.
Tier 1 (gap_fill): only the fields URL ingest didn't fill.
Tier 2 (discipline): opt-in guardrails (topics off, banned terms, competitor stance).
Tier 3 (no_url): full fallback for users without a site.
Per-question applies_to_field tells the agent where the answer writes (via niche_brand_kit_update or niche_brand_profile_set). is_already_set is computed from the user's current BrandKit and BrandProfile state so the agent skips questions already answered.
Returns the full chain in one call; the agent inspects state, decides flow, and asks in any order (or skips entirely if the user volunteered the answer earlier in the conversation).
| Name | Required | Description | Default |
|---|---|---|---|
| brand_id | No | Optional. If set, also reads the persisted BrandProfile for that brand_id so questions whose answers live in the profile (banned_terms, framing.allowed, etc.) get their is_already_set computed against profile state too. | |
| include_filled | No | If true, return all questions including those already answered. Default false: the agent only sees the gaps. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so no destructive actions. The description adds beyond annotations by detailing that the chain is computed from current state (is_already_set derived from BrandKit and BrandProfile), and the agent can ask in any order. It does not contradict 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?
The description is detailed and well-structured, starting with the core return value, then usage context, tiers, per-question attributes, and final usage notes. While lengthy, it is front-loaded and each section serves a purpose. Minor redundancy could be trimmed.
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 complexity of a guided setup with multiple tiers and state-dependent filtering, the description is comprehensive. It explains the intent, prompt_hint fallback, applies_to_field mapping, and is_already_set computation. No output schema exists, but the description sufficiently covers what the agent receives and how to interpret 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%, but the tool description adds meaning: explains that brand_id influences is_already_set computation by reading the persisted BrandProfile, and include_filled controls gap filtering. This provides context beyond the schema's basic definitions.
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 clearly states the tool returns a structured question chain for brand kit setup, specifying the entries' structure (intent, prompt_hint) and how they map to fields. It distinguishes from sibling tools like niche_brand_kit_update and niche_brand_profile_set by focusing on guiding the user through a Q&A sequence rather than direct updates.
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: 'when the agent is helping a new user set up Niche and wants a predictable, brand-aware Q&A sequence instead of improvising.' Describes tiered approach (Tier 0-3) based on URL ingest availability, giving clear guidance on flow selection. Also advises that the agent can skip questions if already answered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_brand_kit_ingestIngest a brand kit from a URLAInspect
Auto-populate the user's BrandKit (palette / fonts / tagline / logo / wordmark / boilerplate / voice notes) from files, a URL, or pasted text. Additive by default: fills empty fields, leaves populated ones alone. Idempotent: re-running the same inputs doesn't double-write.
Overwrite rule: if the target brand kit already has an identity (a tagline/boilerplate/voice for a different brand), do not silently overwrite it. First ask the user whether to replace it. If the account supports multiple brand profiles, prefer creating a separate brand instead: pass a new brand_id slug plus brand_name rather than clobbering the existing one. Only pass replace=true once the user has confirmed they want this brand re-learned from the new source.
Use when the agent has brand assets in scope (a working directory with logos / press-kit / brand-guide PDFs, the user's portfolio or Substack URL, pasted boilerplate copy) and wants to populate Niche's BrandKit so future signal_scan and content generation inherit the brand context. Agent-side equivalent of the Niche web app brand-kit ingest surface, same backend engine.
Async, then poll: a URL or multi-file ingest runs in the background, so this call returns fast with {ingest_id, status:'ingesting'}. Then poll niche_brand_kit_ingest_status(ingest_id) until status is 'done'; that response carries the populated BrandKit, the ingest report (detected[] / skipped[] / errors[]), and a diff[] of changed fields. (Loop: ingest, then poll status until done/failed; same pattern as niche_signal_scan to niche_session_state.) Do not re-call ingest while one is running; a duplicate of the same inputs attaches to the in-flight job. URL ingest also fills voice primitives when the page has post-shaped text (Substack/blog/X). If a URL is slow or thin to scrape, the visual fields may land before the voice pass completes; when the report flags this, paste the page's About/homepage copy via text= to complete the brand voice.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Optional URL (homepage, Substack, portfolio, LinkedIn) or a paste of brand text (tagline, boilerplate, voice notes). URL takes precedence when both look URL-shaped. | |
| files | No | Files to ingest (logos, brand-guide PDFs, screenshots, color swatches, headshots). Each entry: {name, mime_type, data_base64}. The engine classifies each by image content and routes to logo/wordmark/headshot/brand-guide/color-swatch slots. | |
| replace | No | Default false (additive: fill empty fields only). Set true only after the user confirms they want an already-populated brand re-learned from this source; it overwrites the detected identity fields. Do not set true to silently clobber a different brand's kit; create a new brand_id instead. | |
| brand_id | No | Which brand slot to ingest into. Omit for the default brand. Pass a slug (e.g. 'acme') to target or create a separate brand kit; do this when the default kit already belongs to another brand, so you don't merge two brands into one. If the account isn't entitled to additional brands, the call returns a clear error explaining what's needed. | |
| brand_name | No | Optional display name when creating a new brand_id slot (e.g. 'Acme Co'). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses additive nature, idempotency, overwrite rule, async behavior with polling, and handling of duplicates. No contradiction with annotations; adds significant context beyond readOnlyHint=false and destructiveHint=false.
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-structured with clear sections, front-loaded with purpose and core behavior. Slightly verbose but every sentence adds value, earning its place given the tool's complexity.
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?
Provides complete guidance on async pattern, polling workflow, return structure (ingest_id, status, eventual report), and edge cases (slow URL, incomplete voice pass). No output schema, but description compensates fully.
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?
Parameters are fully explained in schema (100% coverage), and description adds interactive semantics: text URL precedence, files classification, replace confirmation requirement, brand_id for separate profiles, brand_name for new slots.
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 clearly states what the tool does: auto-populate BrandKit from files, URL, or text. It distinguishes from sibling tools like niche_brand_kit_update and niche_brand_kit_guided_setup by specifying the ingest operation.
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 (when brand assets are in scope) and when not to (if brand kit already has identity for different brand). Provides alternatives (create separate brand, niche_brand_kit_ingest_status) and warnings about re-calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_brand_kit_ingest_statusPoll a brand-kit ingestARead-onlyInspect
Poll the result of an async niche_brand_kit_ingest. Pass the ingest_id it returned. status: 'ingesting' (keep polling) | 'done' (response carries the full kit plus detected[]/skipped[]/errors[]/diff[]/left_unchanged_because_populated[]) | 'failed' (error plus failed_step; the kit was not written). The marker expires 30 min after the ingest starts.
| Name | Required | Description | Default |
|---|---|---|---|
| ingest_id | Yes | The ingest_id returned by niche_brand_kit_ingest. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds polling behavior, status definitions, failure details, and expiration beyond the readOnlyHint and destructiveHint annotations, which already indicate safety.
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?
Extremely concise with efficient bullet-like format, front-loading purpose and providing all needed info in two sentences.
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?
Comprehensive for a polling tool with one parameter and no output schema, covering all statuses and expiration. Minor gap: doesn't explicitly state that response varies by status, but it's implied.
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 the single parameter; description restates its source but adds no new semantic value, meeting 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?
Clearly states it polls the result of an async ingest, distinguishing it from the sibling niche_brand_kit_ingest which initiates the process.
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 instructs to pass the ingest_id from the ingest call and describes three statuses. Provides expiration timeout (30 min) but lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_brand_kit_updateUpdate brand kitAInspect
Set specific BrandKit fields by name. The write path for the structured fields (tagline / boilerplate / voice_notes / forbidden_phrases / signature_phrases / endcard preferences / video voice preference / colors / fonts) without going through the ingest engine. Use after niche_brand_kit_ingest fills the easy stuff, or to commit values the user answered through niche_brand_kit_guided_setup.
Only fields you pass are touched; fields you omit stay at their current value. Lists replace the current value (they do not append). Response includes a diff[] of fields that changed and the full updated kit.
Archiving: pass archive=true to archive a brand (soft and reversible; it disappears from every list but is not deleted), or archive=false to restore one. The default/active brand can't be archived (promote another to default first). A brand with published history won't archive unless you also pass acknowledge=true. Use archive_scope='test' to archive every scratch brand at once (never the default). There is no hard delete here; archive is the removal verb agents have.
| Name | Required | Description | Default |
|---|---|---|---|
| accent | No | ||
| archive | No | true archives the brand (soft, reversible; hidden from every list, not deleted); false restores it. Refuses the default/active brand and refuses a brand with published history unless acknowledge=true. | |
| tagline | No | Brand tagline (5-12 words). | |
| brand_id | No | Which brand slot to update. Omit for default; pass a slug to target a specific brand kit (for multi-brand accounts). | |
| cta_text | No | One-line call to action appended to generated posts, e.g. 'DM to commission'. | |
| logo_url | No | ||
| brand_name | No | Display name when creating a new brand_id slot. | |
| primary_bg | No | Primary background color (#rrggbb). | |
| acknowledge | No | Required (true) to archive a brand that has published history, confirming the user means to remove it from the roster even though it shipped work. | |
| boilerplate | No | Brand boilerplate (one paragraph, ≤350 chars). | |
| voice_notes | No | Voice direction in plain prose. A string or a list of strings (the guided-setup text_list form); a list is joined server-side. | |
| external_url | No | Canonical brand URL (homepage). | |
| headshot_url | No | ||
| secondary_bg | No | ||
| text_primary | No | ||
| wordmark_url | No | ||
| archive_scope | No | With archive=true, 'test' archives every scratch brand in one call (never the default). Returns the list of brands archived; each is reversible with archive=false. | |
| text_secondary | No | ||
| body_font_family | No | ||
| endcard_template | No | ||
| forbidden_phrases | No | Phrases never to use in generated copy. Max 16; trimmed beyond. | |
| signature_phrases | No | Phrases the brand uses. Max 16. | |
| endcard_outro_text | No | ||
| headline_font_family | No | ||
| video_voice_preference | No | ||
| endcard_mark_preference | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write operations, but the description adds extensive behavioral context: partial updates, list replacement, diff in response, soft archive, default brand restriction, published history requirement, and archive_scope batch archiving, all beyond 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?
The description is well-structured, front-loaded with the primary purpose, and each sentence adds necessary detail. No redundant or vague statements.
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 26 parameters and no output schema, the description provides enough context for correct tool selection and invocation, including archiving caveats and field update behavior. A brief mention of response format would improve completeness, but overall quite thorough.
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 50%, and the description explains key parameters like archive, acknowledge, archive_scope, and general behavior for lists. However, several parameters (e.g., accent, logo_url, primary_bg) are only in the schema, so the description doesn't fully compensate. Still, the archiving details add significant value.
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 clearly states 'Set specific BrandKit fields by name' and distinguishes from sibling tools like niche_brand_kit_ingest and niche_brand_kit_guided_setup, making the purpose specific and 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?
Explicitly says when to use this tool: 'Use after niche_brand_kit_ingest fills the easy stuff, or to commit values the user answered through niche_brand_kit_guided_setup.' Also explains archiving scenarios and behavioral nuances.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_brand_profile_getGet brand profileARead-onlyInspect
Read back the persisted brand profile without modifying it. Use it to confirm a profile landed as expected, to check the active profile a run is bound to, or to inspect the current shape before a partial update.
Pass brand_id to read one profile; omit it to list all (brand_id, updated_at) summaries. Returns the full profile JSON, schema_version, created/updated timestamps, and a brand_kit_sync_status indicating whether the profile's mirrored fields are in sync with the brand kit.
| Name | Required | Description | Default |
|---|---|---|---|
| brand_id | No | Brand identifier to read. Omit to list all. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds valuable context: non-modifying behavior, dual listing/retrieval, and specific return fields (full profile JSON, timestamps, sync status). No contradictions.
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 with no wasted words. The main action is front-loaded, and each sentence adds distinct value: what it does, when to use, and what it returns.
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 simple read-only tool with one optional parameter and no output schema, the description covers all necessary aspects: purpose, usage, return fields, and variations. No 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?
Input schema has 100% description coverage for the single parameter. The description reinforces the optional nature and adds meaning by explaining the dual behavior (read one vs. list all), going beyond what the schema provides.
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 ('read back') and resource ('persisted brand profile'), clearly distinguishes from the sibling tool 'niche_brand_profile_set', and lists concrete use cases (confirm, check, inspect).
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 the tool (confirm, check, inspect) and notes the alternative listing behavior when omitting brand_id. While 'when not to use' is implicit, the guidance is clear for a read-only retrieval tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_brand_profile_setSet brand profileAInspect
Set or update the persisted brand profile for a brand. The profile is a structured JSON document applied across every pipeline stage: voice rules, banned terms, canonical vocabulary, framing allowlist, channel config, compliance disclosures, and verifier overrides. Use it to persist a profile derived from a repo or docs so future runs inherit the rules, or to update voice rules and banned terms before the next run.
Required sections: identity and voice (a profile with no voice falls back to generic drafts). A re-set that omits voice is accepted with a default voice stub rather than rejected.
Validation: tiered lints (error / warn / info). 'error' lints reject the set; 'warn' lints accept with a note. The response includes lints[]. conflicts[] lists fields locked by the brand kit, which takes precedence; those profile values are not stored.
brand_id is unique per user; re-setting the same brand_id replaces the prior profile.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | The brand profile JSON. Schema sections (each drives a pipeline stage): identity (who the brand is), audience (who it's for), voice (register/rhythm/lexicon rules the copy obeys), lexicon (canonical_terms plus banned_terms the verifier enforces), framing (frame slugs from Niche's editorial taxonomy; pass `allowed` and/or `blocked` as lists of slugs. The set is closed: an unrecognized frame rejects the set and the error returns the valid slugs, so nothing is silently dropped), structure (default article shapes), offers (what the creator sells: {product, what_it_is, proof_point?, cta, link}; lands signal-led posts on the offer), verifier_overrides (truthfulness thresholds), channels (per-platform config), source_quality (trusted/blocked domains), compliance (required disclosures), metadata. Fill the load-bearing ones (identity / voice / lexicon / framing / verifier_overrides) for a strong profile; the rest are optional. A malformed set returns a `template` of the full schema with inline field docs in the error response, so no separate discovery call is needed. | |
| brand_id | Yes | Unique-per-user identifier for this brand (e.g. 'acme', 'acme-blog'). Stored as a string; lowercase kebab-case recommended. | |
| schema_version | No | Profile schema version. Defaults to '1.0'. | 1.0 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-read-only, non-destructive. Description adds significant context: tiered validation (error/warn/info), conflict handling with brand kit, overwrite behavior on re-set, and error response with schema template. This goes well beyond 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?
Description is well-structured: introduction, required fields, validation, then detailed profile breakdown. Front-loaded with purpose. However, it is somewhat verbose, with lengthy explanations of profile sections that could be more 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?
Given no output schema, description covers input semantics, validation, conflicts, and error handling thoroughly. It lacks explicit return value structure (though mentions lints and conflicts). For a complex tool, it is reasonably 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 covers all 3 parameters (100%), but description adds deep meaning, especially for the nested 'profile' object, explaining each section (identity, voice, lexicon, framing, etc.) and validation details. It even mentions error responses return a full schema template, eliminating need for separate discovery.
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?
Title and description clearly state the tool sets or updates a brand profile, with specific verb ('set or update') and resource ('brand profile'). It differentiates from siblings by detailing the profile's use across pipeline stages, contrasting with read-only get or guided setup 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?
Description provides explicit use cases: persist profile from docs for future runs, or update voice/banned terms. It explains fallback behavior and validation lints. Missing explicit 'when not to use' or comparison to alternatives like niche_brand_kit_guided_setup, but still clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_draft_createCreate draftsAInspect
Niche draft content: lock the chosen angle and turn it into platform-native social drafts (LinkedIn post, X thread, Instagram, newsletter/long-form), ready to review and publish, the downstream payoff once the story and angle are decided. Returns immediately with status=cp3_generating; poll niche_session_state until outputs[] is populated. Each output carries its trust data nested under outputs[i].trust: source_faithfulness_score, source_ungrounded_claims[], source_diversity_passed, source_recency_passed, overall_severity, a severity-tagged flags[], and verifier_blocked_reason/verifier_blocked_claim when a fabrication was refused. (No top-level verifier_audit field; read outputs[i].trust.)
| Name | Required | Description | Default |
|---|---|---|---|
| angle_id | Yes | id from niche_angle_propose.angles[].id | |
| session_id | Yes | ||
| estimate_only | No | When true, return the per-platform content credit cost without locking the angle or generating. Quote a price before committing. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations (destructiveHint=false, readOnlyHint=false) by detailing the asynchronous polling mechanism, the immediate return with status=cp3_generating, the trust data structure in outputs, and the estimate_only behavior. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and outcome. It includes necessary detail on polling and trust data, but the sentence structure is slightly run-on. Every sentence adds value, though compactness could be improved.
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 no output schema, the description fully covers the asynchronous response pattern, polling requirement, and trust data fields. It also describes the estimate_only mode, leaving no significant behavioral gaps for a tool with three 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 coverage is 67% (angle_id and estimate_only have descriptions; session_id lacks one). The description adds meaning for estimate_only by explaining cost preview without generation, and reinforces angle_id's role. It compensates for schema gaps with behavioral info but doesn't detail session_id.
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 clearly states the tool creates platform-native drafts by locking an angle. It differentiates from siblings like niche_draft_direct and niche_draft_revise by specifying the 'lock the chosen angle' step, establishing a distinct purpose.
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 implies this tool is used after the story and angle are decided ('downstream payoff'), providing clear context. However, it does not explicitly contrast with alternatives like niche_draft_direct or niche_draft_revise, only implying the workflow sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_draft_directDraft directly (no scan, BYOC)AInspect
Draft the creator's own take or product straight into posts, with no research scan and no story/angle picks. Use this for product-led or bring-your-own-content work: a specific thing to say ('new walnut dining table, live edge, $2,800') or a page to repurpose. The signal pipeline (niche_signal_scan) is for 'what's worth writing about my niche'; this is for 'write this exact thing.'
Provide at least one of: take (what to say), source_url, or source_text (the last two repurpose an existing page). Returns a session_id in under 2s; poll niche_session_state(wait:30, wait_until:'checkpoint') to cp3_awaiting_review/complete, then read outputs[]. Pass brand_id to bind the creator's voice, offer, and call to action so the draft sounds like them and includes their offer (set those first via niche_brand_profile_set).
| Name | Required | Description | Default |
|---|---|---|---|
| take | No | What the post should say: the creator's own message or product. Required unless a source is given. | |
| image | No | Produce an image in the same run when the user wants one: 'photo' = generated AI image (paid, ~30 credits/cell), 'card' = free brand card. Omit for text-only. | |
| verify | No | When true, run the per-claim grounding check against the provided source and record the clean result on each output, so the draft reads checked-and-clean rather than unchecked. Recommended when repurposing a source_url or source_text. | |
| brand_id | No | Binds this brand's voice, colors, offer, and CTA to the piece. Omit to use your default brand; on a multi-brand account pass the slug explicitly so a post about one product is not bound to another brand's identity. niche_whoami lists your brands. | |
| source_url | No | Optional page to repurpose: fetches and extracts the page's readable text. Use to turn an essay or landing page into platform posts. | |
| source_text | No | Optional pasted source text to repurpose (alternative to source_url). | |
| source_title | No | Optional title for the pasted/fetched source. | |
| target_outputs | No | Cells to draft, e.g. ['linkedin:text_post','x:thread','instagram:image_post']. Bare platforms (linkedin/x/instagram) coerce automatically. Defaults to ['linkedin']. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are consistent (readOnlyHint=false, destructiveHint=false). Description adds important behavior: returns session_id in <2s, polling needed for results, image credit costs, and brand binding for voice. No contradictions.
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-structured: front-loaded purpose, then usage contrast, then parameter details, then workflow. Slightly long but every sentence is necessary. Minor redundancy in brand binding mention.
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?
Despite no output schema, description explains return value and subsequent polling. Covers all 8 parameters with usage notes, defaults, and constraints. Provides workflow context for successful invocation.
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. The description adds value by explaining that at least one of take/source_url/source_text must be provided, and clarifies the difference between take and repurposing sources. Also adds context on image credit costs and verify usage.
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?
Title explicitly states 'Draft directly (no scan, BYOC)' and description clarifies it is for drafting the creator's own take or product, distinguishing from niche_signal_scan. Verb and resource are clear.
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 (product-led or BYOC work), provides examples, and contrasts with niche_signal_scan for 'what's worth writing' vs 'write this exact thing'. Also gives guidance on required inputs and brand binding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_draft_publishPublish a draftADestructiveInspect
Publish a single output to its platform. Defaults to dry_run=true: returns the would-publish payload plus any verifier blocks without actually filing. Set dry_run=false and provide an idempotency_key to commit. The commit is the only irreversible action in the workflow; the agent should present the dry-run preview to the human and only commit on explicit go-ahead. For any piece with a rendered image, reel, or card, show the human the actual pixels (the preview_url / image_url) first: never let publish be the first time a human sees the final visual. Verifier-blocked outputs refuse to publish even with dry_run=false; clear the block on the row first. When the target social isn't linked, returns status='not_connected' plus a connect_url instead of publishing; send the user to connect once, then retry.
Scheduling: pass scheduled_for (an ISO-8601 datetime in the future) to file the post for later instead of publishing now; it dispatches automatically through the same publish path. Pass cancel_scheduled=true to clear a pending schedule for this platform.
Prefer an exact cell string (e.g. 'x:thread', 'x:single_tweet') over a bare family name. A bare family that matches more than one draft on the session returns status='ambiguous_platform' with the candidate cells rather than guessing. Every publish and dry-run response echoes resolved_cell so you can confirm which artifact shipped.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| platform | Yes | Accepts either: • cell string: the platform×content_type the run produced (linkedin:text_post, linkedin:image_post, linkedin:carousel, x:single_tweet, x:thread, x:image_post, instagram:image_post, instagram:carousel), preferred for new code • family name: linkedin, linkedin_carousel, twitter, instagram, which coerces to the registered default cell for that family (e.g. linkedin maps to linkedin:text_post) Reels (linkedin:reel / x:reel / instagram:reel) and long_form_article have no in-app publish path: reels get a download URL, long-form ships as Markdown for paste-to-Substack. | |
| session_id | Yes | ||
| scheduled_for | No | ISO-8601 datetime to publish this output later (must be in the future). Files a pending scheduled post and returns status='scheduled' instead of publishing now. Requires the platform's social account connected; long-form has no scheduled path. | |
| idempotency_key | No | Required when dry_run=false. Same key returns the prior result without re-publishing. | |
| cancel_scheduled | No | Clear a pending scheduled post for this platform on this run. Idempotent: returns a clean message when nothing is scheduled. | |
| acknowledge_surfaced | No | Required true to commit when the dry-run surfaced claims/flags worth a human look (the dry-run's next_step names them). Affirms the agent showed the human the surfaced items and got go-ahead. Ignored when nothing was surfaced. Default false. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description thoroughly discloses behavioral traits beyond annotations: declares commit as 'the only irreversible action', explains dry_run returns payload without filing, verifier blocks prevent publishing, not-connected returns connect_url, scheduling dispatches automatically, cancellation is idempotent, and acknowledge_surfaced is required when claims are surfaced. Annotations include destructiveHint=true, and the description aligns perfectly, adding rich context.
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 well-structured with clear sections (dry_run default, commit flow, preview requirements, scheduling, platform selection). It front-loads the most critical behavior (dry_run=true default) and maintains logical flow. While every sentence adds value, the length could be slightly reduced without losing clarity. Still, it is effectively organized.
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 complexity (7 parameters, destructive action, multiple edge cases like verifier blocks, not-connected accounts, scheduling, and idempotency), the description covers all aspects comprehensively. It explains response fields (status, resolved_cell, connect_url) even without an output schema. No gaps remain for an agent to safely invoke 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?
With 71% schema description coverage, the description adds significant meaning beyond the schema. For platform, it explains the preferred cell string format and family coercion. For idempotency_key, it clarifies it's required for commit and returns prior result. For scheduled_for, it specifies ISO-8601 future datetime and that long-form has no scheduled path. For acknowledge_surfaced, it details when it's required. The description compensates for schema gaps and enriches all 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 begins with 'Publish a single output to its platform', which clearly states the verb (publish) and resource (single output/draft). It distinguishes this from siblings like niche_draft_create and niche_draft_revise by focusing on the publish action. The detailed explanation of dry_run vs commit further clarifies the purpose.
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 provides explicit when-to-use and when-not-to-use guidance: defaults to dry_run=true for previewing; set dry_run=false with idempotency_key to commit; present preview to human before committing; handle verifier blocks by clearing them; handle not-connected social by sending user to connect. It also explains scheduling and cancellation, and prefers exact cell strings over family names. This covers all major usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_draft_reviseRevise a draftAInspect
Applies the values you pass to a specific output. Accepts any subset of the output's fields: caption, hashtags, or partial script updates (hook / body / cta / hook_tweet / body_tweets / title / subtitle / pull_quote / cover_slide / slides / cta_slide / alt_text). Pass apply_hook_variant_index to splice an existing hook_variants[N] into the live hook in one move without rewriting the rest. If you pass no editable field (or values identical to the current draft) it changes nothing and returns status:'no_change' naming the params that edit content. Angle and story changes still go back through niche_angle_propose; they invalidate the verifier trust block and need fresh generation.
Response includes a diff[] array listing every field that changed ({field, before, after}) so agents can show users the delta rather than the full new payload.
| Name | Required | Description | Default |
|---|---|---|---|
| caption | No | Replace the full caption (legacy field; same effect as setting `script.body` for LinkedIn, `script.caption` for Instagram). | |
| hashtags | No | Replace the hashtag list. Sanitized server-side (whitespace stripped, non-alphanumerics removed, case-insensitive dedup). | |
| output_id | Yes | ||
| slide_patches | No | linkedin_carousel only. Two modes, one per call (do not mix). In-place edit: {index, headline?, body?} patches a slide's text without resending the whole slides[] array, and re-renders just that slide. Structural op: {op, index, ...} reorders the deck, where op is 'move' ({op:'move', index, to_index}), 'insert' ({op:'insert', index, headline?, body?}; index may equal the slide count to append), or 'delete' ({op:'delete', index}). Structural ops keep the slide text and the rendered images in lockstep, preserving the cover and closing slides; an inserted slide is rendered automatically. Out-of-bounds index errors; passing slide_patches on a non-carousel output errors. | |
| script_updates | No | Partial updates to the output.script JSON. Shallow-merged: keys present here replace the matching fields, keys absent are preserved. Available fields depend on platform: linkedin {hook, body, cta, structure}; twitter {hook_tweet, body_tweets[], landing_tweet, single_tweet}; longform {title, subtitle, body, pull_quote}; instagram {hook, caption, alt_text}; linkedin_carousel {cover_slide, slides[], cta_slide}. | |
| regenerate_hooks | No | Generate this many fresh alternate opening lines for the output and return them as hook_variants for you to present. The body stays put. After the user picks one, splice it with apply_hook_variant_index. Metered like a short generation. | |
| apply_hook_variant_index | No | Splice an existing hook_variants[N] into the live hook. 0-indexed. Cheaper than rewriting the caption by hand. Errors if the index is out of bounds. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations readOnlyHint=false and destructiveHint=false indicate mutation but not destruction. The description adds behavioral details: no-change behavior with status, diff response, and that angle/story changes invalidate verifier trust block (though that's for another tool). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is detailed but well-structured: starts with core function, lists fields, then special behaviors. Every sentence adds essential info, though slightly verbose for some (e.g., slide_patches details could be shorter).
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 complexity (7 params, nested objects, no output schema), the description covers edge cases (no-change, slide_patches modes, hook variant splicing), response format (diff array), and relationship to sibling tools. Very 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 covers 86% of parameters. Description adds context: 'apply_hook_variant_index' is cheaper than manual edit, slide_patches has two modes (in-place vs structural) with warnings, and regenerate_hooks is metered. Provides meaning 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 clearly states the tool 'applies the values you pass to a specific output', naming specific fields (caption, hashtags, script_updates) and contrasts with niche_angle_propose for angle/story changes, distinguishing itself from 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?
Explicitly states when not to use the tool ('Angle and story changes still go back through niche_angle_propose'), explains the no-change case, and describes the diff response for user feedback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_intelligence_queryIntelligence queryAInspect
Niche (nicheangle.com) research and analysis: answer an analyst-shaped question over fresh-scanned sources and get an intelligence answer as the deliverable, not a single post. Use for: 'the 10 biggest developments in X this week', 'what's emerging before it goes mainstream', 'where is investment activity rising', 'find 3 non-obvious narratives to publish on LinkedIn'. The answer is the ranked slate plus engine-grounded narratives or patterns: every narrative cites real slate stories and is fact-verified by a second pass (no source, no narrative). This uses the same engine as the Niche web app, so both surfaces return the identical grounded answer; do not synthesize your own narratives over the slate, present these.
Non-blocking: returns a session_id immediately (under 2s). Poll niche_session_state every ~3-5s. At status == cp1_awaiting_story the ranked slate (stories[]) is ready; present it right away. Synthesis fills in a few seconds after the slate: if you requested it, keep polling while synthesis_pending == true; once false, synthesis[] holds the grounded narratives (or synthesis_shortfall_note). With synthesis:'none', synthesis stays null and synthesis_pending is false at cp1, so stop there. To turn a narrative into a post, pick its supporting story id and call niche_angle_propose; no new scan needed. Pass brand_id to thread a brand profile.
| Name | Required | Description | Default |
|---|---|---|---|
| lens | No | Ranking posture. 'mainstream' (default) = authority-weighted. 'emerging' = inverts saturation to surface low-coverage, pre-mainstream signal. 'investment' = lifts stories carrying funding/raise/round/term-sheet markers. | |
| count | No | How many developments / narratives to return (3-15). Default ~5-10. | |
| window | No | Recency window: '24h' | 'week' | 'month' | 'quarter' | 'year'. 'this week' maps to 'week'. Overrides the niche's default recency. A strong bias by default; pair with recency_strict for a hard cutoff. | |
| subject | Yes | The subject/space to investigate (2-200 chars). Specific is better. | |
| brand_id | No | Binds this brand's voice, colors, offer, and CTA to the piece. Omit to use your default brand; on a multi-brand account pass the slug explicitly so a post about one product is not bound to another brand's identity. niche_whoami lists your brands. | |
| platform | No | Optional publish target (linkedin / x / instagram) that shapes each narrative's publish_hook. | |
| synthesis | No | 'narratives' = N non-obvious publishable threads across the slate. 'patterns' = the named movement (pairs with lens:'investment'). 'none' (default) = ranked slate only, no synthesis. | |
| recency_strict | No | When true, `window` is a hard cutoff (out-of-window sources dropped before clustering) so 'nothing older than yesterday' is exact. Default false (bias only). Strict returns fewer, higher-confidence stories; use when precision matters more than breadth. | |
| source_quality | No | Source-quality filter (niche-relative). 'strict' drops uncorroborated single-source silos that aren't primary/official or a niche authority, for high-trust answers only. 'balanced' (default) down-weights weak sources without dropping. 'broad' surfaces everything (incl. low-coverage emerging clusters), authority as a tiebreaker only. | balanced |
| target_outputs | No | Optional. The draft cells produced if you later draft a narrative into content (same cell list as niche_signal_scan, e.g. ['linkedin:image_post', 'x:thread']). Without this, a draft defaults to a single 'long_form_article'. Set it when you know the surfaces you want, so niche_draft_create yields them directly instead of needing niche_add_output after. | |
| idempotency_key | No | Optional. Stable key so a retry reuses the original run instead of billing a second; an identical query fired while one is still running is auto-deduped regardless. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate openWorldHint=true and destructiveHint=false. The description adds significant behavioral context: it is non-blocking with immediate session_id return, requires polling, explains the two-phase process (slate, then synthesis), and notes fact-verification. It also states that both engine and web app return identical results. No contradictions with annotations. The description adds value beyond the structured fields, earning a 4.
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 relatively long but well-organized: opening with core purpose and examples, then detailing the async flow, then parameter-specific notes. It is front-loaded with key info (non-blocking, what to poll). While every sentence adds value, some details (e.g., 'Niche (nicheangle.com)') could be integrated more concisely. It is appropriately sized for the complexity, so a 4.
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 11 parameters and no output schema, the description must cover usage flow, polling, and return expectations. It does: session_id, polling interval, status 'cp1_awaiting_story', stories array, synthesis fields, and edge cases like synthesis:'none'. It also explains the non-blocking nature and idempotency. While it doesn't detail every possible response field (since no output schema), it provides enough context for correct invocation. Slight room for more on error handling, but overall complete for the task.
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?
Input schema has 100% description coverage, but the tool description enriches parameter meanings substantially. For example, it explains `lens` enum values in detail ('emerging' inverts saturation), `window` with mapping from 'this week' to 'week', and `idempotency_key` for billing dedup. It also links `brand_id` to `niche_whoami`. This goes well beyond the schema descriptions, providing actionable guidance, so a 5 is justified.
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 explicitly states the tool is for 'Niche research and analysis' to answer 'an analyst-shaped question' and provides concrete examples like 'the 10 biggest developments in X this week'. It clearly defines the deliverable as a ranked slate with narratives, distinguishing it from tools like niche_angle_propose by noting that narratives can be turned into posts using that sibling. This meets the 5-point standard of a specific verb+resource that differentiates from 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?
The description gives explicit 'Use for:' examples and warns 'do not synthesize your own narratives over the slate, present these.', which is a when-not instruction. It also explains when to use synthesis:'none' vs other values. However, it does not explicitly list alternative tools for related tasks (e.g., niche_signal_scan), only directing to niche_angle_propose for post creation. This is clear usage context but lacks explicit exclusions for all siblings, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_list_sessionsList sessionsARead-onlyInspect
Enumerate the user's recent sessions. Returns id, niche_input, status, outcome, target_platforms, picked story/angle ids, and created/updated_at for each. Use this when the session_id has been lost (across agent invocations, hours of work, etc.) or to find an in-flight session to resume. Returns newest-first.
Judge a terminal run by outcome, not raw status: a failed status is usually a walk-away, not an error. outcome ∈ {complete, expired (a slate was produced but nobody picked; re-open and choose), interrupted (a restart ended it, credits refunded; just re-run), cancelled (stopped on purpose), failed (a real error; see error_message), running}. (status_filter still matches the raw status value.)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max sessions to return (default 25, max 100). | |
| offset | No | Skip this many sessions before returning, for paging through history. Default 0. | |
| brand_id | No | Optional filter to sessions tied to one brand profile slot. | |
| status_filter | No | Optional status filter, e.g. 'cp1_awaiting_story', 'cp3_awaiting_review', 'complete', 'failed'. Omit for all. | |
| niche_contains | No | Optional case-insensitive substring filter on the niche input, to find sessions on a topic (e.g. 'walnut'). | |
| include_outputs | No | When true, also returns `recent_outputs`: the account's produced posts/images/reels across all sessions, newest first, each with its session_id, cell, a reachable asset_url, and publish state. Use it to locate a past asset (e.g. an image made on a prior run). Default false. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. Description adds valuable behavioral context: return order (newest-first), detailed outcome enum, and clarification about 'failed' status not always being error. No contradictions.
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?
Description is well-structured with two paragraphs: first explains when to use and basic returns, second gives detailed outcome guidance. Could be slightly trimmed, but overall concise and effective.
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 no output schema, description adequately covers return fields and outcome semantics. Given 6 parameters mostly self-documenting, the description provides sufficient context for effective tool selection and invocation.
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?
Input schema has 100% description coverage for all 6 parameters, so description does not need to add meaning. The description adds general output context but does not enhance parameter understanding beyond 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?
Description uses specific verb 'Enumerate' and resource 'user's recent sessions', lists return fields, and states use cases (lost session_id, find in-flight session). Clearly distinguishes from sibling tools like niche_session_state which targets a single session.
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 (lost session_id, find in-flight session) and provides guidance on interpreting outcome vs status. Lacks explicit when-not-to-use or direct alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_render_image_cardRender an image cardAInspect
Render a visual onto a post at CP3, or edit an existing image.
scope: 'full' (default) renders a new visual and requires background. 'recomposite' re-composites new text, color, or size over the retained background at no charge. 'restore' reverts to the prior image from history, at no charge. 'reframe' produces a per-platform aspect variant from the retained background, at no charge.
background (required for scope='full'):
• 'photo': a generated AI/photographic image with the headline composited over it. ~30 credits, ~30-90s, asynchronous: returns status='rendering_image_card'; poll niche_session_state (image_render.status: rendering, then done with static_urls on the output, or failed with credits refunded). A repeat call while a render is in flight is a no-op.
• 'design': a generated editorial graphic that draws the argument (concept diagram, stat, pull-quote, comparison), on-brand and legible. ~30 credits, asynchronous (poll as above).
• 'brand_color': a flat brand card with the headline on the brand's solid color with logo and wordmark. No generation, no credits, synchronous.
• 'svg': you author the card exactly as SVG markup (pass svg); the server rasterizes it to the cell's dimensions. Free, instant, deterministic. The right choice for data, labels, charts, and comparisons (where generated images fail at layout), and the only visual that works from a network-locked sandbox (SVG is text). The SVG owns the whole canvas; use brand colors and fonts from niche_whoami. Static shapes, paths, and text only (no scripts, external references, or foreignObject).
headline sets the bold header (defaults to the post's card_headline; auto-fits, not truncated). Idempotent: a prior render is replaced. Errors: render_not_ready before CP3; render_not_configured when image generation is unavailable; render_card_unavailable when background='brand_color' but the piece has no card-bearing platform.
| Name | Required | Description | Default |
|---|---|---|---|
| svg | No | Required when background='svg': the card's SVG markup as a string (<svg ...>...</svg>). You author the exact layout; the server rasterizes it to the cell's pixel dimensions. Use brand colors and fonts from niche_whoami to stay on-brand. Bundled fonts (set font-family to any by name; an unknown family or the generics 'sans-serif'/'serif'/'monospace' fall back to a real font so text always draws): sans (Inter, Geist, Open Sans, Montserrat, Lato, Poppins, DejaVu Sans), serif (DejaVu Serif, Lora, Playfair Display), mono (DejaVu Sans Mono, JetBrains Mono). Allowed: static shapes, paths, text, gradients, internal (#id) and inline data: references. Rejected with a named error: scripts, event handlers, foreignObject, external/file references, and DOCTYPE/ENTITY declarations. Max 512KB. | |
| cell | No | Optional. Render at the canvas size for this cell: • linkedin:image_post: 1200×627 (1.91:1 landscape) • x:image_post: 1200×675 (16:9 landscape) • instagram:image_post: 1080×1350 (4:5 portrait) • linkedin:carousel / instagram:carousel: 1080×1080 (cover slide) When omitted: 1080×1080 universal-square asset stored under platform='image_card' (shared across all image cells). | |
| scope | No | 'full' (default): render a new visual (background required). 'recomposite': free text edit on the existing image, with new headline/subhead/color/size composited over the retained background, pixels otherwise identical, synchronous, 0 credits. Use this for wording iteration; it avoids paying a re-render to change words. 'restore': bring back the prior image from history, free. 'reframe': free per-platform aspect variant that re-composites an existing card's retained background at the `cell`'s canvas size (x 16:9, instagram 4:5, linkedin 1.91:1), same text and grounding, synchronous, 0 credits. Requires `cell` (the target aspect). | |
| subhead | No | The smaller line under the header. On scope='full' it sets the subhead in the single render; on scope='recomposite' it edits it for no charge. Omit to keep the current one; pass '' to clear it. | |
| headline | No | The bold header words; works for both backgrounds. Defaults to the post's `card_headline` (the short, sized-for-the-box line). Pass this to force exact text, e.g. a brand name leading it ('Acme drew a line'). It auto-fits the box and is never truncated. | |
| font_size | No | Headline size. A relative word ('bigger'/'smaller'/'reset') steps from the current size and compounds; an absolute value (a number like 80, '80px', or '120%') sets it directly. Applies on scope='full' and scope='recomposite'. The response's font_changed/font_at_limit report whether it actually moved. | |
| background | No | Required for scope='full' (ignored otherwise): what's behind the text. 'photo' = a generated AI/photographic image (the actual picture; ~30 credits, ~30-90s, async). 'design' = a generated editorial design graphic that draws the argument (concept diagram / stat / pull-quote / comparison / method / abstract), on-brand and legible, no photo, no clichés, ~30 credits, async. 'brand_color' = a free, instant flat brand card (no generation). 'svg' = a free, instant card you author exactly as SVG markup (pass `svg`), rasterized at the cell's size; best for data, labels, and charts, and the only visual that works from a network-locked sandbox. No default: choose deliberately. | |
| session_id | Yes | Session UUID that's reached cp3_awaiting_review or complete. | |
| text_color | No | Text color as a name ('blue') or hex ('#ec4899'). Applies on scope='full' (set the color in the render) and scope='recomposite' (re-color for no charge). On background='brand_color' it colors the card text; omit to auto-pick a legible color from the background. | |
| design_color | No | Optional, background='design' only: manual color control. Free text ('blue', 'navy accent', '#0a3d62'). Overrides the accent for the design card; the rest stays on the brand's palette (or the default style when the brand has no kit set). Omit to use the brand's own accent. | |
| art_direction | No | Optional free-text direction for a generated photo background (applies only when background='photo'). State the visual concept and any negatives, such as subjects or styles to avoid. Without it the background is generated from the story alone and tends toward category clichés (e.g. a robot for 'AI'); use this to steer toward a specific concept or an abstract, non-literal composition. The no-in-image-text rule still applies. | |
| estimate_only | No | If true, return {credit_cost} without rendering or spending. Use to learn the cost before committing. | |
| text_position | No | Where the overlay sits: 'top', 'center', or 'bottom'. On scope='full' it places the text in the render; on scope='recomposite' it moves the text on the existing image for no charge. Omit to keep the position the card was rendered at. | |
| design_concept | No | Optional, background='design' only: free-text art direction for the design graphic, the layout/shape and concept (e.g. 'a 2-column comparison', 'an abstract composition, no literal imagery', 'a concept diagram of intended vs actual'). Omit to let the designer pick the shape that best carries the argument. | |
| background_color | No | The background colour of a SOLID brand card (background='brand_color') as a name ('cream'/'navy'), a hex, or a brand keyword ('primary'/'accent'/'secondary'). Applies on scope='recomposite' for no charge and persists, so the colour does not snap back to the brand default on a later edit. (A generated-photo card recolours its text, not its photo background.) | |
| needs_legible_text | No | scope='full', background='photo' only. Set true when in-image text is genuinely the subject of the scene, which routes the render to a text-capable image generator. Defaults false (an atmospheric, text-free background, the usual choice). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate read=false, destructive=false. The description adds critical context: async behavior for 'photo'/'design' backgrounds (polling needed), credit costs, idempotency (repeat call no-op), error states, and synchronous/free alternatives. This fully compensates for the sparse 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?
The description is long but well-structured with clear headings for scopes and background types. Each sentence earns its place given the tool's complexity. A small amount of redundancy (e.g., repeating 'free, instant' for brand_color and svg) is acceptable for clarity.
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?
No output schema exists, so the description must compensate. It explains that async scopes return a status to poll, mentions error conditions, and describes credit costs. It does not detail every return field but provides sufficient guidance for an agent to handle 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 coverage is 100%, so baseline is 3. The description adds significant extra meaning: for each parameter it explains when it is required, effects, default behaviors, and interaction with scope. For example, 'background' details each enum option's cost, synchrony, and use cases. This elevates beyond the bare 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 ('Render') and resource ('image card'), and clearly distinguishes four scopes ('full', 'recomposite', 'restore', 'reframe') that cover creation, editing, reverting, and aspect variation. This differentiates it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use each scope ('full' requires background, 'recomposite' for free text edits, etc.) and when not to (e.g., errors like render_not_ready before CP3). It also provides alternatives through the background parameter options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_render_reelRender a reelAInspect
Render a 9:16 vertical reel for a session at CP3. A per-beat script (typically 4-7 beats) is composited into one video: stills, voiceover, motion, caption overlays, and an endcard (~30-120s). Reels are delivered as a downloadable file for the user to publish.
scope: 'full' (default) renders a new reel. 'recomposite' re-renders presentation only (captions on/off, caption_sync_mode, endcard text) from the retained footage at no charge. 'endcard' is the same, limited to the endcard. 'beat:N' re-renders a single beat's still (optional beat_direction), charged for that one image; everything else is reused.
Idempotent on the video output: a prior render is replaced.
Options: captions_enabled (default true) overlays per-beat captions; music_enabled (default false) mixes background music under the voiceover; tone shapes the script (default | punchy | direct | reflective), with reel_direction for free-form direction beyond those words; length or target_duration_sec set the runtime target; music_direction shapes the music; voice picks the voiceover voice; endcard_mark chooses the endcard brand mark; needs_legible_text forces a text-capable still generator; caption_sync_mode (default 'phrase') reveals captions phrase-by-phrase in sync with the voiceover at no extra cost, and is ignored when captions_enabled is false.
Errors: 503 if reel rendering is unavailable; 400 before CP3; 422 if the script is unusable. Cost: ~350 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| cell | No | Optional. Cell to tag the rendered Output row (linkedin:reel / x:reel / instagram:reel). All reels are 9:16 1080×1920 universal, so cell only affects bookkeeping, not pixels. When omitted: stored under platform='video' (shared across all reel cells). | |
| tone | No | Script tone hint (scope='full'). Default 'default'. For direction beyond these four, use reel_direction. | |
| scope | No | 'full' (default): render a new reel (script plus stills plus voiceover, ~350 credits). 'recomposite': re-render presentation from the retained footage (captions on/off, caption_sync_mode, endcard_text/endcard_outro), at no charge, async. 'endcard': the same, limited to the endcard (endcard_text/endcard_outro/endcard_mark; use 'recomposite' to change captions). 'beat:N': re-render shot N's still (1-based, optional beat_direction and motion), ~15 credits; everything else is reused. Script changes (tone, voiceover words, music) require scope='full'. Partial scopes require a reel whose footage was retained, otherwise the response indicates scope='full' is needed. | |
| voice | No | scope='full': voiceover voice for this render, overriding the brand kit's saved preference just this once. Use 'auto', 'male', or 'female', or a short hint like 'a warm female narrator'. | |
| length | No | scope='full': total runtime target the script is budgeted to hit. 'short' ~10-15s, 'standard' ~15-22s, 'long' ~25-40s. For an exact number of seconds, use target_duration_sec instead. | |
| motion | No | scope='beat:N': the Ken Burns motion for the re-rolled shot ('zoom-in', 'zoom-out', 'static', or a plain steer like 'slow push-out'). Overrides that shot's existing motion. Omit to keep the current motion. | |
| session_id | Yes | Session UUID that's reached cp3_awaiting_review or complete. | |
| endcard_mark | No | Which brand mark stamps the endcard for this render, overriding the brand kit's saved preference just this once (e.g. end on the logo, not the name). Honored on scope='full', 'recomposite', and 'endcard'. Falls back to the brand name text when the chosen asset is not set on the kit. | |
| endcard_text | No | scope='recomposite'/'endcard' only: the big endcard words (replaces the brand stamp text). Omit to keep the current endcard. | |
| endcard_color | No | The endcard background color, a name or hex ('navy', '#0a3d62'), overriding the brand color on the closing frame just this once. The endcard text re-resolves to stay legible on it. Honored on scope='full', 'recomposite', and 'endcard'; ignored on 'beat:N'. | |
| endcard_outro | No | scope='recomposite'/'endcard' only: the smaller endcard line under the mark. Omit to keep the current one; pass '' to clear it. | |
| estimate_only | No | If true, return {credit_cost} without rendering or spending. Use to learn the cost before committing. | |
| music_enabled | No | Mix background music behind the voiceover. Default false. | |
| beat_direction | No | scope='beat:N' only: optional plain-language steer for the re-rolled shot ('warmer light, no people'). Omit for a fresh take on the same brief. | |
| reel_direction | No | scope='full': free-form creative direction applied alongside tone, for steers the four tone words do not cover (pacing, narrative shape, mood), e.g. 'courtroom-drama narration, build to a reveal'. The free-form sibling of tone. | |
| music_direction | No | scope='full': free-form style, genre, and tempo for the background music, e.g. 'calm lo-fi, no vocals'. Supplying it turns music on for this render. Music is generated audio, so a free re-render or shot re-roll cannot change it. | |
| captions_enabled | No | Overlay caption text on each beat. Default true. With scope='recomposite': omit to keep the reel's current setting. | |
| caption_sync_mode | No | How captions track the voiceover. 'beat' (default): each beat's caption shows for that beat's spoken window. 'phrase': the caption reveals phrase-by-phrase in lockstep with the spoken words (caption text is taken from the spoken VO). Ignored when captions_enabled is false. No extra cost. | |
| needs_legible_text | No | scope='full': force the text-capable still generator for every shot, for a reel whose stills carry readable words. Default false lets each shot pick the best generator on its own. | |
| target_duration_sec | No | scope='full': exact total runtime target in seconds (8 to 45). Wins over `length`. The script budgets each beat to land near this total; the delivered duration can vary by a second or two. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, destructiveHint=false), the description adds that the tool is idempotent on video output (replaces prior render), specifies cost (~350 credits), and lists error codes. It explains what each scope does and what is reused, providing clear behavioral context.
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 lengthy due to complexity but well-structured. It front-loads the core purpose and scope, then details options, errors, and cost. Every sentence adds value, though minor trimming could improve conciseness.
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 20 parameters and no output schema, the description covers purpose, scope, options, errors, cost, and behavioral traits. It lacks explicit output format details (e.g., download URL), but overall provides sufficient context for an agent to use 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?
With 100% schema coverage, baseline is 3. The description adds context by explaining scope behaviors, the difference between 'length' and 'target_duration_sec', and that 'caption_sync_mode' is ignored when captions disabled, adding meaning 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 clearly states the tool renders a 9:16 vertical reel at CP3, listing components (stills, voiceover, etc.) and duration range. It distinguishes from sibling tool niche_render_image_card, which renders image cards.
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 details scope options ('full', 'recomposite', 'endcard', 'beat:N') with clear conditions for each, including when script changes require 'full'. It provides context on when to use each scope, but does not explicitly exclude other tools for alternative tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_reuse_assetReuse an image across cellsAInspect
Copy an image that already exists on one output onto another cell, instant and free (no regeneration, no credits). Use this when the user wants 'the same image' on a second surface ('use the LinkedIn image on X', 'same picture on the newsletter') instead of niche_render_image_card (which generates a new image and costs credits).
Both cells must already exist on the session (add the target via niche_add_output first if needed) and the source must have a rendered image. Copies the source's static_urls onto the target so it publishes with that image. Idempotent: source==target is a no-op.
| Name | Required | Description | Default |
|---|---|---|---|
| to_cell | Yes | Cell to copy the image onto (e.g. 'x:image_post'). | |
| from_cell | Yes | Cell that has the image (e.g. 'linkedin:image_post'). | |
| session_id | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the operation is instant, free, copies static_urls, and is idempotent. Aligns with annotations (readOnlyHint=false, destructiveHint=false) and adds important detail beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise at ~100 words, front-loaded with purpose, then usage, then behavior. Each sentence adds value with 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?
Given the simplicity of the tool (3 params, no output schema), the description covers purpose, usage context, prerequisites, behavior, and idempotency. Adequate for an agent to select and invoke 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 covers 2 of 3 parameters with descriptions. The description adds context: from_cell must have rendered image, to_cell must exist, and suggests using niche_add_output if needed. Compensates for missing session_id 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?
The description clearly states the tool copies an existing image between cells, distinguishing it from niche_render_image_card which generates new images. The verb 'reuse' and resource 'image across cells' are specific and distinct from 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?
Provides explicit guidance: use when user wants the same image on another surface, not when a new image is needed (alternative named). Also includes prerequisites like cells must exist and source must have a rendered image.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_session_cancelCancel a sessionADestructiveInspect
Cancel a running session. Marks status=failed with an error_message ('cancelled by user' or the caller's reason), and stops the in-flight orchestrator if any.
Used when you want to free a slot under the concurrent-session cap without deleting the session (history and audit trail preserved). Use the REST DELETE endpoint if you want a hard archive cleanup that also wipes outputs.
Idempotent: cancelling a completed / already-failed session returns its current state unchanged.
Credits: the unused hold is released; work already committed (e.g. the discovery for a story you picked) stays charged, so cancelling does not refund committed work. A pre-CP1 cancel (nothing committed yet) is effectively free. A full refund applies only to an actual run failure.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional. Surfaced as session.error_message. | |
| session_id | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond annotations by detailing idempotency, credit release/refund policies, and that committed work remains charged. Annotations only indicate destructiveHint=true; description adds critical behavior context.
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?
Multiple sentences but each adds value. Front-loaded with purpose, then behavioral details, usage guidance, and credit policy. Could be slightly more compact but is well-organized.
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 important aspects: state change, orchestrator stop, slot freeing, idempotency, credit behavior. No output schema exists, but description addresses return value implicitly via state effects.
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 has 50% description coverage (only 'reason' has a brief description). The description adds that 'reason' is surfaced as session.error_message and defaults to 'cancelled by user', providing additional semantic value.
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 clearly states 'Cancel a running session' and explains the effect (marks status=failed, stops orchestrator). It distinguishes from hard deletion via REST DELETE, making the purpose 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?
Explicitly states when to use: 'to free a slot...' and contrasts with DELETE endpoint. Provides clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_session_exportExport a sessionARead-onlyInspect
Export a session as a structured calendar artifact preserving session_id and per-story story_id traceability. Use after a niche_signal_scan when you want a metadata-rich content backlog instead of running individual pieces end-to-end. Outputs a standard editorial-calendar shape suitable for content-backlog and planning workflows.
Two formats: • markdown: human-readable and agent-citable. Session metadata at top (session_id, niche, scan timestamp, and brand_profile_active state). Then a card per story with title, headline_candidate, summary, recency_score, publication_breakdown, source_breakdown, and empty slots for the user to fill (Frame, Hook, Article-shape, Ship Order). Followed by a 'recommended ship order' section and cross-cutting notes. • json: structured shape ready to pipe to other tools or load into a notebook. Same data, machine-shaped.
Preserves story_id and session_id traceability so you can come back in N weeks and re-run niche_angle_propose / niche_draft_create against the same stories with the same brand profile bound. The artifact is the entry point to a calendar-builder workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output shape. Default markdown. | markdown |
| session_id | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint. The description adds behavioral context: it preserves traceability, outputs a standard editorial-calendar shape, and details the two formats. No contradictions.
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 a concise summary, then structured into when-to-use, format details, and traceability benefits. Every sentence adds value; 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 no output schema and two parameters, the description fully explains the tool's purpose, usage, output formats, and traceability. It is complete for the tool's complexity.
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 50%; the description extensively explains the 'format' parameter with details on markdown and json outputs, and implies 'session_id' usage through traceability discussion. Adds significant value beyond 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 clearly states the verb 'export' and the resource 'session', with specific details like preserving session_id and story_id traceability. It distinguishes from siblings by indicating its use case after niche_signal_scan.
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: 'Use after a niche_signal_scan when you want a metadata-rich content backlog instead of running individual pieces end-to-end.' It does not explicitly list when not to use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_session_revertRevert a session checkpointADestructiveInspect
Revert a session back to an earlier checkpoint. Use when the user (or you) decided the picked story / angle isn't the right one and you want to re-pick without starting a new scan.
to='story': cancels current generation, returns to CP1_AWAITING_STORY with the same ranked stories list. Clears selected_story_id and selected_angle_id. to='angle': returns to CP2_AWAITING_ANGLE with the same angles list. Clears selected_angle_id only.
Idempotent: reverting a session already at the target checkpoint returns the current state unchanged.
Safety: reverting a finished run (cp3/complete) discards its paid-for drafts. The first call returns status='confirm_discard' with the count instead of reverting; pass acknowledge_discard=true to actually proceed. Credits: the discarded drafts are not refunded (the generation already ran), and re-picking re-runs and re-charges content generation. Revert to change direction, not to reclaim spend.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| session_id | Yes | ||
| acknowledge_discard | No | Required to revert a cp3/complete session; confirms you accept discarding its finished, paid-for drafts. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behaviors beyond annotations: it is idempotent ('reverting a session already at the target checkpoint returns the current state unchanged'), destructive (discards paid-for drafts), and requires acknowledgment for finished runs. The credit implications are also mentioned. Annotations already indicate destructiveHint=true, but the description adds valuable context.
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 concise with a clear structure: purpose, usage, parameter behavior, idempotency, and safety. Each paragraph adds distinct information. It could be slightly shorter, but no unnecessary 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?
Given the tool's complexity (3 parameters, no output schema), the description covers state transitions, side effects, and safety mechanisms. It explains the two revert targets and the discard confirmation flow. While exact return format is omitted, the description is sufficient for correct invocation.
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%, but the description adds meaning for the 'to' parameter by explaining the two enum values and their consequences. For 'acknowledge_discard', it clarifies the requirement for cp3/complete sessions. The 'session_id' parameter is not elaborated, but overall the description compensates well for low 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 clearly states the tool's function: 'Revert a session back to an earlier checkpoint.' It specifies the two targets ('story' and 'angle') and their effects, distinguishing it from related tools like niche_session_cancel or niche_session_state. The mention of 're-pick without starting a new scan' adds clarity.
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 explicitly states when to use: 'when the user (or you) decided the picked story / angle isn't the right one and you want to re-pick without starting a new scan.' It provides context for both 'to' options and highlights the safety workflow for reverting finished runs. It does not explicitly exclude other scenarios but offers sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_session_stateRead session stateARead-onlyInspect
Universal poll endpoint: read the full current state of a session. Returns status, ranked stories, picked story_id, generated angles, picked angle_id, draft outputs (with trust fields), and an elicitation hint for whatever decision is next. Call this whenever you need to check progress; it's safe and cheap.
Each story includes title, summary, headline_candidate (the post-shaped headline distinct from the cluster title), recency_score, relevance_score, freshness_label, and the publication_breakdown of contributing outlets (provenance). Each story also carries a recommended_story_id plus recommendation_reason before a pick. Each draft output's trust data lives under outputs[i].trust.* (verifier_blocked_reason, source_faithfulness_score, source_ungrounded_claims, source_diversity_passed, source_recency_passed, source_distinct_count, plus a flags[] array with explicit severity and source_grounding_map). The output top level does not mirror these; read them from .trust.
Response also includes phase (high-level: scanning / drafting / filed / spiked / awaiting), phase_message (a rotating gerund, e.g. 'Reading 337 signals'), and phase_hint (a one-line agent-facing tooltip with a typical timing band, e.g. 'Clustering, usually 8-15s, no action needed'). The full 17-status state machine is enumerated under status_glossary so you can introspect what every state means without discovering it experimentally. For a terminal run, read outcome (complete / expired / interrupted / cancelled / failed) rather than the raw status: a failed status is usually an expired walk-away (a slate was produced) or a refunded interruption, not a real error.
Recommended loop: kick off work, then one niche_session_state(wait:30, wait_until:'checkpoint') per stage. It sleeps through the noisy transient statuses (clustering, ranking, generating_*) and wakes only at the next actionable stop (cpN_awaiting_* / complete / failed), or when an async render settles. So a full run is one wait per checkpoint, not several wakes per stage. (wait_for is an accepted alias for wait_until.) The wait plus since_status long-poll (wait_until:'change', wakes on any status change) is also supported; prefer 'checkpoint'. Each status' actionable flag in status_glossary[] indicates which states a 'checkpoint' wait wakes for. Avoid polling every few seconds without wait, which may be rate-limited (HTTP 429).
niche_story_search is an accepted alias for this tool.
Response shape is sparse by default: after a story is picked, only the picked story is returned (not all candidates); same for angles. Set include_unpicked=true to get the full candidate set, useful when revising to a different story or angle. A sparse_mode field in the response reports how many items were dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | `status` (lean): a few-hundred-byte control envelope of status, phase, picked ids, `content_versions` (per-section change counters), `counts`, `output_ids`, cost, and next_step. Use this for the poll loop. `full` (default): the complete state with stories/angles/outputs. Fetch `full` once when a content_version moves, rather than re-shipping the full state every poll. Pairs with wait plus since_status. | full |
| wait | No | Long-poll for up to N seconds (0-30) waiting for the session state to change. Returns immediately if the state already differs from `since_status` (or if the session is awaiting a checkpoint / complete / failed). Drops agent token burn from N polls to 1 wait. Default 0 (no wait, behave as before). | |
| wait_for | No | Alias for `wait_until` (same values and semantics). Use either; if both are set, `wait_until` wins. An unrecognized value is rejected (not silently ignored), and it only takes effect with `wait` > 0. | |
| session_id | Yes | session_id from niche_signal_scan. | |
| wait_until | No | What the `wait` long-poll resolves on. `change` (default): any status change vs since_status, a reached checkpoint, or a status-less change (synthesis fill, render completion, new output). `checkpoint`: only an actionable checkpoint (cpN_awaiting_* / complete / failed), skipping the noisy intermediate cpN_generating and generating_* transitions, so you get one wake per checkpoint. `render`: a reel/image render marker settles (done|failed). Use this after niche_render_reel / niche_render_image_card, since a render leaves status unchanged and won't wake a `change` wait on status alone. Works on a session already at complete (the normal case, since renders are post-completion add-ons): the wait holds on the render marker, not the session status. `synthesis`: a niche_intelligence_query's synthesis lands (narratives or a shortfall_note). Synthesis filling is not a status change, so block on this in one call instead of busy-polling. | change |
| since_status | No | Used with `wait` (wait_until='change'). The status the caller last saw; the wait returns as soon as session.status differs. If unset, any state-change event wakes the wait. Note the pipeline has paired vocabulary: a transient `cpN_generating` (checkpoint about to produce) and a `generating_*` work status (e.g. cp2_generating maps to generating_angles). To skip both and wake only at the next actionable stop, use wait_until='checkpoint' rather than chasing since_status through the intermediates. | |
| include_unpicked | No | When true, return the full candidate set even after picks have been made. Default false (sparse: only the picked story / angle come back). Meaningful only with view='full'; ignored in view='status' (the lean envelope never carries the candidate slate). | |
| include_status_glossary | No | When true, response includes `status_glossary[]`, the full 17-status state-machine descriptor list with phase, hint, and `actionable` (whether a wait_until='checkpoint' wakes for it) per status. Useful on the first call of an agent session so the agent caches the full map; leave false on subsequent polls. Default false. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description explains that it is safe and cheap, details the return state (including sparse mode), and elaborates on the behavior of wait and wait_until parameters, including rate-limit warnings. It fully discloses the state machine and provides a status glossary.
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?
Although long, the description is well-structured and front-loaded with the core purpose. Each paragraph adds essential information without redundancy, and bullet points make key details scannable. Every sentence earns its place given the tool's complexity.
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 complexity (8 parameters, state machine, no output schema), the description covers all necessary aspects: return fields (including nested trust data), status glossary, poll loop recommendations, and parameter interactions. It is complete enough for an agent to use 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?
With 100% schema coverage, the description still adds significant value: it explains the purpose of each parameter in context (e.g., view='status' for lean polling), clarifies aliases (wait_for for wait_until), and provides usage guidance (include_unpicked only with view='full').
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 clearly states it is a 'Universal poll endpoint' that reads the full current state of a session, with a specific verb (read) and resource (session state). It distinguishes itself from sibling tools by being a safe, cheap poll endpoint used for checking progress.
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 explicit when to use ('Call this whenever you need to check progress'), recommends a poll loop with wait, and describes when to use view='status' vs 'full'. Also notes the alias niche_story_search and warns against rate limiting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_signal_scanDiscover stories (signal scan)AInspect
Niche (nicheangle.com) story discovery: find stories worth writing about, then draft and publish platform-native social content (LinkedIn, X threads, Instagram, newsletter) from them. This is story discovery, not content generation: Niche reads primary sources, separates signal from noise, and clusters it into a ranked story slate with provenance, the editorial-intelligence step before any writing. Returns a session_id plus initial status; poll niche_session_state with the session_id until status is cp1_awaiting_story to read the slate.
Brand profile: pass brand_id to bind this run to a persisted brand profile (set via niche_brand_profile_set). The profile's voice, lexicon, framing, channel config, and verifier overrides thread through every downstream stage. Pass profile_overrides alongside brand_id to deep-merge a one-time deviation onto the persisted profile (logged on the session, not stored). The effective profile is snapshotted at scan time; later updates to the persisted profile don't affect in-flight runs.
| Name | Required | Description | Default |
|---|---|---|---|
| niche | Yes | Niche / beat description (2-200 chars). Specific is better. | |
| density | No | How tightly to pack visual formats (carousels especially). • minimal: split a dense argument across more, shorter slides; favors skimmability. • balanced (default): the standard per-slide caps. • essay: permissive; allows longer slides/sections. Over-cap slides auto-split on sentence boundaries (never mid-sentence); over-280 tweets split into a chain regardless. | balanced |
| recency | No | Optional recency window that constrains discovery to fresh sources. One of '24h' | 'week' | 'month' | 'quarter' | 'year' (aliases: 'today'/'day'→24h, 'this week'→week, etc.). Use '24h' for 'today only / breaking'. Putting the demand in the niche string does not constrain recency; use this param. Omit to use the niche's default window. | |
| brand_id | No | Binds this brand's voice, colors, offer, and CTA to the piece. Omit to use your default brand; on a multi-brand account pass the slug explicitly so a post about one product is not bound to another brand's identity. niche_whoami lists your brands. | |
| estimate_only | No | When true, return the discovery credit cost without starting a run or holding a reservation. Use it to quote a price before committing. | |
| recency_strict | No | When true, `recency` is a hard cutoff: sources outside the window are dropped before clustering, so 'nothing older than yesterday' is honored exactly. Default false: the window is a strong bias but older corroborating sources can still attach to a fresh cluster. Set true when exactness matters more than slate depth (strict can thin the slate). | |
| source_quality | No | How aggressively to filter the slate on source quality (niche-relative; never penalizes a small publication that is the authority for the niche). • strict: drop uncorroborated single-source silos that aren't a primary/official or a niche authority; surfaces only well-sourced stories. Can thin the slate. • balanced (default): down-weight weak sources, don't drop. • broad: surface everything, including low-coverage emerging clusters, with authority as a tiebreaker only. Use strict for a high-trust brief, broad to scout early signal. | balanced |
| target_outputs | No | Output cells to generate (platform×content_type matrix). Each cell is a 'platform:content_type' string or a cross-platform content type. Valid cells: • linkedin:text_post: short LinkedIn post (text only) • linkedin:image_post: LinkedIn post plus 1.91:1 image card • linkedin:carousel: multi-slide carousel • linkedin:reel: LinkedIn-native vertical video • x:single_tweet: standalone tweet • x:thread: multi-tweet thread • x:image_post: tweet plus 16:9 image card • x:reel: tweet plus 9:16 video • instagram:image_post: caption plus 4:5 image card • instagram:carousel: multi-image swipe • instagram:reel: caption plus 9:16 reel • long_form_article: universal essay (Substack/blog) A bare platform name also works and maps to that platform's default cell: 'x'/'twitter'→x:thread, 'linkedin'/'li'→linkedin:text_post, 'instagram'/'ig'→instagram:image_post, 'longform'→long_form_article. The resolved cells are echoed back as target_outputs. Defaults to ['linkedin:text_post']; request only the cells you need (each additional cell adds generation cost). | |
| idempotency_key | No | Optional. A stable key for this logical scan: a retry with the same key reuses the original run instead of starting (and billing) a second. Even without it, an identical scan fired while one is still running is auto-deduped. | |
| thinking_budget | No | Agent-side polling control. A full editorial workflow is structurally 15-20 tool calls (scan, poll, poll, poll, pick, poll, pick, poll, read). Use this to tune how many of those calls collapse into single waits. • fast: scan blocks briefly (up to ~45s, under the tool-call timeout) for CP1 and returns the stories inline when they land in time. One call instead of many polls. Cheaper agent tokens, smaller cognitive surface. If CP1 isn't ready by the cap it still returns the session_id (status=discovering); poll niche_session_state from there, the run is never lost. Pick when you just want stories and the user is waiting. • balanced (default): scan returns immediately with session_id; the agent polls niche_session_state (with wait plus since_status long-poll). | balanced |
| target_platforms | No | Optional. A flat platform list (linkedin, linkedin_carousel, twitter, longform, instagram), coerced into target_outputs cells. Prefer target_outputs. | |
| profile_overrides | No | Optional. Deep-merge these overrides onto the persisted profile for this run only. Use case: same brand, different register for a specific piece (e.g. a product-launch voice over an editorial one). Requires brand_id. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully discloses the tool's behavior: it starts a long-running process, returns a session_id and initial status, and requires polling. It also explains that the brand profile is snapshotted at scan time, that profile_overrides are deep-merged, and that estimate_only returns cost without starting a run. This aligns with annotations (readOnlyHint=false, openWorldHint=true) and adds detail beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed and well-structured, starting with a clear purpose, then explaining process, then parameter details. While it is lengthy, the complexity of the tool (12 parameters, nested objects, workflow) justifies the length. It is front-loaded with the key purpose and process.
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 complexity (12 parameters, long-running process, integration with brand profiles and polling), the description covers the workflow thoroughly. It explains the lifecycle (scan → poll → read slate), the role of brand_id and profile_overrides, and how to use estimate_only for cost estimation. No output schema exists, but it describes the return values (session_id and status) and directs the agent to poll niche_session_state.
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 12 parameters have schema descriptions (100% coverage), so the baseline is 3. The description adds significant value beyond the schema by explaining the interaction between brand_id and profile_overrides, the behavior of recency_strict, the effect of estimate_only, and the polling behavior of thinking_budget. This justifies a higher score.
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 clearly states 'story discovery' and distinguishes from content generation. It specifies the tool's role as the 'editorial-intelligence step before any writing.' The verb 'discover' and the explanation of returning a session_id and polling differentiate it from sibling tools like niche_draft_create or niche_angle_propose.
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 explains when to use this tool (story discovery) and provides context for brand profile usage and downstream polling. It implies that for content generation, other tools should be used. However, it does not explicitly exclude use cases or mention alternatives like niche_angle_propose for angle generation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_voice_profile_ingestIngest a voice profileAInspect
Extract voice primitives (register / sentence rhythm / lexicon preferences / punctuation habits) from post-shaped text and persist onto the user's VoiceProfile. The voice primitives thread into content generation so generated copy matches the user's actual writing voice.
Two input shapes: pass posts (list of pre-collected text snippets, ≥80 chars each) or pass url (the server scrapes post-shaped snippets from the page: Substack / Medium / blog / X profile). Inline posts win when both are given. Inline post-shaped snippets need to be the user's own writing, not press articles or marketing copy.
Returns the extracted primitives + a diff of what changed on the stored VoiceProfile.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to scrape post-shaped text from. Substack / Medium / blog homepages work best; X / LinkedIn profile pages are supported but yield less per-snippet text. | |
| posts | No | Post-shaped text snippets the user wrote. ≥80 chars each; 3-10 snippets is the sweet spot for primitives extraction. | |
| brand_id | No | Which brand's voice to ingest into. Voice is brand-scoped: omit for the default brand, or pass a brand_id (from niche_brand_profile_get) to set up that brand's voice without touching another brand's. A brand with no voice of its own falls back to the default voice at generation time. | |
| archetype | No | Optional label for how the profile was acquired; tags the VoiceProfile.archetype field. Defaults to 'agent_ingest'. | agent_ingest |
| overwrite | No | Whether to replace an existing VoiceProfile. Default false: first run wins, subsequent runs are no-ops unless explicitly opted in, so an automated re-run does not overwrite a hand-curated voice. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral details beyond annotations: explains overwrite behavior (no-op on re-run unless overwrite=true), brand-scoping and fallback, and the threading into content generation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences plus a clarifying paragraph on input shapes. Every sentence adds value, no redundancy. Well-structured for quick comprehension.
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?
Despite no output schema, description explains return values (extracted primitives + diff). Covers repeated call behavior, brand fallback, and connection to generation. Complete for agent decision-making.
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 description adds significant meaning for each parameter: url best sources, posts length and count, brand_id scope/fallback, archetype tagging, overwrite default behavior. Greatly enhances schema explanations.
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 clearly states the tool extracts voice primitives and persists them to a VoiceProfile, with specific verbs (extract/persist) and resource. It distinguishes from sibling tools like niche_brand_profile_get/set by focusing on voice profile ingestion.
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 describes two input shapes (posts or url), when each is appropriate, and how conflicts are resolved. Does not directly compare to sibling tools, but purpose is unique enough that usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
niche_whoamiWho am I (account + capability map)ARead-onlyInspect
List the full tool catalog and orient the agent, in one read-only call. Returns every registered tool name and the live tool count, the account (plan and credit balance), a capability map (tools grouped into bands: discover, decide, draft, render, publish, brand, session, plus the recommended flow), and the brand state (whether a brand profile, kit, or voice will personalize output). Call it first to discover what's available, plan a session, and check credits before spending.
| Name | Required | Description | Default |
|---|---|---|---|
| include_test | No | Include scratch and experimental brand slots in available_brands. Default false so only real brands are listed and an agent does not bind a throwaway by accident. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses it is a read-only call, lists exact return data (tool names, count, account info, capability map bands, brand state). Annotations already mark readOnlyHint=true and destructiveHint=false; description adds valuable context about response structure and preconditions.
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?
Description is well-structured with front-loaded purpose and detailed breakdown of returns. Slightly long but each sentence adds value; could be trimmed slightly for conciseness.
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 role as an orientation tool with no output schema, the description comprehensively lists all returned components (catalog, account, capability map, brand state). No gaps for effective agent invocation.
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% with one boolean parameter already well-described in the schema. The description adds no extra parameter detail beyond what the schema provides, 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 clearly states it lists the full tool catalog, account info, capability map, and brand state. It uses a specific verb ('list') and resource ('tool catalog, account, capability map, brand state'), effectively distinguishing it from all sibling tools focused on specific actions like drafting or publishing.
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 advises 'Call it first to discover what's available, plan a session, and check credits before spending.' Provides clear when-to-use guidance with no ambiguity, though no explicit alternatives are given since it's unique.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!