{"url_pattern":"^https?://(www\\.)?weread\\.qq\\.com(/.*)?$","site_name":"weread","allowed_domains":null,"tools":[{"name":"weread_search_books","description":"Search books on WeRead using the public web API","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://weread.qq.com/web/search/global?keyword=' + encodeURIComponent(params.query), { credentials: 'include' })\n    .then((resp) => resp.ok ? resp.json() : Promise.reject(new Error('HTTP ' + resp.status)))\n    .then((data) => {\n      const books = (data.books || []).slice(0, limit).map((item, index) => ({\n        rank: index + 1,\n        title: item.bookInfo?.title || '',\n        author: item.bookInfo?.author || '',\n        bookId: item.bookInfo?.bookId || '',\n        cover: item.bookInfo?.cover || null,\n        url: item.bookInfo?.bookId ? 'https://weread.qq.com/web/bookDetail/' + item.bookInfo.bookId : null\n      }));\n      return { success: true, query: params.query, count: books.length, books };\n    })\n    .catch((error) => ({ success: false, message: error.message }));\n}"},{"name":"weread_ranking","description":"Get WeRead ranking results for a category","inputSchema":{"type":"object","properties":{"category":{"type":"string","description":"Ranking category, such as all, rising, or a numeric category ID"},"limit":{"type":"number","description":"Maximum results to return (default 10)"}},"required":null},"handler":"(params) => {\n  const category = params.category || 'all';\n  const limit = Math.max(1, Math.min(20, Number(params.limit || 10)));\n  return fetch('https://weread.qq.com/web/bookListInCategory/' + encodeURIComponent(category) + '?rank=1', { credentials: 'include' })\n    .then((resp) => resp.ok ? resp.json() : Promise.reject(new Error('HTTP ' + resp.status)))\n    .then((data) => {\n      const books = (data.books || []).slice(0, limit).map((item, index) => ({\n        rank: index + 1,\n        title: item.bookInfo?.title || '',\n        author: item.bookInfo?.author || '',\n        category: item.bookInfo?.category || '',\n        readingCount: item.readingCount || 0,\n        bookId: item.bookInfo?.bookId || ''\n      }));\n      return { success: true, category, count: books.length, books };\n    })\n    .catch((error) => ({ success: false, message: error.message }));\n}"},{"name":"weread_open_book","description":"Open a WeRead book detail page by book ID","inputSchema":{"type":"object","properties":{"bookId":{"type":"string","description":"Book ID returned by weread_search_books"}},"required":["bookId"]},"handler":"(params) => {\n  window.location.href = 'https://weread.qq.com/web/bookDetail/' + params.bookId;\n  return { success: true, message: 'Opening WeRead book detail...', bookId: params.bookId };\n}"},{"name":"weread_get_current_book","description":"Extract the current book title, author, and summary from a WeRead book page","inputSchema":{"type":"object","properties":{},"required":null},"handler":"() => {\n  const title = document.querySelector('h1')?.textContent?.trim() || document.querySelector('[class*=\"title\"]')?.textContent?.trim() || document.title;\n  const author = document.querySelector('[class*=\"author\"]')?.textContent?.trim() || '';\n  const summary = document.querySelector('[class*=\"intro\"], [class*=\"summary\"], [class*=\"description\"]')?.textContent?.replace(/\\s+/g, ' ').trim() || '';\n  const cover = document.querySelector('img')?.src || null;\n  return {\n    success: true,\n    book: {\n      title,\n      author,\n      summary,\n      cover,\n      url: window.location.href\n    }\n  };\n}"}]}