@zonuexe/techbook-mcp 0.3.3 → 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 +44 -1
- package/dist/adapters/openbd.d.ts +11 -0
- package/dist/adapters/openbd.d.ts.map +1 -1
- package/dist/adapters/openbd.js +82 -6
- package/dist/adapters/openbd.js.map +1 -1
- package/dist/adapters/publishers/base.d.ts +5 -0
- package/dist/adapters/publishers/base.d.ts.map +1 -1
- package/dist/adapters/publishers/base.js +20 -2
- package/dist/adapters/publishers/base.js.map +1 -1
- package/dist/adapters/publishers/gihyo.d.ts.map +1 -1
- package/dist/adapters/publishers/gihyo.js +14 -10
- package/dist/adapters/publishers/gihyo.js.map +1 -1
- package/dist/adapters/publishers/manatee.d.ts.map +1 -1
- package/dist/adapters/publishers/manatee.js +17 -1
- package/dist/adapters/publishers/manatee.js.map +1 -1
- package/dist/application/get-book-by-isbn.d.ts.map +1 -1
- package/dist/application/get-book-by-isbn.js +2 -1
- package/dist/application/get-book-by-isbn.js.map +1 -1
- package/dist/application/get-book-detail.d.ts.map +1 -1
- package/dist/application/get-book-detail.js +2 -1
- package/dist/application/get-book-detail.js.map +1 -1
- package/dist/application/resolve-book.d.ts +18 -2
- package/dist/application/resolve-book.d.ts.map +1 -1
- package/dist/application/resolve-book.js +66 -31
- package/dist/application/resolve-book.js.map +1 -1
- package/dist/application/search-books.d.ts.map +1 -1
- package/dist/application/search-books.js +3 -1
- package/dist/application/search-books.js.map +1 -1
- package/dist/domain/book.d.ts +9 -0
- package/dist/domain/book.d.ts.map +1 -1
- package/dist/domain/text-match.d.ts +12 -0
- package/dist/domain/text-match.d.ts.map +1 -1
- package/dist/domain/text-match.js +30 -0
- package/dist/domain/text-match.js.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
|
@@ -2,9 +2,9 @@ import { searchBooks } from "./search-books.js";
|
|
|
2
2
|
import { resolveByIsbn } from "./get-book-by-isbn.js";
|
|
3
3
|
import { mapWithConcurrency } from "./concurrency.js";
|
|
4
4
|
import { looksLikeIsbn } from "../domain/isbn.js";
|
|
5
|
-
import { titleMatchScore } from "../domain/text-match.js";
|
|
6
|
-
/** title が ISBN
|
|
7
|
-
const
|
|
5
|
+
import { titleMatchScore, sameWorkScore, titlesExactMatch, hasEditionMarker } from "../domain/text-match.js";
|
|
6
|
+
/** title が ISBN 解決結果と同一作品とみなす最小 sameWork スコア */
|
|
7
|
+
const SAME_WORK_THRESHOLD = 0.5;
|
|
8
8
|
/** confidence: high とみなす最小 matchScore */
|
|
9
9
|
const HIGH_SCORE = 0.9;
|
|
10
10
|
/** confidence: medium とみなす最小 matchScore */
|
|
@@ -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,24 +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
|
-
};
|
|
50
|
-
}
|
|
51
|
-
// ISBN は完全一致=正準。照合する title が無ければ高確信
|
|
52
|
-
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
|
+
};
|
|
53
87
|
}
|
|
54
88
|
// ISBN 指定だが見つからない。title/author も無ければ確定的に not_found
|
|
55
89
|
if (!hasTextQuery) {
|
|
@@ -93,27 +127,28 @@ export async function resolveBook(query, publishers, deps) {
|
|
|
93
127
|
}
|
|
94
128
|
const best = books[0];
|
|
95
129
|
const second = books[1];
|
|
96
|
-
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;
|
|
97
139
|
const ambiguous = second !== undefined &&
|
|
98
140
|
best.matchScore < 1 &&
|
|
99
141
|
best.matchScore >= MEDIUM_SCORE &&
|
|
100
142
|
best.matchScore - second.matchScore < AMBIGUOUS_GAP;
|
|
101
|
-
if (ambiguous) {
|
|
102
|
-
return {
|
|
103
|
-
status: "ambiguous",
|
|
104
|
-
confidence,
|
|
105
|
-
book: best,
|
|
106
|
-
matchScore: best.matchScore,
|
|
107
|
-
source: "search",
|
|
108
|
-
candidates: books.slice(0, 3),
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
143
|
return {
|
|
112
|
-
status: "matched",
|
|
144
|
+
status: ambiguous ? "ambiguous" : "matched",
|
|
113
145
|
confidence,
|
|
114
|
-
book: best,
|
|
146
|
+
book: stripScore(best),
|
|
115
147
|
matchScore: best.matchScore,
|
|
116
148
|
source: "search",
|
|
149
|
+
validation,
|
|
150
|
+
...(ambiguous ? { candidates: books.slice(0, 3) } : {}),
|
|
151
|
+
...(reason ? { reason } : {}),
|
|
117
152
|
};
|
|
118
153
|
}
|
|
119
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,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-book.js","sourceRoot":"","sources":["../../src/application/resolve-book.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-books.d.ts","sourceRoot":"","sources":["../../src/application/search-books.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAO9E,4CAA4C;AAC5C,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,0CAA0C;AAC1C,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAWD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"search-books.d.ts","sourceRoot":"","sources":["../../src/application/search-books.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAO9E,4CAA4C;AAC5C,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,0CAA0C;AAC1C,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAWD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAsE5B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { checkRobotsTxt } from "../adapters/publishers/base.js";
|
|
1
|
+
import { checkRobotsTxt, deriveAsinFromStores } from "../adapters/publishers/base.js";
|
|
2
2
|
import { fetchOpenBDBooks, enrichWithOpenBD } from "../adapters/openbd.js";
|
|
3
3
|
import { matchScore } from "../domain/text-match.js";
|
|
4
4
|
import { dedupeAuthors } from "../domain/authors.js";
|
|
@@ -75,6 +75,8 @@ export async function searchBooks(query, publishers, deps) {
|
|
|
75
75
|
.map(book => ({
|
|
76
76
|
...book,
|
|
77
77
|
authors: dedupeAuthors(book.authors),
|
|
78
|
+
// 既に取得済みの Amazon 購入動線(ebookStores)から ASIN を導出(追加フェッチなし)
|
|
79
|
+
asin: book.asin ?? deriveAsinFromStores(book.ebookStores),
|
|
78
80
|
matchScore: Math.round(matchScore(query, book) * 1000) / 1000,
|
|
79
81
|
}))
|
|
80
82
|
// クエリ語があるのに一致度ゼロ=検索サイトが返す新着フォールバック等の無関係本。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-books.js","sourceRoot":"","sources":["../../src/application/search-books.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"search-books.js","sourceRoot":"","sources":["../../src/application/search-books.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/book.d.ts
CHANGED
|
@@ -10,9 +10,18 @@ export interface EbookStore {
|
|
|
10
10
|
url: string;
|
|
11
11
|
drm: DrmType;
|
|
12
12
|
}
|
|
13
|
+
/** 著者の役割(奥付・ONIX の区別に対応)。判別不能な場合は "author" にフォールバック */
|
|
14
|
+
export type ContributorRole = "author" | "translator" | "supervisor" | "editor";
|
|
15
|
+
export interface Contributor {
|
|
16
|
+
name: string;
|
|
17
|
+
role: ContributorRole;
|
|
18
|
+
}
|
|
13
19
|
export interface BookRecord {
|
|
14
20
|
title: string;
|
|
21
|
+
subtitle?: string;
|
|
22
|
+
alternativeTitle?: string;
|
|
15
23
|
authors: string[];
|
|
24
|
+
contributors?: Contributor[];
|
|
16
25
|
publisher: string;
|
|
17
26
|
publishedAt?: string;
|
|
18
27
|
language?: string;
|
|
@@ -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,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,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"}
|
|
@@ -10,6 +10,18 @@ import type { BookRecord, SearchQuery } from "./book.js";
|
|
|
10
10
|
* 表記とできるだけ一致させるための前処理。
|
|
11
11
|
*/
|
|
12
12
|
export declare function normalizeForMatch(text: string): string;
|
|
13
|
+
export declare function stripEditionMarkers(normalized: string): string;
|
|
14
|
+
/** 書名に版表記マーカー(第N版・増補改訂版 等)が含まれるか */
|
|
15
|
+
export declare function hasEditionMarker(text: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* 2つの書名が「同一作品」である度合い(0..1)。版表記を畳んで照合する。
|
|
18
|
+
*
|
|
19
|
+
* 版違い("独習PHP 第4版" vs "独習PHP")は 1 に近く、別作品(誤ISBN等)は 0 になる。
|
|
20
|
+
* `isbnTitleAgree` を「同一作品なら版違いでも true」に一般化するための信号。
|
|
21
|
+
*/
|
|
22
|
+
export declare function sameWorkScore(a: string, b: string): number;
|
|
23
|
+
/** 2つの書名が正規化後に完全一致するか(版表記も含めて同一) */
|
|
24
|
+
export declare function titlesExactMatch(a: string, b: string): boolean;
|
|
13
25
|
/**
|
|
14
26
|
* クエリ書名と候補書名の一致度(0..1)。
|
|
15
27
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-match.d.ts","sourceRoot":"","sources":["../../src/domain/text-match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAcD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAWxE;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CASrF;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAMvE"}
|
|
1
|
+
{"version":3,"file":"text-match.d.ts","sourceRoot":"","sources":["../../src/domain/text-match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAUD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAG9D;AAcD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAWxE;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CASrF;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAMvE"}
|
|
@@ -15,6 +15,36 @@ export function normalizeForMatch(text) {
|
|
|
15
15
|
// 装飾括弧・区切り・長音/ダッシュ・約物・空白をまとめて除去
|
|
16
16
|
.replace(/[\s【】〔〕「」『』《》[\](){}(){}<><>、。,.・,.:;:;!!??~〜~\--—―ー_/\\|=+*'"`]/g, "");
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* 正規化済み文字列から版表記マーカーを除去する。
|
|
20
|
+
* "独習php第4版" → "独習php"、"初めての人のためのlisp増補改訂版" → "初めての人のためのlisp"。
|
|
21
|
+
* 同一作品の版違いを同一視するための前処理(normalizeForMatch の後に適用する)。
|
|
22
|
+
*/
|
|
23
|
+
const EDITION_MARKER_RE = /第[0-9一二三四五六七八九十百]+[版刷]|増補改訂版|改訂新版|改訂版|増補版|新装版|普及版|新版/g;
|
|
24
|
+
export function stripEditionMarkers(normalized) {
|
|
25
|
+
return normalized.replace(EDITION_MARKER_RE, "");
|
|
26
|
+
}
|
|
27
|
+
/** 書名に版表記マーカー(第N版・増補改訂版 等)が含まれるか */
|
|
28
|
+
export function hasEditionMarker(text) {
|
|
29
|
+
const normalized = normalizeForMatch(text);
|
|
30
|
+
return stripEditionMarkers(normalized) !== normalized;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 2つの書名が「同一作品」である度合い(0..1)。版表記を畳んで照合する。
|
|
34
|
+
*
|
|
35
|
+
* 版違い("独習PHP 第4版" vs "独習PHP")は 1 に近く、別作品(誤ISBN等)は 0 になる。
|
|
36
|
+
* `isbnTitleAgree` を「同一作品なら版違いでも true」に一般化するための信号。
|
|
37
|
+
*/
|
|
38
|
+
export function sameWorkScore(a, b) {
|
|
39
|
+
const na = stripEditionMarkers(normalizeForMatch(a));
|
|
40
|
+
const nb = stripEditionMarkers(normalizeForMatch(b));
|
|
41
|
+
return containmentScore(na, nb);
|
|
42
|
+
}
|
|
43
|
+
/** 2つの書名が正規化後に完全一致するか(版表記も含めて同一) */
|
|
44
|
+
export function titlesExactMatch(a, b) {
|
|
45
|
+
const na = normalizeForMatch(a);
|
|
46
|
+
return na !== "" && na === normalizeForMatch(b);
|
|
47
|
+
}
|
|
18
48
|
/** 1 を最良とする 0..1 の包含スコア。短い側が長い側に完全包含されるほど高い */
|
|
19
49
|
function containmentScore(a, b) {
|
|
20
50
|
if (!a || !b)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-match.js","sourceRoot":"","sources":["../../src/domain/text-match.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"text-match.js","sourceRoot":"","sources":["../../src/domain/text-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|