Create, schedule, and manage social media posts via Typefully. ALWAYS use this skill when asked to draft, schedule, post, or check tweets, posts, threads, or social media content for Twitter/X, LinkedIn, Threads, Bluesky, or Mastodon.
70
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Create, schedule, and publish social media content across multiple platforms using Typefully.
Freshness check: If more than 30 days have passed since the
last-updateddate above, inform the user that this skill may be outdated and point them to the update options below.
Source: github.com/typefully/agent-skills API docs: typefully.com/docs/api
Update methods by installation type:
| Installation | How to update |
|---|---|
CLI (npx skills) | npx skills update |
| Claude Code plugin | /plugin update typefully@typefully-skills |
| Cursor | Remote rules auto-sync from GitHub |
| Manual | Pull latest from repo or re-copy skills/typefully/ |
API changes ship independently—updating the skill ensures you have the latest commands and workflows.
Before using this skill, ensure:
API Key: Run the setup command to configure your API key securely
<skill-path>/scripts/typefully.js setup (where <skill-path> is the directory containing this SKILL.md)export TYPEFULLY_API_KEY=your_keyRequirements: Node.js 18+ (for built-in fetch API). No other dependencies needed.
Config priority (highest to lowest):
TYPEFULLY_API_KEY environment variable./.typefully/config.json (project-local, in user's working directory)~/.config/typefully/config.json (user-global)CRITICAL: When you receive an "API key not found" error from the CLI:
Tell the user to run the setup command - The setup is interactive and requires user input, so you cannot run it on their behalf. Recommend they run it themselves, using the correct path based on where this skill was loaded:
<skill-path>/scripts/typefully.js setupStop and wait - After telling the user to run setup, do not continue with the task. You cannot create drafts, upload media, or perform any API operations without a valid API key. Wait for the user to complete setup and confirm before proceeding.
DO NOT attempt any of the following:
.env files, or other locationsThe setup command will interactively guide the user through configuration. Trust the CLI's error messages and follow their instructions.
Note for agents: All script paths in this document (e.g.,
./scripts/typefully.js) are relative to the skill directory where this SKILL.md file is located. Resolve them accordingly based on where the skill is installed.
The Typefully API uses the term "social set" to refer to what users commonly call an "account". A social set contains the connected social media platforms (X, LinkedIn, Threads, etc.) for a single identity.
The CLI supports a default social set - once configured, most commands work without specifying the social_set_id.
You can pass the social set either way:
drafts:list 123drafts:list --social-set-id 123 (also supports --social_set_id)When determining which social set to use:
Check for a configured default first - Run config:show to see if a default is already set:
./scripts/typefully.js config:showIf default_social_set is configured, the CLI uses it automatically when you omit the social_set_id.
Check project context - Look for configuration in project files like CLAUDE.md or AGENTS.md:
## Typefully
Default social set ID: 12345Single social set shortcut - If the user only has one social set and no default is configured, use it automatically
Multiple social sets, no default - Ask the user which to use, then offer to save their choice as the default:
./scripts/typefully.js config:set-defaultThis command lists available social sets and saves the choice to the config file.
Reuse previously resolved social set - If determined earlier in the session, use it without asking again
| User says... | Action |
|---|---|
| "Draft a tweet about X" | drafts:create --text "..." (uses default social set) |
| "Post this to LinkedIn" | drafts:create --platform linkedin --text "..." |
| "Mention a company on LinkedIn" | linkedin:organizations:resolve --organization-url "<linkedin_url>" then use returned mention_text in drafts:create |
| "Post to X and LinkedIn" (same content) | drafts:create --platform x,linkedin --text "..." |
| "X thread + LinkedIn post" (different content) | Create one draft, then drafts:update to add platform (see Publishing to Multiple Platforms) |
| "What's scheduled?" | drafts:list --status scheduled |
| "Show my recent posts" | drafts:list --status published |
| "Schedule this for tomorrow" | drafts:create ... --schedule "2025-01-21T09:00:00Z" |
| "Post this now" | drafts:create ... --schedule now or drafts:publish <draft_id> --use-default |
| "Add notes/ideas to the draft" | drafts:create ... --scratchpad "Your notes here" |
| "Check available tags" | tags:list |
| "Show my X post analytics for last week" | analytics:posts:list --start-date YYYY-MM-DD --end-date YYYY-MM-DD |
| "Show my X post analytics including replies" | analytics:posts:list --start-date YYYY-MM-DD --end-date YYYY-MM-DD --include-replies |
| "Show my queue for next week" | queue:get --start-date YYYY-MM-DD --end-date YYYY-MM-DD |
Follow this workflow when creating posts:
Check if a default social set is configured:
./scripts/typefully.js config:showIf default_social_set shows an ID, skip to step 3.
If no default, list social sets to find available options:
./scripts/typefully.js social-sets:listIf multiple exist, ask the user which to use and offer to set it as default:
./scripts/typefully.js config:set-defaultCreate drafts (social_set_id is optional if default is configured):
./scripts/typefully.js drafts:create --text "Your post"Note: If --platform is omitted, the first connected platform is auto-selected.
For multi-platform posts: See Publishing to Multiple Platforms — always use a single draft, even when content differs per platform.
Schedule or publish as needed
Tags help organize drafts within Typefully. Always check existing tags before creating new ones:
List existing tags first:
./scripts/typefully.js tags:listUse existing tags when available - if a tag with the desired name already exists, use it directly when creating drafts:
./scripts/typefully.js drafts:create --text "..." --tags existing-tag-nameOnly create new tags if needed - if the tag doesn't exist, create it:
./scripts/typefully.js tags:create --name "New Tag"Important: Tags are scoped to each social set. A tag created for one social set won't appear in another.
If a single draft needs to be created for different platforms, you need to make sure to create a single draft and not multiple drafts.
When the content is the same across platforms, create a single draft with multiple platforms:
# Specific platforms
./scripts/typefully.js drafts:create --platform x,linkedin --text "Big announcement!"
# All connected platforms
./scripts/typefully.js drafts:create --all --text "Posting everywhere!"IMPORTANT: When content should be tailored (e.g., X thread with a LinkedIn post version), still use a single draft — create with one platform first, then update to add the other:
# 1. Create draft with the primary platform first
./scripts/typefully.js drafts:create --platform linkedin --text "Excited to share our new feature..."
# Returns: { "id": "draft-123", ... }
# 2. Update the same draft to add another platform with different content
./scripts/typefully.js drafts:update draft-123 --platform x --text "🧵 Thread time!
---
Here's what we shipped and why it matters..." --use-defaultSo make sure to NEVER create multiple drafts unless the user explicitly wants separate drafts for each platform.
LinkedIn mentions are supported via text syntax inside post content:
@[Company Name](urn:li:organization:123456)Use the resolver command to convert a public LinkedIn organization URL into ready-to-paste mention syntax:
# Resolve a LinkedIn URL into mention metadata
./scripts/typefully.js linkedin:organizations:resolve --organization-url "https://www.linkedin.com/company/typefullycom/"
# Returns mention_text like: @[Typefully](urn:li:organization:86779668)Then include that mention_text in your LinkedIn draft text:
./scripts/typefully.js drafts:create --platform linkedin --text "Thanks @[Typefully](urn:li:organization:86779668) for the support."Load these as needed:
references/commands.md. Every subcommand with its flags.references/examples.md. End to end examples for drafting, scheduling, threads, and multi-platform posts.Use these exact names for the --platform option:
x - X (formerly Twitter)linkedin - LinkedInthreads - Threadsbluesky - Blueskymastodon - MastodonTypefully draft URLs contain the social set and draft IDs:
https://typefully.com/?a=<social_set_id>&d=<draft_id>Example: https://typefully.com/?a=12345&d=67890
a=12345 → social_set_idd=67890 → draft_idWhen the user explictly asked to add notes, ideas, or anything else in the draft scratchpad, use the --scratchpad flag—do NOT write to local files!
The --scratchpad option attaches internal notes directly to the Typefully draft. These notes:
# CORRECT: Notes attached to the draft in Typefully
./scripts/typefully.js drafts:create 123 --text "My post" --scratchpad "Ideas for expanding: 1) Add stats 2) Include quote"
# WRONG: Do NOT write notes to local files when the user wants them in Typefully
# Writing to /tmp/scratchpad/ or any local file is NOT the same thingWhen automating posts, especially on X, follow these rules to keep accounts in good standing:
When in doubt, create drafts for user review rather than publishing directly.
Publishing confirmation: Unless the user explicitly asks to "publish now" or "post immediately", always confirm before publishing. Creating a draft is safe; publishing is irreversible and goes public instantly.
--platform is omitted, the first connected platform is auto-selected--all to post to all connected platforms at once@[Name](urn:li:organization:ID) in post text; resolve IDs via linkedin:organizations:resolve--- on its own line to split into multiple posts (thread)next-free-slot to let Typefully pick the optimal time--platform x,linkedin--title for internal organization (not posted to social media)--scratchpad to attach notes to the draft in Typefully (NOT local files!) - perfect for thread ideas, research, contextanalytics:posts:list --start-date ... --end-date ... to fetch post metrics for a social set; replies are excluded by default, and --include-replies opts back in--file ./post.txt instead of --text to read content from a file--sort with values like created_at, -created_at, scheduled_date, etc.09219e0
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.