Start here
How the connector works
Narrareach uses the Model Context Protocol over HTTPS. Claude and ChatGPT discover the endpoint, register an OAuth client dynamically, send the user through Narrareach sign-in, and authorize future MCP requests. MCP is included on paid plans with scheduling and analytics.
One URL
Users provide
/mcp. The client discovers the rest.OAuth
Users grant permissions through Narrareach. No shared secrets are exposed.
DCR + PKCE
Dynamic client registration and PKCE S256 handle client setup safely.
Claude
Add Narrareach as a custom connector
In Narrareach, open Settings > Connect LLMs, then use the values below in Claude. Leave Advanced settings closed. Claude registers the OAuth client automatically.
Name
NarrareachConnector URL
https://www.narrareach.com/mcp
ChatGPT
Add Narrareach as a ChatGPT plugin
In Narrareach, open Settings > Connect LLMs, then create a ChatGPT plugin with the values below. Keep Authentication set to OAuth. Users should not paste a client ID or client secret.
- In ChatGPT, open Plugins settings and create a new plugin.
- Enter the Name, optional description, and Server URL below.
- Keep Authentication on OAuth, accept the custom MCP warning, then Create.
- Complete Narrareach sign-in with the same email as your Narrareach account.
Name
NarrareachDescription
Content growth engine for writersServer URL
https://www.narrareach.com/mcpNew Plugin
×Icon (optional)
+
PNG only. Best results at 256 × 256 px or larger.
Max file size: 10 KB
Connection
Server URLTunnel
https://www.narrareach.com/mcp
Authentication
OAuth▾
Advanced OAuth settings
Review discovered OAuth settings, or enter them manually.
Custom MCP servers introduce risk. Learn more
Create
Admin note
If your auth provider still enforces a redirect allowlist, add the ChatGPT callback URI shown in ChatGPT app management (for example
https://chatgpt.com/connector/oauth/…). Ensure the OAuth client can request openid, profile, email, and offline_access. That is an admin setup task, not a user setup step.Common questions
Why does ChatGPT say “Resource not found” when the Narrareach tools are visible?
ChatGPT may be unable to resolve a cached plugin action or an earlier attachment before it sends the request to Narrareach. Start a new chat so ChatGPT reloads the tool list. If the error continues, remove and reconnect the Narrareach plugin, then attach the image again. Successful profile or read actions do not rule out this client-side action or attachment error.
How should I send a ChatGPT-generated image with an article?
Send the actual image bytes, not a temporary ChatGPT attachment reference or a
blob: or file: URL. Ask ChatGPT to use schedule_article with coverImage or media as a data URI or base64 value. It can also call upload_media first and use the returned public URL.Can create_draft save an article image by itself?
create_draft accepts a title and optional HTML body; it does not accept an attached image object. To keep the article as a draft, create it first and then call update_draft with coverImage. To schedule immediately, use schedule_article, which accepts cover and inline media.OAuth metadata
Discovery endpoints
LLM clients discover Narrareach auth from standards-based metadata. These endpoints must remain public and served over HTTPS.
MCP resource
https://www.narrareach.com/.well-known/oauth-protected-resource/mcpAuth server (ChatGPT)
https://www.narrareach.com/.well-known/oauth-authorization-server/mcpAuth server (Clerk)
https://clerk.narrareach.com/.well-known/oauth-authorization-serverResource
https://www.narrareach.com/mcpRequired
The authorization metadata must include a
registration_endpoint.Required
PKCE support must advertise
S256.Tool catalog
What LLMs can do
Connected clients can work with drafts, notes, scheduling, inspiration, analytics, and profile context across Substack, Medium, LinkedIn, X, Bluesky, Threads, Instagram, Facebook, TikTok, and Pinterest. Tool access is scoped to the authenticated Narrareach user. Scheduling responses include the Narrareach item URL; published platform URLs are returned once the destination confirms publish. Article responses may also include non-blocking
advisories; relay these as status updates without treating the accepted schedule as a failure.Tool
Description
list_draftsRead draft summaries from the workspace.
get_draftRead full content for a specific draft.
create_draftCreate a new draft in Narrareach.
update_draftUpdate an existing draft.
list_notesList scheduled or posted notes.
get_noteRead a specific note.
schedule_noteSchedule Notes with images for supported publishing channels.
schedule_articleSchedule posts and articles for supported publishing channels.
list_scheduled_postsRead the current scheduling queue.
reschedule_scheduled_itemMove a queued item to a new time.
cancel_scheduled_itemCancel a queued item.
cancel_scheduled_postCancel an older scheduled post record.
list_inspiration_postsBrowse saved inspiration posts.
get_platform_analyticsRead recent analytics for connected platforms.
get_user_profileRead profile and integration status.
Media
Scheduling with images and video
schedule_note accepts imageUrls for public HTTPS images and media for pasted clipboard images, data URIs, or raw base64. Inline media is uploaded first, then the scheduled note stores the returned public URL. Article images and videos are handled through article HTML or draft media, not a top-level imageUrls field on schedule_article. Server-to-server callers can pass note images to POST /api/v1/noteswith imageUrls.Platform
Note media limit
Substack
Up to 6 images
X
Up to 4 images or 1 video; images and video cannot be mixed
Bluesky
Up to 4 images or 1 video; images and video cannot be mixed
Instagram
At least one media item is required; up to 10 total media items
TikTok
Up to 35 images or 1 video; images and video cannot be mixed
Pinterest
One media item is required
LinkedIn
Images are supported through the connected posting path
Threads
Images are supported through the connected posting path
Facebook
Images are supported through the connected posting path
JSON-RPC example
{
"jsonrpc": "2.0",
"id": "schedule-image-note",
"method": "tools/call",
"params": {
"name": "schedule_note",
"arguments": {
"content": "A short note with an attached image.",
"platforms": ["SUBSTACK", "X", "THREADS"],
"scheduledFor": "2026-07-01T14:00:00.000Z",
"timezone": "America/New_York",
"threadsTopicTag": "Creator Economy",
"imageUrls": ["https://cdn.example.com/note-image.png"]
}
}
}Local URLs
blob: and file: URLs cannot be fetched by Narrareach. Upload the media or pass it through media.Validation
Platform media limits are checked before Narrareach creates scheduled rows.
REST API
Schedule articles from your server
REST callers can schedule full articles with
POST /api/v1/articles. Article scheduling supports SUBSTACK, MEDIUM,LINKEDIN, and X. Use an automation token witharticles:write; note-only tokens cannot schedule articles. LinkedIn articles must be scheduled at least 20 minutes ahead. SetaddSearchMetadata to generate SEO metadata for supported article destinations; X does not expose separate article SEO settings.When LinkedIn has a pending connection sync, create and reschedule requests return HTTP 409 with
PLATFORM_SESSION_REFRESH_REQUIRED andcanRetryAfterSync: true. New article input is saved first, and create responses include saved: true with the saved draftId. Nothing is scheduled until the connection is synced; sync LinkedIn in Platform connections, then retry the same request using that draft.Uploaded article video is available for Substack-only article requests. Add
kind: "video" to an item in mediaand place it with a 1-based {{media:N}} marker incontentHtml. Omitting kind remains backward-compatible and treats the item as an image. Narrareach accepts MP4, WebM, MOV, and M4V video up to 100MB when fetched from a public URL; inline REST data is additionally limited by the 15,000,000-character request field (about 10.7 MiB of decoded base64 bytes). A request containing article video is rejected with VIDEO_REQUIRES_SUBSTACK_ONLY if Medium, LinkedIn, or X is also selected, so video is never silently omitted. If saved structured content and HTML disagree about the number or identity of their videos, Narrareach returnsCONTENT_OUT_OF_SYNC before publishing; re-save the draft and retry. Narrareach creates or recovers the remote Substack draft first, then saves its draft context and Substack's media upload id before bounded transcode polling. If the video is still processing, scheduled requests remain accepted and safely queued for an automatic retry that reuses the same draft and upload instead of creating duplicates or sending the bytes again. Direct publish requests return VIDEO_PROCESSING while preserving the same retry-safe state. During an operator pause, the API returns VIDEO_DISABLED with HTTP 503 before creating a remote draft; retry after service is restored.Successful article create and reschedule responses may include an
advisories array when a selected platform is experiencing publishing delays. Advisories are informational: the request remains accepted, no acknowledgement is required, and actionRequired is false.For retry-safe note creation, send a stable
Idempotency-Key header toPOST /api/v1/notes. The existing idempotencyKeybody field remains supported and must match the header when both are present. New idempotent note responses include an operationId; useGET /api/v1/operations/:id with notes:read to inspect recovery status after a timeout.Read the current delivery state with
GET /api/v1/article-schedules/:idor GET /api/v1/notes/:id. Status responses are ownership-scoped and never cached. Integrations can validate a stored credential without scheduling content throughGET /api/v1/auth/check.Threads notes may include one optional
threadsTopicTag through eitherschedule_note or POST /api/v1/notes. IncludeTHREADS in platforms. The topic is limited to 50 characters and cannot contain periods, ampersands, or line breaks; it is stored only on the Threads destination when a note targets multiple platforms.Create
POST /api/v1/articles creates or schedules an existing draft.Move
PATCH /api/v1/article-schedules/:id changes the queued time.Read
GET /api/v1/article-schedules/:id returns the current state.Cancel
DELETE /api/v1/article-schedules/:id cancels a queued article.Schedule article
curl -X POST https://www.narrareach.com/api/v1/articles \
-H "Authorization: Bearer $NARRAREACH_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "My full article",
"subtitle": "Optional subtitle",
"contentHtml": "<p>Hello from the API.</p>",
"platforms": ["SUBSTACK", "LINKEDIN", "X"],
"scheduledFor": "2026-07-01T14:00:00.000Z",
"timezone": "America/New_York",
"sendToNewsletter": true,
"isPaidContent": false,
"addSearchMetadata": true,
"linkedinShareCommentary": "New long-form piece is queued.",
"idempotencyKey": "article-2026-07-01-001"
}'Schedule Substack article video
curl -X POST https://www.narrareach.com/api/v1/articles \
-H "Authorization: Bearer $NARRAREACH_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Article with video",
"contentHtml": "<p>Watch the walkthrough:</p>{{media:1}}",
"media": [{
"kind": "video",
"sourceType": "url",
"url": "https://cdn.example.com/walkthrough.mp4",
"mimeType": "video/mp4",
"fileName": "walkthrough.mp4"
}],
"platforms": ["SUBSTACK"],
"scheduledFor": "2026-07-01T14:00:00.000Z",
"timezone": "America/New_York"
}'Reschedule article
curl -X PATCH https://www.narrareach.com/api/v1/article-schedules/scheduled_post_id \
-H "Authorization: Bearer $NARRAREACH_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"scheduledFor": "2026-07-02T14:00:00.000Z",
"timezone": "America/New_York"
}'Access
Plan and rate limits
Paid plans include MCP access, image-capable scheduling, and analytics. Full Agentic Mode includes REST API and webhook workflows for direct server-to-server integrations.
MCP limit
Each user gets 120 MCP request units per 10 minutes. A JSON-RPC batch consumes one unit per item in the batch.
Bulk scheduling
This allows a 62-item bulk Notes run plus setup and status calls. For image-heavy batches, keep normal client retry/backoff behavior enabled.
Troubleshooting
Common connection issues
Redirect URI mismatch
Confirm dynamic client registration is enabled. If the provider still requires a global allowlist, add the ChatGPT or Claude callback URI at the provider level.
Missing openid scope
ChatGPT requests
openid during authorize. If the Clerk OAuth application only allows profile/email, add openid (and usually offline_access) on that OAuth client.OAuth verification fails
If server logs mention an invalid JWT form, the endpoint is trying to parse an opaque Clerk OAuth credential as a JWT. Validate it through Clerk's OAuth-aware flow instead.
Localhost does not work in hosted clients
Claude and ChatGPT require HTTPS for remote connectors. Use the production URL or expose local development through an HTTPS tunnel.