原始内容
name: xreply description: Generate, schedule, and publish posts across 15 platforms — X, LinkedIn, Instagram, Threads, Facebook, YouTube, TikTok, Pinterest, Bluesky, Mastodon, Discord, Telegram, Tumblr, Google Business, and Slack — in your voice using AI. Manage preferences and track billing. slug: xreply version: 0.13.0 license: MIT-0 homepage: https://xreplyai.com metadata: {"openclaw":{"emoji":"✨","requires":{"anyBins":["mcporter","npx"],"env":["XREPLY_TOKEN"]},"primaryEnv":"XREPLY_TOKEN","install":[{"id":"mcporter","kind":"node","package":"mcporter","bins":["mcporter"],"label":"Install mcporter (node)"}]}}
XreplyAI — AI Post Generator
Generate, schedule, and publish posts across 15 platforms — X, LinkedIn, Instagram, Threads, Facebook, YouTube, TikTok, Pinterest, Bluesky, Mastodon, Discord, Telegram, Tumblr, Google Business, and Slack — in your voice using AI. Manage your post queue, preferences, and track billing and quota.
Authentication
All tools require an XREPLY_TOKEN environment variable — an API key from XreplyAI settings (Settings → API Keys). This is automatically injected by OpenClaw when set in your skill config.
MCP Server
The XreplyAI MCP server is published as @xreplyai/mcp on npm. You invoke tools via mcporter:
mcporter call 'npx @xreplyai/mcp@0.13.0' <tool_name> [param:value ...]
To discover all available tools and their parameters:
mcporter list 'npx @xreplyai/mcp@0.13.0' --all-parameters
Tools
Generation
xreply_posts_generate
Generate AI post(s) in the user's voice and auto-save as draft(s). Use platform for a single platform or platforms (array) to generate platform-native variants for multiple platforms at once. Each platform variant counts as 1 against the daily quota (100/day on Pro, 500/day on Team — the MCP requires a Pro or Team plan, or an active Pro trial).
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate topic:"my SaaS hit 1000 users"
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate topic:"lessons from year 1" angle:story_arc
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate platform:linkedin topic:"leadership lessons"
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate angle:one_liner
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate topic:"entrepreneurship hardships" 'platforms:["twitter","linkedin","threads"]'
Parameters:
topic(optional): topic or prompt for the post (max 280 chars)angle(optional):one_liner|list|question|story_arc|paragraph|my_voiceplatform(optional):twitter(default) |linkedin|threads|instagram|youtube— single platform, controls output length and styleplatforms(optional): array of 2–5 platforms — generates platform-native variants for each. Returnsvariantsarray + single combined post draft. Each variant counts as 1 quota.
xreply_posts_generate_batch
Generate multiple AI posts at once. Each post counts as 1 against the daily quota — check billing first if quota is a concern.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate_batch category:personalized count:5
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate_batch category:trending count:3
Parameters:
category(required):personalized|trendingcount(required): number of posts to generate (1–9, must not exceed remaining daily quota)
Post Management
xreply_posts_list
List all posts in the queue — drafts, scheduled, and recent posts. Returns post IDs, body text, status, scheduled times, and per-platform content.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_list
No parameters.
xreply_posts_create
Save a post draft. Use body for a simple X-only post. Use post_contents for LinkedIn, Threads, or when posting different content to multiple platforms. The post is not published until you call xreply_posts_publish.
X-only post (simple):
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create body:"Your tweet text here"
X post with auto-retweet:
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"twitter","body":"Tweet text","metadata":{"auto_rt_hours":24}}]'
X thread (multiple twitter entries with position 0, 1, 2, ... — publishes as one connected thread):
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"twitter","body":"Tweet one","position":0},{"platform":"twitter","body":"Tweet two","position":1},{"platform":"twitter","body":"Tweet three","position":2}]'
LinkedIn post:
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"linkedin","body":"Your long LinkedIn post here..."}]'
Cross-post to X and LinkedIn with different text:
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"twitter","body":"Short tweet"},{"platform":"linkedin","body":"Expanded LinkedIn version..."}]'
X post with image (upload first with xreply_media_upload):
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"twitter","body":"Check this out","content_type":"single_image","metadata":{"media_id":"1234567890"}}]'
LinkedIn post with image (upload first with xreply_media_upload):
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"linkedin","body":"Caption here","content_type":"single_image","metadata":{"asset_urn":"urn:li:digitalmediaAsset:..."}}]'
Parameters:
body(optional): X post body text (max 280 chars). Usepost_contentsfor LinkedIn, Threads, or cross-posting.post_contents(optional): array of per-platform content objects. Takes precedence overbody.platform(required):twitter|linkedin|youtube|threads|instagram|bluesky|mastodon|discord|slack|telegram|facebook|google_business|pinterest|tiktok|tumblrbody(required, except for LinkedIn video): post body (per-platform max length applies — e.g. 280 for X, 3000 for LinkedIn, 500 for Threads/Mastodon). Optional whencontent_typeisvideo.content_type(optional):text(default) |single_image|multi_image|videometadata(optional): For X images:{ media_id: "..." }or{ media_ids: ["..."] }. For LinkedIn images:{ asset_urn: "..." }or{ asset_urns: ["..."] }. For LinkedIn video:{ asset_urn: "..." }(fromxreply_video_upload). For Threads image:{ image_url: "https://..." }(public HTTPS URL — no upload step needed). For auto-retweet:{ auto_rt_hours: 24 }. For X communities:{ community_id: "12345" }(usexreply_list_twitter_communitiesto get IDs).
account_id/account_ids(optional): social account(s) to post from
xreply_posts_edit
Edit a post's content, scheduled time, or auto-retweet setting. Use body to update X-only text, or post_contents to update per-platform content. Cannot edit posts that are processing or already published.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_edit id:123 body:"Updated tweet text"
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_edit id:123 'scheduled_at:2026-03-15T09:00:00Z'
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_edit id:123 post_contents:'[{"platform":"linkedin","body":"Updated LinkedIn text"}]'
Parameters:
id(required): post ID (integer)body(optional): new X body text (max 280 chars)post_contents(optional): per-platform content to update — replaces content for submitted platforms only.platformcan be any of the 15 supported platforms (twitter,linkedin,youtube,threads,instagram,bluesky,mastodon,discord,slack,telegram,facebook,google_business,pinterest,tiktok,tumblr).metadata.auto_rt_hourssets X auto-retweet hours; passnullto disable.metadata.community_idsets the X community to post into (usexreply_list_twitter_communitiesto get IDs). For Threads image:metadata.image_url.scheduled_at(optional): ISO 8601 datetime string — omit to leave unchanged; passnullto unschedule
xreply_posts_delete
Delete a post. Cannot delete posts that are processing or already published.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_delete id:123
Parameters:
id(required): post ID (integer)
Media Upload
xreply_media_upload
Upload an image file from disk and get back a media identifier to attach to a post. Call this before xreply_posts_create or xreply_posts_edit to attach images. Supports JPEG, PNG, GIF, and WebP up to 5 MB.
Note: Requires filesystem access — works in Claude Code, Cursor, and mcporter CLI. Not available in Claude.ai (no filesystem); in that case use the Posts dashboard at app.xreplyai.com/dashboard/posts to attach images directly.
Upload an image for X:
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_media_upload image_path:/path/to/photo.jpg platform:twitter
→ returns { platform: "twitter", media_id: "1234567890" }
Upload an image for LinkedIn:
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_media_upload image_path:/path/to/photo.png platform:linkedin
→ returns { platform: "linkedin", asset_urn: "urn:li:digitalmediaAsset:..." }
Parameters:
image_path(required): absolute or relative path to the image file on diskplatform(required):twitter|linkedincontent_type(optional):image/jpeg|image/png|image/gif|image/webp— inferred from extension if omitted
Use the returned identifier in post_contents[].metadata:
- X single image:
metadata: { media_id: "..." } - X multiple images:
metadata: { media_ids: ["...", "..."] } - LinkedIn single image:
metadata: { asset_urn: "urn:li:..." } - LinkedIn multiple images:
metadata: { asset_urns: ["urn:li:...", "urn:li:..."] }
xreply_video_upload
Upload an MP4 video file from disk to LinkedIn and get back an asset URN to attach to a post. Uses your primary connected LinkedIn account. Call this before xreply_posts_create or xreply_posts_edit to attach a video. Supports MP4 only, up to 100 MB.
Note: Only LinkedIn is supported — X video upload requires OAuth 1.0a which is not currently supported. Requires filesystem access — works in Claude Code, Cursor, and mcporter CLI. Not available in Claude.ai; use the Posts dashboard at app.xreplyai.com/dashboard/posts to attach videos directly.
Upload a video for LinkedIn:
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_video_upload video_path:/path/to/video.mp4
→ returns { platform: "linkedin", asset_urn: "urn:li:video:ABC123" }
Parameters:
video_path(required): absolute or relative path to the MP4 file on disk (max 100 MB)
Use the returned asset_urn in post_contents[].metadata with content_type: "video":
- LinkedIn video:
content_type: "video", metadata: { asset_urn: "urn:li:video:..." }(body is optional)
Publishing
xreply_posts_publish
Publish or schedule a post. Requires account_id or account_ids — if neither is provided and no accounts were attached when the post was created, returns NO_ACCOUNT_SPECIFIED. If scheduled_at is provided (ISO 8601), the post will be queued for that time (scheduling horizon depends on your plan). If use_next_slot: true, the post is queued into the next open slot in the account owner's posting schedule (same as the dashboard's "Add to Queue") — mutually exclusive with scheduled_at. If both are omitted, the post is published immediately. Each platform (X, LinkedIn) requires the corresponding social account to be connected.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:123 account_id:1
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:123 account_id:1 'scheduled_at:2026-03-15T09:00:00Z'
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:123 account_id:1 use_next_slot:true
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:123 'account_ids:[1,2]'
Parameters:
id(required): post ID (integer)account_id(required if no accounts attached): social account ID to publish fromaccount_ids(optional): array of social account IDs — takes precedence overaccount_idscheduled_at(optional): ISO 8601 datetime to schedule; omit to publish immediatelyuse_next_slot(optional):trueto queue into the next open posting-schedule slot. Mutually exclusive withscheduled_at. ReturnsNO_SLOT_AVAILABLEif the account owner has no posting schedule with an open slot.
xreply_posts_next_slot
Preview when a post would go out if queued — returns { scheduled_at } without scheduling anything. Resolves the same slot that xreply_posts_publish with use_next_slot: true would use.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_next_slot id:123
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_next_slot id:123 account_id:1
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_next_slot id:123 'account_ids:[1,2]'
Parameters:
id(required): post ID (integer)account_id(optional): social account ID to resolve the posting schedule fromaccount_ids(optional): array of social account IDs — takes precedence overaccount_id; when neither is provided, falls back to the post's attached accounts
Returns NO_SLOT_AVAILABLE if the account owner has no posting schedule with an open slot.
Context
xreply_billing_status
Get subscription tier (free/starter/pro/team), quota usage, daily limits, and subscription details.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_billing_status
No parameters.
xreply_voice_status
Get voice profile status — whether it has been analyzed, tweet count, AI provider configured, and writing style summary.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_voice_status
No parameters.
xreply_preferences_get
Get current post generation preferences — tone, emoji usage, and default structure.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_preferences_get
No parameters.
xreply_preferences_set
Update post generation preferences. Provide only the fields you want to change.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_preferences_set tone:witty
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_preferences_set tone:professional include_emoji:false
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_preferences_set structure:story_arc
Parameters:
tone(optional):auto|casual|professional|witty|empatheticinclude_emoji(optional):true|falsestructure(optional):one_liner|paragraph|question|list|story_arc
xreply_list_social_accounts
List all connected social accounts (X/Twitter, LinkedIn, YouTube, Threads) with their IDs, platform, username, and primary status. Use this to find account_id values needed for xreply_posts_create and xreply_posts_publish — especially for newly connected accounts that have no posts yet.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_list_social_accounts
Returns: social_accounts[] — each with id, platform, uid (platform-native user ID), username, email, primary, connected_at.
xreply_platform_styles_get
Get the effective platform style profiles — system defaults merged with your per-platform overrides. Shows tone, structure, target length, hashtag rules, CTA rules, and whether defaults are active.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_platform_styles_get
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_platform_styles_get platform:linkedin
Parameters:
platform(optional):twitter|linkedin|threads|instagram|youtube— omit to get all platforms
xreply_platform_styles_set
Override style settings for a specific platform. Only the fields you provide are updated — other fields keep their system defaults. Changes apply to all future generation for that platform.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_platform_styles_set platform:linkedin tone:witty
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_platform_styles_set platform:threads hashtag_rules:none cta_rules:soft_question
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_platform_styles_set platform:linkedin custom_instructions:"always reference my bootstrapping journey"
Parameters:
platform(required):twitter|linkedin|threads|instagram|youtubetone(optional):auto|casual|professional|witty|empathetictarget_length(optional): integer — target character count for generated postshashtag_rules(optional):none|few|moderate|match_voicecta_rules(optional):never|soft_question|link_in_comments|directbanned_phrases(optional): array of strings — phrases to never use for this platformcustom_instructions(optional): free-text instructions, max 500 chars
xreply_rules_list
List custom writing rules applied during generation — e.g. "never use hashtags", "always end with a question". Requires a Pro subscription.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_rules_list
No parameters.
xreply_rules_create
Add a new custom writing rule. Requires a Pro subscription.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_rules_create title:"No hashtags" content:"Never use hashtags in any post"
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_rules_create title:"End with question" content:"Always end posts with a question to drive engagement" active:true
Parameters:
title(required): short label for the rule (e.g. "No hashtags")content(required): the rule instruction applied during generationactive(optional):true(default) |false
xreply_rules_update
Edit an existing custom writing rule. Only the fields you provide are changed. Use xreply_rules_list to get rule IDs. Requires a Pro subscription.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_rules_update id:1 content:"Never use hashtags or emoji"
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_rules_update id:2 active:false
Parameters:
id(required): rule ID (integer, fromxreply_rules_list)title(optional): new labelcontent(optional): new rule instructionactive(optional):true|false
xreply_rules_delete
Delete a custom writing rule permanently. Use xreply_rules_list to get rule IDs. Requires a Pro subscription.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_rules_delete id:1
Parameters:
id(required): rule ID (integer, fromxreply_rules_list)
xreply_content_plan_list
List your automated weekly content plans. Returns each plan's name, active status, platform configs, content strategy/topics, schedule day and time, and when it last ran and is next due. Use this before generating posts manually to see what content is already scheduled to auto-generate.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_content_plan_list
No parameters.
xreply_posting_schedule_list
List the posting schedules — the recurring posting rhythm for each connected account (one schedule per social_account_id). Each schedule carries spacing config (min_gap_minutes, max_posts_per_day — 0 = no limit), a timezone, a paused flag, protection toggles, and a list of posting_slots. In each slot, day_of_week is 0=Sunday..6=Saturday and time_of_day is 24-hour "HH:MM" in the schedule's timezone. Call xreply_list_social_accounts first to map social_account_id to platforms and usernames.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posting_schedule_list
No parameters.
xreply_posting_schedule_update
Update ONE posting schedule by id (get the id from xreply_posting_schedule_list). Only the fields you provide are changed — omitted fields are left unchanged. A slot WITH an id edits it, a slot WITHOUT an id adds it, and { id, _destroy: true } removes it. Cannot create or delete whole schedules — one exists automatically per connected account.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posting_schedule_update id:1 paused:true
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posting_schedule_update id:1 timezone:"America/New_York" max_posts_per_day:3
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posting_schedule_update id:1 'slots:[{"day_of_week":1,"time_of_day":"09:05"},{"id":11,"_destroy":true}]'
Parameters:
id(required): schedule ID (integer, fromxreply_posting_schedule_list)timezone(optional): IANA timezone, e.g.America/New_Yorkmin_gap_minutes(optional): integer ≥ 0 (0 = no limit)max_posts_per_day(optional): integer ≥ 0 (0 = no limit)paused(optional):true|falsejitter_enabled,anti_duplicate_enabled,min_gap_enabled,max_per_day_enabled(optional):true|falseslots(optional): array of{ id?, day_of_week (0-6), time_of_day ("HH:MM"), enabled?, _destroy? }
xreply_list_twitter_communities
List the X communities the user has previously posted to, ordered by most recently used. Returns community IDs and names to use as community_id in post_contents metadata.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_list_twitter_communities
No parameters.
Replies, Ideas & Plans (v0.13.0)
xreply_reply_generate
Generate an on-voice reply to a tweet/post in the user's own voice. Pass the tweet being replied to (text required, optionally author, tweet_id, and conversation_context for thread awareness). Optionally shape the output with preferences (tone, include_emoji, structure, custom_rules). To get a different take, pass previous_attempts — up to 5 earlier drafts to avoid repeating. Counts against the daily AI generation quota and requires a paid subscription.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_reply_generate tweet:'{"text":"Just shipped a huge refactor","author":"@builder"}'
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_reply_generate tweet:'{"text":"Thoughts on remote work?"}' preferences:'{"tone":"witty","include_emoji":false}'
Parameters:
tweet(required):{ text (required), author?, tweet_id?, conversation_context?: [{ text, author? }] }preferences(optional):{ tone?, include_emoji?, structure?, custom_rules? }previous_attempts(optional): array of up to 5 prior draft replies to steer away from
Returns { reply: { text } }.
xreply_content_ideas_list
List today's available content ideas — AI-suggested topics/angles the user can turn into posts. Each idea has an id, platform, topic, angle, prompt, and source.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_content_ideas_list
No parameters.
xreply_content_ideas_refresh
Request a fresh batch of content ideas. Asynchronous — the ideas regenerate in the background and are not returned immediately. Returns { status: "refresh_queued" }; call xreply_content_ideas_list again shortly afterward to see the new ideas.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_content_ideas_refresh
No parameters.
xreply_content_idea_action
Act on a single content idea. action:use marks the idea consumed and returns a seed_prompt to feed to xreply_posts_generate_from_idea. action:dismiss removes the idea from the list.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_content_idea_action id:42 action:use
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_content_idea_action id:42 action:dismiss
Parameters:
id(required): content idea ID (fromxreply_content_ideas_list)action(required):use|dismiss
xreply_posts_generate_from_idea
Generate post draft text from a seed idea in the user's voice. Pass idea (a seed_prompt, e.g. from xreply_content_idea_action with action=use) and optionally platform. Use variants (2-3) for multiple alternative drafts, or refine ({ instruction, draft }, instruction one of shorter | more_personal | less_salesy) to rewrite an existing draft. refine and variants are mutually exclusive. Returns { body } for a single draft or { drafts: [...] } for variants. Does NOT auto-save — pass the returned text to xreply_posts_create. Counts against the daily quota; requires a paid subscription.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate_from_idea idea:"lessons from bootstrapping" platform:linkedin
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate_from_idea idea:"my launch story" variants:3
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate_from_idea refine:'{"instruction":"shorter","draft":"a long draft..."}'
Parameters:
idea(optional): seed prompt/topic (max 500 chars)platform(optional):twitter(default) |linkedin|threads|instagram|youtubevariants(optional): 2-3 — generate alternative drafts. Mutually exclusive withrefine.refine(optional):{ instruction: shorter|more_personal|less_salesy, draft }. Mutually exclusive withvariants.
xreply_content_plan_create
Create a content plan — a recurring planner that auto-generates posts on a weekly cadence. name is required. schedule_day (0=Sunday..6=Saturday) and schedule_time (HH:MM, 24-hour, in the user's timezone) set when it runs. platform_configs is a per-platform settings object; content_strategy holds strategy settings. Creating a plan triggers an initial async run. Requires a paid subscription; at most 10 plans.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_content_plan_create name:"Weekly build-in-public" schedule_day:1 schedule_time:"09:00"
Parameters:
name(required): plan nameactive(optional):true(default) |falseuse_sources(optional): pull from configured content sourcesschedule_day(optional): 0=Sunday..6=Saturdayschedule_time(optional): 24-hourHH:MMin the user's timezoneplatform_configs(optional): per-platform config objectcontent_strategy(optional): strategy settings object
xreply_content_plan_run
Trigger a manual run of an existing content plan by id. Asynchronous — posts are generated in the background. Returns 422 PLAN_INACTIVE if the plan is paused. Requires a paid subscription.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_content_plan_run id:3
Parameters:
id(required): content plan ID to run
xreply_posting_schedule_open_slots
List upcoming open "ready to post" calendar slots across all active posting schedules — the times a new post could be dropped into without colliding with existing scheduled posts or planner assignments. Each slot has scheduled_at (ISO 8601), social_account_id, and platform. Optionally narrow with from/to (ISO 8601); the horizon is capped server-side. Feed a slot's scheduled_at to xreply_posts_create/xreply_posts_edit.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posting_schedule_open_slots
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posting_schedule_open_slots 'from:2026-07-22T00:00:00Z' 'to:2026-07-29T00:00:00Z'
Parameters:
from(optional): ISO 8601 start of the window (defaults to now)to(optional): ISO 8601 end of the window (defaults to / capped at the server horizon)
Returns { open_slots: [...] }.
xreply_media_library_list
List reusable media library assets (previously uploaded images/videos). Returns each asset's id, r2_key, public_url, content_type, media_kind, filename, display_name, tags, and size_bytes. Optionally filter by kind (image/video) or tag, and paginate with limit/offset. To attach an existing asset to a post, pass its r2_key (or public_url) in post_contents[].metadata instead of re-uploading.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_media_library_list
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_media_library_list kind:image tag:branding
Parameters:
kind(optional):image|videotag(optional): filter to assets carrying this taglimit(optional): 1-200 (default 100)offset(optional): pagination offset (default 0)
Returns { media_assets: [...] }.
xreply_posts_review
Run the team review workflow on a post. action:submit moves a draft to needs_review; action:approve approves it (scheduling it); action:reject sends it back — rejection_reason is REQUIRED when rejecting. Pro/Team tiers only.
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_review post_id:123 action:submit
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_review post_id:123 action:approve
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_review post_id:123 action:reject rejection_reason:"tone is off-brand"
Parameters:
post_id(required): post ID to act onaction(required):submit|approve|rejectrejection_reason(required when action is reject)
Workflow Examples
Generate and schedule an X post
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate topic:"ship fast, learn faster" angle:story_arc
→ returns { body: "...", post: { id: 42, ... } }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:42 account_id:1 'scheduled_at:2026-03-12T09:00:00Z'
Generate and schedule a LinkedIn post
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate platform:linkedin topic:"leadership lessons from year 1" angle:story_arc
→ returns { body: "...", post: { id: 43, ... } }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:43 account_id:2 'scheduled_at:2026-03-12T09:00:00Z'
Cross-post to X and LinkedIn with different text
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate topic:"motivation" platform:twitter
→ { body: "Short tweet...", post: { id: 44 } }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate topic:"motivation" platform:linkedin
→ { body: "Long LinkedIn article...", post: { id: 45 } }
Or create as a single post with both platforms:
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"x","body":"Short tweet..."},{"platform":"linkedin","body":"Long LinkedIn article..."}]'
4. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:46 'account_ids:[1,2]' 'scheduled_at:2026-03-13T09:00:00Z'
Plan posts for the week
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_billing_status
→ check remaining quota before a large batch
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_generate_batch category:personalized count:7
→ generates 7 drafts
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_list
→ review the queue
4. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_edit id:101 'scheduled_at:2026-03-11T09:00:00Z'
mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_edit id:102 'scheduled_at:2026-03-12T09:00:00Z'
→ schedule each post
Queue a draft to the next open slot
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create body:"Your tweet text here"
→ { post: { id: 60, ... } }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_next_slot id:60
→ { scheduled_at: "2026-03-12T09:00:00Z" } — optional preview
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:60 account_id:1 use_next_slot:true
Edit and publish an existing draft
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_list
→ find the draft ID
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_edit id:55 body:"Revised tweet text"
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:55 account_id:1
Post an X image
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_media_upload image_path:/Users/me/photo.jpg platform:twitter
→ { media_id: "1234567890" }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"twitter","body":"Check this out!","content_type":"single_image","metadata":{"media_id":"1234567890"}}]'
→ { post: { id: 77, ... } }
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:77 account_id:1
Post to an X community
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_list_twitter_communities
→ returns [{ community_id: "12345", name: "AI Builders", last_used_at: "..." }, ...]
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"twitter","body":"Exciting update for the community!","metadata":{"community_id":"12345"}}]'
→ { post: { id: 88, ... } }
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:88 account_id:1
Post to Threads
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_list_social_accounts
→ find your Threads account id (platform: "threads")
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"threads","body":"Your Threads post here (max 500 chars)"}]'
→ { post: { id: 90, ... } }
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:90 account_id:3
Post a Threads image
Threads takes a public image URL directly — no upload step needed (unlike X and LinkedIn).
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"threads","body":"Check this out!","content_type":"single_image","metadata":{"image_url":"https://example.com/image.jpg"}}]'
→ { post: { id: 91, ... } }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:91 account_id:3
Post a LinkedIn image
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_media_upload image_path:/Users/me/banner.png platform:linkedin
→ { asset_urn: "urn:li:digitalmediaAsset:ABC123" }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"linkedin","body":"Excited to share this!","content_type":"single_image","metadata":{"asset_urn":"urn:li:digitalmediaAsset:ABC123"}}]'
→ { post: { id: 78, ... } }
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:78 account_id:2
Post a LinkedIn video
1. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_video_upload video_path:/Users/me/demo.mp4
→ { platform: "linkedin", asset_urn: "urn:li:video:ABC123" }
2. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_create post_contents:'[{"platform":"linkedin","body":"Watch this demo!","content_type":"video","metadata":{"asset_urn":"urn:li:video:ABC123"}}]'
→ { post: { id: 79, ... } }
3. mcporter call 'npx @xreplyai/mcp@0.13.0' xreply_posts_publish id:79 account_id:2
Error Handling
Authentication failed: If tools return a 401 error, the XREPLY_TOKEN is invalid or revoked; ask the user to create a new API key in Settings → API Keys and update it in their OpenClaw config.
Quota exhausted: If generation returns a quota error (e.g. "Daily generation quota exhausted"), call xreply_billing_status to check limits and inform the user. Quota resets at midnight.
Quota insufficient for batch: If xreply_posts_generate_batch returns quota_insufficient: true, reduce count to the available value shown in the response, or ask the user to confirm.
Schedule out of range: If scheduling returns a validation error, the requested time exceeds the plan's scheduling horizon. Call xreply_billing_status to check max_schedule_days and suggest an earlier time.
Cannot edit/delete: Posts with status processing or posted cannot be edited or deleted. Call xreply_posts_list to check the current status.
Rules list requires Pro: If xreply_rules_list returns a 403, inform the user this feature requires a Pro subscription.
No account specified: If publish returns NO_ACCOUNT_SPECIFIED, you must pass account_id or account_ids. Call xreply_list_social_accounts to discover available account IDs (works even for newly connected accounts with no posts yet), then retry with the correct ID.
No slot available: If use_next_slot or xreply_posts_next_slot returns NO_SLOT_AVAILABLE, the account owner has no posting schedule with an open slot. Schedule explicitly with scheduled_at instead, or ask the user to set up a posting schedule in the XreplyAI dashboard.
LinkedIn account not connected: If publishing to LinkedIn returns a 422, the user has not connected their LinkedIn account. Direct them to XreplyAI Settings to connect it.
Threads account not connected: If publishing to Threads returns a 422, the user has not connected their Threads account. Direct them to XreplyAI Settings to connect it.
Threads token expired: If a Threads post returns THREADS_TOKEN_EXPIRED, the access token has expired (Threads tokens expire after ~60 days). Direct the user to XreplyAI Settings to reconnect their Threads account.
Media upload — file not found: If xreply_media_upload cannot read the file, check that the path is correct and accessible. Use an absolute path to avoid ambiguity.
Media upload — file too large: Maximum image size is 5 MB. Compress or resize the image before retrying.
Media upload — unsupported format: Only JPEG, PNG, GIF, and WebP are supported. Convert the image to a supported format.
Media upload — no X account connected: If the Twitter upload returns NO_TWITTER_ACCOUNT, the user must connect their X account in XreplyAI Settings first.
Claude.ai users: xreply_media_upload and xreply_video_upload require filesystem access and are not available in Claude.ai (which has no disk access). Use the Posts dashboard at app.xreplyai.com/dashboard/posts to attach images or videos via the compose or edit form.
Video upload — unsupported format: Only MP4 is supported for video. Convert the video to MP4 before retrying.
Video upload — file too large: Maximum video size is 100 MB. Compress the video before retrying.
Video upload — no LinkedIn account connected: If xreply_video_upload returns NO_LINKEDIN_ACCOUNT, the user must connect their LinkedIn account in XreplyAI Settings first.
Video upload — X not supported: X video upload requires OAuth 1.0a which is not currently supported. For X videos, use the Posts dashboard at app.xreplyai.com/dashboard/posts.