better-web-search-mcp 0.5.1 → 0.5.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.
|
@@ -38,6 +38,25 @@ export declare const TARGET_PASSAGE_CHARS = 500;
|
|
|
38
38
|
* is windowed on sentence boundaries.
|
|
39
39
|
*/
|
|
40
40
|
export declare const MAX_PASSAGE_CHARS = 1200;
|
|
41
|
+
/**
|
|
42
|
+
* Uppercase acronyms appearing in a query, e.g. "TLS" from "What does TLS
|
|
43
|
+
* stand for?".
|
|
44
|
+
*/
|
|
45
|
+
export declare function findAcronyms(query: string): string[];
|
|
46
|
+
/**
|
|
47
|
+
* Whether `text` contains a phrase whose initials spell `acronym`.
|
|
48
|
+
*
|
|
49
|
+
* "Transport Layer Security" expands TLS; "Atomicity, Consistency, Isolation,
|
|
50
|
+
* Durability" expands ACID. Separators allow the punctuation these lists are
|
|
51
|
+
* usually written with, and a short connector word may sit between initials
|
|
52
|
+
* so "Cross-Origin Resource Sharing" and similar still match.
|
|
53
|
+
*
|
|
54
|
+
* This exists because the expansion is exactly the text a lexical scorer
|
|
55
|
+
* cannot find: the sentence that answers "what does TLS stand for" frequently
|
|
56
|
+
* never repeats the letters TLS, so it shares no term with the query and is
|
|
57
|
+
* dropped before ranking.
|
|
58
|
+
*/
|
|
59
|
+
export declare function expandsAcronym(text: string, acronym: string): boolean;
|
|
41
60
|
/** Lowercase alphanumeric tokens, stop words removed. */
|
|
42
61
|
export declare function tokenize(text: string): string[];
|
|
43
62
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passages.d.ts","sourceRoot":"","sources":["../../src/ranking/passages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,OAAO;IACtB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,OAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"passages.d.ts","sourceRoot":"","sources":["../../src/ranking/passages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,OAAO;IACtB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAgCvC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA2BrE;AAED,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG/C;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAsFxD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,KAAK,EAAE,MAAM,GACZ,OAAO,EAAE,CAyFX;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,GACR,OAAO,EAAE,CAEX"}
|
package/dist/ranking/passages.js
CHANGED
|
@@ -37,6 +37,70 @@ const STOP_WORDS = new Set([
|
|
|
37
37
|
"that", "the", "this", "to", "was", "were", "what", "when", "where", "which",
|
|
38
38
|
"who", "why", "will", "with", "you", "your",
|
|
39
39
|
]);
|
|
40
|
+
/**
|
|
41
|
+
* Shortest acronym worth expanding.
|
|
42
|
+
*
|
|
43
|
+
* Two-letter sequences match far too much ordinary prose to be a useful
|
|
44
|
+
* signal, so only three letters and up are considered.
|
|
45
|
+
*/
|
|
46
|
+
const MIN_ACRONYM_LENGTH = 3;
|
|
47
|
+
/** Longest acronym worth expanding; beyond this the regex is noise. */
|
|
48
|
+
const MAX_ACRONYM_LENGTH = 8;
|
|
49
|
+
/**
|
|
50
|
+
* Weight of an acronym-expansion match, as a multiple of the mean query IDF.
|
|
51
|
+
*
|
|
52
|
+
* Expressed relative to the query's own IDF so it stays comparable to BM25
|
|
53
|
+
* scores instead of being a magic constant tuned to one corpus.
|
|
54
|
+
*/
|
|
55
|
+
const ACRONYM_EXPANSION_WEIGHT = 1.5;
|
|
56
|
+
/** Words allowed between expansion initials without breaking the match. */
|
|
57
|
+
const CONNECTORS = "(?:of|and|the|for|in|to|a)";
|
|
58
|
+
/**
|
|
59
|
+
* Uppercase acronyms appearing in a query, e.g. "TLS" from "What does TLS
|
|
60
|
+
* stand for?".
|
|
61
|
+
*/
|
|
62
|
+
export function findAcronyms(query) {
|
|
63
|
+
const found = query.match(new RegExp(`\\b[A-Z]{${MIN_ACRONYM_LENGTH},${MAX_ACRONYM_LENGTH}}\\b`, "g")) ?? [];
|
|
64
|
+
return [...new Set(found)];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Whether `text` contains a phrase whose initials spell `acronym`.
|
|
68
|
+
*
|
|
69
|
+
* "Transport Layer Security" expands TLS; "Atomicity, Consistency, Isolation,
|
|
70
|
+
* Durability" expands ACID. Separators allow the punctuation these lists are
|
|
71
|
+
* usually written with, and a short connector word may sit between initials
|
|
72
|
+
* so "Cross-Origin Resource Sharing" and similar still match.
|
|
73
|
+
*
|
|
74
|
+
* This exists because the expansion is exactly the text a lexical scorer
|
|
75
|
+
* cannot find: the sentence that answers "what does TLS stand for" frequently
|
|
76
|
+
* never repeats the letters TLS, so it shares no term with the query and is
|
|
77
|
+
* dropped before ranking.
|
|
78
|
+
*/
|
|
79
|
+
export function expandsAcronym(text, acronym) {
|
|
80
|
+
const letters = [...acronym.toUpperCase()];
|
|
81
|
+
if (letters.length < MIN_ACRONYM_LENGTH) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Between initials: run out the current word, then optionally a separator
|
|
85
|
+
// and a connector. Letting the separator be optional is what allows a
|
|
86
|
+
// compound word to supply two initials, as "HyperText" does for HTML.
|
|
87
|
+
const gap = `[a-z]*(?:[\\s,;:/()-]+(?:${CONNECTORS}[\\s,;:/()-]+)?)?`;
|
|
88
|
+
const pattern = letters.join(gap) + "[a-z]*";
|
|
89
|
+
const regex = new RegExp(`\\b${pattern}\\b`, "gi");
|
|
90
|
+
// Every gap may be empty, so the pattern also matches the bare acronym —
|
|
91
|
+
// "TLS" itself satisfies T[a-z]*L[a-z]*S[a-z]*. Without this length floor
|
|
92
|
+
// any passage merely mentioning the acronym would count as expanding it,
|
|
93
|
+
// and the bonus would apply everywhere and rank nothing.
|
|
94
|
+
const minLength = acronym.length * 2;
|
|
95
|
+
for (const match of text.matchAll(regex)) {
|
|
96
|
+
const found = match[0];
|
|
97
|
+
if (found.length >= minLength &&
|
|
98
|
+
found.toUpperCase() !== acronym.toUpperCase()) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
40
104
|
/** Lowercase alphanumeric tokens, stop words removed. */
|
|
41
105
|
export function tokenize(text) {
|
|
42
106
|
const tokens = text.toLowerCase().match(/[a-z0-9_]+/g) ?? [];
|
|
@@ -141,7 +205,10 @@ export function splitPassages(content) {
|
|
|
141
205
|
*/
|
|
142
206
|
export function rankPassages(passages, query) {
|
|
143
207
|
const queryTerms = tokenize(query);
|
|
144
|
-
|
|
208
|
+
const acronyms = findAcronyms(query).filter((acronym) =>
|
|
209
|
+
// An acronym the query also spells out needs no special handling.
|
|
210
|
+
queryTerms.includes(acronym.toLowerCase()));
|
|
211
|
+
if ((queryTerms.length === 0 && acronyms.length === 0) || passages.length === 0) {
|
|
145
212
|
return [];
|
|
146
213
|
}
|
|
147
214
|
const docs = passages.map((passage) => tokenize(passage.text));
|
|
@@ -157,6 +224,18 @@ export function rankPassages(passages, query) {
|
|
|
157
224
|
}
|
|
158
225
|
docFreq.set(term, count);
|
|
159
226
|
}
|
|
227
|
+
// Sized from the query's own IDF so the bonus stays comparable to the BM25
|
|
228
|
+
// scores it is added to, rather than being a constant tuned to one corpus.
|
|
229
|
+
const idfOf = (term) => {
|
|
230
|
+
const n = docFreq.get(term) ?? 0;
|
|
231
|
+
return Math.log(1 + (docs.length - n + 0.5) / (n + 0.5));
|
|
232
|
+
};
|
|
233
|
+
const uniqueTerms = [...new Set(queryTerms)];
|
|
234
|
+
const meanIdf = uniqueTerms.length === 0
|
|
235
|
+
? 1
|
|
236
|
+
: uniqueTerms.reduce((total, term) => total + idfOf(term), 0) /
|
|
237
|
+
uniqueTerms.length;
|
|
238
|
+
const expansionBonus = ACRONYM_EXPANSION_WEIGHT * meanIdf;
|
|
160
239
|
const scored = [];
|
|
161
240
|
passages.forEach((passage, index) => {
|
|
162
241
|
const doc = docs[index] ?? [];
|
|
@@ -168,18 +247,30 @@ export function rankPassages(passages, query) {
|
|
|
168
247
|
counts.set(token, (counts.get(token) ?? 0) + 1);
|
|
169
248
|
}
|
|
170
249
|
let score = 0;
|
|
171
|
-
for (const term of
|
|
250
|
+
for (const term of uniqueTerms) {
|
|
172
251
|
const freq = counts.get(term);
|
|
173
252
|
if (freq === undefined) {
|
|
174
253
|
continue;
|
|
175
254
|
}
|
|
176
|
-
const n = docFreq.get(term) ?? 0;
|
|
177
255
|
// BM25 IDF, the +1 keeping it positive for terms in every passage.
|
|
178
|
-
const idf =
|
|
256
|
+
const idf = idfOf(term);
|
|
179
257
|
const norm = freq * (K1 + 1);
|
|
180
258
|
const denom = freq + K1 * (1 - B + (B * doc.length) / (avgLength || 1));
|
|
181
259
|
score += idf * (norm / denom);
|
|
182
260
|
}
|
|
261
|
+
// A passage that spells an acronym out is usually the one answering "what
|
|
262
|
+
// does X stand for", but it says the expansion once while pages that merely
|
|
263
|
+
// use the acronym repeat it, so BM25 ranks the answer below the noise.
|
|
264
|
+
//
|
|
265
|
+
// The expansion must sit alongside the acronym itself. The loose gap that
|
|
266
|
+
// lets "HyperText Markup Language" expand HTML also matches ordinary prose
|
|
267
|
+
// — "The lazy squirrel" expands TLS — and requiring the acronym in the same
|
|
268
|
+
// passage removes those without weakening the real case, since the answer
|
|
269
|
+
// sentence almost always names the acronym it is defining.
|
|
270
|
+
if (acronyms.some((acronym) => counts.has(acronym.toLowerCase()) &&
|
|
271
|
+
expandsAcronym(passage.text, acronym))) {
|
|
272
|
+
score += expansionBonus;
|
|
273
|
+
}
|
|
183
274
|
if (score > 0) {
|
|
184
275
|
scored.push({ ...passage, score });
|
|
185
276
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passages.js","sourceRoot":"","sources":["../../src/ranking/passages.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"passages.js","sourceRoot":"","sources":["../../src/ranking/passages.ts"],"names":[],"mappings":"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"}
|
package/mcp.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "better-web-search-mcp",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "MCP server for genuinely better web research — keyless-first (DuckDuckGo), 3-tier extraction, deep research. Brave/Tavily optional.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"check:publish": "npm pack --dry-run",
|
|
56
56
|
"bench": "node benchmarks/run.mjs",
|
|
57
57
|
"bench:quality": "node benchmarks/quality.mjs",
|
|
58
|
+
"bench:corpus": "node benchmarks/corpus.mjs",
|
|
58
59
|
"docs:api": "typedoc --options typedoc.json && node scripts/typedoc-postprocess.mjs",
|
|
59
60
|
"docs:changelog": "node scripts/sync-docs-changelog.mjs",
|
|
60
61
|
"docs:build": "npm run docs:api && npm run docs:changelog && hugo --source site --gc --minify",
|