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 读取正文,不要中途切回通用网页搜索
- 只有下面几种情况,才回退到通用网页搜索:
mysearch MCP 没装好
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:
auto
web
news
social
docs
research
github
pdf
禁止事项:
- 不要发明
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-Proxy
https://github.com/skernelx/MySearch-Proxy/tree/main/skill
- 本地仓库路径里的
skill/
默认按下面顺序处理:
- 先确认这是
MySearch skill 仓库,而不是单独的 MCP 包
- 先安装 skill 到
~/.codex/skills/mysearch
- 再确认
mysearch MCP 是否已经注册到 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/mcp
https://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
安装完成后提醒用户:
B. 安装 MCP
在仓库根目录执行:
python3 -m venv venv
./install.sh
优先把 MYSEARCH_* 直接写进宿主 config:
Codex:~/.codex/config.toml 的 mcp_servers.mysearch.env
Claude Code:注册 MCP 时直接注入 env
只有在本地单仓调试、又不方便改宿主配置时,才准备:
cp mysearch/.env.example mysearch/.env
再填写缺的 MYSEARCH_* / SOCIAL_GATEWAY_*。
快速验收
优先按下面顺序验收,不要一上来就盲调:
codex mcp list
codex mcp get mysearch
python skill/scripts/check_mysearch.py --health-only
python 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_url
firecrawl.base_url
xai.search_mode
xai.alternate_base_urls.social_search
available_keys
如果这里看到 xai.available_keys = 0:
- 不要直接判定
MySearch 安装失败
- 先验证
web / docs / extract_url
- 只有
social 路由会不可用
3. 网页搜索正常,X 不正常
优先检查:
MYSEARCH_XAI_SEARCH_MODE
MYSEARCH_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。
如果:
MySearch 会自动回退到 Tavily extract。
调试时要看返回里的:
warning
fallback.from
fallback.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 上在热议什么
- 用户可见更新:
- 工具调用:
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")
只读单页正文
官方文档 / 官网页面
- 用户可见更新:
- 工具调用:
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. 单页正文、博客、公告原文
优先:
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 会自动倾向 verify
resource / tutorial / include_content=true 会自动倾向 balanced
research 会自动倾向 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"
1---2name: mysearch3description: Install, verify, debug, and use MySearch MCP/Skill. Aggregates Tavily, Firecrawl, Exa, and X search (via xAI) behind one workflow. Use when the user shares a MySearch repo/skill URL, wants MySearch installed or repaired, or wants current web search, social/X search, document-oriented search, URL content extraction, or a small multi-source research pack with citations. When MySearch is available, prefer it over generic web search for external lookup tasks.4---56# MySearch78MySearch 是一层聚合搜索技能,不假设你只用单一 provider,也不把9“skill 安装”和 “MCP 安装”混成一件事。1011如果你是 AI 助手,并且用户只是给了仓库地址或 `skill/` 目录:1213- 先打开 `skill/README.md`14- 先按 `README` 完成安装与验收15- 再回到这个 `SKILL.md` 执行搜索规则和调用策略1617- Tavily:适合普通网页发现、新闻检索、快速答案18- Firecrawl:适合文档、GitHub、pricing、changelog、正文抓取19- Exa:作为 Tavily / Firecrawl 的 fallback,在主 provider 不可用时自动接管网页发现20- X 搜索:适合”大家在 X 上怎么说”、实时舆情、开发者讨论2122## MySearch-First 规则2324只要 `mysearch_health` 显示 MySearch 已安装且至少有一个可用 provider:2526- 外部搜索任务优先走 `MySearch`27- 不要先混用通用网页搜索、浏览器搜索或别的 search MCP28- 一旦已经用 `MySearch` 找到目标页面,后续优先继续用 `extract_url` / `research` 读取正文,不要中途切回通用网页搜索29- 只有下面几种情况,才回退到通用网页搜索:30 - `mysearch` MCP 没装好31 - `mysearch_health` 显示需要的 provider 不可用32 - MySearch 结果明显冲突,且你要做额外交叉验证33 - `extract_url` 对目标页面返回空正文、抓取失败,或连续两次都拿不到正文34 - 用户明确要求你再用别的搜索工具复核3536目标不是“多调几个工具”,而是先让 `MySearch` 成为默认搜索入口。3738## 官方来源任务规则3940当用户明确要:4142- 官方文档43- 官方公告44- 官方 pricing / changelog / docs45- 某个官网页面的原文依据4647优先这样走:48491. `search(..., include_domains=["官方域名"])` 或 `search(..., mode="docs")`50 实际调用优先传列表,不要传逗号拼接字符串512. 从结果里拿到官方 URL523. 对官方 URL 继续用 `extract_url`534. 基于 `extract_url` 的正文整理答案5455不要这样走:56571. 先用 `MySearch` 找到官方页面582. 又切回通用网页搜索去重复搜同一批 URL5960只有在下面情况,才允许切回通用网页搜索:6162- `MySearch` 没找到目标官方页面63- `extract_url` 拿不到正文64- 你需要额外确认页面是否刚更新、跳转或地区差异6566重点:6768- `MySearch` 负责“发现 + 读正文”69- 通用网页搜索只作为失败兜底或额外交叉验证70- 不要把 `MySearch` 只用成“第一跳发现器”7172## 用户可见输出规则7374- 记忆预读是全局基线,不属于 `mysearch` 本身的可见步骤;除非用户在问调试链路,否则不要特意汇报“我先预读了记忆”75- 不要把内部动作说给用户听:76 - 不要说“我先打开/读取了 skill”77 - 不要说“已浏览几个文件”78 - 不要说“已调用 MySearch MCP / tool”79 - 不要逐条播报 `health`、`search`、`extract_url`、`research` 的调用过程80- 用户可见更新只保留真正有意义的动作,例如:81 - “我先查今天 X 上的热议话题,再整理成摘要”82 - “我先核对 provider 健康,再抓结果”83- 如果 `health` 只是正常预检,不要专门汇报;只有它发现异常、并且会影响结果时,才向用户说明84- 搜索类回复默认到结论、来源或结果列表为止;除非用户明确要后续选项,否则不要追加“如果你要,我可以……”这类广告式结尾85- 默认不要在结尾推销下一步、延伸版、快讯版、核实版或套餐式选项8687推荐的用户可见更新:8889- “我先查一下今天 X 上的热议话题,再给你一版可读摘要。”90- “我先做一轮社交搜索,再把重复热点合并掉。”9192不推荐的用户可见更新:9394- “我先打开 mysearch skill。”95- “已调用 MySearch MCP Mysearch Health 工具。”96- “已浏览 3 个文件。”97- “我先读取 skill,再调用工具。”9899## 严格参数规则100101`search` / `research` 只允许这些 `mode`:102103- `auto`104- `web`105- `news`106- `social`107- `docs`108- `research`109- `github`110- `pdf`111112禁止事项:113114- 不要发明 `mode="hybrid"` 这类不存在的参数115- 不要把 `hybrid` 当成输入模式;它只是某些结果的返回形态116- 同时要网页和 X 时,优先:117 - `search(..., sources=["web","x"])`118 - 或先 `search(mode="social")`,再 `search(mode="news")`119- `sources` 必须传列表,不要传逗号拼接字符串,也不要传 `"web,x"` 这种单字符串120- 查官网、官方文档、官方公告时,优先显式传 `include_domains`121- `include_domains` 优先传列表,不要传 `"docs.example.com,example.com"` 这种单字符串122- 只查 X / 社交讨论时,优先直接用 `mode="social"`,不要再额外混传 `sources`123- 用户明确要看 X 讨论时,不要先跑网页新闻124- 用户明确要读单页正文时,不要先反复搜索,直接 `extract_url`125126## 用户只发了 skill 地址时怎么处理127128如果用户贴的是下面任意一种内容:129130- `https://github.com/skernelx/MySearch-Proxy`131- `https://github.com/skernelx/MySearch-Proxy/tree/main/skill`132- 本地仓库路径里的 `skill/`133134默认按下面顺序处理:1351361. 先确认这是 `MySearch` skill 仓库,而不是单独的 MCP 包1372. 先安装 skill 到 `~/.codex/skills/mysearch`1383. 再确认 `mysearch` MCP 是否已经注册到 `Codex` / `Claude Code`1394. 如果 MCP 没装,再去仓库根目录执行 `./install.sh`1405. 安装 skill 后提醒用户重启 `Codex`141142要点:143144- `skill/` 目录负责“让 AI 知道怎么用 MySearch”145- 仓库根目录的 `install.sh` 负责“把 MySearch MCP 注册进 Codex / Claude Code”146- 两者互补,不要只装一个就当全部完成147148## 用户给的是远程 MySearch URL 时怎么处理149150如果用户给的是已经部署好的 `MySearch` 地址,比如:151152- `http://127.0.0.1:8000/mcp`153- `https://example.com/mcp`154- 任何明确标注为 `streamableHTTP` 的 MySearch endpoint155156默认按下面顺序处理:1571581. 先把它当成远程 MCP,不要再让用户本地执行 `./install.sh`1592. 如果当前环境是 `Codex`,优先执行 `codex mcp add mysearch --url <URL>`1603. 如果远程入口需要 Bearer Token,使用 `--bearer-token-env-var`1614. 注册后先跑 `codex mcp get mysearch`1625. 再做 `health` 和 smoke test163164参考命令:165166```bash167codex mcp add mysearch --url http://127.0.0.1:8000/mcp168codex mcp get mysearch169```170171如果需要 Bearer Token:172173```bash174export MYSEARCH_MCP_BEARER_TOKEN=your-token175codex mcp add mysearch \176 --url https://mysearch.example.com/mcp \177 --bearer-token-env-var MYSEARCH_MCP_BEARER_TOKEN178codex mcp get mysearch179```180181这里不要混淆:182183- 本地仓库安装 = `stdio`184- 远程 URL 接入 = `streamableHTTP`185- `OpenClaw` 的 `openclaw/` bundle 不依赖这条远程 MCP URL186187## 安装流程188189### A. 安装 skill190191如果已经有仓库本地副本,优先用:192193```bash194bash skill/scripts/install_codex_skill.sh195```196197如果目标目录已存在,需要覆盖时:198199```bash200bash skill/scripts/install_codex_skill.sh --force201```202203安装完成后提醒用户:204205- 重启 `Codex`206207### B. 安装 MCP208209在仓库根目录执行:210211```bash212python3 -m venv venv213./install.sh214```215216优先把 `MYSEARCH_*` 直接写进宿主 config:217218- `Codex`:`~/.codex/config.toml` 的 `mcp_servers.mysearch.env`219- `Claude Code`:注册 MCP 时直接注入 env220221只有在本地单仓调试、又不方便改宿主配置时,才准备:222223```bash224cp mysearch/.env.example mysearch/.env225```226227再填写缺的 `MYSEARCH_*` / `SOCIAL_GATEWAY_*`。228229## 快速验收230231优先按下面顺序验收,不要一上来就盲调:2322331. `codex mcp list`2342. `codex mcp get mysearch`2353. `python skill/scripts/check_mysearch.py --health-only`2364. `python skill/scripts/check_mysearch.py --web-query "OpenAI"`2375. 如果 `xai.available_keys > 0`,再跑 `python skill/scripts/check_mysearch.py --social-query "Model Context Protocol"`238239如果用户要更完整的烟测,再加:240241```bash242python skill/scripts/check_mysearch.py \243 --web-query "OpenAI latest announcements" \244 --docs-query "OpenAI API responses docs" \245 --social-query "Model Context Protocol" \246 --extract-url "https://www.anthropic.com/news/model-context-protocol"247```248249## 调试顺序250251### 1. 工具没出现252253- 看 `codex mcp list` 是否有 `mysearch`254- 没有就回到仓库根目录重跑 `./install.sh`255- skill 没生效就检查 `~/.codex/skills/mysearch/SKILL.md`256- skill 新装后如果还是没生效,提醒用户重启 `Codex`257258### 2. provider 没配好259260先跑:261262```bash263python skill/scripts/check_mysearch.py --health-only264```265266重点看:267268- `tavily.base_url`269- `firecrawl.base_url`270- `xai.search_mode`271- `xai.alternate_base_urls.social_search`272- `available_keys`273274如果这里看到 `xai.available_keys = 0`:275276- 不要直接判定 `MySearch` 安装失败277- 先验证 `web` / `docs` / `extract_url`278- 只有 `social` 路由会不可用279280### 3. 网页搜索正常,X 不正常281282优先检查:283284- `MYSEARCH_XAI_SEARCH_MODE`285- `MYSEARCH_XAI_SOCIAL_BASE_URL`286- social gateway 是否真的提供 `/social/search`287288`compatible` 模式下,真正的 X 搜索结果应该来自 social gateway,289不是直接指望 `/responses` 自己变成结构化 X 列表。290291如果用户没有 `grok2api`,也没有官方 `xAI` key,不要强推 X;292这时 `MySearch` 仍然可以作为 `Tavily + Firecrawl` 搜索 MCP 正常工作。293294### 4. `extract_url` 正文为空295296默认 `extract_url` 会先走 `Firecrawl`。297298如果:299300- `Firecrawl` 抓取失败301- 或返回空正文302303MySearch 会自动回退到 `Tavily extract`。304305调试时要看返回里的:306307- `warning`308- `fallback.from`309- `fallback.reason`310311### 5. 结果不够稳312313优先调整,而不是立刻换 provider:314315- 对比 / 原因分析:`intent="comparison"` 或 `intent="exploratory"`316- 要交叉验证:`strategy="verify"`317- 要 docs / GitHub / PDF / changelog:`mode="docs"`318- 要完整小研究:`research(...)`319320## 默认工作流3213221. 先用 `mysearch_health` 确认当前哪些 provider 已配置可用3232. 默认从 `search` 开始,让路由层自动选 provider3243. 如果问题明显是对比、趋势、原因分析,优先显式传 `intent`3254. 如果要交叉验证或更稳妥的结果,显式传 `strategy="verify"` 或 `strategy="deep"`326327## 高频场景模板328329### 今天 X 上在热议什么330331- 用户可见更新:332 - “我先查今天 X 上的热议话题,再整理成摘要。”333- 工具调用:334 - `mysearch_health()`335 - `search(query="today's biggest stories on X", mode="social", intent="status")`336337### 同时看网页新闻和 X338339- 用户可见更新:340 - “我先把 X 热议和网页新闻各抓一轮,再合并重复热点。”341- 工具调用二选一:342 - `search(query="...", sources=["web","x"], intent="status", strategy="verify")`343 - 或先 `search(mode="social")`,再 `search(mode="news")`344345### 只读单页正文346347- 用户可见更新:348 - “我先直接抓这页正文,再给你提炼重点。”349- 工具调用:350 - `extract_url(url="...")`351352### 官方文档 / 官网页面353354- 用户可见更新:355 - “我先锁定官方页面,再直接抓正文核对。”356- 工具调用:357 - `search(query="...", mode="docs", include_domains=["docs.example.com","example.com"])`358 - 然后 `extract_url(url="官方结果里的目标页面")`3595. 只有在需要正文时才用 `extract_url`3606. 需要“先搜再抓再整理”时用 `research`361362## 高频场景剧本363364### 1. 今天 X 上在热议什么365366优先:367368- `search(query="...", mode="social", intent="status")`369370不要:371372- 不要先跑 `news`373- 不要用 `research` 起手374- 不要混用 generic web search375376### 2. 今天 X 热议 + 网页新闻一起对照377378优先二选一:379380- 单次:`search(query="...", sources=["web","x"], intent="status", strategy="verify")`381- 双次:382 - `search(query="...", mode="social", intent="status")`383 - `search(query="...", mode="news", intent="status")`384385补充规则:386387- 不要传 `mode="hybrid"`388- 结论里要区分“X 上在热议什么”和“媒体在报道什么”389390### 3. 文档、GitHub、changelog、pricing391392优先:393394- `search(query="...", mode="docs", intent="resource")`395396### 4. 单页正文、博客、公告原文397398优先:399400- `extract_url(url="...")`401402### 5. 要一个小型研究包403404优先:405406- `research(query="...", intent="exploratory", include_social=true|false)`407408补充规则:409410- 如果用户主要关心 X,就优先 `include_social=true`411- 如果 `xai` 不可用,也要照常返回网页部分,不要把整次任务判成失败412413## 决策流程4144151. 先判断是否真的需要外部搜索4162. 需要实时信息、新闻、产品状态时优先搜索,不用内部记忆硬答4173. 需要单页正文时,不要反复搜索,直接 `extract_url`4184. 需要多个来源交叉验证时,用 `research`4195. 输出时保留来源链接,并区分事实、引文和推断420421## Intent 与 Strategy422423- `intent="factual"`:普通事实检索424- `intent="status"` / `intent="news"`:最新动态、版本、发布、事故425- `intent="comparison"`:选型、对比、优缺点426- `intent="tutorial"`:教程、guide、how-to427- `intent="exploratory"`:原因、影响、趋势、分析428- `intent="resource"`:docs、GitHub、pricing、changelog、PDF429430- `strategy="fast"`:单 provider 快速返回431- `strategy="balanced"`:主 provider + 次 provider 补充432- `strategy="verify"`:Tavily + Firecrawl 交叉验证网页结果433- `strategy="deep"`:更偏 research 的双 provider 路径434435默认自动行为:436437- `comparison` / `exploratory` 会自动倾向 `verify`438- `resource` / `tutorial` / `include_content=true` 会自动倾向 `balanced`439- `research` 会自动倾向 `deep`440441## 自动路由规则442443- 普通网页检索:默认 Tavily444- 新闻 / 最新动态:默认 Tavily news445- 文档 / GitHub / PDF / changelog / pricing:默认 Firecrawl446- X / Twitter / 社交舆情:默认 xAI X search447- 同时要网页和社交:结果可能是 `hybrid`,但调用时不要传 `mode="hybrid"`;应使用 `sources=["web","x"]` 或拆成 `social + news`448449## X provider 模式450451- `official`:适合官方 xAI,或真正支持 `x_search` / `web_search` 的兼容后端452- `compatible`:适合 `grok2api` 这类只提供 `/responses` 的兼容网关453- `compatible` 模式下,真正的 X 结果要来自 `mysearch.social_gateway` 这类 social search gateway454- 如果 social gateway 前面还有一层 proxy,可以优先用“grok2api admin 自动继承”模式,避免重复维护 `SOCIAL_GATEWAY_UPSTREAM_API_KEY` / `SOCIAL_GATEWAY_TOKEN`455- `MYSEARCH_XAI_SOCIAL_BASE_URL` 用来单独指定 social gateway 根地址;`MySearch` 默认会自动追加 `/social/search`456457## 什么时候强制指定 provider458459- 你明确知道要对正文友好的结果:`provider="firecrawl"`460- 你明确要 X 搜索:`provider="xai"` 或 `mode="social"`461- 你只想走 Tavily:`provider="tavily"`462463## 使用准则464465- 默认 `max_results` 控制在 5 以内466- 普通问答不要默认 `include_content=true`467- 输出时保留 URL,并区分事实与推断468- 需要更稳妥的网页结论时,优先用 `strategy="verify"`469- 输出里如果有 `evidence`,要把它当成“证据密度提示”一起解读470- 需要同时看网页和 X 时,传 `sources=["web","x"]`471- X 搜索依赖单独的 xAI key;没配时应该显式说明 social 部分不可用472- 用户如果只配置了 `Tavily + Firecrawl`,应视为“Web 版 MySearch 可用”,不是“安装失败”473- 单个页面阅读优先 `extract_url`474- 多来源整理优先 `research`475- 用户只贴 skill 地址时,先安装 skill,再检查 MCP 是否已注册476- 调试优先跑 `skill/scripts/check_mysearch.py`,不要先手写一长串 Python one-liner477- MySearch 健康可用时,不要再额外混用 generic web search 作为主流程478- 问“今天 / 最新 / 刚刚 / 本周”这类时效性问题时,优先 `intent="status"`;需要媒体报道时加 `mode="news"`,需要 X 热议时加 `mode="social"`479- 结论如果同时包含网页和 X,必须明确区分两者,不要混成一个模糊结论480481## 证据标准482483- 涉及时效性、版本、发布信息时,优先相信搜索结果,不靠旧记忆484- 关键结论尽量给至少两个独立来源485- 单一来源结论要显式说明限制486- 来源冲突时,要把冲突本身讲清楚,而不是强行给一个确定答案487488## 常见模式489490### 普通网页搜索491492- `search(query="best search MCP server", mode="web")`493494### 对比 + 交叉验证495496- `search(query="Tavily vs Firecrawl for docs search", intent="comparison", strategy="verify")`497498### 最新新闻499500- `search(query="OpenAI latest announcements", mode="news")`501502### X 舆情503504- `search(query="what are people saying about MCP", mode="social")`505506### 网页 + X 聚合507508- `search(query="latest MCP search server feedback", sources=["web", "x"])`509510### 文档 / GitHub / changelog511512- `search(query="Firecrawl pricing changes", mode="docs", include_content=true)`513514### 抓正文515516- `extract_url(url="https://example.com/post")`517518### 小型研究519520- `research(query="best search MCP server 2026", intent="exploratory", include_social=true)`521522## 需要强制指定 provider 的场景523524- 网页搜索结果太泛,需要文档站 / GitHub / changelog:`provider="firecrawl"`525- 你明确只想看 X 上的讨论:`provider="xai"` 或 `mode="social"`526- 你只需要 Tavily 的快速网页发现和 answer:`provider="tavily"`