Imported from skernelx/MySearch-Proxy (
skill/SKILL.md). Install upstream withnpx skills add skernelx/MySearch-Proxy --skill skill. Copyright stays with the author.
MySearch
MySearch 是一层聚合搜索技能,不假设你只用单一 provider,也不把 “skill 安装”和 “MCP 安装”混成一件事。
如果你是 AI 助手,并且用户只是给了仓库地址或 skill/ 目录:
-
先打开
skill/README.md -
先按
README完成安装与验收 -
再回到这个
SKILL.md执行搜索规则和调用策略 -
Tavily:适合普通网页发现、新闻检索、快速答案
-
Firecrawl:适合文档、GitHub、pricing、changelog、正文抓取
-
Exa:作为 Tavily / Firecrawl 的 fallback,在主 provider 不可用时自动接管网页发现
-
X 搜索:适合”大家在 X 上怎么说”、实时舆情、开发者讨论
MySearch-First 规则
只要 mysearch_health 显示 MySearch 已安装且至少有一个可用 provider:
- 外部搜索任务优先走
MySearch - 不要先混用通用网页搜索、浏览器搜索或别的 search MCP
- 一旦已经用
MySearch找到目标页面,后续优先继续用extract_url/research读取正文,不要中途切回通用网页搜索 - 只有下面几种情况,才回退到通用网页搜索:
mysearchMCP 没装好mysearch_health显示需要的 provider 不可用- MySearch 结果明显冲突,且你要做额外交叉验证
extract_url对目标页面返回空正文、抓取失败,或连续两次都拿不到正文- 用户明确要求你再用别的搜索工具复核
目标不是“多调几个工具”,而是先让 MySearch 成为默认搜索入口。
官方来源任务规则
当用户明确要:
- 官方文档
- 官方公告
- 官方 pricing / changelog / docs
- 某个官网页面的原文依据
优先这样走:
search(..., include_domains=["官方域名"])或search(..., mode="docs")实际调用优先传列表,不要传逗号拼接字符串- 从结果里拿到官方 URL
- 对官方 URL 继续用
extract_url - 基于
extract_url的正文整理答案
不要这样走:
- 先用
MySearch找到官方页面 - 又切回通用网页搜索去重复搜同一批 URL
只有在下面情况,才允许切回通用网页搜索:
MySearch没找到目标官方页面extract_url拿不到正文- 你需要额外确认页面是否刚更新、跳转或地区差异
重点:
MySearch负责“发现 + 读正文”- 通用网页搜索只作为失败兜底或额外交叉验证
- 不要把
MySearch只用成“第一跳发现器”
用户可见输出规则
- 记忆预读是全局基线,不属于
mysearch本身的可见步骤;除非用户在问调试链路,否则不要特意汇报“我先预读了记忆” - 不要把内部动作说给用户听:
- 不要说“我先打开/读取了 skill”
- 不要说“已浏览几个文件”
- 不要说“已调用 MySearch MCP / tool”
- 不要逐条播报
health、search、extract_url、research的调用过程
- 用户可见更新只保留真正有意义的动作,例如:
- “我先查今天 X 上的热议话题,再整理成摘要”
- “我先核对 provider 健康,再抓结果”
- 如果
health只是正常预检,不要专门汇报;只有它发现异常、并且会影响结果时,才向用户说明 - 搜索类回复默认到结论、来源或结果列表为止;除非用户明确要后续选项,否则不要追加“如果你要,我可以……”这类广告式结尾
- 默认不要在结尾推销下一步、延伸版、快讯版、核实版或套餐式选项
推荐的用户可见更新:
- “我先查一下今天 X 上的热议话题,再给你一版可读摘要。”
- “我先做一轮社交搜索,再把重复热点合并掉。”
不推荐的用户可见更新:
- “我先打开 mysearch skill。”
- “已调用 MySearch MCP Mysearch Health 工具。”
- “已浏览 3 个文件。”
- “我先读取 skill,再调用工具。”
严格参数规则
search / research 只允许这些 mode:
autowebnewssocialdocsresearchgithubpdf
禁止事项:
- 不要发明
mode="hybrid"这类不存在的参数 - 不要把
hybrid当成输入模式;它只是某些结果的返回形态 - 同时要网页和 X 时,优先:
search(..., sources=["web","x"])- 或先
search(mode="social"),再search(mode="news")
sources必须传列表,不要传逗号拼接字符串,也不要传"web,x"这种单字符串- 查官网、官方文档、官方公告时,优先显式传
include_domains include_domains优先传列表,不要传"docs.example.com,example.com"这种单字符串- 只查 X / 社交讨论时,优先直接用
mode="social",不要再额外混传sources - 用户明确要看 X 讨论时,不要先跑网页新闻
- 用户明确要读单页正文时,不要先反复搜索,直接
extract_url
用户只发了 skill 地址时怎么处理
如果用户贴的是下面任意一种内容:
https://github.com/skernelx/MySearch-Proxyhttps://github.com/skernelx/MySearch-Proxy/tree/main/skill- 本地仓库路径里的
skill/
默认按下面顺序处理:
- 先确认这是
MySearchskill 仓库,而不是单独的 MCP 包 - 先安装 skill 到
~/.codex/skills/mysearch - 再确认
mysearchMCP 是否已经注册到Codex/Claude Code - 如果 MCP 没装,再去仓库根目录执行
./install.sh - 安装 skill 后提醒用户重启
Codex
要点:
skill/目录负责“让 AI 知道怎么用 MySearch”- 仓库根目录的
install.sh负责“把 MySearch MCP 注册进 Codex / Claude Code” - 两者互补,不要只装一个就当全部完成
用户给的是远程 MySearch URL 时怎么处理
如果用户给的是已经部署好的 MySearch 地址,比如:
http://127.0.0.1:8000/mcphttps://example.com/mcp- 任何明确标注为
streamableHTTP的 MySearch endpoint
默认按下面顺序处理:
- 先把它当成远程 MCP,不要再让用户本地执行
./install.sh - 如果当前环境是
Codex,优先执行codex mcp add mysearch --url <URL> - 如果远程入口需要 Bearer Token,使用
--bearer-token-env-var - 注册后先跑
codex mcp get mysearch - 再做
health和 smoke test
参考命令:
codex mcp add mysearch --url http://127.0.0.1:8000/mcp
codex mcp get mysearch
如果需要 Bearer Token:
export MYSEARCH_MCP_BEARER_TOKEN=your-token
codex mcp add mysearch \
--url https://mysearch.example.com/mcp \
--bearer-token-env-var MYSEARCH_MCP_BEARER_TOKEN
codex mcp get mysearch
这里不要混淆:
- 本地仓库安装 =
stdio - 远程 URL 接入 =
streamableHTTP OpenClaw的openclaw/bundle 不依赖这条远程 MCP URL
安装流程
A. 安装 skill
如果已经有仓库本地副本,优先用:
bash skill/scripts/install_codex_skill.sh
如果目标目录已存在,需要覆盖时:
bash skill/scripts/install_codex_skill.sh --force
安装完成后提醒用户:
- 重启
Codex
B. 安装 MCP
在仓库根目录执行:
python3 -m venv venv
./install.sh
优先把 MYSEARCH_* 直接写进宿主 config:
Codex:~/.codex/config.toml的mcp_servers.mysearch.envClaude Code:注册 MCP 时直接注入 env
只有在本地单仓调试、又不方便改宿主配置时,才准备:
cp mysearch/.env.example mysearch/.env
再填写缺的 MYSEARCH_* / SOCIAL_GATEWAY_*。
快速验收
优先按下面顺序验收,不要一上来就盲调:
codex mcp listcodex mcp get mysearchpython skill/scripts/check_mysearch.py --health-onlypython skill/scripts/check_mysearch.py --web-query "OpenAI"- 如果
xai.available_keys > 0,再跑python skill/scripts/check_mysearch.py --social-query "Model Context Protocol"
如果用户要更完整的烟测,再加:
python skill/scripts/check_mysearch.py \
--web-query "OpenAI latest announcements" \
--docs-query "OpenAI API responses docs" \
--social-query "Model Context Protocol" \
--extract-url "https://www.anthropic.com/news/model-context-protocol"
调试顺序
1. 工具没出现
- 看
codex mcp list是否有mysearch - 没有就回到仓库根目录重跑
./install.sh - skill 没生效就检查
~/.codex/skills/mysearch/SKILL.md - skill 新装后如果还是没生效,提醒用户重启
Codex
2. provider 没配好
先跑:
python skill/scripts/check_mysearch.py --health-only
重点看:
tavily.base_urlfirecrawl.base_urlxai.search_modexai.alternate_base_urls.social_searchavailable_keys
如果这里看到 xai.available_keys = 0:
- 不要直接判定
MySearch安装失败 - 先验证
web/docs/extract_url - 只有
social路由会不可用
3. 网页搜索正常,X 不正常
优先检查:
MYSEARCH_XAI_SEARCH_MODEMYSEARCH_XAI_SOCIAL_BASE_URL- social gateway 是否真的提供
/social/search
compatible 模式下,真正的 X 搜索结果应该来自 social gateway,
不是直接指望 /responses 自己变成结构化 X 列表。
如果用户没有 grok2api,也没有官方 xAI key,不要强推 X;
这时 MySearch 仍然可以作为 Tavily + Firecrawl 搜索 MCP 正常工作。
4. extract_url 正文为空
默认 extract_url 会先走 Firecrawl。
如果:
Firecrawl抓取失败- 或返回空正文
MySearch 会自动回退到 Tavily extract。
调试时要看返回里的:
warningfallback.fromfallback.reason
5. 结果不够稳
优先调整,而不是立刻换 provider:
- 对比 / 原因分析:
intent="comparison"或intent="exploratory" - 要交叉验证:
strategy="verify" - 要 docs / GitHub / PDF / changelog:
mode="docs" - 要完整小研究:
research(...)
默认工作流
- 先用
mysearch_health确认当前哪些 provider 已配置可用 - 默认从
search开始,让路由层自动选 provider - 如果问题明显是对比、趋势、原因分析,优先显式传
intent - 如果要交叉验证或更稳妥的结果,显式传
strategy="verify"或strategy="deep"
高频场景模板
今天 X 上在热议什么
- 用户可见更新:
- “我先查今天 X 上的热议话题,再整理成摘要。”
- 工具调用:
mysearch_health()search(query="today's biggest stories on X", mode="social", intent="status")
同时看网页新闻和 X
- 用户可见更新:
- “我先把 X 热议和网页新闻各抓一轮,再合并重复热点。”
- 工具调用二选一:
search(query="...", sources=["web","x"], intent="status", strategy="verify")- 或先
search(mode="social"),再search(mode="news")
只读单页正文
- 用户可见更新:
- “我先直接抓这页正文,再给你提炼重点。”
- 工具调用:
extract_url(url="...")
官方文档 / 官网页面
- 用户可见更新:
- “我先锁定官方页面,再直接抓正文核对。”
- 工具调用:
search(query="...", mode="docs", include_domains=["docs.example.com","example.com"])- 然后
extract_url(url="官方结果里的目标页面")
- 只有在需要正文时才用
extract_url - 需要“先搜再抓再整理”时用
research
高频场景剧本
1. 今天 X 上在热议什么
优先:
search(query="...", mode="social", intent="status")
不要:
- 不要先跑
news - 不要用
research起手 - 不要混用 generic web search
2. 今天 X 热议 + 网页新闻一起对照
优先二选一:
- 单次:
search(query="...", sources=["web","x"], intent="status", strategy="verify") - 双次:
search(query="...", mode="social", intent="status")search(query="...", mode="news", intent="status")
补充规则:
- 不要传
mode="hybrid" - 结论里要区分“X 上在热议什么”和“媒体在报道什么”
3. 文档、GitHub、changelog、pricing
优先:
search(query="...", mode="docs", intent="resource")
4. 单页正文、博客、公告原文
优先:
extract_url(url="...")
5. 要一个小型研究包
优先:
research(query="...", intent="exploratory", include_social=true|false)
补充规则:
- 如果用户主要关心 X,就优先
include_social=true - 如果
xai不可用,也要照常返回网页部分,不要把整次任务判成失败
决策流程
- 先判断是否真的需要外部搜索
- 需要实时信息、新闻、产品状态时优先搜索,不用内部记忆硬答
- 需要单页正文时,不要反复搜索,直接
extract_url - 需要多个来源交叉验证时,用
research - 输出时保留来源链接,并区分事实、引文和推断
Intent 与 Strategy
-
intent="factual":普通事实检索 -
intent="status"/intent="news":最新动态、版本、发布、事故 -
intent="comparison":选型、对比、优缺点 -
intent="tutorial":教程、guide、how-to -
intent="exploratory":原因、影响、趋势、分析 -
intent="resource":docs、GitHub、pricing、changelog、PDF -
strategy="fast":单 provider 快速返回 -
strategy="balanced":主 provider + 次 provider 补充 -
strategy="verify":Tavily + Firecrawl 交叉验证网页结果 -
strategy="deep":更偏 research 的双 provider 路径
默认自动行为:
comparison/exploratory会自动倾向verifyresource/tutorial/include_content=true会自动倾向balancedresearch会自动倾向deep
自动路由规则
- 普通网页检索:默认 Tavily
- 新闻 / 最新动态:默认 Tavily news
- 文档 / GitHub / PDF / changelog / pricing:默认 Firecrawl
- X / Twitter / 社交舆情:默认 xAI X search
- 同时要网页和社交:结果可能是
hybrid,但调用时不要传mode="hybrid";应使用sources=["web","x"]或拆成social + news
X provider 模式
official:适合官方 xAI,或真正支持x_search/web_search的兼容后端compatible:适合grok2api这类只提供/responses的兼容网关compatible模式下,真正的 X 结果要来自mysearch.social_gateway这类 social search gateway- 如果 social gateway 前面还有一层 proxy,可以优先用“grok2api admin 自动继承”模式,避免重复维护
SOCIAL_GATEWAY_UPSTREAM_API_KEY/SOCIAL_GATEWAY_TOKEN MYSEARCH_XAI_SOCIAL_BASE_URL用来单独指定 social gateway 根地址;MySearch默认会自动追加/social/search
什么时候强制指定 provider
- 你明确知道要对正文友好的结果:
provider="firecrawl" - 你明确要 X 搜索:
provider="xai"或mode="social" - 你只想走 Tavily:
provider="tavily"
使用准则
- 默认
max_results控制在 5 以内 - 普通问答不要默认
include_content=true - 输出时保留 URL,并区分事实与推断
- 需要更稳妥的网页结论时,优先用
strategy="verify" - 输出里如果有
evidence,要把它当成“证据密度提示”一起解读 - 需要同时看网页和 X 时,传
sources=["web","x"] - X 搜索依赖单独的 xAI key;没配时应该显式说明 social 部分不可用
- 用户如果只配置了
Tavily + Firecrawl,应视为“Web 版 MySearch 可用”,不是“安装失败” - 单个页面阅读优先
extract_url - 多来源整理优先
research - 用户只贴 skill 地址时,先安装 skill,再检查 MCP 是否已注册
- 调试优先跑
skill/scripts/check_mysearch.py,不要先手写一长串 Python one-liner - MySearch 健康可用时,不要再额外混用 generic web search 作为主流程
- 问“今天 / 最新 / 刚刚 / 本周”这类时效性问题时,优先
intent="status";需要媒体报道时加mode="news",需要 X 热议时加mode="social" - 结论如果同时包含网页和 X,必须明确区分两者,不要混成一个模糊结论
证据标准
- 涉及时效性、版本、发布信息时,优先相信搜索结果,不靠旧记忆
- 关键结论尽量给至少两个独立来源
- 单一来源结论要显式说明限制
- 来源冲突时,要把冲突本身讲清楚,而不是强行给一个确定答案
常见模式
普通网页搜索
search(query="best search MCP server", mode="web")
对比 + 交叉验证
search(query="Tavily vs Firecrawl for docs search", intent="comparison", strategy="verify")
最新新闻
search(query="OpenAI latest announcements", mode="news")
X 舆情
search(query="what are people saying about MCP", mode="social")
网页 + X 聚合
search(query="latest MCP search server feedback", sources=["web", "x"])
文档 / GitHub / changelog
search(query="Firecrawl pricing changes", mode="docs", include_content=true)
抓正文
extract_url(url="https://example.com/post")
小型研究
research(query="best search MCP server 2026", intent="exploratory", include_social=true)
需要强制指定 provider 的场景
- 网页搜索结果太泛,需要文档站 / GitHub / changelog:
provider="firecrawl" - 你明确只想看 X 上的讨论:
provider="xai"或mode="social" - 你只需要 Tavily 的快速网页发现和 answer:
provider="tavily"