Skip to main content
Glama

Discover stories (signal scan)

niche_signal_scan

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: the run's voice/offer/CTA. You do NOT need niche_whoami to brand a run: OMIT brand_id and a single or default brand binds automatically (silently). On a MULTI-brand account, an omitted brand_id returns brand_choice_required with brand_options[] inline (the slate still lands). Ask the user which brand, then re-call with brand_id (or brand_id:'none' for a deliberately unbranded run); don't draft until one is chosen. Pass brand_id to bind a specific persisted profile (set via niche_brand_profile_set); its 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 (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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nicheYesNiche / beat description (2-200 chars). Specific is better.
densityNoHow 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
recencyNoOptional 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_idNoBinds 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_onlyNoWhen true, return the discovery credit cost without starting a run or holding a reservation. Use it to quote a price before committing.
recency_strictNoWhen 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_qualityNoHow 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_outputsNoOutput 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:single_tweet (pass 'x:thread' for a 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_keyNoOptional. 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_budgetNoAgent-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_platformsNoOptional. A flat platform list (linkedin, linkedin_carousel, twitter, longform, instagram), coerced into target_outputs cells. Prefer target_outputs.
profile_overridesNoOptional. 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.

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses substantial behavioral traits beyond the annotations: it starts a run, may hold a reservation, can bill, supports idempotency, auto-dedupes identical scans, and can block up to ~45s in fast mode. It also notes the effective profile is snapshotted at scan time. This far exceeds the minimal annotation set and gives the agent critical operational expectations.

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

Conciseness4/5

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

The description is long but dense; every sentence provides actionable guidance. It is front-loaded with the core purpose, then return semantics, then brand profile nuances. While it could be trimmed slightly, the complexity of the tool justifies most of the length, and there is no filler or repetition.

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

Completeness4/5

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

The description covers the return value (session_id plus initial status), how to retrieve results (poll niche_session_state), cost estimation via estimate_only, and idempotency. With no output schema, it explains what the agent needs to know to proceed. It doesn't describe the slate's internal structure, but this is not strictly necessary for successful invocation and polling.

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

Parameters4/5

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

The schema already provides 100% coverage with detailed parameter descriptions, so the baseline is 3. The description adds extra semantics beyond the schema, especially around brand_id: multi-brand behavior, brand_choice_required, brand_id:'none' for unbranded runs, and the deep-merge of profile_overrides. It also adds context for idempotency and retry behavior, supplementing the schema's parameter docs.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Niche story discovery: find stories worth writing about, then draft and publish platform-native social content.' It explicitly distinguishes itself from content generation: 'This is story discovery, not content generation,' and describes the output as a 'ranked story slate with provenance.' This clearly separates it from sibling draft/publishing tools.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool ('the editorial-intelligence step before any writing') and when to poll via niche_session_state. It also provides exclusions such as 'You do NOT need niche_whoami to brand a run.' However, it doesn't explicitly name alternative sibling tools for when not to use this tool, but the 'when' and 'when-not' guidance is strongly implied.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation4/5

Tools are mostly distinct across the pipeline—discovery, brand setup, drafting, rendering, publishing, session management—and descriptions are detailed. Minor overlap exists between niche_signal_scan and niche_intelligence_query (both discovery) and between niche_add_output and niche_draft_create (both generate outputs), but the descriptions clearly differentiate them. Overall, an agent can reliably select the right tool.

Naming Consistency3/5

All tools share the `niche_` prefix and snake_case, but the verb/noun order is inconsistent: some are verb-first (add_output, render_image_card, list_sessions) while many are noun-first (angle_propose, brand_kit_ingest, draft_create, session_cancel). This mixed convention requires the agent to learn each name individually rather than predict the pattern.

Tool Count3/5

25 tools is on the heavy side but appropriate for the platform's scope—full editorial intelligence from discovery to publish. No redundant tools, and each covers a distinct aspect, but the count is high enough that it feels dense and may require orientation (which niche_whoami addresses).

Completeness4/5

The toolset covers the full workflow: discovery, angle proposal, drafting, revision, publishing, rendering, asset attachment, brand setup, and session management. Minor gaps exist, such as no direct read tool for the current BrandKit (only via ingest status) and no hard-delete tool (session_cancel mentions the REST endpoint instead), but these are edge cases and agents can work around them.