拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

测评|手机本地AI Agent接管通话,不依赖云服务,MCP协议这套路我测了3天

测评|手机本地AI Agent接管通话,不依赖云服务,MCP协议这套路我测了3天

1. 为什么要在 Termux 里折腾本地 AI Agent 接管通话

手机本地 AI Agent 接管通话,说白了就是让跑在手机里的模型通过 MCP 协议(Model Context Protocol)直接调用拨号、联系人、短信这些系统能力,全程数据不出设备。它适合两类人:一类是对通话隐私极度敏感、不想把录音丢给云端转写的用户;另一类是手里有旧安卓机、想拿它当本地自动化实验平台的开发者。我这次用的是一台旧小米,系统 Android 13,没 root,靠 Termux 就能把整条链路跑起来。

核心检索词先摆清楚:MCP 协议是一套开源标准,让 AI 客户端用统一格式调用外部工具;Termux 是安卓上的 Linux 终端环境;本地 AI 指的是推理和工具调用都在本机完成,不依赖云服务。这三者拼在一起,才能实现"AI 看得到手机、也能动手操作手机"。

为什么不用云端方案?我实测过把通话录音上传转写的路子,延迟普遍在 8 到 15 秒,而且录音要经过第三方服务器,隐私这块始终不放心。本地闭环的好处是断网也能跑,只要手机和 AI 客户端在同一局域网,响应能压到 2 到 3 秒。代价是部署门槛不低,你得懂点 Node.js 和 Termux 的包管理。

整条链路我拆成四段:Termux 环境准备、MCP Server 注册与启动、通话事件触发、本地推理与后续动作。下面按这个顺序给可复制的命令和配置。需要说明的是,通话内容解析依赖模型质量,模型弱的时候要点会漏,这点后面排障章节会细说。

先明确一个边界:这套方案不碰任何需要特殊网络权限的东西,全部在局域网内完成。手机和电脑连同一个 WiFi 就行,远程场景可以用内网穿透工具,但那是可选扩展,不影响本地闭环验证。

我踩过的第一个坑是 Termux 从 Google Play 装的版本太旧,pkg 源里很多包拉不下来。正确做法是从 F-Droid 或官方 GitHub Release 装最新版,装完先跑pkg update && pkg upgrade。这一步不做,后面 Node.js 版本会对不上。

2. TaoToken 前置准备:给本地 Agent 配一个稳定的模型入口

本地 Agent 的"大脑"需要一个模型来解析通话文本、生成后续动作。你可以用本地小模型,但实测下来中文通话要点提取的准确率不够,所以我用 TaoToken 作为模型入口,它兼容 OpenAI 风格的接口,配置简单,适合塞进 MCP Server 的推理环节。

先说清楚定位:TaoToken 在这里的角色是模型调用入口,不是替代 Termux 或 MCP Server。MCP Server 负责暴露手机硬件工具,模型负责理解指令和生成动作,两者通过标准接口对接。你需要在 TaoToken 控制台创建一个 API Key,然后拿到 Base URL 和 Model ID,这三件套后面配置里都要用到。

具体操作路径:打开 https://taotoken.net/api 对应的控制台入口,进 API Keys 页面新建一个 Key,复制保存。模型 ID 在模型列表里选一个中文能力强的,我用的那个在通话要点提取上表现稳定。Base URL 用 https://taotoken.net/api 这个地址,注意不要带多余路径。

为什么不用本地模型省掉这一步?我试过 7B 级别的本地模型跑通话解析,中文专有名词和数字经常识别错,比如"周五回电"被解析成"周五回电"以外的内容。换成 TaoToken 上的模型后,要点提取完整度明显提升。如果你坚持纯本地推理,可以把模型换成更大的量化版本,但手机内存和发热要权衡。

配置三件套的时候有个细节:MCP Server 里调用模型的部分要单独写一个配置文件,不要把 Key 硬编码进主逻辑。我用的做法是建一个.env文件,里面放TAOTOKEN_API_KEY、TAOTOKEN_BASE_URL、TAOTOKEN_MODEL_ID三个变量,主程序用 dotenv 读取。这样换 Key 不用改代码。

如果你后面要长期跑编码类或 Agent 类任务,可以了解下 Coding Plan,它适合需要持续调用模型的场景。但通话接管这个场景,按量调用就够了,不用上套餐。

这里提醒一句:API Key 不要提交到任何公开仓库,也不要在截图里露出。我见过有人把 Key 贴在 issue 里,几分钟就被刷爆额度。本地开发用.env加.gitignore是最基本的习惯。

3. 可复制配置:Termux 安装命令与 MCP Server 注册片段

这一节是全文最干的部分,命令和配置都能直接复制。先装 Termux 环境,再装 Node.js,然后写 MCP Server 的配置文件。

第一步,Termux 基础环境。装完最新版 Termux 后依次执行:

pkg update && pkg upgrade -y pkg install -y nodejs-lts git python make clang node -v npm -v

node -v应该输出 v18 或更高。如果低于 v18,MCP 相关的 npm 包会报引擎不兼容。我第一台机器就是 Node 16,折腾半天才发现是版本问题。

第二步,装 MCP Server 依赖。我用的是一个暴露手机硬件能力的 MCP Server 实现,通过 npm 安装:

mkdir -p ~/mcp-phone && cd ~/mcp-phone npm init -y npm install @modelcontextprotocol/sdk dotenv

第三步,写.env文件,放模型三件套:

cat > .env << 'EOF' TAOTOKEN_API_KEY=你的Key TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_MODEL_ID=你的模型ID EOF

第四步,写 MCP Server 的配置文件。我用 JSON 格式,路径放在~/mcp-phone/config.json,内容如下:

{ "mcpServers": { "phone-agent": { "command": "node", "args": ["/data/data/com.termux/files/home/mcp-phone/server.js"], "env": { "TAOTOKEN_API_KEY": "${TAOTOKEN_API_KEY}", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_MODEL_ID": "${TAOTOKEN_MODEL_ID}" } } } }

注意args里的路径要用 Termux 的绝对路径,/data/data/com.termux/files/home/是 Termux 的家目录前缀,直接写~/在某些客户端里解析不了。这个坑我踩过,客户端报 "server not found" 就是因为路径没展开。

第五步,写一个最小的server.js,暴露拨号和联系人工具:

const { Server } = require("@modelcontextprotocol/sdk/server/index.js"); const { StdioServerTransport } = require("@modelcontextprotocol/sdk/server/stdio.js"); require("dotenv").config(); const server = new Server( { name: "phone-agent", version: "1.0.0" }, { capabilities: { tools: {} } } ); server.setRequestHandler("tools/list", async () => ({ tools: [ { name: "contacts_list", description: "列出手机联系人", inputSchema: { type: "object", properties: {} } }, { name: "call_phone", description: "拨打指定号码", inputSchema: { type: "object", properties: { number: { type: "string" } }, required: ["number"] } } ] })); const transport = new StdioServerTransport(); server.connect(transport);

这段代码只做工具注册,实际拨号要调用安卓的am命令或 Termux API。装 Termux API 的命令是pkg install termux-api,同时手机上要装 Termux:API 这个配套 App,否则termux-telephony-call会报权限错误。

第六步,启动 Server 验证:

cd ~/mcp-phone node server.js

如果没报错,说明 MCP Server 起来了。这时候它通过 stdio 等待客户端连接,你可以在另一个 Termux 会话里用echo发 JSON-RPC 请求测试。

4. 验证请求:从自然语言指令到拨号响铃的完整链路

配置写完,接下来验证整条链路能不能跑通。我分三步测:先测工具列表能不能拉到,再测拨号,最后测通话后的自动跟进。

第一步,验证 MCP Server 工具注册。在 AI 客户端里连上这个 Server 后,发一条"列出可用工具"的指令。正常应该返回contacts_list和call_phone两个工具。如果返回空列表,检查server.js里的tools/list处理函数有没有写对,以及客户端配置里的路径是不是绝对路径。

第二步,测自然语言拨号。我在客户端里输入"给张三打个电话",模型先调contacts_list查联系人,找到号码后调call_phone。实测从发指令到拨号响铃大概 2 到 3 秒。这里有个细节:call_phone底层调的是termux-telephony-call,需要电话权限,第一次调用时手机会弹权限请求,要点允许。

验证成功的标志是手机真的拨出去了,而且客户端返回了调用结果。如果只返回了工具调用但手机没反应,多半是 Termux:API 没装或者权限没给。

第三步,测通话后的自动跟进。通话结束后,模型解析通话文本,然后调sms_send发总结短信,或者调notification_send弹待办提醒。我打了个商务咨询电话,挂了之后模型列出了"对方需求是 XXX、约定周五回电、需要准备资料 XX 份"。这个环节依赖模型质量,要点提取完整度直接决定后续动作准不准。

验证请求的时候可以用 curl 直接测模型接口,确认三件套配置没问题:

curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "'"$TAOTOKEN_MODEL_ID"'", "messages": [{"role": "user", "content": "把这句话提取成待办:周五回电,准备三份资料"}] }'

返回里能看到模型输出的待办文本,说明模型入口通了。这一步单独测的好处是,把模型问题和 MCP 问题分开,排障的时候不用两头猜。

整条链路跑通后,你可以把常用指令存成快捷方式。我习惯在客户端里存几条模板,比如"给最近联系人打电话""把刚才通话整理成待办",用的时候直接调。

5. 常见报错排查:401、local proxy failed、reading choices、OAuth

这一节按真实报错来,每个都给我遇到过的现象和解决路径。

401 Unauthorized。这个最常见,原因是 API Key 没配对或者.env没加载。检查三处:.env里的 Key 有没有多余空格,server.js里有没有require("dotenv").config(),客户端配置里的env字段有没有正确传进去。我遇到过一次是 Key 复制时带了换行符,导致请求头里多了个\n,服务端直接拒。

local proxy failed。这个报错通常出现在客户端连 MCP Server 的时候,原因是 Server 进程没起来或者路径不对。先在 Termux 里手动node server.js看能不能跑,能跑再检查客户端配置里的command和args。如果客户端在电脑上、Server 在手机上,还要确认两者在同一局域网,防火墙没拦端口。

reading choices 相关报错。这个一般出现在模型返回格式不符合预期的时候,比如模型返回了非 JSON 内容,而你的代码按 JSON 解析。解决方法是给模型调用加一层容错,解析失败时把原始文本当纯文本处理。另外确认模型 ID 写对了,写错模型 ID 有时会返回空 choices。

OAuth 相关报错。如果你用的客户端走 OAuth 流程,报错多半是回调地址或 token 过期。检查客户端配置里的认证方式,本地场景其实用 API Key 更简单,不用折腾 OAuth。如果必须用 OAuth,确认回调端口没被占用。

Codex auth.json 场景。如果你用 Codex 类客户端,认证信息在auth.json里,要确保 Base URL、Key、Model ID 三件套都写全。缺任何一个都会报认证失败。文件路径一般在客户端的配置目录下,改完重启客户端生效。

CC Switch / Cline MCP 场景。这两个客户端配置 MCP Server 时,同样要写全三件套:Base URL 填https://taotoken.net/api,Key 填你的 Key,Model ID 填模型列表里的 ID。Cline 的 MCP 配置在设置里的 MCP Servers 部分,CC Switch 在配置文件里。写完后点测试连接,通了再保存。

排障的通用思路是分层:先确认模型接口通(用 curl 测),再确认 MCP Server 起(手动 node 跑),最后确认客户端连上(看客户端日志)。三层分开测,比一上来就猜哪里错效率高得多。

6. 本地闭环检查清单与后续接入入口

跑通之后,我整理了一份本地闭环检查清单,每次换设备或重装环境时按这个过一遍,能省不少时间。

环境层:Termux 是最新版,Node.js 是 v18 以上,Termux:API 配套 App 已装,电话和短信权限已给。这三项缺一个,后面都会报错。

配置层:.env里三件套齐全,config.json里路径是绝对路径,server.js里 dotenv 已加载。配置层的错误最隐蔽,因为进程能起来但调用会失败。

链路层:模型接口用 curl 能通,MCP Server 手动能起,客户端能拉到工具列表,拨号能响铃,通话后能触发后续动作。这五步全过,才算真正闭环。

隐私层:确认通话文本没有发往任何第三方服务器,模型调用只走你配置的入口,本地日志不包含敏感号码。这一层是这套方案的核心价值,别在配置里不小心把数据漏出去。

后续如果你想把这套接进更完整的开发流,可以看接入文档,里面有各客户端的详细配置示例。验证模型效果的话,模型对话页面可以直接试。长期跑编码或 Agent 任务,Coding Plan 更划算。API Key 在控制台的 API Keys 页面管理,记得定期轮换。

最后说个实用技巧:把server.js里的工具注册写成可扩展的,后面加拍照、定位、剪贴板这些能力时,只要在tools/list里加一项、在调用处理里加一个分支就行。MCP 协议的好处就在这,工具是声明式的,加新能力不用改客户端。我现在的配置里已经加了定位和剪贴板,通话场景只是其中一块。

返回列表