Skip to main content
Glama

x-twitter.create_post

Publish a post to a connected X account via the official X API (POST /2/tweets).

Call x-twitter.connected_accounts first. If accounts is empty, the user must connect an X account at https://vee3.io/dashboard/connections before posting. Agents cannot complete OAuth; ask the user to connect, then call x-twitter.connected_accounts again.

Pass user_id or user_name to target a specific account, not both. Omit both to use the default connected account.

At least one of text, poll, media, or card_uri is required.

Supports text, polls, media attachments, reply settings, paid partnership disclosure, AI-generated labels, super-follower exclusivity, nullcast posts, cards, communities, and direct-message deep links.

To attach media, upload files with files.upload_file and the @vee3/upload CLI, then pass file_name values returned by files.list_uploaded_files in the media array (up to 4 files). Only files listed by list_uploaded_files can be attached. poll, media, and card_uri are mutually exclusive in the X API.

Token pricing: 60 tokens base for text posts. Posts whose text includes a URL are billed 1000 tokens base instead. Attaching only media (an image or video) without a URL in the text does not trigger the URL rate. Each attached image adds 50 tokens. Each attached video adds 150 tokens plus 50 tokens per 5 MB of video size.

X rate limit: 100 POST /2/tweets requests per connected user per 15 minutes. Wait and retry if posting is temporarily blocked.

If X authorization fails, reconnect the account in the Vee3 dashboard. Read the error message when X rejects a post and adjust the request.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pollNoPoll object with options (2-4 strings) and duration_minutes (5-10080).
textNoPost text content. At least one of text, poll, media, or card_uri is required.
mediaNoFile names from files.list_uploaded_files to attach (up to 4). Upload with files.upload_file and @vee3/upload first, then list_uploaded_files to get the stored file_name values.
user_idNoNumeric X user id from x-twitter.connected_accounts. Pass user_id or user_name to target a specific account, not both. Omit both to use the default account.
card_uriNoCard URI for the post. Mutually exclusive with poll and media.
nullcastNoWhether the post is promoted-only and hidden from the public timeline.
user_nameNoX handle from x-twitter.connected_accounts, with or without a leading @. Pass user_id or user_name to target a specific account, not both. Omit both to use the default account.
community_idNoCommunity id when posting to an X community.
made_with_aiNoWhether the post contains AI-generated media.
reply_settingsNoWho can reply to the post.
paid_partnershipNoWhether the post is a paid partnership.
share_with_followersNoWhether to share a community post with followers too.
direct_message_deep_linkNoDeep link that moves the conversation into Direct Messages.
for_super_followers_onlyNoWhether the post is exclusive to super followers.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
textNoPost text returned by the X API.
user_idNoNumeric X user id of the connected account that published the post.
tweet_idNoNumeric id of the created or edited post.
user_nameNoX handle of the connected account that published the post.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • changedInput schema / properties / media / description
      Previous value: -"File names from meta-tools.list_uploaded_files to attach (up to 4). Upload with meta-tools.upload_file and @vee3/upload first, then list_uploaded_files to get the stored file_name values."New value: +"File names from files.list_uploaded_files to attach (up to 4). Upload with files.upload_file and @vee3/upload first, then list_uploaded_files to get the stored file_name values."
  2. Changed2 schema fields changed
    • changedInput schema / properties / user_id / description
      Previous value: -"Numeric X user id from get-x-connected-accounts. Pass user_id or user_name to target a specific account, not both. Omit both to use the default account."New value: +"Numeric X user id from x-twitter.connected_accounts. Pass user_id or user_name to target a specific account, not both. Omit both to use the default account."
    • changedInput schema / properties / user_name / description
      Previous value: -"X handle from get-x-connected-accounts, with or without a leading @. Pass user_id or user_name to target a specific account, not both. Omit both to use the default account."New value: +"X handle from x-twitter.connected_accounts, with or without a leading @. Pass user_id or user_name to target a specific account, not both. Omit both to use the default account."
  3. Added

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses critical behaviors: OAuth cannot be completed by agents and requires user action, token pricing (60 base, 1000 with URL, media surcharges), X rate limits (100 posts per 15 minutes), and error handling/reconnection guidance. This goes far beyond the schema and gives the agent important operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence contributes necessary operational detail: prerequisites, account targeting, required fields, feature list, media upload workflow, pricing, rate limits, and error recovery. It is well-structured and front-loads the primary purpose and first call to make.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (14 optional params, numerous features, media handling), the description covers all critical aspects: preconditions, account selection, content requirements, upload process, pricing, rate limits, and failure handling. The presence of an output schema covers return values, so no additional return description is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% description coverage for all 14 parameters. The description adds operational semantics beyond the schema: how to obtain media file names via files.list_uploaded_files, the meaning of omitting account identifiers (default account), mutual exclusivity constraints, and token cost implications based on content. This enhances parameter understanding without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool publishes a post to a connected X account via the official X API (POST /2/tweets). The verb 'Publish' and resource 'post' are specific, and it distinguishes from sibling tools like x-twitter.edit_post, x-twitter.delete_post, and x-twitter.reply_to_post by focusing on creation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit preconditions (call x-twitter.connected_accounts first), account targeting rules (user_id or user_name exclusive, default if omitted), and content requirements (at least one of text, poll, media, or card_uri). It also explains media upload prerequisites and mutual exclusions. However, it does not explicitly name alternative tools for other actions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.1/5.0
Disambiguation5/5

Each tool has a distinct purpose, further clarified by group prefixes and clear descriptions. Within each group, tools perform different operations (e.g., domains.lookup vs. domains.whois vs. domains.rdap) with no ambiguity.

Naming Consistency5/5

All tools follow a consistent group.tool_name pattern using snake_case. The naming is predictable and uniformly applied across all groups.

Tool Count4/5

78 tools is high, but the server aggregates multiple distinct API domains (11 groups). Each group has a reasonable number of tools, typically under 10, with TikTok having 17. The count reflects breadth, not bloat.

Completeness5/5

Each domain's tool set covers the primary expected operations (e.g., search, details, reviews, metrics, user info). There are no obvious gaps for read-only analytical use; features like posting are likely out of scope.