@zonuexe/techbook-mcp 0.2.1 → 0.2.2
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.
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.2] - 2026-04-12
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- `npm publish` 前に `dist/` が自動ビルドされるよう `prepublishOnly` スクリプトを追加
|
|
15
|
+
|
|
10
16
|
## [0.2.1] - 2026-04-12
|
|
11
17
|
|
|
12
18
|
### Fixed
|
|
@@ -29,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
29
35
|
|
|
30
36
|
- テストを vitest から `node:test` + `node:assert` に移行(Node.js・Bun・Deno で共通実行可能に)
|
|
31
37
|
|
|
32
|
-
[Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.
|
|
38
|
+
[Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.2...HEAD
|
|
39
|
+
[0.2.2]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.1...v0.2.2
|
|
33
40
|
[0.2.1]: https://github.com/zonuexe/techbook-mcp/compare/v0.2.0...v0.2.1
|
|
34
41
|
[0.2.0]: https://github.com/zonuexe/techbook-mcp/releases/tag/v0.2.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tatsu-zine.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/tatsu-zine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"tatsu-zine.d.ts","sourceRoot":"","sources":["../../../src/adapters/publishers/tatsu-zine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AA2CjF,eAAO,MAAM,gBAAgB,EAAE,gBA8G9B,CAAC"}
|
|
@@ -10,6 +10,20 @@ function parseAuthors(text) {
|
|
|
10
10
|
.map(part => part.replace(/\s*[((][^))]*[))]\s*$/, "").trim())
|
|
11
11
|
.filter(Boolean);
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* ページネーションリンクから最終ページ番号を取得する。
|
|
15
|
+
* <a class="btn-pagination" href="/books?page=11">最後へ</a>
|
|
16
|
+
*/
|
|
17
|
+
function detectLastPage(doc) {
|
|
18
|
+
let max = 1;
|
|
19
|
+
for (const a of doc.select("a.btn-pagination")) {
|
|
20
|
+
const href = a.attr("href") ?? "";
|
|
21
|
+
const m = href.match(/[?&]page=(\d+)/);
|
|
22
|
+
if (m)
|
|
23
|
+
max = Math.max(max, parseInt(m[1], 10));
|
|
24
|
+
}
|
|
25
|
+
return max;
|
|
26
|
+
}
|
|
13
27
|
/**
|
|
14
28
|
* "3,300円 (3,000円+税)" → 3300
|
|
15
29
|
* 最初の数値が税込価格。
|
|
@@ -25,44 +39,53 @@ export const tatsuZineAdapter = {
|
|
|
25
39
|
name: "達人出版会",
|
|
26
40
|
baseUrl: BASE_URL,
|
|
27
41
|
async search(query, deps) {
|
|
28
|
-
|
|
29
|
-
|
|
42
|
+
// 検索APIがないため書籍一覧からローカルフィルタリングする
|
|
43
|
+
// 著者のみの検索は非対応
|
|
44
|
+
if (!query.title)
|
|
30
45
|
return [];
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// <p>Author(著), ...</p>
|
|
39
|
-
//
|
|
40
|
-
// タイトルリンクと著者段落を位置で対応付ける
|
|
41
|
-
const titleLinks = doc.select("h3 a[href]").filter(a => {
|
|
42
|
-
const href = a.attr("href") ?? "";
|
|
43
|
-
return href.startsWith("/books/") && !href.startsWith("/books/pub/");
|
|
44
|
-
});
|
|
45
|
-
const authorParagraphs = doc.select("h3 + p");
|
|
46
|
+
const titleKeyword = query.title.toLowerCase();
|
|
47
|
+
const authorKeyword = query.author?.toLowerCase();
|
|
48
|
+
const limit = query.limit ?? 10;
|
|
49
|
+
// 書籍一覧ページ: <article class="book"> が各書籍アイテム、ページネーションあり
|
|
50
|
+
const firstHtml = await fetchText(`${BASE_URL}/books/`, deps);
|
|
51
|
+
const firstDoc = deps.parser.parse(firstHtml);
|
|
52
|
+
const lastPage = detectLastPage(firstDoc);
|
|
46
53
|
const results = [];
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
54
|
+
const docs = [[firstHtml, firstDoc]];
|
|
55
|
+
// ページ2以降を先行して取得しておく(キャッシュ経由)
|
|
56
|
+
for (let page = 2; page <= lastPage; page++) {
|
|
57
|
+
const html = await fetchText(`${BASE_URL}/books?page=${page}`, deps);
|
|
58
|
+
docs.push([html, deps.parser.parse(html)]);
|
|
59
|
+
}
|
|
60
|
+
outer: for (const [, doc] of docs) {
|
|
61
|
+
for (const article of doc.select("article.book")) {
|
|
62
|
+
const titleEl = article.find("h3[itemprop='name'] a")[0];
|
|
63
|
+
if (!titleEl)
|
|
64
|
+
continue;
|
|
65
|
+
const title = titleEl.text().trim();
|
|
66
|
+
if (!title.toLowerCase().includes(titleKeyword))
|
|
67
|
+
continue;
|
|
68
|
+
const authorText = article.find("p[itemprop='author']")[0]?.text().trim() ?? "";
|
|
69
|
+
if (authorKeyword && !authorText.toLowerCase().includes(authorKeyword))
|
|
70
|
+
continue;
|
|
71
|
+
const href = titleEl.attr("href");
|
|
72
|
+
if (!href)
|
|
73
|
+
continue;
|
|
74
|
+
const bookUrl = resolveUrl(BASE_URL, href);
|
|
75
|
+
const authors = authorText ? parseAuthors(authorText) : [];
|
|
76
|
+
results.push({
|
|
77
|
+
title,
|
|
78
|
+
authors,
|
|
79
|
+
publisher: "達人出版会",
|
|
80
|
+
url: bookUrl,
|
|
81
|
+
// 達人出版会は全書籍で購入者情報を各ページに印字 (ソーシャルDRM)
|
|
82
|
+
ebookStores: [{ name: "達人出版会", url: bookUrl, drm: "social" }],
|
|
83
|
+
});
|
|
84
|
+
if (results.length >= limit)
|
|
85
|
+
break outer;
|
|
86
|
+
}
|
|
64
87
|
}
|
|
65
|
-
return results
|
|
88
|
+
return results;
|
|
66
89
|
},
|
|
67
90
|
async getDetail(url, deps) {
|
|
68
91
|
const html = await fetchText(url, deps);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tatsu-zine.js","sourceRoot":"","sources":["../../../src/adapters/publishers/tatsu-zine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tatsu-zine.js","sourceRoot":"","sources":["../../../src/adapters/publishers/tatsu-zine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zonuexe/techbook-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "MCP server for searching Japanese technical book bibliographic information",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"type": "module",
|
|
@@ -8,11 +8,12 @@
|
|
|
8
8
|
".": "./dist/main.js"
|
|
9
9
|
},
|
|
10
10
|
"bin": {
|
|
11
|
-
"techbook-mcp": "
|
|
11
|
+
"techbook-mcp": "dist/main.js"
|
|
12
12
|
},
|
|
13
13
|
"scripts": {
|
|
14
14
|
"build": "tsc",
|
|
15
15
|
"lint": "oxlint --config .oxlintrc.json src/",
|
|
16
|
+
"prepublishOnly": "npm run build",
|
|
16
17
|
"test": "node --import tsx/esm --test 'tests/**/*.test.ts'",
|
|
17
18
|
"test:watch": "node --import tsx/esm --test --watch 'tests/**/*.test.ts'"
|
|
18
19
|
},
|