Skip to main content
Glama
N-Graves

x-mcp-server

by N-Graves

x-mcp-server

A Model Context Protocol server for the X API v2.

175 of X's 190 published operations are reachable. The 15 that are not are the streaming endpoints, excluded for a reason no access tier changes.

MIT licensed.

Install

npm install -g @nasdigitaluk/x-mcp

Related MCP server: x-mcp-server

Authentication

Two ways. Pick one.

App-only — simplest, cannot post:

{ "env": { "X_BEARER_TOKEN": "your-bearer-token" } }

User context — can post, and refreshes itself:

{
  "env": {
    "X_CLIENT_ID": "your-client-id",
    "X_CLIENT_SECRET": "your-client-secret",
    "X_CREDENTIALS_FILE": "~/.x-mcp-credentials"
  }
}

Seed the credentials file once from your authorisation flow:

X_ACCESS_TOKEN=...
X_REFRESH_TOKEN=...
X_TOKEN_EXPIRES_AT=1757260800000

⚠️ X's refresh tokens are single use

This is the part worth reading before you trust any X integration, including this one.

X access tokens last about two hours, and the refresh token is single use — every refresh returns a new one and invalidates the old. Persist the new one incorrectly and the chain breaks permanently; the only fix is re-authorising in a browser.

Running two MCP clients at once is completely normal. Both refresh, both spend the same token, and whichever writes second saves one X has already invalidated. The server this replaces did the write with a plain writeFileSync — no lock, no atomic write.

Here:

  • the refresh happens inside an exclusive lock, so only one process spends the token;

  • it re-reads under the lock before refreshing, because another process may have already done the work while this one waited;

  • the write is atomic (temp file, fsync, rename), so a crash cannot truncate it;

  • the file is chmod'd on every write, not only when created — a pre-existing 0644 credentials file used to stay world-readable while the code read as though it had secured it;

  • a stale lock from a killed process is broken after 30s rather than wedging everything after it.

There is a test asserting that three concurrent callers cause exactly one refresh.

What is excluded, and why

The 15 streaming endpoints: /2/tweets/search/stream, the firehose and sample streams, and the compliance streams.

These are not request/response endpoints. They hold the connection open and emit posts indefinitely — a stream that returns has ended, which is a failure rather than a result. An MCP tool call has to return, so pointing one at a stream means it hangs until the client's timeout and then reports a timeout, which reads as a broken server rather than a category error.

No access tier changes this. Consuming a stream needs a long-running process, not a tool call.

The /stream/rules endpoints are NOT excluded. They configure what a stream would deliver and are ordinary calls, so you can manage your rules here and consume the stream elsewhere.

On paid tiers

Most of X's API needs a paid access tier. Those endpoints are covered anyway, because a tier is something you can buy — unlike an admin key you simply cannot obtain. Excluding them would deny the API to people who have paid for it. X reports clearly when your tier is insufficient, and that error passes through.

Tools

Seven tools for 175 operations.

Tool

x_list_operations

Browse the catalogue. Start here.

x_call

Call any operation by id.

x_get_me

The authenticated user. Needs user context.

x_create_post

Post. Immediately public.

x_delete_post

Delete one of yours. Destructive.

x_search_posts

Search recent posts. Needs Basic or above.

x_get_post

One post by id.

Posting is classified a write, not destructive, because a post can be deleted — but everyone who saw it still saw it, and the tool description says so.

Of 190 operations: 104 read, 57 write, 29 destructive.

Refreshing the catalogue

curl -o vendor/x-openapi.json https://api.twitter.com/2/openapi.json
npm run generate && npm test

Testing

npm test                              # 15 tests, including the refresh-concurrency one
X_BEARER_TOKEN=x npm run smoke        # real MCP over stdio

Built on

@nasdigitaluk/mcp-server-core.

Licence

MIT.

Available Tools

7 tools
x_callC

Call any X API v2 operation by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
paramsNo
operation_idYes

TDQS

C2.4/5.0
Behavior1/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It merely says 'Call any X API v2 operation by id' and gives no indication of side effects, destructive potential, authentication requirements, rate limits, or response behavior. This is especially risky for a generic tool that could invoke create or delete operations.

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 description is a single concise sentence with no redundant wording, and the core mechanism is front-loaded. It is efficient, though it is under-specified in other dimensions, which is a completeness problem rather than a conciseness problem.

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

Completeness1/5

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

For a highly generic tool with no annotations, no output schema, and 0% parameter documentation, the description is severely incomplete. It fails to explain how to discover operation IDs, what body and params mean, what side effects may occur, and what the response looks like, leaving an agent without enough information to invoke it safely and correctly.

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

Parameters2/5

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

Schema description coverage is 0%, and the description only adds meaning for 'operation_id' through the phrase 'by id'. It does not explain how 'params' and 'body' are used, how they map to the selected operation, or how they relate to query parameters and request bodies.

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 states a clear action ('Call'), a defined resource ('any X API v2 operation'), and the key selection mechanism ('by id'). It implies a generic dispatcher role that differentiates it from the fixed-operation siblings, though it does not explicitly name the alternative tools.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus the dedicated siblings such as x_get_post or x_create_post. It also does not mention that operation IDs could come from x_list_operations, nor when the generic path should be preferred over specific tools.

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

x_create_postA

Post to X. This is immediately public. It can be deleted afterwards, which is why it is classified a write rather than destructive — but everyone who saw it still saw it.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesPost text. 280 characters unless the account has X Premium.
media_idsNoUp to 4 media ids, uploaded separately.
quote_post_idNo
reply_settingsNo
reply_to_post_idNoReply to this post id.

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral disclosure burden, and it does this well: it reveals that posts are immediately public, reversible via deletion, yet exposure persists after deletion ('everyone who saw it still saw it'). This is meaningful side-effect disclosure beyond the schema, though it omits other operational traits like rate limits or auth requirements.

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, with the core action front-loaded and each subsequent clause adding distinct behavioral context. The prose is slightly conversational but every sentence earns its place; nothing is redundant.

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

Completeness3/5

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

The description covers purpose and side effects well but, given there is no output schema, it omits what the tool returns (e.g., a post ID), which an agent would need for follow-up actions like x_delete_post. It also doesn't compensate for the two undocumented parameters. Adequate for a straightforward create tool, but with clear gaps.

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 60%, and the description adds no parameter-level meaning beyond what the schema already documents for text, media_ids, and reply_to_post_id. The two undocumented parameters (quote_post_id, reply_settings) remain unaddressed by the description, and the opening phrase 'Post to X' is purpose, not parameter semantics. The schema carries most of the load, so a midpoint score 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 opens with a specific verb+resource pair ('Post to X') that unambiguously states the tool's function. The write-versus-destructive clarification further distinguishes it from the sibling x_delete_post, so an agent can tell them apart at a glance.

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 description implies this is the tool for creating posts versus deleting them, but it never explicitly states when to choose this over alternatives or names a sibling. The 'immediately public' and 'can be deleted afterwards' context hints at consequences the agent should weigh, but there is no explicit when/when-not guidance.

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

x_delete_postA

Delete one of your own posts. Cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states 'Cannot be undone,' highlighting the irreversible destructive nature, and restricts to 'your own posts,' implying an ownership/permission constraint. It does not mention authentication, rate limits, or side effects, but for a simple delete it covers the most critical behavioral traits.

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

Conciseness5/5

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

The description is two short sentences with zero filler. The core action is front-loaded, and the critical caveat about irreversibility is stated concisely. Every word earns its place.

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 simple one-parameter destructive tool without an output schema, the description covers the essential context: what it does, the ownership scope, and the permanence of the action. It omits the success/response format, but this is a minor gap given the tool's simplicity. The required parameter is documented in the schema, so the description need not repeat it.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it does not mention the post_id parameter or how to specify which post to delete. The schema's parameter name and type provide minimal information, yet the description adds no semantic context beyond the tool's general purpose. This leaves the agent to infer that post_id identifies the target post.

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: 'Delete one of your own posts.' It also scopes the action to 'your own posts,' which clearly distinguishes it from siblings like x_create_post, x_get_post, and x_search_posts. The action is unambiguous and immediately understandable.

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 description implies usage: use this tool when you want to delete a post that you own. However, it does not explicitly state when not to use it, nor does it mention alternatives among the sibling tools. The guidance is reasonable but entirely implicit.

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

x_get_meA

The authenticated user. Needs a user-context token, not app-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
user.fieldsNoComma-separated, e.g. description,public_metrics,created_at.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden and does disclose an important auth behavior (user-context token needed). However, it says nothing about return format, error cases, or data scope, so it is only partially transparent.

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 short sentences, no filler, and the key auth requirement is stated immediately. Every word adds value.

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 low-complexity tool with one documented optional parameter and no output schema, this description covers the essential purpose and the unique auth requirement. It could still benefit from an explicit statement of what is returned, but it is largely complete.

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?

The single optional parameter is already fully described in the schema, and the description adds no additional meaning about user.fields. This matches the baseline for 100% schema coverage.

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 identifies the resource as 'the authenticated user', which matches the tool name x_get_me and clearly targets the current user's profile. It lacks an explicit verb and does not draw a distinction from sibling tools like x_get_post, so it falls short of a 5.

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 provides a clear condition for invocation: a user-context token is required and app-only auth is insufficient. It does not explicitly name alternatives or when-not-to-use, but the auth constraint gives the agent actionable selection guidance.

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

x_get_postC

One post by id, with whichever fields you ask for.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
expansionsNo
tweet.fieldsNo

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, but it only reveals that the response includes the requested fields ('whichever fields you ask for'). It does not disclose error behavior (e.g., not found), authentication requirements, rate limits, or whether expansions/tweet.fields must be provided. The field-selection nuance is helpful but insufficient.

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 description is a single compact sentence, front-loading the core purpose ('One post by id') before the field-selectivity qualifier. There is no fluff; however, brevity comes at the cost of missing detail, which is captured in other dimensions.

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

Completeness2/5

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

The tool has no annotations, no output schema, and undocumented parameters, yet the description only covers 'one post by id' and field selection. It omits return format, error contexts, and any elaboration on how field selection is expressed, making it underpowered for an agent to invoke reliably.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It clarifies that post_id is the identifier and that field-related parameters exist, but it doesn't explain the format or distinction between expansions and tweet.fields, nor that tweet.fields is a literal property name. This partial mapping is not enough for correct invocation.

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 phrase 'One post by id' clearly identifies the resource (a single post) and the selection criterion (id), distinguishing it from x_search_posts which would return multiple posts. However, it lacks an explicit verb like 'get' or 'retrieve,' and doesn't name the sibling it differs from, so it falls short of a full 5.

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

Usage Guidelines2/5

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

No guidance on when to choose this tool over siblings such as x_search_posts or x_get_me. 'One post by id' only implies that the agent should use it when a post_id is known and a single post is needed, but there are no explicit conditions or exclusions.

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

x_list_operationsA

Browse the X API v2 — 175 of 190 operations are reachable here. Use this to find an operation id for x_call. Many endpoints need a paid access tier on your X account; that is a fact about the account rather than this server, and X reports it clearly if you lack one.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFilter by id, path, tag or summary — try 'posts', 'users', 'lists'.
include_excludedNoAlso show the streaming endpoints, which cannot be tool calls.

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses that 175 of 190 operations are reachable and mentions the paid access tier requirement for some endpoints, giving insight into what the tool can and cannot do. However, it does not explicitly state that the tool is read-only or describe any side effects, though these are implied.

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 description is reasonably concise (two sentences) and front-loads the purpose. The inclusion of the paid access tier note adds some length but provides useful context. Overall it is well-structured without being bloated.

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 the tool has no output schema and is a listing/discovery tool, the description provides sufficient context: it states what the tool does, how to use it, and relevant caveats. It does not specify return format, but that is not critical for this type of 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?

The schema descriptions fully cover both parameters ('search' and 'include_excluded'). The tool description does not add additional semantic details beyond what is already in the schema, so it stays at the baseline for 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?

The description clearly states the tool's purpose: to browse the X API v2 and find operation IDs for x_call. It explicitly mentions 'Browse the X API v2' and 'Use this to find an operation id for x_call', making the resource and action unambiguous.

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 explicitly says 'Use this to find an operation id for x_call', giving direct guidance on when to use the tool. It also provides context about reachable operations and the paid access tier, helping users understand the tool's scope and limitations.

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

x_search_postsB

Search recent posts. Needs at least Basic access; the free tier cannot read.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesX search query syntax.
next_tokenNo
max_resultsNo
tweet.fieldsNo

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral disclosure burden. It mentions the Basic-access requirement and that search targets 'recent' posts, but says nothing about pagination via next_token, result limits, ordering, rate limits, authentication details, or read-only behavior. For a search tool, this leaves important behavioral traits undisclosed.

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 short sentences with no filler. The core action is front-loaded ('Search recent posts'), and the access constraint follows in a clearly separate sentence. Every word earns its place.

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

Completeness2/5

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

With four parameters, no annotations, and no output schema, the tool is under-described. The description leaves parameter semantics, pagination behavior, and return shape unaddressed. An agent could make a basic query call but would lack the context needed to use advanced fields or interpret results correctly.

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

Parameters2/5

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

Schema description coverage is only 25%: only the query parameter has a description ('X search query syntax'). The tool description does not compensate for the undocumented next_token, max_results, or tweet.fields parameters. With low schema coverage, the description needed to add meaning but did not.

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?

Description states a clear operation ('Search') on a clear resource ('recent posts'), which is distinguishable from siblings like x_get_post and x_create_post by the search verb. However, it does not explicitly differentiate itself from sibling lookup tools, stopping short of a 5.

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 only usage guidance is the access requirement: 'Needs at least Basic access; the free tier cannot read.' This gives a condition for when the tool is available, but no explicit guidance on when to choose it over x_get_post, x_list_operations, or x_call. Usage context 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.

Tool Schema Changelog

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

  1. 7 tool updatesv1.0.0
    • First observedx_call
    • First observedx_create_post
    • First observedx_delete_post
    • First observedx_get_me
    • First observedx_get_post
    • First observedx_list_operations
    • First observedx_search_posts

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation4/5

Each dedicated tool targets a clear action (create/delete/search/get/user), but x_call can execute the same operations generically, so an agent could occasionally choose between x_call and a wrapper. The descriptions are specific enough that this overlap is manageable.

Naming Consistency4/5

All tools share an x_ prefix and use snake_case, with imperative verb-first names like list_operations, create_post, and search_posts. x_call is a slight deviation from the verb_noun pattern, but it still reads consistently as the generic dispatch verb.

Tool Count5/5

Seven tools is a well-scoped set: five focused wrappers plus a discovery/generic-call pair cover common and long-tail X operations without bloating the server.

Completeness5/5

The server explicitly reaches 175 of 190 X API v2 operations via x_list_operations plus x_call, and dedicated wrappers cover the most common post/user workflows. The tiny uncovered remainder is not an obvious gap for practical use.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides programmatic X (Twitter) engagement via MCP, offering 24 tools for search, timelines, notifications, bookmarks, profiles, and tweet actions through a headless browser.
    MIT
  • F
    license
    B
    quality
    B
    maintenance
    MCP server for the official X API, enabling agents to read and publish posts, look up users, and search posts with safe read-only default and explicit write mode.
    8
    6 npm
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP-based interaction with the X (Twitter) API v2, supporting reads like timeline, mentions, and search, and writes through a two-step draft-and-confirm process that ensures human-visible previews before any public post.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    X and Twitter MCP by SocialDataX for public post search and details, comments and replies, user profiles, and user post lists with pagination.
    MIT