{"_id":"@zhafron/mcp-web-search","_rev":"9-cacb68338dc1bc9704714af2e6c28318","name":"@zhafron/mcp-web-search","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@zhafron/mcp-web-search","version":"1.0.0","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.0.0","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"dist":{"shasum":"41ce558d31b706b90f7fa1d4a4ab53872c64fc86","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.0.0.tgz","fileCount":12,"integrity":"sha512-0mxerNse5bv5rHlwWJhuI2MG1fO7SG0v8XWJPr29GSLLW+2O3LBVSY9b4RKZYvpCk7McQSWbkWW4gS52eg/91A==","signatures":[{"sig":"MEYCIQDjky6L5FJ/ucMpRxDYHUR3U2PRRXr0ftL4lO03FmG1hQIhALCZsqsWZ8KxkAb5WNlie2ZK4vfCCjlbldAKuIf5yJtP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44450},"main":"dist/src/server.js","type":"module","gitHead":"f169c7aa39c5db600f828385c8fda7deda00dca4","scripts":{"dev":"tsx src/server.ts","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:watch":"node --experimental-vm-modules node_modules/jest/bin/jest.js --watch","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"10.9.4","description":"MCP server: DuckDuckGo HTML search, Wikipedia summaries, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","jest":"^29.7.0","ts-jest":"^29.2.5","prettier":"^3.8.0","typescript":"^5.5.4","@types/jest":"^29.5.14","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@jest/globals":"^29.7.0","@types/turndown":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.0.0_1768710095035_0.38608785709462623","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@zhafron/mcp-web-search","version":"1.1.0","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.1.0","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"bin":{"mcp-web-search":"bin.mjs"},"dist":{"shasum":"bf4d7b742a81eebc3bfa222d1a8b3663ba18405e","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.1.0.tgz","fileCount":13,"integrity":"sha512-aHdkcb2mkK+KZeAKHcvA8uMXvdP2Ij6KD7Ij7X5Ngy/7s92sjbvROxbhSwPjIM/CP0w2M59WHl+EdtmbjAAIVg==","signatures":[{"sig":"MEUCIHxQ5DB6DPkmH3UodoyNh6wNUXnhrPvYpI+rTFRI7ny+AiEA4e1gl3+h8INKeZdMSVX5yWkGZMnrY4CYfuSY3USVhMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44431},"main":"dist/src/server.js","type":"module","gitHead":"118fc5c7b6104a363d2ee5b8866f3d8927468467","scripts":{"dev":"tsx src/server.ts","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:watch":"node --experimental-vm-modules node_modules/jest/bin/jest.js --watch","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server: DuckDuckGo HTML search, Wikipedia summaries, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","jest":"^29.7.0","ts-jest":"^29.2.5","prettier":"^3.8.0","typescript":"^5.5.4","@types/jest":"^29.5.14","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@jest/globals":"^29.7.0","@types/turndown":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.1.0_1768711249868_0.7020162173223177","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@zhafron/mcp-web-search","version":"1.1.1","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.1.1","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"bin":{"mcp-web-search":"dist/src/server.js"},"dist":{"shasum":"77414a458f09c487235cc58c985142a6b1d6adec","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.1.1.tgz","fileCount":12,"integrity":"sha512-4KYIfhfzbglAA1nA2cZAmmScArZ4/5ypxhI6iVw7ucGjudz5uhuVtQdyeTtom5TR194Tudq/1a+wJ4ctVVK+tw==","signatures":[{"sig":"MEYCIQCgXEkPwBiOMsZbyoALFOeQz/Ck5MuoYZGm4oXLlohFnQIhAMXqg+bYbSZdhlqwDyQoPeNXhdP8HITye5TPVRlspl8S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43451},"main":"dist/src/server.js","type":"module","gitHead":"ce83c849f1a203fe47c97860b715744fe18dd3c5","scripts":{"dev":"tsx src/server.ts","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:watch":"node --experimental-vm-modules node_modules/jest/bin/jest.js --watch","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server: DuckDuckGo HTML search, Wikipedia summaries, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","jest":"^29.7.0","ts-jest":"^29.2.5","prettier":"^3.8.0","typescript":"^5.5.4","@types/jest":"^29.5.14","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@jest/globals":"^29.7.0","@types/turndown":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.1.1_1768711678958_0.386007510524909","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@zhafron/mcp-web-search","version":"1.1.3","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.1.3","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"bin":{"mcp-web-search":"dist/src/server.js"},"dist":{"shasum":"aefa5aa52a00b1d988e3cf4bb2e018e688c666a4","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.1.3.tgz","fileCount":12,"integrity":"sha512-UJvzMeRYECip5xxuenmWneO4yw73aTS8tyCX3BFYBC2fM4XrYOGV1r/jVMG4HTJi0VS3vS3LX2nE5LMnA4seEQ==","signatures":[{"sig":"MEYCIQCFsfGSDaNomGz2g3GRgOfhIcihH+CQgSUCYa2P8BNQUgIhAMFeNqtfxr4Ctu0IxV1wgveocBD/t37+Z+uJQJhtsxKp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44356},"main":"dist/src/server.js","type":"module","gitHead":"869162212317954f548df214d30bc15cac499f26","scripts":{"dev":"tsx src/server.ts","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server: DuckDuckGo HTML search, Wikipedia summaries, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","prettier":"^3.8.0","typescript":"^5.5.4","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@types/turndown":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.1.3_1771147714492_0.9489821337390558","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@zhafron/mcp-web-search","version":"1.2.0","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai","duckduckgo","bing","searxng","multi-provider"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.2.0","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"bin":{"mcp-web-search":"dist/src/server.js"},"dist":{"shasum":"dc509a89f27a31dedc407aa5c82832aaa46cb72b","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.2.0.tgz","fileCount":20,"integrity":"sha512-Zwfk/UDI24jWbon2x8oPs9yq2PISEpsYd9+KVHoDZyFU5SCHxlG4aQs2PQcvgi1k3AQM+X7KL3aTDuvYv+3RCQ==","signatures":[{"sig":"MEUCIQCglOSDzyhgjYvlqTThIsupyfGtkYlH9FD1/cjuTctJrAIgYYR4a3f56WnIqY4Wf081cdyQyj0TfOCgBXhraoNphCE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47148},"main":"dist/src/server.js","type":"module","gitHead":"8d53226f0da1a3ddf1e4a33d1b58a09a48238559","scripts":{"dev":"tsx src/server.ts","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server: Multi-provider web search (DuckDuckGo, Bing, SearXNG) with automatic fallback, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","prettier":"^3.8.0","typescript":"^5.5.4","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@types/turndown":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.2.0_1771243038879_0.24616956909428","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@zhafron/mcp-web-search","version":"1.2.1","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai","duckduckgo","bing","searxng","multi-provider"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.2.1","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"bin":{"mcp-web-search":"dist/src/server.js"},"dist":{"shasum":"60b3911cc822b0e782393d4b4aa8928510d175e2","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.2.1.tgz","fileCount":21,"integrity":"sha512-g92lYCzkLbMeSfuC3Ylq5Ckbrknhi9DsE8HBai7rwKmEAC2L5tkUAKbBWVUwzcsRJ98Zo8gFkMECkmyRczXfzg==","signatures":[{"sig":"MEUCIHMmPznv3lwmgX7kIp/GUA85YYxLwN6mM9LuVl+vl37FAiEA9lnhsxK/p8HQC0RscSsTbh/+5wWzMg5n5D/w89i631o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47913},"main":"dist/src/server.js","type":"module","gitHead":"fb2b032c9604752afc5f6e55d5b90fcbd5bff5f0","scripts":{"dev":"tsx src/server.ts","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server: Multi-provider web search (DuckDuckGo, Bing, SearXNG) with automatic fallback, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","user-agents":"^1.1.669","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","prettier":"^3.8.0","typescript":"^5.5.4","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@types/turndown":"^5.0.6","@types/user-agents":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.2.1_1771243542607_0.5662905347514096","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@zhafron/mcp-web-search","version":"1.2.2","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai","duckduckgo","bing","searxng","multi-provider"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.2.2","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"bin":{"mcp-web-search":"dist/src/server.js"},"dist":{"shasum":"f9830a46b7f1ae4ab4da72e38415ed1e5f93efbf","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.2.2.tgz","fileCount":21,"integrity":"sha512-vxpQ59kLadbT6YtK+tBgdiGqLZ/XetlAT5xMwNVuqSUlRvzGZc1U/ptkGoOj0ktC8BBT8Ae917dHCZ9FVUs4/w==","signatures":[{"sig":"MEUCIQCP6PmiA/6ustE+NZDQANjRE7PLuVODN4q6C4WaCJKU6AIge0d8ZgAweph9txBk/f3l8ZBXta6dtwiKAeQHkoSVHN4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49070},"main":"dist/src/server.js","type":"module","gitHead":"288b6c76dc3ffe669ef11e4a963a57c01742c7e9","scripts":{"dev":"tsx src/server.ts","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server: Multi-provider web search (DuckDuckGo, Bing, SearXNG) with automatic fallback, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","user-agents":"^1.1.669","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","prettier":"^3.8.0","typescript":"^5.5.4","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@types/turndown":"^5.0.6","@types/user-agents":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.2.2_1771650528478_0.24745108653089898","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@zhafron/mcp-web-search","version":"1.2.3","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai","duckduckgo","bing","searxng","multi-provider"],"author":{"name":"tickernelz"},"license":"MIT","_id":"@zhafron/mcp-web-search@1.2.3","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"homepage":"https://github.com/tickernelz/mcp-web-search#readme","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"bin":{"mcp-web-search":"dist/src/server.js"},"dist":{"shasum":"8ab5de892ff719d2f5dd2d0c33d3d55a3c821e44","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.2.3.tgz","fileCount":22,"integrity":"sha512-qiO+vnbG1bZ6E+wZQF/K9V0keDFrEY7yW6HrY1SfcfPa/9TdhRqtLYG90n532az9viDBSZ/bYeH3vJyf7BPU8A==","signatures":[{"sig":"MEYCIQDvF66AaesjVCT2wmdLiOvK8vUDhpA7HbwxaqC8gBoAlQIhAIMXQvPHMzQTU9FCQvY94bJgVzBg8eEya+/oPZJid2ea","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53820},"main":"dist/src/server.js","type":"module","gitHead":"901049b0f23302a680b416009ffb35e79542a8e8","scripts":{"dev":"tsx src/server.ts","build":"tsc -p .","start":"node dist/src/server.js","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"repository":{"url":"git+https://github.com/tickernelz/mcp-web-search.git","type":"git"},"_npmVersion":"11.9.0","description":"MCP server: Multi-provider web search (DuckDuckGo, Bing, SearXNG) with automatic fallback, and URL content extraction — no API keys required.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^3.23.8","jsdom":"^24.1.0","turndown":"^7.2.2","pdf-parse":"^1.1.1","user-agents":"^1.1.669","puppeteer-core":"^23.11.1","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","prettier":"^3.8.0","typescript":"^5.5.4","@types/node":"^20.11.30","@types/jsdom":"^21.1.7","@types/turndown":"^5.0.6","@types/user-agents":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/mcp-web-search_1.2.3_1773212462000_0.8990518393869353","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@zhafron/mcp-web-search","version":"1.3.0","type":"module","description":"MCP server: Multi-provider web search (DuckDuckGo, Bing, SearXNG) with automatic fallback, and URL content extraction — no API keys required.","main":"dist/src/server.js","bin":{"mcp-web-search":"dist/src/server.js"},"scripts":{"build":"tsc -p .","start":"node dist/src/server.js","dev":"tsx src/server.ts","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai","duckduckgo","bing","searxng","multi-provider"],"author":{"name":"tickernelz"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/tickernelz/mcp-web-search.git"},"publishConfig":{"access":"public"},"dependencies":{"@modelcontextprotocol/sdk":"^1.17.0","@mozilla/readability":"^0.6.0","jsdom":"^24.1.0","pdf-parse":"^1.1.1","puppeteer-core":"^23.11.1","turndown":"^7.2.2","user-agents":"^1.1.669","zod":"^3.23.8"},"devDependencies":{"@types/jsdom":"^21.1.7","@types/node":"^20.11.30","@types/turndown":"^5.0.6","@types/user-agents":"^1.0.4","prettier":"^3.8.0","tsx":"^4.19.0","typescript":"^5.5.4"},"gitHead":"5e43efd0854e24ad8ac9bb7e1e7ea91011d4ec5f","_id":"@zhafron/mcp-web-search@1.3.0","bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"homepage":"https://github.com/tickernelz/mcp-web-search#readme","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-b1YvY9q8U1jqq527A4jjysvTbgsMJnLWyVpqtkBH/Z6AUEFAEws5KpqR1EO8VTxBCrtbyTqPVlXJIsFptcfdoA==","shasum":"20b186568dc50d3e058a0b7c836f5e56a0485f53","tarball":"https://registry.npmjs.org/@zhafron/mcp-web-search/-/mcp-web-search-1.3.0.tgz","fileCount":33,"unpackedSize":85972,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICN8GAj0P3BXHyyuywDw+xqGJk50siFiRS60mSxGaNL5AiEAq1c66327FaOVagAIsmg7hgE9AJ6agOf3vQrJa/xCvJ4="}]},"_npmUser":{"name":"zhafron","email":"zhafronadani@gmail.com"},"directories":{},"maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-web-search_1.3.0_1777797955567_0.5278177298018807"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-18T04:21:34.892Z","modified":"2026-05-03T08:45:55.791Z","1.0.0":"2026-01-18T04:21:35.175Z","1.1.0":"2026-01-18T04:40:50.008Z","1.1.1":"2026-01-18T04:47:59.115Z","1.1.3":"2026-02-15T09:28:34.643Z","1.2.0":"2026-02-16T11:57:19.058Z","1.2.1":"2026-02-16T12:05:42.758Z","1.2.2":"2026-02-21T05:08:48.630Z","1.2.3":"2026-03-11T07:01:02.177Z","1.3.0":"2026-05-03T08:45:55.689Z"},"bugs":{"url":"https://github.com/tickernelz/mcp-web-search/issues"},"author":{"name":"tickernelz"},"license":"MIT","homepage":"https://github.com/tickernelz/mcp-web-search#readme","keywords":["mcp","modelcontextprotocol","web","search","extraction","html","pdf","readability","turndown","ai","duckduckgo","bing","searxng","multi-provider"],"repository":{"type":"git","url":"git+https://github.com/tickernelz/mcp-web-search.git"},"description":"MCP server: Multi-provider web search (DuckDuckGo, Bing, SearXNG) with automatic fallback, and URL content extraction — no API keys required.","maintainers":[{"name":"zhafron","email":"zhafronadani@gmail.com"}],"readme":"# MCP Web Search\n\n[![npm version](https://img.shields.io/npm/v/@zhafron/mcp-web-search)](https://www.npmjs.com/package/@zhafron/mcp-web-search)\n[![npm downloads](https://img.shields.io/npm/dm/@zhafron/mcp-web-search)](https://www.npmjs.com/package/@zhafron/mcp-web-search)\n[![license](https://img.shields.io/npm/l/@zhafron/mcp-web-search)](https://www.npmjs.com/package/@zhafron/mcp-web-search)\n\nMCP server for web search and URL/resource loading. It works without API keys by default and stays local-first: search uses free providers, `fetch_url` extracts useful content from URLs, and binary/media downloads only happen when explicitly requested.\n\n## Features\n\n- `search_web` - multi-provider web search with automatic fallback across DuckDuckGo, Bing, and SearXNG.\n- `fetch_url` - universal URL/resource loader for HTML, PDF, text, Markdown, JSON, XML, CSV, media metadata, and supported site-specific URLs.\n- Clean normalized output with one `content` field plus metadata, pagination, links, media, attachments, and warnings.\n- Reddit thread extraction through Reddit JSON endpoints instead of brittle Reddit HTML scraping.\n- Long-resource pagination with `max_length`, `start_index`, and `next_start_index`.\n- Optional HTML link/media summaries.\n- Optional local download artifacts with `download: true`.\n- SSRF protection for localhost, private IPs, link-local ranges, IPv6 private ranges, and unsafe redirects.\n- No paid API required.\n\n## Requirements\n\n- Node.js 18+\n- Chrome/Chromium only if you use the Bing provider\n\n## MCP Configuration\n\n### Claude Code\n\n```json\n{\n  \"mcpServers\": {\n    \"web-search\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@zhafron/mcp-web-search\"]\n    }\n  }\n}\n```\n\n### OpenCode\n\n```json\n{\n  \"mcp\": {\n    \"web-search\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"@zhafron/mcp-web-search\"]\n    }\n  }\n}\n```\n\n### Custom Configuration\n\n```json\n{\n  \"mcpServers\": {\n    \"web-search\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@zhafron/mcp-web-search\"],\n      \"env\": {\n        \"DEFAULT_SEARCH_PROVIDER\": \"duckduckgo\",\n        \"SEARXNG_URL\": \"http://localhost:8099\"\n      }\n    }\n  }\n}\n```\n\n## Tools\n\n### search_web\n\nSearch the web through one provider or through the fallback chain.\n\nInput:\n\n```json\n{\n  \"q\": \"openai codex reddit review\",\n  \"limit\": 10,\n  \"lang\": \"en\",\n  \"provider\": \"duckduckgo\"\n}\n```\n\nOptions:\n\n| Option     | Description                                           |\n| ---------- | ----------------------------------------------------- |\n| `q`        | Search query                                          |\n| `limit`    | Number of results, 1-50                               |\n| `lang`     | Search language, default `en`                         |\n| `provider` | Optional provider: `duckduckgo`, `bing`, or `searxng` |\n\nOutput:\n\n```json\n{\n  \"items\": [\n    {\n      \"title\": \"Example Result\",\n      \"url\": \"https://example.com\",\n      \"snippet\": \"Result summary...\",\n      \"source\": \"duckduckgo\"\n    }\n  ],\n  \"providerUsed\": \"duckduckgo\",\n  \"fallbackUsed\": false,\n  \"triedProviders\": [\"duckduckgo\"]\n}\n```\n\nFallback order:\n\n- DuckDuckGo → SearXNG → Bing\n- SearXNG → DuckDuckGo → Bing\n- Bing → DuckDuckGo → SearXNG\n\n### fetch_url\n\nFetch a URL and return extracted content plus metadata in a normalized envelope.\n\nInput:\n\n```json\n{\n  \"url\": \"https://example.com/article\",\n  \"format\": \"markdown\",\n  \"max_length\": 8000,\n  \"start_index\": 0,\n  \"include_links\": true,\n  \"include_media\": true\n}\n```\n\nOptions:\n\n| Option                 | Description                                                                                       |\n| ---------------------- | ------------------------------------------------------------------------------------------------- |\n| `url`                  | URL to fetch                                                                                      |\n| `format`               | `markdown`, `text`, `html`, `json`, `raw`, or `metadata`                                          |\n| `max_length`           | Maximum returned content characters, default 25000                                                |\n| `start_index`          | Start content from this character index                                                           |\n| `engine`               | `auto`, `http`, or `browser`; browser fallback is reserved for future optional support            |\n| `include_links`        | Include extracted links for HTML pages                                                            |\n| `include_media`        | Include extracted image/video/audio references for HTML pages                                     |\n| `include_comments`     | Include comments for site adapters that support comments, default true for Reddit                 |\n| `comment_limit`        | Maximum comments for comment-capable adapters, max 100                                            |\n| `comment_sort`         | `top`, `best`, `new`, or `controversial`                                                          |\n| `max_depth`            | Maximum comment nesting depth                                                                     |\n| `timeout_ms`           | Request timeout override                                                                          |\n| `fresh`                | Bypass in-memory cache                                                                            |\n| `download`             | Save original fetched bytes to a managed local file and return it in `attachments`; default false |\n| `download_dir`         | Optional output directory for downloads; defaults to the system temp directory                    |\n| `download_ttl_seconds` | Cleanup TTL for managed downloads, default 86400 seconds                                          |\n| `max_download_bytes`   | Response/download byte cap override, additionally capped by `MAX_BYTES`                           |\n\nOutput:\n\n```json\n{\n  \"url\": \"https://example.com/article\",\n  \"final_url\": \"https://example.com/article\",\n  \"title\": \"Example Article\",\n  \"content_type\": \"text/html\",\n  \"resource_type\": \"html\",\n  \"format\": \"markdown\",\n  \"content\": \"# Example Article\\n\\n...\",\n  \"metadata\": {\n    \"status\": 200,\n    \"content_type\": \"text/html\",\n    \"byte_length\": 12345,\n    \"extractor\": \"html\",\n    \"fetched_at\": \"2026-05-03T00:00:00.000Z\"\n  },\n  \"links\": [],\n  \"media\": {\n    \"images\": [],\n    \"videos\": [],\n    \"audio\": []\n  },\n  \"truncated\": false,\n  \"original_length\": 1200,\n  \"start_index\": 0,\n  \"next_start_index\": null,\n  \"warnings\": []\n}\n```\n\n## Supported Resources\n\n| Resource                  | Behavior                                                                                               |\n| ------------------------- | ------------------------------------------------------------------------------------------------------ |\n| HTML pages                | Extracts readable article content, title, metadata, optional links, and optional media references      |\n| Text and Markdown         | Returns text directly with pagination support                                                          |\n| JSON                      | Pretty-prints JSON when `format` is `json` or text-like when requested                                 |\n| XML and CSV-like text     | Returns as text/data content                                                                           |\n| PDF                       | Extracts text and PDF metadata                                                                         |\n| Images                    | Returns metadata by default; saves the file only with `download: true`                                 |\n| Audio and video           | Returns metadata by default; saves the file only with `download: true`                                 |\n| Archives and binary files | Returns metadata by default; downloads only when explicitly requested; archives are not auto-extracted |\n| Reddit threads            | Uses Reddit JSON endpoints and can include comments with limits                                        |\n\n## Local Downloads\n\n`fetch_url` does not download binary/media files to disk by default. This avoids surprise disk usage and persistent local copies of arbitrary web content.\n\nUse `download: true` when you need the original file available to another tool:\n\n```json\n{\n  \"url\": \"https://httpbin.org/image/png\",\n  \"format\": \"metadata\",\n  \"download\": true,\n  \"download_ttl_seconds\": 86400\n}\n```\n\nDownload attachments look like this:\n\n```json\n{\n  \"kind\": \"download\",\n  \"path\": \"/tmp/mcp-web-search/downloads/mcp-fetch-id-image.png\",\n  \"filename\": \"mcp-fetch-id-image.png\",\n  \"original_filename\": \"image.png\",\n  \"content_type\": \"image/png\",\n  \"resource_type\": \"image\",\n  \"byte_length\": 8090,\n  \"sha256\": \"...\",\n  \"expires_at\": \"2026-05-04T00:00:00.000Z\"\n}\n```\n\nDownload safety behavior:\n\n- Downloads are opt-in only.\n- Files are written with `0600` permissions.\n- Filenames are sanitized and prefixed with a managed artifact ID.\n- SHA-256 is returned for verification.\n- Expired managed artifacts are cleaned up through sidecar metadata.\n- Cleanup only touches managed artifacts inside the configured download directory.\n- Archives are never auto-extracted.\n\n## Reddit Thread Extraction\n\nReddit thread URLs are handled by a site adapter and fetched through Reddit JSON endpoints.\n\nInput example:\n\n```json\n{\n  \"url\": \"https://www.reddit.com/r/codex/comments/abc123/gpt55_is_so_good/\",\n  \"include_comments\": true,\n  \"comment_limit\": 30,\n  \"comment_sort\": \"top\",\n  \"max_depth\": 2\n}\n```\n\nThe output uses `resource_type: \"site\"` and `metadata.extractor: \"reddit-thread\"`.\n\nReddit public JSON can still rate-limit or return 403/429 depending on Reddit, subreddit rules, and request frequency. When that happens, retry later or reduce request frequency.\n\n## Providers\n\n| Provider   | API Key Required | Notes                                         |\n| ---------- | ---------------- | --------------------------------------------- |\n| DuckDuckGo | No               | Default, simple, no browser required          |\n| Bing       | No               | Uses Chrome/Chromium through Puppeteer        |\n| SearXNG    | No               | Best option for self-hosted high-volume usage |\n\n## Environment Variables\n\n| Variable                  | Default                 | Description                                                                                  |\n| ------------------------- | ----------------------- | -------------------------------------------------------------------------------------------- |\n| `DEFAULT_SEARCH_PROVIDER` | `duckduckgo`            | Default search provider: `duckduckgo`, `bing`, or `searxng`                                  |\n| `SEARXNG_URL`             | `http://localhost:8099` | SearXNG instance URL                                                                         |\n| `HTTP_TIMEOUT`            | `15000`                 | Request timeout in milliseconds                                                              |\n| `MAX_BYTES`               | `20971520`              | Maximum fetched response/download size                                                       |\n| `MCP_COMPAT_MODE`         | unset                   | Set to `legacy` to simplify `tools/list` schemas for MCP clients with weak discovery parsers |\n\n## SearXNG Setup\n\nSearXNG is a free self-hosted meta-search engine.\n\nQuick setup with Docker:\n\n```bash\nmkdir -p ~/docker/searxng\n```\n\nCreate `~/docker/searxng/settings.yml` with JSON enabled, then run the SearXNG container. The important setting is `search.formats` containing both `html` and `json`.\n\nExample relevant setting:\n\n```yaml\nsearch:\n  formats:\n    - html\n    - json\n```\n\nThen set:\n\n```bash\nexport SEARXNG_URL=\"http://localhost:8099\"\n```\n\n## Chrome Setup for Bing Provider\n\n| OS            | Command                             |\n| ------------- | ----------------------------------- |\n| Ubuntu/Debian | `sudo apt install chromium-browser` |\n| Fedora        | `sudo dnf install chromium`         |\n| Arch          | `sudo pacman -S chromium`           |\n| macOS         | `brew install --cask google-chrome` |\n\nCustom path:\n\n```bash\nexport CHROME_PATH=\"/path/to/chrome\"\n```\n\n## MCP Discovery Compatibility\n\nSome MCP clients have weak schema parsers and fail during discovery on array-valued JSON Schema nodes such as `enum` or `required`.\n\nIf discovery fails, set:\n\n```bash\nexport MCP_COMPAT_MODE=\"legacy\"\n```\n\nThis only simplifies advertised `tools/list` schemas. Tool execution behavior stays the same.\n\n## URL Safety\n\n`fetch_url` blocks unsafe targets before fetching and before following redirects.\n\nBlocked targets include:\n\n- localhost hostnames\n- `.localhost` and `.local` hostnames\n- private IPv4 ranges\n- IPv4 loopback, link-local, carrier-grade NAT, benchmark, multicast, and selected special-use ranges\n- IPv4-mapped IPv6 addresses that resolve to blocked IPv4 ranges\n- IPv6 loopback, unspecified, unique-local, multicast, and link-local ranges\n- redirects that resolve to blocked addresses\n\nThe HTTP transport resolves and validates addresses before connecting, then connects to the vetted address while preserving the original host/SNI for normal HTTPS behavior.\n\n## Repository Structure\n\n- `src/server.ts` - MCP server and tool schemas\n- `src/providers/` - search providers\n- `src/fetch/` - URL/resource loading pipeline\n- `src/fetch/content/` - shared content helpers such as Markdown conversion and readability fallback\n- `src/fetch/extractors/` - resource extractors for HTML, text/data, PDF, and media metadata\n- `src/fetch/site-adapters/` - domain-specific extractors such as Reddit threads\n- `src/utils/` - shared utilities\n- `test/` - Node test runner tests\n\n## Troubleshooting\n\n| Issue                                                       | Solution                                                                                  |\n| ----------------------------------------------------------- | ----------------------------------------------------------------------------------------- |\n| Chrome not found                                            | Install Chrome/Chromium or set `CHROME_PATH`                                              |\n| SearXNG 403                                                 | Enable JSON API in `settings.yml`                                                         |\n| Timeout                                                     | Increase `HTTP_TIMEOUT` or pass `timeout_ms`                                              |\n| MCP discovery error: `'list' object has no attribute 'get'` | Set `MCP_COMPAT_MODE=legacy`                                                              |\n| Reddit 429 or 403                                           | Reddit rate limited or blocked the JSON endpoint; retry later or reduce request frequency |\n| Download missing from output                                | Set `download: true`; downloads are disabled by default                                   |\n| Download rejected as too large                              | Increase `max_download_bytes` within the server cap or raise `MAX_BYTES`                  |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}