@cyanheads/gdelt-mcp-server 0.2.1 → 0.2.3
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/CLAUDE.md +47 -36
- package/Dockerfile +10 -6
- package/LICENSE +201 -0
- package/README.md +1 -1
- package/changelog/0.2.x/0.2.2.md +20 -0
- package/changelog/0.2.x/0.2.3.md +44 -0
- package/changelog/template.md +5 -3
- package/dist/mcp-server/tools/date-range.d.ts +27 -0
- package/dist/mcp-server/tools/date-range.d.ts.map +1 -0
- package/dist/mcp-server/tools/date-range.js +29 -0
- package/dist/mcp-server/tools/date-range.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-coverage-breakdown.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/get-coverage-breakdown.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-coverage-breakdown.tool.js +22 -2
- package/dist/mcp-server/tools/definitions/get-coverage-breakdown.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-coverage-timeline.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/get-coverage-timeline.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-coverage-timeline.tool.js +22 -2
- package/dist/mcp-server/tools/definitions/get-coverage-timeline.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tone-distribution.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/get-tone-distribution.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tone-distribution.tool.js +22 -2
- package/dist/mcp-server/tools/definitions/get-tone-distribution.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tv-clips.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/get-tv-clips.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tv-clips.tool.js +25 -3
- package/dist/mcp-server/tools/definitions/get-tv-clips.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tv-context.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/get-tv-context.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-tv-context.tool.js +25 -3
- package/dist/mcp-server/tools/definitions/get-tv-context.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-articles.tool.js +24 -4
- package/dist/mcp-server/tools/definitions/search-articles.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-tv.tool.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/search-tv.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-tv.tool.js +26 -5
- package/dist/mcp-server/tools/definitions/search-tv.tool.js.map +1 -1
- package/dist/services/gdelt/gdelt-fetch.d.ts +8 -0
- package/dist/services/gdelt/gdelt-fetch.d.ts.map +1 -1
- package/dist/services/gdelt/gdelt-fetch.js +64 -3
- package/dist/services/gdelt/gdelt-fetch.js.map +1 -1
- package/package.json +10 -8
- package/server.json +3 -3
|
@@ -35,6 +35,16 @@ export declare const gdeltGetCoverageBreakdown: import("@cyanheads/mcp-ts-core")
|
|
|
35
35
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
36
36
|
readonly when: "No breakdown data returned for the query.";
|
|
37
37
|
readonly recovery: "Broaden the query, extend the timespan, or verify the query operators are correct.";
|
|
38
|
+
}, {
|
|
39
|
+
readonly reason: "invalid_date_range";
|
|
40
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
41
|
+
readonly when: "Exactly one of startDatetime / endDatetime was supplied.";
|
|
42
|
+
readonly recovery: "Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.";
|
|
43
|
+
}, {
|
|
44
|
+
readonly reason: "invalid_query";
|
|
45
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
46
|
+
readonly when: "GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character.";
|
|
47
|
+
readonly recovery: "Read the recovery hint for the specific rule GDELT rejected, then fix the query and retry.";
|
|
38
48
|
}, {
|
|
39
49
|
readonly reason: "gdelt_unavailable";
|
|
40
50
|
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-coverage-breakdown.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-breakdown.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"get-coverage-breakdown.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-breakdown.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAQjE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+PpC,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
7
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
8
|
import { getGdeltDocService } from '../../../services/gdelt/gdelt-doc-service.js';
|
|
9
|
+
import { GDELT_DATETIME_PATTERN, isUnpairedDateRange } from '../date-range.js';
|
|
9
10
|
import { inferDateResolution } from '../date-resolution.js';
|
|
10
11
|
/** Maximum number of series to include before aggregating the rest into "Other". */
|
|
11
12
|
const MAX_SERIES = 10;
|
|
@@ -26,6 +27,18 @@ export const gdeltGetCoverageBreakdown = tool('gdelt_get_coverage_breakdown', {
|
|
|
26
27
|
when: 'No breakdown data returned for the query.',
|
|
27
28
|
recovery: 'Broaden the query, extend the timespan, or verify the query operators are correct.',
|
|
28
29
|
},
|
|
30
|
+
{
|
|
31
|
+
reason: 'invalid_date_range',
|
|
32
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
33
|
+
when: 'Exactly one of startDatetime / endDatetime was supplied.',
|
|
34
|
+
recovery: 'Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
reason: 'invalid_query',
|
|
38
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
39
|
+
when: 'GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character.',
|
|
40
|
+
recovery: 'Read the recovery hint for the specific rule GDELT rejected, then fix the query and retry.',
|
|
41
|
+
},
|
|
29
42
|
{
|
|
30
43
|
reason: 'gdelt_unavailable',
|
|
31
44
|
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
@@ -51,12 +64,16 @@ export const gdeltGetCoverageBreakdown = tool('gdelt_get_coverage_breakdown', {
|
|
|
51
64
|
'Ignored when startDatetime/endDatetime are set. Maximum 3 months.'),
|
|
52
65
|
startDatetime: z
|
|
53
66
|
.string()
|
|
67
|
+
.regex(GDELT_DATETIME_PATTERN, 'startDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
54
68
|
.optional()
|
|
55
|
-
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS
|
|
69
|
+
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
70
|
+
'(e.g. 20240101000000). Must pair with endDatetime; supplying only one of the two is rejected.'),
|
|
56
71
|
endDatetime: z
|
|
57
72
|
.string()
|
|
73
|
+
.regex(GDELT_DATETIME_PATTERN, 'endDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
58
74
|
.optional()
|
|
59
|
-
.describe('End datetime in GDELT format YYYYMMDDHHMMSS
|
|
75
|
+
.describe('End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
76
|
+
'(e.g. 20240131235959). Must pair with startDatetime; supplying only one of the two is rejected.'),
|
|
60
77
|
}),
|
|
61
78
|
output: z.object({
|
|
62
79
|
dateResolution: z.enum(['hour', 'day']).describe('Temporal resolution of data points.'),
|
|
@@ -107,6 +124,9 @@ export const gdeltGetCoverageBreakdown = tool('gdelt_get_coverage_breakdown', {
|
|
|
107
124
|
.describe('Recovery hint when no breakdown data was returned. Absent on successful responses.'),
|
|
108
125
|
},
|
|
109
126
|
async handler(input, ctx) {
|
|
127
|
+
if (isUnpairedDateRange(input.startDatetime, input.endDatetime)) {
|
|
128
|
+
throw ctx.fail('invalid_date_range', 'startDatetime and endDatetime must be supplied together', ctx.recoveryFor('invalid_date_range'));
|
|
129
|
+
}
|
|
110
130
|
ctx.log.info('gdelt_get_coverage_breakdown', {
|
|
111
131
|
query: input.query,
|
|
112
132
|
breakdownBy: input.breakdownBy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-coverage-breakdown.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-breakdown.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,oFAAoF;AACpF,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,8BAA8B,EAAE;IAC5E,KAAK,EAAE,8BAA8B;IACrC,WAAW,EACT,8FAA8F;QAC9F,iEAAiE;QACjE,8FAA8F;QAC9F,kEAAkE;QAClE,mGAAmG;QACnG,yFAAyF;QACzF,mDAAmD;IACrD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAExD,MAAM,EAAE;QACN;YACE,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,2CAA2C;YACjD,QAAQ,EACN,oFAAoF;SACvF;QACD;YACE,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,gBAAgB,CAAC,kBAAkB;YACzC,IAAI,EAAE,+CAA+C;YACrD,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,mFAAmF;SAC9F;KACF;IAED,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CACP,4EAA4E;YAC1E,oEAAoE,CACvE;QACH,WAAW,EAAE,CAAC;aACX,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;aAC7B,QAAQ,CACP,mEAAmE;YACjE,2CAA2C,CAC9C;QACH,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,uDAAuD;YACrD,mEAAmE,CACtE;QACH,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"get-coverage-breakdown.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-breakdown.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,16 @@ export declare const gdeltGetCoverageTimeline: import("@cyanheads/mcp-ts-core").
|
|
|
37
37
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
38
38
|
readonly when: "No timeline data returned for the query and time range.";
|
|
39
39
|
readonly recovery: "Broaden the query, extend the timespan, or verify query operators are correct.";
|
|
40
|
+
}, {
|
|
41
|
+
readonly reason: "invalid_date_range";
|
|
42
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
43
|
+
readonly when: "Exactly one of startDatetime / endDatetime was supplied.";
|
|
44
|
+
readonly recovery: "Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.";
|
|
45
|
+
}, {
|
|
46
|
+
readonly reason: "invalid_query";
|
|
47
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
48
|
+
readonly when: "GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character.";
|
|
49
|
+
readonly recovery: "Read the recovery hint for the specific rule GDELT rejected, then fix the query and retry.";
|
|
40
50
|
}, {
|
|
41
51
|
readonly reason: "gdelt_unavailable";
|
|
42
52
|
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-coverage-timeline.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-timeline.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"get-coverage-timeline.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-timeline.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4PnC,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
7
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
8
|
import { getGdeltDocService } from '../../../services/gdelt/gdelt-doc-service.js';
|
|
9
|
+
import { GDELT_DATETIME_PATTERN, isUnpairedDateRange } from '../date-range.js';
|
|
9
10
|
import { inferDateResolution } from '../date-resolution.js';
|
|
10
11
|
export const gdeltGetCoverageTimeline = tool('gdelt_get_coverage_timeline', {
|
|
11
12
|
title: 'Get GDELT Coverage Timeline',
|
|
@@ -25,6 +26,18 @@ export const gdeltGetCoverageTimeline = tool('gdelt_get_coverage_timeline', {
|
|
|
25
26
|
when: 'No timeline data returned for the query and time range.',
|
|
26
27
|
recovery: 'Broaden the query, extend the timespan, or verify query operators are correct.',
|
|
27
28
|
},
|
|
29
|
+
{
|
|
30
|
+
reason: 'invalid_date_range',
|
|
31
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
32
|
+
when: 'Exactly one of startDatetime / endDatetime was supplied.',
|
|
33
|
+
recovery: 'Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
reason: 'invalid_query',
|
|
37
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
38
|
+
when: 'GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character.',
|
|
39
|
+
recovery: 'Read the recovery hint for the specific rule GDELT rejected, then fix the query and retry.',
|
|
40
|
+
},
|
|
28
41
|
{
|
|
29
42
|
reason: 'gdelt_unavailable',
|
|
30
43
|
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
@@ -52,12 +65,16 @@ export const gdeltGetCoverageTimeline = tool('gdelt_get_coverage_timeline', {
|
|
|
52
65
|
'Ignored when startDatetime/endDatetime are set. Maximum 3 months.'),
|
|
53
66
|
startDatetime: z
|
|
54
67
|
.string()
|
|
68
|
+
.regex(GDELT_DATETIME_PATTERN, 'startDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
55
69
|
.optional()
|
|
56
|
-
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS
|
|
70
|
+
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
71
|
+
'(e.g. 20240101000000). Must pair with endDatetime; supplying only one of the two is rejected.'),
|
|
57
72
|
endDatetime: z
|
|
58
73
|
.string()
|
|
74
|
+
.regex(GDELT_DATETIME_PATTERN, 'endDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
59
75
|
.optional()
|
|
60
|
-
.describe('End datetime in GDELT format YYYYMMDDHHMMSS
|
|
76
|
+
.describe('End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
77
|
+
'(e.g. 20240131235959). Must pair with startDatetime; supplying only one of the two is rejected.'),
|
|
61
78
|
smoothing: z
|
|
62
79
|
.number()
|
|
63
80
|
.int()
|
|
@@ -121,6 +138,9 @@ export const gdeltGetCoverageTimeline = tool('gdelt_get_coverage_timeline', {
|
|
|
121
138
|
.describe('Recovery hint when no timeline data was returned. Absent on successful responses.'),
|
|
122
139
|
},
|
|
123
140
|
async handler(input, ctx) {
|
|
141
|
+
if (isUnpairedDateRange(input.startDatetime, input.endDatetime)) {
|
|
142
|
+
throw ctx.fail('invalid_date_range', 'startDatetime and endDatetime must be supplied together', ctx.recoveryFor('invalid_date_range'));
|
|
143
|
+
}
|
|
124
144
|
ctx.log.info('gdelt_get_coverage_timeline', { query: input.query, mode: input.mode });
|
|
125
145
|
const svc = getGdeltDocService();
|
|
126
146
|
const modeMap = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-coverage-timeline.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-timeline.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC,6BAA6B,EAAE;IAC1E,KAAK,EAAE,6BAA6B;IACpC,WAAW,EACT,8GAA8G;QAC9G,+FAA+F;QAC/F,oGAAoG;QACpG,iGAAiG;QACjG,mDAAmD;QACnD,iHAAiH;QACjH,4GAA4G;QAC5G,8CAA8C;IAChD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAExD,MAAM,EAAE;QACN;YACE,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,yDAAyD;YAC/D,QAAQ,EAAE,gFAAgF;SAC3F;QACD;YACE,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,gBAAgB,CAAC,kBAAkB;YACzC,IAAI,EAAE,+CAA+C;YACrD,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,mFAAmF;SAC9F;KACF;IAED,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CACP,4EAA4E;YAC1E,2EAA2E,CAC9E;QACH,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,sBAAsB,EAAE,MAAM,CAAC,CAAC;aAChD,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CACP,sEAAsE;YACpE,iGAAiG;YACjG,sDAAsD,CACzD;QACH,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,uDAAuD;YACrD,mEAAmE,CACtE;QACH,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"get-coverage-timeline.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-coverage-timeline.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,16 @@ export declare const gdeltGetToneDistribution: import("@cyanheads/mcp-ts-core").
|
|
|
29
29
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
30
30
|
readonly when: "No tone histogram data returned for the query.";
|
|
31
31
|
readonly recovery: "Broaden the query or extend the timespan to include more matching articles.";
|
|
32
|
+
}, {
|
|
33
|
+
readonly reason: "invalid_date_range";
|
|
34
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
35
|
+
readonly when: "Exactly one of startDatetime / endDatetime was supplied.";
|
|
36
|
+
readonly recovery: "Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.";
|
|
37
|
+
}, {
|
|
38
|
+
readonly reason: "invalid_query";
|
|
39
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
40
|
+
readonly when: "GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character.";
|
|
41
|
+
readonly recovery: "Read the recovery hint for the specific rule GDELT rejected, then fix the query and retry.";
|
|
32
42
|
}, {
|
|
33
43
|
readonly reason: "gdelt_unavailable";
|
|
34
44
|
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tone-distribution.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tone-distribution.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"get-tone-distribution.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tone-distribution.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkNnC,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
7
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
8
|
import { getGdeltDocService } from '../../../services/gdelt/gdelt-doc-service.js';
|
|
9
|
+
import { GDELT_DATETIME_PATTERN, isUnpairedDateRange } from '../date-range.js';
|
|
9
10
|
export const gdeltGetToneDistribution = tool('gdelt_get_tone_distribution', {
|
|
10
11
|
title: 'Get GDELT Tone Distribution',
|
|
11
12
|
description: 'Get the tonal distribution of articles matching a query as a histogram (bins approximately -30 to +30). ' +
|
|
@@ -23,6 +24,18 @@ export const gdeltGetToneDistribution = tool('gdelt_get_tone_distribution', {
|
|
|
23
24
|
when: 'No tone histogram data returned for the query.',
|
|
24
25
|
recovery: 'Broaden the query or extend the timespan to include more matching articles.',
|
|
25
26
|
},
|
|
27
|
+
{
|
|
28
|
+
reason: 'invalid_date_range',
|
|
29
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
30
|
+
when: 'Exactly one of startDatetime / endDatetime was supplied.',
|
|
31
|
+
recovery: 'Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
reason: 'invalid_query',
|
|
35
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
36
|
+
when: 'GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character.',
|
|
37
|
+
recovery: 'Read the recovery hint for the specific rule GDELT rejected, then fix the query and retry.',
|
|
38
|
+
},
|
|
26
39
|
{
|
|
27
40
|
reason: 'gdelt_unavailable',
|
|
28
41
|
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
@@ -44,12 +57,16 @@ export const gdeltGetToneDistribution = tool('gdelt_get_tone_distribution', {
|
|
|
44
57
|
'Ignored when startDatetime/endDatetime are set. Maximum 3 months.'),
|
|
45
58
|
startDatetime: z
|
|
46
59
|
.string()
|
|
60
|
+
.regex(GDELT_DATETIME_PATTERN, 'startDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
47
61
|
.optional()
|
|
48
|
-
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS
|
|
62
|
+
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
63
|
+
'(e.g. 20240101000000). Must pair with endDatetime; supplying only one of the two is rejected.'),
|
|
49
64
|
endDatetime: z
|
|
50
65
|
.string()
|
|
66
|
+
.regex(GDELT_DATETIME_PATTERN, 'endDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
51
67
|
.optional()
|
|
52
|
-
.describe('End datetime in GDELT format YYYYMMDDHHMMSS
|
|
68
|
+
.describe('End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
69
|
+
'(e.g. 20240131235959). Must pair with startDatetime; supplying only one of the two is rejected.'),
|
|
53
70
|
}),
|
|
54
71
|
output: z.object({
|
|
55
72
|
histogram: z
|
|
@@ -101,6 +118,9 @@ export const gdeltGetToneDistribution = tool('gdelt_get_tone_distribution', {
|
|
|
101
118
|
.describe('Recovery hint when no tone data was returned. Absent on successful responses.'),
|
|
102
119
|
},
|
|
103
120
|
async handler(input, ctx) {
|
|
121
|
+
if (isUnpairedDateRange(input.startDatetime, input.endDatetime)) {
|
|
122
|
+
throw ctx.fail('invalid_date_range', 'startDatetime and endDatetime must be supplied together', ctx.recoveryFor('invalid_date_range'));
|
|
123
|
+
}
|
|
104
124
|
ctx.log.info('gdelt_get_tone_distribution', { query: input.query });
|
|
105
125
|
const svc = getGdeltDocService();
|
|
106
126
|
const bins = await svc.getToneDistribution({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tone-distribution.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tone-distribution.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-tone-distribution.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tone-distribution.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,16 @@ export declare const gdeltGetTvClips: import("@cyanheads/mcp-ts-core").ToolDefin
|
|
|
31
31
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
32
32
|
readonly when: "No TV clips matched the query in the specified time range.";
|
|
33
33
|
readonly recovery: string;
|
|
34
|
+
}, {
|
|
35
|
+
readonly reason: "invalid_date_range";
|
|
36
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
37
|
+
readonly when: "Exactly one of startDatetime / endDatetime was supplied.";
|
|
38
|
+
readonly recovery: "Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.";
|
|
39
|
+
}, {
|
|
40
|
+
readonly reason: "invalid_query";
|
|
41
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
42
|
+
readonly when: "GDELT rejected the query — no station was selected, or the query string is malformed.";
|
|
43
|
+
readonly recovery: "Read the recovery hint for the specific rule GDELT rejected; when no station was selected, list valid IDs with gdelt_list_tv_stations.";
|
|
34
44
|
}, {
|
|
35
45
|
readonly reason: "gdelt_unavailable";
|
|
36
46
|
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tv-clips.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-clips.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"get-tv-clips.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-clips.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkM1B,CAAC"}
|
|
@@ -7,6 +7,7 @@ import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
|
7
7
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
8
|
import { formatDateShort, resolveTimespan } from '../../../services/gdelt/gdelt-fetch.js';
|
|
9
9
|
import { getGdeltTvService } from '../../../services/gdelt/gdelt-tv-service.js';
|
|
10
|
+
import { GDELT_DATETIME_PATTERN, isUnpairedDateRange } from '../date-range.js';
|
|
10
11
|
export const gdeltGetTvClips = tool('gdelt_get_tv_clips', {
|
|
11
12
|
title: 'Get GDELT TV Clips',
|
|
12
13
|
description: "Retrieve the top matching TV news clips (up to 3,000) for a query from the Internet Archive's " +
|
|
@@ -23,6 +24,18 @@ export const gdeltGetTvClips = tool('gdelt_get_tv_clips', {
|
|
|
23
24
|
recovery: 'TV data ends October 2024 — supply explicit startDatetime/endDatetime within 2009–2024, ' +
|
|
24
25
|
'or verify station IDs with gdelt_list_tv_stations.',
|
|
25
26
|
},
|
|
27
|
+
{
|
|
28
|
+
reason: 'invalid_date_range',
|
|
29
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
30
|
+
when: 'Exactly one of startDatetime / endDatetime was supplied.',
|
|
31
|
+
recovery: 'Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
reason: 'invalid_query',
|
|
35
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
36
|
+
when: 'GDELT rejected the query — no station was selected, or the query string is malformed.',
|
|
37
|
+
recovery: 'Read the recovery hint for the specific rule GDELT rejected; when no station was selected, list valid IDs with gdelt_list_tv_stations.',
|
|
38
|
+
},
|
|
26
39
|
{
|
|
27
40
|
reason: 'gdelt_unavailable',
|
|
28
41
|
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
@@ -41,7 +54,9 @@ export const gdeltGetTvClips = tool('gdelt_get_tv_clips', {
|
|
|
41
54
|
.array(z.string())
|
|
42
55
|
.optional()
|
|
43
56
|
.describe('Station IDs to filter to (e.g. ["CNN", "FOXNEWS"]). ' +
|
|
44
|
-
'
|
|
57
|
+
'The GDELT TV API requires at least one station — supply it here, or embed a station: ' +
|
|
58
|
+
'selector directly in query. Omitting both is rejected; it does not fall back to all stations. ' +
|
|
59
|
+
'Use gdelt_list_tv_stations to see valid IDs.'),
|
|
45
60
|
timespan: z
|
|
46
61
|
.string()
|
|
47
62
|
.optional()
|
|
@@ -49,12 +64,16 @@ export const gdeltGetTvClips = tool('gdelt_get_tv_clips', {
|
|
|
49
64
|
'TV data spans 2009–October 2024.'),
|
|
50
65
|
startDatetime: z
|
|
51
66
|
.string()
|
|
67
|
+
.regex(GDELT_DATETIME_PATTERN, 'startDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
52
68
|
.optional()
|
|
53
|
-
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS
|
|
69
|
+
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
70
|
+
'(e.g. 20200101000000). Must pair with endDatetime; supplying only one of the two is rejected.'),
|
|
54
71
|
endDatetime: z
|
|
55
72
|
.string()
|
|
73
|
+
.regex(GDELT_DATETIME_PATTERN, 'endDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
56
74
|
.optional()
|
|
57
|
-
.describe('End datetime in GDELT format YYYYMMDDHHMMSS
|
|
75
|
+
.describe('End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
76
|
+
'(e.g. 20200131235959). Must pair with startDatetime; supplying only one of the two is rejected.'),
|
|
58
77
|
maxRecords: z
|
|
59
78
|
.number()
|
|
60
79
|
.int()
|
|
@@ -95,6 +114,9 @@ export const gdeltGetTvClips = tool('gdelt_get_tv_clips', {
|
|
|
95
114
|
.describe('Recovery hint when no clips matched. Absent on successful responses.'),
|
|
96
115
|
},
|
|
97
116
|
async handler(input, ctx) {
|
|
117
|
+
if (isUnpairedDateRange(input.startDatetime, input.endDatetime)) {
|
|
118
|
+
throw ctx.fail('invalid_date_range', 'startDatetime and endDatetime must be supplied together', ctx.recoveryFor('invalid_date_range'));
|
|
119
|
+
}
|
|
98
120
|
ctx.log.info('gdelt_get_tv_clips', { query: input.query, maxRecords: input.maxRecords });
|
|
99
121
|
const svc = getGdeltTvService();
|
|
100
122
|
const clips = await svc.getTvClips({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tv-clips.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-clips.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-tv-clips.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-clips.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,16 @@ export declare const gdeltGetTvContext: import("@cyanheads/mcp-ts-core").ToolDef
|
|
|
21
21
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
22
22
|
readonly when: "No context words found — no clips matched the query.";
|
|
23
23
|
readonly recovery: "Broaden the query, extend the timespan, or verify station IDs with gdelt_list_tv_stations.";
|
|
24
|
+
}, {
|
|
25
|
+
readonly reason: "invalid_date_range";
|
|
26
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
27
|
+
readonly when: "Exactly one of startDatetime / endDatetime was supplied.";
|
|
28
|
+
readonly recovery: "Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.";
|
|
29
|
+
}, {
|
|
30
|
+
readonly reason: "invalid_query";
|
|
31
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
32
|
+
readonly when: "GDELT rejected the query — no station was selected, or the query string is malformed.";
|
|
33
|
+
readonly recovery: "Read the recovery hint for the specific rule GDELT rejected; when no station was selected, list valid IDs with gdelt_list_tv_stations.";
|
|
24
34
|
}, {
|
|
25
35
|
readonly reason: "gdelt_unavailable";
|
|
26
36
|
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tv-context.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-context.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"get-tv-context.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-context.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyL5B,CAAC"}
|
|
@@ -7,6 +7,7 @@ import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
|
7
7
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
8
|
import { formatDateShort, resolveTimespan } from '../../../services/gdelt/gdelt-fetch.js';
|
|
9
9
|
import { getGdeltTvService } from '../../../services/gdelt/gdelt-tv-service.js';
|
|
10
|
+
import { GDELT_DATETIME_PATTERN, isUnpairedDateRange } from '../date-range.js';
|
|
10
11
|
export const gdeltGetTvContext = tool('gdelt_get_tv_context', {
|
|
11
12
|
title: 'Get GDELT TV Context',
|
|
12
13
|
description: 'Get the top co-occurring words and phrases from TV news clips matching a query — ' +
|
|
@@ -24,6 +25,18 @@ export const gdeltGetTvContext = tool('gdelt_get_tv_context', {
|
|
|
24
25
|
when: 'No context words found — no clips matched the query.',
|
|
25
26
|
recovery: 'Broaden the query, extend the timespan, or verify station IDs with gdelt_list_tv_stations.',
|
|
26
27
|
},
|
|
28
|
+
{
|
|
29
|
+
reason: 'invalid_date_range',
|
|
30
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
31
|
+
when: 'Exactly one of startDatetime / endDatetime was supplied.',
|
|
32
|
+
recovery: 'Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
reason: 'invalid_query',
|
|
36
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
37
|
+
when: 'GDELT rejected the query — no station was selected, or the query string is malformed.',
|
|
38
|
+
recovery: 'Read the recovery hint for the specific rule GDELT rejected; when no station was selected, list valid IDs with gdelt_list_tv_stations.',
|
|
39
|
+
},
|
|
27
40
|
{
|
|
28
41
|
reason: 'gdelt_unavailable',
|
|
29
42
|
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
@@ -41,7 +54,9 @@ export const gdeltGetTvContext = tool('gdelt_get_tv_context', {
|
|
|
41
54
|
stations: z
|
|
42
55
|
.array(z.string())
|
|
43
56
|
.optional()
|
|
44
|
-
.describe('Station IDs to filter to.
|
|
57
|
+
.describe('Station IDs to filter to (e.g. ["CNN", "FOXNEWS"]). ' +
|
|
58
|
+
'The GDELT TV API requires at least one station — supply it here, or embed a station: ' +
|
|
59
|
+
'selector directly in query. Omitting both is rejected; it does not fall back to all stations. ' +
|
|
45
60
|
'Use gdelt_list_tv_stations to see valid IDs.'),
|
|
46
61
|
timespan: z
|
|
47
62
|
.string()
|
|
@@ -50,13 +65,17 @@ export const gdeltGetTvContext = tool('gdelt_get_tv_context', {
|
|
|
50
65
|
'TV data spans 2009–October 2024.'),
|
|
51
66
|
startDatetime: z
|
|
52
67
|
.string()
|
|
68
|
+
.regex(GDELT_DATETIME_PATTERN, 'startDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
53
69
|
.optional()
|
|
54
|
-
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS
|
|
70
|
+
.describe('Start datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
71
|
+
'(e.g. 20200101000000). Must pair with endDatetime; supplying only one of the two is rejected. ' +
|
|
55
72
|
'TV data spans 2009–October 2024.'),
|
|
56
73
|
endDatetime: z
|
|
57
74
|
.string()
|
|
75
|
+
.regex(GDELT_DATETIME_PATTERN, 'endDatetime must be exactly 14 digits (YYYYMMDDHHMMSS).')
|
|
58
76
|
.optional()
|
|
59
|
-
.describe('End datetime in GDELT format YYYYMMDDHHMMSS
|
|
77
|
+
.describe('End datetime in GDELT format YYYYMMDDHHMMSS — exactly 14 digits, no separators ' +
|
|
78
|
+
'(e.g. 20200131235959). Must pair with startDatetime; supplying only one of the two is rejected.'),
|
|
60
79
|
}),
|
|
61
80
|
output: z.object({
|
|
62
81
|
words: z
|
|
@@ -86,6 +105,9 @@ export const gdeltGetTvContext = tool('gdelt_get_tv_context', {
|
|
|
86
105
|
.describe('Recovery hint when no context was found. Absent on successful responses.'),
|
|
87
106
|
},
|
|
88
107
|
async handler(input, ctx) {
|
|
108
|
+
if (isUnpairedDateRange(input.startDatetime, input.endDatetime)) {
|
|
109
|
+
throw ctx.fail('invalid_date_range', 'startDatetime and endDatetime must be supplied together', ctx.recoveryFor('invalid_date_range'));
|
|
110
|
+
}
|
|
89
111
|
ctx.log.info('gdelt_get_tv_context', { query: input.query });
|
|
90
112
|
const svc = getGdeltTvService();
|
|
91
113
|
const result = await svc.getTvContext({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tv-context.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-context.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-tv-context.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-tv-context.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,16 @@ export declare const gdeltSearchArticles: import("@cyanheads/mcp-ts-core").ToolD
|
|
|
31
31
|
readonly code: JsonRpcErrorCode.NotFound;
|
|
32
32
|
readonly when: "No articles matched the query within the specified time range.";
|
|
33
33
|
readonly recovery: "Broaden the query, remove operators, extend timespan, or try synonym terms.";
|
|
34
|
+
}, {
|
|
35
|
+
readonly reason: "invalid_date_range";
|
|
36
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
37
|
+
readonly when: "Exactly one of startDatetime / endDatetime was supplied.";
|
|
38
|
+
readonly recovery: "Supply both startDatetime and endDatetime to pin an explicit window, or omit both and use timespan instead.";
|
|
39
|
+
}, {
|
|
40
|
+
readonly reason: "invalid_query";
|
|
41
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
42
|
+
readonly when: "GDELT rejected the query string as malformed — bad keyword length, unbalanced parentheses, or an illegal character.";
|
|
43
|
+
readonly recovery: "Read the recovery hint for the specific rule GDELT rejected, then fix the query and retry.";
|
|
34
44
|
}, {
|
|
35
45
|
readonly reason: "gdelt_unavailable";
|
|
36
46
|
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-articles.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-articles.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-articles.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-articles.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4L9B,CAAC"}
|