Mynahcast
Remote MCP server: your agent drafts and schedules brand-voice posts to Bluesky, Mastodon, Telegram, Discord and more; a human approves each one.
Hosted MCP Server
npx add-mcp 'https://api.mynahcast.xyz/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
MCP server
Mynahcast runs a remote Model Context Protocol server so any MCP client (Claude Code, Claude Desktop, Cursor, Codex, Gemini CLI, OpenClaw, Hermes Agent and others) can draft, validate and schedule social media posts for your brand.
Endpoint
POST https://api.mynahcast.xyz/mcp
Transport
Streamable HTTP, stateless JSON-RPC 2.0 (initialize, tools/list, tools/call)
Auth
Authorization: Bearer myn_live_… on every request. Keys never go in the URL.
Tools
Named mynahcast_*, filtered by the key's scopes. Every tool that changes data accepts dry_run.
Approvals
Agent keys can't approve. Posts from agents wait in your Approvals queue.
Connect in three steps
- In the app, open Agents & API → Create key and pick the Agent preset. Copy the key; it's shown once.
- Add the server to your client with the key as a bearer header (examples below, and one page per agent in Connect agents).
- List the tools to check the connection, then ask your agent for a post. It lands in Approvals.
Client configs
Claude Code:
Terminal
claude mcp add --transport http mynahcast https://api.mynahcast.xyz/mcp \
--header "Authorization: Bearer $MYNAHCAST_KEY"
Most clients that read an mcpServers file (Cursor, Kimi Code, Manus import):
mcpServers
{
"mcpServers": {
"mynahcast": {
"url": "https://api.mynahcast.xyz/mcp",
"headers": { "Authorization": "Bearer myn_live_…" }
}
}
}
Raw JSON-RPC, to see the tool list:
curl
curl -X POST https://api.mynahcast.xyz/mcp \
-H "Authorization: Bearer $MYNAHCAST_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Distribution autopilot: product context and styles
Your agent does all the writing. Mynahcast only stores what it saves and checks it. Save your product once, then a style or two:
tools/call
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"mynahcast_set_product_context","arguments":{
"brandId":"<brandId>","productName":"Acme CI","url":"https://acme.dev",
"oneLiner":"CI that fixes flaky tests","audience":"Solo devs shipping SaaS",
"problemsSolved":["flaky tests"],"features":["auto-retry"],
"proof":[{"quote":"Cut our CI time in half","source":"a beta user"}],
"ctaUrl":"https://acme.dev/start","bannedClaims":["guaranteed uptime"]}}}
tools/call
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"mynahcast_save_style","arguments":{
"brandId":"<brandId>","name":"Build in public","sourceReference":"patterns from a dev-tool founder I follow",
"hookPatterns":["a number + a surprising result","a mistake + the fix"],
"tone":"plain, first person","postLength":"under 280 characters","slideCount":6,
"colors":{"background":"#ffffff","text":"#111111","accent":"#3b5ba9"},
"fonts":{"heading":"Inter","body":"Inter"},"isDefault":true}}}
A style holds general patterns only. Agents must never copy a reference account's wording, images, logos, branding or identity.
Distribution autopilot: content memory and the duplicate-hook check
Every post you create is remembered per channel with its hook (the opening line), a topic, the main claim, the style, its status (draft, approved, rejected, published, failed) and, when a reviewer rejects it, the reason. Read it before you write the next batch:
tools/call
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"mynahcast_get_content_memory","arguments":{
"brandId":"<brandId>","limit":50,"status":"rejected"}}}
Leave the topic and claim with each post so later batches can avoid them:
tools/call
{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"mynahcast_create_post","arguments":{
"brandId":"<brandId>","content":{"body":"We rebuilt onboarding in a weekend. Signups doubled."},
"targets":[{"channelId":"<channelId>"}],"schedule":{"at":"2026-10-21T09:30:00+02:00"},
"memory":{"topic":"onboarding","mainClaim":"signups doubled","styleId":"<styleId>"}}}}
A post whose hook is a near-duplicate (normalised text, no AI) of one published on the same channel in the last 30 days is refused with a conflict error that names the earlier post and says what to change. Pass memory.allowDuplicateHook: true only when repeating on purpose.
Tools
mynahcast_validate_postCheck a post against every target channel without saving itmynahcast_create_postCreate a post for one brand, fanned out to one or more channelsmynahcast_get_postRead one post with its per-channel delivery statemynahcast_list_postsList postsmynahcast_update_postEdit a post (an edit voids an earlier approval)mynahcast_reschedule_postMove a post to a new timemynahcast_delete_postDelete a post that hasn't gone outmynahcast_get_post_timelineEvery attempt, approval and read-back for a postmynahcast_submit_for_approvalAsk a human to approve a postmynahcast_decide_approvalApprove or request changes (humans only; agents are refused)mynahcast_list_channelsConnected channelsmynahcast_get_channel_capabilitiesLimits for one channel (characters, media, threads)mynahcast_request_uploadGet a signed URL to upload mediamynahcast_complete_uploadMark an upload as finishedmynahcast_get_brand_voiceRead the brand's voice profilemynahcast_update_brand_voicePublish a new voice version (publisher keys)mynahcast_set_product_contextSave what your product is: URL, one-liner, audience, problems, features, proof, CTA, banned claimsmynahcast_get_product_contextRead the product context before writing a postmynahcast_save_styleSave a style: general patterns from a reference account, never copiesmynahcast_list_stylesList the brand's styles (default first)mynahcast_get_styleRead one style: hooks, tone, length, slides, colours, fontsmynahcast_delete_styleDelete a stylemynahcast_get_content_memoryWhat was drafted, published or rejected: hooks, topics, claims, reasonsmynahcast_stop_allEmergency stop: hold every scheduled post of a brandmynahcast_resume_allResume publishing after stop_allmynahcast_get_batch_promptReady weekly instruction to paste into your own agent (claude -p, codex exec)mynahcast_submit_batchSubmit a weekly batch: validated, auto-scheduled within daily caps, approval per modemynahcast_approve_batchRelease a whole batch with one approval (humans only)mynahcast_set_autopilot_settingsSet approval mode (each_post, whole_batch, autopilot) and per-channel daily cap
OAuth and ChatGPT
The server authenticates with API keys. Use Claude Desktop with the open-source mcp-remote bridge, and connect ChatGPT through a GPT action built from the OpenAPI document.
Same operations over REST
Every MCP tool maps one-to-one to a REST operation under /v1, described by https://api.mynahcast.xyz/v1/openapi.json. See the API reference.