@zonuexe/techbook-mcp 0.2.3 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/CHANGELOG.md +52 -1
  2. package/README.md +54 -22
  3. package/dist/adapters/http/fetch-client.d.ts.map +1 -1
  4. package/dist/adapters/http/fetch-client.js +18 -1
  5. package/dist/adapters/http/fetch-client.js.map +1 -1
  6. package/dist/adapters/openbd.d.ts.map +1 -1
  7. package/dist/adapters/openbd.js +18 -5
  8. package/dist/adapters/openbd.js.map +1 -1
  9. package/dist/adapters/publishers/base.d.ts +2 -1
  10. package/dist/adapters/publishers/base.d.ts.map +1 -1
  11. package/dist/adapters/publishers/base.js +8 -3
  12. package/dist/adapters/publishers/base.js.map +1 -1
  13. package/dist/adapters/publishers/cq-publishing.d.ts +3 -0
  14. package/dist/adapters/publishers/cq-publishing.d.ts.map +1 -0
  15. package/dist/adapters/publishers/cq-publishing.js +120 -0
  16. package/dist/adapters/publishers/cq-publishing.js.map +1 -0
  17. package/dist/adapters/publishers/google-books.d.ts +4 -0
  18. package/dist/adapters/publishers/google-books.d.ts.map +1 -0
  19. package/dist/adapters/publishers/google-books.js +76 -0
  20. package/dist/adapters/publishers/google-books.js.map +1 -0
  21. package/dist/adapters/publishers/isbn-publisher-codes.d.ts +21 -0
  22. package/dist/adapters/publishers/isbn-publisher-codes.d.ts.map +1 -0
  23. package/dist/adapters/publishers/isbn-publisher-codes.js +49 -0
  24. package/dist/adapters/publishers/isbn-publisher-codes.js.map +1 -0
  25. package/dist/adapters/publishers/juse-p.d.ts +3 -0
  26. package/dist/adapters/publishers/juse-p.d.ts.map +1 -0
  27. package/dist/adapters/publishers/juse-p.js +110 -0
  28. package/dist/adapters/publishers/juse-p.js.map +1 -0
  29. package/dist/adapters/publishers/leanpub.d.ts +3 -0
  30. package/dist/adapters/publishers/leanpub.d.ts.map +1 -0
  31. package/dist/adapters/publishers/leanpub.js +96 -0
  32. package/dist/adapters/publishers/leanpub.js.map +1 -0
  33. package/dist/adapters/publishers/oreilly-japan.d.ts.map +1 -1
  34. package/dist/adapters/publishers/oreilly-japan.js +8 -2
  35. package/dist/adapters/publishers/oreilly-japan.js.map +1 -1
  36. package/dist/adapters/publishers/peaks.d.ts.map +1 -1
  37. package/dist/adapters/publishers/peaks.js +3 -2
  38. package/dist/adapters/publishers/peaks.js.map +1 -1
  39. package/dist/adapters/publishers/personal-media.d.ts.map +1 -1
  40. package/dist/adapters/publishers/personal-media.js +3 -2
  41. package/dist/adapters/publishers/personal-media.js.map +1 -1
  42. package/dist/adapters/publishers/pragprog.d.ts +3 -0
  43. package/dist/adapters/publishers/pragprog.d.ts.map +1 -0
  44. package/dist/adapters/publishers/pragprog.js +120 -0
  45. package/dist/adapters/publishers/pragprog.js.map +1 -0
  46. package/dist/adapters/publishers/registry.d.ts.map +1 -1
  47. package/dist/adapters/publishers/registry.js +10 -0
  48. package/dist/adapters/publishers/registry.js.map +1 -1
  49. package/dist/adapters/publishers/techbookfest.d.ts.map +1 -1
  50. package/dist/adapters/publishers/techbookfest.js +2 -1
  51. package/dist/adapters/publishers/techbookfest.js.map +1 -1
  52. package/dist/application/concurrency.d.ts +16 -0
  53. package/dist/application/concurrency.d.ts.map +1 -0
  54. package/dist/application/concurrency.js +42 -0
  55. package/dist/application/concurrency.js.map +1 -0
  56. package/dist/application/get-book-by-isbn.d.ts +0 -8
  57. package/dist/application/get-book-by-isbn.d.ts.map +1 -1
  58. package/dist/application/get-book-by-isbn.js +64 -7
  59. package/dist/application/get-book-by-isbn.js.map +1 -1
  60. package/dist/application/get-book-detail.d.ts.map +1 -1
  61. package/dist/application/get-book-detail.js +3 -0
  62. package/dist/application/get-book-detail.js.map +1 -1
  63. package/dist/application/search-books.d.ts +16 -5
  64. package/dist/application/search-books.d.ts.map +1 -1
  65. package/dist/application/search-books.js +46 -9
  66. package/dist/application/search-books.js.map +1 -1
  67. package/dist/config/credentials.d.ts +8 -0
  68. package/dist/config/credentials.d.ts.map +1 -0
  69. package/dist/config/credentials.js +32 -0
  70. package/dist/config/credentials.js.map +1 -0
  71. package/dist/domain/authors.d.ts +7 -0
  72. package/dist/domain/authors.d.ts.map +1 -0
  73. package/dist/domain/authors.js +22 -0
  74. package/dist/domain/authors.js.map +1 -0
  75. package/dist/domain/book.d.ts +2 -0
  76. package/dist/domain/book.d.ts.map +1 -1
  77. package/dist/domain/isbn.d.ts +8 -0
  78. package/dist/domain/isbn.d.ts.map +1 -0
  79. package/dist/domain/isbn.js +16 -0
  80. package/dist/domain/isbn.js.map +1 -0
  81. package/dist/domain/publisher.d.ts +16 -0
  82. package/dist/domain/publisher.d.ts.map +1 -1
  83. package/dist/domain/text-match.d.ts +32 -0
  84. package/dist/domain/text-match.d.ts.map +1 -0
  85. package/dist/domain/text-match.js +84 -0
  86. package/dist/domain/text-match.js.map +1 -0
  87. package/dist/main.js +15 -1
  88. package/dist/main.js.map +1 -1
  89. package/dist/mcp/server.d.ts +6 -0
  90. package/dist/mcp/server.d.ts.map +1 -1
  91. package/dist/mcp/server.js +40 -4
  92. package/dist/mcp/server.js.map +1 -1
  93. package/dist/mcp/tools.d.ts.map +1 -1
  94. package/dist/mcp/tools.js +9 -1
  95. package/dist/mcp/tools.js.map +1 -1
  96. package/dist/setup.d.ts +2 -0
  97. package/dist/setup.d.ts.map +1 -0
  98. package/dist/setup.js +43 -0
  99. package/dist/setup.js.map +1 -0
  100. package/dist/version.d.ts +9 -0
  101. package/dist/version.d.ts.map +1 -0
  102. package/dist/version.js +9 -0
  103. package/dist/version.js.map +1 -0
  104. package/docs/design-doc.md +127 -7
  105. package/package.json +14 -15
  106. package/.claude/settings.local.json +0 -38
  107. package/.codex/skills/techbook-mcp-release-prep/SKILL.md +0 -105
  108. package/.github/workflows/test.yml +0 -72
  109. package/.oxlintrc.json +0 -12
  110. package/AGENTS.md +0 -100
  111. package/deno.json +0 -3
  112. package/src/adapters/cache/memory-cache.ts +0 -31
  113. package/src/adapters/cache/null-cache.ts +0 -8
  114. package/src/adapters/calil.ts +0 -57
  115. package/src/adapters/html/cheerio-parser.ts +0 -50
  116. package/src/adapters/http/fetch-client.ts +0 -47
  117. package/src/adapters/http/mock-client.ts +0 -77
  118. package/src/adapters/openbd.ts +0 -142
  119. package/src/adapters/publishers/base.ts +0 -279
  120. package/src/adapters/publishers/book-tech.ts +0 -117
  121. package/src/adapters/publishers/born-digital.ts +0 -143
  122. package/src/adapters/publishers/coronasha.ts +0 -139
  123. package/src/adapters/publishers/gihyo.ts +0 -120
  124. package/src/adapters/publishers/impress.ts +0 -103
  125. package/src/adapters/publishers/lambdanote.ts +0 -146
  126. package/src/adapters/publishers/manatee.ts +0 -113
  127. package/src/adapters/publishers/maruzen-publishing.ts +0 -129
  128. package/src/adapters/publishers/optronics.ts +0 -113
  129. package/src/adapters/publishers/oreilly-japan.ts +0 -133
  130. package/src/adapters/publishers/peaks.ts +0 -98
  131. package/src/adapters/publishers/personal-media.ts +0 -168
  132. package/src/adapters/publishers/registry.ts +0 -38
  133. package/src/adapters/publishers/rutles.ts +0 -149
  134. package/src/adapters/publishers/saiensu.ts +0 -136
  135. package/src/adapters/publishers/seshop.ts +0 -121
  136. package/src/adapters/publishers/tatsu-zine.ts +0 -142
  137. package/src/adapters/publishers/techbookfest.ts +0 -179
  138. package/src/application/get-book-by-isbn.ts +0 -50
  139. package/src/application/get-book-detail.ts +0 -40
  140. package/src/application/search-books.ts +0 -64
  141. package/src/domain/book.ts +0 -35
  142. package/src/domain/publisher.ts +0 -18
  143. package/src/main.ts +0 -14
  144. package/src/mcp/server.ts +0 -113
  145. package/src/mcp/tools.ts +0 -71
  146. package/src/ports/cache.ts +0 -5
  147. package/src/ports/html-parser.ts +0 -15
  148. package/src/ports/http.ts +0 -17
  149. package/tests/fixtures/book-tech-detail.html +0 -51
  150. package/tests/fixtures/book-tech-search.html +0 -91
  151. package/tests/fixtures/born-digital-detail.html +0 -62
  152. package/tests/fixtures/born-digital-search.html +0 -51
  153. package/tests/fixtures/calil-book.html +0 -987
  154. package/tests/fixtures/coronasha-detail.html +0 -41
  155. package/tests/fixtures/coronasha-search.html +0 -61
  156. package/tests/fixtures/gihyo-detail.html +0 -42
  157. package/tests/fixtures/gihyo-search.json +0 -54
  158. package/tests/fixtures/impress-detail-epub.html +0 -746
  159. package/tests/fixtures/impress-detail-social.html +0 -689
  160. package/tests/fixtures/lambdanote-search.html +0 -66
  161. package/tests/fixtures/manatee-detail.html +0 -53
  162. package/tests/fixtures/manatee-search.html +0 -59
  163. package/tests/fixtures/maruzen-detail.html +0 -51
  164. package/tests/fixtures/maruzen-search.html +0 -60
  165. package/tests/fixtures/openbd-response.json +0 -110
  166. package/tests/fixtures/optronics-detail.html +0 -30
  167. package/tests/fixtures/optronics-search.html +0 -75
  168. package/tests/fixtures/oreilly-detail.html +0 -52
  169. package/tests/fixtures/oreilly-ebook-list.html +0 -53
  170. package/tests/fixtures/peaks-detail.html +0 -39
  171. package/tests/fixtures/peaks-top.html +0 -50
  172. package/tests/fixtures/personal-media-detail.html +0 -32
  173. package/tests/fixtures/personal-media-search.html +0 -39
  174. package/tests/fixtures/rutles-detail.html +0 -32
  175. package/tests/fixtures/rutles-search.html +0 -62
  176. package/tests/fixtures/saiensu-detail.html +0 -41
  177. package/tests/fixtures/saiensu-search.html +0 -65
  178. package/tests/fixtures/seshop-detail.html +0 -45
  179. package/tests/fixtures/seshop-search.html +0 -58
  180. package/tests/fixtures/tatsu-zine-detail-free.html +0 -24
  181. package/tests/fixtures/tatsu-zine-search.html +0 -40
  182. package/tests/fixtures/techbookfest-search.json +0 -73
  183. package/tests/unit/adapters/base.test.ts +0 -441
  184. package/tests/unit/adapters/calil.test.ts +0 -69
  185. package/tests/unit/adapters/openbd.test.ts +0 -185
  186. package/tests/unit/adapters/publishers/book-tech.test.ts +0 -186
  187. package/tests/unit/adapters/publishers/born-digital.test.ts +0 -194
  188. package/tests/unit/adapters/publishers/coronasha.test.ts +0 -207
  189. package/tests/unit/adapters/publishers/gihyo.test.ts +0 -137
  190. package/tests/unit/adapters/publishers/impress.test.ts +0 -129
  191. package/tests/unit/adapters/publishers/lambdanote.test.ts +0 -85
  192. package/tests/unit/adapters/publishers/manatee.test.ts +0 -165
  193. package/tests/unit/adapters/publishers/maruzen-publishing.test.ts +0 -179
  194. package/tests/unit/adapters/publishers/optronics.test.ts +0 -208
  195. package/tests/unit/adapters/publishers/oreilly-japan.test.ts +0 -194
  196. package/tests/unit/adapters/publishers/peaks.test.ts +0 -177
  197. package/tests/unit/adapters/publishers/personal-media.test.ts +0 -199
  198. package/tests/unit/adapters/publishers/rutles.test.ts +0 -173
  199. package/tests/unit/adapters/publishers/saiensu.test.ts +0 -169
  200. package/tests/unit/adapters/publishers/seshop.test.ts +0 -174
  201. package/tests/unit/adapters/publishers/tatsu-zine.test.ts +0 -172
  202. package/tests/unit/adapters/publishers/techbookfest.test.ts +0 -94
  203. package/tests/unit/adapters/registry.test.ts +0 -37
  204. package/tests/unit/application/get-book-by-isbn.test.ts +0 -176
  205. package/tests/unit/application/get-book-detail.test.ts +0 -102
  206. package/tests/unit/application/search-books.test.ts +0 -137
  207. package/tsconfig.json +0 -17
package/CHANGELOG.md CHANGED
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.3.1] - 2026-06-02
11
+
12
+ ### Fixed
13
+
14
+ - MCP サーバーがクライアントに申告する `version` が実際のパッケージバージョンと一致せず `0.1.0` に固定されていた問題を修正(HTTP `User-Agent` も同様に固定されていた。`src/version.ts` の単一定数を参照するよう一元化)
15
+
16
+ ## [0.3.0] - 2026-06-02
17
+
18
+ ### Added
19
+
20
+ - CQ出版社 (`cq-publishing`) アダプターを追加(電子書籍直販サイト Tech Village)
21
+ - Pragmatic Bookshelf (`pragprog`) アダプターを追加(海外・DRM-free)
22
+ - Leanpub (`leanpub`) アダプターを追加(海外・セルフ出版・DRM-free)
23
+ - 海外出版社の価格に対応する `BookRecord.currency`(ISO 4217、省略時は JPY)を追加
24
+ - 書籍の言語を表す `BookRecord.language`(ISO 639-1、省略時は `ja`)を追加
25
+ - `search_books` が各候補にクエリとの一致度 `matchScore` を付与し、ベストマッチ順にソートするよう改善
26
+ - `search_books` の `title` が ISBN 形式かつ `author` 未指定のとき `get_book_by_isbn` 経路へ振り分け(ISBN ショートカット)
27
+ - `get_book_by_isbn` が openBD 未収録の旧刊でも、ISBN ベースの安定 URL を持つ出版社(O'Reilly の `/books/{isbn}/`)の詳細ページを直接取得して書誌を回収(電子書籍専売・販売終了タイトルの部分救済。価格は取得不可)
28
+
29
+ ### Changed
30
+
31
+ - `search_books` は「該当なし」を空配列で返すようになり、検索サイトが該当なし時に返す無関係な新着フォールバックを除外(誤メタデータの混入を防止)
32
+ - 書名の一致をトークン分割×包含割合で評価し、純日本語の部分一致(助詞を跨ぐ部分語)を拾えるよう改善
33
+ - 検索結果の著者を search / detail / isbn の全経路で重複排除(表記ゆれも同一視)
34
+ - 出版社の検索 API が著者を返さない場合でも、ISBN があれば openBD から `authors` を補完
35
+ - 横断検索を並列度6・1社あたり12秒タイムアウトで高速化/静音化し、小規模サイトはカタログを長期キャッシュ(大規模出版社を優先)
36
+
37
+ ### Fixed
38
+
39
+ - EUC-JP レスポンスをデコードし、ラトルズ・ボーンデジタルの検索結果が常に 0 件になる問題を修正(非 UTF-8 レスポンス全般に対応)
40
+
41
+ ### Security
42
+
43
+ - 依存を最新メジャーへ更新し、SDK 経由の推移的脆弱性 5 件を解消
44
+
45
+ ## [0.2.4] - 2026-04-19
46
+
47
+ ### Added
48
+
49
+ - 日科技連出版社 (`juse-p`) アダプターを追加
50
+ - Google Books アダプター (`google-books`) を追加(APIキー未設定時は無効化)
51
+ - `techbook-mcp setup` コマンドを追加: Google Books API キーを対話入力し OS 固有の設定ディレクトリに保存
52
+ - Linux: `$XDG_CONFIG_HOME/techbook-mcp/credentials.json`
53
+ - macOS: `~/Library/Application Support/techbook-mcp/credentials.json`
54
+ - Windows: `%APPDATA%\techbook-mcp\credentials.json`
55
+ - ISBN出版者記号から出版社アダプターを特定するマッピング (`PUBLISHER_ISBN_CODES`) を追加(13出版社)
56
+ - `get_book_by_isbn` が openBD の storelink に加え、ISBN出版者記号からも対応アダプターを特定して出版社サイトから直接取得を試みるよう改善
57
+
10
58
  ## [0.2.3] - 2026-04-13
11
59
 
12
60
  ### Added
@@ -47,7 +95,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
47
95
 
48
96
  - テストを vitest から `node:test` + `node:assert` に移行(Node.js・Bun・Deno で共通実行可能に)
49
97
 
50
- [Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.3...HEAD
98
+ [Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.3.1...HEAD
99
+ [0.3.1]: https://github.com/zonuexe/techbook-mcp/compare/v0.3.0...v0.3.1
100
+ [0.3.0]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.4...v0.3.0
101
+ [0.2.4]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.3...v0.2.4
51
102
  [0.2.3]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.2...v0.2.3
52
103
  [0.2.2]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.1...v0.2.2
53
104
  [0.2.1]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.0...v0.2.1
package/README.md CHANGED
@@ -60,26 +60,56 @@ Claude が `get_book_detail` ツールで著者・価格・ISBN・購入可能
60
60
 
61
61
  Claude が `list_publishers` ツールを呼び出し、出版社名と ID の一覧を返します。
62
62
 
63
- ## 対応出版社
64
-
65
- | 出版社 | ID |
66
- |--------|-----|
67
- | BOOK TECH | `book-tech` |
68
- | ボーンデジタル | `born-digital` |
69
- | コロナ社 | `coronasha` |
70
- | 技術評論社 | `gihyo` |
71
- | ラムダノート | `lambdanote` |
72
- | マナティ(マイナビ出版直販) | `manatee` |
73
- | 丸善出版 | `maruzen-publishing` |
74
- | オプトロニクス社 | `optronics` |
75
- | オライリー・ジャパン | `oreilly-japan` |
76
- | PEAKS | `peaks` |
77
- | パーソナルメディア | `personal-media` |
78
- | ラトルズ | `rutles` |
79
- | サイエンス社 | `saiensu` |
80
- | SEshop(翔泳社) | `seshop` |
81
- | 達人出版会 | `tatsu-zine` |
82
- | 技術書典オンラインマーケット | `techbookfest` |
63
+ ## 対応ソース
64
+
65
+ ### 出版社・書店
66
+
67
+ `publisher` パラメータに ID を指定すると、その出版社のみを検索できます。
68
+
69
+ #### 国内出版社
70
+
71
+ | 出版社・書店 | ID | ISBN出版者記号 | 取得方式 |
72
+ |---|---|---|---|
73
+ | BOOK TECH | `book-tech` | — | HTML scraping |
74
+ | ボーンデジタル | `born-digital` | `86246` | HTML scraping (EUC-JP) |
75
+ | コロナ社 | `coronasha` | `339` | HTML scraping |
76
+ | 技術評論社 | `gihyo` | `297` | JSON API |
77
+ | インプレスブックス | `impress-books` | `8443` | HTML scraping |
78
+ | 日科技連出版社 | `juse-p` | `8171` | HTML scraping |
79
+ | ラムダノート | `lambdanote` | `908686` | HTML scraping (Shopify) |
80
+ | マナティ(マイナビ出版直販) | `manatee` | `8399` | HTML scraping |
81
+ | 丸善出版 | `maruzen-publishing` | `621` | HTML scraping |
82
+ | オプトロニクス社 | `optronics` | `902312` | HTML scraping |
83
+ | オライリー・ジャパン | `oreilly-japan` | `8144` | HTML scraping (ローカルフィルタ) |
84
+ | PEAKS | `peaks` | — | HTML scraping (ローカルフィルタ) |
85
+ | パーソナルメディア | `personal-media` | `89362` | HTML scraping (ローカルフィルタ) |
86
+ | ラトルズ | `rutles` | `89977` | HTML scraping (EUC-JP) |
87
+ | サイエンス社 | `saiensu` | `7819` | HTML scraping |
88
+ | SEshop(翔泳社) | `seshop` | `7981` | HTML scraping |
89
+ | 達人出版会 | `tatsu-zine` | — | HTML scraping |
90
+ | 技術書典オンラインマーケット | `techbookfest` | — | GraphQL API |
91
+
92
+ ISBN出版者記号(`978-4-XXXXX-...` の `XXXXX` 部分)が登録されている出版社は、ISBNだけで直接検索できます。
93
+ 「—」は電子書籍専業・同人誌マーケット等でISBN出版者記号を持たないソースです。
94
+
95
+ #### 海外出版社
96
+
97
+ DRM-free の英語技術書を扱う出版社です。価格は USD、`language` は `"en"` を返します。
98
+
99
+ | 出版社・書店 | ID | 取得方式 |
100
+ |---|---|---|
101
+ | Pragmatic Bookshelf | `pragprog` | JSON index(ローカルフィルタ) |
102
+ | Leanpub | `leanpub` | HTML scraping |
103
+
104
+ ### 外部 API・データソース
105
+
106
+ | サービス | ID | 用途 | 備考 |
107
+ |---|---|---|---|
108
+ | Google Books | `google-books` | 横断検索 | APIキー必須(`techbook-mcp setup` で設定) |
109
+ | [openBD](https://openbd.jp/) | — | ISBN検索のバックボーン | 自動使用・設定不要 |
110
+ | [カーリル](https://calil.jp/) | — | openBDにない書籍のフォールバック | 自動使用・設定不要 |
111
+
112
+ **openBD** は `get_book_by_isbn` ツールで常に参照される書誌情報データベースです。ISBN で書籍を検索すると、まず openBD から書誌情報・出版社ストアリンクを取得し、対応する出版社アダプターがあればそのサイトから詳細情報を補完します。openBD にない書籍(絶版・廃業出版社など)はカーリルにフォールバックします。
83
113
 
84
114
  ## MCPツール
85
115
 
@@ -89,11 +119,13 @@ Claude が `list_publishers` ツールを呼び出し、出版社名と ID の
89
119
 
90
120
  | パラメータ | 型 | 説明 |
91
121
  |------------|-----|------|
92
- | `title` | string | 書名(部分一致) |
122
+ | `title` | string | 書名(部分一致)。ISBN を渡すと自動的に ISBN 検索に振り分けます |
93
123
  | `author` | string | 著者名(部分一致) |
94
124
  | `publisher` | string | 出版社ID(省略時は全社検索) |
95
125
  | `limit` | number | 1出版社あたりの最大件数(デフォルト: 10、最大: 50) |
96
126
 
127
+ 結果は各書籍にクエリとの一致度 `matchScore`(0〜1、1が完全一致)が付与され、**ベストマッチ順(降順)**で返ります。先頭ほど本命候補です。**一致する書籍がなければ空配列を返します**(無関係な新着本でフォールバックしないため、「該当なし」と「誤ヒット」を明確に区別できます)。各書籍の `publishedAt` は `YYYY-MM-DD`(書籍管理アプリ Riida の `release_date` に対応)、`language` は ISO 639-1(省略時 `"ja"`)です。大規模出版社を優先的に検索し、遅い・応答しないサイトはタイムアウトしてスキップするため、部分的な結果でも速やかに返ります。検索語は ASCII 語・正確なフルタイトルが最も当たりやすく、日本語の部分語は空白区切りの複数トークンにすると拾われやすくなります。
128
+
97
129
  ### `get_book_detail`
98
130
 
99
131
  書籍の公式ページ URL から詳細な書誌情報を取得します。
@@ -137,7 +169,7 @@ claude mcp add techbook-mcp -- npx -y @zonuexe/techbook-mcp
137
169
 
138
170
  ```bash
139
171
  npm install
140
- npm test # ユニットテスト実行(Vitest
172
+ npm test # ユニットテスト実行(node:test
141
173
  npm run build # TypeScript コンパイル → dist/
142
174
  ```
143
175
 
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-client.d.ts","sourceRoot":"","sources":["../../../src/adapters/http/fetch-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAsBpF,qBAAa,eAAgB,YAAW,UAAU;IAC1C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAWjE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;CAYvF"}
1
+ {"version":3,"file":"fetch-client.d.ts","sourceRoot":"","sources":["../../../src/adapters/http/fetch-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAuCpF,qBAAa,eAAgB,YAAW,UAAU;IAC1C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAWjE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;CAYvF"}
@@ -1,3 +1,9 @@
1
+ import iconv from "iconv-lite";
2
+ /** Content-Type ヘッダーから charset を取り出す(小文字化)。なければ undefined */
3
+ function charsetFromContentType(contentType) {
4
+ const m = contentType?.match(/charset=["']?([^;"'\s]+)/i);
5
+ return m?.[1].toLowerCase();
6
+ }
1
7
  class FetchHttpResponse {
2
8
  response;
3
9
  constructor(response) {
@@ -9,7 +15,18 @@ class FetchHttpResponse {
9
15
  get url() {
10
16
  return this.response.url;
11
17
  }
12
- text() {
18
+ /**
19
+ * レスポンスボディを文字列で返す。
20
+ * `fetch().text()` は常に UTF-8 として解釈するため、Content-Type が
21
+ * EUC-JP・Shift_JIS など非UTF-8の場合は iconv-lite でデコードし直す
22
+ * (ラトルズ・ボーンデジタル等の EUC-JP サイト対応)。
23
+ */
24
+ async text() {
25
+ const charset = charsetFromContentType(this.response.headers.get("content-type"));
26
+ if (charset && charset !== "utf-8" && charset !== "utf8" && iconv.encodingExists(charset)) {
27
+ const buffer = Buffer.from(await this.response.arrayBuffer());
28
+ return iconv.decode(buffer, charset);
29
+ }
13
30
  return this.response.text();
14
31
  }
15
32
  header(name) {
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-client.js","sourceRoot":"","sources":["../../../src/adapters/http/fetch-client.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB;IACQ;IAA7B,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEnD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAwB;QAC7C,MAAM,IAAI,GAAgB;YACxB,OAAO,EAAE,OAAO,EAAE,OAAO;SAC1B,CAAC;QACF,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,IAAY,EAAE,OAAwB;QAC5D,MAAM,IAAI,GAAgB;YACxB,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE;SACrE,CAAC;QACF,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;CACF"}
1
+ {"version":3,"file":"fetch-client.js","sourceRoot":"","sources":["../../../src/adapters/http/fetch-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B,6DAA6D;AAC7D,SAAS,sBAAsB,CAAC,WAA0B;IACxD,MAAM,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,iBAAiB;IACQ;IAA7B,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEnD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QAClF,IAAI,OAAO,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAwB;QAC7C,MAAM,IAAI,GAAgB;YACxB,OAAO,EAAE,OAAO,EAAE,OAAO;SAC1B,CAAC;QACF,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,IAAY,EAAE,OAAwB;QAC5D,MAAM,IAAI,GAAgB;YACxB,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE;SACrE,CAAC;QACF,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"openbd.d.ts","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE;QACJ,gBAAgB,CAAC,EAAE;YACjB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;SACnC,CAAC;QACF,aAAa,CAAC,EAAE;YACd,YAAY,CAAC,EAAE;gBACb,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;aACvB,CAAC;SACH,CAAC;KACH,CAAC;CACH;AA+BD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAenC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAmBtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAQjF"}
1
+ {"version":3,"file":"openbd.d.ts","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAqBpD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE;QACJ,gBAAgB,CAAC,EAAE;YACjB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;SACnC,CAAC;QACF,aAAa,CAAC,EAAE;YACd,YAAY,CAAC,EAAE;gBACb,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;aACvB,CAAC;SACH,CAAC;KACH,CAAC;CACH;AA+BD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAenC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAetE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAUjF"}
@@ -1,4 +1,18 @@
1
- import { fetchText } from "./publishers/base.js";
1
+ import { fetchText, stripAuthorRole } from "./publishers/base.js";
2
+ import { dedupeAuthors } from "../domain/authors.js";
3
+ /**
4
+ * openBD の summary.author("結城浩/著、北原かな/訳" 等)を著者名配列に分解する。
5
+ * 区切りで分割し、役割語(著・訳など)を除去して重複を除く。
6
+ */
7
+ function parseOpenBDAuthors(author) {
8
+ if (!author)
9
+ return [];
10
+ const parts = author
11
+ .split(/[//、,,]/)
12
+ .map(a => stripAuthorRole(a.trim()))
13
+ .filter(Boolean);
14
+ return dedupeAuthors(parts);
15
+ }
2
16
  const OPENBD_API_URL = "https://api.openbd.jp/v1/get";
3
17
  // --- ユーティリティ ---
4
18
  function parsePubDate(pubdate) {
@@ -56,12 +70,9 @@ export async function fetchOpenBDBooks(isbns, deps) {
56
70
  export function openBDEntryToBookRecord(entry) {
57
71
  const { summary } = entry;
58
72
  const storelink = entry.hanmoto?.storelink;
59
- const authors = summary.author
60
- ? summary.author.split(/[\//、,,]/).map(a => a.trim()).filter(Boolean)
61
- : [];
62
73
  return {
63
74
  title: summary.title,
64
- authors,
75
+ authors: parseOpenBDAuthors(summary.author),
65
76
  publisher: summary.publisher,
66
77
  isbn: summary.isbn,
67
78
  publishedAt: parsePubDate(summary.pubdate),
@@ -78,6 +89,8 @@ export function openBDEntryToBookRecord(entry) {
78
89
  export function enrichWithOpenBD(book, entry) {
79
90
  return {
80
91
  ...book,
92
+ // 著者が空のとき openBD から補完する(出版社の検索APIが著者を返さない場合の救済)
93
+ authors: book.authors.length > 0 ? book.authors : parseOpenBDAuthors(entry.summary.author),
81
94
  publishedAt: book.publishedAt ?? parsePubDate(entry.summary.pubdate),
82
95
  price: book.price ?? getTaxIncludedPrice(entry),
83
96
  coverImageUrl: book.coverImageUrl ?? (entry.summary.cover || undefined),
@@ -1 +1 @@
1
- {"version":3,"file":"openbd.js","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openbd.js","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,13 @@ import type { EbookStore } from "../../domain/book.js";
3
3
  import type { HtmlDocument } from "../../ports/html-parser.js";
4
4
  export declare const CACHE_TTL_SECONDS = 3600;
5
5
  export declare const ROBOTS_CACHE_TTL_SECONDS: number;
6
+ export declare const CATALOG_CACHE_TTL_SECONDS: number;
6
7
  /**
7
8
  * 指定URLのオリジンの robots.txt を取得してアクセス可否を返す。
8
9
  * 取得結果は6時間キャッシュする。エラー時はアクセスを許可する(fail-open)。
9
10
  */
10
11
  export declare function checkRobotsTxt(url: string, deps: PublisherDeps): Promise<boolean>;
11
- export declare function fetchText(url: string, deps: PublisherDeps, extraHeaders?: Record<string, string>): Promise<string>;
12
+ export declare function fetchText(url: string, deps: PublisherDeps, extraHeaders?: Record<string, string>, ttlSeconds?: number): Promise<string>;
12
13
  /** HTMLタグを除去する(gihyo APIのauthorフィールドのruby markup除去に使用) */
13
14
  export declare function stripHtmlTags(html: string): string;
14
15
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ/D,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,wBAAwB,QAAW,CAAC;AAyFjD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BvF;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,aAAa,EACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIvE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAInE;AAED,uBAAuB;AACvB,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AAwCD,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAOjE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,EAAE,CAgBzE"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAS/D,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,wBAAwB,QAAW,CAAC;AAEjD,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAyFnD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BvF;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,aAAa,EACnB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,UAAU,GAAE,MAA0B,GACrC,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIvE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAInE;AAED,uBAAuB;AACvB,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AA0CD,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAOjE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,EAAE,CAgBzE"}
@@ -1,11 +1,14 @@
1
1
  import iconv from "iconv-lite";
2
+ import { VERSION } from "../../version.js";
2
3
  const DEFAULT_HEADERS = {
3
- "User-Agent": "techbook-mcp/0.1.0 (+https://github.com/zonuexe/techbook-mcp; bibliographic search bot)",
4
+ "User-Agent": `techbook-mcp/${VERSION} (+https://github.com/zonuexe/techbook-mcp; bibliographic search bot)`,
4
5
  "Accept": "text/html,application/xhtml+xml,application/json",
5
6
  "Accept-Language": "ja,en;q=0.9",
6
7
  };
7
8
  export const CACHE_TTL_SECONDS = 3600; // 1時間
8
9
  export const ROBOTS_CACHE_TTL_SECONDS = 6 * 3600; // 6時間
10
+ // 小規模・ローカルフィルタ型サイトの全カタログは変動が少ないため長くキャッシュする
11
+ export const CATALOG_CACHE_TTL_SECONDS = 24 * 3600; // 24時間
9
12
  /** robots.txt をパースしてセクション一覧を返す */
10
13
  function parseRobotsTxt(content) {
11
14
  const sections = [];
@@ -103,7 +106,7 @@ export async function checkRobotsTxt(url, deps) {
103
106
  const rules = getRulesForAgent(sections, "techbook-mcp");
104
107
  return isPathAllowed(parsed.pathname + parsed.search, rules);
105
108
  }
106
- export async function fetchText(url, deps, extraHeaders) {
109
+ export async function fetchText(url, deps, extraHeaders, ttlSeconds = CACHE_TTL_SECONDS) {
107
110
  const cached = await deps.cache.get(url);
108
111
  if (cached !== null)
109
112
  return cached;
@@ -115,7 +118,7 @@ export async function fetchText(url, deps, extraHeaders) {
115
118
  throw new Error(`HTTP ${response.status}: ${url}`);
116
119
  }
117
120
  const text = await response.text();
118
- await deps.cache.set(url, text, CACHE_TTL_SECONDS);
121
+ await deps.cache.set(url, text, ttlSeconds);
119
122
  return text;
120
123
  }
121
124
  /** HTMLタグを除去する(gihyo APIのauthorフィールドのruby markup除去に使用) */
@@ -175,10 +178,12 @@ const EBOOK_STORE_PATTERNS = [
175
178
  { pattern: /shop\.rutles\.net\//, name: "ラトルズ", drm: "free" },
176
179
  { pattern: /peaks\.cc\/books\//, name: "PEAKS", drm: "free" },
177
180
  { pattern: /optronics-ebook\.com\/products\//, name: "オプトロニクス社", drm: "free" },
181
+ { pattern: /pragprog\.com\/titles\//, name: "Pragmatic Bookshelf", drm: "free" },
178
182
  { pattern: /gihyo\.jp\/dp\/ebook\//, name: "Gihyo Digital Publishing", drm: "social" },
179
183
  { pattern: /seshop\.com\/product\//, name: "SEshop", drm: "social" },
180
184
  { pattern: /book-tech\.com\/books\//, name: "BOOK TECH", drm: "social" },
181
185
  { pattern: /wgn-obs\.shop-pro\.jp\/\?pid=/, name: "ボーンデジタル", drm: "social" },
186
+ { pattern: /cc\.cqpub\.co\.jp\/lib\/system\/doclib_item\//, name: "CQ出版 Tech Village", drm: "social" },
182
187
  // ソーシャルDRM (購入時生成IDまたは購入者情報を透かし刻印、技術的制限なし)
183
188
  { pattern: /book\.mynavi\.jp\/manatee\//, name: "マナティ", drm: "social" },
184
189
  { pattern: /www\.lambdanote\.com\/products\//, name: "ラムダノート", drm: "social" },
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/adapters/publishers/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/adapters/publishers/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PublisherAdapter } from "../../domain/publisher.js";
2
+ export declare const cqPublishingAdapter: PublisherAdapter;
3
+ //# sourceMappingURL=cq-publishing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cq-publishing.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/cq-publishing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AAiDjF,eAAO,MAAM,mBAAmB,EAAE,gBA+FjC,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { fetchText, parseJapanesePrice, resolveUrl, stripAuthorRole } from "./base.js";
2
+ // CQ出版社の電子書籍直販サイト「Tech Village 書庫&販売」
3
+ const BASE_URL = "https://cc.cqpub.co.jp";
4
+ // 検索キーワードは CakePHP の名前付きパラメータとしてパスに埋め込む
5
+ // 例: /lib/system/doclib_search/q=c%E8%A8%80%E8%AA%9E/
6
+ const SEARCH_URL = `${BASE_URL}/lib/system/doclib_search`;
7
+ const PUBLISHER = "CQ出版社";
8
+ // PDFに購入者情報の電子透かしを埋め込む(2017年導入)。標準PDFビューアで閲覧可・技術的制限なし
9
+ const STORE_NAME = "CQ出版 Tech Village";
10
+ const STORE_DRM = "social";
11
+ /** "信頼性&再利用性を高めるC言語プログラミング【PDF版】" → "...プログラミング" */
12
+ function cleanTitle(raw) {
13
+ let s = raw.trim();
14
+ // 末尾の【PDF版】【EPUB版】【電子書籍版】などの形式マーカーを除去(重複表記にも対応)
15
+ while (/【[^】]*版】\s*$/.test(s)) {
16
+ s = s.replace(/【[^】]*版】\s*$/, "").trim();
17
+ }
18
+ return s;
19
+ }
20
+ /** "2026/04/01" → "2026-04-01" */
21
+ function parseDate(text) {
22
+ const m = text.match(/(\d{4})\/(\d{1,2})\/(\d{1,2})/);
23
+ if (!m)
24
+ return undefined;
25
+ return `${m[1]}-${m[2].padStart(2, "0")}-${m[3].padStart(2, "0")}`;
26
+ }
27
+ /** "鹿取 祐二(早稲田大学) 著" → "鹿取 祐二"(所属・役割語を除去) */
28
+ function parseAuthorName(text) {
29
+ return stripAuthorRole(text.replace(/[((].*?[))]/g, "")).trim();
30
+ }
31
+ /** 商品詳細テーブルの th をキー、td 要素を値とするマップを返す */
32
+ function parseDetailTable(rows) {
33
+ const map = new Map();
34
+ for (const row of rows) {
35
+ const key = row.find("th")[0]?.text().trim();
36
+ const td = row.find("td")[0];
37
+ if (key && td)
38
+ map.set(key, td);
39
+ }
40
+ return map;
41
+ }
42
+ export const cqPublishingAdapter = {
43
+ id: "cq-publishing",
44
+ name: "CQ出版社",
45
+ baseUrl: BASE_URL,
46
+ async search(query, deps) {
47
+ const word = [query.title, query.author].filter(Boolean).join(" ");
48
+ if (!word)
49
+ return [];
50
+ const url = `${SEARCH_URL}/q=${encodeURIComponent(word)}/`;
51
+ const html = await fetchText(url, deps);
52
+ const doc = deps.parser.parse(html);
53
+ const results = [];
54
+ const limit = query.limit ?? 10;
55
+ for (const item of doc.select("ul.itemList.books04 li")) {
56
+ const linkEl = item.find(".mainTitle a")[0];
57
+ const href = linkEl?.attr("href");
58
+ if (!href)
59
+ continue;
60
+ const bookUrl = resolveUrl(BASE_URL, href);
61
+ const title = cleanTitle(linkEl.text());
62
+ if (!title)
63
+ continue;
64
+ const description = item.find(".subTitle")[0]?.text().trim() || undefined;
65
+ const priceText = item.find(".price span")[0]?.text();
66
+ const price = priceText ? parseJapanesePrice(priceText) : undefined;
67
+ const coverSrc = item.find("dt img")[0]?.attr("src");
68
+ const coverImageUrl = coverSrc ? resolveUrl(BASE_URL, coverSrc) : undefined;
69
+ results.push({
70
+ title,
71
+ authors: [],
72
+ publisher: PUBLISHER,
73
+ url: bookUrl,
74
+ price,
75
+ coverImageUrl,
76
+ description,
77
+ ebookStores: [{ name: STORE_NAME, url: bookUrl, drm: STORE_DRM }],
78
+ });
79
+ if (results.length >= limit)
80
+ break;
81
+ }
82
+ return results;
83
+ },
84
+ async getDetail(url, deps) {
85
+ const html = await fetchText(url, deps);
86
+ const doc = deps.parser.parse(html);
87
+ const title = cleanTitle(doc.selectOne(".itemTitleWrapper h2")?.text() ?? "");
88
+ const table = parseDetailTable(doc.select("table[summary='商品詳細'] tr"));
89
+ const authorTd = table.get("著者");
90
+ let authors = [];
91
+ if (authorTd) {
92
+ const links = authorTd.find("a");
93
+ const raw = links.length > 0
94
+ ? links.map(el => el.text())
95
+ : authorTd.text().split(/[,,、//]/);
96
+ authors = raw.map(parseAuthorName).filter(Boolean);
97
+ }
98
+ const priceText = table.get("価格(ライセンス料金)")?.text();
99
+ const price = priceText ? parseJapanesePrice(priceText) : undefined;
100
+ const publishedAt = parseDate(table.get("発行日")?.text() ?? "");
101
+ const publisher = table.get("発行元")?.text().trim() || PUBLISHER;
102
+ const description = doc.selectOne("#commentaryArea")?.text().trim() ||
103
+ doc.selectOne(".itemTitleWrapper p")?.text().trim() ||
104
+ undefined;
105
+ const coverSrc = doc.selectOne("#itemPicArea img")?.attr("src");
106
+ const coverImageUrl = coverSrc ? resolveUrl(BASE_URL, coverSrc) : undefined;
107
+ return {
108
+ title,
109
+ authors,
110
+ publisher,
111
+ url,
112
+ price,
113
+ publishedAt,
114
+ coverImageUrl,
115
+ description,
116
+ ebookStores: [{ name: STORE_NAME, url, drm: STORE_DRM }],
117
+ };
118
+ },
119
+ };
120
+ //# sourceMappingURL=cq-publishing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cq-publishing.js","sourceRoot":"","sources":["../../../src/adapters/publishers/cq-publishing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PublisherAdapter } from "../../domain/publisher.js";
2
+ export declare function makeGoogleBooksAdapter(apiKey?: string): PublisherAdapter;
3
+ export declare const googleBooksAdapter: PublisherAdapter;
4
+ //# sourceMappingURL=google-books.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-books.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/google-books.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AAgEjF,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA4CxE;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAA2C,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { fetchText } from "./base.js";
2
+ const API_BASE = "https://www.googleapis.com/books/v1";
3
+ const INFO_BASE = "https://books.google.com";
4
+ function toHttps(url) {
5
+ return url.replace(/^http:\/\//, "https://");
6
+ }
7
+ function parsePublishedDate(raw) {
8
+ const parts = raw.split("-");
9
+ if (parts.length >= 3)
10
+ return raw.slice(0, 10);
11
+ if (parts.length === 2)
12
+ return `${parts[0]}-${parts[1]}-01`;
13
+ return `${parts[0]}-01-01`;
14
+ }
15
+ function volumeToBookRecord(vol) {
16
+ const info = vol.volumeInfo;
17
+ const isbn13 = info.industryIdentifiers?.find(id => id.type === "ISBN_13")?.identifier;
18
+ const price = vol.saleInfo?.listPrice?.currencyCode === "JPY"
19
+ ? Math.round(vol.saleInfo.listPrice.amount)
20
+ : undefined;
21
+ const url = toHttps(info.infoLink ?? `${INFO_BASE}/books?id=${vol.id}`);
22
+ return {
23
+ title: info.title,
24
+ authors: info.authors ?? [],
25
+ publisher: info.publisher ?? "",
26
+ publishedAt: info.publishedDate ? parsePublishedDate(info.publishedDate) : undefined,
27
+ language: info.language,
28
+ isbn: isbn13,
29
+ url,
30
+ price,
31
+ coverImageUrl: info.imageLinks?.thumbnail ? toHttps(info.imageLinks.thumbnail) : undefined,
32
+ description: info.description,
33
+ };
34
+ }
35
+ export function makeGoogleBooksAdapter(apiKey) {
36
+ // env アクセスはメソッド呼び出し時に遅延評価する。
37
+ // モジュールロード時に読むと Deno が --allow-env なしで権限エラーになる。
38
+ const resolveKey = () => apiKey ?? process.env.GOOGLE_BOOKS_API_KEY ?? "";
39
+ return {
40
+ id: "google-books",
41
+ name: "Google Books",
42
+ baseUrl: INFO_BASE,
43
+ async search(query, deps) {
44
+ const key = resolveKey();
45
+ if (!key)
46
+ return [];
47
+ const word = [query.title, query.author].filter(Boolean).join(" ");
48
+ if (!word)
49
+ return [];
50
+ const limit = Math.min(query.limit ?? 10, 40);
51
+ const params = new URLSearchParams({
52
+ q: word,
53
+ langRestrict: "ja",
54
+ maxResults: String(limit),
55
+ key,
56
+ });
57
+ const text = await fetchText(`${API_BASE}/volumes?${params}`, deps);
58
+ const data = JSON.parse(text);
59
+ return (data.items ?? []).map(volumeToBookRecord);
60
+ },
61
+ async getDetail(url, deps) {
62
+ const key = resolveKey();
63
+ if (!key)
64
+ throw new Error("GOOGLE_BOOKS_API_KEY が設定されていません");
65
+ const idMatch = url.match(/[?&]id=([^&]+)/);
66
+ if (!idMatch)
67
+ throw new Error(`URLからボリュームIDを取得できません: ${url}`);
68
+ const volumeId = idMatch[1];
69
+ const text = await fetchText(`${API_BASE}/volumes/${volumeId}?key=${key}`, deps);
70
+ const vol = JSON.parse(text);
71
+ return volumeToBookRecord(vol);
72
+ },
73
+ };
74
+ }
75
+ export const googleBooksAdapter = makeGoogleBooksAdapter();
76
+ //# sourceMappingURL=google-books.js.map