{"slug":"threads-post","title":"threads-post","summary":"Create and schedule Threads posts with image carousels and reply control via Publora MCP. Use when the user wants to post to Meta's Threads. Multi-part threading is currently disabled by the platform, so long content stays a single post. Not for Instagram (use instagram-post) or ","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-14T18:30:44.352905Z","repo":{"url":"https://github.com/publora/skills","stars":48,"forks":6,"license":"MIT","updatedAt":"2026-09-23T09:26:39Z"},"bodyHtml":"<hr>\n<h2>name: threads-post\ndescription: Create and schedule Threads posts with image carousels and reply control via Publora MCP. Use when the user wants to post to Meta's Threads. Multi-part threading is currently disabled by the platform, so long content stays a single post. Not for Instagram (use instagram-post) or X threads (use x-post).</h2>\n<h1>Threads Post</h1>\n<p>Create and schedule posts on Meta's Threads using the Publora MCP server. Supports single posts, image carousels (2-20 images) and reply control. Multi-part threading is disabled by the platform connection right now.</p>\n<h2>Prerequisites</h2>\n<p><strong>Plans:</strong> Works on the free Starter plan. Current limits and pricing: <a href=\"https://publora.com/pricing\">publora.com/pricing</a>.</p>\n<h3>Getting Started</h3>\n<ol>\n<li><strong>Create account</strong> at <a href=\"https://publora.com/register\">publora.com/register</a> (free)</li>\n<li><strong>Connect Threads</strong> via Instagram OAuth in <a href=\"https://app.publora.com/dashboard\">Publora Dashboard</a></li>\n<li><strong>Get API key</strong> at <a href=\"https://app.publora.com/dashboard/api\">app.publora.com/dashboard/api</a></li>\n<li><strong>Connect your agent</strong> to the MCP server at <code>https://mcp.publora.com</code>, authenticating with <code>Authorization: Bearer sk_YOUR_API_KEY</code>. In Claude Code:</li>\n</ol>\n<pre><code>claude mcp add publora --transport http https://mcp.publora.com \\\n  --header \"Authorization: Bearer sk_YOUR_API_KEY\"\n</code></pre>\n<p>Claude Desktop, Cursor, Codex, OpenClaw and the claude.ai connector each need a different config file or flow: see <a href=\"https://docs.publora.com/mcp/client-setup\">client setup</a> for the exact path and snippet.</p>\n<h3>REST API Fallback</h3>\n<p>If MCP is unavailable, use the REST API directly:</p>\n<p><strong>Base URL:</strong> <code>https://api.publora.com/api/v1</code></p>\n<p><strong>Authentication:</strong> <code>x-publora-key</code> header</p>\n<pre><code># Get connected platforms\ncurl -X GET \"https://api.publora.com/api/v1/platform-connections\" \\\n  -H \"x-publora-key: sk_your_api_key\"\n\n# Create a post\ncurl -X POST \"https://api.publora.com/api/v1/create-post\" \\\n  -H \"x-publora-key: sk_your_api_key\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"platforms\": [\"threads-12345\"],\n    \"content\": \"Your post content\",\n    \"scheduledTime\": \"2026-03-25T10:00:00Z\"\n  }'\n</code></pre>\n<p><strong>Platform ID Format:</strong> <code>threads-{id}</code> (from <code>/platform-connections</code>)</p>\n<p>\uD83D\uDCD6 <strong>Docs:</strong> <a href=\"https://docs.publora.com\">docs.publora.com</a></p>\n<h2>Platform Limits</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Limit</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Characters per post</td>\n<td>500</td>\n</tr>\n<tr>\n<td>Hashtags</td>\n<td>1 per post maximum</td>\n</tr>\n<tr>\n<td>Links</td>\n<td>5 per post maximum</td>\n</tr>\n<tr>\n<td>Images per carousel</td>\n<td>2-20</td>\n</tr>\n<tr>\n<td>Image size</td>\n<td>8 MB</td>\n</tr>\n<tr>\n<td>Image formats</td>\n<td>JPEG, PNG (WebP auto-converted)</td>\n</tr>\n<tr>\n<td>Video duration</td>\n<td>5 minutes</td>\n</tr>\n<tr>\n<td>Video size</td>\n<td>1 GB</td>\n</tr>\n<tr>\n<td>Video formats</td>\n<td>MP4, MOV</td>\n</tr>\n<tr>\n<td>Posts per day</td>\n<td>250</td>\n</tr>\n<tr>\n<td>Replies per day</td>\n<td>1,000</td>\n</tr>\n</tbody>\n</table>\n<h2>Available Tools</h2>\n<h3>create_post</h3>\n<p>Create a new Threads post or thread.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code>platforms</code>: Array with your Threads connection ID (e.g., <code>[\"threads-12345\"]</code>)</li>\n<li><code>content</code>: Post text (auto-threads if over 500 chars)</li>\n<li><code>scheduledTime</code>: ISO 8601 UTC datetime. <strong>Optional</strong>: omit it and the post is created as a draft. Send a future time to schedule. A time five or more minutes in the past is rejected with <code>SCHEDULED_TIME_IN_PAST</code>, so for immediate posting use the current time plus a minute.</li>\n<li><code>mediaUrls</code>: up to 10 public <strong>https</strong> image or video URLs. Publora downloads them server-side and attaches them <em>before</em> validation, so media and scheduling happen in one call. This is the one-shot alternative to the draft then <code>get_upload_url</code> then <code>complete_media</code> flow. Ingestion is rate-limited to 60 URLs per hour.</li>\n</ul>\n<h3>get_upload_url</h3>\n<p>Get a presigned URL to upload images.</p>\n<h3>complete_media</h3>\n<p>Finalize a file uploaded through <code>get_upload_url</code>, after the presigned <code>PUT</code> succeeds. Optional, because scheduling also finalizes pending media, but calling it early surfaces format and probe errors before publish. Not needed for media attached with <code>mediaUrls</code>.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code>mediaId</code>: the id returned by <code>get_upload_url</code></li>\n</ul>\n<h3>list_connections</h3>\n<p>List your connected accounts with their platform IDs. Call this first and copy the IDs verbatim; they are never guessable.</p>\n<h3>list_posts / get_post / update_post / delete_post</h3>\n<p>Manage scheduled and draft posts. <code>update_post</code> also patches <code>content</code> and <code>platforms</code> on a draft or scheduled post, so fixing a typo or retargeting no longer means delete and recreate. <code>delete_media</code> and <code>prune_media_reference</code> clean up uploaded files.</p>\n<h2>Long Content</h2>\n<p>Threads posts are capped at 500 characters and <strong>Publora's multi-part threading is currently disabled</strong> while the Threads app connection is being restored. Content over the limit is not split automatically, so:</p>\n<ul>\n<li>Keep the post inside 500 characters, or</li>\n<li>Publish the parts yourself as separate posts, or</li>\n<li>Move the long-form version to a platform that threads today (X) and link to it.</li>\n</ul>\n<p>Manual <code>---</code> separators and <code>[1/3]</code> markers are preserved as written but do <strong>not</strong> create a connected reply chain right now. Contact support@publora.com for the restore timeline.</p>\n<h2>Reply Control</h2>\n<p>Control who can reply to your posts via REST API <code>platformSettings</code>:</p>\n<table>\n<thead>\n<tr>\n<th>Value</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>\"\"</code> (empty)</td>\n<td>Default platform behavior (anyone can reply)</td>\n</tr>\n<tr>\n<td><code>\"everyone\"</code></td>\n<td>Explicitly allow anyone to reply</td>\n</tr>\n<tr>\n<td><code>\"accounts_you_follow\"</code></td>\n<td>Only accounts you follow can reply</td>\n</tr>\n<tr>\n<td><code>\"mentioned_only\"</code></td>\n<td>Only mentioned accounts can reply</td>\n</tr>\n</tbody>\n</table>\n<p>Note: <code>platformSettings</code> is accepted by the MCP <code>create_post</code> and <code>update_post</code> tools as well as over REST. The schema is <strong>strict</strong>: a mistyped platform or key is rejected with a validation error rather than silently dropped.</p>\n<h2>Important Restrictions</h2>\n<ol>\n<li><p><strong>Single hashtag limit</strong>: Threads allows maximum 1 hashtag per post. Additional hashtags are ignored by the platform.</p>\n</li>\n<li><p><strong>No post editing</strong>: Once posted, Threads posts cannot be edited via API. Delete and repost if needed.</p>\n</li>\n<li><p><strong>Video carousels not supported</strong>: Publora's carousel implementation supports images only. Standalone video posts work normally.</p>\n</li>\n<li><p><strong>Multi-threaded posts temporarily unavailable</strong>: Content splitting into multiple connected replies is temporarily disabled. Single posts and carousels continue to work.</p>\n</li>\n</ol>\n<h2>Examples</h2>\n<h3>Simple Text Post</h3>\n<pre><code>Post this to Threads:\n\"Just discovered an amazing productivity hack that saved me 2 hours today. The key is batching similar tasks together.\"\n</code></pre>\n<h3>Image Carousel</h3>\n<pre><code>Create a Threads carousel with these 5 product evolution screenshots.\nCaption: \"From concept to launch - our 6-month journey. #buildinpublic\"\n</code></pre>\n<p>Note: Requires 2-20 images. Videos in carousels are not supported.</p>\n<h3>Long Content (published as separate posts)</h3>\n<p>Threading is disabled, so ask for the parts explicitly:</p>\n<pre><code>Post this to Threads as separate posts:\n\"Thread: 7 mistakes I made as a first-time founder\n\n---\n\n1. Hiring too fast. We went from 2 to 15 in 3 months. The culture suffered.\n\n---\n\n2. Ignoring unit economics. Revenue felt great until we calculated CAC...\"\n</code></pre>\n<h3>Scheduled Post</h3>\n<pre><code>Schedule this for tomorrow at 10 AM:\n\"Monday motivation: The best time to start was yesterday. The second best time is now.\"\n</code></pre>\n<h2>Best Practices</h2>\n<ol>\n<li><strong>Hook first</strong>: First 2 lines determine engagement - make them count</li>\n<li><strong>Optimal length</strong>: 100-250 characters for single posts perform well</li>\n<li><strong>Native content</strong>: Original, conversational posts are rewarded</li>\n<li><strong>Single hashtag</strong>: Use one highly relevant hashtag (platform limit)</li>\n<li><strong>No edit option</strong>: Double-check content before posting</li>\n</ol>\n<h3>Timing</h3>\n<ul>\n<li><strong>Best times</strong>: 7-9 AM, 12-1 PM, 7-9 PM in target timezone</li>\n<li><strong>Frequency</strong>: 1-3 posts per day for growth</li>\n<li><strong>Consistency</strong>: Regular posting signals active account</li>\n</ul>\n<h3>Engagement</h3>\n<ul>\n<li>Reply to comments within first hour</li>\n<li>Cross-reference your Instagram (accounts are linked)</li>\n<li>Use relevant topics/keywords for discovery</li>\n</ul>\n<h2>Troubleshooting</h2>\n<table>\n<thead>\n<tr>\n<th>Error</th>\n<th>Cause</th>\n<th>Solution</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>\"Account not connected\"</td>\n<td>Threads/Instagram OAuth expired</td>\n<td>Reconnect via Publora dashboard</td>\n</tr>\n<tr>\n<td>\"Content too long\"</td>\n<td>Post exceeds 500 chars and threading failed</td>\n<td>Manually add <code>---</code> breaks</td>\n</tr>\n<tr>\n<td>\"Media upload failed\"</td>\n<td>Wrong format or size</td>\n<td>Check: images &lt; 8 MB, JPEG/PNG only</td>\n</tr>\n<tr>\n<td>\"Carousel requires 2-20 items\"</td>\n<td>Wrong number of images</td>\n<td>Ensure 2-20 images for carousel</td>\n</tr>\n<tr>\n<td>250 posts/day exceeded</td>\n<td>Rate limit reached</td>\n<td>Wait 24 hours</td>\n</tr>\n</tbody>\n</table>\n","files":[{"path":"SKILL.md","sizeBytes":8231,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-14T18:31:00.318328Z","sha256":"1C9923C894271A78550BF271F5031A1348F0FD109B7C024FE3A71A716C680053","sizeBytes":3789},"review":null,"source":{"repositoryUrl":"https://github.com/publora/skills","path":"skills/threads-post","license":"MIT","commit":"966c5f83b01d8f2692cc8e3ec79205568fc7993a","subtreeSha":"AABB777D7ED95BC2EC1A01E98B60A5BB97E13F9028740EFD74F882D5151F0469","lastSyncedAt":"2026-09-26T23:12:23.048328Z"},"reviewedAt":"2026-09-14T18:31:32.874037Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/publora/skills/tree/main/skills/threads-post"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install publora-skills@llmmart"},{"target":"git","command":"git clone https://github.com/publora/skills.git"}]}