Narrareach
Server Details
Draft, schedule, and analyze content for Substack, Medium, LinkedIn, X, Bluesky, and Threads. Review and edit drafts, schedule notes and articles, check publishing readiness, and inspect available performance data. Actions are scoped to your account and authorized team workspaces. Requires an eligible Narrareach account, OAuth sign-in, and connected platform accounts; capabilities vary by platform. Docs: https://www.narrareach.com/api-docs
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 95 tools
The set contains many near-overlapping tools: schedule_note vs schedule_notes, cancel_scheduled_item vs cancel_scheduled_post, list_scheduled_items vs list_scheduled_posts, amend_scheduled_item vs reschedule_scheduled_item, and several Substack verification tools. Descriptions often clarify intent, but with 95 tools the agent faces a high burden distinguishing similar scheduling, analytics, and reply operations.
Most names follow a predictable snake_case verb_object pattern, such as create_draft, list_notes, schedule_article, and update_settings. There are minor inconsistencies in terminology, especially 'post' vs 'item' and singular/plural pairs, plus a legacy verify_substack tool, but the overall convention is readable.
95 tools is far beyond a well-scoped set and is an extreme mismatch for practical agent use. Even though Narrareach covers many subdomains, the surface is heavily fragmented into many niche and overlapping operations.
The surface is very broad and covers drafts, scheduling, cancellation, analytics, voice profile management, reader replies, DMs, media upload, transcripts, briefs, and Substack verification. There are minor gaps, such as limited in-place editing for most already scheduled items, but the core lifecycle is well represented.
Available Tools
95 toolsadd_platform_to_scheduled_noteAdd platform to scheduled noteAIdempotentInspect
Add a platform (or another account on a platform) to a Note that is already scheduled, so it posts there at the same time as the Note's other versions. Use this, not schedule_note, whenever the writer wants an already scheduled Note to also go to X, LinkedIn, Bluesky, Threads, Instagram, Facebook, TikTok or Pinterest: schedule_note would create a separate Note. Pass the id of any scheduled version of the Note (from list_scheduled_items, list_notes or schedule_note) and the platform. Without content the text is taken from the Note's versions (the same platform's version, else the longest that fits) and, if every version is too long, shortened to fit with adjustedPlatforms and warnings returned; content you pass is sent as written and must fit the platform's limit. When the writer has several accounts on the platform, name one with accountId (list_social_accounts; list_instagram_destinations for Instagram; list_linkedin_destinations for LinkedIn, with linkedInOrganizationUrn for a Company Page); without one the call is refused with the accounts to choose from. Ask the writer, never pick. Refused when the Note already goes to that platform or account (or posted there in the last day), when its time has passed or changed, or for Substack. Returns the new version(s) and their scheduled time. Safe to retry: pass a clientRequestId and reuse it only when retrying the same add (same Note and time, platform, account and content); a repeat returns the version already added (replayed: true), and the id reused for any other add is refused. Personal account only.
Inputs: id (required), platform (required), content, accountId, +2 more. Returns: added, noteId, draftId, platform, +7 more
add_voice_materialAdd voice materialAIdempotentInspect
Save something real the writer has just told you to their material bank: a story they lived, a number they measured, an opinion they hold, or an example they use. Future drafts draw on it instead of making things up. Save only what the writer supplied; never add anything you wrote or assumed.
Inputs: text (required), type (required), writer, workspace. Returns: saved, material, alreadySaved, materialCount, +1 more
amend_scheduled_itemPreview or amend scheduled itemADestructiveIdempotentInspect
Preview or amend the time or timezone of a scheduled Note or Article using its exact current revision. apply defaults to false for a non-mutating preview; apply=true performs the amendment after client-side confirmation. Successful retries are desired-state idempotent, and applied changes are reread and verified. Use this for a time change on an already scheduled item: one step instead of cancel_scheduled_item and schedule_article. For a Substack article the change can still replace the Substack draft, so the writer may be asked for a verification code; when that refusal has scheduleChangePending, the article keeps its current time and the code applies the new time, so do not send the change again. Cover, content, title, paywall, audience, email-delivery, and destination rewrites are unsupported.
Inputs: id (required), scheduledFor (required), expectedRevision (required), kind, +2 more. Returns: after, before, status, applied, +4 more
amend_scheduled_note_contentPreview or amend queued LinkedIn post textADestructiveIdempotentInspect
Preview or replace the text of an untouched queued LinkedIn post while preserving its images and supported videos using its scheduled Note id and exact current revision. Changes the queued delivery snapshot, not a shared draft. apply defaults to false for a non-mutating preview; apply=true performs the replacement after client-side confirmation. Replaces the full caption as plain text, including text formatting; preserves attachment order, alt text and captions. Read contentEditing from get_scheduled_item_readiness first. Attachment changes, embedded mentions/cards, documents, provider-accepted, in-flight and Article schedules are unsupported. Video requires the Zernio delivery route.
Inputs: id (required), content (required), expectedRevision (required), apply. Returns: after, before, status, applied, +3 more
archive_draftArchive draftADestructiveIdempotentInspect
Archive an owned draft so it no longer appears in draft lists. Active scheduled items must be cancelled first.
Inputs: id (required). Returns: id, title, status, updatedAt, +1 more
cancel_scheduled_itemCancel scheduled itemADestructiveInspect
Cancel a scheduled note or article, with optional kind or automatic detection by id. Use it when the writer no longer wants the item to publish. Do not cancel and schedule again just to change the time: use amend_scheduled_item or reschedule_scheduled_item, one step instead of two. An article's content, title, paywall, audience and email delivery cannot be changed in place; when one must change, confirm with the writer, then cancel once and schedule one replacement that carries every change. Cancelling a Substack article deletes its scheduled Substack draft, unless Substack shows it published or within two minutes of release (then it is left on Substack and providerRemovalSkipped says so), and any new or changed Substack schedule can ask the writer for a verification code.
Inputs: id (required), kind. Returns: id, kind, status, message, +8 more
cancel_scheduled_postCancel scheduled postADestructiveInspect
Cancel a scheduled article. Before its time it cancels the same way as cancel_scheduled_item, including removing the schedule from LinkedIn, Substack and Medium. Once its time has passed, or after it failed, only the Narrareach schedule is cancelled and nothing is removed from the platform, because it may already be live. Already-published posts cannot be cancelled. Returns the new status.
Inputs: id (required). Returns: id, status, message, remoteEditUrl, +6 more
cancel_substack_verificationCancel a Substack code requestADestructiveIdempotentInspect
Cancel the selected code request for the connected account owner. Does not cancel article schedules, delete drafts, or disconnect Substack. Use only when the user wants to cancel this verification request.
Inputs: id (required), connectionId (required), scheduledPostId. Returns: id, method, message, required, +14 more
complete_substack_verificationSubmit your Substack codeAInspect
Submit the six-digit code the connected account owner provides in this conversation for the same connection and code request. Never guess or automatically repeat a code. Confirmation can resume previously approved articles waiting on this connection; it is not proof of publication. Check an existing schedule afterward, or retry the same saved draft with its original settings if no schedule exists.
Inputs: id (required), code (required), connectionId (required), scheduledPostId. Returns: id, method, message, required, +14 more
create_article_from_noteCreate article from noteAIdempotentInspect
Create a linked article draft from a Note: a draft id that list_drafts or get_draft reports with kind note. A list_notes item's top-level id is a schedule id, not a draft id; its draft.id works only when that draft is the Note itself rather than an article the Note promotes. Article drafts, including unscheduled create_draft results, are refused because they are already articles. Preserves the note; repeated requests open the same article without overwriting edits. Does not publish.
Inputs: draftId (required), writer, workspace. Returns: versions, articleId, articleLinks, connectedAccount
create_dm_reply_draftDraft a direct-message replyAInspect
Save a reply to one of the writer's direct-message conversations for review. Omit text to have Narrareach suggest one in the writer's voice from the recent messages; group chats get no suggestion (dm_reply_group_chat_suggestion_off), so pass the writer's own text there. Nothing is sent: show the writer the full text and ask before calling send_dm_reply_draft. Replaces an unsent draft for the same conversation. replyWindow says whether a reply can go out now: Instagram and Facebook take replies up to 7 days after the reader's last message, TikTok 48 hours, Bluesky and Substack any time. Requires the Revenue Writer plan or above.
Inputs: conversationId (required), text. Returns: draft, replyWindow, connectedAccount
create_draftCreate draftAInspect
Create a new draft owned by the authenticated user. To give an article its cover from ChatGPT, pass the image the user attached in the chat in coverFile; do not transcribe image bytes or pass a sandbox path. Returns the created draft id and title. To schedule or publish this article later, pass that id as draftId to schedule_article; do not send its title and contentHtml again, which would save a second copy. When reviewing a Substack article with the writer, briefly mention once per article that they can ask for a Subscribe button after a named paragraph, a caption beneath it, a paywall before a named section (a paywall makes the article paid-only), or a Freewall before a named section (everyone reads the opening; free and paid subscribers keep reading, and readers without an email are invited to subscribe free). Use the requested position; ask where only if it is ambiguous.
Inputs: title (required), coverFile, coverImage, contentHtml. Returns: id, title, nextStep, createdAt, +2 more
create_generated_notesCreate generated notesAInspect
Generate short notes in the writer's voice with Narrareach's note generator, from their own writing (source "profile") or from an article or post you pass in. Each note comes with a suggested time that avoids what is already on their calendar. This saves and schedules nothing: show the notes to the writer, then schedule each one they approve with schedule_note, passing the note as content, the platforms, its suggestedTime unchanged as scheduledFor (it is an absolute time) unless the writer picks another, the same workspace you used here, and this result's requestId as generationId. To schedule several approved notes at once, use schedule_notes with the same fields per note and a clientRequestId for each. Use create_draft only to keep a note unscheduled in the personal account (no workspace); it cannot save into a team workspace. Up to 10 notes per call and 20 calls per day; a call can take a minute or two.
Inputs: days, tone, count, source, +9 more. Returns: tone, notes, source, cadence, +4 more
create_reader_reply_draftCreate reader reply draftAInspect
Save an owned comment reply for review, for a Substack comment or a LinkedIn, Threads, Bluesky, Instagram, TikTok or Facebook comment with canReply true. Generates in the writer’s voice when text is omitted. Returns the comment, the parent note or post, and the linked article for review. Does not publish.
Inputs: activityId (required), text, substackConnectionId. Returns: draft, context, connectedAccount
decide_voice_suggestionDecide voice suggestionAInspect
Record the writer's answer to one suggestion from get_voice_profile. Ask the writer first and call this only after they answer: "approve" adds it as a rule (pass text if they reword it), "dismiss" means they said no, "later" asks again in a week. One suggestion per call. Never decide for the writer.
Inputs: decision (required), suggestionId (required), text, writer, +1 more. Returns: undo, status, decision, ruleCount, +2 more
generate_article_briefsGenerate article briefsAInspect
Plan long-form articles for the writer: 3 or 5 briefs, each with a working title, the question it answers, why now, the pillar, a 4 to 6 section outline, and evidence links. source "topics" builds on timely topics in the writer's pillars (the same as list_topic_suggestions), "profile" on their pillars, niche and past articles, "own" on a topic you pass. Briefs use the writer's voice and add no facts beyond their material and the evidence; show the evidence links when you present a timely brief. Takes about 20 seconds. When briefs is empty, emptyReason says why: no_topics (nothing timely in their pillars right now; try source "profile") or no_usable_briefs (try again). Briefs are free; 10 runs a day. To have Narrareach write one into a full draft, call queue_article_draft with its id. Available on the Revenue Writer plan and above. Counts as five requests against the rate limit.
Inputs: source (required), count, topic, pillarId. Returns: briefs, batchId, emptyReason, connectedAccount
get_ai_visibility_auditAudit article for AI search visibilityARead-onlyIdempotentInspect
Check an article draft for what helps Google, AI Overviews, ChatGPT search and Perplexity find and cite it: an opening that answers first, descriptive headings, links, sourced figures, lists, image alt text, one call to action, and title length. Call it before scheduling an article or when the writer asks how to make a post easier to find. Advisory only: it never changes the draft or blocks scheduling. Offer the topFixes, check needsJudgment yourself, never invent facts, and for a published article give the writer revised sections to paste into the live post instead of calling update_draft.
Inputs: draftId (required). Returns: audit, title, status, draftId, +3 more
get_article_briefGet an article briefARead-onlyIdempotentInspect
One article brief and its draft status. After queue_article_draft, call this about every 30 seconds until status is READY (draftUrl opens the draft) or FAILED. A draft usually takes 1 to 3 minutes. Available on the Revenue Writer plan and above.
Inputs: briefId (required). Returns: id, title, pillar, source, +12 more
get_audience_overviewGet Audience overviewARead-onlyIdempotentInspect
Check whether Audience is ready for a Substack publication and which filters it supports: the filter columns with their operators and values, plus how many subscriber tags and saved segments the publication has. Counts only; never returns subscribers. Workspace owner only, on a plan that includes agents.
Inputs: workspace, publicationId. Returns: ready, columns, tagCount, transport, +3 more
get_conversationRead a direct-message conversationARead-onlyIdempotentInspect
Read one of the writer's stored direct-message conversations and its messages, newest first, by the id from list_conversations. Read-only. direction is incoming (from the other person) or outgoing (from the writer's account). Deleted messages have content null. Pass page.nextCursor as cursor to read older messages. Requires the Revenue Writer plan or above.
Inputs: conversationId (required), limit, cursor. Returns: page, messages, conversation, connectedAccount
get_draftGet draftARead-onlyInspect
Get a single draft by id, including full HTML content. kind is note for a Note (saved as one, or only ever scheduled as one) and article otherwise. substackControls summarizes the cover, access (audience: freewall, paywall, paid_subscribers or everyone), Subscribe button count, leftover placement text, and what public and paid readers will see; check it before scheduling an article.
Inputs: id (required). Returns: id, kind, meta, title, +11 more
get_import_statusGet import statusARead-onlyIdempotentInspect
Read where the writer’s imports stand: the onboarding writing import, Substack imports (pages, notes, and articles imported, and whether voice preparation ran), blog automation sources (status, last sync, item counts), and social history imports. Statuses, counts, and error categories only; no imported text. Read-only.
Inputs: workspace. Returns: contentSources, writingImports, substackImports, connectedAccount, +1 more
get_noteGet noteARead-onlyInspect
Get a single scheduled or posted note by id, including full content, recent stored metric snapshots (with Substack follows and subscriptions), platformMetrics, the connected account it names (socialAccountId) and why it is waiting if held (failureCode).
Inputs: id (required), workspace. Returns: id, draft, error, quote, +21 more
get_platform_analyticsGet platform analyticsARead-onlyIdempotentInspect
Read analytics for a connected platform. If a connection is required, returns action_required with connection guidance; do not repeatedly retry until the writer connects. Returns account-level summary data where available, otherwise stored Narrareach note performance and connection readiness. Reads stored data and never refreshes connections (X adds live account numbers when its token is current); for Medium, call refresh_medium_stats first if no stats are stored. Note metrics: impressions and clicks are null when the platform does not report them, not 0. For SUBSTACK, benchmark is the latest saved notes benchmark (see its analysedAt); refresh it with refresh_substack_benchmark. For Substack notes, clicks is the total_clicks count Substack reports for the note; Substack does not document which clicks it includes, and impressions are not available.
Inputs: platform (required), recentLimit. Returns: code, note, handle, reason, +33 more
get_posting_scheduleGet posting scheduleARead-onlyIdempotentInspect
Read the writer's Note posting schedule: the saved cadence (preferred times, posts per day, days of the week, weekend skipping), the effective schedule Narrareach uses (the default when nothing is saved), the schedule timezone, the next open queue slot, and the open slots for the next few days. To add a Note to the queue, pass nextOpenSlot.scheduledFor (or an openSlots entry's scheduledFor) unchanged to schedule_note's scheduledFor. In a team workspace the queue is the owner's, so members read the owner's schedule.
Inputs: days, workspace. Returns: days, saved, whose, timezone, +5 more
get_research_desk_answerGet Research Desk answerARead-onlyIdempotentInspect
Check on a Research Desk question started with start_research_desk_question. While done is false the desk is still researching: call again every 10 to 20 seconds, and do not start a new question meanwhile. Once done is true, answer is the desk's reply and noteIdeas are Notes it wrote for the writer to review; nothing is scheduled until the writer does it. failureMessage explains a question that could not be answered.
Inputs: runId (required), workspace. Returns: done, runId, answer, status, +7 more
get_scheduled_item_readinessCheck scheduled item readinessARead-onlyIdempotentInspect
Inspect one scheduled Note or Article using stored Narrareach evidence without contacting a provider. Its substackAudience describes the Narrareach draft, not Substack; to confirm what Substack saved (Freewall, paywall, email), call get_substack_article_audience. Returns revision, draftId, destination, timing, cover, subscribe controls, paywall, email delivery, stored remote receipt, issues, and next action. Article draft content is local and is not a provider-verified copy; queued Note content is stored on the scheduled Note. pendingScheduleChange reports a Substack time change waiting on the writer’s code: scheduledFor stays the current time until the code is entered, which applies it without sending the change again. advisories (Substack and LinkedIn Articles items) says when the writer must resync Substack, or sign in to LinkedIn or resync LinkedIn Articles, before this item can publish; tell the writer its message.
Inputs: id (required), kind. Returns: id, kind, title, checks, +22 more
get_settingsGet settingsARead-onlyIdempotentInspect
Read the writer's main Narrareach Settings: preferences (preferredTimezone, capitalizeGeneratedNotes, writingLanguage, uiLanguage, articleLinkPlacement, articleFollowUpDelivery, and tagArticleLinksWithUtm for UTM tags on article links), the default account on each platform (Substack publication, LinkedIn destination, Instagram, and Threads, Facebook, TikTok, Pinterest and X accounts), connection health per platform, and email notification settings. Reads what Narrareach has stored; it does not refresh connections with any platform. Change preferences with update_settings. Personal account only. advisories lists anything the writer must do in Narrareach, such as resyncing Substack or resyncing LinkedIn Articles; tell the writer its message.
Inputs: no named parameters. Returns: advisories, connections, howToChange, preferences, +4 more
get_stats_insightsGet Stats insightsARead-onlyIdempotentInspect
Read stored Narrareach Stats for a period: reach, engagement, conversion, publishing rhythm, engagement peak, other-writers timing benchmark, and latest audience snapshot. Does not live-fetch Substack or per-platform account analytics.
Inputs: to, from, period, platforms, +3 more. Returns: scope, audience, outcomes, generatedAt, +5 more
get_stats_snapshotGet daily audience statsARead-onlyIdempotentInspect
Read the stored daily audience series for a period: subscribers, paid subscribers, followers, email open rate, unsubscribes, impressions, engagements, and (for the owner) ARR and Medium earnings, one point per day, plus the latest point and the change over the period. Reads what Narrareach has stored; it does not live-fetch Substack. Team members see only their assigned publication, without ARR or account-wide fields.
Inputs: days, workspace, publicationId. Returns: days, change, latest, snapshots, +2 more
get_substack_article_audienceCheck the article audience on SubstackARead-onlyIdempotentInspect
Read a scheduled or published Substack article from Substack itself and report what Substack saved: its audience (only_subscribers is a Freewall, only_paid a paywall or paid-only post, everyone), whether the wall divider is there and the words just before it, and whether it will email subscribers. Compares that with the Narrareach draft and lists any differences. Use this, not get_scheduled_item_readiness or get_draft, before telling a writer their Freewall or paywall is set on Substack: those only describe what Narrareach sent. Read-only; changes nothing on Substack or in Narrareach.
Inputs: id (required). Returns: id, checked, matches, message, +4 more
get_substack_verification_statusCheck Substack verificationARead-onlyIdempotentInspect
Read whether your connected Substack publication needs a code and whether a code request is waiting. Does not request a code, change the connection, or publish. Only the connected account owner can check it. If a code is waiting, ask for it in a normal chat message and wait for the reply; do not send another code. Check once when the writer says they are done; do not call this repeatedly in a loop.
Inputs: connectionId (required), scheduledPostId. Returns: id, method, message, required, +14 more
get_transcriptGet transcriptAIdempotentInspect
Get the transcript of a YouTube video, a podcast episode (an RSS feed, an Apple Podcasts link, or an episode page that links its audio), or a direct link to an audio file, so you can quote, summarise or repurpose it. Pass url, or uploadUrl for a file the writer uploaded to Narrareach. For a feed or show, episode picks an episode by title or guid; the latest is used otherwise. Short sources come back ready with the text. Long audio is transcribed in the background: the result is status processing with a transcriptId, so call get_transcript_status with it every 20 seconds or so until it is ready. Spotify links cannot be transcribed. A transcript someone already requested is returned from the cache and does not count against the allowance. When the day's audio minutes are used up, podcast feed and Apple Podcasts links are refused, even for an episode already in the cache; cached YouTube videos, audio file links (with or without an extension) and uploads still work. Uses the connected writer's own daily transcript allowance (YouTube requests and audio minutes, reset at midnight UTC), not a team workspace owner's; available on the Revenue Writer plan and above. Counts as five requests against the rate limit.
Inputs: url, episode, maxChars, uploadUrl. Returns: text, title, cached, status, +8 more
get_transcript_statusGet transcript statusARead-onlyIdempotentInspect
Check on a transcript that get_transcript returned as processing. While status is processing, call again every 20 seconds or so; long audio can take several minutes. Once ready, the result has the text. Reading a transcript does not use the allowance.
Inputs: transcriptId (required), maxChars. Returns: text, title, cached, status, +8 more
get_user_profileGet user profileARead-onlyInspect
Get the authenticated Narrareach user — name, email, timezone, plan, connected platforms, Substack publications, and any team workspaces/writers available for multi-writer scheduling on this connection.
Inputs: no named parameters. Returns: id, name, plan, email, +10 more
get_voice_profileGet voice profileARead-onlyIdempotentInspect
Read the writer's voice profile: how they sound, their do/don't rules, topics, stances, real material, instructions, and a few of their own posts as examples. Call this before drafting or rewriting anything in the writer's voice. The material bank shows the most recent 30 items; pass detail "full" for all of them.
Inputs: detail, writer, workspace. Returns: niche, rules, whose, topics, +13 more
list_article_briefsList article briefsARead-onlyIdempotentInspect
The writer's article briefs from the last 14 days, newest first, plus any older brief that has a draft, with each brief's status: IDEA (no draft yet), QUEUED or WRITING (a draft is on the way), READY (draftUrl opens it in Narrareach), or FAILED (failureCode says why; queue it again). draftAllowance shows this month's drafts used and the limit. Available on the Revenue Writer plan and above.
Inputs: no named parameters. Returns: briefs, draftAllowance, connectedAccount
list_article_statsList article stats and clicked linksARead-onlyIdempotentInspect
Read saved stats for the writer’s published articles, newest first: views, opens, open and click rates, reactions, comments, shares, new subscribers, and the links readers clicked (Substack only) with each link’s clicks and share of openers. Pass publicationId for one article. Reads what Narrareach last saved (statsAsOf); it does not fetch from the platforms.
Inputs: limit, cursor, platform, workspace, +1 more. Returns: articles, nextCursor, connectedAccount
list_content_versionsList related content versionsBRead-onlyIdempotentInspect
List a note and its linked article with independent statuses and destinations.
Inputs: draftId (required), writer, workspace. Returns: versions, articleId, articleLinks, connectedAccount
list_conversationsList direct messagesARead-onlyIdempotentInspect
Read the writer's stored direct-message conversations from Instagram, Facebook, TikTok, Bluesky and Substack, newest message first. Read-only: it does not fetch from the platforms or send anything. Conversations are read from the platforms every few minutes (Substack about once an hour); check sync.lastSyncedAt for freshness. state=inbox (the default) lists conversations where the reader wrote last within the past 7 days; history lists the rest; all lists both. kind is direct (the writer and one other person) or group (a group chat; participant.name is the chat's title and memberCount counts everyone). Pass kind=direct to leave group chats out. Each item names the writer's account it belongs to, the other person, a preview of the last message and unreadCount. messagesComplete false means some messages are still being read. Use get_conversation with an id to read the messages. Requires the Revenue Writer plan or above.
Inputs: kind, limit, state, cursor, +1 more. Returns: page, sync, conversations, connectedAccount
list_creator_matchesList creator matchesARead-onlyIdempotentInspect
List Substack’s creator matches for a publication: other writers whose audience overlaps, with their public profile, subscriber label, overlap counts, and whether this publication already messaged them. Read-only; it never sends a message. Workspace owner only, on a plan that includes agents.
Inputs: workspace, publicationId. Returns: matches, publicationId, connectedAccount
list_draft_comment_notificationsList draft comment notificationsARead-onlyIdempotentInspect
Find the writer's own drafts that have comments they have not read yet, newest first, with each draft's unread count and its latest unread comments (excerpted to 280 characters). Unread means written by someone else after the writer last opened that draft's comments in Narrareach. Drafts whose comment notifications the writer muted are left out unless includeMuted is true. Read-only: it does not mark anything read. Use list_draft_comments with a draftId for the full threads.
Inputs: limit, includeMuted. Returns: drafts, hasMore, totalDrafts, connectedAccount
list_draft_commentsList draft commentsARead-onlyIdempotentInspect
Read the comment threads collaborators and reviewers left on one of the writer's own drafts, with the passage each thread is attached to (quotedText, null for comments on the whole draft). Each comment says whether the writer wrote it (isMine) and whether it is unread. status=open (the default) returns unresolved threads; resolved or all include resolved ones. Threads are newest activity first. Read-only: it does not mark comments read, reply, or resolve threads; the writer does that in the Narrareach editor. Use list_draft_comment_notifications to find drafts with unread comments.
Inputs: draftId (required), limit, status. Returns: draft, hasMore, threads, truncated, +4 more
list_draftsList draftsARead-onlyInspect
List the authenticated user's drafts, newest first. Excludes archived drafts and returns compact summaries without full HTML content. kind is note for a Note (pass its id to create_article_from_note): a draft saved as a Note, or one only ever scheduled as a Note with no article settings. Everything else, including an unscheduled create_draft result, is article.
Inputs: limit, query, status. Returns: count, drafts, connectedAccount
list_hashtag_setsList hashtag setsARead-onlyIdempotentInspect
Personal saved hashtag sets. Saving sets never inserts hashtags into content or publishes anything. Up to 20 sets, 30 hashtags per set.
Inputs: no named parameters. Returns: sets, connectedAccount
list_inspiration_postsList inspiration postsBRead-onlyInspect
List posts the user has saved to their inspiration library (newest first).
Inputs: tag, limit, platform. Returns: count, posts, connectedAccount
list_instagram_destinationsList Instagram destinationsARead-onlyIdempotentInspect
List the connected Instagram accounts available for Notes. Returns each accountId for schedule_note.instagramDestinations, how many accounts one Note may target, and defaultDestination: the account a Note posts to when instagramDestinations is omitted. When defaultIsAmbiguous is true several accounts are connected and none is marked default, so ask the writer which account to use and pass it explicitly.
Inputs: writer, workspace. Returns: context, destinations, connectedAccount, defaultDestination, +2 more
list_linkedin_article_destinationsList LinkedIn Article destinationsBDestructiveInspect
List personal profiles and Company Pages available for LinkedIn Articles. With authorUrn, also returns newsletters owned by that author.
Inputs: refresh, authorUrn. Returns: authors, warning, newsletters, connectedAccount, +4 more
list_linkedin_destinationsList LinkedIn destinationsBDestructiveInspect
Refresh and list LinkedIn personal profiles and Company Pages available for Notes. Returns accountId, organizationUrn for Pages, and the configured default destination.
Inputs: writer, workspace. Returns: context, destinations, connectedAccount, defaultDestination
list_medium_publicationsList Medium publicationsARead-onlyIdempotentInspect
List Medium publications available to the connected account with writer access or higher. Uses the saved list unless refresh is true. Returns publication ids and canPublish: true indicates direct publishing permission; false indicates editorial review with content unpublished until editor acceptance.
Inputs: refresh. Returns: connected, publications, connectedAccount
list_notesList notesARead-onlyInspect
List the user’s notes across every supported note platform. Includes scheduled, failed, and posted notes with the latest stored engagement snapshot when available. For Substack notes, engagement includes follows, freeSubscriptions and paidSubscriptions: what Substack attributes to that note. platformMetrics holds the latest saves, views, reach, follows and reposts the platform reported for posts on other platforms. Unreported metrics are null, not 0. Each note carries socialAccountId (the connected account it names on Threads, Facebook, TikTok, Pinterest or X; null means the only account or the default), failureCode (why a held note is waiting) and tags (the draft’s content tags). With status POSTED, notes are newest first and from/to filter by posted time; otherwise by scheduled time, soonest first. Page with page.nextCursor. Only notes sent through Narrareach are listed. For get_note and get_scheduled_item_readiness, copy notes[].id exactly; draft.id is the separate saved draft and externalPostId is the provider ID. Never substitute either for the Note id.
Inputs: to, tag, from, limit, +6 more. Returns: page, count, notes, context, +1 more
list_reader_activitiesList reader activitiesARead-onlyIdempotentInspect
Read stored Substack likes, comments, restacks, and other notifications for the authenticated Narrareach account. This tool does not fetch new activity from Substack. Each item has type (LIKE, COMMENT, RESTACK, or OTHER), kind (the Substack notification type), and label (a short description). OTHER covers notifications that are not note likes, note replies, or restacks: follows, free and paid subscriptions, likes and replies on posts and comments, mentions, chat activity, live streams, and system notices such as a scheduled note being sent. Many OTHER items have no content; read kind and label to see what they are. Only COMMENT items with canReply true can be replied to. The inbox contains new activity; history contains the initial import and items already handled or replied to. Either can contain recent activity. sort=time returns newest first. range.page and range.all show the date ranges for the returned page and the requested state. Check sync.lastSyncedAt and sync.refreshRecommended for freshness; results may not include the latest activity. platform=substack (the default) lists Substack only. platform=all adds reader comments on posts Narrareach published in the last 30 days to LinkedIn, Threads, Facebook, Bluesky, Instagram and TikTok, newest first; platform=linkedin, threads, facebook, bluesky, instagram or tiktok lists one platform. Every item has a platform field. Social comments on LinkedIn, Threads, Bluesky, Instagram and TikTok have canReply true when their account is connected and can be replied to like Substack comments. Comments on posts published outside Narrareach have canReply false. Any item can be moved to History; sort=relevance works for Substack only.
Inputs: sort, type, limit, state, +4 more. Returns: page, sync, range, summary, +2 more
list_reader_reply_draftsList reader reply draftsBRead-onlyIdempotentInspect
List saved reply drafts for the selected publication, filtered by status. Does not publish or change drafts.
Inputs: limit, status, activityId, substackConnectionId. Returns: drafts, connectedAccount
list_scheduled_itemsList scheduled itemsARead-onlyIdempotentInspect
List Notes and Articles in one bounded schedule view. Copy each items[].id and items[].kind exactly into get_scheduled_item_readiness; this id identifies the scheduled item, not its draft or provider post. Includes destination, content-readiness checks, stored provider receipt state, and next action. workspace and writer scope authorized team Notes; team Articles remain private to their owner. Each Note destination carries accountId (the connected account it names; null means the only account or the default) and accountCanChange. A held Note reports why in issues (social_account_choice_required, social_account_disconnected, missed_while_account_unavailable, x_account_changed) with a writer-facing deliveryNote. An Article with pendingScheduleChange has a Substack time change waiting on the writer’s code. Reads stored evidence without contacting a provider. advisories lists anything the writer must do before scheduled items can publish, such as resyncing Substack or resyncing LinkedIn Articles; tell the writer its message.
Inputs: to, from, kind, limit, +3 more. Returns: count, items, context, advisories, +2 more
list_scheduled_postsList scheduled postsBRead-onlyInspect
List scheduled posts for the authenticated user, ordered by scheduled time ascending.
Inputs: to, from, limit, status. Returns: count, posts, connectedAccount
list_social_accountsList social accountsARead-onlyIdempotentInspect
List the connected Threads, Facebook, TikTok, Pinterest and X accounts a Note can be sent to. Returns one entry per platform with each accountId for schedule_note.socialAccountIds, defaultAccountId (the account used when none is named), and accountChoiceRequired: true when several accounts are connected and none is the default, in which case ask the writer which account and pass it in socialAccountIds. X is listed only when the writer has added X accounts for posting from more than one; a writer who uses a single X connection has no X entry and needs no socialAccountIds for X. Instagram and LinkedIn have their own tools: list_instagram_destinations and list_linkedin_destinations. The default account is set, and accounts are connected or reconnected, by the writer in Narrareach Settings; no tool does either.
Inputs: writer, workspace. Returns: context, platforms, connectedAccount
list_social_postsList social postsARead-onlyIdempotentInspect
List the writer’s own posts on connected Instagram, Threads, Facebook, LinkedIn, Bluesky, Pinterest, TikTok and X accounts, including posts published outside Narrareach, newest first, with the latest metrics each platform reported (likes, comments, shares, saves, sends, clicks, views, reach, impressions, follows, reposts). source says whether the post went out through Narrareach. Metrics a platform does not report are null, not 0 (for example, Threads has no reach and Bluesky only likes, comments and shares); on X the view count is impressions. Filter by platform, source, and from/to on published time; page with page.nextCursor. Personal account only; Substack is covered by list_notes and get_platform_analytics.
Inputs: to, from, limit, cursor, +3 more. Returns: page, posts, available, connectedAccount
list_topic_suggestionsList topic suggestionsARead-onlyIdempotentInspect
Suggest timely topics the writer could write about now, for each of their content pillars (their profile themes and the tags they use most). Each suggestion has the topic, its pillar, a fit score (0 to 100), why it is timely now, a suggested angle, and evidence: the trend sources and headline links behind it. whyItWorks says in one sentence why it is likely to land (a Reddit thread, X post or Substack post well above the usual response in the writer's niche, or the writer's best-performing pillar), with the numbers in signals; it is null when there is nothing worth saying. Show the evidence links so the writer can check them; do not present a suggestion as fact beyond what they say. pillars lists the writer's pillars with their ids; pass pillarId to see one. When recommendations is empty, emptyReason says why: refreshing means the writer's niches are still being searched, so call again in about 30 seconds; unknown_pillar means that pillarId is not one of theirs, so call again without it; no_trends or no_matches mean nothing timely fits right now, so do not retry soon; no_pillars and no_profile mean the writer needs themes or a niche on their Narrareach profile; check_unavailable means try again later. To draft Notes on a suggestion in the writer's voice, call create_generated_notes with source "articles", postTitle set to the topic (trimmed to 300 characters), postContent set to its whyNow, its suggestedAngle, and each headline title with its URL (one per line; a headline without a URL by its title only), postUrl set to the first link's URL (left out when that link has none), and customInstructions "Use only the facts in this text; do not add any." The generator writes from that text and checks the notes against it, so the evidence goes with the notes. Each create_generated_notes call costs 10 requests against the rate limit. Available on the Revenue Writer plan and above, on the writer's own plan. Counts as three requests against the rate limit.
Inputs: limit, pillarId. Returns: region, pillars, sources, fetchedAt, +3 more
list_voice_changesList voice changesARead-onlyIdempotentInspect
List recent changes to the writer's voice profile, newest first: what changed, who made it, where (the Voice page, an assistant, the API), and when. Only the newest change can be undone; pass its id to undo_voice_change.
Inputs: limit, writer, workspace. Returns: whose, changes, connectedAccount
list_voice_examplesList voice examplesARead-onlyIdempotentInspect
List the writer's own posts, newest first, that can be pinned as examples of how they sound, with the example ids update_voice_examples takes. Search by text or date and page with nextCursor. Also returns which posts are pinned and which are excluded. Posts outside the writer's main languages, that read like a reply to someone else, or that began as a Narrareach draft (startedFromDraft) are marked: they are never chosen automatically but can be pinned. A note sent to several platforms is listed once, as its Substack copy when there is one.
Inputs: to, from, query, cursor, +3 more. Returns: whose, pinned, removed, examples, +3 more
list_workspacesList workspacesARead-onlyInspect
Discover the authenticated account’s personal context and authorized team workspaces, writers, and publications. Returns workspace and writer identifiers for team scheduling; no login switch is required.
Inputs: no named parameters. Returns: routing, defaultContext, teamWorkspaces, connectedAccount
open_publishing_studioOpen writing and scheduling studioARead-onlyIdempotentInspect
Open a ChatGPT panel to start original long-form articles and short-form posts in the user’s saved voice, or an authorized team writer’s voice. Reads connected account and available writers. Does not draft, save, schedule or publish content. The user sends a writing brief back to the conversation.
Inputs: no named parameters. Returns: view, accountName
preview_audience_segmentPreview Audience segmentARead-onlyIdempotentInspect
Count how many subscribers match a set of filters, without listing them. Columns: type (is, is_not, is_any_of); started_at (on, before, after); activity (gt, gte, lt, lte, is, is_not). Each column at most once; combine Type values with is_any_of. Returns the count and a plain-language rule. Never returns subscribers or emails. Workspace owner only, on a plan that includes agents.
Inputs: predicates (required), workspace, includeAuthor, publicationId. Returns: count, lastSync, exclusions, completeness, +4 more
preview_note_quotePreview a Note quoteARead-onlyIdempotentInspect
Check a public Substack Note link or Substack post/article link before quoting it. Read-only: nothing is scheduled and publishable is always false. Returns kind ("note" or "post") and what the quote card shows. To schedule a note that quotes it, pass the same link as quoteUrl to schedule_note or a schedule_notes item, and leave it out of the note text.
Inputs: url (required), workspaceId, substackConnectionId. Returns: quote, status, message, publishable, +1 more
preview_publishing_planReview articles and short posts before schedulingARead-onlyIdempotentInspect
Show exact proposed schedule_note and schedule_article calls for the writer to review in ChatGPT. No scheduling occurs. Include full inline content (not draftId), explicit dates with UTC offsets, time zones, selected account identifiers (never implicit multi-account defaults), and explicit subscriber-email/audience/SEO choices for articles. Each note needs clientRequestId. For unsupported advanced options, review in the conversation instead. The panel sends user approval or requested changes back to the conversation; execute scheduling only after that approval. Voice selection comes from open_publishing_studio. Article scheduling is personal-account only.
Inputs: calls (required), voice (required). Returns: view, accountName
queue_article_draftQueue an article draftAInspect
Have Narrareach write a brief into a full first draft in the writer's voice. It is written in the background and saved to their Drafts as an article; the writer also gets an email when it is ready. The draft never invents the writer's own experiences or numbers: where the piece needs them, it leaves a marked "[Your experience: …]" prompt for the writer to fill. Poll get_article_brief until status is READY. Each draft counts toward the plan's monthly draft allowance (8 on Revenue Writer, 30 on Full Agentic); a failed draft does not count and can be queued again. Counts as five requests against the rate limit.
Inputs: briefId (required). Returns: brief, draftAllowance, connectedAccount
record_publishing_studio_eventRecord publishing panel diagnosticsARead-onlyIdempotentInspect
Record a bounded, content-free client-reported panel event. Does not approve, schedule, or publish anything. Intended only for the app UI.
Inputs: event (required), studioOperationId (required). Returns: recorded
refresh_medium_statsRefresh Medium statsADestructiveInspect
Sync the writer's Medium stats from Medium and store them, then return them in the same shape as get_platform_analytics for MEDIUM. Use when get_platform_analytics reports no stored Medium stats, or the writer asks for fresh numbers.
Inputs: recentLimit. Returns: code, note, handle, reason, +33 more
refresh_substack_benchmarkRefresh Substack notes benchmarkAInspect
Recompute the Substack Notes benchmark from the latest public notes and save it. Scores up to 10 recent notes against the content baseline. Defaults to the publication of the saved benchmark, then the default connected Substack publication. Personal account only. Limited to once every 6 hours; when limited, returns the saved benchmark unchanged with rateLimited true. Never publishes.
Inputs: publicationUrl. Returns: name, handle, message, avgScore, +9 more
remove_voice_materialRemove voice materialADestructiveIdempotentInspect
Remove one item from the writer's material bank, when the writer asks you to drop it. Use the material id from get_voice_profile (pass detail "full" to see every item). The writer can undo it.
Inputs: materialId (required), writer, workspace. Returns: undo, changed, materialCount, connectedAccount
remove_voice_ruleRemove voice ruleADestructiveIdempotentInspect
Remove one rule from the writer's voice profile, when the writer asks you to drop it. Use the rule id from get_voice_profile. The writer can undo it.
Inputs: ruleId (required), writer, workspace. Returns: undo, changed, ruleCount, connectedAccount
reply_to_reader_activityReply to reader activityADestructiveInspect
Publish a reply to an owned reader comment with canReply true: a Substack comment, or a LinkedIn, Threads, Bluesky, Instagram, TikTok or Facebook comment on a post Narrareach published. Social replies are threaded under the reader's comment from the account that published the post. A successful reply moves the activity to History. status pending means the reply is queued and posts within a few minutes; do not send it again. Send an idempotencyKey; after DELIVERY_UNCONFIRMED, check the thread instead of retrying.
Inputs: text (required), activityId (required), idempotencyKey, substackConnectionId. Returns: status, replyId, success, requestId, +2 more
reschedule_scheduled_itemReschedule scheduled itemADestructiveInspect
Reschedule a scheduled note or article, with optional kind or automatic detection by id. To change only the time, use this (or amend_scheduled_item): one step instead of cancelling and scheduling again. For a Substack article it can still replace the Substack draft, so the writer may be asked for a verification code; when that refusal has scheduleChangePending, the article keeps its current time and the code applies the new time, so do not send the change again. Untouched LinkedIn cloud queues can change time in place without reconnecting; provider acceptance remains pending. Started or uncertain provider work stays protected. Returns the outcome and informational advisories.
Inputs: id (required), scheduledFor (required), kind, timezone. Returns: item, kind, warnings, advisories, +1 more
save_hashtag_setsSave hashtag setsBIdempotentInspect
Personal saved hashtag sets. Saving sets never inserts hashtags into content or publishes anything. Up to 20 sets, 30 hashtags per set.
Inputs: sets (required). Returns: sets, connectedAccount
save_voice_preferenceSave voice preferenceAIdempotentInspect
Save one writing preference the writer has just stated in their own words in this conversation, such as "stop ending with a moral" or "I write in short paragraphs". It becomes a rule in their voice profile and applies to future drafts. Do not infer a preference from a single edit, and do not save anything the writer did not say. Style only: it cannot allow invented facts, stories, quotes, or numbers. The writer can undo it on the Voice page in Narrareach.
Inputs: kind (required), text (required), writer, workspace. Returns: rule, undo, saved, ruleCount, +2 more
schedule_articleSchedule articleAInspect
Schedule an article to Substack, Medium, LinkedIn Articles, X, WordPress, or Ghost. WordPress and Ghost support publishMode draft, which saves a remote draft without publishing or emailing. Always pass draftId for an article that is already saved (from create_draft, get_draft or list_drafts). title and contentHtml create a new draft and are only for an article that has not been saved yet. A new draft whose title matches an article still queued on the same platform is refused; to change a queued article, use amend_scheduled_item. Supports cover and inline images, Substack-only inline video, and destination-specific SEO metadata. Substack supports native paywall and subscribe controls at explicit positions in contentHtml; ordinary links remain links. Audience and email delivery are controlled by the supplied fields. LinkedIn Articles requires a separate browser-session connection from regular posts; pending session sync saves new input as a draft without scheduling. Settle content, title, paywall, audience and email delivery with the writer before calling. To change only the time of an article that is already scheduled, use amend_scheduled_item or reschedule_scheduled_item rather than cancel_scheduled_item followed by schedule_article. To publish right away, pass publishNow: true instead of inventing a time a few minutes ahead. Each returned post has writerState: tell the writer the article is published only when writerState is published, and share its liveUrl; scheduled or publishing means it is not live yet. Returns scheduling outcomes and advisories; an advisory with action RESYNC_LINKEDIN_ARTICLES means the LinkedIn article is scheduled but may not publish until the writer signs in to LinkedIn or resyncs LinkedIn Articles in Narrareach, so tell the writer its message. When reviewing a Substack article with the writer, briefly mention once per article that they can ask for a Subscribe button after a named paragraph, a caption beneath it, a paywall before a named section (a paywall makes the article paid-only), or a Freewall before a named section (everyone reads the opening; free and paid subscribers keep reading, and readers without an email are invited to subscribe free). Use the requested position; ask where only if it is ambiguous.
Inputs: platforms (required), tags, media, title, +24 more. Returns: code, count, posts, message, +15 more
schedule_noteSchedule noteAInspect
Schedule a note to any combination of Substack, LinkedIn, X, Bluesky, Threads, Instagram, Facebook, TikTok, and Pinterest; Instagram, TikTok, and Pinterest require an image or video. A plain Substack Note with a missing publication is saved locally. Share its draftUrl and connectionUrl so the writer can schedule it from Drafts. Character limits: Bluesky 300, Threads 500, LinkedIn 3000, X 25000 (posted as a thread). Substack shows each line of a Note as its own paragraph, so keep lines that belong together on one line. Explicit platformVersions must fit their limits; otherwise overlong platform text is shortened at a sentence boundary, with adjustedPlatforms and warnings returned. When a writer has several connected accounts on Threads, Facebook, TikTok, Pinterest or X, the Note goes to the default account unless socialAccountIds names one from list_social_accounts; with several and no default the request is refused until one is named. Authorized team routing uses workspace and writer. Substack Notes publish from the verified connected profile, not a publication page. Safe to retry: pass a new clientRequestId for each note and reuse it when retrying that note, and a repeat returns the original result instead of scheduling again. Even without one, a note with the same text, platform and time as one scheduled in the last 24 hours is not copied: the result has duplicate: true and the existing schedule ids. To quote a Substack Note or post (like "Restack with a note"), pass its link as quoteUrl rather than in content. To schedule several notes, prefer schedule_notes. To send a Note that is already scheduled to another platform or account, use add_platform_to_scheduled_note instead: scheduling it again creates a separate Note. connectionWarnings with action RESYNC_SUBSTACK_SESSION means the Note is scheduled but will not publish until the writer resyncs Substack in Narrareach; tell the writer.
Inputs: platforms (required), scheduledFor (required), media, title, +21 more. Returns: code, count, notes, quote, +35 more
schedule_notesSchedule notesAInspect
Schedule up to 50 notes in one call, each exactly as schedule_note would (same platforms, limits, account defaults and Substack profile rules). Every note is checked first, and each gets its own result: scheduled (scheduleIds), duplicate (already scheduled with the same text, platform and time, so existingScheduleIds are returned and nothing is copied), or failed (reason says what to fix). When items have code SUBSTACK_NOTE_DRAFT_REVIEW, tell the writer how many were saved. Share their common connectionUrl to connect and review those same drafts together; connecting alone does not schedule them. One bad note does not stop the others. A note can quote a Substack Note or post with quoteUrl, as in schedule_note. Give every note its own clientRequestId and reuse the same ids when retrying the batch, so notes that already went through are returned rather than scheduled again. workspace, writer and publication apply to every note. For media, platformVersions, first replies or account choices, use schedule_note for that note.
Inputs: notes (required), writer, workspace, publication. Returns: results, summary, connectedAccount, connectionWarnings
send_dm_reply_draftSend a direct-message replyADestructiveIdempotentInspect
Send one saved direct-message reply from the writer's own account, only after the writer has read and approved its full text and recipient. Supply updatedAt as expectedUpdatedAt. status POSTED means it was sent. SENDING with failureCode DELIVERY_UNCONFIRMED means it may have been sent: ask the writer to check the conversation, and never draft a replacement to retry. A refused send (for example the reply window closed or the account needs reconnecting) returns the draft to review with the reason.
Inputs: draftId (required), expectedUpdatedAt (required). Returns: draft, replyWindow, connectedAccount
send_reader_reply_draftSend reader reply draftADestructiveIdempotentInspect
Publish one saved reply only after the user has reviewed and approved its full text and target comment. Supply updatedAt as expectedUpdatedAt. SENDING is unconfirmed: inspect the thread, never create a replacement to retry. Recovery is available only in the Narrareach app: open Activity, check reply status, then confirm the reply did not post.
Inputs: draftId (required), expectedUpdatedAt (required), substackConnectionId. Returns: draft, connectedAccount
start_substack_verificationRequest a Substack codeAInspect
Request verification for the selected Substack connection after its owner asks to continue. Returns an email or authenticator code prompt, or verified: true when Substack confirms without a code. Confirmation can resume previously approved articles waiting on this connection. Does not create a new schedule. Check existing article status before retrying. When a code is needed, ask in a normal chat message, end your turn, and wait for the user’s reply. If a code prompt closes without an answer, keep waiting in the conversation; do not request another code or retry publishing.
Inputs: connectionId (required), scheduledPostId. Returns: id, method, message, required, +14 more
undo_voice_changeUndo voice changeADestructiveInspect
Undo the most recent change to the writer's voice profile, when the writer asks you to. It undoes one change, whoever made it, and can itself be undone. Only the most recent change can be undone, so nothing saved after it is lost. Pass changeId from list_voice_changes to undo that change only if it is still the most recent.
Inputs: writer, changeId, workspace. Returns: change, undone, ruleCount, connectedAccount
update_dm_reply_draftEdit a direct-message reply draftAIdempotentInspect
Change the text of an unsent direct-message reply draft after the writer asks for edits. Supply the draft's updatedAt as expectedUpdatedAt. Nothing is sent.
Inputs: text (required), draftId (required), expectedUpdatedAt (required). Returns: draft, replyWindow, connectedAccount
update_draftUpdate draftADestructiveInspect
Update an unscheduled draft. To attach a cover from ChatGPT, pass the actual chat attachment in coverFile; do not transcribe image bytes or pass a sandbox path. Only the provided fields are changed. Cannot edit drafts owned by other users. An active scheduled Article must be cancelled or amended through a provider-safe schedule workflow; changing its local draft would not reliably update the provider copy. When reviewing a Substack article with the writer, briefly mention once per article that they can ask for a Subscribe button after a named paragraph, a caption beneath it, a paywall before a named section (a paywall makes the article paid-only), or a Freewall before a named section (everyone reads the opening; free and paid subscribers keep reading, and readers without an email are invited to subscribe free). Use the requested position; ask where only if it is ambiguous.
Inputs: id (required), title, coverFile, coverImage, +1 more. Returns: id, title, updatedAt, coverImageUrl, +1 more
update_posting_scheduleUpdate posting scheduleAIdempotentInspect
Save the writer's Note posting cadence for future notes: preferred times, posts per day, days of the week, weekend skipping, schedule mode and timezone. Fields left out keep their saved values. Notes already scheduled are not moved. Only the account owner can change it (the personal account, or the owner of a team workspace). Returns the saved schedule and the next open slot.
Inputs: timezone, timeSlots, workspace, daysOfWeek, +3 more. Returns: saved, message, timezone, effective, +3 more
update_reader_activityUpdate reader activityCDestructiveIdempotentInspect
Move an owned reader activity item to Inbox or History.
Inputs: activityId (required), triageState (required), substackConnectionId. Returns: success, triageState, connectedAccount
update_reader_reply_draftUpdate reader reply draftBInspect
Edit an unsent reply draft and record the revision. Supply its current updatedAt as expectedUpdatedAt. Does not publish.
Inputs: text (required), draftId (required), expectedUpdatedAt (required), substackConnectionId. Returns: draft, connectedAccount
update_scheduled_note_accountChange scheduled note accountADestructiveIdempotentInspect
Send an already scheduled Note from a different connected account on Threads, Facebook, TikTok, Pinterest, X or Instagram. Use the scheduled Note id and an accountId from list_social_accounts, or from list_instagram_destinations for Instagram (an account outside the plan is refused). Each Instagram account a Note goes to is its own scheduled Note: change the one for the account the writer named, not another version of the same Note. Works only while the Note has not started sending. A Note already scheduled for that account from the same draft is refused as a duplicate. A Note held for an account choice resumes if its time is still ahead; if its time has passed, the result has needsNewTime: true and the Note must be rescheduled. Only change the account the writer asked for. Personal account only: it changes Notes you own, not a team workspace's.
Inputs: id (required), accountId (required). Returns: id, changed, resumed, platform, +3 more
update_settingsUpdate settingsADestructiveIdempotentInspect
Change the writer's preferences: preferredTimezone, capitalizeGeneratedNotes, writingLanguage (the default language AI writes in), uiLanguage (the language the Narrareach app is shown in), articleLinkPlacement (where article links go in Notes: COMMENT or BODY), articleFollowUpDelivery (whether follow-up posts made from a published article are scheduled on the writer's cadence, SCHEDULE, or saved as Note drafts to review first, DRAFTS), and tagArticleLinksWithUtm (add UTM tags to article links). Only the fields passed change; call get_settings first and change only what the writer asked for. Default accounts, connections, notifications, billing and security cannot be changed here: the writer changes them in Narrareach Settings. To move one scheduled Note to another connected account, use update_scheduled_note_account. Personal account only.
Inputs: uiLanguage, writingLanguage, preferredTimezone, articleLinkPlacement, +3 more. Returns: updated, preferences, connectedAccount
update_voice_examplesUpdate voice examplesAIdempotentInspect
Choose which of the writer's own posts show how they sound, when the writer asks you to: pin posts so they are used first (up to 6), unpin them, exclude posts that are not how they sound, restore excluded posts, or reset to their most recent posts. Example ids come from list_voice_examples. One call is one change the writer can undo.
Inputs: pin, reset, unpin, writer, +3 more. Returns: undo, pinned, changed, removed, +1 more
update_voice_profileUpdate voice profileAIdempotentInspect
Set sections of the writer's voice profile when the writer asks you to: how they sound, their niche, their audience, their instructions for drafts, or their topics. Pass only the sections to change; each replaces what is there (topics replaces the whole list). Use the writer's own words and never fill a section in on your own. Style only: it cannot allow invented facts, stories, quotes, or numbers. One call is one change the writer can undo.
Inputs: niche, topics, writer, audience, +3 more. Returns: undo, changed, profile, connectedAccount
update_voice_ruleUpdate voice ruleAIdempotentInspect
Reword one rule in the writer's voice profile, when the writer asks you to change it. Use the rule id from get_voice_profile. Style only: a rule cannot allow invented facts, stories, quotes, or numbers.
Inputs: text (required), ruleId (required), writer, workspace. Returns: undo, changed, ruleCount, connectedAccount
update_voice_stancesUpdate voice stancesAIdempotentInspect
Add or remove stances in the writer's voice profile: what they believe ("believe") or would never say ("never"). Add only stances the writer has stated in their own words; never infer one. Stance ids for removal come from get_voice_profile. One call is one change the writer can undo.
Inputs: add, remove, writer, workspace. Returns: undo, changed, stances, stanceCount, +1 more
upload_mediaUpload mediaAInspect
Upload one image or video for later scheduling from a public HTTPS URL, data URI, base64 bytes, or a file the user attached in the chat. In ChatGPT, pass an attached image or video in file. URL ingestion depends on the source host allowing automated access. Files that exist only in your client (sandbox paths, local disk) are unreachable as url or data: use file where supported, send their bytes as a data URI or base64, or ask the user for a public HTTPS link, such as a Canva download or share link. Success is confirmed only by the returned publicUrl. Returns a public media URL. API documentation: https://www.narrareach.com/api-docs.
Inputs: kind (required), url, data, file, +3 more. Returns: kind, size, sha256, uploaded, +3 more
verify_substackConfirm your Substack connectionADestructiveInspect
Compatibility tool for existing connections. New clients can use get_substack_verification_status, start_substack_verification, complete_substack_verification, and cancel_substack_verification for individual operations. Confirm Substack without leaving this conversation or signing in again. Use the exact connectionId from the publishing response or get_user_profile. Check status first. When the user wants to continue, use start to request a code, then ask them for it here. If start returns verified: true, skip code entry. Ask in a normal chat message and wait for the user’s reply; if a prompt closes without an answer, keep waiting in chat without requesting another code. Use complete with the returned id and the code they provide. Never guess a code, repeat submissions automatically, or send the code to another tool. Only the connected account owner can confirm. After completion, poll the existing schedule if its ID is known. Otherwise promptly retry the same saved draft with the original settings; the scheduler checks for an existing matching schedule before creating one. Verification is not proof of scheduling or publishing.
Inputs: action (required), connectionId (required), id, code, +1 more. Returns: id, method, message, required, +14 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityCmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs117 npm46 PyPIMIT
- AlicenseAqualityDmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.169 npm1MIT

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