The MCP server for social media

One URL gives Claude, ChatGPT, Cursor, Codex or your own agent 79 tools to publish, schedule, design and report across 13 networks.

Streamable HTTP JSON-RPC 2.0 OAuth or API key MCP 2025-06-18
POST/mcp/v1/messages
  1. → Clientinitialize
    {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}

    Your AI says hello and names the version of MCP it speaks.

    ← RobinReach
    {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","serverInfo":{"name":"robinreach","title":"RobinReach"},"capabilities":{"tools":{}},"instructions":"RobinReach is a social media scheduling tool..."}}

    RobinReach agrees on the version and sends notes on how to use its tools, plus your brand's voice settings.

  2. → Clienttools/list
    {"jsonrpc":"2.0","id":2,"method":"tools/list"}

    It asks what it can do.

    ← RobinReach
    {"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"account_status"},{"name":"posts_validate"},{"name":"posts_create"}, … 76 more]}}

    It gets 79 tools back, each with a description and the inputs it needs.

  3. → Clienttools/call posts_validate
    {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"posts_validate","arguments":{"social_profile_ids":[41,57],"content":"Speckled mugs are back on Friday."}}}

    Before saving anything, it checks the post for Instagram and LinkedIn.

    ← RobinReachresult.content[0].text
    {"status":"success","message":"All validation checks passed. Ready to create."}

    RobinReach confirms the post passes every network's rules.

  4. → Clienttools/call posts_create
    {"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"posts_create","arguments":{"social_profile_ids":[41,57],"content":"Speckled mugs are back on Friday.","post_status":"scheduled","publish_time":"2026-11-06T09:00","timezone":"America/New_York"}}}

    It schedules the post for Friday at 9:00, New York time.

    ← RobinReachresult.content[0].text
    {"success":true,"post_id":18342,"status":"scheduled","platforms":["instagram","linkedin"],"message":"Post scheduled for November 6 at 9:00 AM EST."}

    The post is on the calendar for both networks.

A real exchange with example IDs. Every message is one POST to the same URL.

Connect

Everything a client needs to know

One endpoint, a sign-in or a key, plain JSON-RPC. If your tool speaks MCP over HTTP, it can talk to RobinReach.

POSThttps://robinreach.com/mcp/v1/messages
Endpoint
POST /mcp/v1/messages on robinreach.com. Every JSON-RPC message goes to this one URL.
Authentication
Claude and ChatGPT sign in with OAuth 2.1: authorization code with PKCE (S256), dynamic client registration and .well-known discovery, so the user only pastes the URL. Every other client sends an API key as Authorization: Bearer, or adds ?api_key= to the URL.
Transport
Streamable HTTP. Messages are POSTs answered with JSON. GET returns 405 because the server never pushes, and OPTIONS answers CORS preflights from any origin.
Protocol
JSON-RPC 2.0, MCP versions 2025-06-18 and 2025-03-26. One message per request: batches are refused, so a retry can never post twice.
Methods
initialize, ping, tools/list and tools/call. Notifications get 202 Accepted.
Plans
Included with Bloom, Thrive and Scale. On other plans every call returns a clear JSON-RPC error that says how to upgrade.
Keys
A master key reaches every brand on the account (pass brand_id). A brand key reaches one brand and needs no brand_id. An OAuth connection is one or the other: the user picks the whole account or one brand when signing in.
Handshake
initialize returns usage notes for the model plus the brand's tone, mission, language and time zone, so posts sound right from the first call.
Tool reference

All 79 tools

This list is built from the same registry the server answers tools/list with, so it is always current.

Showing 79 of 79 tools

  • posts_validate Posts and scheduling

    Validate post content/platform_options before creating, updating, or publishing. Always call this first. Fix any returned errors and re-validate before posts_create / posts_update / posts_publish_now. Pass post_id when validating changes to an existing post so validation checks its already-attached media (e.g. an Instagram post with no new media_urls but existing images) instead of assuming no media is attached. When the update will use replace_media: true, pass replace_media: true here too, so the post is checked with only the new media_urls.

    Requiressocial_profile_ids 9 optional inputs
  • posts_create Posts and scheduling

    Create and schedule (or save as draft) a post across one or more social profiles. Call posts_validate first. LinkedIn: up to 20 images per post; set platform_options.linkedin.carousal "1" to publish them as one PDF document instead (no 20-image cap), and always set platform_options.linkedin.document_title for a carousel or PDF. A PDF in media_urls posts as a LinkedIn document and needs LinkedIn to be the only platform. For LinkedIn image posts, write platform_options.linkedin.alt_text (one description per image, separated by semicolons).

    Requiressocial_profile_ids 12 optional inputs
  • posts_update Posts and scheduling

    Update an existing, unpublished post. Call posts_validate first with the merged content/options. media_urls is APPEND-ONLY by default; pass replace_media: true to replace existing attachments instead of adding to them. A library url whose file is already on the post is not added again (it is listed in media_already_attached). labels is also APPEND-ONLY by default; pass replace_labels: true to replace the post's entire label set instead of merging into it.

    Requirespost_id 12 optional inputs
  • posts_publish_now Posts and scheduling Confirm first

    Publish a draft/scheduled/approved post immediately. Always show the content preview and get explicit user confirmation first.

    Requirespost_id 1 optional input
  • posts_delete Posts and scheduling Confirm first

    Permanently delete a post. Always confirm with the user first.

    Requirespost_id 1 optional input
  • posts_delete_from_platform Posts and scheduling Confirm first

    Delete a published post from specific social platforms (same as the dashboard's Delete from Platform). Supported: Facebook, LinkedIn, X, Threads, Telegram, Bluesky, Pinterest, YouTube, WordPress, Mastodon. Always confirm with the user first.

    Requirespost_idsocial_profile_ids 1 optional input
  • posts_reschedule Posts and scheduling

    Change the publish_time of a scheduled post.

    Requirespost_idnew_publish_time 1 optional input
  • posts_list Posts and scheduling

    List posts for a brand, optionally filtered by status and/or labels (matches ANY given label). Paginated, 10 per page.

    4 optional inputs
  • posts_get_status Posts and scheduling

    Get per-platform publish status for a post, with suggested fixes for any failures.

    Requirespost_id 1 optional input
  • posts_bulk_create Posts and scheduling

    Create up to 20 posts in one call. Each post is validated independently; partial failures are reported per-index.

    Requiresposts 1 optional input
  • media_view Images and media

    The only way to actually see image content (returns downscaled base64, up to 10 at once). ALWAYS call this before writing a caption for, or describing, a specific image; never guess from a filename like 'big.jpg'.

    3 optional inputs
  • media_rename Images and media

    Rename a media library file, e.g. to fix a name the public will see: a PDF's name is the title LinkedIn shows on a document post when no document_title is set. The file keeps its extension and its url, so posts already using it are unaffected and pick up the new name. Take attachment_id from media_search.

    Requiresattachment_idmedia_new_name 1 optional input
  • media_delete Images and media

    Permanently delete media library files (up to 20 per call). Always confirm with the user first, naming the files. If a file is used by a post that hasn't gone out yet, nothing is deleted and the answer has needs_confirmation with those posts: show them to the user, and only after a clear yes call again with force_delete: true. Files only used in already-published posts are deleted right away; the live posts are unaffected.

    Requiresattachment_ids 2 optional inputs
  • media_folders Images and media

    List media library folders with attachment counts.

    1 optional input
  • media_search_unsplash Images and media

    Search Unsplash for stock photos. Credit the photographer when used.

    Requiresquery
  • media_generate_ai_image Images and media

    Generate an AI image from a text prompt. It is saved to the RobinPixel folder of the media library and shows in Recent images on the RobinPixel page. Optional: model ("gpt_image" default, or "nano_banana_pro"), image_format (1:1, 16:9, 4:3, 9:16, 3:4) or the older size list, image_style, and image_guidelines (up to 1,000 characters). Standard resolution only; 2K and 4K are on the RobinPixel page. Pass post_id to attach it directly to a post (add replace_media: true to replace that post's existing media instead of appending). Check quota first; fall back to media_search_unsplash if low.

    Requiresimage_prompt 8 optional inputs
  • media_upload Images and media

    Download a public file_url (image, video or PDF) into the media library. Returns job_id; poll media_upload_status a few seconds later to get the final url before using it in media_urls.

    Requiresfile_url 3 optional inputs
  • media_upload_status Images and media

    Check the status of a media_upload job_id.

    Requiresjob_id 1 optional input
  • media_direct_upload_create Images and media

    Start a direct upload for a local file with no public URL yet (screenshots, videos). Returns a signed upload_url; PUT the raw file bytes there immediately (it expires in minutes), then call media_direct_upload_finalize.

    Requirescontent_typebyte_sizechecksum 2 optional inputs
  • media_direct_upload_finalize Images and media

    Finalize a direct upload after PUTting the file bytes, using the signed_id from media_direct_upload_create. Returns the permanent attachment url. Safe to retry: finalizing the same signed_id again returns the same attachment.

    Requiressigned_id 2 optional inputs
  • media_upload_from_chat Images and media

    Upload image, video or PDF files attached directly in this chat (e.g. an image you just generated; a PDF posts as a LinkedIn document) into the RobinReach media library. Put each file in its own field, file_1 to file_5 (call again for more than five); never ask the user for a public URL for these. Returns library URLs; use them in media_urls on posts_create / posts_update / posts_bulk_create.

    8 optional inputs
  • analytics_get Analytics

    Get raw engagement metrics for one social profile over a date range (default: last 30 days). A Google Business Profile answers with Google's own daily numbers under business (profile views on Search and Maps, website clicks, calls, direction requests, conversations, bookings, menu clicks) and post_analytics false, since Google has no per-post numbers.

    Requiressocial_profile_id 4 optional inputs
  • analytics_top_posts Analytics

    Get the best-performing posts by engagement over a date range.

    6 optional inputs
  • analytics_calendar Analytics

    Get the next 14 days of scheduled posts, with any gap days flagged.

    1 optional input
  • analytics_performance_summary Analytics

    Compare this week's engagement and post count to last week's, with a plain-language recommendation.

    2 optional inputs
  • analytics_post Analytics

    Get live engagement metrics for a published post, across every profile it was published to (or one specific profile if social_profile_id is given). Aggregates per-platform results. A result with `warnings` is missing some metrics (for example a Facebook Reel's views): tell the user which and why. X (Twitter) numbers are not live: they are the ones RobinReach read 1, 3 and 7 days after publishing, on the Scale plan.

    Requirespost_id 2 optional inputs
  • comments_list Comments

    List comment threads across social profiles, sorted by most recent, with unread counts. A thread is one post's comment section. Each thread has likeable (whether comments_like works on it), last_comment (the newest message, which may be the brand's own reply), and recent_comments: the newest comments from other people, up to 5, each with external_id and liked (incoming_count is the full total). Goodwill comments (thanks, hearts, emoji, congratulations) usually deserve a like rather than a reply; group them and offer to like them with comments_like. Google Business reviews appear here too, as threads with kind "review", a rating from 1 to 5 and has_reply; they can't be liked. YouTube comments (Thrive and Scale plans) appear as threads with platform "youtube", one per video; they can't be liked, and each brand can send 30 YouTube replies a day, so never bulk-reply.

    4 optional inputs
  • comments_reply Comments

    Reply to a comment thread. Requires Bloom or higher (YouTube threads: Thrive or Scale, capped at 30 replies per brand per day); rate-limited to 10/minute per company. On a Google review (kind "review") the reply is public on Google and replaces any earlier reply; reply_to_comment_id is ignored. Always show the user the draft before replying to a 1, 2 or 3 star review.

    Requiresthread_idmessage 2 optional inputs
  • comments_like Comments

    Like a comment as the brand, given thread_id and comment_id (an external_id from the thread's recent_comments in comments_list). The right response to goodwill comments where a reply would feel overbearing. Only works on threads where likeable is true (Facebook Pages and LinkedIn today); otherwise suggest a reply. Never like complaints, criticism, spam, or anything offensive. Only comments from other people can be liked, not the brand's own replies. One-way: likes can't be undone through this tool, so confirm with the user before liking more than a few at once. Liking an already-liked comment is a safe no-op. Requires a plan that includes comment replies; rate-limited to 30/minute per company.

    Requiresthread_idcomment_id 1 optional input
  • style_learn Brand voice

    Analyze the brand's past posts (or, for fresh accounts, brand tone) to learn tone, length, emoji/hashtag usage, and structure. Cached for a year.

    3 optional inputs
  • style_save_feedback Brand voice

    Save a voice/style correction after the user edits or rejects generated content, e.g. "prefers shorter captions on instagram". Also used by the composer's AI caption chat in the app.

    Requiresfeedback 2 optional inputs
  • account_best_time Planning

    Get the next available posting slot based on the brand's preferred times/days.

    1 optional input
  • account_audience_best_times Planning

    Best posting times per platform from the brand's own post engagement over the last 90 days (the Best time to post rule of the Reports page), each with a suggested time, a confidence level and why, falling back to the brand's saved posting times or the network's usual peak hours where its numbers are thin. start_date and end_date pick the past posts to read, not the dates to schedule. Prefer this over guessing a schedule time.

    5 optional inputs
  • account_hashtag_groups Planning

    List saved hashtag groups for a brand.

    1 optional input
  • pillars_save Planning

    Save the brand's content pillar mix, e.g. 40% Educational, 30% Promotional, 30% Behind-the-scenes. Percentages must sum to ~100.

    Requirespillars 1 optional input
  • pillars_list Planning

    Get the saved content pillar mix. Call when planning any content calendar.

    1 optional input
  • templates_save Planning

    Save reusable post content as a template. Use {placeholder} syntax for variables.

    Requirestemplate_nametemplate_content 2 optional inputs
  • templates_list Planning

    List saved templates. Call before creating recurring content types.

    1 optional input
  • templates_use Planning

    Fill a saved template's placeholders with values to produce ready-to-post content.

    Requirestemplate_name 2 optional inputs
  • bio_page_get Bio Page

    Get the brand's Bio Page, its link in bio page: settings, public_url, whether it is published and live, every block top to bottom, post_grid_profiles (the profiles a post grid can show) and the supported embed providers. Each brand has exactly one Bio Page, created automatically on first use and free on every plan. Call this before changing the page.

    1 optional input
  • bio_page_update Bio Page

    Update the Bio Page: title, bio text, slug (its address), theme color, light or dark appearance, background, profile picture, post grid columns, the social icons row, and bio_published to put it live or take it offline. Only the fields you pass change. Images must be media library urls: import them first with media_upload, media_upload_from_chat or media_direct_upload_create, or reuse a url from media_search or media_generate_ai_image. Changing bio_slug breaks the old address, so confirm with the user first. Validation errors such as a taken slug come back in errors, exactly as the dashboard shows them.

    14 optional inputs
  • bio_blocks_create Bio Page

    Add a block at the bottom of the Bio Page: a link button, a card (product or offer with optional image, price and button; consecutive cards can be set to a swipeable carousel), a post_grid (latest posts published through RobinReach from one profile, taken from post_grid_profiles in bio_page_get), an embed (YouTube, Vimeo, TikTok, Spotify, SoundCloud or Apple Music player) or a heading (a section label, shown as a bold title or a divider line, such as Shop or Watch). Put the content in bio_block_settings; bio_block_image_url sets a card's image. Use bio_blocks_reorder to move it.

    Requiresbio_block_typebio_block_settings 2 optional inputs
  • bio_blocks_update Bio Page

    Change a Bio Page block's content. Only the bio_block_settings keys you pass change ("" clears one); bio_block_image_url replaces a card's image. A block's type cannot change: add a new block and delete the old one instead.

    Requiresbio_block_id 3 optional inputs
  • bio_blocks_delete Bio Page Confirm first

    Permanently remove a block from the Bio Page, along with its click stats. Always confirm with the user first.

    Requiresbio_block_id 1 optional input
  • bio_blocks_reorder Bio Page

    Set the order of the Bio Page blocks. Pass bio_block_ids top to bottom. Blocks you leave out keep their current order below the ones you list, so passing one id moves that block to the top.

    Requiresbio_block_ids 1 optional input
  • bio_page_analytics Bio Page

    Bio Page stats, the same figures as the dashboard's Bio Page analytics: views, clicks and click-through rate on every plan; on paid plans also unique visitors, bounce rate, a daily views and clicks trend for the last 30 days, the most clicked blocks, traffic sources, countries and devices. Bot traffic is excluded. Use it to answer how the link in bio page is doing or which link gets the most clicks.

    1 optional input
  • comment_automations_list Comment to DM

    List Comment to DM automations for a brand, with every setting of each one, the social profiles that can run one (Facebook Pages and Instagram professional accounts only) and remaining plan quota. Call this before offering to create one: check can_use_comment_automation and comment_automations_remaining, and take social_profile_id from available_social_profiles. Each profile's triggers_on_all_posts says whether its automations fire on every post (always true for a Facebook Page) or only on posts published through RobinReach (an Instagram account that needs reconnecting once with Connect Via Instagram); tell the user when it is false.

    1 optional input
  • comment_automations_create Comment to DM

    Create a Comment to DM automation on one Facebook Page or Instagram professional account: people who comment get an automatic private DM. Call comment_automations_list first for a valid social_profile_id and the plan quota; the profile is fixed for the life of the automation (create a new one to target another page/account). Starts on: comment_automation_trigger_mode "keywords" (default; comment_automation_keywords then required, matched case-insensitively, single words with light stemming, multi-word phrases as an exact substring) or "any_comment" (everyone who comments). Timing: right away, or comment_automation_delay_minutes later. What they get: comment_automation_dm_message as plain text (comment_automation_button_style "none"), with one link button ("link"), or with a tap button that sends the link after the tap ("tap"); "link" and "tap" need comment_automation_button_url, and every button text has a default. Only "tap" can check that the person follows the account before the link goes out (comment_automation_require_follow, Instagram only) or send one reminder to people who got the link but didn't open it (comment_automation_follow_up_enabled); a "link" automation that asks for either is switched to "tap" automatically, as in the dashboard, and the response's note says so. Optional public reply under the comment (comment_automation_send_public_reply, which requires comment_automation_public_reply_message). Each person is only ever DM'd once per automation, even if they comment again later or while a delayed DM is waiting: deliberate spam prevention, not a bug. Facebook fires on top-level comments on any Page post. Instagram fires on every comment, replies included, on every post when the profile's triggers_on_all_posts (from comment_automations_list) is true, and otherwise only on posts published through RobinReach until the account is reconnected.

    Requiressocial_profile_idcomment_automation_namecomment_automation_dm_message 17 optional inputs
  • comment_automations_update Comment to DM

    Change any setting of an existing Comment to DM automation: name, trigger mode and keywords, delay, DM message, button style, link and button texts, follower check and its message, reminder with its message and timing, public reply, and whether it is active. Pass only what changes; everything else stays as it is. The same rules as comment_automations_create apply: the follower check (Instagram only) and the reminder need the "tap" style, and a "link" automation is switched to it automatically when either is turned on. The social profile it's attached to cannot be changed; create a new automation instead.

    Requirescomment_automation_id 20 optional inputs
  • comment_automations_delete Comment to DM Confirm first

    Permanently delete a Comment to DM automation. Always confirm with the user first.

    Requirescomment_automation_id 1 optional input
  • comment_automations_toggle_active Comment to DM

    Pause or resume a Comment to DM automation without changing its settings.

    Requirescomment_automation_id 1 optional input
  • rss_list RSS feeds

    List all RSS feeds for the brand.

    1 optional input
  • rss_validate RSS feeds

    Validate RSS feed parameters. Always call before rss_create or rss_update; never call those without a preceding successful rss_validate.

    13 optional inputs
  • rss_create RSS feeds

    Create an RSS feed. Call rss_validate first. rss_publish_immediately and rss_auto_schedule are mutually exclusive.

    Requiresrss_feed_namerss_feed_url 15 optional inputs
  • rss_update RSS feeds

    Update an existing RSS feed. Call rss_validate first.

    Requiresrss_feed_id 17 optional inputs
  • rss_delete RSS feeds Confirm first

    Permanently delete an RSS feed (does not delete posts it already created). Always confirm with the user first.

    Requiresrss_feed_id 1 optional input
  • rss_toggle_pause RSS feeds

    Pause or resume an RSS feed. Resuming checks the feed for new items right away and restarts its schedule.

    Requiresrss_feed_id 1 optional input
  • rss_sync RSS feeds

    Manually trigger an RSS feed sync now.

    Requiresrss_feed_id 1 optional input
  • repurposing_list Repurpose and import

    List repurposing tasks and the available_source_profiles, the only profiles valid as a source. Any connected profile can be a destination.

    1 optional input
  • repurposing_create Repurpose and import

    Create a task that repurposes content from one source profile to one or more destination profiles. Call repurposing_list first; only offer source profiles from its available_source_profiles list.

    Requiressource_profile_iddestination_profile_ids 6 optional inputs
  • repurposing_update Repurpose and import

    Update a repurposing task's source, destinations, or settings.

    Requiresrepurposing_task_id 8 optional inputs
  • repurposing_delete Repurpose and import Confirm first

    Permanently delete a repurposing task. Always confirm with the user first.

    Requiresrepurposing_task_id 1 optional input
  • repurposing_toggle_pause Repurpose and import

    Pause or resume a repurposing task.

    Requiresrepurposing_task_id 1 optional input
  • repurposing_run Repurpose and import

    Run a repurposing task now. Returns how many posts it created, or why nothing could be fetched from the source (for example an expired connection).

    Requiresrepurposing_task_id 1 optional input
  • content_article_to_posts Repurpose and import

    Convert an article URL into draft posts, optionally tagged with custom hashtags.

    Requiresarticle_url 4 optional inputs
  • store_sync_products Repurpose and import

    Sync products from a connected Shopify/Etsy/WooCommerce store into new draft posts. Pass store_type: "auto" to detect automatically.

    2 optional inputs
  • account_status Account and networks

    Get plan limits/usage, brand settings, connected profiles, voice preferences, and writing style. Call once at the start of a session.

    1 optional input
  • account_brands Account and networks

    List every brand on this account with profile/post counts. Use when the account has multiple brands and you need to ask the user which to work in.

    No inputs
  • account_profiles Account and networks

    List connected social profiles for a brand, with per-platform character limits. requires_media: true means the profile rejects a post with no image or video.

    1 optional input
  • account_locations Account and networks

    List the locations this brand can tag on Instagram and Facebook posts: its connected Facebook Pages that have an address. Each says whether Instagram can use it (instagram: true needs a map pin on the Page). Pass page_id as platform_options.instagram.location_id and/or platform_options.facebook.place_id.

    1 optional input
  • pinterest_list_boards Account and networks

    List Pinterest boards for a connected profile.

    2 optional inputs
  • youtube_list_playlists Account and networks

    List YouTube playlists for a connected profile.

    3 optional inputs
  • wordpress_list_categories Account and networks

    List WordPress categories. Never guess category IDs; call this first.

    2 optional inputs
  • wordpress_list_tags Account and networks

    List WordPress tags. Never guess tag IDs; call this first.

    2 optional inputs

Names and descriptions are shown exactly as the server sends them, in English.

Built for agents

Designed so your agent gets it right

Most failed AI posts come from guessing. The server is built to take the guessing out.

  • Validate, then write

    posts_validate checks content, media and every network's limits. posts_create runs the same checks again on the server, so a skipped step cannot slip through.

  • No guessed IDs

    Boards, playlists, WordPress categories and tags come from list tools, and the instructions tell the model never to guess one.

  • Bulk with results per post

    posts_bulk_create takes up to 20 posts. Each is validated on its own and failures come back by index, so one bad post never sinks the rest.

  • Media from anywhere

    Public URLs, files attached in the chat, and signed direct uploads for local files. media_view lets the model see up to 10 images before it writes about them.

  • Errors a client can match

    Every JSON-RPC error echoes the request id, tool failures come back with isError, and unexpected ones carry a request id you can quote to support.

  • Confirmation in the contract

    9 tools publish right away, delete for good or return a link shown only once. Their descriptions and the server instructions tell the model to confirm with the person first.

Client setup

Copy, paste, connected

Snippets for the most common clients. Claude and ChatGPT sign in to RobinReach, so their setup has no key in it. Your dashboard has the others with your key already in place.

Terminal
claude mcp add --transport http robinreach https://robinreach.com/mcp/v1/messages

Adds RobinReach to Claude Code over HTTP, with no key in the URL. Then run /mcp in Claude Code, select robinreach and choose Authenticate: your browser opens RobinReach so you can sign in and pick the whole account or one brand. No browser? Use the API key URL from your dashboard instead.

YOUR_API_KEY is a placeholder for clients that use an API key. Generate a key under Integrations in your dashboard. Claude and ChatGPT sign in instead and need no key.

Claude skill

Teach Claude the house rules

The RobinReach skill gives Claude what the tools alone cannot: how each network behaves, how to plan a calendar and how to write in your voice.

  • Writes in your brand voice from the first post
  • Picks sensible times and respects each network's rules
  • Works in Claude on the web, in the desktop app and in Claude Code
Install for Claude Code
curl -fsSL "https://robinreach.com/downloads/robinreach-claude-skill.zip?v=80b2def7" -o /tmp/rr-skill.zip && mkdir -p ~/.claude/skills && unzip -oq /tmp/rr-skill.zip -d ~/.claude/skills && rm /tmp/rr-skill.zip && echo "RobinReach skill installed."
FAQ

Questions developers ask

What is an MCP server?

MCP (Model Context Protocol) is an open standard for connecting AI assistants to apps. An MCP server offers tools the assistant can call. The RobinReach server offers 79 of them, covering posts, media, analytics, comments and more.

Which clients can connect?

Any client that speaks MCP over HTTP: Claude (web, desktop and Claude Code), ChatGPT, Codex, Gemini CLI, Cursor, VS Code, Windsurf, n8n and others, plus your own code through the Claude API or the OpenAI API. Claude and ChatGPT connect by signing in to RobinReach, the others with an API key. Clients that only run local servers can use the mcp-remote bridge.

How do I authenticate?

Claude and ChatGPT use OAuth 2.1: the user pastes the URL, clicks Connect, signs in to RobinReach and picks the whole account or one brand. The client finds what it needs at /.well-known/oauth-protected-resource, registers itself at /oauth/register and uses PKCE. Access tokens last one hour and come with a refresh token, and the connection stops at once if the person who connected loses their admin role. Every other client uses your RobinReach API key, sent as a Bearer token in the Authorization header or as an api_key parameter in the URL. Generate it under Integrations in the dashboard. Regenerating or deleting the key cuts off every client that uses it.

Is the server stateless?

Yes. It issues no session ID and every request stands on its own, so you can call it from serverless functions or from behind a load balancer without sticky sessions.

Which plan do I need?

MCP access is included with the Bloom, Thrive and Scale plans, the same plans as the REST API. See the pricing page.

Is there a REST API as well?

Yes. The RobinReach API covers the core actions over plain REST, with the same key. Use MCP when an AI model chooses the steps, and REST when your own code does.

Can one connection manage several brands?

With the master key, yes: account_brands lists them and every tool takes a brand_id. A brand key is limited to one brand, which is safer to hand to a client or to a single purpose tool. Sign-ins from Claude and ChatGPT work the same way: connect the whole account, or pick one client's brand under "Or connect a single brand" so the AI can only reach that brand and no key changes hands.

Do older connections keep working?

Yes. The server once offered a single robinreach tool before it was split into named tools such as posts_create. Clients that still call the single tool keep working.

What happens on a plan without access?

Every request returns a JSON-RPC error explaining that MCP needs a plan with API access, so the client can show a clear message instead of failing quietly.

Can my agent ask before it publishes?

The server already tells every client to confirm before its 9 irreversible tools run. Clients add their own approval prompts on top, and you can keep posts as drafts or send them for approval instead of scheduling them. The AI integrations page covers this for non-developers.

Point your agent at one URL

Paste the URL, sign in or add a key, and your agent can run 13 networks.

MCP access is included with Bloom, Thrive and Scale.