Mynahcast

遠端 MCP 伺服器:你的代理會以品牌語氣草擬貼文並排定發佈至 Bluesky、Mastodon、Telegram、Discord 等平台;每則貼文皆由人工審核。

託管 MCP 伺服器

npx add-mcp 'https://api.mynahcast.xyz/mcp'

可安裝到 Claude Code、Codex、Cursor 等客戶端

文件

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

OAuth 2.1 sign-in (Claude, ChatGPT: paste the URL, sign in, Allow) or Authorization: Bearer myn_live_… on every request. Credentials 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 and connected apps can't approve. Posts from agents wait in your Approvals queue.

Add to Claude

Claude on the web, desktop and mobile connects with one click: no key, you sign in to Mynahcast instead.

  1. In Claude, open Customize → Connectors, then Add custom connector (Team and Enterprise: an Owner adds it under Organization settings → Connectors → Add → Custom → Web).
  2. Paste https://api.mynahcast.xyz/mcp as the server URL. If Claude asks how to identify itself, pick Register automatically. Click Add.
  3. Click Connect. Sign in to Mynahcast with your email code or Google, check the workspace, and click Allow.
  4. Ask Claude for a post. It arrives in Approvals; nothing goes out until you approve it (unless you turned on autopilot for that brand).

Add to ChatGPT

  1. In ChatGPT, open Plugins (Apps & connectors on some plans; turn on developer mode if your workspace asks for it), select +, then Add custom MCP server.
  2. Name it Mynahcast, enter https://api.mynahcast.xyz/mcp under Connection, and choose OAuth for authentication. Review the warning and create it.
  3. Connect, sign in to Mynahcast, and click Allow.
  4. Mention Mynahcast in a chat (type @) and ask for a post. It waits in Approvals like any agent draft.

A connected app works like an Agent key: it can read your channels and posts, write drafts, schedule them for review and upload media. It can never approve posts, turn on autopilot, connect channels, see billing or create keys. Disconnect it any time in Agents & API → Connected apps; access ends on its next request. Trouble connecting? Write to support@mynahcast.xyz.

Connect with an API key

Claude Code, Cursor, Codex, OpenClaw and scripts can keep using a key:

  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

Every name is prefixed mynahcast_

Posts8

  • validate_post Check a post against every target channel without saving it
  • create_post Create a post for one brand, fanned out to one or more channels
  • get_post Read one post with its per-channel delivery state
  • list_posts List posts, filtered by status, channel and time range
  • update_post Edit a post (an edit voids an earlier approval)
  • reschedule_post Move a post to a new time
  • delete_post Delete a post and cancel deliveries that haven't gone out
  • get_post_timeline Every delivery attempt for a post, with platform responses

Approvals2

  • submit_for_approval Ask a human to approve a post
  • decide_approval Approve or request changes (humans only; agents are refused)

Channels2

  • list_channels List connected channels and their health
  • get_channel_capabilities Limits for one channel (characters, media, threads)

Media2

  • request_upload Get a signed URL to upload media
  • complete_upload Mark an upload as finished

Brand voice & context4

  • get_brand_voice Read the brand's voice profile
  • update_brand_voice Publish a new voice version (publisher keys)
  • get_product_context Read the product context before writing a post
  • set_product_context Save what your product is: URL, one-liner, audience, problems, features, proof, CTA, banned claims

Styles & memory5

  • save_style Save a style: general patterns from a reference account, never copies
  • list_styles List the brand's styles (default first)
  • get_style Read one style: hooks, tone, length, slides, colours, fonts
  • delete_style Delete a style
  • get_content_memory What was drafted, published or rejected: hooks, topics, claims, reasons

Batches & automation4

  • get_batch_prompt Ready weekly instruction to paste into your own agent (claude -p, codex exec)
  • submit_batch Submit a weekly batch: validated, auto-scheduled within daily caps, approval per mode
  • approve_batch Release a whole batch with one approval (humans only)
  • set_autopilot_settings Set approval mode (each_post, whole_batch, autopilot) and per-channel daily cap (admin keys)

Safety2

  • stop_all Emergency stop: hold every scheduled post of a brand
  • resume_all Resume publishing after stop_all

How sign-in works

The server accepts two credentials on Authorization: Bearer …: a Mynahcast API key, or an OAuth 2.1 access token. Without one, POST /mcp answers 401 with a WWW-Authenticate header pointing at https://api.mynahcast.xyz/.well-known/oauth-protected-resource/mcp (RFC 9728), so MCP clients discover the authorization server by themselves. It supports Dynamic Client Registration, the authorization code flow with PKCE (S256 only), refresh token rotation and token revocation. Access tokens last an hour and work only on the MCP endpoint they were issued for.

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.