消息平台集成工具

Nexus是一个通过Model Context Protocol (MCP)为AI代理提供跨平台消息访问的单一二进制工具,支持Telegram、Gmail、WhatsApp、Slack和Discord。

  • by santoshakil
  • Rust
  • 本地部署
  • 7 星标
  • 更新于
在 GitHub 查看 santoshakil/nexus

使用说明

纽带

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/

先决条件:

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"}]
}

错误包括建议(可操作的修复)和操作是否可重试。

平台设置指南

电报

  1. 首选 my.telegram.org 并创建应用程序
  2. 注意你的 API_ID 和 API_HASH
  3. 设置环境变量:
    export TELEGRAM_API_ID=12345678
    export TELEGRAM_API_HASH=abcdef1234567890abcdef1234567890
    
  4. 运行一次性身份验证:
    nexus auth telegram
    
    输入您的电话号码、短信代码和2FA密码(如果已启用)。
  5. 会话已保存到 ~/.nexus/tdlib/ --除非撤销会话,否则您不需要再次进行身份验证。

注: Telegram需要 TDLib (libtdjson.so)安装在 /usr/local/lib。请参阅 TDLib构建指南 为了你的平台。集 TDLIB_DIR env-var(如果安装在其他地方)。

Gmail

  1. 在您的Google帐户上启用两步验证
  2. 在以下位置生成应用程序密码 myaccount.google.com/apppasswords
    • 选择“邮件”作为应用程序
    • 复制16个字符的密码
  3. 设置环境变量:
    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

  1. 创建一个 元开发人员 账户
  2. 使用WhatsApp产品创建新应用程序
  3. 从WhatsApp API仪表板获取您的访问令牌和电话号码ID
  4. 设置环境变量:
    export WHATSAPP_ACCESS_TOKEN=your_token
    export WHATSAPP_PHONE_NUMBER_ID=your_phone_id
    

限制: WhatsApp商务云API仅支持发送消息。无法通过API读取消息历史记录或搜索消息。

Slack

  1. 首选 api.slack.com/apps 并创建新应用程序
  2. 在...之下 OAuth和权限,添加以下bot令牌范围:
    • channels:history, channels:read, channels:write
    • chat:write
    • groups:history, groups:read
    • im:history, im:read
    • mpim:history, mpim:read
    • reactions:read, reactions:write
    • users:read
    • files:write (用于文件上传)
  3. 将应用程序安装到您的工作区
  4. 复制Bot用户OAuth令牌(xoxb-...)
  5. 设置环境变量:
    export SLACK_BOT_TOKEN=xoxb-your-bot-token
    

Discord 的中文翻译是“不和谐”或“纷争”。

  1. 首选 confirm.com/developers/applications
  2. 创建一个新应用
  3. 首选 机器人 选项卡并创建bot
  4. 启用这些特权网关意图: 消息内容意图
  5. 复制机器人令牌
  6. 使用OAuth2 URL生成器将机器人邀请到您的服务器 bot 范围和这些权限:
    • 阅读消息/查看频道
    • 发送消息
    • 管理消息(用于固定/删除)
    • 添加反应
    • 读取消息历史记录
    • 创建公共线程
  7. 设置环境变量:
    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 WhatsApp 商业云API令牌
WHATSAPP_PHONE_NUMBER_ID WhatsApp 发件人电话号码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" --使用 ? 或 match
  • clippy::expect_used = "deny" --使用 ? 或 match
  • unused_must_use = "deny"
  • unsafe_code = "warn" (仅允许进入 infra-tdlib FFI)

添加新平台

  1. 创建 crates/infra-{name}/ 随着 Cargo.toml 和 src/adapter.rs
  2. 添加变体 Platform 枚举在 core-domain/src/entities.rs
  3. 实施 MessagingPort 性状(6种方法)
  4. 可选地在中添加扩展特性 core-domain/src/ports.rs
  5. 在中注册适配器 app-mcp/src/main.rs
  6. 在中添加工具定义 app-mcp/src/mcp/tools.rs
  7. 电汇 app-mcp/src/mcp/server.rs

添加新工具

  1. 将该方法添加到中的相关扩展特征中 core-domain/src/ports.rs
  2. 在适配器中实现它(例如。, infra-tdlib/src/adapter.rs)
  3. 添加一个 ToolDef 在 app-mcp/src/mcp/tools.rs
  4. 在中添加调度臂 app-mcp/src/mcp/server.rs

贡献

欢迎捐款。拜托:

  1. 分叉仓库并创建功能分支
  2. 确保 cargo clippy --workspace -- -D warnings 无警告通过
  3. 确保 cargo check --workspace 编译干净
  4. 跑 bash tests/mcp_protocol_test.sh (需要调试版本)
  5. 保持提交原子性和描述性
  6. 打开一个带有清晰描述的拉取请求

许可证

麻省理工学院——见 许可证 了解详情。