{"url_pattern":"^https?://(www\\.)?npmjs\\.com(/.*)?$","site_name":"npm","allowed_domains":["npmjs.com","registry.npmjs.org"],"tools":[{"name":"npm_search","description":"Search npm packages via registry API","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search query"},"count":{"type":"number","description":"Number of results (default 20, max 250)","default":20}},"required":["query"]},"handler":"(params) => {\n  const run = async function(args) {\n\n      const query = args.query;\n      if (!query) return {error: 'Missing required argument: query'};\n      const size = Math.min(args.count || 20, 250);\n      const url = `https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(query)}&size=${size}`;\n      const resp = await fetch(url);\n      if (!resp.ok) return {error: 'HTTP ' + resp.status};\n      const data = await resp.json();\n      const packages = (data.objects || []).map(obj => {\n        const pkg = obj.package || {};\n        const score = obj.score || {};\n        return {\n          name: pkg.name,\n          version: pkg.version,\n          description: (pkg.description || '').substring(0, 300),\n          author: pkg.publisher?.username || pkg.author?.name || null,\n          date: pkg.date,\n          url: pkg.links?.npm || `https://www.npmjs.com/package/${pkg.name}`,\n          homepage: pkg.links?.homepage || null,\n          repository: pkg.links?.repository || null,\n          score: Math.round((score.final || 0) * 100) / 100,\n          searchScore: Math.round((obj.searchScore || 0) * 100) / 100,\n          keywords: (pkg.keywords || []).slice(0, 8)\n        };\n      });\n      return {total: data.total || packages.length, count: packages.length, packages};\n  };\n  return run(params || {});\n}"}]}