Skip to main content
Glama
TweetAPI MCP

TweetAPI MCP

Official

TweetAPI MCP

MCP server for TweetAPI, a third-party Twitter data API. It lets AI agents read public Twitter data (search, profiles, followers, timelines, lists, communities, Spaces and trends) and look up TweetAPI's own docs.

TweetAPI is an independent service and is not affiliated with X Corp.

Hosted server

The easiest way to use it is the hosted server. You sign in with your TweetAPI account and pick which API key backs the connection. New accounts get 100 free API units and no card is needed.

https://mcp.tweetapi.com/mcp

Codex:

codex mcp add tweetapi --url https://mcp.tweetapi.com/mcp
codex mcp login tweetapi

Claude Code:

claude mcp add --transport http --scope user tweetapi https://mcp.tweetapi.com/mcp
claude mcp login tweetapi

Cursor (~/.cursor/mcp.json):

{
  "mcpServers": {
    "tweetapi": {
      "url": "https://mcp.tweetapi.com/mcp"
    }
  }
}

The hosted server uses Streamable HTTP and OAuth. More setup notes are in the agents guide.

Related MCP server: Spectre

Run it locally

You can also run the server yourself over stdio with an API key from the TweetAPI dashboard. Node 18 or newer and pnpm are required.

git clone https://github.com/tweetapi/tweetapi-mcp.git
cd tweetapi-mcp
pnpm install
pnpm run build

Then point your MCP client at it:

{
  "mcpServers": {
    "tweetapi": {
      "command": "node",
      "args": ["/path/to/tweetapi-mcp/dist/bin.js", "--live"],
      "env": {
        "TWEETAPI_API_KEY": "your_tweetapi_key_here"
      }
    }
  }
}

Without --live, only the docs tools are available and no API key is needed.

Tools

Docs (free, no API calls): tweetapi_docs_search, tweetapi_endpoint_lookup, tweetapi_docs_get_page, tweetapi_sdk_guidance, tweetapi_tool_catalog.

Live data (47 read-only tools):

  • Users: profile by username or ID, batches of up to 100, About this account, tweets, tweets and replies, Photos, Videos, Highlights and Articles tabs, followers and following (profiles or IDs), verified followers, subscriptions, affiliates, similar accounts, Lists and List memberships, follow check.

  • Tweets: search, details with replies, metrics only, batches of up to 200 by ID, quotes, retweets, hidden replies, translation.

  • Lists: details, tweets, members, followers, search.

  • Communities: details, tweets, media, members, search.

  • Spaces: details and audio stream URL.

  • Trends: trending topics worldwide, by country or by location, and the locations X supports.

  • Account: tweetapi_account_usage, the units left on the API key behind the connection.

Each live tool call makes exactly one TweetAPI request and is billed like any other API call. Tools never paginate on their own; the agent passes the cursor when it wants the next page.

Live tools are read-only. There are no tools for posting, DMs, follows, profile edits, account cookies or billing. The only account tool is the free read-only usage check for the connection's own API key.

Live tool results

  • Live tools declare an MCP output schema and return the same JSON as structuredContent and as a text block.

  • Each result has retrievedAt (when the MCP server got the response), completeness (page cursor, batch items not returned, or a single object), output (format and omitted fields), and cost (a unit estimate from the published pricing rules, not a billing record).

  • responseFormat: "compact" is optional on profile, post, and List-page tools. It keeps full post text, IDs, links, original dates, counts, and cursors, never drops items, and lists the dropped fields in output.fieldsOmitted. The default stays full, which returns TweetAPI's JSON unchanged.

  • tweetapi_tweet_metrics returns its own short projection, so its output.format is metrics, output.fieldsOmitted lists what it leaves out, and output.textTruncated matches result.tweet.textTruncated.

  • On the four X v1.1 follower and following ID and list tools, a nextCursor of "0" means the last page. pagination keeps the "0", and completeness reports no next cursor.

  • An empty page that still has a nextCursor says so in completeness.note. X often sends a cursor at the end of a feed, so if the next page is empty too, stop: empty pages are billed.

  • Post, profile, list, community, and Space fields accept the matching x.com or twitter.com link, and username fields accept @handles. See src/identifiers.ts for the exact rules.

  • tweetapi_trends takes country or woeid, not both. Sending both is rejected before any request is made.

  • tweetapi_account_usage reads the units left on the API key behind the connection. It is free and counts toward the per-minute limit.

  • Errors carry details.layer (mcp_input, mcp_connection, tweetapi_api_key, tweetapi_api, network), retryable, retryAfterSeconds when TweetAPI sent Retry-After, and a cost estimate. The server never retries on its own.

docs/client-verification.md lists which client behaviors are covered by local tests and which still need a manual check with a real client.

Hosted service

This repo is also the source for the service at mcp.tweetapi.com. In HTTP mode it accepts dashboard-issued OAuth tokens with the tweetapi:read scope, resolves the backing API key on the server, and never sends the bearer token upstream. It depends on TweetAPI's OAuth server, so it is not meant to be self-hosted as is. See docs/security.md and docs/deployment.md for how it works.

docker build -t tweetapi-mcp .
docker run --rm -p 3100:3100 -e MCP_ALLOWED_HOSTS=localhost,127.0.0.1 tweetapi-mcp
curl http://localhost:3100/healthz

Development

pnpm install
pnpm run check
pnpm run check:release

The checks cover formatting, Markdown lint, TypeScript, unit tests, stdio and HTTP smoke tests, and a secret scan. Tests mock the docs and the API; they never call the live TweetAPI API.

Security

Please report vulnerabilities privately. See SECURITY.md.

License

MIT

Available Tools

52 tools
tweetapi_account_usageGet Account UsageA
Read-onlyIdempotent

Check the units left on the TweetAPI API key behind this connection: available units, plan allowance, PAYG balance, and the per-minute rate limit. Costs 0 units and counts toward the per-minute limit. Shows only this key; it cannot change anything.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, non-destructive), it discloses two non-obvious operational facts: the call consumes 0 units but still counts against the per-minute rate limit, and its scope is restricted to the key behind this connection. Those details materially affect how an agent budgets and paces its calls, which the annotation block alone would not convey.

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?

Two compact sentences: the first front-loads what is returned, the second carries cost/limit/safety constraints. No filler, no restatement of the title, and every clause adds information an agent would otherwise have to guess.

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?

With zero parameters, full annotation coverage, and an output schema that documents the return shape, the description supplies exactly the missing layer: cost accounting, rate-limit impact, and key scoping. Nothing needed to invoke this correctly is absent.

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 tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The description correctly avoids inventing parameter-like options (e.g., no account selector), reinforcing that the key identity is implicit in the connection.

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?

States a specific verb and resource ('Check the units left on the TweetAPI API key behind this connection') and enumerates the returned fields: available units, plan allowance, PAYG balance, and per-minute rate limit. That framing cleanly separates it from every sibling tool, which all fetch tweet/user/list/space content rather than account quota data.

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 makes the use case clear (check remaining quota, verify plan/PAYG state) and gives a decision-relevant fact — it costs 0 units — that tells an agent this call is cheap to make preemptively. It does not explicitly say 'call this before heavy searches' or name an alternative, but no sibling overlaps, so there is little routing ambiguity to resolve.

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

tweetapi_community_detailsGet Community DetailsA
Read-onlyIdempotent

Fetch one community's details by community ID or community link: name, description, member count and settings. Use tweetapi_community_tweets for its posts and tweetapi_community_members for its members. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
communityIdYesNumeric community ID, or a community link such as https://x.com/i/communities/1234567890.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description still earns credit for operational context the annotations do not carry: an API key is required, one request per call, and roughly 1 unit with a cost estimate returned per result. It stops short of describing throttling, error behavior, or what happens with an invalid or private community ID, so it is solid but not rich.

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?

Three short sentences with zero waste: what it returns first, sibling routing second, cost and auth third. Information is front-loaded and each sentence carries distinct facts.

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?

An output schema exists, so return values need not be detailed, yet the description still names the key fields and mentions the cost estimate in each result. Auth requirement, request cost, and sibling alternatives round out everything an agent needs before calling this single-parameter read tool.

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

Parameters3/5

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

Schema description coverage is 100% and the single communityId parameter already documents both the numeric ID and the link form, so the description adds no syntax beyond the schema. The phrase 'by community ID or community link' mirrors what the schema states; baseline 3 applies when the schema carries the semantics.

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?

Opens with a specific verb and resource ('Fetch one community's details') and enumerates the returned fields (name, description, member count, settings), plus the accepted identifier forms. It explicitly names the sibling tools for posts and members, so the agent can separate it from tweetapi_community_tweets and tweetapi_community_members without opening any schema.

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

Usage Guidelines5/5

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

States the selection condition directly: use this for the community's own details, use tweetapi_community_tweets for posts and tweetapi_community_members for members. That is explicit alternative routing for the most likely confusion set, leaving little to infer.

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

tweetapi_community_mediaGet Community MediaA
Read-onlyIdempotent

Fetch one page of posts with photos or videos from a community, as on its Media tab, by community ID or community link. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
communityIdYesNumeric community ID, or a community link such as https://x.com/i/communities/1234567890.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (which already declare readOnly, idempotent, openWorld, non-destructive), the description discloses the API key requirement, that each call makes exactly one TweetAPI request costing about 1 unit, that per-result cost estimates are returned, and that the operation is paginated. That is substantive operational context an agent cannot get from structured fields alone.

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

Conciseness4/5

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

Four tight sentences, front-loaded with what the tool returns and followed by cost and pagination mechanics; nothing is padded. The standalone 'Read-only.' sentence slightly duplicates the readOnlyHint annotation but serves as a quick safety cue.

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?

With annotations covering the safety profile and an output schema covering return shape, the description only needed to cover access, cost, and paging — and it covers all three, including the exact field to pass for the next page. Nothing required for a correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (cursor, communityId, responseFormat) are already fully documented in the schema, including the link format and the cursor provenance. The description reinforces cursor paging but adds no syntax or constraint details beyond what the schema already states, so the baseline 3 applies.

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?

States a specific verb and resource plus a scope qualifier: 'Fetch one page of posts with photos or videos from a community, as on its Media tab.' The media-type restriction and community scoping make it clearly distinguishable from siblings like tweetapi_community_tweets or tweetapi_user_photos without opening any schema.

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 'Media tab' framing plus the explicit 'by community ID or community link' gives clear context for when this is the right call. It does not, however, name the alternative to use when the agent wants text-only community posts (e.g. tweetapi_community_tweets), so there is no explicit when-not guidance.

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

tweetapi_community_membersGet Community MembersA
Read-onlyIdempotent

Fetch one page of a community's members, by community ID or community link. Use tweetapi_community_details for the member count. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
communityIdYesNumeric community ID, or a community link such as https://x.com/i/communities/1234567890.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds material context beyond them: API-key requirement, one request per call, typical cost of 1 unit, and a per-result cost estimate. It also explains the exact pagination contract via completeness.nextCursor, so the agent knows both the cost model and how to resume.

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?

Three short sentences, front-loaded with the action, then the disambiguation, then cost and pagination mechanics. Every clause carries information an agent would otherwise have to guess.

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?

With an output schema present the description need not explain return values, and it instead spends its words on auth, cost, and cursor-based resumption — exactly the gaps structured fields do not fill. Nothing needed to invoke and continue correctly is missing.

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?

Schema coverage is 100%, so the baseline is 3; the description nonetheless adds procedural meaning by tying the cursor parameter to the previous result's completeness.nextCursor and reinforcing that communityId accepts either a numeric ID or a link. The responseFormat enum is left entirely to the schema, which caps it at 4.

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?

States a specific verb and resource ('Fetch one page of a community's members') plus the accepted identifier forms (community ID or link). It also distinguishes itself from tweetapi_community_details by assigning member-count lookups to that sibling, so an agent can separate the two without opening schemas.

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?

Explicitly routes member-count queries to tweetapi_community_details and gives concrete continuation instructions for pagination. It does not address the nearest ambiguous sibling, tweetapi_list_members (list vs community members), leaving that distinction to naming inference, which keeps it below a 5.

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

tweetapi_community_tweetsGet Community TweetsA
Read-onlyIdempotent

Fetch one page of posts in a community, by community ID or community link, in the order set by sortBy. Use tweetapi_community_media for only the posts with photos or videos. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
sortByNoOrder of the posts: Relevance (default) or Recency.Relevance
communityIdYesNumeric community ID, or a community link such as https://x.com/i/communities/1234567890.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds real context beyond them: an API key is required, one TweetAPI request per call, typically 1 unit cost, and each result carries a cost estimate. The pagination trait (one page per call, loop on completeness.nextCursor) is behavior an agent could not infer from the annotations.

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

Conciseness4/5

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

Front-loads the core action and scope, then layers the alternative, safety, cost, and pagination notes — each sentence carries distinct information. The cost sentence is slightly dense ('one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate') but nothing is redundant.

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?

For a paginated read endpoint with an output schema, everything an agent needs is present: identifier formats, sort options, pagination loop, cost/auth expectations, and a sibling for the media-filtered variant. Return-value detail is correctly left to the output schema.

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

Parameters3/5

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

Schema coverage is 100%, with cursor, sortBy, communityId, and responseFormat all documented in the schema itself. The description restates the page/sortBy/cursor semantics but adds no syntax or format detail beyond what the schema already provides, so baseline 3 applies.

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?

States a specific verb and resource ('fetch one page of posts in a community'), the accepted identifiers (community ID or link), and the ordering control (sortBy). It also names the sibling it is not — tweetapi_community_media for photo/video-only posts — so an agent can distinguish it without opening schemas.

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?

Gives explicit routing for the media-only case ('Use tweetapi_community_media for only the posts with photos or videos') and clear pagination instructions via completeness.nextCursor. It does not distinguish against other community siblings such as community_search or community_details, so the guidance is strong but not exhaustive.

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

tweetapi_docs_get_pageGet TweetAPI Docs PageA
Read-onlyIdempotent

Return the full reference for one TweetAPI endpoint: its method, path, title and whole docs section, with parameters, cost and an example request. An exact path such as /tw-v2/user/followers returns that endpoint; a keyword returns the single best match, and no match returns a TWEETAPI_DOCS_PAGE_NOT_FOUND error. Free: uses no API key or units.

NameRequiredDescriptionDefault
pathOrKeywordYesAn endpoint path such as /tw-v2/user/followers, or a keyword such as followers. A path gives the most precise match.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description goes beyond them usefully by disclosing the failure mode (TWEETAPI_DOCS_PAGE_NOT_FOUND) and the cost/auth profile ('Free: uses no API key or units'), which an agent needs for planning. It does not describe payload size or pagination of the returned docs section, keeping it short of a 5.

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?

Two tight sentences with zero filler: the return payload is front-loaded, followed by the path/keyword/error contract and the cost note. Every clause carries information an agent would otherwise have to guess.

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?

With a single required parameter, full schema coverage, no output schema and complete annotation coverage, the description supplies precisely what is missing: return shape, match precedence, error behavior and cost. Nothing an agent needs to invoke this correctly is absent.

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

Parameters3/5

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

Schema coverage is 100% and the parameter description already states that a path yields the most precise match, so the description's restatement of path-vs-keyword behavior adds little new meaning. Baseline 3 applies when the schema carries parameter semantics.

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

Purpose4/5

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

The description uses a specific verb and resource ('Return the full reference for one TweetAPI endpoint') and enumerates exactly what comes back: method, path, title, whole docs section, parameters, cost and example request. It implicitly distinguishes itself from docs_search by promising a single endpoint rather than a result list, but it never names that sibling explicitly, so routing still takes a small inference.

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?

Clear operating guidance: an exact path like /tw-v2/user/followers returns that endpoint, a keyword returns the single best match, and a miss returns TWEETAPI_DOCS_PAGE_NOT_FOUND. What is missing is an explicit alternative — the description never points to tweetapi_docs_search or tweetapi_endpoint_lookup for cases where the agent wants multiple matches or a lookup rather than full docs.

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

tweetapi_endpoint_lookupLookup TweetAPI EndpointA
Read-onlyIdempotent

Find the TweetAPI endpoint docs that match a path or keyword, and return up to 10 matching sections as snippets with their source URLs. Use it when you don't know the exact endpoint yet, then pass its path to tweetapi_docs_get_page for the full reference. Free: uses no API key or units.

NameRequiredDescriptionDefault
pathOrKeywordYesAn endpoint path such as /tw-v2/user/followers, or a keyword such as followers. A path gives the most precise match.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, open-world behavior, so the bar is low, yet the description adds real value: a result cap of 10, the snippet-plus-source-URL return format (no output schema exists), and 'Free: uses no API key or units' which discloses cost/auth requirements. Minor omission: no statement about result ranking or what happens when nothing matches.

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?

Three short sentences, zero filler: what it does and what it returns, when to use it plus the follow-up call, then the cost/auth note. Front-loaded with the core capability.

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

Completeness4/5

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

For a single-parameter lookup with no output schema, the description supplies the return format, result limit, and cost profile, which is close to complete. It falls short only on disambiguating against tweetapi_docs_search in a 47-sibling toolset where that overlap is a real selection risk.

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

Parameters3/5

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

Schema coverage is 100% and the schema already explains the path-vs-keyword distinction and that a path gives the most precise match. The description only echoes 'path or keyword', adding no syntax or format detail beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource ('Find the TweetAPI endpoint docs') and the return shape (up to 10 matching sections as snippets with source URLs). However, it never distinguishes itself from the near-identical sibling tweetapi_docs_search, so an agent still has to guess between the two.

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?

Explicitly states when to use it ('when you don't know the exact endpoint yet') and hands off to a named alternative (tweetapi_docs_get_page) for the full reference. The gap is that the competing docs_search sibling is not mentioned, so no exclusion rule exists for it.

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

tweetapi_list_detailsGet List DetailsA
Read-onlyIdempotent

Fetch one X List's details by List ID or List link: name, description, owner, member and follower counts, and whether it is public or private. Use tweetapi_list_tweets for its posts, tweetapi_list_members for the accounts in it, and tweetapi_list_followers for the accounts following it. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
listIdYesNumeric list ID, or a list link such as https://x.com/i/lists/1234567890.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so 'Read-only' is redundant, but the description adds genuinely new behavior: a TweetAPI API key is required, one request is made per call, it usually costs 1 unit, and results carry a cost estimate. That cost and auth context is not derivable from any structured field.

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

Conciseness4/5

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

Three sentences, front-loaded with the resource and payload, then alternatives, then cost/auth caveats. Slightly padded by the redundant 'Read-only' and repeated cost phrasing ('usually costing 1 unit' plus 'cost estimate'), but nothing is wasted overall.

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?

An output schema exists, so return values need no prose explanation, yet the description still previews the shape usefully. For a single-parameter read tool, auth, cost, request count and sibling routing are all covered, leaving nothing an agent needs missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents the listId as 'Numeric list ID, or a list link such as https://x.com/i/lists/1234567890'. The description's 'by List ID or List link' restates that without adding format or edge-case detail, so the baseline 3 applies.

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?

States a specific verb and resource ('Fetch one X List's details') and enumerates what comes back: name, description, owner, member and follower counts, visibility. It also names the three sibling list tools it is not, so an agent can separate it from tweetapi_list_members, tweetapi_list_tweets and tweetapi_list_followers without reading any schema.

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

Usage Guidelines5/5

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

Routes the agent explicitly: use this for details, tweetapi_list_tweets for posts, tweetapi_list_members for accounts in the list, tweetapi_list_followers for followers. Each alternative is paired with the condition that selects it, which is exactly what the crowded list_* sibling set requires.

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

tweetapi_list_followersGet List FollowersA
Read-onlyIdempotent

Fetch one page of the accounts that follow (subscribe to) a list. Use tweetapi_list_members for the accounts in the list. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
listIdYesNumeric list ID, or a list link such as https://x.com/i/lists/1234567890.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the auth requirement (TweetAPI API key), the request/cost model (one request per call, ~1 unit, cost estimate per result), and the pagination contract. Annotations already cover safety and idempotency, and the description adds the operational context they cannot.

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

Conciseness4/5

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

Front-loaded with purpose, then scope disambiguation, then cost, then paging. Dense but nearly every clause carries information; the single paragraph is slightly crowded compared with splitting paging into its own sentence.

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?

An output schema exists, yet the description still supplies the one piece an agent needs to act on it (where nextCursor comes from). Auth, cost, scope, and paging are all covered for a simple three-parameter read tool.

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?

Schema coverage is 100% so parameters are already documented, but the description adds meaning the schema lacks: it ties cursor to the output path completeness.nextCursor and explains the paging loop. That is real value above baseline 3.

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?

States a specific verb and resource (fetch accounts that follow a list) and explicitly frames the inverse relationship with tweetapi_list_members, so an agent can tell the two apart without reading schemas.

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?

Names the sibling tool to use for the opposite set (members) and covers the pagination workflow. It does not address how this differs from the user-level follower tools in the sibling list, which would be the remaining ambiguity.

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

tweetapi_list_membersGet List MembersA
Read-onlyIdempotent

Fetch one page of the accounts that are members of a List, by List ID or List link. Use tweetapi_list_followers for the accounts that follow the List, or tweetapi_list_details for its counts. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
listIdYesNumeric list ID, or a list link such as https://x.com/i/lists/1234567890.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is given. The description still adds real operational context beyond them: an API key is required, each call is one request costing roughly 1 unit, and results carry a cost estimate. It does not disclose rate limits, error conditions, or what happens with private/suspended Lists, so this is good-but-not-rich for an annotated tool.

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?

One front-loaded paragraph: purpose first, then sibling routing, then auth/cost behavior, then pagination mechanics. Every sentence carries distinct information with no redundant restatement of the name or title.

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?

An output schema exists, so return values need not be described, yet the description supplies the key return detail an agent needs to continue paging (completeness.nextCursor). With auth, cost model, scope and pagination all covered, nothing material is missing for a read-only paginated list tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents cursor, listId and responseFormat including the enum meaning, establishing a baseline of 3. The description adds the pagination loop ('call again with cursor set to this result's completeness.nextCursor'), which is useful workflow context, but it does not explain listId link-vs-numeric handling or compact-vs-full tradeoffs beyond the schema.

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?

States a specific verb and resource ('Fetch one page of the accounts that are members of a List'), including the lookup key (List ID or List link). It immediately distinguishes itself from tweetapi_list_followers and tweetapi_list_details, so an agent can choose correctly without opening a schema.

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

Usage Guidelines5/5

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

Names two concrete alternatives with the condition each covers ('accounts that follow the List' vs 'its counts'), which is exactly the when-to-use-which routing an agent needs in a 50-sibling namespace. No exclusions are stated, but the sibling routing is explicit and unambiguous.

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

tweetapi_list_tweetsGet List TweetsA
Read-onlyIdempotent

Fetch one page of the posts in a List's timeline, by List ID or List link. Use tweetapi_list_members to see whose posts the List includes. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
listIdYesNumeric list ID, or a list link such as https://x.com/i/lists/1234567890.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, yet the description adds genuinely new behavior: an API key is required, one request per call, roughly 1 cost unit with a per-result cost estimate, and the exact next-page mechanism via completeness.nextCursor. This is the kind of context structured fields do not carry.

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?

One dense paragraph, front-loaded with the action and scope, then alternatives, cost, and pagination in priority order. Every sentence carries information the agent needs; nothing is filler.

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?

With an output schema present, return-value detail is unnecessary, and the description covers everything else an agent needs: auth requirement, cost model, pagination loop, and the sibling for membership. Nothing material is missing for a paginated read tool.

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

Parameters3/5

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

Schema coverage is 100%, so cursor, listId, and responseFormat are already documented. The description restates listId accepted forms and cursor semantics but adds no new meaning for responseFormat, so the baseline of 3 applies.

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?

States a specific verb and resource ("Fetch one page of the posts in a List's timeline") and scopes the input domain (by List ID or List link). It is clearly distinguishable from siblings such as tweetapi_list_members or tweetapi_user_tweets without opening any schema.

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?

Explicitly routes the agent to tweetapi_list_members for the membership question, and gives clear continuation guidance for paging. It does not state exclusions against other post-listing siblings (e.g. user_tweets), so it stops short of full when/when-not coverage.

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

tweetapi_sdk_guidanceTweetAPI SDK GuidanceA
Read-onlyIdempotent

Return setup guidance for calling TweetAPI from your own code: the SDK package name, install command, an import example and notes, for Python or Node.js/TypeScript. Use it when writing an app that calls TweetAPI; to fetch data now, use the live tools instead. Free: makes no API calls.

NameRequiredDescriptionDefault
taskYesWhat the code should do, such as fetch a user's latest posts. It is echoed back.
languageYesProgramming language: Python, or Node.js, TypeScript or JavaScript.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare this a non-destructive, idempotent, open-world read, so the safety profile is covered. The description adds genuinely new behavioral context beyond them: it is free and makes no API calls, and it discloses the shape of the returned content. What it does not say is whether the guidance is static or reflects the current API version.

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?

Two sentences, front-loaded with what is returned, then the routing condition, then the cost note. Nothing is padded and every clause carries information an agent would otherwise have to guess.

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

Completeness4/5

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

There is no output schema, so the description correctly takes on the burden of describing return contents, and it does so for a simple two-string-input tool. The remaining gap is the undocumented effect of 'task' on the response beyond the schema's note that it is echoed back.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented and the baseline is 3. The description adds little beyond the schema, and it actually narrows the language list to 'Python or Node.js/TypeScript' while the schema accepts JavaScript too — a small inconsistency rather than added meaning. The 'task' parameter is not mentioned at all in the description.

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?

States a specific verb and resource ('Return setup guidance for calling TweetAPI from your own code') and enumerates exactly what is returned: SDK package name, install command, import example and notes. It also names what it is not ('to fetch data now, use the live tools instead'), which separates it cleanly from the ~50 data-fetching siblings.

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

Usage Guidelines5/5

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

Gives both sides of the routing decision: use this when writing an app that calls TweetAPI, use the live tools when you want data now. The only minor gap is that it does not point at the docs siblings (tweetapi_docs_get_page, tweetapi_docs_search), but the primary alternative is named explicitly.

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

tweetapi_space_by_idGet Space By IDA
Read-onlyIdempotent

Fetch details for a Space by its space ID or Space link, including the media key needed for tweetapi_space_stream_url. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
spaceIdYesSpace ID, or a Space link such as https://x.com/i/spaces/1ABCdefGHIjkl.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, and the description goes beyond them by disclosing the authentication requirement (TweetAPI API key), the request volume (one request per call), and the cost profile (~1 unit, with a per-result cost estimate). These are exactly the operational facts an agent needs before calling a metered external endpoint.

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?

Three short sentences with the core purpose front-loaded, followed by cost/auth context and no redundant restatement of the title. Every clause carries information an agent can act on.

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?

For a single-parameter read tool with an output schema (so return values need no explanation), the description covers purpose, input forms, auth, cost, and the dependency on the streaming sibling. Nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the spaceId property already documents both accepted formats, including the full Space link example. The description restates "space ID or Space link" but adds no format, normalization, or error-handling detail beyond the schema, so the baseline 3 applies.

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?

States a specific verb and resource ("Fetch details for a Space by its space ID or Space link") and adds a distinguishing payload detail: it returns the media key needed by tweetapi_space_stream_url. That lets an agent separate it from the sibling stream-URL tool without opening either schema.

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?

Implies a usage sequence by noting the returned media key is needed for tweetapi_space_stream_url, which is a concrete when-to-use signal. It does not explicitly state when-not to use it or name any other alternative among the ~50 siblings, so it falls 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.

tweetapi_space_stream_urlGet Space Stream URLA
Read-onlyIdempotent

Fetch the audio stream URL for a Space, using the media key from tweetapi_space_by_id. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
mediaKeyYesThe Space's media key, from a tweetapi_space_by_id result.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description adds context beyond them: API key requirement, one request per call, ~1 unit cost, and that each result carries a cost estimate. The notable omission is URL lifetime/expiry, which matters for a stream URL an agent may pass on to a consumer.

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

Conciseness4/5

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

Front-loaded with the action and the required input source, then cost/auth facts. Every sentence carries information, though "Read-only." restates readOnlyHint=true and is mild redundancy.

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

Completeness4/5

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

For a one-parameter tool with a 100% covered schema and an output schema, the description covers the pieces that structured fields can't: upstream dependency, auth, and cost model. Only the stream URL's lifetime/expiry behavior is left unstated.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is already documented with its source, so the schema does the heavy lifting. The description only reinforces provenance of mediaKey and adds no format or validation detail beyond it — baseline 3 applies.

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?

States a specific verb and resource ("Fetch the audio stream URL for a Space") and names the sibling that produces the required input (tweetapi_space_by_id), so an agent can distinguish it from the other space/community tools without opening the schema.

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?

Gives concrete workflow guidance: the mediaKey must come from a tweetapi_space_by_id result, which establishes the prerequisite call ordering. It does not state when *not* to use it or what happens if the Space has ended, but the chaining context is the main ambiguity an agent would face.

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

tweetapi_tool_catalogTweetAPI MCP Tool CatalogA
Read-onlyIdempotent

List the tools on this server as JSON: for each, its name, description, category, the TweetAPI endpoint it calls, estimated cost, response formats and input schema. Filter it with toolName, endpointPath or category. Use it to pick the right tool or check costs before calling live tools. Free: uses no API key or units.

NameRequiredDescriptionDefault
categoryNoOne of docs, user, tweet, search, list, community, space, trends or account.
toolNameNoExact tool name, such as tweetapi_search, to return only that tool.
endpointPathNoTweetAPI endpoint path, such as /tw-v2/user/followers, to find the tool that calls it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered without the description. The description adds genuinely new context beyond them: "Free: uses no API key or units," which tells the agent there is zero cost and no credential prerequisite for calling it — a meaningful behavioural fact absent from the structured fields. It does not mention rate limits or result size, keeping it at 4 rather than 5.

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?

Three tight sentences: what it returns, how to filter, and when to use it, plus the free-cost note. Content is front-loaded with the return shape and nothing is repeated or padded.

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?

There is no output schema, but the description compensates by enumerating the returned fields, so an agent knows what to expect. With all three filters optional, zero required parameters, and cost/auth behaviour stated, nothing essential for a correct first call is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already carries its own description with a concrete example (e.g. /tw-v2/user/followers). The description's "Filter it with toolName, endpointPath or category" only restates the parameter names without adding syntax, matching rules beyond "Exact tool name," or precedence when multiple filters are combined, so the baseline 3 applies.

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 opens with a specific verb and resource ("List the tools on this server as JSON") and enumerates exactly what each entry contains — name, description, category, endpoint, estimated cost, response formats, input schema. That is a precise inventory of a catalog tool, clearly distinct from siblings like tweetapi_endpoint_lookup or tweetapi_docs_search, which operate on endpoints or docs rather than the whole tool set.

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?

"Use it to pick the right tool or check costs before calling live tools" gives a clear when-to-use context, and the filter list implies narrowing by name, path or category. It stops short of naming an exclusion or an alternative sibling (e.g. when to prefer tweetapi_endpoint_lookup for a known endpoint), so it is clear but not fully routed.

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

tweetapi_trend_locationsGet Trend LocationsA
Read-onlyIdempotent

List the locations X serves trends for: worldwide, a set of countries and many cities, each with the woeid and countryCode to pass to tweetapi_trends. Not paginated. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, open-world), and the description adds genuinely new operational context: no pagination, API-key requirement, one request per call, ~1 unit cost, and that results include a cost estimate. That is exactly the kind of cost and auth disclosure annotations cannot express.

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?

A compact burst of clauses, front-loaded with purpose and immediately followed by the downstream-usage detail and cost model. No sentence is filler; every clause carries distinct information.

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?

For a zero-parameter list endpoint with an output schema, the description covers purpose, downstream use, pagination behavior, auth, and cost. Nothing an agent needs in order to call it correctly is missing.

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?

Zero parameters, so there is no parameter semantics to explain; the description instead documents the return fields (woeid, countryCode) and their downstream use. This is the expected baseline for a no-arg tool.

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?

Starts with a specific verb and resource ('List the locations X serves trends for'), scopes it (worldwide, countries, cities), and explicitly identifies its role as the feeder for tweetapi_trends. An agent can distinguish it from the sibling trends tool without opening any schema.

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 makes the workflow clear: call this first, then pass the woeid/countryCode to tweetapi_trends. It does not state exclusions or when not to bother (e.g., if you already know the woeid), so it falls short of full when/when-not coverage.

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

tweetapi_tweet_detailsGet Tweet DetailsA
Read-onlyIdempotent

Fetch one tweet with full details, its parent tweets when it is a reply, and a page of replies. Accepts a post ID or post link. Use tweetapi_tweet_metrics for counts only, or tweetapi_tweet_details_by_ids for many tweets. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
sortByNoOrder of the replies: Relevance (default), Recency or Likes.Relevance
tweetIdYesNumeric post ID, or a post link such as https://x.com/jack/status/20.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world, but the description adds cost and auth context they cannot express: an API key is required, one request is made per call, the cost is usually 1 unit, and each result carries a cost estimate. It also discloses the pagination contract (one page per call) and the responseFormat trade-off, neither of which is inferable from the safety annotations alone.

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?

Four sentences, front-loaded with what the tool returns before routing advice and operational constraints. Every sentence carries load: payload scope, alternatives, auth/cost, pagination contract. No restatement of the title or filler.

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?

The tool is a paginated, billed, authenticated read with an output schema; the description covers all four concerns and explicitly defers return-value detail to the output schema while still naming the key cursor field. An agent has everything needed to call it correctly, page it, and budget for it.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-field meaning the schema only states locally: it ties the cursor input to the output field completeness.nextCursor, explaining the pagination loop end to end. sortBy and responseFormat semantics are left to the schema, which already documents them fully with enums and defaults.

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 opens with a specific verb and resource ('Fetch one tweet with full details') and goes further by naming the payload shape: parent tweets for replies plus a page of replies. It explicitly distinguishes itself from tweetapi_tweet_metrics (counts only) and tweetapi_tweet_details_by_ids (many tweets), so an agent can differentiate it from siblings without reading schemas.

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

Usage Guidelines5/5

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

It names two concrete alternatives with the exact condition that selects each: metrics for counts only, details_by_ids for many tweets. It also gives operational guidance for pagination ('call again with cursor set to this result's completeness.nextCursor') and for omitting the cursor on the first page, leaving nothing to inference.

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

tweetapi_tweet_details_by_idsGet Tweet Details By IDsA
Read-onlyIdempotent

Fetch details for up to 200 tweets in one call by post ID or post link. No replies are included. Missing posts are listed in completeness.notReturned. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
idsYesUp to 200 numeric post IDs or post links, as a comma-separated string or an array.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it names the exact place incomplete results surface (completeness.notReturned), states the auth requirement (TweetAPI API key), and gives request/cost behavior (one request per call, ~1 unit, per-result cost estimate). That is precisely the operational detail structured fields cannot carry.

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

Conciseness4/5

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

Four short sentences, front-loaded with the capability and limit before caveats. The only dead weight is 'Read-only.', which merely restates readOnlyHint and earns no new information for the agent.

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?

For a two-parameter read tool with an output schema and full annotations, everything an agent needs to call it correctly is present: input forms, batch ceiling, what is excluded, how partial results are reported, and the cost/auth profile.

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

Parameters3/5

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

Schema coverage is 100% and both parameters are documented there in detail, so the baseline is 3. The description only restates the ID-or-link input and the 200 cap and says nothing about the responseFormat trade-off, which the schema already explains.

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

Purpose4/5

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

States a specific verb and resource with scope: fetch details for up to 200 tweets by post ID or post link. The batching limit implicitly separates it from the singular tweetapi_tweet_details, but no sibling is named explicitly, so the differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

The batch size and 'No replies are included' exclusion imply the use case (bulk hydrate known IDs, not conversation retrieval), but the description never says when to prefer tweetapi_tweet_details or tweetapi_search, nor states prerequisites for obtaining the IDs.

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

tweetapi_tweet_hidden_repliesGet Hidden RepliesA
Read-onlyIdempotent

Fetch one page of the replies that a post's author has hidden, by post ID or post link. Hidden replies are public on X. A post without hidden replies returns an empty page. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
tweetIdYesNumeric post ID, or a post link such as https://x.com/jack/status/20.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare read-only/idempotent/non-destructive/open-world, but the description adds auth requirements (TweetAPI key), per-call cost and the presence of a cost estimate in results, one-request-per-call semantics, and the empty-page behavior. It also makes pagination state explicit, which the annotations say nothing about.

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?

A single front-loaded paragraph with no wasted clauses: purpose, public-visibility note, empty-result edge case, safety, auth/cost, then pagination. Each sentence contributes something an agent needs before calling.

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?

The tool has an output schema and rich annotations, and the description still covers the gaps those don't: credentials, cost model, one-page semantics, and the empty-result case. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3, and the description largely restates schema content (tweetId accepts a link; cursor comes from completeness.nextCursor). It adds modest value by framing the cursor as the continuation loop against the output field, but says nothing about responseFormat, which the schema documents instead.

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?

States a specific verb and resource ('Fetch one page of the replies that a post's author has hidden') plus the accepted identifier forms (post ID or post link). That is precise enough to separate it from sibling reply-oriented tools such as tweetapi_tweet_details, tweetapi_tweet_quotes, and tweetapi_user_tweets_and_replies without opening a schema.

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 scope ('hidden replies are public on X') and the empty-result condition make the intended use clear, and the pagination sentence tells the agent exactly how to continue. It stops short of naming a sibling to use for non-hidden replies, which is the main remaining gap.

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

tweetapi_tweet_metricsGet Tweet MetricsA
Read-onlyIdempotent

Fetch only the engagement counts (likes, retweets, replies, quotes, bookmarks, views) for one tweet, without the conversation. Accepts a post ID or post link. Use tweetapi_tweet_details for the full tweet. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
tweetIdYesNumeric post ID, or a post link such as https://x.com/jack/status/20.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4/5.0
Behavior3/5

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

The description repeats what annotations already declare ('Read-only', non-destructive) but does add genuinely new behavioral facts: an API key is required, one TweetAPI request is made per call, and each call usually costs 1 unit with a cost estimate returned. It does not explain what a 'unit' is or what happens on invalid/private/deleted posts, so the disclosure is useful but incomplete.

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?

Four compact sentences, front-loaded with the core action and immediately followed by the scoping constraint and the alternative tool. No filler or repetition; every clause carries information an agent can act on.

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

Completeness4/5

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

Auth, cost, request count, input flexibility, and sibling routing are all covered, and an output schema exists so return values need not be described. The only soft spot is the unexplained cost unit and no note on failure modes for deleted or protected posts.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents the single tweetId parameter including the link format (https://x.com/jack/status/20). The description's 'Accepts a post ID or post link' merely restates the schema, adding no new syntax or edge-case meaning.

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?

States a specific verb and resource ('Fetch only the engagement counts ... for one tweet') and enumerates exactly which counts are returned (likes, retweets, replies, quotes, bookmarks, views). It also scopes the tool negatively ('without the conversation'), which separates it from the heavier tweet-details siblings.

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?

Explicitly routes the agent to the alternative: 'Use tweetapi_tweet_details for the full tweet.' What is missing is guidance against the other adjacent siblings (tweetapi_tweet_quotes, tweetapi_tweet_retweets, tweetapi_tweet_hidden_replies), which also take a post ID and could be confused with this one.

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

tweetapi_tweet_quotesGet Tweet QuotesA
Read-onlyIdempotent

Fetch one page of quote posts of a post (posts that quote it), by post ID or post link. Use tweetapi_tweet_retweets for plain reposts and tweetapi_tweet_details for replies. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
tweetIdYesNumeric post ID, or a post link such as https://x.com/jack/status/20.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (which only establish read-only, idempotent, non-destructive, open-world) by disclosing the auth requirement (TweetAPI API key), the request/cost model ('one TweetAPI request per call, usually costing 1 unit'), that results carry a cost estimate, and the exact pagination mechanism. These are the operational facts an agent needs before spending quota.

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?

Four compact sentences, front-loaded with the purpose before the alternatives, then safety/cost, then pagination. No sentence restates the name or title, and each carries a distinct operational fact.

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?

For a paginated read with an output schema and rich annotations, nothing essential is missing: identity input forms, sibling routing, cost/quota implications, and the cursor loop are all covered, and return-shape explanation is rightly delegated to the output schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters, including the accepted post-ID-or-link forms and the full-vs-compact responseFormat enum. The description reinforces cursor usage by pointing at 'this result's completeness.nextCursor,' which is mild added value, but it says nothing about responseFormat or the compact field-dropping tradeoff. Baseline 3 is appropriate.

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?

States a specific verb and resource — 'Fetch one page of quote posts of a post (posts that quote it), by post ID or post link' — and immediately disambiguates from the two nearest siblings that return adjacent relationship types. An agent can distinguish this from retweets and details without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'Use tweetapi_tweet_retweets for plain reposts and tweetapi_tweet_details for replies,' which names the alternatives and the condition selecting each. It also gives the continuation condition — call again with the cursor when the page is exhausted.

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

tweetapi_tweet_retweetsGet Tweet RetweetsA
Read-onlyIdempotent

Fetch one page of the accounts that reposted a post, by post ID or post link. Use tweetapi_tweet_quotes for quote posts. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
tweetIdYesNumeric post ID, or a post link such as https://x.com/jack/status/20.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly/idempotent/non-destructive) by disclosing the API-key requirement, that each call makes exactly one TweetAPI request and usually costs about 1 unit, that results carry a cost estimate, and that responses are single pages requiring cursor chaining. That is exactly the operational context an agent needs before calling.

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?

Four tight sentences, front-loaded with the action and scope, then the sibling disambiguation, then cost/auth constraints, then pagination. Every sentence carries distinct, useful information with no repetition.

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?

Return values are covered by the existing output schema, so the description need only handle purpose, prerequisites, cost, and pagination — all of which it does. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters are already documented in the schema, including the cursor's origin and the full/compact responseFormat trade-off. The description reinforces cursor usage but adds no new syntax or format detail, so the baseline of 3 applies.

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?

States a specific verb and resource ('Fetch one page of the accounts that reposted a post'), plus accepted input forms (post ID or post link) and page scope. It is clearly distinguishable from the quote-post sibling, which it names explicitly.

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

Usage Guidelines5/5

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

Names the alternative to use for quote posts (tweetapi_tweet_quotes) and the condition that selects it, and states the pagination procedure: call again with cursor set to completeness.nextCursor. There is no ambiguity about which tool handles reposts versus quotes.

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

tweetapi_tweet_translateTranslate TweetA
Read-onlyIdempotent

Translate one post's text into another language with X's translation, by post ID or post link. The post itself is not changed. Use tweetapi_tweet_details to read the original post and its replies. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
dstLangYesLanguage code to translate into, such as en, es, fr, ja or zh-CN.
tweetIdYesNumeric post ID, or a post link such as https://x.com/jack/status/20.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that the post is unchanged, that an API key is required, that each call makes exactly one request costing roughly 1 unit, and that results carry a cost estimate. Annotations already cover readOnly/idempotent safety, so this is pure added value about cost and auth.

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?

Four short sentences, front-loaded with the action and identifier forms, then side effects, then cost. No sentence is redundant with the schema or annotations in a wasteful way.

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?

For a two-parameter, read-only, single-request tool with an output schema and full annotation coverage, the description covers everything the agent needs: what it does, how to identify the target, that nothing is mutated, and the cost model.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented there, so the baseline is 3. The description only restates the identifier forms ('post ID or post link') that the tweetId schema already documents and adds nothing about dstLang code conventions.

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?

States a specific verb and resource ('Translate one post's text into another language') plus the accepted identifier forms, scoping it to a single post. This clearly separates it from sibling readers like tweetapi_tweet_details or tweetapi_search, which do not translate.

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?

Gives clear context (translate one post's text; use tweetapi_tweet_details to read the original and its replies), which implicitly routes the agent correctly. It stops short of explicit exclusions, e.g. it never says what to do for multi-post translation or that no bulk variant exists.

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

tweetapi_user_about_accountGet User Account SummaryA
Read-onlyIdempotent

Fetch the About this account details for a username, @handle, or profile link: location, verification, username history, affiliates and how the account was created. Use tweetapi_user_by_username for the regular profile. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
usernameYesUsername, @handle, or profile link such as https://x.com/jack.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world, and non-destructive, so the safety profile is covered. The description adds real value beyond that: it requires a TweetAPI API key, issues exactly one request per call, usually costs 1 unit, and returns a per-call cost estimate. It stops short of describing pagination or failure behavior, keeping it below a 5.

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?

Three tight sentences: purpose and payload first, sibling routing second, operational constraints last. Every clause carries information (fields returned, alternative tool, auth, cost) with no filler.

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?

For a single-optionality-free parameter read tool with a full output schema, the description covers everything an agent needs to select and invoke it: what it returns, how to identify the target, what it costs, and which sibling to use instead. Return-value details are correctly left to the output schema.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents that the username field accepts a plain username, an @handle, or a profile link such as https://x.com/jack. The description restates the same three forms without adding format rules or edge cases, so the schema is doing the heavy lifting — the baseline 3 applies.

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?

States a specific verb ("Fetch") and a specific resource ("About this account details") and enumerates the contents (location, verification, username history, affiliates, creation method). It explicitly distinguishes itself from the regular profile tool tweetapi_user_by_username, so the agent can differentiate it from siblings without opening a schema.

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

Usage Guidelines5/5

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

The description names an alternative (tweetapi_user_by_username) and the condition that selects it ("for the regular profile"), making the use/use-not boundary explicit. The accepted identifier forms (username, @handle, profile link) further clarify the calling context.

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

tweetapi_user_affiliatesGet User AffiliatesA
Read-onlyIdempotent

Fetch one page of the accounts affiliated with a business profile, as on its Affiliates tab. Returns X's default affiliate group only; a profile with no affiliates returns an empty list. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (which already declare readOnly/idempotent/non-destructive), the description discloses authentication requirements, per-call cost behavior (usually 1 unit, cost estimate in each result), pagination contract, and empty-result semantics. That is exactly the operational context annotations cannot express.

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

Conciseness4/5

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

Front-loaded with the purpose, then cost, then pagination — a sensible order with no filler sentences. 'Read-only.' duplicates the readOnlyHint annotation and could be dropped, but the overall length is proportionate to the tool's behavior.

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?

With an output schema present and rich annotations, the description still supplies the pieces an agent needs to call it correctly: auth, cost, single-page paging mechanics, and empty-list behavior. Nothing material is missing for a paginated read endpoint.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters are fully documented in the schema, including the cursor/nextCursor loop and the responseFormat enum trade-off. The description's pagination sentence restates the cursor parameter's schema text rather than adding new meaning, so baseline 3 applies.

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?

States a specific verb and resource — 'Fetch one page of the accounts affiliated with a business profile' — and anchors it to a recognizable surface ('as on its Affiliates tab'). No sibling tool covers affiliates, so an agent can route here unambiguously.

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?

Gives clear usage context: default affiliate group only, empty list for profiles with none, and an explicit instruction for retrieving subsequent pages. It stops short of naming an alternative tool or stating exclusions (e.g., that non-business profiles aren't applicable), and the username-vs-userId routing advice lives only in the schema.

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

tweetapi_user_articlesGet User ArticlesA
Read-onlyIdempotent

Fetch one page of the posts that published a user's X Articles, with each Article's title and preview text. The full Article text is not included: pass the post ID to tweetapi_tweet_details to read it. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare read-only and idempotent, but the description adds real operational context beyond them: TweetAPI API key requirement, one request per call costing roughly 1 unit, and a per-result cost estimate. It does not cover error or rate-limit behavior, but for a paged read tool this is substantial added disclosure.

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?

Five short sentences, each carrying distinct information: scope, exclusion, auth and cost, and pagination. Key constraints are front-loaded and nothing is repeated.

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

Completeness4/5

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

Given an output schema exists, return-shape explanation is unnecessary, and the description covers scope, paging, cost, and prerequisites. A small gap remains around ordering or page-size behavior, but an agent has what it needs to call it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so cursor, userId, and responseFormat are already documented in the schema, including the username-lookup guidance. The description's cursor sentence largely restates the schema and adds no new format or constraint detail, so baseline 3 applies.

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?

States a specific verb and resource: 'Fetch one page of the posts that published a user's X Articles,' plus the exact payload (title and preview text). This clearly separates it from sibling listing tools like tweetapi_user_tweets.

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

Usage Guidelines5/5

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

Explicitly states a limitation ('full Article text is not included') and routes the agent to tweetapi_tweet_details with the post ID for the full text. Continuation is spelled out ('to get the next one, call again with cursor set to this result's completeness.nextCursor').

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

tweetapi_user_by_idGet User By IDA
Read-onlyIdempotent

Fetch one public user profile by numeric user ID. For several users at once, use tweetapi_user_by_ids. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered; the description still adds real context beyond them: API-key requirement, one request per call, ~1 unit cost, and a per-result cost estimate. What it leaves out (pagination, error behavior) is secondary for a single-record lookup.

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?

Three short sentences, front-loaded with the operation and its scope, then the alternative, then the operational constraints. No redundancy or filler.

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?

An output schema exists, so return values need no explanation, and the description covers the remaining caller concerns: auth, request volume, cost, and where the cost estimate appears. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both userId and responseFormat are already documented in the schema, including the username fallback and the full/compact trade-off. The description adds no further parameter detail, which is the expected baseline when the schema does the work.

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?

States a specific verb and resource ('Fetch one public user profile by numeric user ID') and immediately distinguishes itself from the batch sibling tweetapi_user_by_ids, so an agent can pick the right tool without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes the multi-user case to tweetapi_user_by_ids, and the schema plus description together make clear that username lookups need tweetapi_user_by_username. The when-to-use condition is stated rather than implied.

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

tweetapi_user_by_idsGet Users By IDsA
Read-onlyIdempotent

Fetch up to 100 public user profiles in one call by numeric user ID. Missing accounts are listed in completeness.notReturned. Use tweetapi_user_by_usernames when you have usernames. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
userIdsYesComma-separated string or array of up to 100 numeric user IDs.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world), and the description goes well beyond them: it discloses the API key requirement, one request per call, an approximate cost of 1 unit, and that per-result cost estimates are returned. It also explains the partial-failure behavior via completeness.notReturned, which is exactly the kind of behavioral detail an agent cannot infer from structured fields.

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

Conciseness4/5

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

Four tight sentences: purpose and limit first, then the partial-result note, then the sibling routing, then operational constraints. Every sentence carries information, though the cost clause is slightly dense and could be split for faster scanning.

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

Completeness4/5

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

An output schema exists, so return-shape explanation is not owed, and the description still adds auth, cost, and partial-result semantics for a batched read tool. The only real gap is guidance on when to choose responseFormat=compact, which is left entirely to the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so both userIds and responseFormat are already documented in the schema, including the enum semantics and the 100-item cap. The description's 'up to 100 ... numeric user ID' restates schema content and says nothing about responseFormat, so the baseline 3 applies.

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?

States a specific verb and resource ('Fetch ... public user profiles ... by numeric user ID') plus a concrete scope cap of 100 per call. That distinguishes it clearly from the single-record sibling tweetapi_user_by_id and from the username-based siblings.

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?

Explicitly routes username-based lookups to tweetapi_user_by_usernames, which is the most likely confusion point in a family with ~45 user tools. It stops short of saying when not to use it or contrasting with the singular tweetapi_user_by_id, so it is strong rather than exhaustive guidance.

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

tweetapi_user_by_usernameGet User By UsernameA
Read-onlyIdempotent

Fetch one public user profile by username, @handle, or profile link. For several users at once, use tweetapi_user_by_usernames. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
usernameYesUsername, @handle, or profile link such as https://x.com/jack.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered; the description adds genuinely new operational facts — an API key is required, each call is one TweetAPI request costing roughly 1 unit, and the result carries a cost estimate. It stops short of describing failure modes or rate limiting, so it is strong but not exhaustive.

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

Conciseness4/5

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

Four short sentences, front-loaded with the purpose before the alternative and cost details, with no filler. The only redundancy is "Read-only," which merely restates readOnlyHint from the annotations.

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?

For a two-parameter read tool with full schema coverage, an output schema, and rich annotations, the description covers purpose, the sibling alternative, auth, and cost. Nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented, including the username formats and the full/compact enum behavior with fieldsOmitted. The description only restates the identifier forms and adds no syntax or constraint detail beyond the schema, so the baseline 3 applies.

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?

States a specific verb and resource ("Fetch one public user profile") plus the accepted identifier forms, and explicitly names the sibling tweetapi_user_by_usernames as the many-users variant. An agent can distinguish this from user_by_id, user_by_ids and user_by_usernames from the description alone.

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

Usage Guidelines5/5

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

Gives a concrete routing rule: use this tool for a single user, switch to tweetapi_user_by_usernames for several at once. That is an explicit alternative with the condition that selects it, which is the strongest form of guidance short of listing exclusions.

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

tweetapi_user_by_usernamesGet Users By UsernamesA
Read-onlyIdempotent

Fetch up to 100 public user profiles in one call by username, @handle, or profile link. Missing accounts are listed in completeness.notReturned. Use tweetapi_user_by_ids when you have numeric IDs. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
usernamesYesUp to 100 usernames, @handles, or profile links, as a comma-separated string or an array.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world, and the description adds real operational context beyond them: API key requirement, one request per call, roughly 1 unit of cost with a per-result cost estimate, and the fact that unresolved accounts surface in completeness.notReturned rather than erroring. That is exactly the added-value layer annotations cannot express.

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?

Four tight sentences in a single paragraph: capability and limit first, failure behavior second, sibling routing third, cost/auth last. No filler and nothing buried.

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?

With annotations, a fully described input schema, and an output schema, the remaining unknowns for an agent are cost, auth, partial-failure behavior, and batching limits — all of which the description covers. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented; the description's mention of usernames/@handles/profile links and the 100-item cap largely restates the schema. responseFormat is left entirely to the schema, so no extra semantic value is contributed here.

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?

States a specific verb and resource ('Fetch up to 100 public user profiles') plus the accepted identifier forms (username, @handle, profile link). It also names the sibling to use instead for numeric IDs, so an agent can distinguish it from the many other user tools without opening a schema.

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?

Gives an explicit alternative rule ('Use tweetapi_user_by_ids when you have numeric IDs') and a hard batching limit of 100. It does not address when to prefer the singular tweetapi_user_by_username sibling, which is the closest neighbor in the catalog, so the routing guidance is strong but not exhaustive.

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

tweetapi_user_check_followCheck Follow RelationshipA
Read-onlyIdempotent

Check the follow relationship between two accounts by numeric user ID: following says whether the first follows the second, and followedBy whether the second follows back. Use tweetapi_user_by_username first if you only have usernames. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
targetIdYesNumeric user ID of the account that may be followed.
subjectIdYesNumeric user ID of the account that may be the follower.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, and the description corroborates rather than repeats them by adding operational facts the annotations cannot carry: an API key is required, it makes one request per call at roughly 1 unit cost, and the response includes a cost estimate. Only the exact failure behavior (e.g. what happens for a nonexistent or protected account) is left unstated.

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?

Three compact sentences, front-loaded with the core action and output semantics, then the username fallback, then the cost/auth note. Every sentence adds distinct information with no restatement of the name or title.

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?

An output schema exists so return values need not be detailed, yet the description still describes both result fields and their direction. Combined with the auth, cost, and prerequisite guidance, an agent has everything needed to invoke this two-parameter tool correctly.

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?

Schema coverage is 100% and the schema already describes subjectId as the potential follower and targetId as the potentially followed account. The description reinforces the ordering semantics ('the first follows the second', 'the second follows back'), which removes any lingering ambiguity about which returned field maps to which argument.

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?

States a specific verb and resource ('Check the follow relationship between two accounts by numeric user ID') and additionally defines both output fields, following and followedBy, so the direction of the relationship is unambiguous. This clearly distinguishes it from siblings like tweetapi_user_followers_ids or tweetapi_user_following_list, which enumerate relationships rather than test a single pair.

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?

Gives an explicit routing rule: 'Use tweetapi_user_by_username first if you only have usernames,' which covers the most likely precondition failure. It stops short of excluding alternatives such as the followers/following list tools for bulk checks, so it falls short of a full when/when-not statement.

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

tweetapi_user_followers_idsGet Follower IDsA
Read-onlyIdempotent

Fetch one page of follower user IDs (strings only, no profiles) for a user ID. Cheapest way to walk a large follower graph. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
countNoPage size from 1 to 500. Omit it for the default.
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4/5.0
Behavior3/5

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

The 'Read-only' claim is consistent with readOnlyHint=true and destructiveHint=false, so no contradiction. Beyond the annotations it adds real context: API key required, one request per call, roughly 1 unit of cost with a cost estimate in each result, and a page-by-page continuation model. That is useful, but return-shape detail is largely delegated to the output schema.

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?

Four short sentences with no filler: what it returns, why to pick it, cost/auth profile, and how to paginate. The payload constraint and the cheapness claim are front-loaded where an agent will read them first.

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?

For a three-parameter paginated read with a full output schema, everything an agent needs is present: auth requirement, cost model, single-request semantics, and the next-page procedure. Return values correctly are not duplicated in prose because the output schema covers them.

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?

Schema coverage is 100%, so the baseline is 3, and the description adds the paging contract by tying the input cursor to this result's completeness.nextCursor, making the loop explicit. It says nothing about the count ceiling or the username-lookup prerequisite, both of which live only in the schema.

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

Purpose4/5

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

States a concrete verb and resource (fetch follower user IDs for a user ID) and immediately delimits the payload as 'strings only, no profiles', which separates it from the profile-returning followers siblings. It does not name any sibling tool explicitly, so the differentiation is inferential rather than stated.

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?

'Cheapest way to walk a large follower graph' gives a clear selection criterion and the pagination instruction explains the continuation loop. It stops short of an explicit exclusion such as 'use tweetapi_user_followers_list when you need profiles', leaving the agent to infer the alternative from what is absent.

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

tweetapi_user_followers_listGet Followers ListA
Read-onlyIdempotent

Fetch one page of follower profiles for a user ID, with an optional count to set the page size. Use tweetapi_user_followers_ids when you only need IDs. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
countNoPage size from 1 to 500. Omit it for the default.
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent, and the description adds genuinely new behavioral context: API key requirement, one TweetAPI request per call, ~1 unit cost with a per-result cost estimate, and pagination via completeness.nextCursor. This is exactly the extra context annotations cannot carry.

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?

Four short sentences, each front-loaded with the core action first, then the alternative, then cost/auth, then pagination. No filler and nothing buried.

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?

An output schema exists, so return shape is not the description's burden; with pagination, cost, and auth covered, an agent has everything needed to call this correctly on the first try.

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

Parameters3/5

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

Schema coverage is 100%, so count, cursor, userId, and responseFormat are all documented in the schema itself. The description reinforces count as page size and explains the cursor loop, but adds no format or constraint detail beyond what the schema already provides.

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

Purpose4/5

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

States a specific verb and resource with scope: 'Fetch one page of follower profiles for a user ID.' It explicitly contrasts with tweetapi_user_followers_ids, though it does not differentiate from other follower-listing siblings such as tweetapi_user_followers_v2 or tweetapi_list_followers, leaving a small ambiguity.

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?

Names the alternative (followers_ids) and its selection condition ('when you only need IDs'), and the schema further routes username-holders to user_by_username first. There is no guidance on when to prefer the v2 or list_followers variants, but the primary use case is clear.

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

tweetapi_user_followers_v2Get User FollowersA
Read-onlyIdempotent

Fetch one page of follower profiles for a user ID, at the default page size. Use tweetapi_user_followers_list to set the page size with count, or tweetapi_user_followers_ids for IDs only. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description earns credit for adding what they cannot: API-key requirement, one request per call, ~1 unit cost with a per-result cost estimate, and the cursor-based pagination contract via completeness.nextCursor. Minor redundancy in restating "Read-only," which the annotations already declare.

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

Conciseness4/5

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

Front-loaded with purpose, then alternatives, then cost/behavior, then pagination — a logical progression with almost no filler. Slightly dense in the cost sentence and the redundant "Read-only" clause keep it from a 5.

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?

For a 3-parameter read tool with a full output schema and complete annotation coverage, everything an agent needs to call it correctly is present: identity input constraint, pagination loop, cost expectation, and sibling routing. Return-value detail is correctly deferred to the output schema.

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?

Schema coverage is 100%, so baseline is 3; the description still adds meaning by explaining that this variant fixes the page size (no count parameter exists here) and by spelling out the cursor round-trip using completeness.nextCursor from the prior result. This goes beyond the schema's per-field text.

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?

"Fetch one page of follower profiles for a user ID, at the default page size" states a specific verb, resource, and scope, and immediately contrasts itself with tweetapi_user_followers_list and tweetapi_user_followers_ids. An agent can distinguish this from the many other user_* siblings without opening a schema.

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

Usage Guidelines5/5

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

Names two concrete alternatives and the exact condition that selects each (page-size control via count, IDs-only output). Combined with the schema's note about tweetapi_user_by_username for username inputs, the when-to-use and when-not-to-use routing is fully covered.

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

tweetapi_user_following_idsGet Following IDsA
Read-onlyIdempotent

Fetch one page of user IDs (strings only, no profiles) that a user ID follows. Cheapest way to walk a large following graph. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
countNoPage size from 1 to 500. Omit it for the default.
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, yet the description still adds real value: API key requirement, one TweetAPI request per call, roughly 1 unit of cost, and a cost estimate in each response. It does not mention rate limits or throttling behavior, so it is strong but not complete on the operational side.

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?

Four tight sentences, front-loaded with what is returned and the cheapest-use case, then cost, then pagination. No redundant restatement of the name or title; every clause carries a distinct fact.

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?

For a paginated, cost-metered read tool with an output schema, the description covers the payload shape, cost model, auth need, and the exact continuation loop. Nothing an agent needs in order to call it correctly and iterate pages is missing.

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?

Schema coverage is 100%, so the baseline would be 3, but the description goes beyond the schema by tying the cursor parameter to a specific output field ('this result's completeness.nextCursor'), which tells the agent where the next value comes from. The count parameter is left to the schema, which is acceptable at full coverage.

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?

States a specific verb and resource — fetch one page of user IDs that a given user ID follows — and immediately scopes the payload as 'strings only, no profiles', which is exactly what separates it from the profile-returning following-list siblings. An agent can pick this tool without opening the schema.

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?

Gives a clear selection cue ('cheapest way to walk a large following graph') and a concrete pagination procedure, plus the schema note routing username-only callers to tweetapi_user_by_username. It stops short of naming the alternative explicitly (e.g. 'use tweetapi_user_following_list when you need profiles'), so the when-not guidance is implied rather than stated.

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

tweetapi_user_following_listGet Following ListA
Read-onlyIdempotent

Fetch one page of profiles a user ID follows, with an optional count to set the page size. Use tweetapi_user_following_ids when you only need IDs. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
countNoPage size from 1 to 500. Omit it for the default.
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds non-obvious operational context: requires a TweetAPI API key, one request per call, roughly 1 unit cost, and a cost estimate embedded in each result. It also discloses pagination semantics tied to completeness.nextCursor, which is behavior an agent cannot infer from annotations alone.

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

Conciseness4/5

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

Front-loads what the tool returns, then alternatives, then cost/auth, then pagination – a sensible order with no filler. The 'optional count to set the page size' clause mildly duplicates the schema's own parameter description but is minor.

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?

For a four-parameter paginated read with an output schema present, the description covers selection, cost, auth, and page continuation. Return-value detail is rightly delegated to the output schema, so nothing an agent needs before calling is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description restates the count-as-page-size and cursor-continuation meanings already documented in the schema, adding no syntax or format detail beyond it.

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?

States a specific verb and resource ('Fetch one page of profiles a user ID follows') and immediately scopes it as paginated profile data rather than IDs. It explicitly names the sibling tweetapi_user_following_ids as the IDs-only variant, so an agent can route correctly without opening schemas.

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?

Gives an explicit alternative-selection rule ('Use tweetapi_user_following_ids when you only need IDs') plus continuation instructions for the next page. It stops short of explaining when to prefer the other close sibling, tweetapi_user_following_v2, and offers no exclusion guidance.

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

tweetapi_user_following_v2Get User FollowingA
Read-onlyIdempotent

Fetch one page of profiles a user ID follows, at the default page size. Use tweetapi_user_following_list to set the page size with count, or tweetapi_user_following_ids for IDs only. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, yet the description still adds material facts: an API key is required, each call is one TweetAPI request costing roughly 1 unit with a per-result cost estimate, and results are paginated. It also closes the pagination loop by naming completeness.nextCursor as the next cursor argument.

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?

Four tight sentences ordered as purpose, alternatives, cost/auth behavior, then pagination mechanics. Nothing is repeated from the name or title and no sentence is filler.

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?

With an output schema available there is no need to describe return values, and the description instead covers what the schema cannot: auth, cost, page-size limitation, and the cursor continuation loop. Everything an agent needs to call this correctly and paginate is present.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds the non-obvious constraint that page size cannot be set here (unlike the sibling list tool) and ties the cursor parameter to a concrete field in the prior result. It does not expand on responseFormat beyond what the schema already states.

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 opening sentence pairs a specific verb (fetch) with a specific resource (one page of profiles a user ID follows) and pins the scope at 'default page size.' It explicitly separates itself from tweetapi_user_following_list and tweetapi_user_following_ids, so an agent can route between the three followers/following variants without opening any schema.

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

Usage Guidelines5/5

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

It names both alternatives and the exact condition that selects each: use user_following_list when you need count-based page sizing, and user_following_ids when only IDs are needed. That covers the realistic decision points for this family of tools.

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

tweetapi_user_highlightsGet User HighlightsA
Read-onlyIdempotent

Fetch one page of the posts a user has added to the Highlights tab of their profile. Highlights are an X Premium feature, so most accounts return an empty page. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new operational facts: API key requirement, one TweetAPI request per call at roughly 1 unit, and a per-result cost estimate. It also flags the high-probability empty-result case, which prevents an agent from misreading an empty page as a failure.

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?

Front-loaded with what is fetched, then the empty-page caveat, then auth/cost, then pagination. Every sentence contributes an actionable fact and none restates the tool title.

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?

With an output schema present, return values need not be described, and the description covers the remaining unknowns: cost model, credential requirement, pagination protocol, and the common empty-result outcome. Nothing an agent needs to invoke this correctly is missing.

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?

Schema coverage is 100%, so the baseline is 3, and the description goes further by spelling out the cursor round-trip ('call again with cursor set to this result's completeness.nextCursor'). The responseFormat and userId semantics are left entirely to the schema, which is acceptable given its completeness.

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?

States a specific verb and resource with scope: 'Fetch one page of the posts a user has added to the Highlights tab of their profile.' This is clearly distinguishable from siblings like tweetapi_user_tweets or tweetapi_user_photos, and 'one page' sets the retrieval boundary up front.

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?

Gives strong context for expectations (Highlights is an X Premium feature, so most accounts return an empty page) and explains the continuation loop via completeness.nextCursor. It does not explicitly name a sibling to use instead when Highlights is empty — e.g., tweetapi_user_tweets — so the alternative routing is left implicit.

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

tweetapi_user_list_membershipsGet User List MembershipsA
Read-onlyIdempotent

Fetch one page of the Lists a user has been added to as a member (the Member of view on x.com). They can be owned by any account, so check owner on each List; Private Lists are included and mode says which. For the user's own Lists tab, use tweetapi_user_lists. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.4/5.0
Behavior4/5

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

Goes well past the annotations by disclosing auth needs (TweetAPI API key), request/cost profile (one request, ~1 unit, cost estimate in each result), and pagination mechanics (one page per call, resume via completeness.nextCursor). It also notes Private Lists are included with a mode field, which is real behavioral context. The only slight redundancy is restating 'Read-only', which readOnlyHint already covers.

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

Conciseness4/5

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

Front-loaded with purpose, then usage split, then cost/auth, then pagination — a sensible ordering with almost no wasted wording. It is a single dense paragraph, though, so a few clauses (the 'Read-only' restatement) could be trimmed.

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 a read-only, single-page list endpoint with an output schema, the description covers everything an agent needs: how to identify the right view, how to resume pagination, what a call costs, and what auth is required. Nothing essential is missing.

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

Parameters3/5

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

Schema coverage is 100%, so cursor, userId, and responseFormat are already documented in the schema. The description reinforces the cursor contract by tying it to completeness.nextCursor, but adds no syntax or format detail the schema lacks, so the baseline 3 applies.

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?

States a specific verb and resource plus scope: 'Fetch one page of the Lists a user has been added to as a member', and anchors it to the concrete UI surface ('the Member of view on x.com'). It immediately distinguishes itself from the nearest sibling by naming tweetapi_user_lists for the opposite view.

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

Usage Guidelines5/5

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

Gives explicit routing: use this for Lists the user was added to, use tweetapi_user_lists for the user's own Lists tab. It also pre-empts a common mistake by telling the agent that owners can be any account and must be checked per List.

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

tweetapi_user_listsGet User ListsA
Read-onlyIdempotent

Fetch one page of the Lists shown on a user's Lists tab. X can include Lists owned by other accounts, so check owner on each List; Private Lists are included and mode says which. For Lists other accounts added this user to, use tweetapi_user_list_memberships. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, it discloses that private Lists are included and flagged by a mode field, that ownership must be verified because X surfaces Lists owned by other accounts, that each call costs roughly 1 unit with a cost estimate in the result, and that an API key is required. That is materially more than the annotations provide.

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?

Purpose comes first, then the sibling exclusion, then safety/auth/cost, then pagination — a deliberate order with no filler. Every clause carries information an agent needs to call the tool correctly.

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?

With an output schema present, the description need not explain return values, and it covers the remaining gaps: auth, cost model, private-List visibility, ownership caveat, and how to page. Nothing essential to a correct first call is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already documented in the schema, including the cursor provenance and the full/compact trade-off. The description restates the pagination mechanics (cursor set to completeness.nextCursor) rather than adding new semantics, so the baseline of 3 applies.

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 opens with a specific verb and resource plus scope: 'Fetch one page of the Lists shown on a user's Lists tab.' It immediately disambiguates the adjacent resource by noting that memberships (Lists other accounts added this user to) live in a different tool, so an agent can separate this from tweetapi_user_list_memberships without reading schemas.

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?

It names a concrete alternative (tweetapi_user_list_memberships) with the condition that selects it, and the userId parameter steers agents to tweetapi_user_by_username when only a handle is available. It stops short of distinguishing this from list-oriented siblings such as tweetapi_list_search or tweetapi_list_details, leaving some selection ambiguity.

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

tweetapi_user_photosGet User PhotosA
Read-onlyIdempotent

Fetch one page of a user's posts that contain photos, as on the Photos tab of their profile. Videos are a separate feed: use tweetapi_user_videos. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations (readOnly/idempotent/openWorld), it discloses the auth requirement (TweetAPI API key), the cost model (one request per call, usually 1 unit, with a per-result cost estimate), and pagination behavior. 'Read-only' merely restates the annotation, and it says nothing about error or rate-limit behavior, so it stops just short of full transparency.

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?

Four tight sentences, front-loaded with the purpose, then the sibling exclusion, then cost/prerequisites, then pagination. Nothing is redundant with the schema and no sentence is wasted.

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?

With an output schema present, return values need not be explained, and the description still covers the decisions an agent must make: which sibling to use, whether auth is needed, what a call costs, and how to continue paging.

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

Parameters3/5

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

Schema coverage is 100%, so cursor, userId, and responseFormat are already fully documented in the schema. The description only restates the cursor continuation semantics and adds no new meaning about userId resolution or the full/compact tradeoff, so the baseline 3 applies.

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?

States a specific verb and resource ('Fetch one page of a user's posts that contain photos') plus a concrete mental model ('as on the Photos tab of their profile'). It immediately carves out the boundary against the nearest sibling by naming tweetapi_user_videos for video content.

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

Usage Guidelines5/5

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

Gives an explicit routing rule: videos are a separate feed, use tweetapi_user_videos. It also gives the continuation rule ('call again with cursor set to this result's completeness.nextCursor'), which tells the agent exactly how to page rather than guessing.

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

tweetapi_user_similar_accountsGet Similar AccountsA
Read-onlyIdempotent

Fetch the accounts X lists as similar to a user. Returns a single page with no cursor. X often lists none, and an empty result is still billed. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate.

NameRequiredDescriptionDefault
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the read-only annotation, it discloses what matters operationally: no pagination, frequent empty results, billing even when empty, one request per call, ~1 unit cost, API-key requirement, and a cost estimate per result. That is exactly the kind of context annotations do not carry.

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

Conciseness4/5

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

Four compact sentences, front-loaded with the core action and followed by scoping and cost facts; nothing is padded. 'Read-only' slightly restates the readOnlyHint annotation, a minor redundancy but not enough to undermine the tight structure.

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

Completeness4/5

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

For a two-parameter, single-page read tool with an output schema, the description covers the operational facts an agent would otherwise get wrong: result volume, empty results, and billing. It needn't explain return values, but it could say more about what the result list looks like or how userId failure is signaled.

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

Parameters3/5

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

Schema coverage is 100%, so both userId (numeric pattern and follow-up call for usernames) and responseFormat are already fully documented in the schema. The description adds no parameter-level meaning beyond that baseline, which fits the 3 baseline.

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 uses a specific verb and resource: it fetches the accounts X lists as similar to a user, a resource no sibling tool covers. An agent can distinguish it from user_followers_list, user_affiliates, or user_lists without opening the schema, even though no sibling is named explicitly.

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?

It supplies concrete context an agent needs before calling: a single page with no cursor, results are often empty, and an empty result is still billed. It stops short of naming alternatives or when not to use this tool, so it lacks the explicit routing that a 5 would require.

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

tweetapi_user_subscriptionsGet User SubscriptionsA
Read-onlyIdempotent

Fetch one page of accounts a user ID pays to subscribe to (Premium creator subscriptions and Super Follows). This is not the following list. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, openWorld, non-destructive), the description discloses the auth requirement (TweetAPI API key), the request cost model (one request per call, usually 1 unit, with a per-result cost estimate), and the page-scoped return shape. These are exactly the operational traits an agent needs and are not derivable from the annotations.

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

Conciseness4/5

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

The definition is dense but front-loaded: identity of the resource first, then the sibling disambiguation, then cost and pagination. A few clauses are packed into one long sentence, which slightly reduces scannability, but virtually every clause carries information an agent would otherwise have to guess.

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?

For a paged, read-only, metered endpoint, the description covers the essentials: what is returned per page, how to continue, what it costs, and what auth is needed. With an output schema present and full schema coverage, the description does not need to enumerate return fields, and it correctly does not.

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?

Schema description coverage is already 100%, so the baseline is 3, but the description adds real meaning by explaining the cursor round-trip ('call again with cursor set to this result's completeness.nextCursor'), which links the input parameter to a specific output field. The username-lookup fallback is left to the schema rather than repeated here, which is appropriate.

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 states a specific verb and resource — fetching one page of accounts a user ID pays to subscribe to — and qualifies it with the concrete subscription types (Premium creator subscriptions, Super Follows). It explicitly distinguishes itself from the nearest siblings by stating 'This is not the following list,' so an agent can separate it from tweetapi_user_following_list and tweetapi_user_following_ids without opening schemas.

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?

Clear routing guidance is present: the negation of the following list tells the agent when not to use this tool, and the description explains that pagination continues by re-calling with the previous result's completeness.nextCursor. The only gap is that it doesn't name the specific sibling tool to use instead when the agent actually wants following data, leaving the agent to infer tweetapi_user_following_list.

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

tweetapi_user_tweetsGet User TweetsA
Read-onlyIdempotent

Fetch one page of a user's original tweets, without replies. Use tweetapi_user_tweets_and_replies to include replies. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description still adds real context beyond them: an API key is required, each call makes exactly one TweetAPI request usually costing 1 unit, and results carry a cost estimate. It also discloses the page-at-a-time return shape, which annotations cannot express.

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?

Four tight sentences, front-loaded with purpose and scope, then alternative, then cost/auth, then pagination. No filler and nothing repeated from the schema verbatim.

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?

For a paginated, metered read tool this covers everything an agent needs to decide and invoke: scope, sibling alternative, auth, cost model, and the pagination loop. Return-value detail is legitimately omitted because an output schema exists.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds the cross-field relationship the schema cannot: the cursor value comes from the prior result's completeness.nextCursor. It doesn't elaborate on userId format or responseFormat trade-offs, but those are fully covered in the schema.

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?

"Fetch one page of a user's original tweets, without replies" names the verb, the resource, and the scope exclusion in one clause. It also names the exact sibling that covers the adjacent case, so an agent can distinguish it from tweetapi_user_tweets_and_replies without opening either schema.

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

Usage Guidelines5/5

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

Explicit routing: use this tool for original tweets, use tweetapi_user_tweets_and_replies to include replies. Pagination guidance is also actionable ("to get the next one, call again with cursor set to this result's completeness.nextCursor"), leaving no inference needed.

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

tweetapi_user_tweets_and_repliesGet User Tweets And RepliesA
Read-onlyIdempotent

Fetch one page of a user's posts including their replies, as on the Replies tab of their profile. Use tweetapi_user_tweets for original posts without replies. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well past the annotations by disclosing the auth requirement (TweetAPI API key), the cost model (one request per call, usually 1 unit, with a per-result cost estimate), and the pagination contract including the exact next-cursor field. The annotations already cover safety and idempotency, so this is genuinely additive context about billing and paging behavior.

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?

Four tight sentences, front-loaded with what the tool returns and immediately followed by the disambiguating alternative. Every sentence carries distinct information: scope, sibling routing, cost, and pagination — no filler or restatement of the title.

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?

With an output schema present, the description needn't explain return shapes, and it still flags that each result carries a cost estimate and a completeness.nextCursor. Auth, billing, paging, and sibling disambiguation are all covered, leaving nothing an agent needs before calling it.

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

Parameters3/5

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

Schema description coverage is 100% and both the cursor and userId semantics (numeric-only, no username lookup) are already documented in the schema. The description restates the cursor round-trip rather than adding new parameter-level detail such as how responseFormat affects fields; baseline 3 applies when the schema does the heavy lifting.

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?

States a specific verb and resource ("Fetch one page of a user's posts including their replies") plus a concrete mental model ("as on the Replies tab of their profile") that makes the scope unambiguous. It then names the sibling it is not (tweetapi_user_tweets for original posts only), so an agent can choose between the two without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes to the alternative: use tweetapi_user_tweets for original posts without replies, implying this tool is for posts-plus-replies. The schema description further routes username-only callers to tweetapi_user_by_username first, so the prerequisite and exclusion conditions are both covered.

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

tweetapi_user_verified_followersGet Verified FollowersA
Read-onlyIdempotent

Fetch one page of a user's followers who are verified accounts, as on the Verified Followers tab. For all followers, use tweetapi_user_followers_v2. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the read-only/idempotent/no-destruction profile, and the description goes beyond them by disclosing the auth requirement, the per-call request count and typical cost of 1 unit, and that results carry a cost estimate. The pagination contract (call again with the returned nextCursor) is spelled out. It stops short of describing failure modes or rate limits, so it is strong rather than exhaustive.

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?

Four compact sentences, front-loaded with the resource and filter, then alternative routing, then cost/auth, then pagination. No hedging or filler; every sentence carries operational information.

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?

With an output schema present the description need not explain return values, yet it still flags the cost estimate and completeness.nextCursor fields the agent must consume. For a simple 3-parameter paginated read, nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so userId, cursor, and responseFormat are fully documented in the schema itself. The description's pagination sentence largely restates the cursor rule already in the schema, adding flow context rather than new parameter meaning; baseline 3 applies.

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?

States a specific verb and resource with a clear filter: 'Fetch one page of a user's followers who are verified accounts,' and anchors it to the product's Verified Followers tab. An agent can distinguish it from generic follower tools without opening any schema.

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

Usage Guidelines5/5

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

Explicitly names the alternative ('For all followers, use tweetapi_user_followers_v2'), giving the agent a direct routing rule for the most likely confusion. It also specifies the API-key prerequisite, which gates whether the call is even possible.

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

tweetapi_user_videosGet User VideosA
Read-onlyIdempotent

Fetch one page of a user's posts that contain videos, as on the Videos tab of their profile. Photos are a separate feed: use tweetapi_user_photos. Read-only. Needs a TweetAPI API key and makes one TweetAPI request per call, usually costing 1 unit; each result includes a cost estimate. Returns one page: to get the next one, call again with cursor set to this result's completeness.nextCursor.

NameRequiredDescriptionDefault
cursorNocompleteness.nextCursor from the previous page. Omit it for the first page.
userIdYesNumeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link.
responseFormatNofull (default) returns TweetAPI's JSON unchanged. compact keeps full post text, IDs, links, original dates, counts, and cursors but drops bulky fields; output.fieldsOmitted lists what was dropped.

Output Schema

NameRequiredDescription
costYes
modeYes
toolYes
noticeYes
outputYes
resultYes
endpointYes
usageDocsNo
paginationNoPagination exactly as TweetAPI returned it.
statusCodeYes
retrievedAtYesWhen the MCP server received this response (ISO 8601). Not the post or profile date, and not a promise that X's data was fresh at that moment.
completenessYes
resolvedInputNoIdentifiers the MCP server parsed from links or @handles before calling TweetAPI.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered; the description goes further by disclosing the auth requirement (TweetAPI API key), the cost model (one request per call, usually 1 unit, cost estimate returned per result), and the one-page pagination contract. Those are the operational details an agent needs and none of them are present in the structured fields. The only redundancy is restating 'Read-only', which does not contradict the annotations.

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?

Four compact sentences, front-loaded with what is fetched, then sibling routing, then operational facts, then pagination. Every sentence advances the agent's decision except the brief 'Read-only', which duplicates an annotation but costs almost nothing. No filler or restated title.

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?

With an output schema present, the description correctly avoids describing return shapes and instead covers what the schema cannot: auth, cost, page size, and the exact continuation field. All three parameters are documented and the username prerequisite is called out, so an agent has everything needed to call this correctly on the first try.

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?

Schema coverage is 100% and the parameter descriptions are already strong (cursor semantics, numeric userId with a username-lookup fallback, full vs compact trade-off). The description still adds value by tying cursor to the concrete return path 'completeness.nextCursor', making the loop explicit rather than implied. It adds little on userId or responseFormat, so it is slightly above the high-coverage baseline rather than a full rewrite.

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 states a specific verb and resource ('Fetch one page of a user's posts that contain videos') and anchors it to a familiar analogy ('as on the Videos tab of their profile'). It also names the sibling it is not ('Photos are a separate feed: use tweetapi_user_photos'), so an agent can separate it from tweetapi_user_photos and tweetapi_user_tweets without opening any schema.

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

Usage Guidelines5/5

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

It gives an explicit alternative and the condition that selects it ('Photos are a separate feed: use tweetapi_user_photos'), plus the prerequisite path for username inputs ('call tweetapi_user_by_username first'), which is repeated in the schema. The pagination continuation rule ('call again with cursor set to this result's completeness.nextCursor') tells the agent exactly how to iterate, leaving nothing to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 38 tool updatesv0.3.3
    • Changedtweetapi_community_media1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_community_members1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_community_search2 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
      • addedInput schema / properties / query / description
        Added value: +"Keywords to find communities by, as in X's community search."
    • Changedtweetapi_community_tweets2 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
      • addedInput schema / properties / sortBy / description
        Added value: +"Order of the posts: Relevance (default) or Recency."
    • Changedtweetapi_docs_get_page1 field changed
      • addedInput schema / properties / pathOrKeyword / description
        Added value: +"An endpoint path such as /tw-v2/user/followers, or a keyword such as followers. A path gives the most precise match."
    • Changedtweetapi_docs_search2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"How many matching sections to return, 1 to 10. Default 5."
      • addedInput schema / properties / query / description
        Added value: +"Words to look for in the docs, such as rate limits, pagination or followers."
    • Changedtweetapi_endpoint_lookup1 field changed
      • addedInput schema / properties / pathOrKeyword / description
        Added value: +"An endpoint path such as /tw-v2/user/followers, or a keyword such as followers. A path gives the most precise match."
    • Changedtweetapi_list_followers1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_list_members1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_list_search2 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
      • addedInput schema / properties / query / description
        Added value: +"Keywords to find Lists by, 1 to 512 characters, as in X's List search."
    • Changedtweetapi_list_tweets1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_sdk_guidance2 fields changed
      • addedInput schema / properties / language / description
        Added value: +"Programming language: Python, or Node.js, TypeScript or JavaScript."
      • addedInput schema / properties / task / description
        Added value: +"What the code should do, such as fetch a user's latest posts. It is echoed back."
    • Changedtweetapi_search3 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
      • addedInput schema / properties / query / description
        Added value: +"Search text, 1 to 512 characters, with the same syntax and operators as x.com search, for example from:jack, \"exact phrase\", lang:en or since:2026-01-01."
      • addedInput schema / properties / type / description
        Added value: +"Which results to return: Latest (default) or Top for posts, People for accounts, Photos or Videos for posts with media."
    • Changedtweetapi_space_stream_url1 field changed
      • addedInput schema / properties / mediaKey / description
        Added value: +"The Space's media key, from a tweetapi_space_by_id result."
    • Changedtweetapi_tool_catalog3 fields changed
      • addedInput schema / properties / category / description
        Added value: +"One of docs, user, tweet, search, list, community, space, trends or account."
      • addedInput schema / properties / endpointPath / description
        Added value: +"TweetAPI endpoint path, such as /tw-v2/user/followers, to find the tool that calls it."
      • addedInput schema / properties / toolName / description
        Added value: +"Exact tool name, such as tweetapi_search, to return only that tool."
    • Changedtweetapi_tweet_details2 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
      • addedInput schema / properties / sortBy / description
        Added value: +"Order of the replies: Relevance (default), Recency or Likes."
    • Changedtweetapi_tweet_hidden_replies1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_tweet_quotes1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_tweet_retweets1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_tweet_translate1 field changed
      • addedInput schema / properties / dstLang / description
        Added value: +"Language code to translate into, such as en, es, fr, ja or zh-CN."
    • Changedtweetapi_user_affiliates1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_articles1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_check_follow2 fields changed
      • changedInput schema / properties / subjectId / description
        Previous value: -"Numeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link."New value: +"Numeric user ID of the account that may be the follower."
      • changedInput schema / properties / targetId / description
        Previous value: -"Numeric user ID. This tool does not look up usernames; call tweetapi_user_by_username first if you only have a username or profile link."New value: +"Numeric user ID of the account that may be followed."
    • Changedtweetapi_user_followers_ids2 fields changed
      • addedInput schema / properties / count / description
        Added value: +"Page size from 1 to 500. Omit it for the default."
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_followers_list2 fields changed
      • addedInput schema / properties / count / description
        Added value: +"Page size from 1 to 500. Omit it for the default."
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_followers_v21 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_following_ids2 fields changed
      • addedInput schema / properties / count / description
        Added value: +"Page size from 1 to 500. Omit it for the default."
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_following_list2 fields changed
      • addedInput schema / properties / count / description
        Added value: +"Page size from 1 to 500. Omit it for the default."
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_following_v21 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_highlights1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_list_memberships1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_lists1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_photos1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_subscriptions1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_tweets1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_tweets_and_replies1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_verified_followers1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
    • Changedtweetapi_user_videos1 field changed
      • addedInput schema / properties / cursor / description
        Added value: +"completeness.nextCursor from the previous page. Omit it for the first page."
  2. 47 tool updatesv0.2.1
    • Addedtweetapi_account_usage
    • Addedtweetapi_community_details
    • Addedtweetapi_community_media
    • Addedtweetapi_community_members
    • Addedtweetapi_community_search
    • Addedtweetapi_community_tweets
    • Addedtweetapi_list_details
    • Addedtweetapi_list_followers
    • Addedtweetapi_list_members
    • Addedtweetapi_list_search
    • Addedtweetapi_list_tweets
    • Addedtweetapi_search
    • Addedtweetapi_space_by_id
    • Addedtweetapi_space_stream_url
    • Addedtweetapi_trend_locations
    • Addedtweetapi_trends
    • Addedtweetapi_tweet_details
    • Addedtweetapi_tweet_details_by_ids
    • Addedtweetapi_tweet_hidden_replies
    • Addedtweetapi_tweet_metrics
    • Addedtweetapi_tweet_quotes
    • Addedtweetapi_tweet_retweets
    • Addedtweetapi_tweet_translate
    • Addedtweetapi_user_about_account
    • Addedtweetapi_user_affiliates
    • Addedtweetapi_user_articles
    • Addedtweetapi_user_by_id
    • Addedtweetapi_user_by_ids
    • Addedtweetapi_user_by_username
    • Addedtweetapi_user_by_usernames
    • Addedtweetapi_user_check_follow
    • Addedtweetapi_user_followers_ids
    • Addedtweetapi_user_followers_list
    • Addedtweetapi_user_followers_v2
    • Addedtweetapi_user_following_ids
    • Addedtweetapi_user_following_list
    • Addedtweetapi_user_following_v2
    • Addedtweetapi_user_highlights
    • Addedtweetapi_user_list_memberships
    • Addedtweetapi_user_lists
    • Addedtweetapi_user_photos
    • Addedtweetapi_user_similar_accounts
    • Addedtweetapi_user_subscriptions
    • Addedtweetapi_user_tweets
    • Addedtweetapi_user_tweets_and_replies
    • Addedtweetapi_user_verified_followers
    • Addedtweetapi_user_videos
  3. 5 tool updatesv0.2.0
    • First observedtweetapi_docs_get_page
    • First observedtweetapi_docs_search
    • First observedtweetapi_endpoint_lookup
    • First observedtweetapi_sdk_guidance
    • First observedtweetapi_tool_catalog

TDQS

A4/5.0

Scored across 52 tools

Disambiguation3/5

Most tools map cleanly to one X endpoint, but there are real overlap clusters: tweetapi_user_followers_v2 vs tweetapi_user_followers_list (same data, differing only in whether count is settable), and tweetapi_docs_search vs tweetapi_endpoint_lookup, which both take a keyword and return scored snippets with source URLs. The descriptions do acknowledge the alternatives and cross-reference each other, but an agent still has to read carefully to pick correctly.

Naming Consistency4/5

Every tool shares the tweetapi_ prefix and snake_case with a resource_then_action shape (tweetapi_user_by_ids, tweetapi_list_members, tweetapi_community_tweets), which is highly predictable. The main blemishes are the legacy suffix tweetapi_user_followers_v2/_following_v2 sitting next to _list and _ids variants, and a few names that describe the return shape rather than an action.

Tool Count2/5

52 tools is well past the point where an agent can hold the surface in mind, and the count is inflated by near-duplicates (profile-by-id vs -by-username vs -by-ids vs -by-usernames, followers v2/list/ids) rather than genuinely distinct operations. It mirrors a large upstream API, but as an MCP tool set it is heavy and hard to navigate.

Completeness4/5

Coverage is broad and coherent for a read-only X data API: users, followers/following graphs, tweets and conversations, lists, communities, Spaces, trends, search, plus docs, SDK guidance, a catalog and usage checks. Gaps are minor and mostly domain-bounded (no DMs, no notifications, no write/post actions, no Spaces discovery beyond lookup by ID), so agents can work around them.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI agents and coding assistants with Twitter data access including tweets, user profiles, followers, and search functionality.
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    Enables AI agents to search, read user profiles, timelines, media, follow threads, track trends, and manage accounts on X/Twitter via GraphQL, without browser automation or paid API keys.
    100
    11
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to read, post, search, and engage with Twitter/X content, including AI-powered reply drafting and analytics.
    17
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only access to public X (Twitter) data, including profiles, tweets, timelines, threads, followers, and search, for developers and AI agents.
    1
    MIT