---
slug: "xreplyai-social-post-manager-x-7"
source_type: "clawhub"
source_url: "https://clawhub.ai/skills/xreplyai"
repo: ""
source_file: "description"
---
---
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_voice`
- `platform` (optional): `twitter` (default) | `linkedin` | `threads` | `instagram` | `youtube` — single platform, controls output length and style
- `platforms` (optional): array of 2–5 platforms — generates platform-native variants for each. Returns `variants` array + 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` | `trending`
- `count` (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). Use `post_contents` for LinkedIn, Threads, or cross-posting.
- `post_contents` (optional): array of per-platform content objects. Takes precedence over `body`.
  - `platform` (required): `twitter` | `linkedin` | `youtube` | `threads` | `instagram` | `bluesky` | `mastodon` | `discord` | `slack` | `telegram` | `facebook` | `google_business` | `pinterest` | `tiktok` | `tumblr`
  - `body` (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 when `content_type` is `video`.
  - `content_type` (optional): `text` (default) | `single_image` | `multi_image` | `video`
  - `metadata` (optional): For X images: `{ media_id: "..." }` or `{ media_ids: ["..."] }`. For LinkedIn images: `{ asset_urn: "..." }` or `{ asset_urns: ["..."] }`. For LinkedIn video: `{ asset_urn: "..." }` (from `xreply_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" }` (use `xreply_list_twitter_communities` to 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. `platform` can 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_hours` sets X auto-retweet hours; pass `null` to disable. `metadata.community_id` sets the X community to post into (use `xreply_list_twitter_communities` to get IDs). For Threads image: `metadata.image_url`.
- `scheduled_at` (optional): ISO 8601 datetime string — omit to leave unchanged; pass `null` to 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 disk
- `platform` (required): `twitter` | `linkedin`
- `content_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 from
- `account_ids` (optional): array of social account IDs — takes precedence over `account_id`
- `scheduled_at` (optional): ISO 8601 datetime to schedule; omit to publish immediately
- `use_next_slot` (optional): `true` to queue into the next open posting-schedule slot. Mutually exclusive with `scheduled_at`. Returns `NO_SLOT_AVAILABLE` if 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 from
- `account_ids` (optional): array of social account IDs — takes precedence over `account_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` | `empathetic`
- `include_emoji` (optional): `true` | `false`
- `structure` (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` | `youtube`
- `tone` (optional): `auto` | `casual` | `professional` | `witty` | `empathetic`
- `target_length` (optional): integer — target character count for generated posts
- `hashtag_rules` (optional): `none` | `few` | `moderate` | `match_voice`
- `cta_rules` (optional): `never` | `soft_question` | `link_in_comments` | `direct`
- `banned_phrases` (optional): array of strings — phrases to never use for this platform
- `custom_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 generation
- `active` (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, from `xreply_rules_list`)
- `title` (optional): new label
- `content` (optional): new rule instruction
- `active` (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, from `xreply_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, from `xreply_posting_schedule_list`)
- `timezone` (optional): IANA timezone, e.g. `America/New_York`
- `min_gap_minutes` (optional): integer ≥ 0 (0 = no limit)
- `max_posts_per_day` (optional): integer ≥ 0 (0 = no limit)
- `paused` (optional): `true` | `false`
- `jitter_enabled`, `anti_duplicate_enabled`, `min_gap_enabled`, `max_per_day_enabled` (optional): `true` | `false`
- `slots` (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 (from `xreply_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` | `youtube`
- `variants` (optional): 2-3 — generate alternative drafts. Mutually exclusive with `refine`.
- `refine` (optional): `{ instruction: shorter|more_personal|less_salesy, draft }`. Mutually exclusive with `variants`.

#### 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 name
- `active` (optional): `true` (default) | `false`
- `use_sources` (optional): pull from configured content sources
- `schedule_day` (optional): 0=Sunday..6=Saturday
- `schedule_time` (optional): 24-hour `HH:MM` in the user's timezone
- `platform_configs` (optional): per-platform config object
- `content_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` | `video`
- `tag` (optional): filter to assets carrying this tag
- `limit` (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 on
- `action` (required): `submit` | `approve` | `reject`
- `rejection_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.
