better-web-search-mcp 0.9.0 → 0.10.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/dist/tools/news.d.ts +15 -0
- package/dist/tools/news.d.ts.map +1 -1
- package/dist/tools/news.js +28 -4
- package/dist/tools/news.js.map +1 -1
- package/mcp.json +1 -1
- package/package.json +1 -1
package/dist/tools/news.d.ts
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* Recency-filtered news search. Runs a search with a tight freshness window,
|
|
5
5
|
* post-filters results by their published date, ensures domain diversity, and
|
|
6
6
|
* groups the results into a timeline keyed by publication date.
|
|
7
|
+
*
|
|
8
|
+
* Publication dates come from Brave and Tavily. DuckDuckGo's HTML endpoint
|
|
9
|
+
* supplies none, so requiring a date made this tool return an empty list for
|
|
10
|
+
* every topic on the keyless path, which reads exactly like "no news exists".
|
|
11
|
+
* When no result is dated the search still returns its topical matches and
|
|
12
|
+
* sets `recency_verified` to false, so a caller can tell the difference.
|
|
7
13
|
*/
|
|
8
14
|
import { z } from "zod";
|
|
9
15
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -23,6 +29,15 @@ export interface NewsResponse {
|
|
|
23
29
|
queries_used: string[];
|
|
24
30
|
/** Providers that refused or failed, so an empty result reads correctly. */
|
|
25
31
|
warnings?: string[];
|
|
32
|
+
/**
|
|
33
|
+
* Whether every returned source carried a publication date inside the
|
|
34
|
+
* requested window.
|
|
35
|
+
*
|
|
36
|
+
* False means the results are topical but their age is unknown, which
|
|
37
|
+
* happens on the keyless path: DuckDuckGo's HTML endpoint does not supply
|
|
38
|
+
* dates. An agent should not describe those as "from the last N days".
|
|
39
|
+
*/
|
|
40
|
+
recency_verified: boolean;
|
|
26
41
|
}
|
|
27
42
|
/**
|
|
28
43
|
* Run a recency-filtered news search and return the spec-shaped response.
|
package/dist/tools/news.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"news.d.ts","sourceRoot":"","sources":["../../src/tools/news.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"news.d.ts","sourceRoot":"","sources":["../../src/tools/news.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,mCAAmC;AACnC,eAAO,MAAM,eAAe;;;;CAI3B,CAAC;AAEF,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACzC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;;OAOG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AA8CD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,GAAG,OAAO,CAAC,YAAY,CAAC,CAkFxB;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAgBnE"}
|
package/dist/tools/news.js
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* Recency-filtered news search. Runs a search with a tight freshness window,
|
|
5
5
|
* post-filters results by their published date, ensures domain diversity, and
|
|
6
6
|
* groups the results into a timeline keyed by publication date.
|
|
7
|
+
*
|
|
8
|
+
* Publication dates come from Brave and Tavily. DuckDuckGo's HTML endpoint
|
|
9
|
+
* supplies none, so requiring a date made this tool return an empty list for
|
|
10
|
+
* every topic on the keyless path, which reads exactly like "no news exists".
|
|
11
|
+
* When no result is dated the search still returns its topical matches and
|
|
12
|
+
* sets `recency_verified` to false, so a caller can tell the difference.
|
|
7
13
|
*/
|
|
8
14
|
import { z } from "zod";
|
|
9
15
|
import { aggregateSearchDetailed } from "../providers/index.js";
|
|
@@ -84,7 +90,16 @@ export async function runNews(args) {
|
|
|
84
90
|
const deduped = deduplicate(raw);
|
|
85
91
|
const ranked = rerank(deduped, topic, recencyDays);
|
|
86
92
|
// Post-filter by published date within the recency window.
|
|
87
|
-
const
|
|
93
|
+
const dated = ranked.filter((r) => withinWindow(r.published, recencyDays));
|
|
94
|
+
// Falling back to undated results rather than returning nothing. The only
|
|
95
|
+
// keyless provider does not supply publication dates, so requiring one made
|
|
96
|
+
// web_news return an empty list for every topic — indistinguishable from
|
|
97
|
+
// "no news exists". Recency is reported as unverified instead of silently
|
|
98
|
+
// claiming a window the data cannot support.
|
|
99
|
+
const recencyVerified = dated.length > 0;
|
|
100
|
+
const recent = recencyVerified
|
|
101
|
+
? dated
|
|
102
|
+
: ranked.filter((r) => r.published === undefined || r.published === "");
|
|
88
103
|
// Ensure domain diversity: keep at most one result per host, in rank order.
|
|
89
104
|
const seenHosts = new Set();
|
|
90
105
|
const diverse = [];
|
|
@@ -106,12 +121,21 @@ export async function runNews(args) {
|
|
|
106
121
|
}
|
|
107
122
|
}
|
|
108
123
|
const sources = diverse.map(toSource);
|
|
124
|
+
const notes = [...warnings];
|
|
125
|
+
if (!recencyVerified && sources.length > 0) {
|
|
126
|
+
notes.push(`No result carried a publication date, so recency could not be verified. ` +
|
|
127
|
+
`DuckDuckGo does not supply dates; set BRAVE_API_KEY or TAVILY_API_KEY ` +
|
|
128
|
+
`for date-filtered news. Showing ${sources.length} undated results for the topic.`);
|
|
129
|
+
}
|
|
109
130
|
const response = {
|
|
110
|
-
answer:
|
|
131
|
+
answer: recencyVerified
|
|
132
|
+
? `Top ${sources.length} recent news results for "${topic}" within ${recencyDays} days`
|
|
133
|
+
: `Top ${sources.length} results for "${topic}" (publication dates unavailable, recency unverified)`,
|
|
111
134
|
sources,
|
|
112
135
|
timeline: buildTimeline(sources),
|
|
113
136
|
queries_used: [topic],
|
|
114
|
-
|
|
137
|
+
recency_verified: recencyVerified,
|
|
138
|
+
...(notes.length > 0 ? { warnings: notes } : {}),
|
|
115
139
|
};
|
|
116
140
|
if (warnings.length === 0) {
|
|
117
141
|
cache?.setSearch(cacheKey, topic, response);
|
|
@@ -122,7 +146,7 @@ export async function runNews(args) {
|
|
|
122
146
|
export function registerNews(server, cache) {
|
|
123
147
|
server.registerTool("web_news", {
|
|
124
148
|
title: "Web News",
|
|
125
|
-
description: "Search for recent news on a topic within a recency window. Results are filtered by publication date, deduplicated across domains for diversity, and grouped into a timeline keyed by publication date.",
|
|
149
|
+
description: "Search for recent news on a topic within a recency window. Results are filtered by publication date, deduplicated across domains for diversity, and grouped into a timeline keyed by publication date. Check `recency_verified`: publication dates require BRAVE_API_KEY or TAVILY_API_KEY, and on the keyless path it is false, meaning the results match the topic but their age is unknown and must not be described as recent.",
|
|
126
150
|
inputSchema: newsInputSchema,
|
|
127
151
|
}, async (args) => {
|
|
128
152
|
const response = await runNews({ ...args, cache });
|
package/dist/tools/news.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"news.js","sourceRoot":"","sources":["../../src/tools/news.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"news.js","sourceRoot":"","sources":["../../src/tools/news.ts"],"names":[],"mappings":"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"}
|
package/mcp.json
CHANGED
package/package.json
CHANGED