{"_id":"@pymodel/dsh-tavily","_rev":"6-aae2d761b040622fd4523b82cd2cbd7e","name":"@pymodel/dsh-tavily","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@pymodel/dsh-tavily","version":"0.1.0","keywords":["dsh-plugin","deepseek-harness","web-search","tavily","mcp"],"author":{"url":"https://github.com/elkaix","name":"elkaix"},"license":"MIT","_id":"@pymodel/dsh-tavily@0.1.0","maintainers":[{"name":"elkaix","email":"moelkholy1995@gmail.com"}],"homepage":"https://github.com/pymodel/dsh-research-plugins/tree/main/packages/dsh-tavily#readme","bugs":{"url":"https://github.com/pymodel/dsh-research-plugins/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"dist":{"shasum":"f9f41767cfa9a862184d657c6cd52c5d9610ee65","tarball":"https://registry.npmjs.org/@pymodel/dsh-tavily/-/dsh-tavily-0.1.0.tgz","fileCount":5,"integrity":"sha512-ZUSdcn2xLwZBxMb5lbJ17nbQEnLNjm3I9jRyl4nPov+0ess/588b69yB2mP3QJnq8xipkeeygCrVq0pNn8Q0PQ==","signatures":[{"sig":"MEYCIQCMQRINjsgNpUIdmj0DYXfOnZrwPIhXRbzZEHrlaia3ggIhAIj9qACYiCoxiOCX+I3L3aQGfiWizbU/UAMUd2XtmYov","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41029},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"a6f7290fccaaae4f865b051d4c65ccb6d304e69e","_npmUser":{"name":"elkaix","email":"moelkholy1995@gmail.com"},"repository":{"url":"git+https://github.com/pymodel/dsh-research-plugins.git","type":"git","directory":"packages/dsh-tavily"},"_npmVersion":"11.19.0","description":"Tavily web search + Tavily MCP for DSH: settings toggle to official DeepSeek, keyless search, MCP extract/crawl/map","directories":{},"_nodeVersion":"26.7.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-web":"^0.1.0-rc.6","@deepseek-ai/dsh-credentials":"^0.1.0-rc.6","@deepseek-ai/dsh-launch-environment":"^0.1.0-rc.6","@deepseek-ai/dsh-web-search-deepseek":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-tavily_0.1.0_1787099311080_0.428305811591861","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@pymodel/dsh-tavily","version":"0.1.1","keywords":["dsh-plugin","deepseek-harness","web-search","tavily","mcp"],"author":{"url":"https://github.com/elkaix","name":"elkaix"},"license":"MIT","_id":"@pymodel/dsh-tavily@0.1.1","maintainers":[{"name":"elkaix","email":"moelkholy1995@gmail.com"}],"homepage":"https://github.com/pymodel/dsh-research-plugins/tree/main/packages/dsh-tavily#readme","bugs":{"url":"https://github.com/pymodel/dsh-research-plugins/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"dist":{"shasum":"0be93cd0a9e98f1fae778f1b5865c361a4e447b9","tarball":"https://registry.npmjs.org/@pymodel/dsh-tavily/-/dsh-tavily-0.1.1.tgz","fileCount":5,"integrity":"sha512-3r6fBvm+rNwO2+eGunGV1tkzLwhShvjPDcAuqUGC/sCC+dPb6K+g5+LPTN5qNC/D2LEsJ5utBNHi52Tq5XJI+w==","signatures":[{"sig":"MEYCIQDrodUSM0cToOt2OJd4mkrZvknpKO1veAaLrVRtLgT7FgIhAL1bptq1aa6bzccSG9+RGIlUNop1WtGbYZJ4K1qOaC7d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41049},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"24184976184c5abf79c73ac77bd474152d609236","_npmUser":{"name":"elkaix","email":"moelkholy1995@gmail.com"},"repository":{"url":"git+https://github.com/pymodel/dsh-research-plugins.git","type":"git","directory":"packages/dsh-tavily"},"_npmVersion":"11.19.0","description":"Tavily web search + Tavily MCP for DSH: settings toggle to official DeepSeek, keyless search, MCP extract/crawl/map","directories":{},"_nodeVersion":"26.7.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-web":"^0.1.0-rc.6","@deepseek-ai/dsh-credentials":"^0.1.0-rc.6","@deepseek-ai/dsh-launch-environment":"^0.1.0-rc.6","@deepseek-ai/dsh-web-search-deepseek":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-tavily_0.1.1_1787100265360_0.8216238630491746","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@pymodel/dsh-tavily","version":"0.2.0","keywords":["dsh-plugin","deepseek-harness","web-search","tavily","mcp"],"author":{"url":"https://github.com/elkaix","name":"elkaix"},"license":"MIT","_id":"@pymodel/dsh-tavily@0.2.0","maintainers":[{"name":"elkaix","email":"moelkholy1995@gmail.com"}],"homepage":"https://github.com/pymodel/dsh-research-plugins/tree/main/packages/dsh-tavily#readme","bugs":{"url":"https://github.com/pymodel/dsh-research-plugins/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"dist":{"shasum":"d2f2b606052943823889ebb6cc729bfccc23119b","tarball":"https://registry.npmjs.org/@pymodel/dsh-tavily/-/dsh-tavily-0.2.0.tgz","fileCount":5,"integrity":"sha512-9DjWwXIpGd/OkJdwLY636IALaSxQ31vT4ZEYkqLyVXTJ4+BKdaZnxl+AGL+gGgyrGcitqG2cDw8S5lL2nzcHgg==","signatures":[{"sig":"MEUCIHweqFL3djc1T6HbqZDQYhthkkPevB8kxzJRdTX9fY1KAiEA6D2UEbVqsatfuBaOv0bDb0Scm/rBfSOTj3yCPXSRMSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42131},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"34872607e1134dbece3bdb9e4bca92fef1fdf2c6","_npmUser":{"name":"elkaix","email":"moelkholy1995@gmail.com"},"repository":{"url":"git+https://github.com/pymodel/dsh-research-plugins.git","type":"git","directory":"packages/dsh-tavily"},"_npmVersion":"11.17.0","description":"Tavily web search + Tavily MCP for DSH: settings toggle to official DeepSeek, keyless search, MCP extract/crawl/map","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-web":"^0.1.0-rc.6","@deepseek-ai/dsh-credentials":"^0.1.0-rc.6","@deepseek-ai/dsh-launch-environment":"^0.1.0-rc.6","@deepseek-ai/dsh-web-search-deepseek":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-tavily_0.2.0_1787389188965_0.5565530355212458","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@pymodel/dsh-tavily","version":"0.3.0","keywords":["dsh-plugin","deepseek-harness","web-search","tavily","mcp"],"author":{"url":"https://github.com/elkaix","name":"elkaix"},"license":"MIT","_id":"@pymodel/dsh-tavily@0.3.0","maintainers":[{"name":"elkaix","email":"moelkholy1995@gmail.com"}],"homepage":"https://github.com/pymodel/dsh-research-plugins/tree/main/packages/dsh-tavily#readme","bugs":{"url":"https://github.com/pymodel/dsh-research-plugins/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"dist":{"shasum":"c1aa1548add558cafe7c942cce1989f57bc68971","tarball":"https://registry.npmjs.org/@pymodel/dsh-tavily/-/dsh-tavily-0.3.0.tgz","fileCount":6,"integrity":"sha512-JTiQRgdeEA7HKVGuAXFBI8iMiK4nz27kpv0NNCTL2EksX01TY2s9UEuNkN2Ew9w16icHbwdsQTPbCR9AqUca9A==","signatures":[{"sig":"MEUCIQCnjEWCT5noh59GUY2KFiHyuVM2CJVU0st/ATJC+5kGLAIgLrlbdfvQUlf3VWYYoenjgEyTWlwiR9M3SblNCPnpT+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49779},"main":"lib/index.js","type":"module","_from":"file:pymodel-dsh-tavily-0.3.0.tgz","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"_npmUser":{"name":"elkaix","email":"moelkholy1995@gmail.com"},"_resolved":"/tmp/b872b1d866fa5353b0cd2feec5d9d8af/pymodel-dsh-tavily-0.3.0.tgz","_integrity":"sha512-JTiQRgdeEA7HKVGuAXFBI8iMiK4nz27kpv0NNCTL2EksX01TY2s9UEuNkN2Ew9w16icHbwdsQTPbCR9AqUca9A==","repository":{"url":"git+https://github.com/pymodel/dsh-research-plugins.git","type":"git","directory":"packages/dsh-tavily"},"_npmVersion":"11.17.0","description":"Tavily web search + Tavily MCP for DSH: settings toggle to official DeepSeek, keyless search, MCP extract/crawl/map","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-web":"^0.1.0-rc.6","@deepseek-ai/dsh-credentials":"^0.1.0-rc.6","@deepseek-ai/dsh-launch-environment":"^0.1.0-rc.6","@deepseek-ai/dsh-web-search-deepseek":"^0.1.0-rc.6"},"_npmOperationalInternal":{"tmp":"tmp/dsh-tavily_0.3.0_1787444168804_0.9683754835731331","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@pymodel/dsh-tavily","version":"0.3.1","keywords":["dsh-plugin","deepseek-harness","web-search","tavily","mcp"],"author":{"url":"https://github.com/elkaix","name":"elkaix"},"license":"MIT","_id":"@pymodel/dsh-tavily@0.3.1","maintainers":[{"name":"elkaix","email":"moelkholy1995@gmail.com"}],"homepage":"https://github.com/pymodel/dsh-research-plugins/tree/main/packages/dsh-tavily#readme","bugs":{"url":"https://github.com/pymodel/dsh-research-plugins/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-store","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"dist":{"shasum":"b012ca3ed5cccbc685af099f4c318cc3cda6744b","tarball":"https://registry.npmjs.org/@pymodel/dsh-tavily/-/dsh-tavily-0.3.1.tgz","fileCount":6,"integrity":"sha512-fzjBsPpd0wmOaXhfKGmrstyHawWmEElPlDBW53ZXmpPSyOuma9wa/24WHfwWRIqsfkC/L81cPxDxYJIrJ2fkMQ==","signatures":[{"sig":"MEQCIG16LZ9/7jhh+RJJ5xdjqHmFc8/UtdvJ4Su1vxVvDMTDAiAXbNGomBe5aX/KROpmlg8xxZnPe1EJCuxDyT0bvsO9GA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF27JTDHSRBkssi6NMd8ZxpcAoPZSHSMHn92nssSYJZ4AiAWAhCu6DU7b9KsUOp1J5nacmicDnDjeI9WBf70+Uh3tA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51980},"main":"lib/index.js","type":"module","_from":"file:pymodel-dsh-tavily-0.3.1.tgz","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"_npmUser":{"name":"elkaix","email":"moelkholy1995@gmail.com"},"_resolved":"/tmp/1fae0a60ff427b9212aef5b9c9495c12/pymodel-dsh-tavily-0.3.1.tgz","_integrity":"sha512-fzjBsPpd0wmOaXhfKGmrstyHawWmEElPlDBW53ZXmpPSyOuma9wa/24WHfwWRIqsfkC/L81cPxDxYJIrJ2fkMQ==","repository":{"url":"git+https://github.com/pymodel/dsh-research-plugins.git","type":"git","directory":"packages/dsh-tavily"},"_npmVersion":"11.19.0","description":"Tavily web search + Tavily MCP for DSH: settings toggle to official DeepSeek, keyless search, MCP extract/crawl/map","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-web":">=0.1.5-rc.2 <0.3.0-0","@deepseek-ai/dsh-credentials":">=0.1.5-rc.2 <0.3.0-0","@deepseek-ai/dsh-launch-environment":">=0.1.5-rc.2 <0.3.0-0","@deepseek-ai/dsh-web-search-deepseek":">=0.1.5-rc.2 <0.3.0-0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-tavily_0.3.1_1790642945392_0.645142643796595","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"_id":"@pymodel/dsh-tavily@0.4.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-store","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"},"manifestVersion":1},"bugs":{"url":"https://github.com/PyModel/dsh-research-plugins/issues"},"dist":{"shasum":"c95e4b2f64cfc169dfa5c8a1bb1b5bc79104701c","tarball":"https://registry.npmjs.org/@pymodel/dsh-tavily/-/dsh-tavily-0.4.0.tgz","fileCount":9,"integrity":"sha512-u0f7NrOMeiu2mpr1w/oYXTd3gjTt91oNsWK13/y5V2qY6bcfk08Sj4xYbDs3bj9YyFpYoSi9Vt3GkoGWCsqo/Q==","signatures":[{"sig":"MEUCIQCWYbVeKRtLL7bGi4AdNQ0s8M7kHuApHKmAT6k2JIC6cQIgcJQ6VixZAF8nT1CRXn48LDZz9HfyOLwAQ6P8xPeGMGg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICdITZXl6fGr+UG7YcCLeLVGw24oZOpCIwhCROOUm1ZcAiEA/T3Z8MZf4B4yNnh60eBOiro596M5X7K3RjwGDnPUKGk="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@pymodel%2fdsh-tavily@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":58188},"icon":"./icon.svg","main":"lib/index.js","name":"@pymodel/dsh-tavily","type":"module","_from":"file:pymodel-dsh-tavily-0.4.0.tgz","author":{"url":"https://github.com/elkaix","name":"elkaix"},"engines":{"dsh":">=0.1.5-rc.2 <0.3.0-0"},"exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json","./locale/*.json":"./locale/*.json","./cordis.patch.yml":"./cordis.patch.yml"},"license":"MIT","version":"0.4.0","_npmUser":{"name":"elkaix","email":"moelkholy1995@gmail.com"},"homepage":"https://github.com/PyModel/dsh-research-plugins/tree/main/packages/dsh-tavily#readme","keywords":["dsh-plugin","deepseek-harness","web-search","tavily","mcp"],"_resolved":"/tmp/746fee439e1cb11d0c72d1c505627f5c/pymodel-dsh-tavily-0.4.0.tgz","_integrity":"sha512-u0f7NrOMeiu2mpr1w/oYXTd3gjTt91oNsWK13/y5V2qY6bcfk08Sj4xYbDs3bj9YyFpYoSi9Vt3GkoGWCsqo/Q==","repository":{"url":"git+https://github.com/PyModel/dsh-research-plugins.git","type":"git","directory":"packages/dsh-tavily"},"_npmVersion":"11.19.0","description":"Tavily web search for DSH (keyless or keyed, official DeepSeek when off) plus the Tavily MCP: search, extract, crawl, map, research","directories":{},"maintainers":[{"name":"elkaix","email":"moelkholy1995@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@deepseek-ai/cordis":"4.0.4","@deepseek-ai/dsh-web":"0.2.0-rc.2","@deepseek-ai/dsh-credentials":"0.2.0-rc.2","@deepseek-ai/dsh-launch-environment":"0.2.0-rc.2"},"peerDependencies":{"@deepseek-ai/cordis":">=4.0.1 <5.0.0-0","@deepseek-ai/dsh-web":">=0.1.5-rc.2 <0.3.0-0","@deepseek-ai/dsh-credentials":">=0.1.5-rc.2 <0.3.0-0","@deepseek-ai/dsh-launch-environment":">=0.1.5-rc.2 <0.3.0-0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-tavily_0.4.0_1792108008433_0.14450521561774088"}}},"time":{"created":"2026-08-19T00:28:30.953Z","modified":"2026-10-15T23:46:48.941Z","0.1.0":"2026-08-19T00:28:31.219Z","0.1.1":"2026-08-19T00:44:25.522Z","0.2.0":"2026-08-22T08:59:49.102Z","0.3.0":"2026-08-23T00:16:08.944Z","0.3.1":"2026-09-29T00:49:05.485Z","0.4.0":"2026-10-15T23:46:48.506Z"},"bugs":{"url":"https://github.com/PyModel/dsh-research-plugins/issues"},"author":{"url":"https://github.com/elkaix","name":"elkaix"},"license":"MIT","homepage":"https://github.com/PyModel/dsh-research-plugins/tree/main/packages/dsh-tavily#readme","keywords":["dsh-plugin","deepseek-harness","web-search","tavily","mcp"],"repository":{"url":"git+https://github.com/PyModel/dsh-research-plugins.git","type":"git","directory":"packages/dsh-tavily"},"description":"Tavily web search for DSH (keyless or keyed, official DeepSeek when off) plus the Tavily MCP: search, extract, crawl, map, research","maintainers":[{"name":"elkaix","email":"moelkholy1995@gmail.com"}],"readme":"# @pymodel/dsh-tavily\n\n[![awesome · DSH plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com) [![Recommend dshfind](https://img.shields.io/badge/Recommend-dshfind-ffd700?labelColor=555555)](https://dshfind.com/plugins/pymodel/dsh-tavily?ref=badge)\n\nTavily for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness): adds the Tavily Search API as a web search provider, plus a Tavily MCP bridge — keyless `search` / `extract`; `crawl` / `map` / `research` with an API key. Works on DSH 0.1.5 (DSH Desktop) through 0.2.x, in the web profile and in headless / acp / sdk profiles.\n\n## Install\n\nnpm (stable, official recommendation):\n\n```sh\ndsh plugin --profile web add @pymodel/dsh-tavily\ndsh web\n```\n\nOr follow GitHub (latest commit on the repo):\n\n```sh\ndsh plugin --profile web add github:pymodel/dsh-research-plugins#path:packages/dsh-tavily\n```\n\nSettings → Plugins → **Tavily web search** (DSH 0.1.5 / DSH Desktop), or Plugins → **@pymodel/dsh-tavily** (DSH 0.1.7+): turn the toggle on. The key is optional; leave it blank for keyless search. **Test connection** at the bottom-left checks that search works now (including keyless).\n\nPin a commit:\n\n```sh\ndsh plugin --profile web add github:pymodel/dsh-research-plugins#path:packages/dsh-tavily#<commit>\n```\n\nRemove:\n\n```sh\ndsh plugin --profile web remove dsh-tavily\n```\n\n> `dsh.bundle` · prebuilt `lib/` · git install does not need `allowBuilds`\n\n## Features\n\n- Settings toggle: off = official DeepSeek, on = Tavily — no uninstall to switch back\n- No key uses Tavily keyless; a key uses `Authorization: Bearer`\n- Bottom-left connection test: one real Tavily search (`max_results: 1`); keyless if no key, account quota if a key is saved (1 credit). Served on DSH's authenticated `/api` channel, so other websites cannot call it\n- Clear failure reasons: invalid key, rate or plan limit (HTTP 429 / 432 / 433), timeout, network, plus Tavily's own error text\n- Timeout, abort, https-only endpoint (plain http allowed to a localhost gateway), drops results without a url; publication dates normalized to ISO 8601\n- Settings card design refresh: collapsed-header mode badge (Official DeepSeek / Tavily keyless / Tavily API key) with a status dot, so the active provider is visible at a glance\n- Accessible async feedback: polite live-region announcements for connection-test and save outcomes, inline button spinners, connected-success tint — all honoring `prefers-reduced-motion`\n- Show/hide reveal for the API key input (with autocomplete and spellcheck off)\n- Opt-in Tavily Search parameters via plugin config (see [Configuration](#configuration))\n- Key and toggle live on the credentials plane, not the settings file\n- Tavily MCP bridge: `mcp__tavily__tavily_search` / `tavily_extract` work keyless; `tavily_crawl` / `tavily_map` / `tavily_research` unlock with `TAVILY_API_KEY`\n\n## Behavior\n\n### Web search\n\n| Toggle        | Key   | `web_search`         |\n| ------------- | ----- | -------------------- |\n| Off (default) | —     | official DeepSeek (the host's own provider, with your DeepSeek settings and account sign-in) |\n| On            | empty | Tavily keyless       |\n| On            | set   | Tavily account quota |\n\nProvider id: `tavily`.\n\n### MCP tools\n\nThe bundled MCP row registers Tavily's hosted MCP server under the `tavily` namespace and works out of the box:\n\n- Keyless (default): the required `X-Tavily-Access-Mode: keyless` header selects free rate-limited access to `tavily_search` and `tavily_extract`.\n- Keyed: set `TAVILY_API_KEY` to unlock `tavily_crawl` / `tavily_map` / `tavily_research` and use your account quota. Tool calls may run up to 10 minutes so research reports finish:\n\n```sh\nexport TAVILY_API_KEY=tvly-...\n```\n\nor in a project `.env` / `$DSH_HOME/.env`:\n\n```\nTAVILY_API_KEY=tvly-...\n```\n\nThe key goes into the `Authorization: Bearer` header at load time — never into the endpoint URL and never into YAML. A key added to `.env` needs a `dsh web` restart.\n\nIf your profile's `cordis.patch.yml` already inserts its own Tavily MCP row (id `mcp-tavily` or `serverName` `tavily`), DSH will not boot with both: delete that row, or turn it into an override of `mcp-tavily` (see [Already have your own MCP row?](https://github.com/PyModel/dsh-research-plugins#already-have-your-own-mcp-row)).\n\n## Credentials\n\n| Ref                     | Meaning                                             |\n| ----------------------- | --------------------------------------------------- |\n| `TAVILY_API_KEY`        | Optional (search). Present = account quota; absent = keyless |\n| `TAVILY_SEARCH_ENABLED` | `true` = on (the card writes `true`; `1` / `yes` / `on` also count); unset or any other value = off |\n\nThe search key and toggle are stored on the credentials plane (`$DSH_HOME/.credentials.yaml`). Whether an environment variable of the same name overrides the stored value depends on the DSH version (0.2.0: the environment wins and the card shows the field read-only; 0.2.1+: the stored value wins). The MCP bridge reads `TAVILY_API_KEY` from the launch environment only, because MCP rows resolve before credentials are materialized, so a key saved in the card does not reach the MCP tools. Do not commit real keys.\n\n## Configuration\n\nOptional plugin config (`cordis.patch.yml` row `web-search-tavily`):\n\n| Field | Default | Meaning |\n| --- | --- | --- |\n| `searchDepth` | `basic` | `basic`, `fast`, `ultra-fast` (1 credit) or `advanced` (2 credits). Unknown values fall back to `basic` |\n| `autoParameters` | `false` | Let Tavily tune topic and time range per query; the depth above still applies |\n| `searchTimeoutMs` | `30000` | Per-search deadline |\n| `baseURL` | `https://api.tavily.com` | Must be https; plain http only to `localhost` / `127.0.0.1` (a local gateway) |\n\nThe number of results follows the `web_search` tool's own `maxResults` (capped at Tavily's 20).\n\n## Updates\n\n- **0.4.0**\n  - **Security:** the Test connection endpoint moved to DSH's authenticated `/api` channel, so other websites can no longer spend your Tavily credits through it.\n  - **Fallback:** turning Tavily off now uses the host's registered official DeepSeek provider, so DeepSeek account sign-in, your DeepSeek search settings and session logging work as in stock DSH.\n  - **Profiles:** the provider now loads in headless / acp / sdk profiles; only `web` is required.\n  - **Errors:** Tavily's error messages (`{ detail: { error } }`) are shown, and rate and plan limits are reported as such.\n  - **Search:** publication dates are requested and normalized to ISO 8601, `ultra-fast` depth is supported, and result counts are capped at 20.\n  - **Settings card:** a background refresh no longer discards an unsaved key; load failures are shown; the switch and key field have accessible labels; zh / en titles and an icon are included for the Plugins page and markets.\n  - **Removed config:** `apiKey`, `apiKeyEnv`, `allowCustomBaseURL` and `maxResults` are gone. The key is always the `TAVILY_API_KEY` credential.\n  - **MCP:** the tool timeout is raised to 10 minutes for `tavily_research`.\n  - **Packaging:** `engines.dsh` is declared, the tarball ships a LICENSE, and releases are published with npm provenance.\n- **0.3.1** Works on DSH 0.1.5 (DSH Desktop) and 0.1.7: the search provider no longer fails to start on 0.1.7 (`settings.register` is gone there); the settings card loads its store from `@deepseek-ai/dsh-client-store` (the removed `dsh-client-runtime` left it blank and raised a DSH Desktop Safe Mode warning), writes through `remote.credentials` so Save works, refreshes on `credentials/reference-updated`, and also renders on 0.1.7's plugin page; peer ranges set to `>=0.1.5-rc.2 <0.3.0-0` so DSH 0.2's installer accepts it (tested on 0.1.5-rc.2, 0.1.7-rc.2 and 0.2.0-rc.1); the probe route is released on plugin reload; the `web` override keeps dsh-base's `fetchProvider: http`; README documents the duplicate `mcp-tavily` row conflict.\n- **0.3.0** Settings-card design refresh informed by current UI/a11y guidance (ARIA live regions for async status, `prefers-reduced-motion` support): header mode badge with status dot, spinner states on Test/Save, saved confirmation announcement, show/hide key toggle. Server provider adopts the latest Tavily Search API surface behind opt-in config: `searchDepth` including the new `fast` tier, and `auto_parameters`.\n- **0.2.0** MCP bridge: keyless mode via `X-Tavily-Access-Mode: keyless` (row always on); keyed auth moved from URL query parameter to `Authorization: Bearer` header. Search provider: caller cancellation preserved on runtimes without `AbortSignal.any`.\n- **0.1.0** First release as `@pymodel/dsh-tavily`. Web search provider with settings toggle (off = official DeepSeek, on = Tavily) plus a Tavily MCP bridge (extract / crawl / map). English-only localisation.\n\n---\n\n## Author\n\n**[elkaix](https://github.com/elkaix)** · [pymodel](https://github.com/pymodel)\n","readmeFilename":"README.md"}