使用说明
纽带
MCP服务器,允许AI代理访问消息传递平台。一个二进制,五个平台。
Telegram · Gmail · WhatsApp · Slack · Discord
Nexus实现了 模型上下文协议 (MCP)超过stdio,暴露 48工具 让AI代理通过统一的界面跨平台读取、发送、搜索和管理消息。
内置纯Rust。无MCP SDK依赖关系——手工制作JSON-RPC 2.0。单二进制,~4MB版本。
为什么选择Nexus?
AI代理需要进行通信。他们需要阅读你的Telegram消息、发送电子邮件、搜索Slack历史记录和管理Discord频道,但每个平台都有自己的API、身份验证流和数据模型。
Nexus将所有这些统一在MCP背后。将其连接到 克劳德代码, 克劳德桌面,或任何MCP客户端,您的代理可以即时访问您的消息世界。
代理可以用Nexus做什么:
- 在所有平台上读取和发送消息
- 搜索聊天记录(查找几个月前的消息)
- 管理电子邮件(存档、标签、星号、草稿、带附件发送)
- 转发、固定、响应、编辑和删除Telegram消息
- 创建Slack频道、设置主题、管理反应
- 列出不和谐公会,创建线程,固定消息
- 从任何平台下载媒体和附件
快速开始
1.安装
来源:
git clone https://github.com/santoshakil/nexus.git
cd nexus
cargo build --release
cp target/release/nexus ~/.local/bin/
先决条件:
- 锈蚀1.75+
- TDLib(
libtdjson.so)--只需要Telegram支持。看 TDLib构建说明.
2.配置
复制示例env文件并填写所需的平台:
cp .env.example .env
您只需配置要使用的平台。Nexus默默地跳过未配置的平台。
# Telegram (get from https://my.telegram.org)
TELEGRAM_API_ID=12345678
TELEGRAM_API_HASH=abcdef1234567890abcdef1234567890
# Gmail (generate App Password at https://myaccount.google.com/apppasswords)
GMAIL_ADDRESS=you@gmail.com
GMAIL_APP_PASSWORD=xxxx xxxx xxxx xxxx
# WhatsApp Business Cloud API (https://developers.facebook.com)
WHATSAPP_ACCESS_TOKEN=your_token
WHATSAPP_PHONE_NUMBER_ID=your_phone_id
# Slack (create app at https://api.slack.com/apps)
SLACK_BOT_TOKEN=xoxb-your-bot-token
# Discord (create app at https://discord.com/developers/applications)
DISCORD_BOT_TOKEN=your_bot_token
3.验证电报(一次性)
Telegram首次需要交互式登录:
nexus auth telegram
这将提示您输入电话号码、短信代码和可选的2FA密码。会话已保存到 ~/.nexus/tdlib/ 并自动重复使用。
4.连接到克劳德代码
添加到您的Claude Code MCP配置中(~/.claude/claude_code_config.json):
{
"mcpServers": {
"nexus": {
"command": "nexus",
"args": ["mcp"],
"env": {
"TELEGRAM_API_ID": "12345678",
"TELEGRAM_API_HASH": "abcdef1234567890abcdef1234567890",
"GMAIL_ADDRESS": "you@gmail.com",
"GMAIL_APP_PASSWORD": "xxxx xxxx xxxx xxxx"
}
}
}
}
或者选择Claude Desktop(claude_desktop_config.json):
{
"mcpServers": {
"nexus": {
"command": "/path/to/nexus",
"args": ["mcp"],
"env": {
"TELEGRAM_API_ID": "12345678",
"TELEGRAM_API_HASH": "abcdef1234567890abcdef1234567890"
}
}
}
}
工具
Nexus动态公开工具——只有配置平台的工具才会出现在 tools/list.
通用工具(所有平台)
| 工具 | 说明 |
|---|---|
list_platforms |
列出连接的平台 |
get_profile |
获取经过身份验证的用户配置文件 |
list_channels |
列出聊天记录、文件夹、频道 |
read_messages |
读取带分页的邮件 |
send_message |
发送消息(可选回复) |
search |
跨平台搜索邮件 |
电报工具(13)
| 工具 | 说明 |
|---|---|
telegram_search_chat |
在特定聊天中搜索 |
telegram_get_message |
获取包含完整元数据的单个消息 |
telegram_get_chat_info |
聊天详情、会员数量、描述 |
telegram_get_chat_members |
列出具有角色的成员 |
telegram_send_media |
发送照片/视频/文件 |
telegram_download_media |
将媒体下载到本地文件 |
telegram_forward_message |
聊天之间转发 |
telegram_edit_message |
编辑您发送的消息 |
telegram_delete_messages |
删除邮件 |
telegram_pin_message |
固定消息 |
telegram_unpin_message |
不愉快的消息 |
telegram_mark_read |
将邮件标记为已读 |
telegram_react |
添加表情符号反应 |
Gmail工具(13)
| 工具 | 说明 |
|---|---|
gmail_send_email |
使用CC、BCC、附件发送 |
gmail_create_draft |
创建草稿而不发送 |
gmail_archive |
从收件箱中删除 |
gmail_trash |
移至垃圾箱 |
gmail_move_to |
移动到任何文件夹 |
gmail_list_labels |
列出所有标签/文件夹 |
gmail_add_label |
为邮件添加标签 |
gmail_remove_label |
从邮件中删除标签 |
gmail_mark_read |
标记为已读 |
gmail_mark_unread |
标记为未读 |
gmail_star |
发送一条消息 |
gmail_unstar |
取消标记消息 |
gmail_get_attachment |
将附件下载到文件 |
Slack工具(9)
| 工具 | 说明 |
|---|---|
slack_set_status |
设置状态消息和表情符号 |
slack_create_channel |
创建新频道 |
slack_invite_to_channel |
邀请用户加入频道 |
slack_set_topic |
设置频道主题 |
slack_add_reaction |
对消息作出反应 |
slack_remove_reaction |
消除反应 |
slack_upload_file |
将文件上传到频道 |
slack_list_users |
列出工作区用户 |
slack_get_user_info |
获取用户配置文件详细信息 |
Discord工具(6)
| 工具 | 说明 |
|---|---|
discord_list_guilds |
列出机器人所在的服务器 |
discord_list_guild_channels |
列出服务器中的频道 |
discord_create_thread |
创建一个线程 |
discord_add_reaction |
对消息作出反应 |
discord_remove_reaction |
消除反应 |
discord_pin_message |
固定消息 |
WhatsApp工具(1)
| 工具 | 说明 |
|---|---|
whatsapp_send_media |
将媒体文件发送到号码 |
WhatsApp商务云API仅限于发送。消息历史记录无法通过API获得。
格式系统
每个数据返回工具都接受一个可选 format 参数:
| 格式 | 行为 | 用例 |
|---|---|---|
compact (默认) |
每项一行,文本截断为200个字符 | 浏览、扫描、令牌高效 |
expanded |
每项一行,完整的未删节文本 | 阅读完整的消息 |
full |
使用所有字段完成JSON | 当您需要精确的字段值时 |
示例:
紧凑型(默认):
[Jan 15 10:30] John Doe (@john): Hey, I was thinking about the architecture for the new... (id:123456)
扩大:
[Jan 15 10:30] John Doe (@john): Hey, I was thinking about the architecture for the new messaging service. We should probably use a hexagonal pattern with ports and adapters. What do you think? (id:123456)
满:
{"id":"123456","platform":"telegram","channel_id":"-100123","sender":"John Doe","text":"Hey, I was thinking about...","timestamp":1705312200,...}
建筑
六角形(端口和适配器),带9个工作区板条箱:
app-mcp ──→ mod-messaging ──→ core-domain ──→ core-error
↑ ↑
infra-tdlib (port traits)
infra-google
infra-whatsapp
infra-slack
infra-discord
| 层 | 板条箱 | 用途 |
|---|---|---|
| 核心 | core-error |
AgentError 带有建议和可重试标志的枚举 |
| 核心 | core-domain |
共享实体(Message, Channel, Profile等)和港口特征(MessagingPort, TelegramExt, GmailExt等等) |
| 模块 | mod-messaging |
AgentService (平台注册+路由)和 Format 发动机 |
| 基础设施 | infra-tdlib |
通过TDLib FFI发送电报(4个C函数,专用接收线程) |
| 基础设施 | infra-google |
通过IMAP+SMTP发送Gmail(连接池、MIME解码) |
| 基础设施 | infra-whatsapp |
WhatsApp商务云API通过HTTP |
| 基础设施 | infra-slack |
通过HTTP的Slack Web API |
| 基础设施 | infra-discord |
Discord Bot API v10通过HTTP |
| 应用 | app-mcp |
二进制:CLI、MCP服务器(stdio JSON-RPC)、工具定义 |
MCP协议
Nexus使用 stdio上以换行符分隔的JSON-RPC 2.0 (不是Content-Length标头)。stdout专门用于JSON-RPC响应。所有日志记录都通过以下方式发送到stderr tracing.
错误处理
每个错误都包含上下文,以帮助AI代理恢复:
{
"isError": true,
"content": [{"type": "text", "text": "[auth] Telegram session expired | try: re-run `nexus auth telegram` | retryable: false"}]
}
错误包括建议(可操作的修复)和操作是否可重试。
平台设置指南
电报
- 首选 my.telegram.org 并创建应用程序
- 注意你的
API_ID和API_HASH - 设置环境变量:
export TELEGRAM_API_ID=12345678 export TELEGRAM_API_HASH=abcdef1234567890abcdef1234567890 - 运行一次性身份验证:输入您的电话号码、短信代码和2FA密码(如果已启用)。
nexus auth telegram - 会话已保存到
~/.nexus/tdlib/--除非撤销会话,否则您不需要再次进行身份验证。
注: Telegram需要 TDLib (libtdjson.so)安装在 /usr/local/lib。请参阅 TDLib构建指南 为了你的平台。集 TDLIB_DIR env-var(如果安装在其他地方)。
Gmail
- 在您的Google帐户上启用两步验证
- 在以下位置生成应用程序密码 myaccount.google.com/apppasswords
- 选择“邮件”作为应用程序
- 复制16个字符的密码
- 设置环境变量:
export GMAIL_ADDRESS=you@gmail.com export GMAIL_APP_PASSWORD="xxxx xxxx xxxx xxxx"
Gmail搜索语法: 这 search 工具接受IMAP条件:
- 简单文本:
"meeting notes"(搜索正文) - 发件人:
FROM sender@example.com - 按主题:
SUBJECT "quarterly report" - 截止日期:
SINCE 01-Jan-2025 - 仅未读:
UNSEEN - 合并:
FROM boss@company.com SINCE 01-Feb-2025 UNSEEN
- 创建一个 元开发人员 账户
- 使用WhatsApp产品创建新应用程序
- 从WhatsApp API仪表板获取您的访问令牌和电话号码ID
- 设置环境变量:
export WHATSAPP_ACCESS_TOKEN=your_token export WHATSAPP_PHONE_NUMBER_ID=your_phone_id
限制: WhatsApp商务云API仅支持发送消息。无法通过API读取消息历史记录或搜索消息。
Slack
- 首选 api.slack.com/apps 并创建新应用程序
- 在...之下 OAuth和权限,添加以下bot令牌范围:
channels:history,channels:read,channels:writechat:writegroups:history,groups:readim:history,im:readmpim:history,mpim:readreactions:read,reactions:writeusers:readfiles:write(用于文件上传)
- 将应用程序安装到您的工作区
- 复制Bot用户OAuth令牌(
xoxb-...) - 设置环境变量:
export SLACK_BOT_TOKEN=xoxb-your-bot-token
Discord 的中文翻译是“不和谐”或“纷争”。
- 首选 confirm.com/developers/applications
- 创建一个新应用
- 首选 机器人 选项卡并创建bot
- 启用这些特权网关意图: 消息内容意图
- 复制机器人令牌
- 使用OAuth2 URL生成器将机器人邀请到您的服务器
bot范围和这些权限:- 阅读消息/查看频道
- 发送消息
- 管理消息(用于固定/删除)
- 添加反应
- 读取消息历史记录
- 创建公共线程
- 设置环境变量:
export DISCORD_BOT_TOKEN=your_bot_token
CLI参考
# Start the MCP server (default command)
nexus mcp
# Authenticate with Telegram (interactive, one-time)
nexus auth telegram
# Show help and environment variables
nexus help
环境变量
| 变量 | 平台 | 描述 |
|---|---|---|
TELEGRAM_API_ID |
电报 | API ID来自my.Telegram.org |
TELEGRAM_API_HASH |
电报 | 来自my.Telegram.org的API散列 |
GMAIL_ADDRESS |
Gmail | 您的Gmail地址 |
GMAIL_APP_PASSWORD |
Gmail | 应用程序密码(不是您的常规密码) |
WHATSAPP_ACCESS_TOKEN |
商业云API令牌 | |
WHATSAPP_PHONE_NUMBER_ID |
发件人电话号码ID | |
SLACK_BOT_TOKEN |
Slack | 机器人用户OAuth令牌(xoxb-...) |
DISCORD_BOT_TOKEN |
Discord | 机器人令牌 |
NEXUS_DATA_DIR |
全部 | 数据目录(默认: ~/.nexus) |
RUST_LOG |
全部 | 日志级别(默认值: nexus=info) |
从源头构建
# Debug build
cargo build --workspace
# Release build (optimized, ~4MB)
cargo build --release
# Check/lint
cargo check --workspace
cargo clippy --workspace -- -D warnings
# Run protocol tests (needs debug build)
cargo build --workspace
bash tests/mcp_protocol_test.sh
生成配置
发布配置文件针对小二进制大小进行了优化:
- LTO:脂肪(链接时间优化)
- 编码单元:1
- 条带:已启用
- 恐慌:流产
工作区过梁
这些规定适用于所有板条箱:
clippy::unwrap_used = "deny"--使用?或matchclippy::expect_used = "deny"--使用?或matchunused_must_use = "deny"unsafe_code = "warn"(仅允许进入infra-tdlibFFI)
添加新平台
- 创建
crates/infra-{name}/随着Cargo.toml和src/adapter.rs - 添加变体
Platform枚举在core-domain/src/entities.rs - 实施
MessagingPort性状(6种方法) - 可选地在中添加扩展特性
core-domain/src/ports.rs - 在中注册适配器
app-mcp/src/main.rs - 在中添加工具定义
app-mcp/src/mcp/tools.rs - 电汇
app-mcp/src/mcp/server.rs
添加新工具
- 将该方法添加到中的相关扩展特征中
core-domain/src/ports.rs - 在适配器中实现它(例如。,
infra-tdlib/src/adapter.rs) - 添加一个
ToolDef在app-mcp/src/mcp/tools.rs - 在中添加调度臂
app-mcp/src/mcp/server.rs
贡献
欢迎捐款。拜托:
- 分叉仓库并创建功能分支
- 确保
cargo clippy --workspace -- -D warnings无警告通过 - 确保
cargo check --workspace编译干净 - 跑
bash tests/mcp_protocol_test.sh(需要调试版本) - 保持提交原子性和描述性
- 打开一个带有清晰描述的拉取请求
许可证
麻省理工学院——见 许可证 了解详情。