{"url_pattern":"^https?://pypi\\.org(/.*)?$","site_name":"pypi","allowed_domains":["pypi.org"],"tools":[{"name":"pypi_package","description":"获取 Python 包详情","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"包名"}},"required":null},"handler":"(params) => {\n  const run = async function(args) {\n\n      const name = args.name || args._text;\n      if (!name) return {error: 'Missing package name. Usage: bb-browser site pypi/package \"PACKAGE_NAME\"'};\n      const url = `https://pypi.org/pypi/${encodeURIComponent(name)}/json`;\n      const resp = await fetch(url);\n      if (!resp.ok) return {error: 'HTTP ' + resp.status};\n      const data = await resp.json();\n      const info = data.info || {};\n      return {\n        name: info.name,\n        version: info.version,\n        summary: info.summary,\n        author: info.author,\n        author_email: info.author_email,\n        license: info.license,\n        home_page: info.home_page,\n        project_url: info.project_url,\n        package_url: info.package_url,\n        requires_python: info.requires_python,\n        keywords: info.keywords,\n        classifiers: info.classifiers,\n        project_urls: info.project_urls,\n        requires_dist: info.requires_dist\n      };\n  };\n  return run(params || {});\n}"},{"name":"pypi_search","description":"搜索 Python 包","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"搜索关键词"},"page":{"type":"string","description":"页码（默认 1）"}},"required":null},"handler":"(params) => {\n  const run = async function(args) {\n\n      const query = args.query || args._text;\n      if (!query) return {error: 'Missing query. Usage: bb-browser site pypi/search \"QUERY\"'};\n      const page = args.page || 1;\n      const url = `https://pypi.org/search/?q=${encodeURIComponent(query)}&page=${page}`;\n      const resp = await fetch(url);\n      if (!resp.ok) return {error: 'HTTP ' + resp.status};\n      const html = await resp.text();\n      const parser = new DOMParser();\n      const doc = parser.parseFromString(html, 'text/html');\n      const snippets = doc.querySelectorAll('a.package-snippet');\n      const packages = Array.from(snippets).map(el => ({\n        name: (el.querySelector('.package-snippet__name') || {}).textContent?.trim(),\n        version: (el.querySelector('.package-snippet__version') || {}).textContent?.trim(),\n        description: (el.querySelector('.package-snippet__description') || {}).textContent?.trim(),\n        url: el.href ? `https://pypi.org${el.getAttribute('href')}` : undefined\n      }));\n      return {query, page, count: packages.length, packages};\n  };\n  return run(params || {});\n}"}]}