Klavis 仓库 Twilio MCP Server 实战指南:15 个原子工具实现 SMS、语音、号码管理与账户监控
2026/9/17 18:08:46 网站建设 项目流程

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_MESSAGINGTWILIO_VOICETWILIO_PHONETWILIO_ACCOUNTTWILIO_USAGE),供客户端做能力分类与权限管理。

2.1 消息类(Messaging Operations)

工具名功能必填参数关键可选参数
twilio_send_sms发送 SMS,支持投递追踪tofrom_bodystatus_callback(投递状态回调 URL)
twilio_send_mms发送多媒体消息,最多 10 个附件tofrom_bodymedia_url(附件 URL 数组)、status_callback
twilio_get_messages查询消息历史,支持灵活过滤limit(默认 20,最大 1000)、date_sent_afterdate_sent_beforefrom_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 个附件,且要求bodymedia_url至少提供一个;
  • twilio_get_messages返回结构包含messages列表、count以及filters_applied(回显本次实际生效的过滤条件),每条消息含sidstatusdirectionpriceprice_unitdate_sent等字段。

2.2 语音类(Voice Operations)

工具名功能必填参数关键可选参数
twilio_make_call发起电话呼叫,通过 TwiML 控制通话流程tofrom_url(TwiML URL)或twiml(TwiML 字符串)、method(默认 POST)、status_callbacktimeout(默认 60 秒)、record(默认 false)
twilio_get_calls查询通话历史,支持状态过滤limitstatusfrom_tostart_time_afterstart_time_before
twilio_get_call_by_sid按 SID 获取通话详情(时长、费用等)call_sid
twilio_get_recordings获取通话录音,用于质检、合规或分析limitcall_siddate_created_afterdate_created_before

调用语义(源码约束,见 voice.py):

  • twilio_make_callurltwiml二者必须提供其一,且不能同时提供,否则抛出ValueError
  • twilio_get_calls.status枚举值固定为queuedringingin-progresscompletedbusyfailedno-answercanceled,非法值会被源码拒绝(voice.py);
  • twilio_get_call_by_sid额外返回forwarded_fromcaller_nameparent_call_sidanswered_bystart_timeend_time等深度信息。

2.3 号码管理类(Phone Number Management)

工具名功能必填参数关键可选参数
twilio_search_available_numbers按区号或数字模式搜索可购买号码country_code(默认US)、area_codecontainssms_enabled(默认 true)、voice_enabled(默认 true)、limit(默认 20,最大 50
twilio_purchase_phone_number购买号码并可配置 Webhookphone_numberfriendly_namevoice_urlsms_urlstatus_callback
twilio_list_phone_numbers查看名下全部号码及其配置limit(默认 20,最大 1000)
twilio_update_phone_number修改号码配置与 Webhookphone_number_sidfriendly_namevoice_urlsms_urlstatus_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按类别与时间段生成用量报告categorystart_dateend_dategranularitydaily/monthly/yearly/all-time,默认daily)、limit(默认 50,最大 1000)

实现亮点(见 account.py):

  • twilio_get_balance调用client.balance.fetch(),返回account_sidbalancecurrency
  • twilio_get_usage_records依据granularity动态映射到 Twilio SDK 的不同端点:dailyusage.records.dailymonthlyusage.records.monthlyyearlyusage.records.yearlyall-timeusage.records(account.py),并在返回的summary中自动累加total_usagetotal_price,便于直接做账单分析。

三、架构剖析:双模式服务端与统一工具路由

从源码看,服务端采用"一份工具定义 + 统一路由 + 双传输层"的架构,有效避免了 stdio 与 HTTP 两种模式下的代码重复。

3.1 入口与命令行参数

server.py 使用click定义入口,支持四个 CLI 选项:

选项默认值说明
--port环境变量TWILIO_MCP_SERVER_PORT(默认5000HTTP 模式监听端口
--log-levelINFO日志级别:DEBUG/INFO/WARNING/ERROR/CRITICAL
--json-responsefalse启用后 StreamableHTTP 返回 JSON 响应而非 SSE 流
--stdiofalse以 stdio 模式运行(供 Claude Desktop 等客户端使用);不加该参数则默认进入 HTTP 模式

3.2 统一工具路由:call_tool_router

get_all_tools()集中声明全部 15 个工具的types.Tool定义,call_tool_router(name, arguments)(server.py)则统一完成工具调用分发。关键逻辑:

  1. 每次调用前从环境变量读取TWILIO_AUTH_TOKEN并写入auth_token_context,保证令牌随请求上下文流转;
  2. 通过 if/elif 链把工具名映射到 tools/ 包中对应的异步实现函数;
  3. 未知工具名抛出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健康检查
/sseGETSSE(配合/messages/端点回传)传统 SSE 流式 MCP 传输
/mcpPOSTStreamableHTTP新版 Streamable HTTP 传输,--json-response开关决定返回 JSON 还是 SSE 流

会话管理通过StreamableHTTPSessionManager实现,当前配置为stateless=True的无状态模式(源码注释指出可通过接入 event store 改为有状态)。

四、安装与配置

4.1 前置条件

  1. Twilio 账户:前往 twilio.com 注册;
  2. API 凭证:在 Twilio Console 获取 Account SID 与 Auth Token;
  3. Python 3.8+:运行服务端所需;
  4. 电话号码:至少购买一个 Twilio 号码用于发消息/打电话。

4.2 获取 Twilio 凭证

  1. 登录 Twilio Console;
  2. 进入Account Dashboard
  3. 复制Account SIDAuth Token
  4. (可选)在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.txt

requirements.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.0

4.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-response

5.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 常见错误场景

  1. 认证错误:核对TWILIO_ACCOUNT_SIDTWILIO_AUTH_TOKEN是否正确,确认凭证未被轮换或过期;
  2. 号码格式错误:号码必须符合 E.164 格式(如+1234567890);美国号码含国家码共 11 位——工具内部会先经validate_phone_number()规范化,无法规范化即抛ValueError
  3. 权限错误:确认 Twilio 账户权限充足,且所在区域已开通 SMS / Voice 服务;
  4. 限流: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覆盖环境变量令牌,便于多租户场景测试。

九、开发与测试建议

  1. 搭建开发环境:复用前述虚拟环境与依赖安装流程;
  2. 使用 Twilio 测试凭证:Twilio 提供的测试凭证不会发送真实消息或拨打真实电话,适合在开发阶段反复验证工具链路;
  3. 覆盖测试:参照仓库 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询