Klavis 仓库 Twilio MCP Server 实战指南:15 个原子工具实现 SMS、语音、号码管理与账户监控
【免费下载链接】klavisKlavis AI: MCP integration platforms that let AI agents use tools reliably at any scale项目地址: https://gitcode.com/GitHub_Trending/kl/klavis
本篇技术指南以 Klavis 开源仓库中 mcp_servers/twilio/README.md 为骨架,结合 server.py 及 tools/ 下的完整源码实现,系统讲解该 Twilio MCP Server 的架构设计、15 个原子工具的参数细节、双模式运行方式(stdio / HTTP)与 Docker 部署流程。读完本文,你将掌握如何把 Twilio 的短信、语音、号码管理与账户监控能力接入 Claude Desktop 或其他 MCP 客户端,让 AI Agent 能够直接发送消息、拨打电话、采购号码并核对账户余额。
一、项目概述:为 AI Agent 提供可靠的 Twilio 通信能力
Twilio MCP Server 是基于 Model Context Protocol(MCP)规范的完整服务端实现,通过一组原子化(atomic)、设计良好的工具,为 AI Agent 提供与 Twilio 通信 API 的全面集成。它覆盖了 Twilio 的四大能力域:
- SMS 与 MMS 消息:发送文本与多媒体消息,支持投递状态追踪;
- 语音呼叫:通过 TwiML 指令发起与管控电话呼叫;
- 号码管理:搜索、购买、配置与释放电话号码;
- 账户监控:查询余额、用量记录与账户信息。
其核心特性包括 15 个覆盖 Twilio 通信 API 的工具、stdio 与 HTTP 双模式架构、基于 context 的令牌管理、可配置日志以及带可操作性错误信息的全面异常处理。
二、工具全景:四大类别 15 个原子工具
服务端将 15 个工具按业务域划分为四个类别。以下参数表直接来源于 server.py 中get_all_tools()声明的inputSchema,每个工具都带有明确的category注解(TWILIO_MESSAGING、TWILIO_VOICE、TWILIO_PHONE、TWILIO_ACCOUNT、TWILIO_USAGE),供客户端做能力分类与权限管理。
2.1 消息类(Messaging Operations)
| 工具名 | 功能 | 必填参数 | 关键可选参数 |
|---|---|---|---|
twilio_send_sms | 发送 SMS,支持投递追踪 | to、from_、body | status_callback(投递状态回调 URL) |
twilio_send_mms | 发送多媒体消息,最多 10 个附件 | to、from_ | body、media_url(附件 URL 数组)、status_callback |
twilio_get_messages | 查询消息历史,支持灵活过滤 | 无 | limit(默认 20,最大 1000)、date_sent_after、date_sent_before、from_、to |
twilio_get_message_by_sid | 按 SID 获取单条消息详情 | message_sid | — |
参数细节(以源码 Schema 为准):
twilio_send_sms.body:消息内容,上限 1600 字符(源码在 messaging.py 中显式校验,超出直接抛出ValueError);twilio_send_mms.media_url:媒体 URL 列表,源码在 messaging.py 中限制最多 10 个附件,且要求body与media_url至少提供一个;twilio_get_messages返回结构包含messages列表、count以及filters_applied(回显本次实际生效的过滤条件),每条消息含sid、status、direction、price、price_unit、date_sent等字段。
2.2 语音类(Voice Operations)
| 工具名 | 功能 | 必填参数 | 关键可选参数 |
|---|---|---|---|
twilio_make_call | 发起电话呼叫,通过 TwiML 控制通话流程 | to、from_ | url(TwiML URL)或twiml(TwiML 字符串)、method(默认 POST)、status_callback、timeout(默认 60 秒)、record(默认 false) |
twilio_get_calls | 查询通话历史,支持状态过滤 | 无 | limit、status、from_、to、start_time_after、start_time_before |
twilio_get_call_by_sid | 按 SID 获取通话详情(时长、费用等) | call_sid | — |
twilio_get_recordings | 获取通话录音,用于质检、合规或分析 | 无 | limit、call_sid、date_created_after、date_created_before |
调用语义(源码约束,见 voice.py):
twilio_make_call的url与twiml二者必须提供其一,且不能同时提供,否则抛出ValueError;twilio_get_calls.status枚举值固定为queued、ringing、in-progress、completed、busy、failed、no-answer、canceled,非法值会被源码拒绝(voice.py);twilio_get_call_by_sid额外返回forwarded_from、caller_name、parent_call_sid、answered_by、start_time、end_time等深度信息。
2.3 号码管理类(Phone Number Management)
| 工具名 | 功能 | 必填参数 | 关键可选参数 |
|---|---|---|---|
twilio_search_available_numbers | 按区号或数字模式搜索可购买号码 | 无 | country_code(默认US)、area_code、contains、sms_enabled(默认 true)、voice_enabled(默认 true)、limit(默认 20,最大 50) |
twilio_purchase_phone_number | 购买号码并可配置 Webhook | phone_number | friendly_name、voice_url、sms_url、status_callback |
twilio_list_phone_numbers | 查看名下全部号码及其配置 | 无 | limit(默认 20,最大 1000) |
twilio_update_phone_number | 修改号码配置与 Webhook | phone_number_sid | friendly_name、voice_url、sms_url、status_callback |
twilio_release_phone_number | 释放号码、停止计费(不可撤销) | phone_number_sid | — |
实现细节(见 phone_numbers.py):
twilio_search_available_numbers底层根据国家代码调用client.available_phone_numbers(country).local.list(...),返回结果包含号码的capabilities(voice / sms / mms / fax)能力矩阵;twilio_update_phone_number要求至少提供一个待更新字段,否则报错(phone_numbers.py);twilio_release_phone_number是危险操作:源码会先fetch()号码详情用于回显,再执行delete(),返回success: true与释放的号码明文,提示该操作无法撤销。
2.4 账户与用量监控类(Account & Usage Monitoring)
| 工具名 | 功能 | 必填参数 | 关键可选参数 |
|---|---|---|---|
twilio_get_account_info | 获取账户详情与状态 | 无 | — |
twilio_get_balance | 查询当前账户余额 | 无 | — |
twilio_get_usage_records | 按类别与时间段生成用量报告 | 无 | category、start_date、end_date、granularity(daily/monthly/yearly/all-time,默认daily)、limit(默认 50,最大 1000) |
实现亮点(见 account.py):
twilio_get_balance调用client.balance.fetch(),返回account_sid、balance、currency;twilio_get_usage_records依据granularity动态映射到 Twilio SDK 的不同端点:daily→usage.records.daily、monthly→usage.records.monthly、yearly→usage.records.yearly、all-time→usage.records(account.py),并在返回的summary中自动累加total_usage与total_price,便于直接做账单分析。
三、架构剖析:双模式服务端与统一工具路由
从源码看,服务端采用"一份工具定义 + 统一路由 + 双传输层"的架构,有效避免了 stdio 与 HTTP 两种模式下的代码重复。
3.1 入口与命令行参数
server.py 使用click定义入口,支持四个 CLI 选项:
| 选项 | 默认值 | 说明 |
|---|---|---|
--port | 环境变量TWILIO_MCP_SERVER_PORT(默认5000) | HTTP 模式监听端口 |
--log-level | INFO | 日志级别:DEBUG/INFO/WARNING/ERROR/CRITICAL |
--json-response | false | 启用后 StreamableHTTP 返回 JSON 响应而非 SSE 流 |
--stdio | false | 以 stdio 模式运行(供 Claude Desktop 等客户端使用);不加该参数则默认进入 HTTP 模式 |
3.2 统一工具路由:call_tool_router
get_all_tools()集中声明全部 15 个工具的types.Tool定义,call_tool_router(name, arguments)(server.py)则统一完成工具调用分发。关键逻辑:
- 每次调用前从环境变量读取
TWILIO_AUTH_TOKEN并写入auth_token_context,保证令牌随请求上下文流转; - 通过 if/elif 链把工具名映射到 tools/ 包中对应的异步实现函数;
- 未知工具名抛出
ValueError(f"Unknown tool: {name}")。
stdio 与 HTTP 两种模式下的list_tools/call_tool回调都复用上述两个函数,这正是"dual mode"架构能保持行为一致的原因。
3.3 认证机制:ContextVar 令牌上下文
tools/base.py 定义了一个ContextVar类型的auth_token_context,实现"上下文感知的令牌管理":
- HTTP 模式下,服务端会从请求头
x-auth-token提取令牌(server.py 的 SSE 处理与 server.py 的 StreamableHTTP 处理均如此),提取不到时回退到环境变量; get_auth_token()优先从 ContextVar 读取,为空或未设置时回退TWILIO_AUTH_TOKEN,两者都缺失则抛出RuntimeError;- 请求结束时在
finally中执行auth_token_context.reset(token),防止令牌跨请求泄漏。
同时 base.py 提供了统一的validate_phone_number()号码规范化函数:去除空格、横杠、括号,自动补齐+前缀(11 位以1开头或 10 位号码分别规范化为+1...格式),从源头保证所有工具收到的号码符合 E.164 格式。
3.4 双传输层(HTTP 模式)
HTTP 模式(server.py)基于 Starlette + uvicorn 构建 ASGI 应用,同时挂载了两条传输通道:
| 端点 | 方法 | 传输协议 | 用途 |
|---|---|---|---|
/ | GET | — | 健康检查 |
/sse | GET | SSE(配合/messages/端点回传) | 传统 SSE 流式 MCP 传输 |
/mcp | POST | StreamableHTTP | 新版 Streamable HTTP 传输,--json-response开关决定返回 JSON 还是 SSE 流 |
会话管理通过StreamableHTTPSessionManager实现,当前配置为stateless=True的无状态模式(源码注释指出可通过接入 event store 改为有状态)。
四、安装与配置
4.1 前置条件
- Twilio 账户:前往 twilio.com 注册;
- API 凭证:在 Twilio Console 获取 Account SID 与 Auth Token;
- Python 3.8+:运行服务端所需;
- 电话号码:至少购买一个 Twilio 号码用于发消息/打电话。
4.2 获取 Twilio 凭证
- 登录 Twilio Console;
- 进入Account Dashboard;
- 复制Account SID与Auth Token;
- (可选)在Phone Numbers > Manage > Buy a number购买号码。
4.3 安装依赖
# 进入 Twilio MCP server 目录 cd mcp_servers/twilio # 创建虚拟环境(推荐) python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate # 安装依赖 pip install -r requirements.txtrequirements.txt 中的核心依赖如下,其中twilio>=9.0.0提供 REST API 客户端,mcp==1.11.0提供 MCP 协议实现,starlette+uvicorn支撑 HTTP/SSE 传输,python-dotenv负责加载.env:
mcp==1.11.0 click>=8.0.0 python-dotenv>=0.19.0 starlette>=0.49.1 twilio>=9.0.0 pydantic>=2.0.0 uvicorn>=0.30.04.4 配置环境变量
README 中给出的配置流程是复制.env.example为.env(若仓库目录中未附带该示例文件,也可直接手动创建.env并写入以下变量):
# 复制示例环境文件 cp .env.example .env # 编辑 .env nano .env # 或 vim .env / code .env填入凭证与端口:
TWILIO_ACCOUNT_SID=your_account_sid_here TWILIO_AUTH_TOKEN=your_auth_token_here TWILIO_MCP_SERVER_PORT=5000三个变量的作用:
TWILIO_ACCOUNT_SID:账户标识,get_account_sid()只从环境变量读取,缺失即抛错(base.py);TWILIO_AUTH_TOKEN:认证令牌,既是 stdio/环境回退来源,也是 HTTP 模式x-auth-token请求头的兜底;TWILIO_MCP_SERVER_PORT:HTTP 模式默认端口,作为--port的默认值。
五、运行服务端:stdio 与 HTTP 双模式
5.1 模式一:Claude Desktop 集成(stdio)
python server.py --stdio在claude_desktop_config.json中注册:
{ "mcpServers": { "twilio": { "command": "/path/to/your/venv/bin/python", "args": ["/path/to/mcp_servers/twilio/server.py", "--stdio"], "env": { "TWILIO_ACCOUNT_SID": "your_account_sid_here", "TWILIO_AUTH_TOKEN": "your_auth_token_here" } } } }stdio 模式(server.py)通过标准输入/输出与 MCP 客户端通信,调试信息以[TWILIO-DEBUG]前缀写入 stderr(避免污染 stdout 协议流),工具返回结果统一以json.dumps(result, indent=2)序列化为TextContent。
5.2 模式二:HTTP 服务器(默认)
python server.py # 服务运行于 http://localhost:5000自定义配置选项:
# 自定义端口与日志级别 python server.py --port 8080 --log-level DEBUG # 启用 JSON 响应替代 SSE 流 python server.py --json-response5.3 Docker 部署
Dockerfile 基于python:3.11-slim构建,包含非 root 用户(app)、30 秒间隔的HEALTHCHECK(请求/端点)以及默认端口 5000 的暴露配置。
# 1. 配置环境变量(见上文) cp .env.example .env # 编辑 .env 填入 Twilio 凭证 # 2. 构建镜像 docker build -t twilio-mcp-server . # 3. HTTP 模式运行(默认) docker run -p 5000:5000 --env-file .env twilio-mcp-server # 4. stdio 模式运行(供 MCP 客户端集成) docker run --env-file .env twilio-mcp-server --stdio六、验证部署:健康检查与工具调用
6.1 快速测试命令
服务运行于 localhost:5000 时:
# 健康检查 curl http://localhost:5000/ # 列出可用工具 curl -X POST http://localhost:5000/ \ -H "Content-Type: application/json" \ -d '{"method": "tools/list"}' # 测试账户信息工具(需要 .env 中已有凭证) curl -X POST http://localhost:5000/ \ -H "Content-Type: application/json" \ -d '{"method": "tools/call", "params": {"name": "twilio_get_account_info", "arguments": {}}}'6.2 测试 Claude Desktop 集成
- 将服务端加入 Claude Desktop 配置并重启;
- 直接向 Claude 提问:"Can you check my Twilio account balance?",Claude 会调用
twilio_get_balance工具返回余额。
七、典型工具调用示例
以下 JSON 载荷可直接用于tools/call请求(或作为 AI Agent 的工具调用参数模板)。
7.1 发送 SMS
{ "tool": "twilio_send_sms", "arguments": { "to": "+1234567890", "from_": "+1987654321", "body": "Hello from Twilio MCP Server!" } }7.2 发起语音呼叫
{ "tool": "twilio_make_call", "arguments": { "to": "+1234567890", "from_": "+1987654321", "twiml": "<Response><Say>Hello, this is a test call from Twilio!</Say></Response>" } }7.3 搜索可购买号码
{ "tool": "twilio_search_available_numbers", "arguments": { "country_code": "US", "area_code": "415", "sms_enabled": true, "voice_enabled": true, "limit": 10 } }7.4 生成用量报告
{ "tool": "twilio_get_usage_records", "arguments": { "category": "sms", "granularity": "daily", "start_date": "2024-01-01", "end_date": "2024-01-31" } }八、错误处理与故障排查
服务端为每个工具都实现了 try/except 包装,错误信息会连同工具名与参数一并回传(stdio 模式下返回{"error": ..., "tool": ..., "arguments": ...}结构,HTTP 模式下返回Error: <消息>文本),便于客户端直接定位问题。
8.1 常见错误场景
- 认证错误:核对
TWILIO_ACCOUNT_SID与TWILIO_AUTH_TOKEN是否正确,确认凭证未被轮换或过期; - 号码格式错误:号码必须符合 E.164 格式(如
+1234567890);美国号码含国家码共 11 位——工具内部会先经validate_phone_number()规范化,无法规范化即抛ValueError; - 权限错误:确认 Twilio 账户权限充足,且所在区域已开通 SMS / Voice 服务;
- 限流:Twilio 对 API 调用与消息发送有速率限制,生产环境应实现指数退避(exponential backoff)重试策略。
8.2 调试技巧
# 开启 DEBUG 日志 python server.py --log-level DEBUG- 日志格式为
%(asctime)s - %(name)s - %(levelname)s - %(message)s,每个工具调用、成功与失败都会输出带上下文的日志(如 "Sending SMS from ... to ..."、"SMS sent successfully. SID: ..."); - 可用 Twilio Console 的 REST API Explorer 先行验证凭证,再通过 Console 发送测试消息;
- HTTP 模式可在请求头附加
x-auth-token覆盖环境变量令牌,便于多租户场景测试。
九、开发与测试建议
- 搭建开发环境:复用前述虚拟环境与依赖安装流程;
- 使用 Twilio 测试凭证:Twilio 提供的测试凭证不会发送真实消息或拨打真实电话,适合在开发阶段反复验证工具链路;
- 覆盖测试:参照仓库 Contributing Guide 的要求,对所有工具同时用合法与非法输入测试,确保 Twilio API 错误的处理路径完善;新增工具时补充使用示例与文档。
十、进一步探索
- 阅读 mcp_servers/twilio/README.md 获取原始文档;
- 深入 server.py 了解双模式入口、CLI 参数与双传输层实现;
- 研读 tools/base.py 掌握 ContextVar 令牌上下文与 E.164 号码校验逻辑;
- 对照 tools/messaging.py、tools/voice.py、tools/phone_numbers.py、tools/account.py 查看每个工具的底层 SDK 调用链;
- 参考 Dockerfile 与 requirements.txt 复现容器化部署环境。
本项目遵循 Apache 2.0 协议,详见 LICENSE。
【免费下载链接】klavisKlavis AI: MCP integration platforms that let AI agents use tools reliably at any scale项目地址: https://gitcode.com/GitHub_Trending/kl/klavis
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考