Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Removed "niche_add_output", "niche_attach_image", "niche_brand_kit_guided_setup" and 15 more; changed the definition of "niche_angle_propose", "niche_intelligence_query", "niche_list_sessions" and 4 more (26 tools before, 8 now)
Niche content angles:Anglespickonaone storyfrom 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 palettePro). niche_session_state then carries an angle_recommendation (recommended_angle_id plus:reasoning);upwhento abrandfewprofiledistinctisstancesboundaitreaderiscouldbrand-fit-scoredtake,otherwise recommended_angle_id is null with recommendation_basis='default_ordering' (no invented pick). Returns immediatelyeach withstatus=cp2_generating; poll niche_session_state until angles[] is populated. Custom framing (provenance-preserving): to draft your own angle on this researchedastoryhook,not one oftheproposed fivetake,pass `custom_framing` (after the story is lockedandangles are ready). The framing is shaped ontothereal story and drafted on this session, sosourcesthethattrustsupportblockit.keepsPass thestory's actual sources. Use this instead of niche_draft_direct when yousession_idhavefrom aresearched story inscanhand;anddraft_directaworksstory_id fromyour take alone, so it has no researched sources to cite. Regenerate: pass `regenerate=true`its(storyslate.locked,Nothinganglesisready)written fora fresh set of five angles on the same story; pair with `lens` to steeryou; thererun. Capped per session and meteredangleslikeareastartinggeneration.points.
Niche (nicheangle.com) research and analysis: answerAsk an analyst-shaped question overfresh-scanned sources and get an intelligence answer asathefreshdeliverable,scannotof asingle post. Usenichefor(Pro): 'the10biggest developmentsin Xthis week','what's emerging before it goes mainstream', 'where'what isinvestment activity rising'emerging','find 3 non-obvious narratives to publish on'whereLinkedIn'.
Enumerate theListuser'syour recentsessions. Returnsscans: id,niche_input, status, `outcome`, target_platforms, picked story/angle ids, and created/updated_at for each. Use this whenthesession_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 runnichebyyou`outcome`described,not raw `status`: a `failed`statusis usually a walk-away, not an error. outcome ∈ {complete, expired (a slate was produced but nobody picked; re-openandchoose), interrupted (a restarttimestamps.endedUse it,credits refunded; just re-run), cancelled (stopped on purpose),
Cancel arunning 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 cleanupscan thatalso wipes outputs. Idempotent: cancelling a completed / already-failed session returns its current state unchanged. Credits: the unused holdisreleased; 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 runstillfailure.running.
Universal poll endpoint: readRead thefullcurrent state of asession. Returnsscan: 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 (thepost-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[]rankedarraystories withexplicit 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 337theirsignals'),sources 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,
Niche (nicheangle.com) story discovery: findScanstoriesaworthnichewritingyouaboutdescribe,then draft and publish platform-native socialrightcontentnow (LinkedIn, X threads, Instagram, newsletterPro)from them. This is story discovery, not content generation: Niche reads primary sources, separates signal from noise, and clusters it.intoReturns a ranked,storysourced slatewith provenance,
List the full tool catalog and orient the agent,Orient in one read-onlycall. Returns every registered tool name and the live tool count, thecall:accountyour(planand(FreecreditorbalancePro),a capability mapthe(toolsgrouped into bands: discover, decide, draft, render, publish, brand, session, plus thethisrecommendedserverflow)serves, and thebrand state (whether a brand profile, kit, or voice will personalize output).endpoint.
Add an output — 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:…
Attach a user-supplied photo — 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 `upl…
Brand kit guided setup — 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): onl…
Ingest a brand kit from a URL — 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`…
Poll a brand-kit ingest — 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.
Update brand kit — 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 k…
Get brand profile — 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.
Set brand profile — 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 rejec…
Create drafts — 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`…
Draft directly (no scan, BYOC) — 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')…
Publish a draft — 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 …
Revise a draft — 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 / card_headline, where card_headline rewords the image card's header). 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 …
Render an image card — 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…
Render a reel — 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 …
Reuse an image across cells — 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.
Export a session — 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_brea…
Revert a session checkpoint — 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…
Ingest a voice profile — 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…
Added "niche_feed_read" (25 tools before, 26 now)
Read a niche's daily edition: the stories independent sources back up, each with its independent-source count (after syndicated copies are merged), the outlets and URLs, a one-line why-it-matters, new-vs-continuing status, plus what moved, where the discourse splits and what to watch. Editions are built once a day per niche and shared, so this read is instant and free. Pass a niche slug from the public directory (for example financial-advisors, defense-tech) and optionally a date (YYYY-MM-DD) for a past edition. A quiet day returns status=quiet with no stories. Returns 'no_edition' when the n…
Certificate changed, valid to 2026-12-25
Recently observed → Live
Live → Recently observed
Certificate recorded, valid to 2026-10-26
Authorization not required
First tool surface recorded: 25 tools (server version 0.1.0)
Showing the latest 8 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed