Skip to main content
Glama
tangivis

twikit-mcp

by tangivis

twikit-mcp

Twitter/X MCP Server — No API Key Required

CI PyPI Python License: MIT

An MCP server that lets Claude (or any MCP-compatible AI agent) interact with Twitter/X using browser cookies. No Twitter API key needed. Free forever.

English | 中文 | 日本語


English

Why twikit-mcp?

twikit-mcp (this project)

Other Twitter MCP servers

Auth

Browser cookies

Twitter API Key

Cost

Free

$200+/month

Setup

2 steps, 2 minutes

Apply for developer account, wait for approval

API

twikit (reverse-engineered)

X API (official, paid)

Quick Start

1. Create cookies.json

  1. Log in to x.com in your browser

  2. Open DevTools (F12) → ApplicationCookieshttps://x.com

  3. Copy ct0 and auth_token

mkdir -p ~/.config/twitter-mcp
cat > ~/.config/twitter-mcp/cookies.json << 'EOF'
{"ct0": "YOUR_CT0", "auth_token": "YOUR_AUTH_TOKEN"}
EOF
chmod 600 ~/.config/twitter-mcp/cookies.json

What are these? ct0 is the CSRF token (~160 hex chars), auth_token is your session token (40 hex chars). They are found in your browser cookies after logging in to x.com. Cookies expire — auth_token typically lasts several months, ct0 may be shorter. Re-extract from your browser when expired.

2. Install & register

Choose one of the following methods:

Option A: uvx — zero-install, fetches each call (slow first run, fast after; cache shared with other uv tools). Best for quick try-out.

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- uvx twikit-mcp

# Or run directly
uvx twikit-mcp

Option B: uv tool install (recommended for daily use) — pinned isolated venv, instant startup, simple upgrade path.

# Install once. Drops a `twikit-mcp` binary on PATH (~/.local/bin).
uv tool install twikit-mcp

# List your installed uv tools (sanity check)
uv tool list

# Upgrade when a new version ships
uv tool upgrade twikit-mcp
# Or upgrade ALL uv-tool-managed binaries at once:
uv tool upgrade --all

# Uninstall (clean removal of the venv + binary)
uv tool uninstall twikit-mcp

Then register with Claude Code (uses the binary on PATH — no uvx prefix):

claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

The cookies file is the same as for every other option: ~/.config/twitter-mcp/cookies.json (or wherever TWITTER_COOKIES env var points). uv tool install doesn't change where config lives — only where the binary lives.

uvx vs uv tool install quick rule: use uvx if you'll call it once or twice (e.g. one-off script). Use uv tool install if it's part of your dev workflow (e.g. wired into Claude Code daily) — startup is instant after the one-time install.

Option C: pip

pip install twikit-mcp

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

# Or run directly
TWITTER_COOKIES=~/.config/twitter-mcp/cookies.json twikit-mcp

Option D: pipx (isolated install — same idea as uv tool install, but with pipx)

pipx install twikit-mcp

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

Using with other MCP clients

This is a standard MCP server (stdio transport). It works with any MCP-compatible client — not just Claude Code.

Add to your MCP client config (e.g. mcp.json, settings.json):

{
  "mcpServers": {
    "twitter": {
      "command": "twikit-mcp",
      "env": {
        "TWITTER_COOKIES": "/home/YOU/.config/twitter-mcp/cookies.json"
      }
    }
  }
}

Works with: Claude Code, Claude Desktop, Cursor, Windsurf, opencode, Cline, Pi, DeepSeek Harness (dsh), etc. — see the Install page.

That's it. Start talking:

> Search tweets about AI
> What did @elonmusk post recently?
> Send a tweet saying: Hello from Claude!

CLI mode (no MCP client needed)

The same twikit-mcp binary doubles as a one-shot CLI. Two modes:

Human-friendly subcommands — pretty-print tweets, profiles, timeline directly:

twikit-mcp tweet 20                     # show tweet 20 (Jack's first one)
twikit-mcp tweet https://x.com/u/status/123    # URL works too
twikit-mcp user elonmusk                # pretty profile
twikit-mcp tl 10                        # last 10 tweets from your home timeline
twikit-mcp search "AI" 5                # 5 top results for "AI"
twikit-mcp trends 20                    # top 20 trending topics

Output is plain text — readable in any terminal, native unicode (no \uXXXX escapes).

Machine-friendly subcommands — raw JSON, key=value args, every one of the 57 MCP tools:

twikit-mcp list                         # all 57 tool names
twikit-mcp call get_user_info screen_name=elonmusk
twikit-mcp call search_tweets query=AI count=5 product=Top
twikit-mcp call get_user_info screen_name=elonmusk | jq .followers_count

MCP server mode — the default when no subcommand is given:

twikit-mcp                              # stdio JSON-RPC for MCP clients
twikit-mcp serve                        # explicit, same behavior

All three modes share the same ~/.config/twitter-mcp/cookies.json — no separate config.

Available Tools

Tool

Description

send_tweet

Post a tweet or reply

get_tweet

Fetch a tweet by ID or URL

get_timeline

Get home timeline

search_tweets

Search tweets (Latest/Top)

like_tweet

Like a tweet

retweet

Retweet a tweet

get_user_info

Get a user's profile metadata by screen_name OR user_id

get_user_tweets

Get tweets from a specific user

get_user_followers

List a user's followers (paginated via cursor, max 100/call)

get_user_following

List who a user follows (paginated via cursor, max 100/call)

follow_user

Follow a user by screen name

unfollow_user

Unfollow a user by screen name

delete_tweet

Delete a tweet by ID

unfavorite_tweet

Unlike a tweet by ID

delete_retweet

Un-retweet a tweet by ID

bookmark_tweet

Bookmark a tweet (optional folder_id)

delete_bookmark

Remove a tweet from bookmarks

get_bookmarks

List bookmarked tweets (paginated via cursor, max 100/call)

get_favoriters

List users who liked a tweet (paginated via cursor, max 100/call)

get_retweeters

List users who retweeted a tweet (paginated via cursor, max 100/call)

search_user

Search for users by query (paginated via cursor, max 100/call)

get_trends

Get trending topics by category (trending/for-you/news/sports/entertainment)

get_article_preview

Get title / preview / cover of an X Article embedded in a tweet (no auth)

get_article

Fetch an X Article's body — format="preview" | "plain" | "full" (default "plain")

block_user

Block a user by screen name (rate-limited — avoid bulk)

unblock_user

Unblock a user by screen name

mute_user

Mute a user by screen name (rate-limited — avoid bulk)

unmute_user

Unmute a user by screen name

get_notifications

Fetch notifications — type="All"|"Verified"|"Mentions" (paginated via cursor, max 100/call)

send_dm

⚠️ Send a PRIVATE DM to a user — do not bulk-call

send_dm_to_group

⚠️ Send a PRIVATE DM to a group conversation — do not bulk-call

get_dm_history

⚠️ Get DM conversation history with a user (private — paginate via max_id)

delete_dm

⚠️ Delete a DM by message ID (private)

xchat_status

Check whether XChat (encrypted DMs) is readable from the local browser store

xchat_list_conversations

⚠️ List XChat conversations with previews (private — read locally, never marks read)

xchat_get_history

⚠️ Read one XChat conversation's decrypted messages (private — local only)

get_list

Get a Twitter List by ID

get_lists

Get authenticated user's Lists (paginated via cursor, max 100/call)

get_list_tweets

Get tweets from a List (paginated via cursor, max 100/call)

get_list_members

Get members of a List (paginated via cursor, max 100/call)

get_list_subscribers

Get subscribers of a List (paginated via cursor, max 100/call)

create_list

Create a new Twitter List (name required; optional description, is_private)

edit_list

Edit a List's metadata — at least one of name/description/is_private required

add_list_member

Add a user to a List by screen_name OR user_id

remove_list_member

Remove a user from a List by screen_name OR user_id

create_scheduled_tweet

Schedule a tweet at a future Unix timestamp (scheduled_at required; at least text or media_ids required)

get_scheduled_tweets

Get all scheduled tweets for the authenticated user

delete_scheduled_tweet

Delete a scheduled tweet by its scheduled_tweet_id

create_poll

Create an X poll card (2-4 choices, duration_minutes > 0); returns card_uri for use with send_tweet

vote

Vote on a poll — requires selected_choice, card_uri, tweet_id, card_name

get_community

Get a Twitter Community by ID

search_community

Search for Communities by query (paginated via cursor)

get_community_tweets

Get tweets from a Community — tweet_type one of Top/Latest/Media (paginated, max 100/call)

get_communities_timeline

Get the joined-communities feed (paginated via cursor, max 100/call)

get_community_members

Get members of a Community (paginated via cursor, max 100/call)

get_community_moderators

Get moderators of a Community (paginated via cursor, max 100/call)

search_community_tweet

Search tweets within a Community by query (paginated via cursor, max 100/call)

join_community

Join a Community by ID

leave_community

Leave a Community by ID

request_to_join_community

Request to join a Community — optional answer for moderated communities

X Articles note: long-form posts at https://x.com/i/article/<id> live in a different ID namespace than tweets. get_tweet refuses them with a clear error pointing to get_article. get_article_preview works without auth via the public syndication endpoint. get_article runs a two-hop reader flow internally: ArticleRedirectScreenQuery resolves the article rest_id to the underlying tweet rest_id, then TweetResultByRestId fetches the tweet's article body. The format arg controls how much of the response makes it through to the LLM:

  • "preview" (~1 KB) — rest_id, title, preview_text, cover_image. Card-display use case.

  • "plain" (~20 KB, default) — adds plain_text, flat media URL list, lifecycle_state. The 80% LLM-reading-an-article case; fits inside Claude Code's MAX_MCP_OUTPUT_TOKENS.

  • "full" (~150 KB+) — raw GraphQL payload including the heavy content_state block tree. Only ask for this if you actually need rich-content rendering / archiving / structure analysis.

Both queryIds are hardcoded like the 80+ other twikit endpoints; if X rotates them, refresh from the public bundle.Articles.*.js / bundle.TwitterArticles.*.js chunks on abs.twimg.com (no auth needed for discovery).

Check version

twikit-mcp --version
# or: twikit-mcp -v
# or: python -m twitter_mcp.server --version

How It Works

You: "Search tweets about AI"
 → Claude Code (understands intent)
 → MCP Protocol (JSON-RPC over stdio)
 → twikit-mcp (this server)
 → twikit (browser-like requests)
 → Twitter GraphQL API

Claude Code automatically manages the server process — it starts when Claude Code launches and stops when it exits. No background services, no manual setup.

Windows

mkdir %APPDATA%\twitter-mcp
# Create cookies.json with your ct0 and auth_token

# uvx
claude mcp add twitter -s user ^
  -e "TWITTER_COOKIES=%APPDATA%\twitter-mcp\cookies.json" ^
  -- uvx twikit-mcp

# Or with pip
pip install twikit-mcp
claude mcp add twitter -s user ^
  -e "TWITTER_COOKIES=%APPDATA%\twitter-mcp\cookies.json" ^
  -- twikit-mcp

Documentation


Related MCP server: x-mcp

中文

为什么选 twikit-mcp?

twikit-mcp(本项目)

其他 Twitter MCP

认证

浏览器 Cookies

Twitter API Key

费用

免费

$200+/月

配置

2 步,2 分钟

申请开发者账号,等审批

API

twikit(逆向工程)

X API(官方,付费)

快速开始

1. 创建 cookies.json

  1. 用浏览器登录 x.com

  2. F12 打开 DevTools → ApplicationCookieshttps://x.com

  3. 复制 ct0auth_token

mkdir -p ~/.config/twitter-mcp
cat > ~/.config/twitter-mcp/cookies.json << 'EOF'
{"ct0": "你的ct0", "auth_token": "你的auth_token"}
EOF
chmod 600 ~/.config/twitter-mcp/cookies.json

这两个值是什么? ct0 是 CSRF token(约160位十六进制),auth_token 是会话 token(40位十六进制),都在浏览器 Cookies 中。Cookies 会过期——auth_token 通常有效数月,ct0 可能更短。过期后从浏览器重新提取即可。

2. 安装 & 注册

选择以下 任一 方式:

方式 A: uvx — 零安装,每次调用拉一份。第一次慢,之后用 cache,跟其他 uv 工具共享。适合临时试用。

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- uvx twikit-mcp

# 或直接运行
uvx twikit-mcp

方式 B: uv tool install (日常使用推荐) — 隔离 venv,启动瞬间,升级简单。

# 一次性安装,在 PATH 上注册一个 `twikit-mcp` 二进制(默认路径 ~/.local/bin)
uv tool install twikit-mcp

# 列出当前 uv 管理的工具(确认装上了)
uv tool list

# 有新版本时升级
uv tool upgrade twikit-mcp
# 或一键升级所有 uv 装的工具:
uv tool upgrade --all

# 卸载(连 venv 一起清掉)
uv tool uninstall twikit-mcp

然后用 PATH 上的二进制注册到 Claude Code(不要再加 uvx 前缀):

claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

cookies 文件位置不变 — 仍然是 ~/.config/twitter-mcp/cookies.json(或者 TWITTER_COOKIES 环境变量指的地方)。uv tool install 只改变二进制的安装位置,不改 config 路径。

uvx vs uv tool install 的简单选择: 一次性 / 偶尔用 → uvx;天天接到 Claude Code 里用 → uv tool install(启动快很多)。

方式 C: pip

pip install twikit-mcp

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

# 或直接运行
TWITTER_COOKIES=~/.config/twitter-mcp/cookies.json twikit-mcp

方式 D: pipx(隔离安装,跟 uv tool install 思路一样,但换工具)

pipx install twikit-mcp

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

在其他 MCP 客户端中使用

这是标准的 MCP server(stdio 传输),不限于 Claude Code,任何支持 MCP 的客户端都能用。

在你的 MCP 客户端配置中添加(如 mcp.jsonsettings.json):

{
  "mcpServers": {
    "twitter": {
      "command": "twikit-mcp",
      "env": {
        "TWITTER_COOKIES": "/home/你的用户名/.config/twitter-mcp/cookies.json"
      }
    }
  }
}

兼容:Claude Code、Claude Desktop、Cursor、Windsurf、opencode、Cline、Pi、DeepSeek Harness(dsh)等 —— 详见安装页

搞定。直接说人话:

> 搜一下关于 AI 的推文
> 看看 @elonmusk 最近发了什么
> 发一条推说:Hello from Claude!

可用工具

工具

功能

怎么用

send_tweet

发推/回复

"发一条推说..."

get_tweet

获取推文

"看看这条推文 [链接]"

get_timeline

刷时间线

"看看我的时间线"

search_tweets

搜索推文

"搜一下关于 XX 的推文"

like_tweet

点赞

"点赞这条推"

retweet

转推

"转推这个"

get_user_info

查看用户资料(screen_nameuser_id 二选一,id/简介/粉丝/头像等)

"查一下 @xxx 的资料"

get_user_tweets

看某人的推

"看看 @xxx 最近发了什么"

get_user_followers

拉某人的粉丝列表(cursor 分页,单次最多 100)

"看看 @xxx 的粉丝"

get_user_following

拉某人关注的人(cursor 分页,单次最多 100)

"@xxx 都关注谁?"

follow_user

关注用户

"关注 @xxx"

unfollow_user

取消关注

"取关 @xxx"

delete_tweet

删除推文

"删除这条推文"

unfavorite_tweet

取消点赞

"取消对这条推的点赞"

delete_retweet

取消转推

"取消转推这条"

bookmark_tweet

收藏推文(可选 folder_id

"收藏这条推文"

delete_bookmark

取消收藏推文

"取消收藏这条推文"

get_bookmarks

获取收藏列表(cursor 分页,单次最多 100)

"看看我的收藏"

get_favoriters

获取点赞某推文的用户(cursor 分页,单次最多 100)

"谁点赞了这条推?"

get_retweeters

获取转推某推文的用户(cursor 分页,单次最多 100)

"谁转推了这条?"

search_user

搜索用户(cursor 分页,单次最多 100)

"搜一下叫 xxx 的用户"

get_trends

获取热门话题(分类:trending/for-you/news/sports/entertainment

"现在有哪些热门话题?"

get_article_preview

拿 X Article 的标题/摘要/封面(无需登录)

"这篇文章在讲什么 [链接]"

get_article

拿 X Article 的正文,format="preview" | "plain" | "full"(默认 "plain")

"把这篇文章读给我听 [链接]"

block_user

屏蔽用户(受频率限制,避免批量操作)

"屏蔽 @xxx"

unblock_user

取消屏蔽用户

"取消屏蔽 @xxx"

mute_user

静音用户(受频率限制,避免批量操作)

"静音 @xxx"

unmute_user

取消静音用户

"取消静音 @xxx"

get_notifications

获取通知(type="All"|"Verified"|"Mentions"cursor 分页,单次最多 100)

"看看我的通知"

send_dm

⚠️ 发送私信给用户,勿批量调用

"私信 @xxx:..."

send_dm_to_group

⚠️ 发送私信到群组,勿批量调用

"发消息到群组..."

get_dm_history

⚠️ 获取与某用户的私信记录(私密,通过 max_id 分页)

"看看和 @xxx 的私信记录"

delete_dm

⚠️ 删除某条私信(私密)

"删除这条私信"

xchat_status

检查本地浏览器里的 XChat(加密私信)能不能读

"XChat 能读吗"

xchat_list_conversations

⚠️ 列出 XChat 会话和预览(私密,纯本地读,不会标记已读)

"看看加密私信有哪些会话"

xchat_get_history

⚠️ 读某个 XChat 会话的解密消息(私密,纯本地)

"读一下和 xxx 的加密私信"

get_list

通过 ID 获取 Twitter 列表

"查看列表 xxx"

get_lists

获取当前用户的所有列表(cursor 分页,单次最多 100)

"我有哪些列表?"

get_list_tweets

获取列表中的推文(cursor 分页,单次最多 100)

"查看列表推文"

get_list_members

获取列表成员(cursor 分页,单次最多 100)

"列表成员有哪些?"

get_list_subscribers

获取列表订阅者(cursor 分页,单次最多 100)

"谁订阅了这个列表?"

create_list

创建新列表(name 必填,可选 descriptionis_private

"新建列表 xxx"

edit_list

编辑列表信息(name/description/is_private 至少提供一个)

"重命名列表"

add_list_member

将用户加入列表(screen_nameuser_id 二选一)

"把 @xxx 加入列表"

remove_list_member

将用户从列表移除(screen_nameuser_id 二选一)

"从列表移除 @xxx"

create_scheduled_tweet

定时发推(scheduled_at 为未来 Unix 时间戳,textmedia_ids 至少提供一个)

"明天发推"

get_scheduled_tweets

获取当前用户的所有定时推文

"有哪些定时推?"

delete_scheduled_tweet

删除定时推文(需提供 scheduled_tweet_id

"取消定时推"

create_poll

创建投票(2-4 个选项,duration_minutes > 0),返回 card_uri

"发起投票"

vote

对投票投票(需提供 selected_choicecard_uritweet_idcard_name

"给这个选项投票"

get_community

通过 ID 获取 Twitter 社区

"查看社区 xxx"

search_community

搜索社区(cursor 分页)

"搜索 Python 社区"

get_community_tweets

获取社区推文(tweet_typeTop/Latest/Media,分页,单次最多 100)

"看看社区最新推文"

get_communities_timeline

获取已加入社区的时间线(cursor 分页,单次最多 100)

"看看社区动态"

get_community_members

获取社区成员(cursor 分页,单次最多 100)

"社区有哪些成员?"

get_community_moderators

获取社区版主(cursor 分页,单次最多 100)

"社区版主是谁?"

search_community_tweet

在社区内搜索推文(cursor 分页,单次最多 100)

"在社区里搜 xxx"

join_community

加入社区

"加入这个社区"

leave_community

退出社区

"退出这个社区"

request_to_join_community

申请加入社区(受限社区可选 answer

"申请加入这个社区"

X Articles 说明:https://x.com/i/article/<id> 这种长文与普通推文是两个 ID 命名空间。get_tweet 遇到 article URL 会直接拒绝并提示用 get_articleget_article_preview 走公共 syndication 端点,不需要登录。get_article 内部是两跳 reader 流程,通过 format 参数控制返回大小:

  • "preview" (~1 KB) — rest_id / title / preview_text / cover_image,卡片场景

  • "plain" (~20 KB,默认) — 上面 + plain_text + 扁平化 media URL 列表 + lifecycle_state,LLM 读全文的 80% 场景,刚好放得下 Claude Code 的 MAX_MCP_OUTPUT_TOKENS

  • "full" (~150 KB+) — 原始 GraphQL 响应,含庞大的 content_state 富文本块树,只在做富文本渲染/归档/结构分析时才需要

两个 queryId 都跟其他 80+ 端点一样硬编码 — 如果 X 改了 hash,从公开的 bundle.Articles.*.js / bundle.TwitterArticles.*.js chunk 里 grep 出新值即可,无需登录态。

查看版本

twikit-mcp --version
# 或:twikit-mcp -v
# 或:python -m twitter_mcp.server --version

工作原理

你:"搜一下关于 AI 的推文"
 → Claude Code(理解意图)
 → MCP 协议(JSON-RPC,stdio 通信)
 → twikit-mcp(本 server)
 → twikit(模拟浏览器请求)
 → Twitter GraphQL API

Claude Code 自动管理 server 进程——启动时拉起,退出时关闭。不需要手动运行任何东西,不占后台资源。

Windows

mkdir %APPDATA%\twitter-mcp
# 创建 cookies.json,写入 ct0 和 auth_token

# uvx
claude mcp add twitter -s user ^
  -e "TWITTER_COOKIES=%APPDATA%\twitter-mcp\cookies.json" ^
  -- uvx twikit-mcp

# 或使用 pip
pip install twikit-mcp
claude mcp add twitter -s user ^
  -e "TWITTER_COOKIES=%APPDATA%\twitter-mcp\cookies.json" ^
  -- twikit-mcp

文档

  • 技术文档 — 架构、MCP 原理、配置详解、跨机器部署

  • 贡献指南 — 测试、CI/CD、如何添加新工具


日本語

なぜ twikit-mcp?

twikit-mcp(本プロジェクト)

他の Twitter MCP

認証

ブラウザ Cookie

Twitter API Key

料金

無料

$200+/月

セットアップ

2ステップ、2分

開発者アカウント申請、承認待ち

API

twikit(リバースエンジニアリング)

X API(公式、有料)

クイックスタート

1. cookies.json の作成

  1. ブラウザで x.com にログイン

  2. F12 で DevTools を開く → ApplicationCookieshttps://x.com

  3. ct0auth_token をコピー

mkdir -p ~/.config/twitter-mcp
cat > ~/.config/twitter-mcp/cookies.json << 'EOF'
{"ct0": "あなたのct0", "auth_token": "あなたのauth_token"}
EOF
chmod 600 ~/.config/twitter-mcp/cookies.json

これは何? ct0 は CSRF トークン(約160桁の16進数)、auth_token はセッショントークン(40桁の16進数)で、ブラウザの Cookie から取得します。Cookie は有効期限があります — auth_token は通常数ヶ月、ct0 はより短い場合があります。期限切れの際はブラウザから再取得してください。

2. インストール & 登録

以下の いずれか の方法を選んでください:

方法 A: uvx — ゼロインストール、毎回フェッチ。初回のみ遅い、以降はキャッシュで高速。お試し向け。

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- uvx twikit-mcp

# または直接実行
uvx twikit-mcp

方法 B: uv tool install(日常利用に推奨)— 専用 venv で隔離インストール、起動が瞬時、アップグレードも簡単。

# 一度だけインストール。PATH (~/.local/bin) に `twikit-mcp` バイナリを配置
uv tool install twikit-mcp

# uv tool 管理下のツール一覧(確認用)
uv tool list

# 新バージョンが出たらアップグレード
uv tool upgrade twikit-mcp
# uv で入れた全ツールを一括アップグレード:
uv tool upgrade --all

# アンインストール(venv ごと削除)
uv tool uninstall twikit-mcp

PATH 上のバイナリで Claude Code に登録(uvx プレフィックス不要):

claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

cookies ファイルの場所は他のオプションと同じ~/.config/twitter-mcp/cookies.json (もしくは TWITTER_COOKIES 環境変数)。uv tool install が変えるのはバイナリの場所だけで、設定ファイルの場所は変わりません。

uvx と uv tool install の使い分け: 一回だけ / たまに → uvx;Claude Code に組み込んで毎日使う → uv tool install(起動が圧倒的に速い)。

方法 C: pip

pip install twikit-mcp

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

# または直接実行
TWITTER_COOKIES=~/.config/twitter-mcp/cookies.json twikit-mcp

方法 D: pipx(隔離インストール — uv tool install と同じ思想、ツール違い)

pipx install twikit-mcp

# Claude Code
claude mcp add twitter -s user \
  -e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
  -- twikit-mcp

他の MCP クライアントでの使用

これは標準的な MCP サーバー(stdio トランスポート)です。Claude Code 専用ではなく、MCP 対応のすべてのクライアントで使用できます。

MCP クライアントの設定ファイル(mcp.jsonsettings.json など)に追加:

{
  "mcpServers": {
    "twitter": {
      "command": "twikit-mcp",
      "env": {
        "TWITTER_COOKIES": "/home/ユーザー名/.config/twitter-mcp/cookies.json"
      }
    }
  }
}

対応クライアント:Claude Code、Claude Desktop、Cursor、Windsurf、opencode、Cline、Pi、DeepSeek Harness(dsh)など —— インストールページを参照。

以上です。自然言語で話しかけてください:

> AIに関するツイートを検索して
> @elonmusk の最近の投稿を見せて
> 「Hello from Claude!」とツイートして

利用可能なツール

ツール

機能

使い方

send_tweet

ツイート投稿・返信

「〜とツイートして」

get_tweet

ツイート取得

「このツイートを見て [URL]」

get_timeline

タイムライン取得

「タイムラインを見せて」

search_tweets

ツイート検索

「〜について検索して」

like_tweet

いいね

「このツイートにいいねして」

retweet

リツイート

「これをリツイートして」

get_user_info

ユーザープロフィール取得(screen_nameuser_id のどちらか、id/bio/フォロワー数/アイコンなど)

「@xxx のプロフィールを見せて」

get_user_tweets

ユーザーのツイート取得

「@xxx の最近の投稿を見せて」

get_user_followers

フォロワー一覧取得(cursor でページング、1 回最大 100)

「@xxx のフォロワーを見せて」

get_user_following

フォロー中の一覧取得(cursor でページング、1 回最大 100)

「@xxx は誰をフォローしてる?」

follow_user

ユーザーをフォロー

「@xxx をフォロー」

unfollow_user

フォロー解除

「@xxx をフォロー解除」

delete_tweet

ツイート削除

「このツイートを削除して」

unfavorite_tweet

いいね取り消し

「このツイートのいいねを取り消して」

delete_retweet

リツイート取り消し

「このリツイートを取り消して」

bookmark_tweet

ブックマーク追加(folder_id オプション)

「このツイートをブックマークして」

delete_bookmark

ブックマーク削除

「このブックマークを削除して」

get_bookmarks

ブックマーク一覧取得(cursor でページング、1 回最大 100)

「ブックマークを見せて」

get_favoriters

ツイートにいいねしたユーザー一覧(cursor でページング、1 回最大 100)

「このツイートにいいねした人は?」

get_retweeters

ツイートをリツイートしたユーザー一覧(cursor でページング、1 回最大 100)

「誰がリツイートした?」

search_user

ユーザー検索(cursor でページング、1 回最大 100)

「〜というユーザーを検索して」

get_trends

トレンド取得(カテゴリ:trending/for-you/news/sports/entertainment

「今のトレンドを見せて」

get_article_preview

X Article のタイトル/プレビュー/カバー画像取得(認証不要)

「この記事の概要を教えて [URL]」

get_article

X Article の本文取得、format="preview" | "plain" | "full"(デフォルト "plain")

「この記事を読んで [URL]」

block_user

ユーザーをブロック(レート制限あり — 一括使用禁止)

「@xxx をブロック」

unblock_user

ユーザーのブロックを解除

「@xxx のブロックを解除」

mute_user

ユーザーをミュート(レート制限あり — 一括使用禁止)

「@xxx をミュート」

unmute_user

ユーザーのミュートを解除

「@xxx のミュートを解除」

get_notifications

通知取得(type="All"|"Verified"|"Mentions"cursor でページング、1 回最大 100)

「通知を見せて」

send_dm

⚠️ ユーザーにダイレクトメッセージを送信 — 一括送信禁止

「@xxx にDMして:...」

send_dm_to_group

⚠️ グループにダイレクトメッセージを送信 — 一括送信禁止

「グループにメッセージ送信...」

get_dm_history

⚠️ ユーザーとの DM 履歴取得(プライベート、max_id でページング)

「@xxx との DM 履歴を見せて」

delete_dm

⚠️ DM を削除(プライベート)

「この DM を削除して」

xchat_status

ローカルブラウザの XChat(暗号化 DM)が読めるか確認

「XChat は読める?」

xchat_list_conversations

⚠️ XChat 会話一覧とプレビュー(プライベート、ローカル読み取り、既読にしない)

「暗号化 DM の一覧を見せて」

xchat_get_history

⚠️ XChat 会話の復号済みメッセージを読む(プライベート、ローカルのみ)

「@xxx との暗号化 DM を読んで」

get_list

ID でリストを取得

「リスト xxx を見せて」

get_lists

自分のリスト一覧取得(cursor でページング、1 回最大 100)

「自分のリストは?」

get_list_tweets

リストのツイート取得(cursor でページング、1 回最大 100)

「リストのツイートを見せて」

get_list_members

リストのメンバー取得(cursor でページング、1 回最大 100)

「リストのメンバーは?」

get_list_subscribers

リストの購読者取得(cursor でページング、1 回最大 100)

「誰がリストを購読している?」

create_list

リストを作成(name 必須、descriptionis_private は任意)

「リスト xxx を作成して」

edit_list

リスト情報を編集(name/description/is_private のいずれか必須)

「リスト名を変更して」

add_list_member

リストにユーザーを追加(screen_nameuser_id どちらか一方)

「@xxx をリストに追加して」

remove_list_member

リストからユーザーを削除(screen_nameuser_id どちらか一方)

「@xxx をリストから削除して」

create_scheduled_tweet

予約投稿(scheduled_at は未来の Unix タイムスタンプ、text または media_ids のどちらかが必須)

「明日ツイートして」

get_scheduled_tweets

予約中のツイート一覧を取得

「予約ツイートは?」

delete_scheduled_tweet

予約ツイートを削除(scheduled_tweet_id 必須)

「予約を取り消して」

create_poll

投票を作成(選択肢 2-4 個、duration_minutes > 0)、card_uri を返す

「投票を作って」

vote

投票する(selected_choicecard_uritweet_idcard_name すべて必須)

「この選択肢に投票して」

get_community

ID でコミュニティを取得

「コミュニティ xxx を見せて」

search_community

クエリでコミュニティを検索(cursor でページング)

「Python コミュニティを探して」

get_community_tweets

コミュニティのツイートを取得(tweet_typeTop/Latest/Media、最大 100 件)

「コミュニティの最新投稿を見せて」

get_communities_timeline

参加済みコミュニティのタイムラインを取得(cursor でページング、最大 100 件)

「コミュニティのフィードを見せて」

get_community_members

コミュニティのメンバー一覧を取得(cursor でページング、最大 100 件)

「コミュニティのメンバーは?」

get_community_moderators

コミュニティのモデレーター一覧を取得(cursor でページング、最大 100 件)

「モデレーターは誰?」

search_community_tweet

コミュニティ内のツイートを検索(cursor でページング、最大 100 件)

「このコミュニティで xxx を検索して」

join_community

コミュニティに参加

「このコミュニティに参加して」

leave_community

コミュニティを退出

「このコミュニティを退出して」

request_to_join_community

コミュニティへの参加申請(審査制コミュニティは answer も任意)

「このコミュニティへの参加を申請して」

X Articles について:https://x.com/i/article/<id> の長文記事はツイートとは別の ID 名前空間に属します。get_tweet は article URL を渡されると拒否し、get_article を案内します。get_article_preview は公開 syndication エンドポイント経由で認証不要。get_article は内部で 2 ホップ reader フローを走り、format 引数で出力サイズを制御:

  • "preview" (~1 KB) — rest_id / title / preview_text / cover_image、カード表示用途

  • "plain" (~20 KB、デフォルト) — 上記 + plain_text + フラットな media URL リスト + lifecycle_state、LLM が記事を読む 80% のケース、Claude Code の MAX_MCP_OUTPUT_TOKENS に収まる

  • "full" (~150 KB+) — 重い content_state ブロックツリーを含む生 GraphQL レスポンス、リッチコンテンツのレンダリング・アーカイブ・構造解析が必要な場合のみ

どちらの queryId も他の 80+ エンドポイント同様ハードコードされており、X がハッシュをローテートした場合は公開されている bundle.Articles.*.js / bundle.TwitterArticles.*.js チャンクから新しいハッシュを取得できます(認証不要)。

バージョン確認

twikit-mcp --version
# または: twikit-mcp -v
# または: python -m twitter_mcp.server --version

仕組み

あなた:「AIに関するツイートを検索して」
 → Claude Code(意図を理解)
 → MCP プロトコル(JSON-RPC、stdio 通信)
 → twikit-mcp(本サーバー)
 → twikit(ブラウザリクエストをシミュレート)
 → Twitter GraphQL API

Claude Code がサーバープロセスを自動管理します。起動時にプロセスを立ち上げ、終了時に自動停止。手動操作やバックグラウンドサービスは不要です。

Windows

mkdir %APPDATA%\twitter-mcp
# cookies.json を作成し、ct0 と auth_token を記入

# uvx
claude mcp add twitter -s user ^
  -e "TWITTER_COOKIES=%APPDATA%\twitter-mcp\cookies.json" ^
  -- uvx twikit-mcp

# または pip
pip install twikit-mcp
claude mcp add twitter -s user ^
  -e "TWITTER_COOKIES=%APPDATA%\twitter-mcp\cookies.json" ^
  -- twikit-mcp

ドキュメント


License

MIT

Built with twikit and MCP

Available Tools

62 tools
add_list_memberA

Add a user to a Twitter List.

Caller must provide exactly one of screen_name / user_id.

Args: list_id: The list ID (required). screen_name: Twitter username (without @). user_id: Twitter numeric user ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYes
user_idNo
screen_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/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 of behavioral transparency. It only states the action and the exclusivity constraint, but does not disclose side effects, required permissions, idempotency, or error behavior (e.g., if the user is already a member). This is a significant gap for a mutating 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?

The description is concise and front-loaded, with the action in the first sentence, followed by a critical usage constraint, and then a clear, structured 'Args' list. Every sentence adds value with no 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 simple 3-parameter tool, the description covers the purpose, the necessary constraint, and each parameter's meaning. Since an output schema exists, return value documentation is not required. Minor missing context includes when to use alternative list-member tools, but overall the description is adequately complete for the tool's simplicity.

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

Parameters5/5

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

The schema has no descriptions (0% coverage), so the description's parameter explanations are vital. It clearly specifies that 'list_id' is required, 'screen_name' is a Twitter username without '@', and 'user_id' is numeric. It also conveys the critical rule that exactly one of screen_name/user_id must be provided, which is not obvious from 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?

The description clearly states 'Add a user to a Twitter List' with a specific verb and resource. It distinguishes itself from sibling tools like remove_list_member and get_list_members by indicating a write/add operation.

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 provides an important usage constraint: 'Caller must provide exactly one of screen_name / user_id.' However, it does not explicitly mention when to use this tool versus alternatives (e.g., remove_list_member for removal or get_list_members for viewing). The usage 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.

block_userA

Block a user by screen name.

Note: X aggressively rate-limits / risk-scans block + mute. Avoid bulk usage or your account may be temporarily restricted.

Args: screen_name: Twitter username (without @).

ParametersJSON Schema
NameRequiredDescriptionDefault
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Discloses that X aggressively rate-limits and risk-scans block and mute actions, warning of account restriction for bulk usage. This is useful beyond the input schema, though more details on the effects of blocking could be included.

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?

Concise and well-structured: a clear purpose sentence, a warning note, and parameter description. No unnecessary words.

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's simplicity and presence of an output schema, the description covers essential aspects. However, it could mention that blocking is reversible via unblock_user, which is a relevant contextual detail.

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

Parameters5/5

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

Adds crucial format instruction for the screen_name parameter: 'Twitter username (without @)', which is missing from the schema (0% coverage). This fully compensates for the schema gap.

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 'Block a user by screen name', specifying the verb 'block', resource 'user', and method. This distinguishes it from sibling tools like mute_user and unblock_user.

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?

Provides a note about rate-limiting and avoiding bulk usage, which serves as when-not-to-use guidance. However, it does not explicitly compare to alternatives like mute_user.

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

bookmark_tweetB

Bookmark a tweet. Optionally add it to a bookmark folder.

Args: tweet_id: The tweet ID to bookmark. folder_id: Optional bookmark folder ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes
folder_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, placing the full burden on the description. It only states the basic action and does not disclose idempotency, error cases, authentication needs, or consequences of bookmarking (e.g., if the tweet is later deleted).

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 extremely concise, front-loaded with the action, and includes an arg list that is easy to scan. Every sentence earns its place with no fluff.

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 two-parameter tool with an output schema, the description covers the core operation but omits edge-case behavior such as invalid tweet IDs or folder requirements. It is minimally viable but has 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%, and the description's Args section only repeats parameter names with minimal clarifications. It adds little beyond the schema titles and does not explain value formats or behavioral implications (e.g., whether folder_id must exist).

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 action ('Bookmark a tweet') and the optional folder feature. It uniquely identifies this tool among siblings like like_tweet and delete_bookmark.

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?

No explicit when-to-use or alternative guidance is provided. The purpose implies the use case, but the description does not contrast with similar actions like liking or deleting bookmarks.

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

create_listA

Create a new Twitter List.

Args: name: The name for the new list (required, must not be empty). description: Description for the list (default empty). is_private: If True, the list is private (default False = public).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
is_privateNo
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description must fully cover behavioral traits. It explains parameter constraints (name required, defaults) but does not disclose authentication needs, rate limits, or what happens on failure or success. The output schema is not referenced.

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 a concise docstring with a clear purpose statement and a structured Args section. Every sentence adds value without 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?

The description adequately covers parameters and purpose. Given an output schema exists, it does not need to detail return values, but mentioning that the created list is returned would improve completeness.

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

Parameters5/5

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

The description adds significant meaning beyond the input schema: it specifies that name must not be empty, and gives default values for description and is_private. This compensates for the 0% schema 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 starts with 'Create a new Twitter List,' which clearly states the action and resource. This distinguishes it from sibling tools like edit_list, get_lists, and remove_list_member.

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?

While it clearly says when to use the tool (to create a list), it does not explicitly mention when not to use it or provide alternatives. However, the sibling context implies creation is distinct from editing or deleting lists.

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

create_pollA

Create an X poll and return its card URI.

X polls have 2-4 choices and a duration in minutes. Pass the returned card_uri to send_tweet's poll_uri parameter to attach the poll.

Args: choices: Poll choices (2-4 entries required; each must be non-empty). duration_minutes: Poll duration in minutes (must be > 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
choicesYes
duration_minutesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses that the tool creates a poll (mutation) and returns a card_uri. It specifies constraints (2-4 choices, duration >0) and the integration with send_tweet. No annotations are provided, so the description carries full responsibility; it is sufficiently 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?

The description is concise with three clear sections: summary, constraints and usage, and parameter details. Every sentence adds value, and the most important information appears first.

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?

The description covers the creation behavior, constraints, and integration with send_tweet. It mentions the return value (card_uri). While an output schema exists but isn't shown, the description handles it adequately. Missing details like error handling are minor for this simple tool.

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

Parameters5/5

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

The input schema has 0% description coverage, but the description fully compensates by specifying that 'choices' must be a non-empty array of 2-4 strings and 'duration_minutes' must be >0. This adds complete semantic meaning 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?

The description clearly states the action ('Create an X poll') and the return value ('return its card URI'), making the tool's purpose unambiguous. It also explains the relationship with send_tweet, differentiating it from other tweet-related tools.

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

Usage Guidelines4/5

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

The description provides a clear workflow: create the poll, then pass the card_uri to send_tweet. However, it does not explicitly state when not to use this tool or mention alternatives, though no direct alternative exists for poll creation.

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

create_scheduled_tweetA

Schedule a tweet to be posted at a future Unix timestamp.

Scheduled tweets follow X's standard rate limits, no special caveats needed.

Args: scheduled_at: Unix epoch seconds when the tweet should be posted (must be in the future). text: Tweet text. At least one of text or media_ids must be provided. media_ids: List of media IDs to attach to the scheduled tweet.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
media_idsNo
scheduled_atYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

The description discloses rate-limit behavior ('follow X's standard rate limits') and notes 'no special caveats needed,' which is useful. However, with no annotations, it carries the full burden and does not address potential side effects, permission requirements, or error behavior beyond the input constraints.

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 tightly written: a clear purpose sentence, a useful rate-limit note, and a well-organized Args list. Every sentence earns its place, and there is no redundancy or filler.

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 3-parameter tool with an output schema, the description covers the essential purpose, all parameter semantics, and a key behavioral trait. Minor gaps like error conditions and lifecycle management (retrieval/deletion) are not explicitly mentioned, but the output schema and sibling tools help fill those gaps, so it is nearly complete.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully compensates by explaining all three parameters. It defines scheduled_at as Unix epoch seconds and requires future values, clarifies the dependency that at least one of text or media_ids must be provided, and describes media_ids as a list of attachment IDs.

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 ('Schedule') and resource ('a tweet') with a clear temporal scope ('future Unix timestamp'). This distinguishes it from immediate-posting siblings like send_tweet, and the purpose is unambiguous.

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 first sentence provides clear context for when to use this tool: to schedule a tweet for a future time. It doesn't explicitly name alternatives or exclusions, but the 'future' constraint inherently signals that this is not for immediate posting, giving clear context without needing to mention send_tweet.

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

delete_bookmarkA

Remove a tweet from bookmarks.

Args: tweet_id: The tweet ID to un-bookmark.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/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 the destructive action ('remove'), but does not disclose side effects, idempotency, permissions, or error behavior. It is not misleading, and given the simplicity of the tool, the core behavior is adequately conveyed, but significant behavioral context is missing.

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 extremely concise: a single sentence plus a parameter explanation. Every word earns its place, and the purpose is front-loaded. There is no fluff or repetition, making it easy for an agent to parse quickly.

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?

The tool is simple (one required parameter) and an output schema exists, so the description does not need to explain return values. The description sufficiently covers the core purpose and parameter semantics for an agent to select and invoke the tool correctly in most cases. It lacks usage guidance and behavioral edge cases, but those are addressed in other dimensions, and for the tool's simplicity, this is nearly complete.

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?

The description adds minimal value beyond the input schema. The schema already names the parameter 'tweet_id' and describes it as 'Tweet Id.' The description says 'The tweet ID to un-bookmark,' which essentially restates the parameter's name and the tool's purpose. It does not clarify the allowed integer/string ambiguity, format expectations, or how to obtain the ID, leaving the agent with the same information as the schema alone.

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 function with a specific verb and resource: 'Remove a tweet from bookmarks.' This distinguishes it from sibling tools like bookmark_tweet (add) and get_bookmarks (list), and there is no ambiguity about its scope.

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 usage is implied by the purpose and the unambiguous name, but there is no explicit guidance about when to use this tool versus alternatives, nor any mention of prerequisites or exclusions. It simply says 'Remove a tweet from bookmarks,' which inherently communicates when to use it, but does not proactively clarify edge cases or compare with related tools.

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

delete_dmA

Delete a direct message by ID.

Note: Deletes a PRIVATE message. Do not bulk-call. X has aggressive anti-spam on DMs and may suspend the account.

Args: message_id: The message ID to delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that the tool targets private messages and highlights the anti-spam and suspension risk, which adds important behavioral context beyond a generic 'delete' operation.

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 brief and front-loaded: a single action sentence, a critical safety note, and a minimal args list. Every sentence earns its place without 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 simple delete tool with one parameter and an output schema present, the description adequately covers the action, the primary risk, and the parameter. It could optionally reference get_dm_history for locating message IDs, but that is not essential for the tool's core function.

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?

The schema description coverage is 0%, and the description's Args section only says 'message_id: The message ID to delete.' This is essentially a restatement of the schema's 'Message Id' label and fails to explain how to obtain the ID or any format/type nuances, relying on the schema's type information.

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 'Delete a direct message by ID' with a specific verb (delete), a clear resource (direct message), and the method (by ID). This distinguishes it from sibling tools like delete_tweet and delete_retweet.

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 practical warning: 'Deletes a PRIVATE message. Do not bulk-call. X has aggressive anti-spam on DMs and may suspend the account.' This tells the agent when to exercise caution and the risk of misuse, though it does not explicitly mention alternatives.

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

delete_retweetA

Un-retweet a tweet by ID.

Args: tweet_id: The tweet ID to un-retweet.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden of behavioral transparency. It only states the action without disclosing side effects, error conditions, permissions, or rate limits. For a mutation tool, this is insufficient.

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 extremely concise: a single sentence plus an Args block. It front-loads the core purpose and keeps every word useful, with no filler or irrelevant detail.

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-parameter tool, the description covers the basic operation and parameter semantics. However, it lacks context about potential failure modes (e.g., what happens if the tweet hasn't been retweeted), authentication requirements, or return value. Since no output schema or annotations are provided, the description leaves some gaps, but the tool is simple enough that this is barely acceptable.

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 input schema provides no parameter descriptions (0% coverage), and the description adds a one-line explanation: 'tweet_id: The tweet ID to un-retweet.' This clarifies the purpose of the parameter beyond its title 'Tweet Id', but it does not provide additional details like format constraints or context. This is a modest improvement over 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?

The description clearly states the action: 'Un-retweet a tweet by ID.' This uses a specific verb and resource, and the sibling tool 'retweet' confirms this is the inverse operation, distinguishing it from related tools like 'delete_tweet'.

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 does not explicitly state when to use this tool or when to avoid it. The purpose is obvious from the name and description, but there is no guidance on alternatives or conditions (e.g., only for tweets the user has retweeted). Usage is implied but not explicitly framed.

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

delete_scheduled_tweetA

Delete a scheduled tweet by its scheduled tweet ID.

Scheduled tweets follow X's standard rate limits, no special caveats needed.

Args: scheduled_tweet_id: The ID of the scheduled tweet (from create_scheduled_tweet or get_scheduled_tweets). This is NOT a regular tweet ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
scheduled_tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. It adds a useful note about rate limits and the ID source, but doesn't describe the consequences of deletion (e.g., irreversibility) or any permissions required. For a simple delete operation, this is acceptable but not deeply 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?

The description is concise and well-structured: a clear one-sentence purpose, a brief rate-limit note, and a neatly formatted Args section. No redundant information, every sentence 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?

Given it's a single-parameter delete tool with an output schema, the description covers the essential usage: what it does, the ID sourcing, and rate limits. It lacks explicit ownership/precondition statements, but those are likely implicit in the broader API context. Overall, it's sufficiently complete for an agent to use it correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully compensates by explaining the parameter's source (from create_scheduled_tweet or get_scheduled_tweets) and explicitly warning against confusing it with a regular tweet ID. This adds significant meaning beyond the raw 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?

The description clearly states 'Delete a scheduled tweet by its scheduled tweet ID' with a specific verb and resource. It distinguishes from sibling tools like delete_tweet by emphasizing the scheduled tweet ID and explicitly noting 'This is NOT a regular tweet ID.'

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 clarifies that the ID comes from create_scheduled_tweet or get_scheduled_tweets, giving context for when to use the tool. It doesn't explicitly name delete_tweet as an alternative for regular tweets, but the 'NOT a regular tweet ID' warning implies this exclusion, providing adequate guidance.

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

delete_tweetB

Delete a tweet by ID.

Args: tweet_id: The tweet ID to delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It only states the delete action without mentioning permanence, permissions, rate limits, or side effects. For a destructive operation, this is a significant gap.

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 short, front-loaded, and free of fluff. The main purpose is in the first sentence, and the parameter is listed cleanly. It could be considered under-specified, but for what it contains, it is efficiently structured.

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-parameter delete tool, the description is minimally adequate. However, it omits behavioral details (e.g., irreversible deletion, required ownership) that would make it fully contextually complete. With an output schema present, return value omission is acceptable, but usage conditions are not fully addressed.

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%, but the 'Args' section merely restates 'tweet_id: The tweet ID to delete', which adds little beyond the schema property name. It does not clarify the integer/string ambiguity or provide format expectations, so the description fails to compensate for the coverage gap.

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 'Delete a tweet by ID' which uses a specific verb ('Delete') and resource ('tweet by ID'). It clearly distinguishes from sibling tools like delete_retweet or delete_bookmark by specifying the target is a tweet.

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 the tool is used when you need to delete a tweet, but provides no explicit guidance on when to use it versus alternatives (e.g., delete_retweet) or any prerequisites/exclusions. The context is straightforward but not fully elaborated.

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

download_tweet_videoA

Download video(s) attached to a tweet via yt-dlp.

Args: tweet_id: Tweet ID (numeric string) or full URL. output_dir: Where to save. Default: $TWIKIT_DOWNLOAD_DIR or ~/Downloads/twikit-mcp/. format: yt-dlp format selector. Default "best[ext=mp4]" (single muxed mp4, no ffmpeg required). Pass "bestvideo+bestaudio" for separate-stream max-quality merge (requires ffmpeg).

Returns: JSON with path, size_bytes, duration_sec, format, width, height, url, tweet_id. Raises ToolError if yt-dlp / ffmpeg is missing, the tweet has no video, or download fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNobest[ext=mp4]
tweet_idYes
output_dirNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Since no annotations are provided, the description carries the full transparency burden. It discloses dependency requirements (yt-dlp, ffmpeg), default output directory, format selection behavior (with ffmpeg requirement for 'bestvideo+bestaudio'), and failure modes (raises ToolError if yt-dlp/ffmpeg missing, no video, or download fails). This is comprehensive behavioral disclosure beyond the schema.

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 structured into a one-sentence summary, a parameter list, and a returns/errors section. It is moderately sized but every sentence provides useful information—no filler. The clear formatting (Args/Returns) makes it easy to scan and understand.

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?

The tool has moderate complexity (external dependencies, multiple parameters, formatting options, error conditions). The description covers the purpose, all parameters with defaults, return JSON fields, and error scenarios. It also notes when ffmpeg is required. This is complete for the tool's complexity, and the output schema further supplements the return type details.

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

Parameters5/5

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

The input schema provides only titles and types with zero descriptions. The description compensates fully by explaining each parameter: tweet_id accepts numeric ID or URL, output_dir has a default from environment variable or fallback path, and format defaults to 'best[ext=mp4]' with explanation of when to use 'bestvideo+bestaudio'. This adds substantial meaning beyond the bare schema, which is especially critical given 0% schema description 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 opens with 'Download video(s) attached to a tweet via yt-dlp', which clearly identifies the action (download), the resource (videos attached to a tweet), and the method (yt-dlp). This is a specific verb+resource statement that distinguishes this tool from all sibling tools, none of which handle video downloads.

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 states the exact use case—downloading videos from a tweet—which is clear context for when to use the tool. It does not explicitly mention alternatives or when not to use it, but given the tool's unique functionality among siblings, the implied usage is sufficient. No exclusions or contradictory guidance are present.

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

edit_listA

Edit a Twitter List's metadata.

At least one of name, description, or is_private must be provided. Pass an empty string for description to clear it.

Args: list_id: The list ID (required). name: New name for the list. description: New description (empty string clears it). is_private: True to make private, False to make public.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
list_idYes
is_privateNo
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/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. It clearly indicates this is a mutation ('Edit') and additionally discloses the empty-string-clears-description behavior. However, it omits potential side effects, permission requirements, or error scenarios, leaving some behavioral aspects 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?

The description is succinct and well-structured: one sentence for purpose, one for constraints, one for special behavior, then a clean parameter list. No redundant filler; every sentence contributes actionable information.

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 edit tool with an output schema, the description covers the essential inputs and constraints. The lack of mention of return values is mitigated by the existence of an output schema. It could add permission context or error handling, but overall it's largely complete for this complexity.

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

Parameters5/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. It explains each parameter: list_id is required, name is the new name, description can be cleared with an empty string, and is_private sets privacy. The empty-string behavior and the at-least-one-field constraint add meaning beyond the raw 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?

The description clearly states the action 'Edit a Twitter List's metadata' and lists the editable fields (name, description, is_private). This distinguishes it from sibling tools like create_list (create), get_list (retrieve), and add_list_member (add member), making the purpose unambiguous.

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?

Provides explicit usage prerequisites: 'At least one of name, description, or is_private must be provided' and explains how to clear the description. While it doesn't explicitly compare to alternatives, the context of editing an existing list is clear from the purpose and the parameter details.

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

follow_userA

Follow a user by screen name.

Note: X aggressively rate-limits follow / unfollow — avoid bulk usage or your account may be temporarily restricted.

Args: screen_name: Twitter username (without @).

ParametersJSON Schema
NameRequiredDescriptionDefault
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/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. It discloses that X aggressively rate-limits follow/unfollow and that bulk usage may lead to temporary restrictions. This is valuable behavioral context beyond the tool's basic function.

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 extremely concise: two sentences for the purpose and warning, followed by an Args line. Every word serves a purpose, and the critical information is front-loaded.

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 action tool with no annotations, the description covers purpose, usage guidelines, and parameter format. It does not describe the return value, but the tool is simple and the context is sufficient for correct invocation.

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

Parameters4/5

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

The schema has 0% description coverage, so the description compensates. It clarifies that screen_name expects a Twitter username without the '@' symbol, adding meaning beyond the schema's type and title.

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 'Follow a user by screen name' clearly states the action (follow) and the target (user) and the method (by screen name). It distinguishes itself from siblings like 'unfollow_user' and 'mute_user', making the tool's purpose unambiguous.

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 explicitly warns about aggressive rate limiting and advises against bulk usage, which provides important usage context. However, it does not specify when not to use or list alternatives, though for this simple action, the guidance is adequate.

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

get_articleA

Fetch an X Article (long-form post) by rest_id or URL.

Two-hop reader flow (issue #10):

  1. ArticleRedirectScreenQuery resolves the article rest_id to the underlying tweet rest_id.

  2. TweetResultByRestId (twikit's existing helper) fetches the tweet with article fieldToggles enabled. The body lives at tweet.article.article_results.result.

Requires authentication via cookies — same as every other authenticated tool here. No env-var setup.

Args: article_id: Article rest_id (numeric string) or full /i/article/ URL. format: Output shape, one of: - "preview" (~1 KB) — rest_id, title, preview_text, cover_image - "plain" (~20 KB, default) — above + plain_text + media URL list + lifecycle_state. The LLM-friendly shape. - "full" (~150 KB+) — raw GraphQL payload including the heavy content_state rich-block tree. Use only when you need it (rich-content rendering, archiving, structure analysis).

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoplain
article_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/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. It discloses the two-hop reader flow, output sizes and fields for each format (e.g., 'preview' ~1 KB, 'full' ~150 KB+), and the response body location. It lacks explicit statements about failure modes or side effects, but as a read operation, the coverage is strong.

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 well-structured with a clear first sentence, a detailed but relevant flow explanation, and a bulleted args list. The two-hop flow might seem technical, but it's directly useful for understanding behavior and debugging. No redundant sentences.

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

Completeness5/5

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

Given the tool's moderate complexity (2 params, 3 output formats) and the presence of an output schema, the description is highly complete. It covers the full request/response landscape: what is fetched, how it works, parameter options, output sizes, and required auth. There are no obvious gaps for an agent to invoke it correctly.

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

Parameters5/5

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

Schema coverage is 0%, so the description must fully explain both parameters. It does so excellently: article_id is defined as 'Article rest_id (numeric string) or full /i/article/<id> URL,' and format lists each option with size, included fields, and a recommendation for when to use it. This fully compensates for the schema gap.

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 an X Article (long-form post) by rest_id or URL.' This clearly states what the tool does and distinguishes it from tweet-focused siblings. The mention of 'long-form post' differentiates it from standard tweets, and the parameter detail ('by rest_id or URL') adds scope.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool ('Fetch an X Article'), plus format selection guidance ('Use only when you need it') for the 'full' format. It also notes authentication requirements ('Requires authentication via cookies'). However, it does not explicitly compare with the sibling tool get_article_preview, leaving some ambiguity about when to choose one over the other.

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

get_article_previewA

Get title/preview/cover of an X Article embedded in a tweet.

Uses X's public syndication endpoint — no authentication required.

Args: tweet_id: ID (numeric string) or full URL of a tweet that links to an article.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description discloses that no authentication is required and that it relies on a public endpoint. It does not discuss rate limits or error behavior, but the key behavioral trait of auth-free access is clearly stated.

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 three sentences plus an Args line, front-loaded with the purpose, and every sentence adds value.

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-only tool with an output schema, the description provides enough context on what to pass and what to expect. The lack of auth and the specific endpoint type give sufficient operational context.

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

Parameters5/5

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

The schema only says 'Tweet Id' with anyOf integer/string, but the description explains tweet_id can be a numeric string or full URL and must be for a tweet linking to an article, adding crucial information.

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 starts with a specific verb 'Get' and resource 'title/preview/cover of an X Article', and clarifies the scope is 'embedded in a tweet', distinguishing it from the sibling tool get_article.

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 states 'Uses X's public syndication endpoint — no authentication required,' providing clear context for when this tool is appropriate. However, it does not explicitly mention when not to use it or alternative tools like get_article.

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

get_bookmarksB

Get bookmarked tweets (paginated).

Args: count: Number of bookmarks to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations provided, so description must carry behavioral disclosure. It states paginated retrieval, implying read-only, but does not mention authentication, rate limits, error cases, or what happens with no bookmarks. Lacks safety and error context.

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

Conciseness5/5

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

Extremely concise: one-line purpose then two arg descriptions. No extraneous text. Front-loaded with main action. Every sentence provides value.

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 paginated get tool with output schema present, basics are covered. However, lacks authentication context and differentiation among many 'get_' siblings. Could be more complete for an agent new to the domain.

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 0%, so description compensates by explaining count (default 20, max 100) and cursor (pagination from next_cursor). Adds meaning beyond schema titles and defaults, though could include format/type details.

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 clearly states 'Get bookmarked tweets' with the verb 'get' and resource 'bookmarked tweets'. It mentions pagination, distinguishing it from creation/deletion siblings like bookmark_tweet and delete_bookmark. However, it does not explicitly differentiate from other get tools like get_timeline or get_tweet, though the resource specificity helps.

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?

Minimal guidance: only describes pagination and default/max for count. Does not mention when to use this tool vs alternatives, authentication requirements, or prerequisites. No exclusions or why one might choose this over similar get tools.

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

get_communities_timelineA

Get tweets from communities the authenticated user has joined (paginated).

Args: count: Number of tweets to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Discloses pagination behavior and that it only returns tweets from joined communities. Lacks details on rate limits, error handling, or empty results. No annotations provided to supplement.

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-line description with clear purpose followed by parameter details. No wasted words.

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?

Output schema exists to describe return values. Description covers tool purpose and parameter semantics adequately. Missing authentication details but implied by 'authenticated user'.

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?

Adds meaning beyond schema: default count 20, max 100, cursor is from previous next_cursor. Schema only has defaults and type. 0% schema coverage compensated well.

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?

Clearly states it gets tweets from all communities the authenticated user has joined, with pagination. Differentiates from siblings like get_community_tweets (specific community) and get_timeline (general).

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?

Indicates pagination and authentication context but does not specify when not to use or provide alternatives. Implicit usage through sibling context.

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

get_communityA

Get a Twitter Community by ID.

Args: community_id: The community ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/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 burden. It only says 'Get a Twitter Community by ID' and offers no insight into authentication, return behavior, error handling, or whether the community must be public. The read-only nature is implied but not elaborated.

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 extremely concise: two short lines that state the purpose and parameter meaning. No fluff or redundancy. This is an appropriate size for a simple get-by-ID tool.

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?

The tool is a simple getter with one parameter and has an output schema, so the description does not need to explain return values. The description sufficiently identifies the tool's function for selection and invocation. However, it lacks any context about edge cases or community visibility, which could matter, but given the simplicity, it is mostly complete.

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 coverage is 0%, so the description must compensate. It says 'community_id: The community ID,' which adds minimal meaning beyond the parameter name itself. It does not clarify expected format, difference between string/integer, or any constraints. The description is essentially redundant with 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?

Description clearly states the tool retrieves a Twitter Community by ID, using the specific verb 'Get' and resource 'Twitter Community by ID.' This distinguishes it from sibling tools like search_community and get_community_members, which have different purposes.

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?

Usage is implied: you use this when you have a community ID and need community details. However, there is no explicit guidance on when to prefer this over search_community or get_community_tweets, nor any mention of alternatives or exclusions. The context is minimal.

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

get_community_membersA

Get members of a Twitter Community (paginated).

Args: community_id: The community ID. count: Number of members to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the responsibility of disclosing behavior. It mentions pagination, default/max count, and the cursor source, which are valuable behavioral details. It does not cover error handling or auth requirements, but the core behavior is disclosed.

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 a single line plus a tidy parameter list. No redundant or fluff content, and all information is front-loaded in the first 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?

Given the output schema exists, the description doesn't need to explain return types. It covers the pagination mechanism, all parameters, and is complete for a list-fetch operation. The string 'paginated' and cursor guidance ensure the tool can be used correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description is the sole source of parameter meaning. It explains community_id, count (with default and max), and cursor (as pagination cursor from a previous next_cursor), adding substantial value beyond the raw 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?

The description clearly states the tool's action: 'Get members of a Twitter Community (paginated).' This is a specific verb+resource that distinguishes it from sibling tools like get_community (community info) and get_community_moderators (moderators).

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

Usage Guidelines4/5

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

The description provides clear context for use (fetching community members) but does not explicitly mention exclusions or alternatives. The pagination details imply a straightforward read operation, but no 'when not to use' is stated.

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

get_community_moderatorsA

Get moderators of a Twitter Community (paginated).

Args: community_id: The community ID. count: Number of moderators to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the behavioral transparency burden. It discloses that results are paginated and explains the cursor/count mechanics, which is useful. However, it does not mention authorization requirements, error behavior, or rate limits, which could be important for a production API call. The transparency is moderately sufficient for a simple read operation.

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 succinct, starting with the core purpose in one line, then an args list with no filler. Every sentence/line adds value, adhering to front-loaded and concise formatting.

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?

The tool is simple and the description explains the purpose, all parameters, and pagination. It doesn't cover error conditions or response format, but an output schema exists to handle return values. Overall it offers a complete picture for basic usage, though not exhaustive.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates by listing each parameter and providing semantics: community_id is the target community, count has a default of 20 and max of 100, and cursor references the previous response's next_cursor. This adds significant meaning beyond the raw schema, especially for count and cursor.

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 operation: 'Get moderators of a Twitter Community (paginated).' This distinguishes it from sibling tools like get_community_members or get_community_tweets, making its specific purpose immediately obvious. The pagination note adds useful scope.

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 provides clear context for when to use this tool—to retrieve community moderators—and explains pagination usage with cursor and count, but it does not explicitly mention alternatives or exclude other tools. There is no comparison to sibling tools such as get_community_members, so guidance on selection is only implied by the name.

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

get_community_tweetsA

Get tweets from a Twitter Community (paginated).

Args: community_id: The community ID. tweet_type: One of "Top", "Latest", or "Media". count: Number of tweets to fetch (default 40, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
tweet_typeYes
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It discloses pagination behavior via cursor and next_cursor, and count limits. However, it does not explicitly state that it is read-only, nor does it mention authentication or rate limits. This is functional 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?

The one-line summary plus a concise args list is efficient. Every sentence adds value, and the formatting is clean.

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?

The description is largely complete for a simple read tool: clear purpose, good parameter documentation, and pagination details. The output schema exists so return values are covered. The missing piece is usage differentiation from similar community tools, which keeps it from being a 5.

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

Parameters5/5

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

Despite 0% schema description coverage, the description documents all four parameters with meanings, valid values for tweet_type, and default/max for count. This fully compensates for the schema's bare titles.

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 clear verb-object statement, 'Get tweets from a Twitter Community', and specifies pagination. This distinguishes it from sibling tools like 'get_community' or 'get_community_members' which focus on different resources.

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 gives parameter-level guidance (e.g., count limits, cursor usage) but does not explicitly state when to choose this over overlapping tools like 'search_community_tweet' or 'get_communities_timeline'. Usage is implied from the name but not contrasted with alternatives.

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

get_dm_historyA

Get DM conversation history with a user.

Note: Retrieves PRIVATE messages. Do not bulk-call. X has aggressive anti-spam on DMs and may suspend the account.

Returns JSON with messages (id/text/sender_id/recipient_id/time), next_cursor for pagination via max_id, and when present: timeline_events (non-message entries such as trust_conversation) and warnings (e.g. incomplete history for end-to-end encrypted / X Chat conversations — legacy DM history does not return ciphertext bodies after upgrade).

Args: screen_name: Twitter username (without @). max_id: If specified, retrieves messages older than this ID (for pagination). Pass the value from a previous response's next_cursor here on the next call to walk further back in time.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_idNo
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries full behavioral disclosure. It details the return JSON structure (messages, next_cursor, timeline_events, warnings), pagination behavior (pass next_cursor to max_id), and edge-case caveats such as incomplete history for encrypted/X Chat conversations. This is unusually transparent about response format and limitations.

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 well-structured with a purpose sentence, a critical usage warning, a return-format explanation, and an Args list. Every section earns its place; the anti-spam warning and legacy-DM caveat are important risk/scope details. It is somewhat longer than minimal but appropriate for the tool's complexity.

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 2-parameter tool with no annotation context, the description covers purpose, usage warnings, return values, pagination, and limitations. Even though an output schema is signaled, the explicit return description is especially valuable. It leaves little ambiguity for an AI agent deciding to call this tool.

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

Parameters5/5

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

The input schema provides zero parameter descriptions (0% coverage). The description compensates fully by explaining screen_name as 'Twitter username (without @)' and max_id as 'retrieves messages older than this ID' with explicit pagination instructions. This is exactly the semantic information an agent needs to invoke the tool correctly.

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 'Get DM conversation history with a user' – a specific verb (Get) and resource (DM conversation history). The note about retrieving PRIVATE messages further clarifies the service's scope, distinguishing it from sibling tools like send_dm or xchat_get_history by focusing on a user's direct message history.

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

Usage Guidelines4/5

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

The description provides explicit context that DMs are private and warns against bulk-calling due to X's aggressive anti-spam and suspension risk. It explains pagination usage via max_id and next_cursor, but does not explicitly name alternative tools like xchat_get_history for X Chat conversations, so it lacks a direct when-not-to-use comparison.

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

get_favoritersA

Get users who liked a tweet (paginated).

Args: tweet_id: The tweet ID. count: Number of users to fetch (default 40, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that the operation is paginated and explains the cursor mechanism, which is essential behavioral context. It clearly implies a read-only operation by using 'get', so no destructive behavior needs warning.

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 concise and front-loaded with the core purpose in the first sentence. The args section is well-structured and each line provides necessary information without 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 simple read-only paginated endpoint with an output schema, the description covers the essential aspects: purpose, parameters, and pagination behavior. It could include error handling or rate-limit notes, but these are less critical given the tool's simplicity and the presence of an output schema.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates well. It explains count's default and maximum, and describes cursor as a pagination token from a previous response's next_cursor. This adds real semantic value beyond the schema's bare definitions.

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: 'Get users who liked a tweet' clearly defines the action and target. It also mentions pagination, which adds scope. This distinguishes it from sibling tools like get_retweeters or get_user_followers by the object of the action.

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 usage context is clear: use when you need the list of users who liked a specific tweet. There is no explicit alternative or exclusion, but the purpose is unambiguous and the tool's scope is evident from the description.

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

get_listC

Get a Twitter List by ID.

Args: list_id: The list ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/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 only says 'Get' which implies a read operation, but it does not disclose return format, authentication needs, rate limits, or any potential side effects. The description adds no behavioral context beyond the basic action.

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 short and front-loaded, with no wasted words. It has a clear structure with the main action and an Args list. While it is minimal, it is appropriately concise for a simple one-parameter getter.

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?

Although an output schema exists and this is a simple tool, the description lacks usage guidelines and meaningful parameter semantics. It does not convey important context such as when to choose this tool over get_lists or what kind of ID is expected. The description is minimally viable but leaves clear gaps.

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

Parameters1/5

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

The schema has 0% description coverage, so the description must compensate for explaining the list_id parameter. However, the description only repeats 'The list ID' which is identical to the schema's title 'List Id'. It adds no new meaning about format, type, or usage examples, failing to meet the burden.

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 action: 'Get a Twitter List by ID.' This is a specific verb+resource combination and distinguishes it from sibling tools like get_lists (which lists all lists) or get_list_tweets (which gets tweets in a list).

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?

The description provides no guidance on when to use this tool versus alternatives. It does not mention that get_lists should be used to retrieve all lists, or that this tool is for a specific list by ID. No exclusions or alternative tools are cited.

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

get_list_membersA

Get members of a Twitter List (paginated).

Args: list_id: The list ID. count: Number of members to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
list_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden of disclosing behavior. It explains pagination, count limits (default 20, max 100), and cursor usage from a previous response. It does not mention auth, rate limits, or error conditions, but covers the core pagination behavior well.

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 compact and well-structured, with a one-sentence purpose followed by a clear Args list. Every line provides useful information without unnecessary fluff.

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 paginated read operation, the description covers the essential parameters and pagination behavior. An output schema exists, so return values do not need explanation. However, it could add a brief note about when to use this tool vs list_subscribers, but that is minor for completeness.

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

Parameters5/5

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

The description adds significant meaning beyond the input schema: it specifies max count=100, default count=20, and explains that the cursor is a pagination cursor from a previous response's next_cursor. The schema only lists types and defaults, so these details are valuable.

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 starts with 'Get members of a Twitter List,' which uses a specific verb and resource, and clearly distinguishes this tool from sibling tools like get_list_subscribers and get_list_tweets. The inclusion of 'paginated' also hints at the tool's scope and behavior.

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 when you need a list's members, but it does not explicitly state when to use this tool versus alternatives, nor does it mention exclusions or related list tools. There is no explicit guidance on when not to use it.

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

get_listsA

Get the authenticated user's Twitter Lists (paginated).

Args: count: Number of lists to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

No annotations; description discloses pagination but lacks details on rate limits, auth requirements, or empty list 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 concise lines: one for purpose, one listing args with defaults. No wasted words.

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?

Adequate for a simple list retrieval tool with output schema present. Could mention error cases but not critical.

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?

Adds meaning beyond schema: count default/max, cursor usage explanation. Schema coverage 0% so description provides necessary context.

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?

Clear verb 'Get' + resource 'Twitter Lists' + scope 'authenticated user's' and pagination. Distinct from sibling tools like get_list, get_list_members, etc.

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?

Implies use for fetching user's lists, but no explicit when-to-use vs alternatives like get_list or get_list_tweets.

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

get_list_subscribersA

Get subscribers of a Twitter List (paginated).

Args: list_id: The list ID. count: Number of subscribers to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
list_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description takes responsibility for behavioral disclosure. It reveals that the operation is paginated, defines the count parameter (default 20, max 100), and explains that the cursor comes from a previous response's next_cursor. This adds practical context beyond what the schema alone offers, though it doesn't discuss auth or error 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?

The description is highly concise and well-structured. The first sentence gives the purpose, followed by a compact Args block listing each parameter with its semantics. Every sentence earns its place, and there is no fluff.

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 paginated list getter, the description covers the essential aspects: purpose, pagination, and parameter details. An output schema exists, so return values need no explanation. It lacks potential usage advice or auth caveats, but given the tool's simplicity and shared context with siblings, it is reasonably complete.

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

Parameters4/5

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

The schema has no property descriptions (0% coverage), but the description compensates by explaining each argument: list_id as 'The list ID', count with a default and max, and cursor with its origin. This adds meaningful semantics, especially for count and cursor, though list_id remains somewhat tautological.

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 'Get subscribers of a Twitter List (paginated)' with a specific verb and resource. It distinguishes itself from sibling tools like get_list_members by using the term 'subscribers' rather than 'members', making its purpose unambiguous.

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 is provided on when to use this tool versus alternatives. There is no mention of scenarios where this should be preferred over get_list_members or other list-related tools, leaving the decision entirely to the agent's inference.

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

get_list_tweetsA

Get tweets from a Twitter List (paginated).

Args: list_id: The list ID. count: Number of tweets to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
list_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/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 disclosing behavior. It does mention pagination via cursor, adding useful behavioral context, but it does not explicitly state side-effect safety, authentication requirements, or rate limits. For a read-only getter, this is acceptable but not comprehensive.

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 compact and well-structured, front-loading the main purpose in a single sentence followed by a clear Args list. Every line adds value with no redundant filler.

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?

The tool is simple and the description covers all parameters and the key pagination behavior. The presence of an output schema means return values need not be described. However, it lacks explicit guidance on when to use this instead of other tweet-fetching tools, so it is not fully complete.

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

Parameters5/5

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

The schema has 0% description coverage, so the description provides all parameter meaning. It explains list_id as the list ID, count with default (20) and max (100), and cursor as a pagination token from a previous response's `next_cursor`. This goes well beyond the bare schema definitions.

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 verb 'Get' and the resource 'tweets from a Twitter List', which precisely defines the tool's purpose. This distinguishes it from sibling tools like get_list or get_list_members, which operate on list metadata or members, not tweets.

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 through its straightforward verb-noun structure, but it does not explicitly provide alternative tools or when-not-to-use scenarios. Sibling tools like get_timeline or get_user_tweets are not mentioned, leaving the agent to infer when list tweets are preferable.

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

get_notificationsA

Fetch notifications (paginated).

Args: notification_type: One of "All", "Verified", "Mentions" (default "All"). count: Number to fetch (default 40, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
notification_typeNoAll

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosing behavior. It explains pagination via cursor but does not mention rate limits, authentication needs, or whether the operation is safe/read-only. For a read tool, this is acceptable but not comprehensive.

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 short and front-loaded with the core purpose. Every sentence is informative, and the parameter details are presented in a clear, structured list without unnecessary words.

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 the description does not need to explain return values. It covers pagination and parameter inputs well. However, it could briefly mention the structure or sort order of notification items to improve completeness.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully compensates. It explains each parameter with default values, constraints, and how cursor relates to previous responses. This adds significant value beyond the schema's type and default information.

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 clearly states that the tool fetches notifications with pagination support. While it does not explicitly differentiate from sibling tools, the tool name and description are sufficient for an agent to understand its purpose, and no other sibling tool deals with notifications directly.

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

Usage Guidelines4/5

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

The description provides detailed parameter instructions, including allowed values for notification_type, default and max count, and cursor usage. It does not explicitly state when to use this tool versus alternatives, but the context from sibling names suggests it's the only notification-fetching tool, making the guidance adequate.

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

get_retweetersA

Get users who retweeted a tweet (paginated).

Args: tweet_id: The tweet ID. count: Number of users to fetch (default 40, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses pagination behavior ('paginated') and explains the cursor parameter as coming from `next_cursor`, which is useful operational context. However, it does not mention rate limits, auth requirements, or behavior for invalid tweet IDs, though these are not critical for a simple read operation.

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 extremely concise: a one-line purpose statement followed by a terse bullet list of parameters. No filler or repetition. The structure is front-loaded and every sentence 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 simple list tool with an output schema, the description covers the essential behavior and parameters. It explains pagination fully. Minor gaps (e.g., response order, error handling) are not necessary given the simplicity and the presence of an output schema.

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

Parameters5/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. It does so thoroughly: tweet_id is described as 'The tweet ID', count gets its default and max ('default 40, max 100'), and cursor is explained as 'Pagination cursor from a previous response's `next_cursor`'. This adds full meaning beyond types/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+resource: 'Get users who retweeted a tweet'. This clearly differentiates from sibling tools like get_favoriters (users who favorited) and get_tweet (tweet content). The parenthetical '(paginated)' adds operational scope.

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 immediately establishes when to use it: when you need the list of users who retweeted a specific tweet, given by tweet_id. It does not name alternatives or explicitly state when not to use it, but the context is unmistakable due to the distinct resource and the required parameter.

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

get_scheduled_tweetsA

Return all scheduled tweets for the authenticated user.

Note: returns the FULL list in one call — twikit's API does not paginate scheduled tweets. This is fine in practice since X caps scheduled tweets per account at a small number.

Scheduled tweets follow X's standard rate limits, no special caveats needed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Without annotations, the description discloses pagination behavior, rate limits, and the implicit read-only nature, but could mention error handling or authentication details.

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, informative sentences with no redundancy; purpose is front-loaded and each sentence adds value.

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 parameterless, read-only tool with an output schema, the description covers purpose, pagination, and rate limits adequately.

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?

No parameters exist, so the baseline is 4. The description adds no parameter-specific info, which is acceptable given full schema 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 returns all scheduled tweets for the authenticated user, which is specific and distinct from sibling tools like create_scheduled_tweet or get_tweet.

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 explains that the full list is returned in one call and why that's acceptable due to X's cap, but does not explicitly state when to use versus alternatives.

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

get_timelineB

Fetch home timeline tweets.

Args: count: Number of tweets to fetch (default 20).

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description must disclose behavioral traits. It only mentions the count parameter, omitting authentication, rate limits, or that it's a read operation. Minimal transparency.

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?

Two concise sentences: first states purpose, second documents the parameter. No fluff, but could be more structured with clear sections.

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?

Given the tool's simplicity (one parameter, output schema exists), the description is adequate but lacks usage guidelines and behavioral constraints. Could be more complete for an AI agent.

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 description explains the single parameter 'count' as 'Number of tweets to fetch (default 20)', adding meaning beyond the schema's type and default. Schema coverage is 0%, so this is valuable.

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 'Fetch home timeline tweets' uses a specific verb ('Fetch') and resource ('home timeline tweets'), clearly distinguishing it from siblings like 'get_user_tweets' or 'search_tweets'.

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 is provided on when to use this tool versus alternatives such as 'get_community_tweets' or 'search_tweets'. The description lacks context for selection.

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

get_tweetA

Fetch a tweet by ID.

Args: tweet_id: The tweet ID (numeric string) or full URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/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 burden. It only says 'Fetch a tweet by ID,' which implies a read-only operation but does not explicitly confirm read-only behavior, rate limits, authentication requirements, or how errors are handled. This is a significant gap for a tool with no annotation support.

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 extremely concise: one purpose sentence plus a single parameter explanation. No fluff or repetition, and the most important information is front-loaded. Every sentence 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 single-parameter fetch operation with an output schema present, the description covers the core semantics well. However, it lacks usage guidance and explicit behavioral assurances, so it's not fully complete on its own. But given the tool's low complexity, it is nearly sufficient.

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?

Even though the schema allows anyOf integer/string, the description adds essential semantics by specifying that tweet_id can be a numeric string or a full URL. This goes beyond the schema's bare type information and helps the agent correctly construct inputs. The schema coverage is 0%, making this parameter clarification valuable.

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 a specific action and resource: 'Fetch a tweet by ID.' This verb+resource pair is unambiguous and differentiates it from siblings like get_user_info, get_user_tweets, and search_tweets, which have different scopes or purposes.

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?

The description provides no guidance on when to use this tool versus alternatives. It does not mention when to prefer get_tweet over search_tweets or get_timeline, nor does it state any exclusions or prerequisites beyond providing a tweet ID. The only usage hint is the parameter description, which is not enough.

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

get_tweet_repliesA

Fetch replies (comments) to a tweet (issue #94).

Uses X's TweetDetail GraphQL endpoint via vendored twikit's Client.get_tweet_by_id, which populates tweet.replies as a paginated Result[Tweet]. One page per call; pass the returned next_cursor to fetch more.

Args: tweet_id: The tweet ID (numeric string) or full URL. cursor: Pagination cursor from a previous response's next_cursor; omit for the first page.

Returns: JSON with tweet_id, replies (compact list — id/author/text/ created_at/likes/retweets), next_cursor, count.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNo
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full transparency burden. It discloses the underlying GraphQL endpoint, pagination behavior, one-page-per-call semantics, and return fields. It goes beyond simple 'fetches replies' to explain how results are structured and how to page through them, giving the agent actionable behavioral expectations.

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 well-structured with a clear summary, implementation detail, Args section, and Returns section. Every sentence contributes to understanding or usage. The 'issue #94' reference is minor noise but not enough to detract from the overall efficiency.

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 involves pagination and two parameters, and the description covers pagination flow, parameter semantics, and return format. An output schema exists, so the description doesn't over-explain return values, but it provides enough context for the agent to use the tool correctly without ambiguity.

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

Parameters5/5

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

Schema coverage is 0%, so the description fully compensates. It explains tweet_id accepts a numeric string or full URL, and cursor is the pagination token from a previous next_cursor, with explicit 'omit for the first page' guidance. This adds meaning far beyond the raw schema types.

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 'Fetch replies (comments) to a tweet' – a specific verb, resource, and scope that clearly distinguishes it from siblings like get_tweet or get_timeline. The explicit reference to paginated replies and the tweet ID input further cements its unique purpose.

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 clearly states the tool fetches replies and one page per call, with a cursor to fetch more. However, it does not explicitly contrast with alternatives such as get_tweet or search_tweets, nor does it state when not to use this tool. The use case is implied strongly but not compared against sibling tools.

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

get_user_followersA

Get a user's followers list.

Note: X aggressively rate-limits follower / following requests — use sparingly, paginate via cursor, don't loop without backoff.

Caller must provide exactly one of screen_name / user_id.

Args: screen_name: Twitter username (without @). user_id: Twitter numeric user ID. count: Number of followers to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
user_idNo
screen_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure, and it does well: it discloses rate-limit behavior, pagination requirement, and the identifier constraint. It also mentions next_cursor from a previous response, adding context beyond the 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?

The description is compact, with a clear structure: a warning note, a requirement line, and a parameter list. Every sentence earns its place, and the front-loaded warning is critical.

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 straightforward, and the description covers identification, pagination, and rate-limit constraints. The output schema handles return values, so no further detail is needed.

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

Parameters5/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, and it does. The Args section explains all four parameters: screen_name and user_id with formatting (without @), count with default and max, and cursor with source from previous response. This adds significant value over the bare 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?

The description clearly states 'Get a user's followers list' with a specific verb and resource. It distinguishes from sibling get_user_following by explicitly mentioning followers, and the note about exactly one identifier clarifies scope.

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

Usage Guidelines4/5

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

The description provides explicit usage guidance: warns of aggressive rate limiting, advises pagination via cursor, and specifies the caller must provide exactly one of screen_name/user_id. It does not explicitly name alternative tools, but the sibling context makes the distinction obvious.

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

get_user_followingA

Get accounts that a user follows (their following list).

Note: X aggressively rate-limits follower / following requests — use sparingly, paginate via cursor, don't loop without backoff.

Caller must provide exactly one of screen_name / user_id.

Args: screen_name: Twitter username (without @). user_id: Twitter numeric user ID. count: Number to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
cursorNo
user_idNo
screen_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/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. It discloses that Twitter aggressively rate-limits follower/following requests, advises pagination via cursor, and warns against looping without backoff. This is meaningful behavioral context beyond the schema, though it stops short of covering potential auth requirements or visibility constraints.

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 compact and front-loaded: the critical rate-limit warning appears first, followed by the arg requirement and a labeled Args block. Every sentence serves a purpose, and the structure makes the parameter details easy to scan.

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

Completeness5/5

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

Given the tool has four parameters, no schema descriptions, and no annotations, the description covers all necessary ground: purpose, parameter usage, rate-limit caution, and pagination. The output schema exists, so return values are already documented elsewhere; no additional explanation is needed.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining each parameter: screen_name (without @), user_id (numeric Twitter ID), count (default 20, max 100), and cursor (from previous response's next_cursor). It also clarifies the exactly-one-of constraint, adding meaning that the schema alone does not provide.

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 function with a specific verb and resource: 'Get accounts that a user follows.' It distinguishes itself from the sibling 'get_user_followers' by explicitly naming the following list, so there is no ambiguity about which direction of the social graph it retrieves.

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

Usage Guidelines4/5

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

The description provides clear usage context: the caller must provide exactly one of screen_name or user_id, and it warns to use the tool sparingly due to rate limits. It does not explicitly mention alternatives like get_user_followers, but the purpose statement makes the distinction obvious, and the constraint+rate-limit guidance is solid.

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

get_user_infoA

Get a user's profile metadata by screen name OR numeric user ID.

Caller must provide exactly one of screen_name / user_id.

Args: screen_name: Twitter username (without @). user_id: Twitter numeric user ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNo
screen_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/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 adds the constraint that exactly one identifier must be provided, but it does not disclose what happens when both are provided, nor any error behavior, rate limits, or read-only guarantees. The description is not misleading, but it provides limited behavioral insight beyond the basic lookup semantics.

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 concise and front-loaded: the first sentence states the core purpose, followed by a clear usage constraint and two short parameter descriptions. Every sentence earns its place with no redundant or filler content.

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 lookup tool with an output schema present, the description covers the essential input semantics and invocation constraint. It does not mention edge cases or error handling, but given the simplicity of the operation and that the output schema exists, it is sufficiently complete. Slightly more detail on return behavior would warrant a 5, but the current level is adequate.

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

Parameters5/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. It does so effectively: 'screen_name: Twitter username (without @)' clarifies the format (no @) and 'user_id: Twitter numeric user ID' specifies the numeric nature. It also explains the mutual exclusivity requirement, which is essential for correct invocation. This adds significant meaning beyond the raw 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?

The description clearly states the tool's function: 'Get a user's profile metadata by screen name OR numeric user ID.' This uses a specific verb ('Get') and resource ('profile metadata'), and the two identifier options are explicitly mentioned. It also distinguishes itself from sibling tools like get_user_followers or search_user by focusing on profile metadata for a single user.

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

Usage Guidelines4/5

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

The description provides clear context on how to use the tool: 'Caller must provide exactly one of screen_name / user_id.' This is a critical usage constraint. However, it does not explicitly mention when to use this tool versus alternatives like search_user or get_user_tweets, 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.

get_user_tweetsB

Get recent tweets from a specific user.

Args: screen_name: Twitter username (without @). count: Number of tweets to fetch (default 20).

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

The description says 'Get recent tweets' but does not disclose behavior such as rate limits, pagination, or handling of protected users. With no annotations provided, the description should provide more 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?

The description is extremely concise: three sentences with no filler. It front-loads the purpose and immediately follows with parameter explanations. Every sentence 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?

Given the presence of an output schema, the description does not need to detail return values. It adequately covers the core functionality for a simple retrieval tool, though it could mention common fields like text or timestamp.

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 description explains both parameters beyond the schema: screen_name format ('without @') and count meaning ('Number of tweets to fetch') with its default value. Since schema has 0% description coverage, this adds significant value.

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 clearly states the tool retrieves 'recent tweets from a specific user,' which identifies the specific verb and resource. It is distinct from siblings like get_tweet (single tweet) and get_timeline (home timeline), though it could explicitly differentiate.

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?

The description provides no guidance on when to use this tool versus alternatives (e.g., get_tweet for a single tweet, search_tweets for keyword-based search). No exclusions or prerequisites are mentioned.

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

join_communityC

Join a Twitter Community.

Args: community_id: The community ID to join.

ParametersJSON Schema
NameRequiredDescriptionDefault
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior1/5

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

With no annotations provided, the description carries the full transparency burden. It simply restates the tool's purpose without disclosing what actually happens on join (e.g., immediate membership vs. pending approval, idempotency, error behavior if already a member). This is a significant gap for a state-changing operation.

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

Conciseness3/5

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

The description is extremely brief (two lines), which is efficient, but it sacrifices needed detail. It is not a model of conciseness because it omits essential context that could be conveyed in a few additional sentences. The structure is clean, but the content is under-specified.

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?

While the tool has only one parameter and appears simple, the context signals reveal a complex domain with many community-related siblings (get_community, request_to_join_community, leave_community). The description fails to address idempotency, privacy implications, or the difference between public and private community joins. The presence of an output schema is not exploited; no return-value expectations are given.

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%, but the description merely repeats 'community_id: The community ID to join' — a tautology that adds no semantic insight beyond the parameter name. No format, source, or example is given, so the agent gains no additional understanding of how to obtain or supply this ID.

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 'Join' with a clear resource 'a Twitter Community', immediately distinguishing it from siblings like leave_community and request_to_join_community. The action is unambiguous and matches the tool name exactly.

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 usage guidance is provided. There is no mention of when to use this tool versus request_to_join_community, which is a critical distinction in community join flows. The agent receives no contextual cues about prerequisites or alternative actions.

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

leave_communityA

Leave a Twitter Community.

Args: community_id: The community ID to leave.

ParametersJSON Schema
NameRequiredDescriptionDefault
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/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 burden. It only implies a mutating action without covering permissions, irreversibility, or response behavior. For a state-changing tool, this lacks important 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?

Two concise sentences, front-loaded with the purpose, followed by the parameter breakdown. No wasted words, appropriate for the tool's simplicity.

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 single-parameter action, the description is minimally adequate but lacks behavioral context such as membership requirements, side effects, or reversibility. The output schema reduces the need for return-value documentation, but absent annotations leave gaps.

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, and the description explains 'community_id: The community ID to leave,' adding semantic meaning beyond the schema's type/title. Though brief, it fully covers the sole parameter in a low-coverage schema context.

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 'Leave a Twitter Community' with a specific verb (leave) and resource (community). It is unambiguous and easily distinguished from sibling actions like join_community.

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?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites (e.g., being a member) or contrast with join_community, leaving the agent without context for selection.

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

like_tweetC

Like a tweet by ID.

Args: tweet_id: The tweet ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/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 burden of behavioral disclosure. It only states the action and the parameter, with no mention of side effects (e.g., whether an already-liked tweet errors or is idempotent), required permissions, rate limits, or reversibility. This is a significant gap for a mutating operation.

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 extremely concise, with only two sentences separating the main purpose and the parameter description. It is front-loaded and free of fluff. However, the 'Args' section largely duplicates the schema, which is slightly redundant, but overall the structure is clean and efficient.

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 tool with one parameter and an output schema, the description is minimally viable. The action is self-explanatory and the output schema likely documents return values. However, it lacks usage guidelines and behavioral transparency, making it incomplete for an agent that needs to know when to use it and what side effects to expect. This earns a 'minimum viable' score.

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?

The description repeats the parameter name and type ('tweet_id: The tweet ID.') without adding meaning beyond the schema. Schema description coverage is 0%, so the description should compensate, but it does not clarify the ID format (integer vs string), any constraints, or how to obtain the ID. The minimal elaboration is largely redundant with the schema's property name and type.

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 clearly states the action: 'Like a tweet by ID.' It identifies the verb (like) and resource (tweet), and the listener is given the required input. Although it doesn't explicitly differentiate from siblings like 'unfavorite_tweet', the verb 'like' is unique and unambiguous. The purpose is specific and easily understood.

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 is provided for when to use this tool versus alternatives. There is no mention of prerequisite steps (e.g., verifying the tweet exists), no exclusions, and no comparison to similar actions like 'unfavorite_tweet' or 'retweet'. The description simply states the action without any contextual or alternative usage information.

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

mute_userA

Mute a user by screen name.

Note: X aggressively rate-limits / risk-scans block + mute. Avoid bulk usage or your account may be temporarily restricted.

Args: screen_name: Twitter username (without @).

ParametersJSON Schema
NameRequiredDescriptionDefault
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Since no annotations are provided, the description carries the full burden. It transparently discloses that X rate-limits and risk-scans mute operations, and that bulk usage may lead to account restrictions. This is valuable behavioral context beyond the basic action.

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 concise with three short paragraphs. It front-loads the core purpose, then adds the critical rate-limit warning, and finally details the parameter format. Every sentence is necessary and well-placed.

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 tool with one parameter, the description covers the purpose, format, and a key behavioral warning. The output schema likely explains return values, so the description does not need to. It is complete enough for correct invocation.

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

Parameters4/5

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

The schema provides no description for the screen_name parameter (0% coverage). The description clarifies that it expects a Twitter username without the @ symbol, adding meaningful semantic information that the schema lacks.

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 explicitly states 'Mute a user by screen name,' which clearly identifies the verb (mute) and resource (user). It distinguishes from sibling tools like block_user and unmute_user.

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 warns about aggressive rate limiting and advises against bulk usage, providing implicit usage guidance. However, it does not explicitly compare with alternatives like block_user or specify when to choose mute over block.

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

remove_list_memberA

Remove a user from a Twitter List.

Caller must provide exactly one of screen_name / user_id.

Args: list_id: The list ID (required). screen_name: Twitter username (without @). user_id: Twitter numeric user ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYes
user_idNo
screen_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/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 states the action is a removal but does not mention potential side effects, required authentication, error conditions, or reversibility, leaving significant gaps for a mutation 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?

The description is extremely concise and well-structured, leading with the purpose and then listing parameters in a clean Args block. Every sentence earns its place, with no wasted words.

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 removal tool, the description covers the essential parameters and the key invocation constraint. However, with no annotations, it falls short on behavioral details like return values, error handling, or permission requirements, though the tool's simplicity mitigates this.

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 description adds valuable meaning beyond the schema: it clarifies that screen_name is without '@' and user_id is numeric, and explicitly states list_id is required. This compensates for the 0% schema description coverage, though parameter descriptions remain minimal.

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 begins with a clear, specific verb 'Remove' and resource 'a user from a Twitter List', making the tool's action unambiguous. It also distinguishes from sibling tools by explicitly stating the removal action, contrasting with add_list_member.

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?

Provides an explicit and important usage constraint: 'Caller must provide exactly one of screen_name / user_id.' This prevents common invocation errors, though it does not discuss when to use this tool versus alternatives or when not to use it.

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

request_to_join_communityA

Request to join a Twitter Community.

For communities with restricted join policies that require moderator approval, an answer to the join request question may be required.

Args: community_id: The community ID to request to join. answer: Optional answer to the join request question (required for some communities with moderator approval policy).

ParametersJSON Schema
NameRequiredDescriptionDefault
answerNo
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/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 disclosing behavioral traits. It only mentions that an answer may be required for some communities, but it does not disclose side effects, outcome of the request, reversal options, or any permission requirements. This is a significant gap for a mutation-type 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?

The description is concise and well-structured: a clear one-line purpose, a short clarifying note about policies, and an args list. Every sentence adds value with no redundancy or filler.

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?

The tool is relatively simple, and the output schema exists to describe return values. The description covers the core action and the key conditional parameter. However, it does not explicitly address how this tool relates to the sibling pick_community or what happens after a request is submitted, leaving some contextual gaps.

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

Parameters4/5

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

The schema description coverage is 0%, so the description compensates by explaining both parameters. community_id is defined as 'The community ID to request to join,' and answer is described as optional but required for some moderator-approval communities. This adds meaningful context beyond the schema's bare property titles, though it could still clarify the format of community_id.

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 specific verb and resource: 'Request to join a Twitter Community.' It also distinguishes from sibling tools by noting the context of restricted join policies requiring moderator approval, which separates it from direct joining tools like join_community.

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

Usage Guidelines4/5

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

The description provides clear context by explaining that this tool is for communities with restricted join policies. However, it does not explicitly mention alternatives (e.g., using join_community for open communities) or offer exclusionary guidance, 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.

retweetC

Retweet a tweet by ID.

Args: tweet_id: The tweet ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2/5.0
Behavior1/5

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

Annotations are absent, so the description carries the full burden. It only states the action 'Retweet a tweet by ID' without disclosing side effects, authentication requirements, potential errors (e.g., already retweeted), or rate limits. No behavioral transparency is provided.

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

Conciseness3/5

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

The description is extremely concise, but it includes an 'Args' block that redundantly restates the schema. While it is front-loaded and free of fluff, the redundant parameter line detracts from overall value. It is minimal but not efficiently informative.

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?

Despite having an output schema, the description is severely incomplete. It lacks usage context, behavioral details, and parameter semantics. For a mutation tool with no annotations, this level of sparseness is inadequate for an AI agent to use it correctly.

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

Parameters1/5

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

The description says 'tweet_id: The tweet ID,' which simply repeats the schema's property title 'Tweet Id'. It adds no semantic meaning beyond the schema, leaving the parameter's format, source, or constraints unexplained. Schema description coverage is 0%, and the description fails to compensate.

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 'Retweet a tweet by ID.' This provides a clear verb+resource combination, unambiguously indicating the action of retweeting a specific tweet. It is distinguishable from sibling tools like send_tweet or delete_retweet, though it doesn't explicitly mention that it creates a retweet on behalf of the authenticated user.

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

Usage Guidelines1/5

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

The description gives no indication of when to use this tool versus alternatives such as like_tweet or send_tweet. There is no mention of prerequisites, context, or exclusions. It entirely lacks usage guidance.

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

search_communityB

Search for Twitter Communities by query (paginated).

Note: twikit's search_community does not support a count parameter.

Args: query: Search query string. cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description carries full burden. It discloses pagination and lack of count parameter, but does not mention whether the operation is read-only, rate limits, or authentication requirements.

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 concise with two sentences and a clear argument list. Every sentence adds value, and no words are wasted.

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?

Given the presence of an output schema, the description need not explain return values. It covers parameters and key behavior (paginated, no count), but lacks usage guidelines and behavioral transparency, making it minimally adequate.

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 0%, but the description adds meaning: 'query' is described as a search query string, and 'cursor' as a pagination cursor from previous next_cursor. This compensates for the schema's lack of descriptions.

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 clearly states the tool searches for Twitter Communities by query, with pagination. It differentiates from general search tools (search_tweets, search_user) by specifying 'Communities', but could be more explicit about distinction from search_community_tweet.

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 provides useful guidance on pagination and cursor usage, and notes that count parameter is not supported. However, it lacks explicit when-to-use vs alternatives like search_community_tweet.

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

search_community_tweetA

Search tweets within a Twitter Community (paginated).

Args: community_id: The community ID. query: Search query string. count: Number of tweets to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
queryYes
cursorNo
community_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses pagination behavior through the cursor parameter and count limits (default 20, max 100), which are useful operational details. It stops short of mentioning read-only semantics, rate limits, or other potential constraints, but provides meaningful context beyond the 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?

The description is compact and front-loaded with the purpose. The Args list is a clean, structured reference with one line per parameter. Every sentence adds value with no redundancy.

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 search tool with an output schema, the description covers the essential details: scope, query, count limits, and pagination. No critical gaps remain, and the output format is presumably available in the output schema.

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

Parameters5/5

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

Schema description coverage is 0%, yet the description explains each parameter: community_id, query, count (with default and max), and cursor (from previous response's next_cursor). This fully compensates for the sparse schema and adds clarity to parameter usage.

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 action: 'Search tweets within a Twitter Community (paginated).' It identifies the specific resource (tweets within a community) and distinguishes from siblings like search_tweets (general search) and get_community_tweets (likely without a query).

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 is provided on when to use this tool versus alternatives such as search_tweets or get_community_tweets. The description simply states what it does without context on tool selection.

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

search_tweetsB

Search tweets.

Args: query: Search query string. count: Number of results (default 20). product: "Latest" or "Top" (default "Latest").

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
queryYes
productNoLatest

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description must disclose behavioral traits. It fails to state that the tool is read-only, non-destructive, or any side effects. It only lists parameters, leaving the agent uninformed about the tool's behavior beyond inputs.

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 very concise, using a clear docstring format. Every sentence adds value, but it could be slightly more structured (e.g., separating behavior from parameters).

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?

Given the output schema exists, the description does not need to explain return values. However, it omits important context such as search scope (e.g., recent tweets, full archive) and authentication needs. It is minimally complete but leaves gaps.

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 description adds meaning to all three parameters by explaining query, count, and product, including defaults. Since schema description coverage is 0%, this fills a critical gap and helps the agent understand parameter usage.

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 clearly states 'Search tweets' as the purpose, which is a specific verb and resource. However, it does not differentiate from sibling tools like search_user or get_timeline, which also involve searching or retrieving tweets.

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 is provided on when to use this tool versus alternatives such as search_community or get_timeline. The description lacks context about the appropriate use case or prerequisites.

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

search_userA

Search for users by query (paginated).

Args: query: Search query string. count: Number of users to fetch (default 20, max 100). cursor: Pagination cursor from a previous response's next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNo
queryYes
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/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. It discloses pagination behavior (cursor from previous next_cursor) and count constraints (default 20, max 100), but does not mention rate limits, authentication requirements, or search behavior like case sensitivity or matching logic.

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 extremely concise, with a single-sentence purpose followed by a bullet list of argument explanations. Every sentence is informative and there is no redundancy or unnecessary 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?

Given that an output schema exists (context indicates 'Has output schema: true'), the description does not need to detail return values. However, it misses the scope of what fields are searched (e.g., username, display name) and does not mention error conditions or behavior when no results are found. This is adequate but not complete.

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 description adds meaningful context beyond the input schema: it explains that cursor comes from a previous response's next_cursor, and specifies the default and maximum for count. The schema only provides types and defaults, so this adds value for the agent.

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 clearly states 'Search for users by query (paginated)', specifying the verb and resource. It is distinct from sibling tools like get_user_info (which requires a specific user) and search_community (which searches communities). However, it does not specify which user attributes are searched (e.g., username, display name), which could provide more clarity.

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 when needing to find users by a query string, but does not explicitly contrast with other user-related tools such as get_user_info or follow_user. There is no guidance on when not to use this tool or mention of prerequisites.

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

send_dmA

Send a direct message to a user by screen name.

Note: Sends a PRIVATE message. Do not bulk-call. X has aggressive anti-spam on DMs and may suspend the account.

Args: screen_name: Twitter username (without @) to send the DM to. text: Message content (required, must not be empty). media_id: Optional media ID to attach.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
media_idNo
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses that the message is private and that bulk calls risk account suspension, adding important behavioral context beyond what the schema provides. It doesn't cover all failure modes but does provide meaningful risk information.

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 brief and front-loaded, with a clear purpose statement followed by a risk warning and an Args list. Every sentence adds value, and the structure is easy to parse.

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 simple 3-parameter tool and the presence of an output schema, the description covers the core purpose, parameter semantics, and key risk warning. It lacks explicit when-to-use vs alternatives, but combined with schema and output schema it is sufficient for invocation.

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

Parameters5/5

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

The description adds crucial semantics beyond the bare schema: it specifies that screen_name should be without '@', that text must be non-empty, and that media_id is optional. Since schema description coverage is 0%, this fully compensates for the schema's lack of parameter explanations.

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 clear action verb ('Send') and identifies the specific resource ('a direct message to a user by screen name'). This distinguishes it from siblings like send_tweet and send_dm_to_group.

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

Usage Guidelines4/5

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

The description provides context that DMs are private and warns against bulk-calling due to X's aggressive anti-spam, which helps an agent decide when to invoke this tool sparingly. It doesn't explicitly name alternatives, but the screen-name targeting implies one-on-one DMs, distinguishing it from send_dm_to_group.

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

send_dm_to_groupA

Send a direct message to a group conversation.

Note: Sends a PRIVATE message. Do not bulk-call. X has aggressive anti-spam on DMs and may suspend the account.

Args: group_id: The group conversation ID. text: Message content (required, must not be empty). media_id: Optional media ID to attach.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
group_idYes
media_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/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. It discloses that the message is PRIVATE and warns about aggressive anti-spam and account suspension, which is valuable behavioral context. It doesn't cover all possible behaviors (e.g., rate limits, failure modes), but the disclosed warnings are significant for a messaging 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?

The description is succinct and well-structured: a one-line purpose, a brief warning note, and a bulleted Args list. Every sentence adds value, no fluff, and the formatting makes it easy to scan.

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 tool with an output schema, the description covers purpose, usage warning, and all parameters. It doesn't need to describe return values because an output schema exists. The anti-spam warning adds crucial context, making this fully adequate for an agent to select and invoke the tool.

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

Parameters5/5

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

Schema description coverage is 0%, so the description compensates fully with an explicit Args section. It explains group_id (conversation ID), text (required, must not be empty), and media_id (optional media ID), adding meaning beyond the schema's type/title information.

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 'Send a direct message to a group conversation,' which clearly states the action, resource, and scope. This distinguishes it from sibling tools like send_dm (which presumably targets an individual user) and other DM-related tools by explicitly mentioning 'group'.

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

Usage Guidelines4/5

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

The description provides clear context: it is for group conversations and includes a strong anti-spam warning ('Do not bulk-call... may suspend the account'). However, it doesn't explicitly name alternatives or state when NOT to use this tool (e.g., 'use send_dm for individual users'), so it lacks explicit exclusions, but the context is clear.

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

send_tweetA

Send a tweet. Optionally reply to a tweet by ID.

Args: text: Tweet content (max 280 chars). reply_to: Optional tweet ID to reply to.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
reply_toNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

The description reveals the tool performs a write operation and mentions character limit, but lacks details on success behavior, error responses, idempotency, or potential side effects. Since no annotations exist, the description fails to provide sufficient behavioral 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?

The description is extremely concise with only two sentences and a brief argument list. Every word is necessary and front-loaded, making it efficient for an AI agent to parse quickly.

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?

Given the tool's simplicity and presence of an output schema, the description covers the basic purpose and parameters. However, it lacks usage context among siblings and does not address potential failures, making it incomplete for an agent to fully understand the tool's behavior.

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?

With 0% schema description coverage, the description adds meaningful value by specifying text max length (280 chars) and explaining reply_to as an optional tweet ID. This goes beyond the schema's simple type definitions, though the format of reply_to could be more precise.

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 it sends a tweet, optionally as a reply, which is a specific verb+resource combination. It distinguishes itself from other tweet-related tools like delete_tweet, retweet, and create_scheduled_tweet by focusing on sending a new tweet immediately.

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 is provided on when to use this tool versus alternatives like create_scheduled_tweet or send_dm. There is no mention of prerequisites, authentication, or rate limits, leaving the agent without context for appropriate usage.

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

unblock_userA

Unblock a user by screen name.

Note: X aggressively rate-limits / risk-scans block + mute. Avoid bulk usage or your account may be temporarily restricted.

Args: screen_name: Twitter username (without @).

ParametersJSON Schema
NameRequiredDescriptionDefault
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses the risk of rate-limiting and temporary restriction, which is helpful. However, it does not mention other aspects like permission requirements, idempotency, or what happens if the user is not blocked.

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 very concise: two sentences and a bullet point. The first sentence states the purpose, and the note is clearly separated. No unnecessary words.

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 unblock action, the description covers the core purpose, parameter usage, and an important warning. Although it could mention error handling or prerequisites, the presence of an output schema (unknown content) may compensate. Overall fairly complete.

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 description adds value to the input schema by explaining that screen_name should be a 'Twitter username (without @)'. This clarifies the format, which is not present in the schema (0% 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 'Unblock a user by screen name', which is a specific verb and resource. It distinguishes itself from sibling tools like block_user and mute_user by the action unblock.

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 provides a warning about rate-limits and bulk usage, but does not explicitly state when to use this tool versus alternatives like unmute_user or block_user. It implicitly defines usage as unblocking, but lacks comparative guidance.

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

unfavorite_tweetA

Unlike a tweet by ID.

Args: tweet_id: The tweet ID to unlike.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/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 full behavioral disclosure burden. It only states the action 'Unlike' without detailing side effects, error conditions, idempotency, or permissions. Minimal disclosure for a mutation operation.

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 a single sentence followed by an argument spec with no unnecessary words. It is appropriately sized for a simple one-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?

Given the tool's simplicity and presence of an output schema, the description covers the essentials. However, it lacks behavioral details such as prerequisites or error handling, and with no annotations, some gaps remain for an AI agent.

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 0%, but the description explicitly explains tweet_id as 'The tweet ID to unlike', adding meaning beyond the schema's simple title. This directly connects the parameter to its role in the operation.

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 'Unlike a tweet by ID', using a specific verb and resource. It distinguishes the tool from siblings like 'like_tweet' and 'delete_tweet', making the purpose unambiguous.

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 implicitly conveys when to use the tool: when you want to unlike a tweet. There is no explicit mention of alternatives or exclusions, but the context is clear enough for an agent to select this tool for unliking operations.

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

unfollow_userA

Unfollow a user by screen name.

Note: X aggressively rate-limits follow / unfollow — avoid bulk usage or your account may be temporarily restricted.

Args: screen_name: Twitter username (without @).

ParametersJSON Schema
NameRequiredDescriptionDefault
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, description must disclose all behavioral aspects. It mentions rate-limiting and potential temporary restriction, which is valuable. But it does not disclose whether the user must be followed beforehand, what happens if the screen name does not exist, or any side effects beyond the warning.

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?

Extremely concise: two sentences and a one-line Args description. No extraneous information; front-loaded with the action.

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 tool with an output schema, the description provides the essential: action, parameter format, and a usage warning. Missing prerequisites (e.g., must be following) but still fairly complete.

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?

Only parameter 'screen_name' is explained with format hint ('without @'), which adds value beyond the schema (which only specifies type string). Schema coverage is 0% but the description compensates.

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?

Description specifies the action ('Unfollow a user') and the method ('by screen name'). Clearly distinguishes from sibling 'follow_user'.

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?

Provides rate-limit warning and advises against bulk usage, giving clear context for appropriate use. However, does not explicitly state when not to use this tool (e.g., if not currently following the user) or mention alternatives.

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

unmute_userA

Unmute a user by screen name.

Note: X aggressively rate-limits / risk-scans block + mute. Avoid bulk usage or your account may be temporarily restricted.

Args: screen_name: Twitter username (without @).

ParametersJSON Schema
NameRequiredDescriptionDefault
screen_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

Discloses rate limiting and risk scanning behavior beyond the schema, which is valuable. But with no annotations provided, the description carries the full burden; it omits other behavioral traits like reversibility or permissions.

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 with no fluff: first sentence states purpose, second adds crucial context. Well front-loaded and efficient.

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

Completeness5/5

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

Given the simplicity of the action and presence of output schema, the description covers purpose, parameter details, and important rate-limit behavior fully.

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

Parameters5/5

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

Clarifies the screen_name parameter format (without @), adding essential meaning beyond the schema's type and title. Parameter is simple but comprehensively explained.

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?

Clearly states the action (unmute) and resource (user) with the specific input (screen name). Distinct from sibling tools like mute_user and block_user.

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 warns against bulk usage due to rate limiting and risk scanning, providing clear usage context. However, does not explicitly contrast with alternatives beyond the sibling list.

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

voteA

Vote on an X poll.

X polls have 2-4 choices and a duration in minutes. The card_uri and card_name come from the tweet's poll card metadata (obtainable via get_tweet).

Args: selected_choice: The label of the choice to vote for (must be non-empty). card_uri: The poll card URI (from the tweet's poll card metadata). tweet_id: The ID of the tweet containing the poll. card_name: The name of the poll card (from the tweet's poll card metadata).

ParametersJSON Schema
NameRequiredDescriptionDefault
card_uriYes
tweet_idYes
card_nameYes
selected_choiceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/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 burden of behavioral disclosure. It only says 'Vote on an X poll' without disclosing side effects, reversibility, rate limits, or the possibility of failure (e.g., poll closed, already voted). The metadata source information is helpful but does not address the behavioral implications of casting a vote.

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 starts with a clear one-line purpose and then provides necessary context and a structured argument list. It is efficient, with no redundant fluff. The repetition between the prose and the arg list is minor and serves to clarify each parameter, so it remains appropriately concise.

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 that there are no annotations and the output schema is not shown, the description covers all parameters and adds useful domain context (poll structure, metadata source). It could mention potential failure conditions or the action's irreversibility, but it is otherwise complete enough for a relatively simple voting action.

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

Parameters5/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 the lack of parameter details. It fully compensates by explaining each of the four parameters: selected_choice is the label and must be non-empty, card_uri and card_name come from poll card metadata, and tweet_id identifies the tweet containing the poll. This adds critical meaning beyond the bare 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?

The description clearly states the tool's action with 'Vote on an X poll,' a specific verb and resource. It distinguishes itself from siblings like create_poll by focusing solely on voting on an existing poll. The additional context about poll structure (2-4 choices, duration) reinforces the purpose.

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

Usage Guidelines4/5

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

The description provides clear context by stating that card_uri and card_name come from the tweet's poll card metadata and are obtainable via get_tweet, implying the need to fetch the tweet first. It does not explicitly mention alternatives or exclusion scenarios, but the guidance on prerequisites is clear and actionable.

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

xchat_get_historyA

Read messages from one XChat (encrypted DM) conversation.

Note: returns PRIVATE decrypted message text from your own machine. Reading here does NOT mark the conversation read on X.

Returns JSON messages oldest-first: text, timestamp, direction (incoming/outgoing), sender_screen_name, sequence_number, has_attachment.

Args: conversation_id: From xchat_list_conversations. limit: Max messages, most recent kept (1-500, default 50).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
conversation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it warns about returning PRIVATE decrypted message text from your own machine and explicitly states that reading does NOT mark the conversation read on X. It doesn't mention rate limits or auth needs, but for a simple read tool this is sufficient.

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 appropriately sized and well-structured: a one-line purpose, a critical privacy note, a return format section, and an args list. Every sentence adds value, with no repetition of schema information already present.

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 simple (2 params, no annotations) and the description covers all essential aspects: purpose, output format (oldest-first messages with fields), parameter source and constraints, and behavioral notes. It is complete for an agent to select and invoke correctly.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates fully. conversation_id is explained as coming from xchat_list_conversations, and limit is given with range (1-500) and default (50), plus the semantic 'most recent kept'. This goes well beyond the raw 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?

The description clearly states 'Read messages from one XChat (encrypted DM) conversation', using a specific verb and resource. It distinguishes itself from siblings like xchat_list_conversations (lists conversations) and get_dm_history (likely regular DMs) by specifying the XChat encrypted DM context.

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 clear context for when to use the tool and directs the user to get conversation_id from xchat_list_conversations. However, it doesn't explicitly name alternatives or state when not to use this tool, 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.

xchat_list_conversationsA

List XChat (encrypted DM) conversations, newest activity first.

Note: returns PRIVATE message previews from your own machine.

Returns JSON conversations: conversation_id, name, screen_name, preview (latest message text; [image attachment]-style placeholder when the message carried no text), timestamp, unread.

Args: limit: Max conversations to return (1-500, default 50). unread_only: Only conversations with unread messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
unread_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/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 openly discloses that private message previews are returned, that previews use placeholder text for non-text attachments, and that results are ordered by newest activity first. This is strong transparency, though it omits details like rate limits, authentication, or error 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?

The description is well-structured and appropriately concise. It front-loads the core purpose, includes a necessary privacy note, specifies the output JSON structure, and documents arguments. Each section serves a distinct purpose without redundancy or fluff.

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

Completeness5/5

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

Given the tool's simplicity (two optional parameters) and no annotations, the description covers all essential aspects: what it does, output format, parameter constraints, and a privacy caveat. It is complete enough for an agent to invoke the tool correctly without additional context.

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

Parameters5/5

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

The description adds significant meaning beyond the input schema. It provides explicit ranges for 'limit' (1-500), clarifies the default (50), and explains 'unread_only' as filtering to conversations with unread messages. The schema only has titles and defaults, so these details are essential and well-covered.

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 function with a specific verb ('List') and resource ('XChat conversations'), and adds sorting criterion ('newest activity first'). It distinguishes itself from sibling tools like xchat_get_history, which likely focuses on message history within a conversation.

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

Usage Guidelines4/5

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

The description provides clear context on what the tool does and highlights a privacy caveat about returning private message previews from the user's machine. While it doesn't explicitly mention alternatives or when not to use it, the purpose is well-scoped and the note implies caution appropriate for the tool's nature.

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

xchat_statusA

Check whether XChat (encrypted DMs) can be read on this machine.

Reads X's locally decrypted store — the browser did the decryption; this only opens the resulting SQLite file read-only. Nothing is sent, marked read, or modified.

Returns JSON with state, and when a store is readable: database_path, conversation_count, last_updated. When no store is configured, returns discovery listing the XChat databases found in local browser profiles so you can pick one.

Configure with XCHAT_BROWSER (auto/chrome/chromium/edge/brave/aside), XCHAT_BROWSER_PROFILE, or XCHAT_DATABASE_PATH.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description takes full responsibility for behavioral disclosure. It explicitly states the operation is read-only ('opens the resulting SQLite file read-only'), asserts 'Nothing is sent, marked read, or modified', and explains the local decryption context. This is exemplary transparency.

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 well-structured with a clear summary, behavior details, output shape, and configuration. It is slightly longer than strictly necessary but every sentence carries meaningful information—no filler or redundancy.

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?

Despite having zero parameters and an output schema, the description fully explains the tool's behavior, expected outputs (state, database_path, conversation_count, last_updated, discovery), and configuration prerequisites. This is complete for an agent to decide when and how to invoke 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?

The input schema has zero parameters, so the baseline is 4. The description adds useful configuration context via environment variables (XCHAT_BROWSER, XCHAT_BROWSER_PROFILE, XCHAT_DATABASE_PATH), though these are not formal parameters. No schema coverage issues exist.

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: 'Check whether XChat (encrypted DMs) can be read on this machine.' It clearly distinguishes itself from sibling tools like xchat_list_conversations and xchat_get_history by focusing on readability/status rather than content retrieval.

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

Usage Guidelines4/5

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

The description provides clear context: it is a pre-flight check for accessing XChat local storage, and it explains the discovery flow when no store is configured. However, it does not explicitly name alternative tools or state when not to use it, so it falls short of full explicit guidance.

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. 3 tool updatesv0.1.42
    • Addedxchat_get_history
    • Addedxchat_list_conversations
    • Addedxchat_status
  2. 39 tool updatesv0.1.39
    • Changedadd_list_member3 fields changed
      • addedInput schema / properties / list_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / list_id / type
        Removed value: -"string"
      • changedInput schema / properties / user_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedbookmark_tweet3 fields changed
      • changedInput schema / properties / folder_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedcreate_scheduled_tweet1 field changed
      • changedInput schema / properties / media_ids / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changeddelete_bookmark2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changeddelete_dm2 fields changed
      • addedInput schema / properties / message_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / message_id / type
        Removed value: -"string"
    • Changeddelete_retweet2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changeddelete_scheduled_tweet2 fields changed
      • addedInput schema / properties / scheduled_tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / scheduled_tweet_id / type
        Removed value: -"string"
    • Changeddelete_tweet2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changeddownload_tweet_video2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changededit_list2 fields changed
      • addedInput schema / properties / list_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / list_id / type
        Removed value: -"string"
    • Changedget_article2 fields changed
      • addedInput schema / properties / article_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / article_id / type
        Removed value: -"string"
    • Changedget_article_preview2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedget_community2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedget_community_members2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedget_community_moderators2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedget_community_tweets2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedget_dm_history1 field changed
      • changedInput schema / properties / max_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedget_favoriters2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedget_list2 fields changed
      • addedInput schema / properties / list_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / list_id / type
        Removed value: -"string"
    • Changedget_list_members2 fields changed
      • addedInput schema / properties / list_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / list_id / type
        Removed value: -"string"
    • Changedget_list_subscribers2 fields changed
      • addedInput schema / properties / list_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / list_id / type
        Removed value: -"string"
    • Changedget_list_tweets2 fields changed
      • addedInput schema / properties / list_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / list_id / type
        Removed value: -"string"
    • Changedget_retweeters2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedget_tweet2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedget_tweet_replies2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedget_user_followers1 field changed
      • changedInput schema / properties / user_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedget_user_following1 field changed
      • changedInput schema / properties / user_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedget_user_info1 field changed
      • changedInput schema / properties / user_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedjoin_community2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedleave_community2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedlike_tweet2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedremove_list_member3 fields changed
      • addedInput schema / properties / list_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / list_id / type
        Removed value: -"string"
      • changedInput schema / properties / user_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedrequest_to_join_community2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedretweet2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedsearch_community_tweet2 fields changed
      • addedInput schema / properties / community_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / community_id / type
        Removed value: -"string"
    • Changedsend_dm1 field changed
      • changedInput schema / properties / media_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedsend_dm_to_group3 fields changed
      • addedInput schema / properties / group_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / group_id / type
        Removed value: -"string"
      • changedInput schema / properties / media_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedunfavorite_tweet2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
    • Changedvote2 fields changed
      • addedInput schema / properties / tweet_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / tweet_id / type
        Removed value: -"string"
  3. 59 tool updatesv0.1.33
    • First observedadd_list_member
    • First observedblock_user
    • First observedbookmark_tweet
    • First observedcreate_list
    • First observedcreate_poll
    • First observedcreate_scheduled_tweet
    • First observeddelete_bookmark
    • First observeddelete_dm
    • First observeddelete_retweet
    • First observeddelete_scheduled_tweet
    • First observeddelete_tweet
    • First observeddownload_tweet_video
    • First observededit_list
    • First observedfollow_user
    • First observedget_article
    • First observedget_article_preview
    • First observedget_bookmarks
    • First observedget_communities_timeline
    • First observedget_community
    • First observedget_community_members
    • First observedget_community_moderators
    • First observedget_community_tweets
    • First observedget_dm_history
    • First observedget_favoriters
    • First observedget_list
    • First observedget_list_members
    • First observedget_list_subscribers
    • First observedget_list_tweets
    • First observedget_lists
    • First observedget_notifications
    • First observedget_retweeters
    • First observedget_scheduled_tweets
    • First observedget_timeline
    • First observedget_trends
    • First observedget_tweet
    • First observedget_tweet_replies
    • First observedget_user_followers
    • First observedget_user_following
    • First observedget_user_info
    • First observedget_user_tweets
    • First observedjoin_community
    • First observedleave_community
    • First observedlike_tweet
    • First observedmute_user
    • First observedremove_list_member
    • First observedrequest_to_join_community
    • First observedretweet
    • First observedsearch_community
    • First observedsearch_community_tweet
    • First observedsearch_tweets
    • First observedsearch_user
    • First observedsend_dm
    • First observedsend_dm_to_group
    • First observedsend_tweet
    • First observedunblock_user
    • First observedunfavorite_tweet
    • First observedunfollow_user
    • First observedunmute_user
    • First observedvote

TDQS

B3.1/5.0

Scored across 62 tools

Disambiguation3/5

Most tools map to clear resource+action pairs, but a few seams are ambiguous: get_article_preview vs get_article, get_dm_history vs xchat_get_history, and join_community vs request_to_join_community could all mislead an agent. The detailed descriptions help, but the near-overlapping purposes are not obvious from names alone.

Naming Consistency4/5

The overwhelming majority follow a clean verb_noun snake_case pattern, e.g. get_tweet, delete_tweet, create_list, follow_user. Minor asymmetries like unfavorite_tweet vs like_tweet, delete_bookmark vs bookmark_tweet, and search_community_tweet vs search_tweets prevent a perfect score.

Tool Count2/5

With 62 tools, this server far exceeds the 25+ threshold and bundles many distinct subdomains: tweets, DMs, lists, communities, scheduled posts, polls, articles, and XChat. Even if each tool is individually useful, the sheer volume makes the toolset unwieldy and hard for an agent to navigate efficiently.

Completeness2/5

The surface is broad but has notable dead ends: there is no delete_list despite full list CRUD otherwise, no media upload tool even though media_ids appear in several args, and create_poll returns a poll_uri that send_tweet does not actually accept. These are significant gaps that will cause real agent workflow failures.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server for interacting with the Twitter/X API v2, enabling AI assistants to retrieve tweets, post content, reply, quote, and more programmatically.
    867
    13
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    An MCP server for interacting with X/Twitter, enabling posting tweets, searching, user info, timeline, liking, retweeting, and deleting tweets.
    7
    16
    1
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables posting tweets, reading timelines, searching posts, and interacting with X (Twitter) API.
    11
    2
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for the Twitter/X read API, enabling search, user profiles, tweets, followers, and more via natural language.
    94
    682
    MIT