{"url_pattern":"^https?://(www\\.)?openlibrary\\.org(/.*)?$","site_name":"openlibrary","allowed_domains":["covers.openlibrary.org","openlibrary.org"],"tools":[{"name":"openlibrary_get_book_details","description":"Fetch the current work or edition details as JSON","inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"Optional current Open Library path such as /works/OL45883W"}},"required":null},"handler":"(params) => {\n  const path = params.path || window.location.pathname;\n  const normalized = path.endsWith('.json') ? path : path.replace(/\\/$/, '') + '.json';\n  return fetch('https://openlibrary.org' + normalized)\n    .then((resp) => resp.ok ? resp.json() : Promise.reject(new Error('HTTP ' + resp.status)))\n    .then((data) => ({\n      success: true,\n      path,\n      details: {\n        title: data.title || document.querySelector('h1')?.textContent?.trim() || '',\n        description: typeof data.description === 'string' ? data.description : (data.description?.value || ''),\n        subjects: data.subjects || [],\n        firstPublishDate: data.first_publish_date || null,\n        covers: data.covers || [],\n        url: 'https://openlibrary.org' + path.replace(/\\.json$/, '')\n      }\n    }))\n    .catch((error) => ({ success: false, message: error.message, path }));\n}"},{"name":"openlibrary_open_book","description":"Open an Open Library work page by work ID","inputSchema":{"type":"object","properties":{"workId":{"type":"string","description":"Open Library work ID, for example OL45883W"}},"required":["workId"]},"handler":"(params) => {\n  window.location.href = 'https://openlibrary.org/works/' + params.workId;\n  return { success: true, message: 'Opening work page...', workId: params.workId };\n}"},{"name":"openlibrary_search","description":"Open Library 图书搜索","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"搜索关键词"},"count":{"type":"number","description":"返回数量","default":10}},"required":["query"]},"handler":"(params) => {\n  const run = async function(args) {\n\n      const query = encodeURIComponent(args.query);\n      const limit = args.count || 10;\n      const resp = await fetch(`https://openlibrary.org/search.json?q=${query}&limit=${limit}`);\n      if (!resp.ok) return {error: 'HTTP ' + resp.status};\n      const data = await resp.json();\n      return {\n        total: data.numFound,\n        count: data.docs.length,\n        books: data.docs.map(d => ({\n          title: d.title,\n          authors: d.author_name || [],\n          firstPublishYear: d.first_publish_year,\n          isbn: (d.isbn || []).slice(0, 3),\n          subjects: (d.subject || []).slice(0, 5),\n          pages: d.number_of_pages_median,\n          cover: d.cover_i ? `https://covers.openlibrary.org/b/id/${d.cover_i}-M.jpg` : null,\n          url: d.key ? `https://openlibrary.org${d.key}` : null\n        }))\n      };\n  };\n  return run(params || {});\n}"},{"name":"openlibrary_search_books","description":"Search books from Open Library and return structured results","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search keywords"},"limit":{"type":"number","description":"Maximum results to return (default 10)"}},"required":["query"]},"handler":"(params) => {\n  const limit = Math.max(1, Math.min(20, Number(params.limit || 10)));\n  return fetch('https://openlibrary.org/search.json?q=' + encodeURIComponent(params.query) + '&limit=' + limit)\n    .then((resp) => resp.ok ? resp.json() : Promise.reject(new Error('HTTP ' + resp.status)))\n    .then((data) => {\n      const books = (data.docs || []).slice(0, limit).map((doc, index) => ({\n        rank: index + 1,\n        title: doc.title || '',\n        authors: doc.author_name || [],\n        firstPublishYear: doc.first_publish_year || null,\n        editionCount: doc.edition_count || 0,\n        cover: doc.cover_i ? 'https://covers.openlibrary.org/b/id/' + doc.cover_i + '-M.jpg' : null,\n        workKey: doc.key || null,\n        url: doc.key ? 'https://openlibrary.org' + doc.key : null\n      }));\n      return {\n        success: true,\n        query: params.query,\n        total: data.numFound || 0,\n        count: books.length,\n        books\n      };\n    })\n    .catch((error) => ({ success: false, message: error.message }));\n}"}]}