aliyun-k-search-mcp
提供基于阿里云函数计算的MCP远程网页搜索服务,支持Exa、Tavily、豆包和Bocha多个搜索引擎的自动回退。
README
aliyun-k-search-mcp
部署在阿里云函数计算(Function Compute,FC)中国大陆地域的远程网页搜索 MCP。手机 AI 通过阿里云公网 HTTPS 触发器访问,不依赖在中国大陆可能无法打开的 workers.dev 域名。
搜索优先级
服务按以下固定顺序搜索:
Exa → Tavily → 豆包搜索 Custom → Bocha Web Search
只有配置了 API Key 的供应商才会参与搜索。当前供应商出现网络错误、超时、HTTP 错误、业务错误、响应格式异常或空结果时,会自动切换下一家。供应商不会并行请求,因此优先级严格、额外费用更可控。
特性
- MCP Streamable HTTP,入口为
/mcp - MCP 工具名保持为
web_search - Bearer Token 鉴权,手机端不会接触搜索供应商的 API Key
- Exa 按官方 Coding Agent 建议使用
type: auto和 highlights - Tavily 保留默认 80 RPM 排队限速与 429 重试
- 豆包搜索优先使用官方推荐给大模型的
Summary - Bocha 请求文本摘要并兼容其 Bing 风格响应
- 进程内 15 分钟缓存
- 相同并发查询合并,只执行一条完整供应商调用链
- 单次客户端搜索只计算一次月度软配额,内部 fallback 不重复计数
/health仅显示配置状态,不显示密钥
架构
手机 AI / MCP 客户端
│ HTTPS + Bearer Token
▼
阿里云 FC HTTP 触发器(默认杭州)
│
▼
Node.js MCP 服务
├─ 鉴权、Origin 校验和月度软配额
├─ 缓存与相同查询合并
└─ 搜索供应商链
├─ Exa
├─ Tavily(80 RPM 队列与 429 重试)
├─ 豆包搜索 Custom
└─ Bocha Web Search
准备条件
- 已实名认证的阿里云账号
- Node.js 20 或更高版本
- 至少一个搜索 API Key:Exa、Tavily、豆包搜索或 Bocha
- 手机 AI 支持 MCP Streamable HTTP 和自定义请求头
1. 安装依赖
cd ~/Desktop/aliyun-k-search-mcp
npm install
cp .env.example .env
用文本编辑器打开 .env。至少填写一个搜索供应商的 Key,并设置 MCP Token:
EXA_API_KEY=
TAVILY_API_KEY=你的_Tavily_API_Key
DOUBAO_API_KEY=
BOCHA_API_KEY=
MCP_API_TOKEN=你自己生成的长随机访问令牌
空白供应商会被自动跳过。可以生成 MCP 访问令牌:
openssl rand -hex 32
.env 已加入 .gitignore,不会被提交。不要把真实密钥发到聊天或粘贴到公开日志中。
豆包使用“豆包搜索 Custom 版”控制台生成的 API Key,不是火山引擎 AccessKey/Secret。调用地址为 https://open.feedcoopapi.com/search_api/web_search。
2. 配置阿里云登录凭据
运行:
npx s config add
配置名称填写 default。建议在阿里云 RAM 控制台创建专用 RAM 用户,不要使用主账号 AccessKey,并给该用户添加系统策略 AliyunFCFullAccess。
3. 本地测试
npm run build
npm start
另开终端检查:
curl http://127.0.0.1:9000/health
正常结果类似:
{
"status": "ok",
"service": "aliyun-k-search-mcp",
"version": "1.2.0",
"exaConfigured": false,
"tavilyConfigured": true,
"doubaoConfigured": false,
"bochaConfigured": false,
"searchConfigured": true,
"authConfigured": true,
"providerPriority": ["exa", "tavily", "doubao", "bocha"]
}
4. 部署到阿里云函数计算
npm run deploy
部署命令会捕获并过滤 Serverless Devs 输出,对四个搜索 API Key 和 MCP Token 进行打码。成功时只显示部署状态和公网 URL。也可以安全查询公网触发器 URL:
npm run fc:info
不要直接运行并公开粘贴未经处理的 s deploy 或 s info 完整输出,因为其中可能包含函数环境变量。
5. 手机 AI 配置
把部署结果的公网 URL 加上 /mcp:
{
"url": "https://你的阿里云HTTP触发器地址/mcp",
"headers": {
"Authorization": "Bearer 你在.env中设置的MCP_API_TOKEN"
}
}
手机端无需配置任何搜索供应商 Key。先在手机浏览器打开触发器地址的 /health;能快速显示 JSON,说明中国大陆入口正常。
配置项
| 名称 | 默认值 | 说明 |
|---|---|---|
EXA_API_KEY |
空 | 可选;配置后为第一优先级 |
TAVILY_API_KEY |
空 | 可选;配置后为第二优先级 |
DOUBAO_API_KEY |
空 | 可选;豆包搜索 Custom API Key |
BOCHA_API_KEY |
空 | 可选;Bocha API Key |
MCP_API_TOKEN |
无 | 必填,至少 16 字符,推荐 64 位十六进制 |
ALIYUN_REGION |
cn-hangzhou |
FC 地域 |
ALLOWED_ORIGINS |
空 | 浏览器 Origin 白名单;原生手机客户端通常留空 |
MAX_RESULTS |
5 |
每次最多结果数,范围 1~10 |
CACHE_TTL_SECONDS |
900 |
内存缓存秒数,0 表示禁用 |
MAX_MONTHLY_SEARCHES |
900 |
实例内月度软上限,0 表示无限制 |
EXA_TIMEOUT_MS |
12000 |
单次 Exa 请求超时 |
TAVILY_TIMEOUT_MS |
15000 |
单次 Tavily 请求超时 |
DOUBAO_TIMEOUT_MS |
15000 |
单次豆包搜索请求超时 |
BOCHA_TIMEOUT_MS |
12000 |
单次 Bocha 请求超时 |
TAVILY_RPM |
80 |
Tavily 出站请求上限,最大允许配置为 100 |
TAVILY_MAX_QUEUE_MS |
30000 |
Tavily 最大预计排队时间 |
四个搜索 API Key 至少配置一个。缓存、月度软上限和相同查询合并状态保存在函数实例内存中,冷启动或重新部署后会清空;各供应商账户仍负责最终额度限制。
并发和限流说明
s.yaml 将函数总并发与单实例并发均设置为 100,使正常允许的并发可由一个实例承载。Tavily 免费 Key 的队列限流保存在 Node 进程内;如果提高函数总并发并触发多个实例,每个实例都会拥有独立队列,可能合计超过 Tavily 的账户 RPM。
Exa、豆包和 Bocha 当前不使用 Tavily 的 80 RPM 队列;它们收到限流或额度错误时会切换下一家。需要对这些供应商做跨实例精确限流时,应使用 Redis、Tablestore 等共享原子存储。
常见问题
/health显示misconfigured:确认MCP_API_TOKEN已设置,并且四个搜索 Key 至少填写一个。- MCP 返回 401:手机里的 Bearer Token 与
MCP_API_TOKEN不一致。 - 高优先级供应商 Key 错误:服务会记录安全错误并自动切换下一家;
/health只检查是否配置,不会在线验证 Key。 - 搜索全部失败:检查函数日志、供应商余额和 API Key 权限;客户端只会看到统一安全错误。
- Tavily 返回排队已满:服务会继续尝试豆包和 Bocha;如果没有后续供应商,则返回统一失败提示。
- 旧客户端使用
/sse:需要改用/mcpStreamable HTTP。
开发验证
npm test
npm run typecheck
npm run build
项目结构
src/
├── application/ MCP HTTP 应用编排与 web_search 工具
├── config/ 环境变量解析和运行时配置
├── coordinators/ 并发请求合并、排队、限流与重试
├── entries/ Node.js 与阿里云 FC 启动入口
├── providers/ Exa、Tavily、豆包、Bocha 适配器与 fallback 链
│ └── shared/ 供应商公共错误、HTTP 请求和值规范化方法
├── security/ Bearer 鉴权、Origin 与 CORS
├── services/ 进程内缓存和月度软上限
├── shared/ 跨层共享类型
└── transport/ Node HTTP 与 FC 事件协议适配器
s.yaml 阿里云 FC 部署配置
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。