aliyun-k-search-mcp

aliyun-k-search-mcp

提供基于阿里云函数计算的MCP远程网页搜索服务,支持Exa、Tavily、豆包和Bocha多个搜索引擎的自动回退。

Category
访问服务器

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 deploys 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:需要改用 /mcp Streamable 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

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选