Y

YaVendio

@YaVendio/ya-tools
0 Stars 353 次浏览 YaVendio 更新于 2026-08-23
该服务暂未提供标准配置,请参考 README 手动接入

服务介绍

YaVendió Tools 🧰

一个基于MCP的消息和通知系统,允许AI系统通过模型上下文协议(MCP)与各种消息平台进行交互。该项目实现了一个MCP服务器,提供了发送文本、图片、文档、按钮和警报等消息工具。

目录

功能

  • 消息功能

    • 通过WhatsApp和其他平台发送文本消息
    • 发送带有适当格式的图片和媒体
    • 发送带有适当元数据的视频
    • 发送带有文件名和元数据的文档
    • 创建用于用户互动的交互式按钮
  • WhatsApp客户端管理

    • 使用不同的凭据注册和管理多个WhatsApp客户端
    • 使用Infisical安全存储令牌
    • 无状态架构的客户端管理
    • 每个WhatsApp操作都有专用工具
  • 通知功能

    • 在多个渠道(WhatsApp、电子邮件、短信)上配置警报
    • 支持支付按钮和交易通知
  • 对话管理

    • 跟踪消息传递状态和元数据
  • 其他实用工具

    • 用于定时交互的睡眠/延迟功能
    • 公司和用户的配置管理
    • 带有状态跟踪的实时消息传递

什么是MCP?

模型上下文协议(MCP)是由Anthropic开发的一个开放标准,它使AI系统与外部数据源或工具之间的无缝集成成为可能。它提供了一个通用的、开放的标准,将AI系统与数据源连接起来,用单一协议取代了碎片化的集成方式。

该项目实现了一个MCP服务器,暴露了各种消息工具,使它们能够以标准化的方式被AI系统访问。通过使用MCP,AI助手可以:

  • 直接向用户发送WhatsApp消息
  • 上传并发送媒体文件
  • 通过按钮创建交互体验
  • 高效地管理对话上下文
  • 触发多渠道通知

安装

该项目使用uv进行包管理:

bash

如果你还没有安装uv

curl -L https://github.com/astral-sh/uv/releases/latest/download/install.sh | sh

或者,使用pip安装

pip install uv

克隆仓库

git clone https://your-repo-url/yatools.git
cd yatools

安装所有依赖(包括开发依赖)

make sync

或者单独安装

make install # 常规依赖
make dev-install # 开发依赖

要求

  • Python 3.13或更高版本
  • Docker和Docker Compose(用于容器化部署)

配置

在根目录下创建一个.env文件,并添加你的配置:

日志配置

LOG_LEVEL=INFO
LOG_FORMAT=json

使用Docker运行

bash

启动所有服务

docker-compose up -d

停止所有服务

docker-compose down

查看日志

docker-compose logs -f

查看特定服务的日志

docker-compose logs -f app

本地运行

bash

开发模式,自动重载

make run

生产模式

make run-prod

指定端口运行

PORT=8080 make run

开发该项目包含多个 Makefile 命令以简化开发流程:

bash

显示所有可用命令

make help

运行测试

make test

运行带有覆盖率报告的测试

make coverage

格式化代码

make format

代码检查

make lint

清理缓存文件

make clean

项目结构

  • app/: 主应用程序代码

    • server.py: MCP 服务器实现
    • logging.py: 使用 structlog 的日志配置
    • lifespan.py: 应用程序生命周期管理
  • tools/: 工具实现

    • base_tool.py: 所有工具的抽象基类
    • text_tool.py: 发送文本消息的工具
    • image_tool.py: 发送图片的工具
    • video_tool.py: 发送视频的工具
    • document_tool.py: 发送文档的工具
    • button_tool.py: 发送交互按钮的工具
    • alert_tool.py: 发送多渠道警报的工具
    • sleep_tool.py: 在工具执行中添加延迟的工具
  • services/: 服务实现

    • interfaces.py: 定义服务接口的合同
    • message_service.py: 消息存储和检索服务
    • message_service_mock.py: 用于测试的模拟实现
    • whatsapp_service.py: WhatsApp 客户端管理服务
    • whatsapp_service_mock.py: 用于测试的模拟 WhatsApp 服务
  • tests/: 测试实现

    • app/: 应用程序结构的测试
    • tools/: 单个工具的测试
    • services/: 服务的测试
    • server/: MCP 服务器集成测试

MCP 集成

此服务可以通过模型上下文协议 (MCP) 与 LLM 应用程序集成:

bash

在 Claude Desktop 中安装服务器

make mcp-install

以开发模式运行并自动重载

make mcp-dev

从 PyPI 安装(如果已发布)

make mcp-install-pkg

可用的 MCP 工具

send_text

向 WhatsApp 号码发送一条文本消息。

参数:

  • company_id: 公司标识符
  • phone_number: 收件人的电话号码
  • message: 要发送的文本

示例:

python
result = await send_text(
company_id="company123",
phone_number="5551234567",
message="Hello, this is a test message!"
)
print(f"Message ID: {result['message_id']}")

send_image

向 WhatsApp 号码发送一张或多张图片。

参数:

  • company_id: 公司标识符
  • phone_number: 收件人的电话号码
  • image_urls: 要发送的图片 URL 列表

示例:

python
result = await send_image(
company_id="company123",
phone_number="5551234567",
image_urls=["https://example.com/image1.jpg", "https://example.com/image2.jpg"]
)
print(f"Message IDs: {result['message_ids']}")

send_video

向 WhatsApp 号码发送一个或多个视频。

参数:

  • company_id: 公司标识符
  • phone_number: 收件人的电话号码
  • video_urls: 要发送的视频 URL 列表

示例:

python
result = await send_video(
company_id="company123",
phone_number="5551234567",
video_urls=["https://example.com/video.mp4"]
)
print(f"Message IDs: {result['message_ids']}")

send_document

向 WhatsApp 号码发送文档文件。

参数:

  • company_id: 公司标识符
  • phone_number: 收件人的电话号码
  • files: 文档文件列表,格式为 {"url": "...", "filename": "..."}

示例:

python
result = await send_document(
company_id="company123",
phone_number="5551234567",
files=[
{
"url": "https://example.com/document.pdf",
"filename": "report.pdf"
}
]
)
print(f"Message IDs: {result['message_ids']}")

send_alert

通过多种渠道(WhatsApp、电子邮件、短信)发送警报。

参数:

  • company_id: 公司标识符
  • phone_number: 收件人的电话号码
  • message: 警报消息
  • whatsapp: 是否发送 WhatsApp 消息
  • email: 电子邮件配置 {"subject": "..."}- sms: SMS 配置 {"type": "...", "recipients": ["..."]}
  • pause_number: 是否暂停对话
  • track_sale: 是否将此记录为销售

示例:

python
result = await send_alert(
company_id="company123",
phone_number="5551234567",
message="重要警报:检测到新活动",
whatsapp=True,
email={
"subject": "重要警报",
"recipients": ["user@example.com"]
},
sms={
"type": "urgent",
"recipients": ["5551234567", "5557654321"]
},
pause_number=False,
track_sale=True
)
print(f"警报结果: {result[ result ]}")

sleep

暂停执行指定秒数。

参数:

  • company_id: 公司标识符
  • phone_number: 收件人的电话号码
  • seconds: 暂停的秒数

示例:

python
result = await sleep(
company_id="company123",
phone_number="5551234567",
seconds=5
)
print(f"已暂停 {result[ seconds ]} 秒")

send_button

发送交互按钮。

参数:

  • company_id: 公司标识符
  • phone_number: 收件人的电话号码
  • body_text: 按钮消息正文
  • buttons: 按钮配置列表 [{"id": "...", "title": "..."}]
  • button_type: "reply" 或 "payment"
  • header: 可选的头部配置
  • footer_text: 可选的底部文本
  • payment_data: 用于支付按钮的支付数据

示例(回复按钮):

python
result = await send_button(
company_id="company123",
phone_number="5551234567",
body_text="请选择一个选项:",
buttons=[
{"id": "btn1", "title": "选项 1"},
{"id": "btn2", "title": "选项 2"},
{"id": "btn3", "title": "选项 3"}
],
button_type="reply",
footer_text="点击按钮继续"
)
print(f"按钮消息 ID: {result[ message_id ]}")

示例(支付按钮):

python
result = await send_button(
company_id="company123",
phone_number="5551234567",
body_text="完成您的购买:",
buttons=[{"id": "pay1", "title": "立即支付"}],
button_type="payment",
payment_data={
"title": "高级订阅",
"url": "https://pay.example.com/invoice123",
"amount": "19.99",
"currency": "USD"
}
)
print(f"支付按钮消息 ID: {result[ message_id ]}")

get_config

获取公司配置。

参数:

  • company_id: 公司标识符

示例:

python
config = await get_config(
company_id="company123"
)
print(f"公司配置: {config[ config ]}")

update_config

更新公司配置。

参数:

  • company_id: 公司标识符
  • config: 新配置

示例:

python
result = await update_config(
company_id="company123",
config={
"welcome_message": "欢迎使用我们的服务!",
"auto_reply": True,
"notification_emails": ["admin@example.com"]
}
)
print(f"更新结果: {result[ message ]}")

测试

有关运行和编写测试的详细信息,请参阅 TEST.md

基本测试命令:

bash

运行所有测试

make test

运行带有覆盖率的测试

make coverage

贡献

欢迎贡献!请遵循以下步骤:

  1. 分叉仓库
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 进行更改
  4. 运行测试以确保它们通过 (make test)
  5. 提交更改 (git commit -m 添加了惊人的功能 )
  6. 推送到分支 (git push origin feature/amazing-feature)
  7. 打开拉取请求

许可证

该项目根据 MIT 许可证许可 - 详情请参见 LICENSE 文件。

相关 MCP 服务