Skip to main content
Glama
x-mcp-server

x-mcp-server

by lluisfont

X MCP Server

TypeScript Model Context Protocol (MCP) server for the official X API.

이 프로젝트는 ChatGPT 에이전트를 포함한 MCP 호환 에이전트가 사용자 컴퓨터에서 실행되는 로컬 서버를 통해 X 계정을 안전하게 읽고 게시할 수 있게 해줍니다.

서버는 다음을 지원합니다:

  • 인증된 X 계정 읽기.

  • 사용자 이름으로 X 사용자 조회.

  • ID로 게시물 읽기.

  • 사용자의 최근 게시물 나열.

  • X 검색 구문으로 최근 게시물 검색.

  • 쓰기 모드가 명시적으로 활성화된 경우 게시물 및 답글 작성.

  • 로컬 컴퓨터 설치마다 다른 X 계정 선택.

  • 로컬 MCP 호스트를 위해 stdio로 실행.

  • OpenAI Secure MCP Tunnels를 통해 ChatGPT를 위한 로컬 Streamable HTTP로 실행.

프로젝트 상태

이것은 기능하는 MVP입니다.

구현됨:

  • stdio 기반 MCP 서버.

  • Streamable HTTP 기반 MCP 서버.

  • 공식 X API 클라이언트.

  • 로컬 다중 계정 구성.

  • 기본적으로 안전한 read-only 모드.

  • 게시 및 답글을 위한 명시적 read-write 모드.

  • X 계정 재인증을 위한 로컬 OAuth 2.0 Authorization Code + PKCE 헬퍼.

  • Vitest를 사용한 단위 테스트.

  • OpenAI Secure MCP Tunnels를 통한 ChatGPT 연결 가이드.

  • Windows에서 수동 및 자동 시작을 위한 로컬 서버 수명 주기 가이드.

Related MCP server: X API FastMCP Server

작동 방식

로컬 MCP 호스트의 경우:

MCP host
  -> stdio
  -> x-mcp-server
  -> official X API

ChatGPT 에이전트의 경우:

ChatGPT agent
  -> custom MCP app
  -> OpenAI Secure MCP Tunnel
  -> tunnel-client on your computer
  -> http://127.0.0.1:3001/mcp
  -> x-mcp-server
  -> official X API

X 자격 증명은 로컬에 유지됩니다. ChatGPT는 터널을 통해 로컬 MCP 서버에 연결하며, 사용자의 X 액세스 토큰을 받지 않습니다.

사용 가능한 MCP 도구

도구

유형

설명

x_get_active_account

읽기

선택한 로컬 프로필, 구성된 계정, 모드 및 인증된 X 사용자를 반환합니다.

x_get_me

읽기

인증된 X 사용자를 반환합니다.

x_get_user

읽기

사용자 이름으로 X 사용자를 조회합니다.

x_get_post

읽기

ID로 게시물을 읽습니다.

x_get_user_posts

읽기

사용자 ID가 작성한 최근 게시물을 나열합니다.

x_search_posts

읽기

공식 X 쿼리 구문을 사용하여 최근 게시물을 검색합니다.

x_create_post

쓰기

새 게시물을 게시합니다. X_MCP_MODE=read-write가 필요합니다.

x_reply_post

쓰기

게시물에 답글을 답니다. X_MCP_MODE=read-write가 필요합니다.

쓰기 도구는 X_MCP_MODE=read-write가 설정되지 않은 경우 차단됩니다.

요구 사항

  • Node.js 20 이상.

  • X Developer 계정.

  • OAuth 2.0이 활성화된 X Developer 앱.

  • X 읽기 범위: tweet.read users.read.

  • 게시 및 답글을 위한 X 쓰기 범위: tweet.write.

  • 권장 X 갱신 범위: offline.access.

  • ChatGPT의 경우: 개발자 모드 활성화.

  • ChatGPT 로컬 연결의 경우: OpenAI Secure MCP Tunnel 및 tunnel-client.

단계별 설치

1. 저장소 복제

git clone https://github.com/lluisfont/x-mcp-server.git
cd x-mcp-server

이미 저장소가 있는 경우:

cd C:\Repos\x-mcp-server
git pull

2. 종속성 설치

npm install

3. 로컬 환경 파일 생성

Copy-Item .env.example .env

로컬에서 .env를 편집하세요.

.env를 커밋하지 마세요. 여기에는 액세스 토큰, 갱신 토큰, 클라이언트 비밀번호 및 비공개 API 키가 포함될 수 있습니다.

4. 활성 X 계정 구성

명명된 로컬 계정의 경우:

X_MCP_ACCOUNT=fcbnews2026
X_MCP_MODE=read-only
X_API_BASE_URL=https://api.x.com

X_ACCOUNT_FCBNEWS2026_USER_ACCESS_TOKEN=
X_ACCOUNT_FCBNEWS2026_REFRESH_TOKEN=

같은 컴퓨터에서 여러 계정을 사용하는 경우:

X_MCP_ACCOUNT=fcbnews2026
X_MCP_MODE=read-only

X_ACCOUNT_FCBNEWS2026_USER_ACCESS_TOKEN=
X_ACCOUNT_FCBNEWS2026_REFRESH_TOKEN=

X_ACCOUNT_LLUISFONT_USER_ACCESS_TOKEN=
X_ACCOUNT_LLUISFONT_REFRESH_TOKEN=

X_MCP_ACCOUNT는 이 설치에서 사용하는 로컬 프로필을 선택합니다. 다른 컴퓨터는 코드를 변경하지 않고 다른 계정을 선택할 수 있습니다.

레거시 단일 계정 모드도 지원됩니다:

X_MCP_ACCOUNT=default
X_USER_ACCESS_TOKEN=

새 설치에서는 명명된 계정을 선호해야 합니다.

5. 전송 방식 선택

프로세스를 직접 시작하는 로컬 MCP 호스트의 경우:

X_MCP_TRANSPORT=stdio

로컬 터널을 통한 ChatGPT의 경우:

X_MCP_TRANSPORT=http
X_MCP_HTTP_PORT=3001
X_MCP_HTTP_PATH=/mcp

6. 타입 검사 및 테스트 실행

npm run typecheck
npm test
npm run build

7. MCP 서버 시작

stdio의 경우:

npm run dev

로컬 HTTP의 경우:

npm run dev:http

기본 HTTP MCP 엔드포인트는 다음과 같습니다:

http://127.0.0.1:3001/mcp

헬스 체크:

Invoke-RestMethod http://127.0.0.1:3001/healthz | ConvertTo-Json -Compress

예상 응답:

{"ok":true,"transport":"http","activeAccount":"fcbnews2026","mode":"read-only"}

로컬 MCP 서버 수명 주기

ChatGPT가 터널을 통해 이 MCP를 사용할 때 두 개의 로컬 프로세스가 실행 중이어야 합니다:

1. The MCP HTTP server
   -> npm run dev:http
   -> http://127.0.0.1:3001/mcp

2. tunnel-client
   -> .\.tools\tunnel-client\tunnel-client.exe run --profile <profile>
   -> OpenAI Secure MCP Tunnel

두 프로세스 중 하나라도 중지되면 ChatGPT는 MCP 도구를 사용할 수 없습니다.

수동 시작

터미널 1:

cd C:\Repos\x-mcp-server
npm run dev:http

터미널 2:

cd C:\Repos\x-mcp-server
.\.tools\tunnel-client\tunnel-client.exe run --profile x-fcbnews

두 터미널을 모두 열어 두세요.

로컬 사용 가능 여부 확인

MCP 서버 확인:

Invoke-RestMethod http://127.0.0.1:3001/healthz | ConvertTo-Json -Compress

터널 클라이언트 확인:

Invoke-WebRequest http://127.0.0.1:8080/readyz -UseBasicParsing

터널 준비 상태 엔드포인트는 HTTP 200을 반환해야 합니다.

수동 중지

다음에서 Ctrl+C를 누르세요:

  • npm run dev:http를 실행 중인 터미널.

  • tunnel-client run을 실행 중인 터미널.

둘 다 중지되면 ChatGPT는 더 이상 로컬 MCP 서버에 접근할 수 없습니다.

계정 또는 안전 모드 변경

.env를 편집하세요.

활성 계정 변경:

X_MCP_ACCOUNT=fcbnews2026

쓰기 모드 활성화:

X_MCP_MODE=read-write

안전한 읽기 전용 모드로 돌아가기:

X_MCP_MODE=read-only

.env를 변경한 후 MCP HTTP 서버를 다시 시작하세요:

Ctrl+C
npm run dev:http

로컬 포트와 MCP 경로가 변경되지 않았다면 터널은 계속 실행될 수 있습니다.

Windows 로그인 시 자동 시작

이 MCP를 정기적으로 호스팅해야 하는 컴퓨터에서는 Windows 작업 스케줄러를 사용하세요.

로컬 시작 스크립트를 생성하세요. 예:

C:\Users\<user>\mcp-start\x-fcbnews-start.ps1

스크립트:

$repo = "C:\Repos\x-mcp-server"
$profile = "x-fcbnews"

Set-Location $repo

Start-Process powershell.exe -ArgumentList @(
  "-NoExit",
  "-ExecutionPolicy", "Bypass",
  "-Command", "cd `"$repo`"; npm run dev:http"
) -WindowStyle Minimized

Start-Sleep -Seconds 5

Start-Process powershell.exe -ArgumentList @(
  "-NoExit",
  "-ExecutionPolicy", "Bypass",
  "-Command", "cd `"$repo`"; .\.tools\tunnel-client\tunnel-client.exe run --profile $profile"
) -WindowStyle Minimized

예약된 작업 등록:

$action = New-ScheduledTaskAction `
  -Execute "powershell.exe" `
  -Argument "-ExecutionPolicy Bypass -File `"C:\Users\<user>\mcp-start\x-fcbnews-start.ps1`""

$trigger = New-ScheduledTaskTrigger -AtLogOn

Register-ScheduledTask `
  -TaskName "X MCP FCBNews2026" `
  -Action $action `
  -Trigger $trigger `
  -Description "Starts the local X MCP server and OpenAI tunnel-client at Windows logon."

자동 시작 비활성화:

Disable-ScheduledTask -TaskName "X MCP FCBNews2026"

다시 활성화:

Enable-ScheduledTask -TaskName "X MCP FCBNews2026"

삭제:

Unregister-ScheduledTask -TaskName "X MCP FCBNews2026" -Confirm:$false

전체 수명 주기 가이드:

docs/local-server-lifecycle.md

ChatGPT에 연결

개괄적인 흐름:

1. Run the MCP server over local HTTP.
2. Create a tunnel in OpenAI Platform.
3. Create a local tunnel-client profile pointing to http://127.0.0.1:3001/mcp.
4. Start tunnel-client.
5. Create a custom MCP app in the ChatGPT agent using Connection: Tunnel.
6. Test x_get_active_account or x_get_me before any write operation.

권장 ChatGPT 사용자 지정 MCP 설정:

Connection: Tunnel
Tunnel: <your OpenAI tunnel>
Authentication: No authentication

MCP 서버가 최종 서비스 자격 증명을 로컬에서 관리하는 경우(예: .env를 통해) No authentication을 사용하세요.

전체 ChatGPT 설정 가이드:

docs/chatgpt-mcp-setup.md

X 계정 재인증

X Developer에서 앱을 구성하세요:

OAuth 2.0: Enabled
App permissions: Read and write
Callback URI: http://127.0.0.1:3002/callback
Website URL: http://127.0.0.1:3002

실행:

$env:X_OAUTH_CLIENT_ID = "<OAuth 2.0 Client ID>"
$env:X_MCP_ACCOUNT = "fcbnews2026"
npm run x:oauth

의도한 X 계정에 로그인한 상태에서 생성된 URL을 여세요. 인증 후 헬퍼는 .env를 선택한 계정 토큰으로 업데이트합니다.

재인증 후 MCP 서버를 다시 시작하세요:

npm run dev:http

그런 다음 다음으로 확인하세요:

x_get_active_account

상세 OAuth 가이드:

docs/x-oauth.md

안전 모델

서버는 기본적으로 읽기 전용 모드로 시작됩니다:

X_MCP_MODE=read-only

쓰기 도구에는 다음이 필요합니다:

X_MCP_MODE=read-write

게시하기 전에:

  • x_get_active_account로 활성 계정을 확인하세요.

  • 게시할 정확한 텍스트를 확인하세요.

  • X 토큰에 tweet.write가 있는지 확인하세요.

  • 에이전트가 생성된 post_id를 반환하도록 요청하세요.

  • X가 ID를 반환할 때까지 게시물이 게시된 것으로 간주하지 마세요.

스크립트

스크립트

용도

npm run dev

stdio를 통해 MCP 서버를 시작합니다.

npm run dev:http

로컬 HTTP를 통해 MCP 서버를 시작합니다.

npm run x:oauth

로컬 X OAuth 인증 헬퍼를 실행합니다.

npm run build

TypeScript를 dist로 컴파일합니다.

npm run start

컴파일된 서버를 stdio를 통해 시작합니다.

npm run start:http

컴파일된 서버를 HTTP를 통해 시작합니다.

npm run typecheck

파일을 생성하지 않고 TypeScript를 실행합니다.

npm test

Vitest 테스트 스위트를 실행합니다.

문서

운영 보안

  • 자격 증명을 Git 외부에 유지하세요.

  • 기본 모드를 read-only로 유지하세요.

  • 통제된 워크플로에서만 read-write를 활성화하세요.

  • 게시 전에 활성 계정을 확인하세요.

  • 액세스 토큰이나 갱신 토큰을 로그에 남기지 마세요.

  • 토큰을 채팅, 이슈, 문서 또는 풀 리퀘스트에 붙여넣지 마세요.

  • 공유 컴퓨터에서 read-write 모드로 자동 시작을 실행하지 마세요.

라이선스

아직 선택된 오픈소스 라이선스가 없습니다.

Available Tools

8 tools
x_create_postB

Publish a new X post. Requires X_MCP_MODE=read-write and tweet.write scope.

NameRequiredDescriptionDefault
textYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/non-destructive profile is covered. The description adds genuine behavioral context by naming the required server mode and OAuth scope, but says nothing about idempotency, rate limits, or what the call returns.

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, zero filler, with the action front-loaded and the prerequisite immediately after. Every clause carries information.

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?

Prerequisites are covered, but with no output schema and an undocumented parameter, the definition leaves the agent guessing about the payload shape and the response. Adequate for a simple publish action but with clear gaps.

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% for the single required 'text' parameter, and the description never mentions it. No content format, mention/link handling, or length constraints are conveyed beyond the bare minLength/maxLength 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?

The description uses a specific verb+resource ('Publish a new X post'), which is unambiguous and distinguishable from the read-oriented siblings (x_get_post, x_search_posts). It does not explicitly contrast with x_reply_post, the other write sibling, so it stops 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?

It states prerequisites (X_MCP_MODE=read-write, tweet.write scope), which implies context of use, but gives no explicit when-to-use versus x_reply_post or when-not guidance. Useful but inferential rather than directive.

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

x_get_active_accountA
Read-only

Get the local X account profile selected for this MCP server installation. Does not expose tokens.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safety profile, so the bar is lower, and the description adds a genuine security-relevant disclosure: 'Does not expose tokens.' That is useful context beyond the annotation. It does not describe return contents, but the token caveat is the meaningful addition.

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, with the resource identity front-loaded and the security caveat in the second clause. Nothing extraneous.

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 zero-parameter read-only tool with annotations covering safety, this is nearly complete. The only missing piece is a hint about what profile fields come back, which matters slightly since no 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?

Zero parameters, so the baseline is 4 by rule. There is no parameter surface for the description to clarify or obscure.

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 ('Get the local X account profile') and scopes it to the account selected for this installation. It is largely distinguishable from siblings, though the boundary with x_get_me is not spelled out in the description itself.

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 use this versus x_get_me or x_get_user, which is the most likely confusion given the near-identical resource. The agent has to infer the distinction from the name alone.

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

x_get_meB
Read-only

Get the authenticated X user.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

The readOnlyHint=true annotation already establishes this is a safe read, so the description's main added value is the 'authenticated' scoping, which implies auth is required and no user id is passed. It says nothing about what identity fields come back or what happens if the token is invalid.

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 sentence with no filler. Every word carries information.

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?

For a parameterless read with annotations covering the safety profile, this is nearly sufficient, but the ambiguity against x_get_user and x_get_active_account is unresolved and no return-shape hint is given (there is no 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?

Zero parameters, so there is nothing for the description to clarify; baseline 4 applies. The description correctly implies the user is derived from the authenticated session rather than passed in.

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 ('get the authenticated X user'), which is meaningful against siblings like x_get_user and x_get_active_account. However, it does not explicitly distinguish itself from those overlapping siblings, so the reader must infer the difference.

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 use this versus x_get_user or x_get_active_account, both of which plausibly return user data. The agent is left to infer the distinction from the word 'authenticated' alone.

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

x_get_postB
Read-only

Get a single X post by ID.

NameRequiredDescriptionDefault
postIdYes

TDQS

B3.4/5.0
Behavior3/5

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

The readOnlyHint annotation already declares this as a safe read, so the description's remaining burden is lower. It adds little beyond the annotation: no mention of auth requirements, deleted/protected post behavior, or rate limits. A 3 reflects that annotations carry the safety profile while the description adds almost nothing.

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 sentence with zero waste. Appropriate for a simple lookup tool.

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?

For a basic read-by-ID tool with annotations covering safety, this is minimally adequate. Missing are edge-case behavior, format of the ID, and sibling differentiation, leaving some gaps for an agent choosing among post-related tools.

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?

There is only one parameter, so the baseline is 4. Schema coverage is 0% and the description only restates 'by ID', but with a single obvious parameter the description is adequate.

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 specific verb and resource: retrieving a single X post by ID. It is clear on its own, but it offers no distinction from siblings like x_search_posts or x_get_user_posts, which also return post data.

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 x_search_posts or x_get_user_posts. The word 'single' implies an exact-ID lookup, but this is not explicit and no alternatives or exclusions are named.

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

x_get_userC
Read-only

Get an X user by username.

NameRequiredDescriptionDefault
usernameYesUsername without @

TDQS

C2.9/5.0
Behavior2/5

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

readOnlyHint=true already tells the agent this is a safe read, and the description adds nothing further: no failure behavior for unknown usernames, no note on what user data is returned, no authentication context. It restates the operation rather than disclosing behavior.

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?

A single front-loaded sentence with no filler. It is appropriately sized for a one-parameter lookup, though it is arguably too sparse to be maximally useful.

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?

For a simple one-param read with annotations covering safety and full schema coverage, the essentials are present. Still missing is any signal about return content or how to distinguish this from x_get_me and x_get_active_account.

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%, including the useful 'Username without @' constraint, so the schema carries full parameter meaning. The description adds nothing beyond that, 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.

Purpose4/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 ('Get an X user by username'), so its function is unambiguous. However, it does not distinguish itself from close siblings like x_get_me or x_get_active_account, leaving the agent to infer which retrieval path applies.

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 when-to-use guidance and no mention of alternatives. With siblings that also return users (x_get_me, x_get_active_account), the definition provides no basis for choosing between them.

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

x_get_user_postsC
Read-only

Get recent posts authored by an X user ID.

NameRequiredDescriptionDefault
userIdYes
maxResultsNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds one useful behavioral trait, that only 'recent' posts are returned (not full history), but it never defines that window or says anything about pagination or ordering.

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?

A single front-loaded sentence with no wasted words. It is efficient, though arguably under-specified rather than optimally concise.

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?

For a low-complexity two-parameter tool with no output schema, an agent still lacks what 'recent' means, how many posts come back, whether the list is paginated, and what fields are returned. The definition is too thin to call correctly with confidence.

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, yet it only restates that userId is an X user ID. maxResults is entirely unaddressed in the description; the schema supplies default/min/max but no meaning for the value or how results are paged.

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?

Names a specific verb and resource ('Get recent posts authored by an X user ID'), so the agent knows exactly what is retrieved. It does not distinguish itself from siblings like x_search_posts or x_get_post, but the by-user scoping is still clear.

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 when-to-use guidance, no mention of alternatives (e.g. x_search_posts for query-based retrieval, x_get_post for a single post), and no prerequisites such as requiring a user ID from x_get_user or x_get_me.

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

x_reply_postA

Reply to an X post. Requires X_MCP_MODE=read-write and tweet.write scope.

NameRequiredDescriptionDefault
textYes
postIdYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already establish this is a non-read-only, non-destructive write. The description adds the auth/config requirement (mode and scope), which is genuine value beyond the annotations. It omits rate limits, whether the reply threads to the parent, and error/permission failure 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?

Two tight sentences with zero filler; the action is front-loaded and the prerequisite follows. Sized appropriately for a simple two-parameter tool.

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?

No output schema exists, so the description should say what comes back, and it doesn't. Combined with undocumented parameters and no sibling differentiation, the definition is adequate but leaves real gaps for a write 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?

Two required parameters with 0% schema description coverage, so the schema alone explains nothing about 'text' (reply body) or 'postId' (target post). The description mentions replying to 'a post' but does not map either parameter or note the 25000-char limit implied by 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?

Names a specific verb+resource ('Reply to an X post'), which is unambiguous on its own. It does not differentiate from the closely related sibling x_create_post (a reply is a kind of post creation), leaving the agent to infer the boundary.

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?

Gives a real precondition (X_MCP_MODE=read-write and tweet.write scope), which is useful operational guidance. It says nothing about when to prefer this over x_create_post or x_get_post, and no exclusions are stated, so usage is only partially covered.

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

x_search_postsC
Read-only

Search recent X posts using the official X query syntax.

NameRequiredDescriptionDefault
queryYes
maxResultsNo

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already establish readOnlyHint=true, so the safety profile is covered. The description adds one genuine behavioral fact — results are limited to 'recent' posts, not the full archive — but says nothing about rate limits, authentication requirements, result volume, or how results are ordered, leaving meaningful behavioral gaps for a search tool.

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?

A single front-loaded sentence with no wasted words. It is efficiently sized, though the extreme brevity is part of why other dimensions are thin.

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 no output schema, 0% parameter description coverage, and only a readOnlyHint annotation, the description would need to carry most of the load. Instead it omits the query syntax details, the meaning of maxResults, and any sense of the returned result shape, so an agent cannot call this confidently without outside knowledge.

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 both parameters are undocumented in the schema. The description nods at 'official X query syntax' for the query parameter but gives no operators, examples, or format rules, and it says nothing at all about maxResults (its default of 10, its 10-100 range, or how it interacts with the query).

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 ('Search') and resource ('recent X posts'), which is clear on its face. It does not, however, distinguish itself from siblings such as x_get_user_posts or x_get_post, which also return posts, so the agent must infer the distinction from the verb alone.

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 explicit when-to-use guidance, no conditions or exclusions, and no reference to the sibling tools that also retrieve posts. The word 'recent' implies a temporal scope but the description never tells the agent when search is preferable to x_get_user_posts or x_get_post.

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. 8 tool updatesv0.1.0
    • First observedx_create_post
    • First observedx_get_active_account
    • First observedx_get_me
    • First observedx_get_post
    • First observedx_get_user
    • First observedx_get_user_posts
    • First observedx_reply_post
    • First observedx_search_posts

TDQS

B3.4/5.0

Scored across 8 tools

Disambiguation4/5

Tools have largely distinct purposes: get_active_account (local config) vs get_me (authenticated API user) vs get_user (by username) are differentiated by descriptions, and get_post vs get_user_posts vs search_posts are clearly separated. Minor potential confusion among the three user-retrieval tools, but descriptions resolve it adequately.

Naming Consistency5/5

All tools follow a consistent snake_case pattern with an x_ prefix and verb_noun structure (e.g., x_get_user, x_create_post, x_reply_post). No deviations in style or convention.

Tool Count5/5

Eight tools is well-scoped for a focused X API server covering basic read and write operations. Each tool earns its place, with no redundant or excessive entries.

Completeness3/5

The surface covers reading posts/users and creating posts/replies, but notable gaps exist: no delete or edit post, no like/retweet, and no follow/unfollow. These missing operations limit common agent workflows.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that provides AI agents with full access to the X (Twitter) API for posting, searching, and managing engagement through natural language. It supports comprehensive tools for tweet management, media uploads, and account analytics across multiple MCP-compatible clients.
    15
    60
    MIT
  • F
    license
    Not graded
    quality
    F
    maintenance
    A local MCP server that exposes the X API (formerly Twitter API) as tools, enabling operations like posting, searching, user management, and more via natural language commands.
    867
    -
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for the Twitter/X API, enabling search, user profiles, tweets, followers, and more via natural language.
    94
    464 npm
    5
    MIT