XReplyAI - Social Post Manager
Generate, schedule, and publish posts across 15 platforms — X, LinkedIn, Instagram, Threads, Facebook, YouTube, TikTok, Pinterest, Bluesky, Mastodon, Discord, Telegram, Tumblr, Goo…
John Moon
@jmoon90
What This Skill Does
AI-powered social media manager that generates, schedules, and publishes posts across 15 platforms (X, LinkedIn, Instagram, Threads, Facebook, YouTube, TikTok, Pinterest, Bluesky, Mastodon, Discord, Telegram, Tumblr, Google Business, Slack) in the user's voice. Handles post generation with topic/angle control, batch creation, queue management, scheduling, and publishing through a single MCP interface.
Replaces juggling multiple social media scheduling tools and manual cross-posting by generating platform-native variants from one prompt and publishing them all from a single queue.
When to Use It
- Generate a LinkedIn thought leadership post from a brief topic like 'lessons from year 1'
- Schedule a multi-platform campaign across Twitter, LinkedIn, and Threads with platform-optimized variants
- Batch-create 5 personalized posts for the week's content calendar
- List all draft and scheduled posts to review the queue before publishing
- Publish a pre-written post immediately to a specific platform like Instagram
- Check remaining daily quota before generating a large batch of posts
Install
$ openclaw skills install @jmoon90/xreplyaiXreplyAI — 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.
Top skills in this category
Telegram
@codedao12OpenClaw skill for designing Telegram Bot API workflows and command-driven conversations using direct HTTPS requests (no SDKs).
Postiz is a tool to schedule social media and chat posts to 28+ channels X, LinkedIn, LinkedIn Page, Reddit, Instagram, Facebook Page, Threads, YouTube, Google My Business, TikTok, Pinterest, Dribbble, Discord, Slack, Kick, Twitch, Mastodon, Bluesky, Lemmy, Farcaster, Telegram, Nostr, VK, Medium, Dev.to, Hashnode, WordPress, ListMonk
@nevo-davidPostiz is a tool to schedule social media and chat posts to 28+ channels X, LinkedIn, LinkedIn Page, Reddit, Instagram, Facebook Page, Threads, YouTube, Goog...
Adaptive Reasoning
@enzoricciulliAutomatically assess task complexity and adjust reasoning level. Triggers on every user message to evaluate whether extended thinking (reasoning mode) would improve response quality. Use this as a pre-processing step before answering complex questions.
Moltbot Best Practices
@nextfrontierbuildsBest practices for AI agents - Cursor, Claude, ChatGPT, Copilot. Avoid common mistakes. Confirms before executing, drafts before publishing. Vibe-coding essential.
Reminder
@reed1898Capture natural-language events, save to your workspace, and schedule Telegram reminders with automatic cron notifications and upcoming event queries.