mcp-server-post-x
X(推特)的MCP(模型上下文协议)服务器。使用OAuth 1.0a和X API v2。支持多个帐户。
使用JSON-RPC 2.0通过stdio进行通信。
工具
| 工具 | 说明 |
|---|---|
list_accounts | 列出可用帐户以及默认帐户 |
post_tweet | 发布带有可选媒体的推文(最多4张图片、1个视频或1个GIF) |
post_thread | 发布最多25条推文,每条推文都有可选媒体 |
delete_tweet | 按ID或URL删除推文 |
upload_media | 上传媒体以供稍后附件(返回media_id) |
search_tweets | 使用推特运营商搜索最近的推文(过去7天) |
get_timeline | 按逆时间顺序获取您的家庭时间表 |
get_me | 获取经过身份验证的用户的个人资料 |
lookup_user | 通过@username或数字ID查找任何用户 |
get_followers | 列出您的关注者(分页) |
get_following | 列出你关注的人(分页) |
get_all_followers | 在一次通话中获取所有关注者(自动分页) |
get_all_following | 在一次通话中获取您关注的所有帐户(自动分页) |
like_tweet | 通过ID或URL发送推文 |
unlike_tweet | 与按ID或URL发布的推文不同 |
retweet | 通过ID或URL转发推文 |
unretweet | 按ID或URL撤消转发 |
get_dm_events | 获取所有对话中的最新直接消息 |
send_dm | 向对话发送直接消息 |
follow_user | 按用户名或ID跟踪用户 |
unfollow_user | 按用户名或ID取消关注用户 |
所有工具都接受可选 account 参数来选择要使用的X帐户。省略它以使用默认帐户。
快速开始
1.建造
cargo build --release生产 target/release/post-x (用LTO优化,剥离)。
2.配置凭据
创建配置文件:
mkdir -p ~/.config/mcp-server-post-x创建 ~/.config/mcp-server-post-x/config.toml:
单一账户 (没有 default_account 需要):
[accounts.myaccount]
api_key = "your-api-key"
api_key_secret = "your-api-key-secret"
access_token = "your-access-token"
access_token_secret = "your-access-token-secret"多个帐户:
default_account = "myaccount"
[accounts.myaccount]
api_key = "your-api-key"
api_key_secret = "your-api-key-secret"
access_token = "your-access-token"
access_token_secret = "your-access-token-secret"
[accounts.otheraccount]
api_key = "your-api-key"
api_key_secret = "your-api-key-secret"
access_token = "other-access-token"
access_token_secret = "other-access-token-secret"笔记:
- 帐户密钥是X个用户名(例如。
[accounts.codechap]) - 如果您有多个帐户,
default_account是必需的 - 如果你有一个账户,
default_account可选(自动检测) - 多个帐户可以共享同一个
api_key/api_key_secret(相同的X应用程序)。唯有access_token/access_token_secret每个帐户不同。
保护它:
chmod 700 ~/.config/mcp-server-post-x
chmod 600 ~/.config/mcp-server-post-x/config.toml看 获取凭据 下面是如何获得这些。
3.添加到您的MCP客户端
克劳德代码(~/.claude.json):
{
"mcpServers": {
"post-x": {
"command": "/path/to/post-x"
}
}
}然后问克劳德这样的问题:
- “发布一条推特,向世界问好”
- “发布一条推特作为securechap,向世界问好”
- “搜索有关Rust的推文”
- “显示我的时间表”
- “就像这条推文:https://x.com/someone/status/123456"
- “谁是我的追随者?”
- “查找@elonmusk”
- “列出我的帐户”
工具参考
list_计数
没有必需的参数。返回默认的可用帐户名和缓存的用户名。
post_tweet
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
text | string | yes | 推文文本(最多280个字符) |
media | array | no | 要上传和附加的媒体。每个项目: { path, alt_text? }最多4张图片,或1个视频,或1张GIF。 |
media_ids | array | no | 要附加的预上传媒体ID(最多4个)。相互排斥 media. |
reply_to | string | 否 | 要回复的推特ID |
post_thread
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
tweets | array | yes | 推文数组(最多25条)。每个: { text, media? } |
转推/喜欢/不喜欢/转发
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
tweet_id | string | yes | 推特ID或完整推特URL |
所有接受URL,如 https://x.com/user/status/123456 --ID被自动提取。
upload_media
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
path | string | yes | 本地文件路径。支持:jpeg/png/webp(最大5MB),gif(最大15MB),mp4(最大512MB) |
alt_text | string | no | Alt text(仅限图像和GIF,不包括视频) |
返回a media_id 与一起使用 post_tweets media_ids 参数。
搜索推特
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
query | string | yes | 搜索查询。支持: from:user, #hashtag, @mention, "exact phrase", -exclude, lang:en |
max_results | 整数 | 否 | 10-100(默认值10) |
sort_order | string | 否 | recency 或 relevancy |
pagination_token | string | no | 来自上一个响应的下一页标记 |
get_timeline
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
max_results | 整数 | 否 | 1-100(默认值20) |
exclude | string | 否 | replies, retweets,或两者用逗号分隔 |
pagination_token | string | no | 下一页标记 |
lookup_user/follow_user/unfollow_user
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
user | string | yes | 用户名(带或不带 @)或数字用户ID |
get_followpowers/get_following
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
max_results | 整数 | 否 | 1-100(默认值20) |
pagination_token | string | no | 下一页标记 |
获取所有关注者/获取所有关注
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
自动分页所有结果(每页100个),并在单个响应中返回完整列表。包括页面之间200毫秒的延迟,以遵守速率限制。
get_dm-events
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
max_results | 整数 | 否 | 1-100(默认值20) |
pagination_token | string | no | 下一页标记 |
send_dm
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
conversation_id | string | yes | DM对话ID(从获取 get_dm_events) |
text | string | yes | 消息文本 |
get_me
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
account | string | 否 | 要使用的帐户(默认省略) |
返回您的用户ID、显示名称和@username。
添加其他帐户
要在没有单独开发人员帐户的情况下将另一个X帐户添加到现有应用程序中,请使用附带的OAuth授权脚本:
./oauth-authorize.sh这将运行基于PIN的3标签OAuth 1.0a流:
- 打开新帐户授权您的应用程序的URL
- 将PIN粘贴回终端
- 它输出
[accounts.username]要添加到您的配置块config.toml
所有帐户共享相同的应用程序和计费积分。
获取凭据
- 首选 developer.x.com 并注册开发人员帐户
- 在开发人员控制台中创建项目和应用程序
- 在应用程序设置中,设置 用户认证:
- 应用程序权限: 读写 (以及 私信 如果您需要DM支持) - 类型: Web应用程序、自动应用程序或机器人 - 回调URL: https://example.com (未使用,但必需) - 网站URL:任何有效的URL
- 首选 密钥和令牌 并生成:
- API密钥 和 API密钥秘密 (消费者密钥下) - 访问令牌 和 访问令牌密钥 (在身份验证令牌下)
- 将所有四个值复制到您的
config.toml在...之下[accounts.yourusername]
服务器在启动时验证凭据。如果您遇到持续的401错误,请在以下位置重新生成您的令牌 developer.x.com.
发展
cargo build # debug build
cargo run # run in dev mode
RUST_LOG=debug cargo run # debug logging (credentials are redacted)技术细节
- 认证: OAuth 1.0a,带有HMAC-SHA1签名(RFC 5849,RFC 3986%编码)
- 多账户: 每个服务器实例有多个X帐户,每个工具调用都可以选择
- 推特API: X API v2(
api.x.com/2/) - 媒体上传: v1.1分块上传(
upload.twitter.com/1.1/media/upload.json)--视频/GIF的INIT/APPEND/FINALIZE/STATUS流,图像的简单多部分 - 媒体限制: JPEG/PNG/WebP高达5MB,GIF高达15MB,MP4高达512MB
- 媒体验证: 每条推特最多4张图片或1个视频或1个GIF(不得混合)
- 帖子: 推文之间500毫秒的延迟,通过链接
in_reply_to_tweet_id - 重试逻辑: 对503个错误进行指数回退的自动重试
- 费率限制: 429响应在错误消息中包含重置时间戳(没有自动重试——由调用者决定)
项目结构
src/
main.rs — entry point, config loading, tracing, stdio transport
server.rs — MCP tool handlers, response formatting, multi-account routing
api.rs — X API client: OAuth signing, tweet/media/user/DM endpoints
params.rs — tool parameter types (serde + JSON Schema)