Install
openclaw skills install @sultanlive/twitterPost to X (Twitter) and schedule X (Twitter) tweets and threads from OpenClaw, Hermes, Claude Code or Codex. Publishes to the user's own X (Twitter) account via the 1Social MCP server (OAuth, no API key), checks the X (Twitter) 280-character limit, thread splitting and image-size rules first, schedules up to 30 days ahead and returns a delivery receipt. Use to post or schedule on X (Twitter), publish a tweet or a thread, plan X (Twitter) content, or check, edit or delete X (Twitter) posts.
openclaw skills install @sultanlive/twitter1Social publishes to the user's own X (Twitter) account and reports what actually reached it.
These steps drive the 1Social MCP server. If tools such as list_accounts are not available, connect it first. Sign-in is OAuth in the browser; there is no API key to store. Ask the user before running these commands — the login step opens a page where they sign in to 1Social themselves.
openclaw mcp set 1social '{"url":"https://mcp.1social.dev/mcp","transport":"streamable-http","auth":"oauth"}', then openclaw mcp login 1social. Check with openclaw mcp doctor 1social --probe.~/.hermes/config.yaml:
mcp_servers:
1social:
url: "https://mcp.1social.dev/mcp"
auth: oauth
hermes mcp login 1social (on a headless host: hermes mcp login 1social --flow device).claude mcp add --transport http 1social https://mcp.1social.dev/mcpThe user needs a 1Social account. New accounts start with a free trial; publishing after it needs a paid plan (https://1social.dev/pricing).
list_accounts. It returns the connected channels with their ids, each network's live limits, the plan and the remaining monthly quota. If no X (Twitter) account is connected, tell the user to connect one at https://1social.dev/app — connecting needs a browser and cannot be done from chat. If list_accounts reports a limit that differs from this skill, trust list_accounts.segments; each segment is { text, mediaIds? }.media.mediaUrls.upload_media and follow the upload steps its description gives, then put the returned publicUrl in mediaUrls. A localhost URL never works. Before that, show the user exactly which files you will upload and wait for a yes: an upload gets a public link at once, and declining the post afterwards does not remove the file.preview_post with the channel ids and the draft. It is free and publishes nothing. Fix every issue it reports and preview again.publish_post. scheduledAt: null publishes now; a UTC ISO-8601 timestamp such as 2026-11-03T07:00:00Z schedules it (in the future, at most 30 days ahead). Convert the user's local time to UTC yourself, and if they name a time without a timezone, ask which one. Set an idempotencyKey (a stable string of 8–128 characters for this draft) so a repeated call cannot publish twice.unknown means 1Social genuinely could not tell whether the post went out — say so, never call it a success or a failure.The same 1Social account can publish one post to Instagram, TikTok, LinkedIn, X, Threads, Facebook Pages, YouTube Shorts and Bluesky at once: list several channel ids from list_accounts. preview_post checks the draft against every selected network.
list_posts (give a postId for one post). It includes stored engagement metrics where the network reports them.update_post. Only works before the post has gone out.cancel_post. Use this, not delete_post, for a post that has not been published.delete_post, only after the user confirms. Report per network what actually came down: Instagram, TikTok, Threads and YouTube posts stay live and only the user can remove them.retry_delivery retries one network and spends quota again. It is refused for permanent failures such as a revoked connection — then the user must reconnect at https://1social.dev/app.unknown: ask the user to look at the network. Only when they tell you whether the post is live, call confirm_delivery with their answer. Never guess, and never retry_delivery with force without asking — it may publish a second copy.