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

  1. In the app, open Agents & API → Create key and pick the Agent preset. Copy the key; it's shown once.
  2. Add the server to your client with the key as a bearer header (examples below, and one page per agent in Connect agents).
  3. 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_post Check a post against every target channel without saving it
  • mynahcast_create_post Create a post for one brand, fanned out to one or more channels
  • mynahcast_get_post Read one post with its per-channel delivery state
  • mynahcast_list_posts List posts
  • mynahcast_update_post Edit a post (an edit voids an earlier approval)
  • mynahcast_reschedule_post Move a post to a new time
  • mynahcast_delete_post Delete a post that hasn't gone out
  • mynahcast_get_post_timeline Every attempt, approval and read-back for a post
  • mynahcast_submit_for_approval Ask a human to approve a post
  • mynahcast_decide_approval Approve or request changes (humans only; agents are refused)
  • mynahcast_list_channels Connected channels
  • mynahcast_get_channel_capabilities Limits for one channel (characters, media, threads)
  • mynahcast_request_upload Get a signed URL to upload media
  • mynahcast_complete_upload Mark an upload as finished
  • mynahcast_get_brand_voice Read the brand's voice profile
  • mynahcast_update_brand_voice Publish a new voice version (publisher keys)
  • mynahcast_set_product_context Save what your product is: URL, one-liner, audience, problems, features, proof, CTA, banned claims
  • mynahcast_get_product_context Read the product context before writing a post
  • mynahcast_save_style Save a style: general patterns from a reference account, never copies
  • mynahcast_list_styles List the brand's styles (default first)
  • mynahcast_get_style Read one style: hooks, tone, length, slides, colours, fonts
  • mynahcast_delete_style Delete a style
  • mynahcast_get_content_memory What was drafted, published or rejected: hooks, topics, claims, reasons
  • mynahcast_stop_all Emergency stop: hold every scheduled post of a brand
  • mynahcast_resume_all Resume publishing after stop_all
  • mynahcast_get_batch_prompt Ready weekly instruction to paste into your own agent (claude -p, codex exec)
  • mynahcast_submit_batch Submit a weekly batch: validated, auto-scheduled within daily caps, approval per mode
  • mynahcast_approve_batch Release a whole batch with one approval (humans only)
  • mynahcast_set_autopilot_settings Set 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.