@zonuexe/techbook-mcp 0.4.0 → 0.5.0
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 +25 -1
- package/dist/adapters/openbd.d.ts.map +1 -1
- package/dist/adapters/openbd.js +27 -8
- package/dist/adapters/openbd.js.map +1 -1
- package/dist/application/resolve-book.d.ts +12 -6
- package/dist/application/resolve-book.d.ts.map +1 -1
- package/dist/application/resolve-book.js +63 -37
- package/dist/application/resolve-book.js.map +1 -1
- package/dist/domain/book.d.ts +2 -0
- package/dist/domain/book.d.ts.map +1 -1
- package/dist/domain/title.d.ts +20 -0
- package/dist/domain/title.d.ts.map +1 -0
- package/dist/domain/title.js +36 -0
- package/dist/domain/title.js.map +1 -0
- package/dist/main.js +0 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +9 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +7 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/design-doc.md +33 -1
- package/package.json +11 -10
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.5.0] - 2026-06-21
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `BookRecord` に `subtitle`(副題)・`alternativeTitle`(並列タイトル・別言語タイトル) を追加。openBD の ISBD 表記書名(`本タイトル = 並列タイトル : 副題`)を構造化し、`" : "` を副題、`" = "` を並列タイトルとして分離する
|
|
15
|
+
- `resolve_book` / `resolve_books` の `validation` に `isbnMatches`(要求 ISBN と返却 ISBN の一致)を追加し、`book` がある限り取得元(source)に依存せず常に付与するようにした。評価できない項目は `null` で明示する(呼び出し側が統一的にパースできる)
|
|
16
|
+
- openBD の発行日が月精度(`YYYYMM`)の場合も `publishedAt` を `YYYY-MM-01` 形式で返すようにした
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- `validation.editionDiffers` は ISBN が一致しているとき常に `false` を返すようにした(ISBN で版が確定するため。書名表記の差は `titleExact` で表す)
|
|
21
|
+
- `resolve_book` / `resolve_books` の検索経路で返す `book` から、トップレベルと重複していた `matchScore` を除去した(`matchScore` はトップレベルのみ)
|
|
22
|
+
- スクレイピング由来の改行・連続空白が書名に混入していたのを、出力時に単一スペースへ畳むようにした
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- `resolve_book` / `resolve_books` で、ISBN を指定したのに解決できず書名検索へフォールバックした際、要求と異なる版(別 ISBN)を `confidence: high` のまま黙って返していた問題を修正。要求 ISBN と一致しない場合は `confidence` を下げ、`validation.isbnMatches: false` と `reason` で警告する
|
|
27
|
+
- openBD 由来の著者が、生年つきの図書館見出し形式(`姓, 名, 1983-`)のまま返ることがあった問題を修正(`姓 名` に整形し生年を除去)
|
|
28
|
+
|
|
29
|
+
### Security
|
|
30
|
+
|
|
31
|
+
- 推移的依存(cheerio 経由の undici、`@modelcontextprotocol/sdk` 経由の hono)の既知の脆弱性を解消(`npm audit` 0 件)
|
|
32
|
+
|
|
10
33
|
## [0.4.0] - 2026-06-03
|
|
11
34
|
|
|
12
35
|
### Added
|
|
@@ -131,7 +154,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
131
154
|
|
|
132
155
|
- テストを vitest から `node:test` + `node:assert` に移行(Node.js・Bun・Deno で共通実行可能に)
|
|
133
156
|
|
|
134
|
-
[Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.
|
|
157
|
+
[Unreleased]: https://github.com/zonuexe/techbook-mcp/compare/v0.5.0...HEAD
|
|
158
|
+
[0.5.0]: https://github.com/zonuexe/techbook-mcp/compare/v0.4.0...v0.5.0
|
|
135
159
|
[0.4.0]: https://github.com/zonuexe/techbook-mcp/compare/v0.3.3...v0.4.0
|
|
136
160
|
[0.3.3]: https://github.com/zonuexe/techbook-mcp/compare/v0.3.2...v0.3.3
|
|
137
161
|
[0.3.2]: https://github.com/zonuexe/techbook-mcp/compare/v0.3.1...v0.3.2
|
|
@@ -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,EAAgC,MAAM,mBAAmB,CAAC;
|
|
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,EAAgC,MAAM,mBAAmB,CAAC;AA+ElF,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,UAAU,iBAAiB;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE;QACJ,iBAAiB,CAAC,EAAE;YAClB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;SACnC,CAAC;QACF,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;AA0CD;;;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,CAqBtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAajF"}
|
package/dist/adapters/openbd.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { fetchText, stripAuthorRole } from "./publishers/base.js";
|
|
2
2
|
import { dedupeAuthors } from "../domain/authors.js";
|
|
3
|
+
import { parseBibliographicTitle } from "../domain/title.js";
|
|
3
4
|
/**
|
|
4
5
|
* openBD の summary.author("結城浩/著、北原かな/訳" 等)を著者名配列に分解する。
|
|
5
6
|
* 区切りで分割し、役割語(著・訳など)を除去して重複を除く。
|
|
@@ -23,19 +24,23 @@ const ONIX_ROLE_MAP = {
|
|
|
23
24
|
B13: "supervisor", // 監修相当
|
|
24
25
|
};
|
|
25
26
|
/**
|
|
26
|
-
* ONIX PersonName.content
|
|
27
|
+
* ONIX PersonName.content を表示名に整形する。
|
|
28
|
+
*
|
|
29
|
+
* 図書館見出し形式 "姓, 名" および生年つきの "姓, 名, 1983-" に対応する
|
|
30
|
+
* (後者はカンマ3分割になるため、先頭2要素=姓名のみ採用し生年は捨てる)。
|
|
27
31
|
* 西洋名(ASCII)は "First Last" に入れ替え、和名は "姓 名" にする。
|
|
32
|
+
* カンマを含まない(既に表示名の)場合はそのまま空白を畳んで返す。
|
|
28
33
|
*/
|
|
29
34
|
function formatPersonName(content) {
|
|
30
35
|
const name = content.trim();
|
|
31
36
|
if (!name)
|
|
32
37
|
return "";
|
|
33
38
|
const parts = name.split(/,\s*/);
|
|
34
|
-
if (parts.length
|
|
39
|
+
if (parts.length < 2)
|
|
35
40
|
return name.replace(/\s+/g, " ");
|
|
36
|
-
const [last, first] = parts;
|
|
41
|
+
const [last, first] = parts; // 3要素目以降(生年・没年)は無視
|
|
37
42
|
// eslint-disable-next-line no-control-regex
|
|
38
|
-
const isAscii = /^[\x00-\x7F]+$/.test(
|
|
43
|
+
const isAscii = /^[\x00-\x7F]+$/.test(`${last}${first}`);
|
|
39
44
|
return isAscii ? `${first} ${last}` : `${last} ${first}`;
|
|
40
45
|
}
|
|
41
46
|
/**
|
|
@@ -67,10 +72,20 @@ function authorsFromEntry(entry) {
|
|
|
67
72
|
}
|
|
68
73
|
const OPENBD_API_URL = "https://api.openbd.jp/v1/get";
|
|
69
74
|
// --- ユーティリティ ---
|
|
75
|
+
/**
|
|
76
|
+
* openBD の pubdate("YYYYMMDD" / "YYYYMM" / "YYYY")を "YYYY-MM-DD" に正規化する。
|
|
77
|
+
* 月精度(6桁)は月初 "-01" を補う(personal-media アダプタと同方針)。
|
|
78
|
+
* 年精度(4桁)以下は日付として確定できないため undefined を返す。
|
|
79
|
+
*/
|
|
70
80
|
function parsePubDate(pubdate) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
81
|
+
const digits = (pubdate ?? "").replace(/\D/g, "");
|
|
82
|
+
if (digits.length >= 8) {
|
|
83
|
+
return `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`;
|
|
84
|
+
}
|
|
85
|
+
if (digits.length === 6) {
|
|
86
|
+
return `${digits.slice(0, 4)}-${digits.slice(4, 6)}-01`;
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
74
89
|
}
|
|
75
90
|
function findTextByType(entry, ...types) {
|
|
76
91
|
const texts = entry.onix.CollateralDetail?.TextContent;
|
|
@@ -123,8 +138,12 @@ export function openBDEntryToBookRecord(entry) {
|
|
|
123
138
|
const { summary } = entry;
|
|
124
139
|
const storelink = entry.hanmoto?.storelink;
|
|
125
140
|
const contributors = parseContributors(entry);
|
|
141
|
+
// ISBD 区切り(" = 並列タイトル" / " : 副題")を構造化し、生改行・連続空白を畳む
|
|
142
|
+
const { title, subtitle, alternativeTitle } = parseBibliographicTitle(summary.title);
|
|
126
143
|
return {
|
|
127
|
-
title
|
|
144
|
+
title,
|
|
145
|
+
subtitle,
|
|
146
|
+
alternativeTitle,
|
|
128
147
|
authors: authorsFromEntry(entry),
|
|
129
148
|
contributors: contributors.length > 0 ? contributors : undefined,
|
|
130
149
|
publisher: summary.publisher,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openbd.js","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"openbd.js","sourceRoot":"","sources":["../../src/adapters/openbd.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,17 +27,23 @@ export interface ResolveResult {
|
|
|
27
27
|
/** 取得元 */
|
|
28
28
|
source: ResolveSource;
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
30
|
+
* 与えられた手がかり(ISBN / title)と返却した本の照合結果。
|
|
31
|
+
* book !== null(matched / ambiguous)なら必ず付与する(source に依存しない)。
|
|
32
|
+
* 評価できない項目は null で明示する(ISBN 未指定なら isbnMatches=null、title 未指定なら title 系=null)。
|
|
33
|
+
* - isbnMatches: 要求ISBN と返却 book.isbn が一致するか(ISBN 未指定時 null)。
|
|
34
|
+
* false は「要求ISBNは見つからず、書名一致で代替候補を返している」警告。
|
|
35
|
+
* - isbnTitleAgree: 同一作品とみなせるか(版違いでも true)
|
|
32
36
|
* - titleExact: 版表記も含めて完全一致か
|
|
33
37
|
* - sameWork: 同一作品らしさ 0..1(版表記を畳んで照合)
|
|
34
|
-
* - editionDiffers:
|
|
38
|
+
* - editionDiffers: 同一作品だが版表記が異なる(版が違う可能性)。
|
|
39
|
+
* ISBN が一致しているときは版が確定するため常に false。
|
|
35
40
|
* sameWork が低い(≈0)かつ titleExact=false は「誤ISBN(別作品)」の疑い。
|
|
36
41
|
*/
|
|
37
42
|
validation?: {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
isbnMatches: boolean | null;
|
|
44
|
+
isbnTitleAgree: boolean | null;
|
|
45
|
+
titleExact: boolean | null;
|
|
46
|
+
sameWork: number | null;
|
|
41
47
|
editionDiffers: boolean;
|
|
42
48
|
};
|
|
43
49
|
/** ambiguous のとき上位候補を返す */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-book.d.ts","sourceRoot":"","sources":["../../src/application/resolve-book.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKvE;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,MAAM,EAAE,aAAa,CAAC;IACtB,iDAAiD;IACjD,UAAU,EAAE,iBAAiB,CAAC;IAC9B,gCAAgC;IAChC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU;IACV,MAAM,EAAE,aAAa,CAAC;IACtB
|
|
1
|
+
{"version":3,"file":"resolve-book.d.ts","sourceRoot":"","sources":["../../src/application/resolve-book.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKvE;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,MAAM,EAAE,aAAa,CAAC;IACtB,iDAAiD;IACjD,UAAU,EAAE,iBAAiB,CAAC;IAC9B,gCAAgC;IAChC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU;IACV,MAAM,EAAE,aAAa,CAAC;IACtB;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;QAC5B,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;QAC/B,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,2BAA2B;IAC3B,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1B,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,aAAa,CAAC,CA4FxB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkB1B"}
|
|
@@ -21,6 +21,42 @@ function scoreToConfidence(score) {
|
|
|
21
21
|
return "medium";
|
|
22
22
|
return "low";
|
|
23
23
|
}
|
|
24
|
+
/** ISBN を比較用に正規化(ハイフン除去)。未指定なら undefined */
|
|
25
|
+
function normalizeIsbn(isbn) {
|
|
26
|
+
return isbn ? isbn.replace(/-/g, "") : undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 手がかり(要求ISBN・クエリ書名)と返却した本の照合結果を組み立てる。
|
|
30
|
+
* 評価できない項目は null。ISBN が一致するときは版が確定するため editionDiffers=false。
|
|
31
|
+
*/
|
|
32
|
+
function buildValidation(reqIsbn, queryTitle, book) {
|
|
33
|
+
const bookIsbn = normalizeIsbn(book.isbn);
|
|
34
|
+
const isbnMatches = reqIsbn === undefined ? null : bookIsbn !== undefined && bookIsbn === reqIsbn;
|
|
35
|
+
if (!queryTitle) {
|
|
36
|
+
return { isbnMatches, isbnTitleAgree: null, titleExact: null, sameWork: null, editionDiffers: false };
|
|
37
|
+
}
|
|
38
|
+
const same = sameWorkScore(queryTitle, book.title);
|
|
39
|
+
const exact = titlesExactMatch(queryTitle, book.title);
|
|
40
|
+
const agree = same >= SAME_WORK_THRESHOLD;
|
|
41
|
+
// 版マーカーが実在し、かつ ISBN で版が確定していないときだけ「版違い」とする
|
|
42
|
+
const editionDiffers = isbnMatches !== true &&
|
|
43
|
+
agree &&
|
|
44
|
+
!exact &&
|
|
45
|
+
(hasEditionMarker(queryTitle) || hasEditionMarker(book.title));
|
|
46
|
+
return {
|
|
47
|
+
isbnMatches,
|
|
48
|
+
isbnTitleAgree: agree,
|
|
49
|
+
titleExact: exact,
|
|
50
|
+
sameWork: round3(same),
|
|
51
|
+
editionDiffers,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** ScoredBook の matchScore を落として素の BookRecord にする(top-level matchScore と重複させない) */
|
|
55
|
+
function stripScore(book) {
|
|
56
|
+
const rest = { ...book };
|
|
57
|
+
delete rest.matchScore;
|
|
58
|
+
return rest;
|
|
59
|
+
}
|
|
24
60
|
/**
|
|
25
61
|
* 手がかり(ISBN / 書名 / 著者)から正規の1冊を確信度つきで同定する。
|
|
26
62
|
*
|
|
@@ -32,33 +68,22 @@ function scoreToConfidence(score) {
|
|
|
32
68
|
export async function resolveBook(query, publishers, deps) {
|
|
33
69
|
const isbn = query.isbn?.trim();
|
|
34
70
|
const hasTextQuery = Boolean(query.title || query.author);
|
|
35
|
-
|
|
71
|
+
// 検索フォールバック時にも要求ISBNと照合できるよう、正規化済みISBNを保持する
|
|
72
|
+
const reqIsbn = isbn && looksLikeIsbn(isbn) ? normalizeIsbn(isbn) : undefined;
|
|
73
|
+
if (reqIsbn !== undefined) {
|
|
36
74
|
const resolved = await resolveByIsbn(isbn, publishers, deps);
|
|
37
75
|
if (resolved) {
|
|
38
76
|
const { book, source } = resolved;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
book,
|
|
50
|
-
matchScore: round3(titleMatchScore(query.title, book.title)),
|
|
51
|
-
source,
|
|
52
|
-
validation: {
|
|
53
|
-
isbnTitleAgree: agree,
|
|
54
|
-
titleExact: exact,
|
|
55
|
-
sameWork: round3(same),
|
|
56
|
-
editionDiffers,
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
// ISBN は完全一致=正準。照合する title が無ければ高確信
|
|
61
|
-
return { status: "matched", confidence: "high", book, matchScore: 1, source };
|
|
77
|
+
const validation = buildValidation(reqIsbn, query.title, book);
|
|
78
|
+
return {
|
|
79
|
+
status: "matched",
|
|
80
|
+
// title があり別作品(誤ISBN疑い)なら低確信、それ以外は高確信
|
|
81
|
+
confidence: validation.isbnTitleAgree === false ? "low" : "high",
|
|
82
|
+
book,
|
|
83
|
+
matchScore: query.title ? round3(titleMatchScore(query.title, book.title)) : 1,
|
|
84
|
+
source,
|
|
85
|
+
validation,
|
|
86
|
+
};
|
|
62
87
|
}
|
|
63
88
|
// ISBN 指定だが見つからない。title/author も無ければ確定的に not_found
|
|
64
89
|
if (!hasTextQuery) {
|
|
@@ -102,27 +127,28 @@ export async function resolveBook(query, publishers, deps) {
|
|
|
102
127
|
}
|
|
103
128
|
const best = books[0];
|
|
104
129
|
const second = books[1];
|
|
105
|
-
const
|
|
130
|
+
const validation = buildValidation(reqIsbn, query.title, best);
|
|
131
|
+
// 要求ISBNがあるのに別ISBN(または欠落)の本を返す=黙った版すり替え。高確信を付けず警告する(#1)
|
|
132
|
+
const isbnFallbackMismatch = reqIsbn !== undefined && validation.isbnMatches !== true;
|
|
133
|
+
const confidence = isbnFallbackMismatch
|
|
134
|
+
? "low"
|
|
135
|
+
: scoreToConfidence(best.matchScore);
|
|
136
|
+
const reason = isbnFallbackMismatch
|
|
137
|
+
? `要求ISBN ${isbn} は解決できず、書名一致で代替候補を返しています(返却ISBN: ${best.isbn ?? "なし"})`
|
|
138
|
+
: undefined;
|
|
106
139
|
const ambiguous = second !== undefined &&
|
|
107
140
|
best.matchScore < 1 &&
|
|
108
141
|
best.matchScore >= MEDIUM_SCORE &&
|
|
109
142
|
best.matchScore - second.matchScore < AMBIGUOUS_GAP;
|
|
110
|
-
if (ambiguous) {
|
|
111
|
-
return {
|
|
112
|
-
status: "ambiguous",
|
|
113
|
-
confidence,
|
|
114
|
-
book: best,
|
|
115
|
-
matchScore: best.matchScore,
|
|
116
|
-
source: "search",
|
|
117
|
-
candidates: books.slice(0, 3),
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
143
|
return {
|
|
121
|
-
status: "matched",
|
|
144
|
+
status: ambiguous ? "ambiguous" : "matched",
|
|
122
145
|
confidence,
|
|
123
|
-
book: best,
|
|
146
|
+
book: stripScore(best),
|
|
124
147
|
matchScore: best.matchScore,
|
|
125
148
|
source: "search",
|
|
149
|
+
validation,
|
|
150
|
+
...(ambiguous ? { candidates: books.slice(0, 3) } : {}),
|
|
151
|
+
...(reason ? { reason } : {}),
|
|
126
152
|
};
|
|
127
153
|
}
|
|
128
154
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-book.js","sourceRoot":"","sources":["../../src/application/resolve-book.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAmB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-book.js","sourceRoot":"","sources":["../../src/application/resolve-book.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/book.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../src/domain/book.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,KAAK,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;CACd;AAED,uDAAuD;AACvD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../src/domain/book.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,KAAK,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;CACd;AAED,uDAAuD;AACvD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 連続する空白(改行・タブを含む)を単一スペースに畳み、前後の空白を除去する。
|
|
3
|
+
* スクレイピング由来の生改行("図解即戦力\nWeb技術…")が出力に漏れるのを防ぐ。
|
|
4
|
+
*/
|
|
5
|
+
export declare function collapseWhitespace(text: string): string;
|
|
6
|
+
export interface ParsedTitle {
|
|
7
|
+
title: string;
|
|
8
|
+
subtitle?: string;
|
|
9
|
+
alternativeTitle?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 図書館・JPRO/ONIX 由来の書名表記(ISBD 区切り)を構造化する。
|
|
13
|
+
*
|
|
14
|
+
* openBD の `summary.title` は "本タイトル = 並列タイトル : 副題" の形を取ることがある。
|
|
15
|
+
* ISBD の出現順に従い、先に " : "(副題)、続いて " = "(並列タイトル)を分離する。
|
|
16
|
+
* 区切りはいずれも前後にスペースを伴うもののみを対象とし、"OAuth 2.0" のような
|
|
17
|
+
* 書名内のコロン・等号は誤分割しない。区切りが無ければ `title` のみを返す。空白は畳む。
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseBibliographicTitle(raw: string): ParsedTitle;
|
|
20
|
+
//# sourceMappingURL=title.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"title.d.ts","sourceRoot":"","sources":["../../src/domain/title.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAsBhE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 連続する空白(改行・タブを含む)を単一スペースに畳み、前後の空白を除去する。
|
|
3
|
+
* スクレイピング由来の生改行("図解即戦力\nWeb技術…")が出力に漏れるのを防ぐ。
|
|
4
|
+
*/
|
|
5
|
+
export function collapseWhitespace(text) {
|
|
6
|
+
return text.replace(/\s+/g, " ").trim();
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 図書館・JPRO/ONIX 由来の書名表記(ISBD 区切り)を構造化する。
|
|
10
|
+
*
|
|
11
|
+
* openBD の `summary.title` は "本タイトル = 並列タイトル : 副題" の形を取ることがある。
|
|
12
|
+
* ISBD の出現順に従い、先に " : "(副題)、続いて " = "(並列タイトル)を分離する。
|
|
13
|
+
* 区切りはいずれも前後にスペースを伴うもののみを対象とし、"OAuth 2.0" のような
|
|
14
|
+
* 書名内のコロン・等号は誤分割しない。区切りが無ければ `title` のみを返す。空白は畳む。
|
|
15
|
+
*/
|
|
16
|
+
export function parseBibliographicTitle(raw) {
|
|
17
|
+
let main = collapseWhitespace(raw);
|
|
18
|
+
let subtitle;
|
|
19
|
+
const colonIdx = main.indexOf(" : ");
|
|
20
|
+
if (colonIdx >= 0) {
|
|
21
|
+
subtitle = main.slice(colonIdx + 3).trim() || undefined;
|
|
22
|
+
main = main.slice(0, colonIdx).trim();
|
|
23
|
+
}
|
|
24
|
+
let alternativeTitle;
|
|
25
|
+
const eqIdx = main.indexOf(" = ");
|
|
26
|
+
if (eqIdx >= 0) {
|
|
27
|
+
alternativeTitle = main.slice(eqIdx + 3).trim() || undefined;
|
|
28
|
+
main = main.slice(0, eqIdx).trim();
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
title: main,
|
|
32
|
+
...(subtitle ? { subtitle } : {}),
|
|
33
|
+
...(alternativeTitle ? { alternativeTitle } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=title.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"title.js","sourceRoot":"","sources":["../../src/domain/title.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAQD;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,QAA4B,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QACxD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,gBAAoC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QAC7D,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;AACJ,CAAC"}
|
package/dist/main.js
CHANGED
|
File without changes
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
2
|
import type { PublisherAdapter, PublisherDeps } from "../domain/publisher.js";
|
|
3
|
+
import type { BookRecord } from "../domain/book.js";
|
|
3
4
|
import type { SearchError } from "../application/search-books.js";
|
|
5
|
+
export declare function formatBook(book: BookRecord): Record<string, unknown>;
|
|
4
6
|
/**
|
|
5
7
|
* 出版社ごとのエラーを種別でまとめて静音化する。
|
|
6
8
|
* 18社横断で大量に並ぶ errors を、種別×対象出版社の数件に集約する。
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAMnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAMnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAoC,MAAM,mBAAmB,CAAC;AAEtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAuBlE,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMpE;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAahF;AAsBD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,IAAI,EAAE,aAAa,GAClB,MAAM,CAqGR;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -6,6 +6,7 @@ import { getBookDetail } from "../application/get-book-detail.js";
|
|
|
6
6
|
import { getBookByIsbn } from "../application/get-book-by-isbn.js";
|
|
7
7
|
import { resolveBook, resolveBooks } from "../application/resolve-book.js";
|
|
8
8
|
import { looksLikeIsbn } from "../domain/isbn.js";
|
|
9
|
+
import { collapseWhitespace } from "../domain/title.js";
|
|
9
10
|
import { VERSION } from "../version.js";
|
|
10
11
|
import { TOOLS } from "./tools.js";
|
|
11
12
|
// --- 出力フォーマット ---
|
|
@@ -18,10 +19,14 @@ const DRM_LABELS = {
|
|
|
18
19
|
function formatEbookStore(store) {
|
|
19
20
|
return { ...store, drmLabel: DRM_LABELS[store.drm] };
|
|
20
21
|
}
|
|
21
|
-
function formatBook(book) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
export function formatBook(book) {
|
|
23
|
+
// スクレイピング由来の生改行・連続空白が title に残ることがあるため出力境界で畳む(全ソース統一)
|
|
24
|
+
const cleaned = { ...book, title: collapseWhitespace(book.title) };
|
|
25
|
+
if (cleaned.subtitle)
|
|
26
|
+
cleaned.subtitle = collapseWhitespace(cleaned.subtitle);
|
|
27
|
+
if (!cleaned.ebookStores)
|
|
28
|
+
return cleaned;
|
|
29
|
+
return { ...cleaned, ebookStores: cleaned.ebookStores.map(formatEbookStore) };
|
|
25
30
|
}
|
|
26
31
|
const ERROR_TYPE_LABELS = {
|
|
27
32
|
robots: "robots.txt によりアクセス禁止",
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,mBAAmB;AAEnB,MAAM,UAAU,GAA4B;IAC1C,IAAI,EAAU,QAAQ;IACtB,MAAM,EAAQ,gBAAgB;IAC9B,YAAY,EAAE,YAAY;IAC1B,GAAG,EAAW,OAAO;CACtB,CAAC;AAEF,SAAS,gBAAgB,CAAC,KAAiB;IACzC,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkIR,CAAC"}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -78,10 +78,14 @@ export const TOOLS = [
|
|
|
78
78
|
description: "手元の手がかり(ISBN・書名・著者)から正規の1冊を確信度つきで同定します。" +
|
|
79
79
|
"PDF の奥付から抽出した曖昧なメタデータを書誌レコードに解決する用途に最適です。" +
|
|
80
80
|
"isbn があれば openBD→出版社サイト→カーリルの順で解決し、title も渡すと解決結果と照合して" +
|
|
81
|
-
"版違い・誤ISBN
|
|
82
|
-
"横断検索の一致度でベストマッチを採ります。" +
|
|
81
|
+
"版違い・誤ISBN を検出します。isbn が無い/解決できない場合は横断検索の一致度でベストマッチを採ります。" +
|
|
83
82
|
"返り値: status(matched/ambiguous/not_found)・confidence(high/medium/low)・book・" +
|
|
84
|
-
"matchScore・source・候補(ambiguous
|
|
83
|
+
"matchScore・source・validation・候補(ambiguous時)・reason。confidence=high はそのまま採用、" +
|
|
84
|
+
"low/ambiguous は要確認の目安です。" +
|
|
85
|
+
"validation は book がある限り source 非依存で付与し、評価不能な項目は null で明示します: " +
|
|
86
|
+
"isbnMatches=false は『要求ISBNは見つからず書名一致で代替候補を返している』警告(このとき confidence は high になりません)。" +
|
|
87
|
+
"editionDiffers は ISBN 一致時は常に false(版が確定するため)。" +
|
|
88
|
+
"book.title は副題・並列タイトルを除いた本タイトルで、副題は book.subtitle・別言語タイトルは book.alternativeTitle に分離されます。" +
|
|
85
89
|
"isbn / title / author のいずれかは必須。",
|
|
86
90
|
inputSchema: {
|
|
87
91
|
type: "object",
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,kCAAkC;YAClC,mBAAmB;YACnB,6DAA6D;YAC7D,sCAAsC;YACtC,8CAA8C;YAC9C,gCAAgC;YAChC,wBAAwB;YACxB,kCAAkC;YAClC,qCAAqC;YACrC,mDAAmD;QACrD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,UAAU;iBACxB;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,WAAW;iBACzB;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,uCAAuC;wBACvC,mCAAmC;iBACtC;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;oBAC/C,OAAO,EAAE,EAAE;iBACZ;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,KAAK,CAAC;YACjB,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;iBACvC;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,uBAAuB;QACpC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,mBAAmB;YACnB,0CAA0C;YAC1C,mCAAmC;QACrC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,MAAM,CAAC;YAClB,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4CAA4C;iBAC1D;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,yCAAyC;YACzC,2CAA2C;YAC3C,wDAAwD;YACxD,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/docs/design-doc.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# techbook-mcp 設計書
|
|
2
2
|
|
|
3
3
|
パッケージ名: `@zonuexe/techbook-mcp`
|
|
4
|
-
ライセンス: AGPL-3.0-
|
|
4
|
+
ライセンス: AGPL-3.0-or-later
|
|
5
5
|
|
|
6
6
|
## 概要
|
|
7
7
|
|
|
@@ -62,6 +62,7 @@ techbook-mcp/
|
|
|
62
62
|
│ │ ├── book.ts # BookRecord, SearchQuery, DrmType 型定義
|
|
63
63
|
│ │ ├── publisher.ts # PublisherAdapter インターフェース (language, scale)
|
|
64
64
|
│ │ ├── text-match.ts # 照合用テキスト正規化・matchScore 算出
|
|
65
|
+
│ │ ├── title.ts # 書名の空白畳み・ISBD 副題/並列タイトル構造化
|
|
65
66
|
│ │ └── isbn.ts # ISBN 正規化・looksLikeIsbn 判定
|
|
66
67
|
│ ├── ports/
|
|
67
68
|
│ │ ├── http.ts # HttpClient インターフェース
|
|
@@ -102,6 +103,7 @@ techbook-mcp/
|
|
|
102
103
|
│ │ ├── search-books.ts # 横断検索・スケジューリング・matchScore 付与
|
|
103
104
|
│ │ ├── get-book-detail.ts
|
|
104
105
|
│ │ ├── get-book-by-isbn.ts
|
|
106
|
+
│ │ ├── resolve-book.ts # 手がかり→正規1冊の同定 (resolveBook/resolveBooks・validation)
|
|
105
107
|
│ │ └── concurrency.ts # mapWithConcurrency / withTimeout
|
|
106
108
|
│ ├── mcp/
|
|
107
109
|
│ │ ├── server.ts
|
|
@@ -364,6 +366,8 @@ type DrmType = "free" | "social" | "password_pdf" | "drm";
|
|
|
364
366
|
| `search_books` | 書名・著者名で検索 | `title?`, `author?`, `publisher?`, `limit?` |
|
|
365
367
|
| `get_book_detail` | URLから詳細情報取得 | `url` |
|
|
366
368
|
| `get_book_by_isbn` | ISBNから書誌情報取得(openBD→出版社サイト→カーリル) | `isbn` |
|
|
369
|
+
| `resolve_book` | 手がかり(ISBN/書名/著者)から正規の1冊を確信度つきで同定 | `isbn?`, `title?`, `author?`, `publisher?` |
|
|
370
|
+
| `resolve_books` | `resolve_book` のバッチ版(入力順に結果配列を返す) | `books[]` |
|
|
367
371
|
| `list_publishers` | 対応出版社一覧 | なし |
|
|
368
372
|
|
|
369
373
|
## 検索の挙動
|
|
@@ -386,6 +390,34 @@ type DrmType = "free" | "social" | "password_pdf" | "drm";
|
|
|
386
390
|
- **errors の集約**: 失敗理由を `type`(`robots` / `timeout` / `http` / `other`)に分類し、MCP 層で種別×出版社に集約して静音化する
|
|
387
391
|
- **ISBN ショートカット**: `title` が ISBN 形式(`src/domain/isbn.ts` の `looksLikeIsbn`)かつ `author` 未指定なら、
|
|
388
392
|
全社横断をやめて `get_book_by_isbn` 経路に振り分ける
|
|
393
|
+
- **書名の正規化(出力境界)**: スクレイピング由来の生改行・連続空白が `title` に残ることがあるため、
|
|
394
|
+
MCP 層 `formatBook()`(`src/mcp/server.ts`)で `collapseWhitespace()`(`src/domain/title.ts`)を全ソース統一適用する。
|
|
395
|
+
openBD の ISBD 表記書名(`"本タイトル = 並列タイトル : 副題"`)は `parseBibliographicTitle()` で構造化し、
|
|
396
|
+
`BookRecord.subtitle`(`" : "` 区切り)・`BookRecord.alternativeTitle`(`" = "` 区切り・別言語タイトル)へ分離する
|
|
397
|
+
(`openBDEntryToBookRecord` で適用。スペースを伴わない書名内のコロン等は誤分割しない)
|
|
398
|
+
|
|
399
|
+
## 同定の挙動(resolve_book / resolve_books)
|
|
400
|
+
|
|
401
|
+
`resolve_book` は Riida の `read_pdf_colophon` が抽出した曖昧な手がかり(ISBN・書名・著者)を
|
|
402
|
+
**正規の1冊へ確信度つきで解決する**ための統合ツール。`isbn` / `title` / `author` のいずれかが必須。
|
|
403
|
+
実装は `src/application/resolve-book.ts`。
|
|
404
|
+
|
|
405
|
+
- **解決経路**: `isbn` があれば `resolveByIsbn`(openBD→出版社サイト→カーリル)で解決。解決できない、
|
|
406
|
+
または ISBN が無い場合は横断検索(`searchBooks`)の `matchScore` でベストマッチを採る。
|
|
407
|
+
上位2件が拮抗(差 < `AMBIGUOUS_GAP`)なら `status="ambiguous"` で候補(`candidates`)を返す。
|
|
408
|
+
- **返り値(source 非依存で固定)**: `status`(`matched`/`ambiguous`/`not_found`)・`confidence`(`high`/`medium`/`low`)・
|
|
409
|
+
`book`(`not_found` 時 `null`)・`matchScore`・`source`・`validation`・`reason?`・`candidates?`。
|
|
410
|
+
`book` は素の `BookRecord`(top-level `matchScore` と重複させないため `ScoredBook` の `matchScore` は落とす。
|
|
411
|
+
`candidates` は候補ごとの比較に使うため `matchScore` 付きのまま)。
|
|
412
|
+
- **`validation`(`book !== null` なら常時付与・source 非依存)**: 与えた手がかりと返却本の照合結果。
|
|
413
|
+
評価できない項目は `null` で明示する(統一的にパースできるように)。
|
|
414
|
+
- `isbnMatches`: 要求ISBN と返却 `book.isbn` の一致(ISBN 未指定なら `null`)。
|
|
415
|
+
**`false` は「要求ISBNは解決できず、書名一致で代替候補を返している」警告**で、このとき `confidence` は `high` にしない(黙った版すり替えの防止)。
|
|
416
|
+
- `isbnTitleAgree` / `titleExact` / `sameWork`: 書名の同一作品らしさ(`title` 未指定なら `null`)。
|
|
417
|
+
`sameWork ≈ 0` かつ `titleExact=false` は誤ISBN(別作品)の疑い。
|
|
418
|
+
- `editionDiffers`: 同一作品だが版表記が異なる可能性。**ISBN が一致しているときは版が確定するため常に `false`**
|
|
419
|
+
(版表記の差は `titleExact=false` で表す)。
|
|
420
|
+
- **`reason`**: `not_found` の理由、または ISBN フォールバックで別ISBNを返した際の警告文(要求ISBNを明示)。
|
|
389
421
|
|
|
390
422
|
## カバレッジの制約
|
|
391
423
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zonuexe/techbook-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "MCP server for searching Japanese technical book bibliographic information",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"type": "module",
|
|
@@ -10,6 +10,13 @@
|
|
|
10
10
|
"bin": {
|
|
11
11
|
"techbook-mcp": "dist/main.js"
|
|
12
12
|
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "rm -rf dist && tsc",
|
|
15
|
+
"lint": "oxlint --config .oxlintrc.json src/",
|
|
16
|
+
"prepublishOnly": "npm run build",
|
|
17
|
+
"test": "node --import tsx/esm --test 'tests/**/*.test.ts'",
|
|
18
|
+
"test:watch": "node --import tsx/esm --test --watch 'tests/**/*.test.ts'"
|
|
19
|
+
},
|
|
13
20
|
"dependencies": {
|
|
14
21
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
15
22
|
"cheerio": "^1.2.0",
|
|
@@ -17,15 +24,9 @@
|
|
|
17
24
|
"zod": "^4.4.3"
|
|
18
25
|
},
|
|
19
26
|
"devDependencies": {
|
|
20
|
-
"@types/node": "^
|
|
21
|
-
"oxlint": "^1.
|
|
27
|
+
"@types/node": "^26.0.0",
|
|
28
|
+
"oxlint": "^1.70.0",
|
|
22
29
|
"tsx": "^4.22.4",
|
|
23
30
|
"typescript": "^6.0.3"
|
|
24
|
-
},
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "rm -rf dist && tsc",
|
|
27
|
-
"lint": "oxlint --config .oxlintrc.json src/",
|
|
28
|
-
"test": "node --import tsx/esm --test 'tests/**/*.test.ts'",
|
|
29
|
-
"test:watch": "node --import tsx/esm --test --watch 'tests/**/*.test.ts'"
|
|
30
31
|
}
|
|
31
|
-
}
|
|
32
|
+
}
|