{"_id":"@anfeng087/search-web-mcp","_rev":"2-09f5eddb792e24587946ce1cdb9695cc","name":"@anfeng087/search-web-mcp","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@anfeng087/search-web-mcp","version":"0.1.0","keywords":["mcp","search","web","brave","exa","tavily","firecrawl"],"author":{"name":"anfeng087"},"license":"MIT","_id":"@anfeng087/search-web-mcp@0.1.0","maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"bin":{"search-web-mcp":"dist/cli.js"},"dist":{"shasum":"b3edf03a07e960ac61b8d43b004a4eb0280f32a2","tarball":"https://registry.npmjs.org/@anfeng087/search-web-mcp/-/search-web-mcp-0.1.0.tgz","fileCount":40,"integrity":"sha512-O2W1RRQMloV/hdKLcdaZFa1S1K1TdXk4k1QRa6w5+ZebbAcIMfro/cBVEFm4q0ZWUySk9hZwNfUISG1MTuNlmA==","signatures":[{"sig":"MEUCIC3mLQXOArA3Cmoded90oJ8Cf5IViZq91tGAUK7ZruLeAiEA/OLKgoJJF1gJlqanT0Oba7RGUGOEkl7jFtR9Qh6Q72Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103336},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"07305232564d3156ccfd9ac20dfcced04d0eeda5","scripts":{"test":"node --test --import tsx tests/*.test.ts","build":"tsc -p tsconfig.json","start":"node dist/cli.js","prepack":"npm run build"},"_npmUser":{"name":"anfeng087","email":"anfeng87l@gmail.com"},"_npmVersion":"11.9.0","description":"Unified web search MCP server for AI agents with provider fallback and key rotation.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"dotenv":"^17.2.3","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","typescript":"^5.9.3","@types/node":"^24.10.2"},"_npmOperationalInternal":{"tmp":"tmp/search-web-mcp_0.1.0_1781674398953_0.2521261046805414","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@anfeng087/search-web-mcp","version":"0.1.1","description":"Unified web search MCP server for AI agents with provider fallback and key rotation.","type":"module","main":"dist/index.js","bin":{"search-web-mcp":"dist/cli.js"},"scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","test":"node --test --import tsx tests/*.test.ts","start":"node dist/cli.js"},"keywords":["mcp","search","web","brave","exa","tavily","firecrawl"],"author":{"name":"anfeng087"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","dotenv":"^17.2.3"},"devDependencies":{"@types/node":"^24.10.2","tsx":"^4.20.6","typescript":"^5.9.3"},"engines":{"node":">=20"},"gitHead":"07305232564d3156ccfd9ac20dfcced04d0eeda5","types":"./dist/index.d.ts","_id":"@anfeng087/search-web-mcp@0.1.1","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-f/XMyBuyBUyIJn+nWXjgJngkYZ7CzkiOPztySlf70HeezHDOtBEZ7j8FcuIcRCTsyYIj6w12ffHtJOrcSgsUxA==","shasum":"8d51cb43e9a718b06af67bee67f1b7d0716ded06","tarball":"https://registry.npmjs.org/@anfeng087/search-web-mcp/-/search-web-mcp-0.1.1.tgz","fileCount":40,"unpackedSize":104339,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFnpBY/LTlBPn22ho73B4upDKI3RWGFAWkPw+DphCBVtAiEAvW3jRHIhDw0WnPRTRe70bg6+knCCxMbPv+suM4a4XZY="}]},"_npmUser":{"name":"anfeng087","email":"anfeng87l@gmail.com"},"directories":{},"maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/search-web-mcp_0.1.1_1781675827410_0.7945679733726754"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-17T05:33:18.739Z","modified":"2026-06-17T05:57:07.641Z","0.1.0":"2026-06-17T05:33:19.124Z","0.1.1":"2026-06-17T05:57:07.551Z"},"author":{"name":"anfeng087"},"license":"MIT","keywords":["mcp","search","web","brave","exa","tavily","firecrawl"],"description":"Unified web search MCP server for AI agents with provider fallback and key rotation.","maintainers":[{"name":"anfeng087","email":"anfeng87l@gmail.com"}],"readme":"# @anfeng087/search-web-mcp\n\n一个面向 agent 的统一 Web 搜索 MCP。默认输出结构化候选和证据片段，不返回给人看的长说明。\n\n## Tools\n\n| Tool | Purpose |\n|---|---|\n| `web_search` | 返回候选 URL、标题、域名、短摘要、来源和分数 |\n| `web_fetch` | 抓取单个 URL，返回与 query 相关的证据片段 |\n| `web_status` | 查看 provider/key 状态，不输出真实 key |\n\n## Run\n\n```bash\nnpx -y @anfeng087/search-web-mcp --env-file /path/to/.env\n```\n\n无 `.env` 或无 API key 时仍可启动：搜索走 DuckDuckGo/SearXNG，抓取走本地 HTML 抽取。\n\n## Claude Code\n\n```bash\nclaude mcp add search-web -- npx -y @anfeng087/search-web-mcp --env-file /Users/anfeng/AI/mcp/active/search-web/.env\n```\n\n建议在 Claude Code 本地权限里禁用原生 `WebSearch` / `WebFetch`，让搜索统一经过本 MCP。\n\n## Config\n\n复制 `.env.example` 为 `.env` 后按需填 key。每家 provider 可填多个 key，逗号分隔。\n\n```dotenv\nBRAVE_SEARCH_API_KEYS=brv_key_1,brv_key_2\nEXA_API_KEYS=exa_key_1,exa_key_2\nTAVILY_API_KEYS=tvly_key_1,tvly_key_2\nFIRECRAWL_API_KEYS=fc_key_1,fc_key_2\n\nSEARCH_PROVIDERS=brave,exa,tavily,searxng,duckduckgo\nFETCH_PROVIDERS=local,firecrawl,exa,tavily\n\nEXA_MODE=auto\nEXA_TRIAL_ENABLED=false\nEXA_TRIAL_MCP_URL=https://mcp.exa.ai/mcp?tools=web_search_exa,web_fetch_exa,web_search_advanced_exa\n\nSEARCH_SEARXNG_URL=\nSEARCH_TIMEOUT_SECONDS=12\nSEARCH_CACHE_TTL_SECONDS=1800\n```\n\n`EXA_MODE`:\n\n- `auto`: 有 `EXA_API_KEYS` 用 REST API；无 key 且 `EXA_TRIAL_ENABLED=true` 用 Exa remote MCP；否则跳过 Exa。\n- `api`: 只用 Exa REST API。\n- `trial`: 只用 Exa remote MCP。\n- `off`: 禁用 Exa。\n\n## Provider Behavior\n\n- 每个 provider 独立维护 key 池，多个 key 按 round-robin 使用。\n- 普通 `429` 按 `Retry-After` 冷却当前 key；没有 `Retry-After` 且不是额度耗尽文案时短冷却后再试。\n- `401` / `403`、`402`、以及明确写着 quota/monthly/credits exhausted 的 `429` 会禁用当前 key 到下个自然月月初，并立即尝试同 provider 的下一个 key；进入下个月后自动恢复参与轮询。\n- `web_status` 只展示 `keyCount`、`cooldownCount`、`disabledCount` 和错误类型，不打印真实 key。\n\n## Development\n\n```bash\nnpm install\nnpm run build\nnpm test\nnode dist/cli.js --status --env-file .env.example\nnpm pack --dry-run\n```\n\n发布 scoped public 包：\n\n```bash\nnpm publish --access public\n```\n","readmeFilename":"README.md"}