telegram-mcp

GitHub
957 241 简单 1 次阅读 今天Apache-2.0其他数据工具开发框架插件语言模型
AI 解读 由 AI 自动生成,仅供参考

telegram-mcp 是一款基于 Telethon 构建的开源服务器,旨在让支持模型上下文协议(MCP)的 AI 客户端(如 Claude、Cursor)能够直接操控你的 Telegram 账号。它解决了传统 AI 助手无法深度介入即时通讯场景的痛点,将聊天阅读、群组管理、消息收发及媒体处理等复杂操作转化为自然语言指令,让用户能像与人对话一样指挥 AI 完成自动化任务。

这款工具特别适合开发者、技术研究人员以及希望提升工作效率的高级用户。通过它,你可以轻松实现自动回复、聊天记录分析、社群成员管理甚至频道运营等流程,极大地扩展了 AI 在社交网络中的应用边界。其核心技术亮点在于全面集成了 Telethon 的强大功能,几乎覆盖了 Telegram 的所有主要特性,从基础的发送消息到复杂的权限管理(如封禁用户、设置管理员)均可通过标准化工具调用完成。此外,项目提供了完善的 Docker 部署方案与严格的代码质量监控,确保了运行的稳定性与安全性,是构建智能社交代理的理想基石。

使用场景

某开源项目维护者每天需处理数百条来自全球开发者的 Telegram 社群反馈,并同步整理至项目看板。

没有 telegram-mcp 时

  • 信息检索低效:维护者必须手动在 Telegram 桌面端或手机端翻找历史消息,难以通过自然语言(如“上周关于 API 超时的报错”)快速定位关键讨论。
  • 响应流程割裂:回复用户、置顶重要公告或移除广告机器人需要在不同界面间切换,无法在编写代码或查看文档的同一工作流中完成操作。
  • 社群管理滞后:面对突发的大量垃圾信息或违规用户,无法即时批量执行禁言或踢出操作,依赖人工逐个点击,响应速度慢且易遗漏。
  • 数据沉淀困难:有价值的技术讨论散落在聊天记录中,缺乏自动化手段将其提取并结构化存储到知识库或任务管理系统中。

使用 telegram-mcp 后

  • 智能对话检索:直接在 Claude 或 Cursor 中输入指令,telegram-mcp 即可自动筛选并总结特定时间段、关键词相关的聊天记录,瞬间呈现上下文。
  • 工作流无缝集成:开发者在阅读代码的同时,可命令 AI 直接调用 send_message 回复用户、pin_message 置顶修复公告,实现“对话即操作”。
  • 自动化社群治理:结合 AI 判断,自动调用 ban_userdelete_message 清理违规内容,甚至根据预设规则自动提升活跃贡献者为管理员 (promote_admin)。
  • 知识自动归档:利用 list_messages 提取高质量讨论,由 AI 自动摘要并生成 Markdown 文档,一键同步至项目 Wiki 或 Issue 追踪系统。

telegram-mcp 将原本割裂的社群运营动作转化为自然的语言指令,让开发者能在编码环境中一站式完成从信息获取到社群治理的全闭环。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明

内存

未说明

依赖
notes该工具是一个 Telegram MCP 服务器,用于与 Claude、Cursor 等客户端集成。运行前需在 my.telegram.org 获取 API ID 和 Hash,并生成会话字符串 (Session String)。文件路径操作功能默认禁用,需配置允许根目录方可使用。支持通过 Docker 或本地 uv 环境运行。
python3.10+
Telethon
MCP Python SDK
uv
telegram-mcp hero image

快速开始

Telegram MCP Server

MCP徽章 许可证:Apache 2.0 Python代码风格检查与格式化 Docker构建与Compose验证


🤖 MCP实战

以下是Claude中Telegram MCP功能的演示(参考Anthropic文档):

基本使用示例:

Telegram MCP实战

  1. 示例:让Claude分析聊天记录并发送回复:

Telegram MCP请求

  1. 成功向群组发送消息:

Telegram MCP结果

正如你所见,AI可以无缝地与你的Telegram账号交互,以自然的方式获取并展示你的聊天、消息及其他数据。


一个功能齐全的Telegram集成工具,适用于Claude、Cursor以及任何兼容MCP的客户端,由Telethon模型上下文协议(MCP)提供支持。该项目使你能够以编程方式与Telegram账号互动,自动化从消息发送到群组管理的各项操作。


🚀 功能与工具

该MCP服务器提供了庞大的Telegram工具集。所有主要的Telegram/Telethon功能都可作为工具使用!

聊天与群组管理

  • get_chats(page, page_size):分页显示聊天列表
  • list_chats(chat_type, limit):按元数据和筛选条件列出聊天
  • get_chat(chat_id):获取聊天的详细信息
  • create_group(title, user_ids):创建新群组
  • invite_to_group(group_id, user_ids):邀请用户加入群组或频道
  • create_channel(title, about, megagroup):创建频道或超级群组
  • edit_chat_title(chat_id, title):更改聊天/群组/频道标题
  • delete_chat_photo(chat_id):移除聊天/群组/频道头像
  • leave_chat(chat_id):退出群组或频道
  • get_participants(chat_id):列出所有参与者
  • get_admins(chat_id):列出所有管理员
  • get_banned_users(chat_id):列出所有被禁用的用户
  • promote_admin(chat_id, user_id):将用户提升为管理员
  • demote_admin(chat_id, user_id):将管理员降级为普通用户
  • ban_user(chat_id, user_id):封禁用户
  • unban_user(chat_id, user_id):解封用户
  • get_invite_link(chat_id):获取邀请链接
  • export_chat_invite(chat_id):导出邀请链接
  • import_chat_invite(hash):通过邀请哈希加入聊天
  • join_chat_by_link(link):通过邀请链接加入聊天
  • subscribe_public_channel(channel):通过用户名或ID订阅公开频道或超级群组

消息发送

  • get_messages(chat_id, page, page_size):分页显示消息
  • list_messages(chat_id, limit, search_query, from_date, to_date):筛选消息
  • list_topics(chat_id, limit, offset_topic, search_query):列出超级群组中的论坛主题
  • send_message(chat_id, message):发送消息
  • reply_to_message(chat_id, message_id, text):回复消息
  • edit_message(chat_id, message_id, new_text):编辑自己的消息
  • delete_message(chat_id, message_id):删除消息
  • forward_message(from_chat_id, message_id, to_chat_id):转发消息
  • pin_message(chat_id, message_id):置顶消息
  • unpin_message(chat_id, message_id):取消置顶
  • mark_as_read(chat_id):标记全部消息为已读
  • get_message_context(chat_id, message_id, context_size):获取消息周围的上下文
  • get_history(chat_id, limit):获取完整的聊天记录
  • get_pinned_messages(chat_id):列出所有置顶消息
  • get_last_interaction(contact_id):获取与联系人的最新消息
  • create_poll(chat_id, question, options, multiple_choice, quiz_mode, public_votes, close_date):创建投票
  • list_inline_buttons(chat_id, message_id, limit):查看内联键盘以发现按钮文本/索引
  • press_inline_button(chat_id, message_id, button_text, button_index):通过标签或索引触发内联键盘回调
  • send_reaction(chat_id, message_id, emoji, big=False):为消息添加反应
  • remove_reaction(chat_id, message_id):移除消息上的反应
  • get_message_reactions(chat_id, message_id, limit=50):获取消息的所有反应

联系人管理

  • list_contacts():列出所有联系人
  • search_contacts(query):搜索联系人
  • add_contact(phone, first_name, last_name):添加联系人
  • delete_contact(user_id):删除联系人
  • block_user(user_id):阻止用户
  • unblock_user(user_id):解除阻止
  • import_contacts(contacts):批量导入联系人
  • export_contacts():将所有联系人导出为JSON文件
  • get_blocked_users():列出被阻止的用户
  • get_contact_ids():列出所有联系人ID
  • get_direct_chat_by_contact(contact_query):查找与特定联系人的直接聊天
  • get_contact_chats(contact_id):列出与特定联系人的所有聊天

用户与个人资料

  • get_me():获取你的用户信息
  • update_profile(first_name, last_name, about):更新个人资料
  • set_profile_photo(file_path):从允许的根目录设置头像
  • delete_profile_photo():移除头像
  • get_user_photos(user_id, limit):获取用户的个人资料照片
  • get_user_status(user_id):获取用户的在线状态

媒体

  • get_media_info(chat_id, message_id):获取消息中媒体的相关信息
  • send_file(chat_id, file_path, caption):从允许的根目录发送本地文件
  • download_media(chat_id, message_id, file_path):将消息中的媒体保存到允许的根目录下
  • upload_file(file_path):上传本地文件并返回上传元数据
  • send_voice(chat_id, file_path):从允许的根目录发送.ogg/.opus语音消息
  • send_sticker(chat_id, file_path):从允许的根目录发送.webp贴纸
  • edit_chat_photo(chat_id, file_path):从允许的根目录更新聊天头像

搜索与发现

  • search_public_chats(query, limit):搜索公开聊天/频道/机器人,结果数量可配置
  • search_messages(chat_id, query, limit):在聊天中搜索消息
  • search_global(query, page, page_size):全球范围内分页搜索消息
  • resolve_username(username):将用户名解析为ID

贴纸、GIF、机器人

  • get_sticker_sets(): 列出贴纸集
  • get_bot_info(bot_username): 获取机器人信息
  • set_bot_commands(bot_username, commands): 设置机器人命令(仅限机器人账号)

隐私、设置及其他

  • get_privacy_settings(): 获取隐私设置
  • set_privacy_settings(key, allow_users, disallow_users): 设置隐私设置
  • mute_chat(chat_id): 静音通知
  • unmute_chat(chat_id): 取消静音通知
  • archive_chat(chat_id): 归档聊天
  • unarchive_chat(chat_id): 取消归档聊天
  • get_recent_actions(chat_id): 获取最近的管理员操作

草稿

  • save_draft(chat_id, message, reply_to_msg_id, no_webpage): 将草稿消息保存到聊天或频道
  • get_drafts(): 获取所有聊天中的所有草稿消息
  • clear_draft(chat_id): 清除/删除特定聊天中的草稿

输入验证

为提高健壮性,所有接受 chat_iduser_id 参数的函数现在都包含输入验证。您可以使用以下任意格式来提供这些 ID:

  • 整数 ID:用户、聊天或频道的直接整数 ID(例如 123456789-1001234567890)。
  • 字符串 ID:以字符串形式提供的整数 ID(例如 "123456789")。
  • 用户名:用户或频道的公开用户名(例如 "@username""username")。

服务器会自动验证输入并将其转换为正确的格式,然后再向 Telegram 发送请求。如果输入无效,则会返回明确的错误信息。

文件路径工具安全模型

文件路径工具现已可用,但默认处于禁用状态,直到配置了允许的根目录。

支持的文件路径工具:

  • send_file, download_media, set_profile_photo, edit_chat_photo, send_voice, send_sticker, upload_file

安全语义(与 MCP 文件系统服务器一致):

  • 服务器端白名单通过 CLI 位置参数实现(当 Roots API 不受支持时作为后备)。
  • 当客户端提供的 MCP Roots 可用时,将替换服务器端白名单。
  • 如果客户端返回空的 Roots 列表,则文件路径工具将被禁用(拒绝所有)。
  • 所有路径都会通过 realpath 解析,并且必须位于允许的根目录内。
  • 拒绝遍历或类似 glob 的模式(..*?~ 等)。
  • 相对路径会解析到第一个允许的根目录下。
  • 写入工具在未指定 file_path 时,默认会将文件保存到 <first_root>/downloads/

示例服务器启动命令,包含已列入白名单的根目录:

uv --directory /full/path/to/telegram-mcp run main.py /data/telegram /tmp/telegram-mcp

目前 GIF 工具功能有限:get_gif_searchsend_gif 可用,而由于 Telethon/Telegram API 交互的可靠性限制,get_saved_gifs 尚未实现。


📋 需求


🔧 安装与设置

1. 分支并克隆

git clone https://github.com/chigwell/telegram-mcp.git
cd telegram-mcp

2. 使用 uv 安装依赖

uv sync

3. 生成会话字符串

uv run session_string_generator.py

按照提示进行身份验证,并更新你的 .env 文件。

4. 配置 .env

复制 .env.example.env,并填写你的值:

TELEGRAM_API_ID=your_api_id_here
TELEGRAM_API_HASH=your_api_hash_here
TELEGRAM_SESSION_NAME=anon
TELEGRAM_SESSION_STRING=your_session_string_here

你可以在 my.telegram.org/apps 获取你的 API 凭证。


🐳 使用 Docker 运行

如果你已安装 Docker 和 Docker Compose,你可以将服务器构建并运行在容器中,从而简化依赖管理。

1. 构建镜像

从项目根目录构建 Docker 镜像:

docker build -t telegram-mcp:latest .

2. 运行容器

你有两种选择:

选项 A:使用 Docker Compose(推荐用于本地使用)

此方法使用 docker-compose.yml 文件,并自动从 .env 文件中读取你的凭据。

  1. 创建 .env 文件: 确保项目根目录下有一个包含 TELEGRAM_API_IDTELEGRAM_API_HASHTELEGRAM_SESSION_STRING(或 TELEGRAM_SESSION_NAME)的 .env 文件。可以使用 .env.example 作为模板。
  2. 运行 Compose:
    docker compose up --build
    
    • 使用 docker compose up -d 以分离模式(后台)运行。
    • Ctrl+C 停止服务器。

选项 B:使用 docker run

你可以直接运行容器,将凭据作为环境变量传递。

docker run -it --rm \
  -e TELEGRAM_API_ID="YOUR_API_ID" \
  -e TELEGRAM_API_HASH="YOUR_API_HASH" \
  -e TELEGRAM_SESSION_STRING="YOUR_SESSION_STRING" \
  telegram-mcp:latest
  • 将占位符替换为你的真实凭据。
  • 如果你更倾向于基于文件的会话,可以使用 -e TELEGRAM_SESSION_NAME=your_session_file_name 代替 TELEGRAM_SESSION_STRING(需要挂载卷,可参考 docker-compose.yml 中的示例)。
  • -it 标志对于与服务器交互至关重要。

⚙️ Claude 和 Cursor 的配置

MCP 配置

编辑你的 Claude 桌面配置文件(例如 ~/Library/Application Support/Claude/claude_desktop_config.json)或 Cursor 配置文件(~/.cursor/mcp.json):

{
  "mcpServers": {
    "telegram-mcp": {
      "command": "uv",
      "args": [
        "--directory",
        "/full/path/to/telegram-mcp",
        "run",
        "main.py"
      ]
    }
  }
}

📝 工具示例及代码与输出

以下是几个最常用工具的示例,包括其实现和示例输出。

获取你的聊天列表

@mcp.tool()
async def get_chats(page: int = 1, page_size: int = 20) -> str:
    """
    获取分页显示的聊天列表。
    参数:
        page: 页码(从 1 开始)。
        page_size: 每页显示的聊天数量。
    """
    try:
        dialogs = await client.get_dialogs()
        start = (page - 1) * page_size
        end = start + page_size
        if start >= len(dialogs):
            return "页码超出范围。"
        chats = dialogs[start:end]
        lines = []
        for dialog in chats:
            entity = dialog.entity
            chat_id = entity.id
            title = getattr(entity, "title", None) or getattr(entity, "first_name", "未知")
            lines.append(f"聊天 ID: {chat_id}, 标题: {title}")
        return "\n".join(lines)
    except Exception as e:
        logger.exception(f"get_chats 失败(page={page}, page_size={page_size})")
        return "发生错误(代码:GETCHATS-ERR-001)。请查看 mcp_errors.log 以获取详细信息。"

示例输出:

聊天 ID: 123456789, 标题: John Doe
聊天 ID: -100987654321, 标题: 我的项目组
聊天 ID: 111223344, 标题: Jane Smith
聊天 ID: -200123456789, 标题: 新闻频道

发送消息

@mcp.tool()
async def send_message(chat_id: int, message: str) -> str:
    """
    向指定聊天发送消息。
    参数:
        chat_id:聊天的ID。
        message:要发送的消息内容。
    """
    try:
        entity = await client.get_entity(chat_id)
        await client.send_message(entity, message)
        return "消息发送成功。"
    except Exception as e:
        logger.exception(f"send_message 失败 (chat_id={chat_id})")
        return "发生错误(代码:SENDMSG-ERR-001)。请查看 mcp_errors.log 以获取详细信息。"

示例输出:

消息发送成功。

列出内联按钮

@mcp.tool()
async def list_inline_buttons(
    chat_id: Union[int, str],
    message_id: Optional[int] = None,
    limit: int = 20,
) -> str:
    """
    查看内联键盘布局,包括按钮索引、是否支持回调以及 URL。
    """

使用示例:

list_inline_buttons(chat_id="@sample_tasks_bot")

返回结果类似如下:

消息 42 的按钮(日期:2025-01-01 12:00:00+00:00):
[0] 文本='📋 查看任务',支持回调
[1] 文本='ℹ️ 帮助',支持回调
[2] 文本='🌐 访问网站',不支持回调,URL=https://example.org

点击内联按钮

@mcp.tool()
async def press_inline_button(
    chat_id: Union[int, str],
    message_id: Optional[int] = None,
    button_text: Optional[str] = None,
    button_index: Optional[int] = None,
) -> str:
    """
    根据按钮文本或零基索引点击内联键盘按钮。
    如果未指定 message_id,服务器会搜索最近的消息以找到最新的内联键盘。
    """

使用示例:

press_inline_button(chat_id="@sample_tasks_bot", button_text="📋 查看任务")

如果需要查看可用按钮,可以先使用 list_inline_buttons——传入一个不存在的 button_text 即可快速列出选项,或者直接调用 list_inline_buttons。确定按钮文本或索引后,press_inline_button 将发送相应的回调,就像在原生 Telegram 客户端中点击按钮一样。

订阅公开频道

@mcp.tool()
async def subscribe_public_channel(channel: Union[int, str]) -> str:
    """
    通过用户名(例如:“@examplechannel”)或 ID 加入公开频道或超级群组。
    """

使用示例:

subscribe_public_channel(channel="@daily_updates_feed")

如果账号已经是参与者,该工具会报告这一情况而不是失败,因此可以在需要幂等加入的工作流中反复运行而不会出现问题。

获取聊天邀请链接

get_invite_link 函数采用了多种备用方法,非常稳健:

@mcp.tool()
async def get_invite_link(chat_id: int) -> str:
    """
    获取群组或频道的邀请链接。
    """
    try:
        entity = await client.get_entity(chat_id)
        
        # 首先尝试使用 ExportChatInviteRequest
        try:
            from telethon.tl import functions
            result = await client(functions.messages.ExportChatInviteRequest(
                peer=entity
            ))
            return result.link
        except AttributeError:
            # 如果当前版本的 Telethon 中没有此函数
            logger.warning("ExportChatInviteRequest 不可用,正在使用替代方法")
        except Exception as e1:
            # 如果失败,则记录日志并尝试其他方法
            logger.warning(f"ExportChatInviteRequest 失败:{e1}")
            
        # 替代方法:使用 client.export_chat_invite_link
        try:
            invite_link = await client.export_chat_invite_link(entity)
            return invite_link
        except Exception as e2:
            logger.warning(f"export_chat_invite_link 失败:{e2}")
            
        # 最后手段:直接获取聊天信息
        try:
            if isinstance(entity, (Chat, Channel)):
                full_chat = await client(functions.messages.GetFullChatRequest(
                    chat_id=entity.id
                ))
                if hasattr(full_chat, 'full_chat') and hasattr(full_chat.full_chat, 'invite_link'):
                    return full_chat.full_chat.invite_link or "无邀请链接可用。"
        except Exception as e3:
            logger.warning(f"GetFullChatRequest 失败:{e3}")
            
        return "无法获取此聊天的邀请链接。"
    except Exception as e:
        logger.exception(f"get_invite_link 失败 (chat_id={chat_id})")
        return f"获取邀请链接时出错:{e}"

示例输出:

https://t.me/+AbCdEfGhIjKlMnOp

通过邀请链接加入聊天

@mcp.tool()
async def join_chat_by_link(link: str) -> str:
    """
    通过邀请链接加入聊天。
    """
    try:
        # 从邀请链接中提取哈希值
        if '/' in link:
            hash_part = link.split('/')[-1]
            if hash_part.startswith('+'):
                hash_part = hash_part[1:]  # 去掉开头的 '+'
        else:
            hash_part = link
            
        # 尝试在加入前检查邀请
        try:
            # 先尝试检查邀请信息(如果不是成员通常会失败)
            invite_info = await client(functions.messages.CheckChatInviteRequest(hash=hash_part))
            if hasattr(invite_info, 'chat') and invite_info.chat:
                # 如果获取到聊天信息,说明已经是成员
                chat_title = getattr(invite_info.chat, 'title', '未知聊天')
                return f"您已经是该聊天的成员:{chat_title}"
        except Exception:
            # 如果不是成员,通常会失败,继续执行
            pass
            
        # 使用哈希值加入聊天
        result = await client(functions.messages.ImportChatInviteRequest(hash=hash_part))
        if result and hasattr(result, 'chats') and result.chats:
            chat_title = getattr(result.chats[0], 'title', '未知聊天')
            return f"成功加入聊天:{chat_title}"
        return f"已通过邀请哈希值加入聊天。"
    except Exception as e:
        err_str = str(e).lower()
        if "expired" in err_str:
            return "该邀请哈希值已过期,不再有效。"
        elif "invalid" in err_str:
            return "该邀请哈希值无效或格式错误。"
        elif "already" in err_str and "participant" in err_str:
            return "您已经是该聊天的成员。"
        logger.exception(f"join_chat_by_link 失败 (link={link})")
        return f"加入聊天时出错:{e}"

示例输出:

成功加入聊天:开发者社区

搜索公开聊天

@mcp.tool()
async def search_public_chats(query: str, limit: int = 20) -> str:
    """
    根据用户名或标题搜索公开聊天、频道或机器人。
    """
    try:
        result = await client(functions.contacts.SearchRequest(q=query, limit=limit))
        entities = [format_entity(e) for e in result.chats + result.users]
        return json.dumps(entities, indent=2)
    except Exception as e:
        return f"搜索公开聊天时出错:{e}"

示例输出:

[
  {
    "id": 123456789,
    "name": "TelegramBot",
    "type": "user",
    "username": "telegram_bot"
  },
  {
    "id": 987654321,
    "name": "Telegram News",
    "type": "user",
    "username": "telegram_news"
  }
]

获取与联系人的直接聊天

@mcp.tool()
async def get_direct_chat_by_contact(contact_query: str) -> str:
    """
    通过姓名、用户名或电话号码查找与特定联系人的直接聊天。

    参数:
        contact_query:用于搜索的姓名、用户名或电话号码。
    """
    try:
        # 使用正确的 Telethon 方法获取所有联系人
        result = await client(functions.contacts.GetContactsRequest(hash=0))
        contacts = result.users
        found_contacts = []
        for contact in contacts:
            if not contact:
                continue
            name = f"{getattr(contact, 'first_name', '')} {getattr(contact, 'last_name', '')}".strip()
            username = getattr(contact, 'username', '')
            phone = getattr(contact, 'phone', '')
            if (contact_query.lower() in name.lower() or 
                (username and contact_query.lower() in username.lower()) or 
                (phone and contact_query in phone)):
                found_contacts.append(contact)
        if not found_contacts:
            return f"未找到匹配 '{contact_query}' 的联系人。"
        # 如果找到了联系人,则查找与他们的直接聊天
        results = []
        dialogs = await client.get_dialogs()
        for contact in found_contacts:
            contact_name = f"{getattr(contact, 'first_name', '')} {getattr(contact, 'last_name', '')}".strip()
            for dialog in dialogs:
                if isinstance(dialog.entity, User) and dialog.entity.id == contact.id:
                    chat_info = f"聊天ID:{dialog.entity.id}, 联系人:{contact_name}"
                    if getattr(contact, 'username', ''):
                        chat_info += f", 用户名:@{contact.username}"
                    if dialog.unread_count:
                        chat_info += f", 未读消息:{dialog.unread_count}"
                    results.append(chat_info)
                    break
        
        if not results:
            return f"找到了匹配 '{contact_query}' 的联系人,但没有与他们相关的直接聊天。"
        
        return "\n".join(results)
    except Exception as e:
        return f"搜索直接聊天时出错:{e}"

示例输出:

聊天ID:123456789,联系人:John Smith,用户名:@johnsmith,未读消息:3条

🎮 使用示例

  • “显示我最近的聊天”
  • “向聊天 123456789 发送‘Hello world’”
  • “添加电话为 +1234567890、姓名为 John Doe 的联系人”
  • “创建一个名为‘Project Team’的群组,成员为 111、222、333”
  • “下载聊天 123456789 中第 42 条消息的媒体文件”
  • “静音聊天 123456789 的通知”
  • “将用户 111 提升为聊天 123456789 的管理员”
  • “搜索关于‘新闻’的公开频道”
  • “加入邀请链接为 https://t.me/+AbCdEfGhIjK 的 Telegram 群组”
  • “向我的收藏消息发送贴纸”
  • “获取我所有的贴纸包”

您可以通过自然语言在 Claude、Cursor 或任何兼容 MCP 的客户端中使用这些工具。


🧠 错误处理与鲁棒性

本实现包含全面的错误处理机制:

  • 会话管理:支持基于文件和基于字符串的会话
  • 错误报告:详细的错误日志记录到 mcp_errors.log
  • 优雅降级:关键功能提供多种回退方案
  • 用户友好提示:提供清晰且可操作的错误信息,而非技术性报错
  • 账号类型检测:要求机器人账号的功能会在用户账号下使用时发出警告并提示
  • 邀请链接处理:能够处理各种格式的链接以及用户已加入的情况

代码设计旨在应对常见的 Telegram API 问题及限制,具有较高的鲁棒性。


🛠️ 贡献指南

  1. Fork 此仓库chigwell/telegram-mcp
  2. 克隆您的分支
    git clone https://github.com/<your-github-username>/telegram-mcp.git
    
  3. 创建新分支
    git checkout -b my-feature
    
  4. 进行更改,并根据需要添加测试或文档。
  5. 推送并打开 Pull Requestchigwell/telegram-mcp,并附上清晰的描述。
  6. 在 PR 中标记 @chigwell 或 @l1v0n1 以供审核。

🔒 安全注意事项

  • 切勿提交您的 .env 文件或会话字符串。
  • 会话字符串赋予对您 Telegram 账号的完全访问权限,请务必妥善保管!
  • 所有处理均在本地进行;除 Telegram API 外,不会将任何数据发送至其他地方。
  • 请使用 .env.example 作为模板,并确保您的实际 .env 文件保持私密。
  • 测试文件已在 .gitignore 中自动排除。

🛠️ 故障排除

  • 检查日志:在您的 MCP 客户端(Claude/Cursor)和终端中查看错误信息。
  • 详细错误日志可在 mcp_errors.log 中找到。
  • 解释器错误? 确保已创建并激活了 .venv 环境。
  • 数据库锁定? 请使用会话字符串认证,而非基于文件的会话。
  • iCloud/Dropbox 问题? 如果遇到奇怪的错误,请将项目移动到不含空格的本地路径。
  • 更换 Telegram 密码或出现认证错误时,请重新生成会话字符串。
  • 仅限机器人使用的功能 在普通用户账号下使用时会显示明确的提示信息。
  • 测试脚本失败? 请检查 .env 文件中的测试配置,确保测试账号和群组有效。

📄 许可证

本项目采用 Apache 2.0 许可证


🙏 致谢


@chigwell@l1v0n1 维护。欢迎提交 PR!

星标历史

星标历史图

贡献者

版本历史

v2.0.412026/04/12
v2.0.402026/04/09
v2.0.392026/04/09
v2.0.382026/04/09
v2.0.372026/04/06
v2.0.362026/04/01
v2.0.352026/03/31
v2.0.342026/03/31
v2.0.332026/03/27
v2.0.322026/03/18
v2.0.312026/03/16
v2.0.302026/03/05
v2.0.292026/03/04
v2.0.282026/02/26
v2.0.272026/02/26
v2.0.262026/02/25
v2.0.252026/02/12
v2.0.242026/02/12
v2.0.232026/02/09
v2.0.222026/01/27

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.6k|★★☆☆☆|今天
开发框架Agent语言模型

opencode

OpenCode 是一款开源的 AI 编程助手(Coding Agent),旨在像一位智能搭档一样融入您的开发流程。它不仅仅是一个代码补全插件,而是一个能够理解项目上下文、自主规划任务并执行复杂编码操作的智能体。无论是生成全新功能、重构现有代码,还是排查难以定位的 Bug,OpenCode 都能通过自然语言交互高效完成,显著减少开发者在重复性劳动和上下文切换上的时间消耗。 这款工具专为软件开发者、工程师及技术研究人员设计,特别适合希望利用大模型能力来提升编码效率、加速原型开发或处理遗留代码维护的专业人群。其核心亮点在于完全开源的架构,这意味着用户可以审查代码逻辑、自定义行为策略,甚至私有化部署以保障数据安全,彻底打破了传统闭源 AI 助手的“黑盒”限制。 在技术体验上,OpenCode 提供了灵活的终端界面(Terminal UI)和正在测试中的桌面应用程序,支持 macOS、Windows 及 Linux 全平台。它兼容多种包管理工具,安装便捷,并能无缝集成到现有的开发环境中。无论您是追求极致控制权的资深极客,还是渴望提升产出的独立开发者,OpenCode 都提供了一个透明、可信

144.3k|★☆☆☆☆|昨天
Agent插件

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像