@cyanheads/earthquake-mcp-server 0.1.15 → 0.2.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/CLAUDE.md +31 -23
- package/Dockerfile +13 -7
- package/README.md +9 -4
- package/dist/mcp-server/resources/definitions/earthquake-event.resource.d.ts +1 -1
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.d.ts +1 -1
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.js +8 -2
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.d.ts +20 -1
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.js +79 -16
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/earthquake-get-event.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.d.ts +6 -1
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.js +93 -13
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.d.ts +24 -6
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.js +130 -42
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/query-params.d.ts +34 -0
- package/dist/mcp-server/tools/query-params.d.ts.map +1 -0
- package/dist/mcp-server/tools/query-params.js +42 -0
- package/dist/mcp-server/tools/query-params.js.map +1 -0
- package/dist/mcp-server/tools/schemas.d.ts +1 -1
- package/dist/mcp-server/tools/schemas.d.ts.map +1 -1
- package/dist/mcp-server/tools/schemas.js +5 -2
- package/dist/mcp-server/tools/schemas.js.map +1 -1
- package/dist/services/emsc/emsc-service.d.ts +6 -1
- package/dist/services/emsc/emsc-service.d.ts.map +1 -1
- package/dist/services/emsc/emsc-service.js +43 -11
- package/dist/services/emsc/emsc-service.js.map +1 -1
- package/dist/services/usgs/types.d.ts +3 -1
- package/dist/services/usgs/types.d.ts.map +1 -1
- package/dist/services/usgs/usgs-service.d.ts +6 -1
- package/dist/services/usgs/usgs-service.d.ts.map +1 -1
- package/dist/services/usgs/usgs-service.js +39 -33
- package/dist/services/usgs/usgs-service.js.map +1 -1
- package/package.json +10 -9
- package/server.json +3 -3
|
@@ -7,7 +7,7 @@ import { z } from '@cyanheads/mcp-ts-core';
|
|
|
7
7
|
export declare const EarthquakeEventSchema: z.ZodObject<{
|
|
8
8
|
id: z.ZodString;
|
|
9
9
|
title: z.ZodString;
|
|
10
|
-
magnitude: z.ZodNumber
|
|
10
|
+
magnitude: z.ZodNullable<z.ZodNumber>;
|
|
11
11
|
magnitude_type: z.ZodString;
|
|
12
12
|
time: z.ZodString;
|
|
13
13
|
updated: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,yFAAyF;AACzF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,yFAAyF;AACzF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0DhC,CAAC;AAEH,+FAA+F;AAC/F,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E,uGAAuG;AACvG,wBAAgB,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAgClE"}
|
|
@@ -9,7 +9,10 @@ export const EarthquakeEventSchema = z.object({
|
|
|
9
9
|
title: z
|
|
10
10
|
.string()
|
|
11
11
|
.describe('Human-readable event summary, e.g. "M 6.0 - 13 km S of Honaunau-Napoopoo, Hawaii".'),
|
|
12
|
-
magnitude: z
|
|
12
|
+
magnitude: z
|
|
13
|
+
.number()
|
|
14
|
+
.nullable()
|
|
15
|
+
.describe('Preferred magnitude value. Null when no magnitude was computed for the event (the title renders it as "M ?").'),
|
|
13
16
|
magnitude_type: z.string().describe('Magnitude type (ml, mww, mw, mb, etc.).'),
|
|
14
17
|
time: z.string().describe('ISO 8601 UTC origin time.'),
|
|
15
18
|
updated: z.string().describe('ISO 8601 UTC time this record was last updated.'),
|
|
@@ -56,7 +59,7 @@ export const EarthquakeEventSchema = z.object({
|
|
|
56
59
|
export function formatEvent(event) {
|
|
57
60
|
const lines = [];
|
|
58
61
|
lines.push(`## ${event.title}`);
|
|
59
|
-
lines.push(`**ID:** ${event.id} | **Magnitude:** ${event.magnitude} (${event.magnitude_type}) | **Depth:** ${event.depth_km !== null ? `${event.depth_km} km` : 'unknown'}`);
|
|
62
|
+
lines.push(`**ID:** ${event.id} | **Magnitude:** ${event.magnitude !== null ? event.magnitude : 'unknown'} (${event.magnitude_type}) | **Depth:** ${event.depth_km !== null ? `${event.depth_km} km` : 'unknown'}`);
|
|
60
63
|
lines.push(`**Place:** ${event.place}`);
|
|
61
64
|
lines.push(`**Time:** ${event.time} | **Updated:** ${event.updated} | **Status:** ${event.status}`);
|
|
62
65
|
lines.push(`**Location:** ${event.latitude.toFixed(4)}°, ${event.longitude.toFixed(4)}°`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,yFAAyF;AACzF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACzD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,CAAC,oFAAoF,CAAC;IACjG,SAAS,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,12 @@ export declare class EmscService {
|
|
|
10
10
|
private readonly baseUrl;
|
|
11
11
|
private readonly timeoutMs;
|
|
12
12
|
constructor(_config: AppConfig, _storage: StorageService, emscBaseUrl: string, timeoutMs: number);
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Query EMSC FDSN event API. `params.offset` pages through the match set
|
|
15
|
+
* (1-based, forwarded to the upstream `offset` parameter). When results are
|
|
16
|
+
* truncated at the requested limit, a follow-up count query populates
|
|
17
|
+
* totalCount with the real match total for the whole filter set.
|
|
18
|
+
*/
|
|
14
19
|
searchEvents(params: EarthquakeQueryParams, ctx: Context): Promise<{
|
|
15
20
|
events: EarthquakeEvent[];
|
|
16
21
|
count: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emsc-service.d.ts","sourceRoot":"","sources":["../../../src/services/emsc/emsc-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"emsc-service.d.ts","sourceRoot":"","sources":["../../../src/services/emsc/emsc-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EAItB,MAAM,kBAAkB,CAAC;AAwD1B,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGjC,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM;IAMnB;;;;;OAKG;IACG,YAAY,CAChB,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QACT,MAAM,EAAE,eAAe,EAAE,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IA+DF,qCAAqC;IACrC,WAAW,CACT,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QACT,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;IAoCF,qFAAqF;IACrF,OAAO,CAAC,cAAc;CAwBvB;AAMD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,IAAI,CAEN;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module services/emsc/emsc-service
|
|
4
4
|
*/
|
|
5
5
|
import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
6
|
-
import { fetchWithTimeout,
|
|
6
|
+
import { fetchWithTimeout, requestContextService, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
7
7
|
/** 1 degree of latitude ≈ 111.2 km. */
|
|
8
8
|
const KM_PER_DEGREE = 111.2;
|
|
9
9
|
/** Build a request context from a handler context for use with withRetry/fetchWithTimeout. */
|
|
@@ -34,7 +34,7 @@ function normalizeEmscFeature(f) {
|
|
|
34
34
|
return {
|
|
35
35
|
id,
|
|
36
36
|
title: `M ${p.mag ?? '?'} - ${place}`,
|
|
37
|
-
magnitude: p.mag ??
|
|
37
|
+
magnitude: p.mag ?? null,
|
|
38
38
|
magnitude_type: magType,
|
|
39
39
|
time,
|
|
40
40
|
updated,
|
|
@@ -59,23 +59,33 @@ export class EmscService {
|
|
|
59
59
|
this.baseUrl = emscBaseUrl.replace(/\/$/, '');
|
|
60
60
|
this.timeoutMs = timeoutMs;
|
|
61
61
|
}
|
|
62
|
-
/**
|
|
63
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Query EMSC FDSN event API. `params.offset` pages through the match set
|
|
64
|
+
* (1-based, forwarded to the upstream `offset` parameter). When results are
|
|
65
|
+
* truncated at the requested limit, a follow-up count query populates
|
|
66
|
+
* totalCount with the real match total for the whole filter set.
|
|
67
|
+
*/
|
|
68
|
+
async searchEvents(params, ctx) {
|
|
64
69
|
const query = this.buildFdsnQuery(params);
|
|
65
70
|
const url = `${this.baseUrl}/fdsnws/event/1/query?format=json&${query}`;
|
|
66
71
|
const reqCtx = makeReqCtx('EmscService.searchEvents', ctx);
|
|
67
|
-
|
|
72
|
+
const result = await withRetry(async () => {
|
|
68
73
|
const response = await fetchWithTimeout(url, this.timeoutMs, reqCtx, {
|
|
69
74
|
signal: ctx.signal,
|
|
70
75
|
headers: { Accept: 'application/json' },
|
|
71
76
|
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
77
|
+
// fetchWithTimeout throws a status-mapped McpError on any non-2xx before
|
|
78
|
+
// returning, so a Response here is always 2xx.
|
|
75
79
|
const text = await response.text();
|
|
76
80
|
if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
|
|
77
81
|
throw serviceUnavailable('EMSC returned HTML instead of JSON.', { url });
|
|
78
82
|
}
|
|
83
|
+
// EMSC answers a zero-match query — including an offset past the last
|
|
84
|
+
// match — with 204 No Content and an empty body, which is a match set of
|
|
85
|
+
// size zero, not a parse failure.
|
|
86
|
+
if (text.trim() === '') {
|
|
87
|
+
return { events: [], count: 0 };
|
|
88
|
+
}
|
|
79
89
|
const data = JSON.parse(text);
|
|
80
90
|
const events = data.features.map(normalizeEmscFeature);
|
|
81
91
|
return {
|
|
@@ -88,6 +98,26 @@ export class EmscService {
|
|
|
88
98
|
baseDelayMs: 1000,
|
|
89
99
|
signal: ctx.signal,
|
|
90
100
|
});
|
|
101
|
+
// EMSC's search response carries no match total — the real total comes from
|
|
102
|
+
// the FDSN count endpoint. Fetch it only when results were truncated at the
|
|
103
|
+
// limit; a count failure degrades to an absent totalCount rather than
|
|
104
|
+
// failing the search.
|
|
105
|
+
const requestedLimit = params.limit ?? 100;
|
|
106
|
+
if (result.count > 0 && result.count === requestedLimit) {
|
|
107
|
+
// The total is a property of the filter set, not of the page — offset,
|
|
108
|
+
// limit, and orderBy are stripped so every page reports the same total.
|
|
109
|
+
const { limit: _limit, offset: _offset, orderBy: _orderBy, ...countParams } = params;
|
|
110
|
+
try {
|
|
111
|
+
const { count: totalCount } = await this.countEvents(countParams, ctx);
|
|
112
|
+
return { ...result, totalCount };
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
ctx.log.warning('Count sub-call for totalCount failed — returning results without it', {
|
|
116
|
+
error: err instanceof Error ? err.message : String(err),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
91
121
|
}
|
|
92
122
|
/** Count events matching a query. */
|
|
93
123
|
countEvents(params, ctx) {
|
|
@@ -99,9 +129,8 @@ export class EmscService {
|
|
|
99
129
|
signal: ctx.signal,
|
|
100
130
|
headers: { Accept: 'application/json' },
|
|
101
131
|
});
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
132
|
+
// fetchWithTimeout throws a status-mapped McpError on any non-2xx before
|
|
133
|
+
// returning, so a Response here is always 2xx.
|
|
105
134
|
const text = await response.text();
|
|
106
135
|
if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
|
|
107
136
|
throw serviceUnavailable('EMSC returned HTML instead of JSON.', { url });
|
|
@@ -147,6 +176,9 @@ export class EmscService {
|
|
|
147
176
|
// EMSC does not support alertlevel, minfelt, minsig — silently omit
|
|
148
177
|
if (params.limit != null)
|
|
149
178
|
q.set('limit', String(params.limit));
|
|
179
|
+
// FDSN offset is 1-based — offset=1 is the first match, and 0 is rejected.
|
|
180
|
+
if (params.offset != null)
|
|
181
|
+
q.set('offset', String(params.offset));
|
|
150
182
|
if (params.orderBy)
|
|
151
183
|
q.set('orderby', params.orderBy);
|
|
152
184
|
return q.toString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emsc-service.js","sourceRoot":"","sources":["../../../src/services/emsc/emsc-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,
|
|
1
|
+
{"version":3,"file":"emsc-service.js","sourceRoot":"","sources":["../../../src/services/emsc/emsc-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export interface EarthquakeEvent {
|
|
|
13
13
|
id: string;
|
|
14
14
|
latitude: number;
|
|
15
15
|
longitude: number;
|
|
16
|
-
magnitude: number;
|
|
16
|
+
magnitude: number | null;
|
|
17
17
|
magnitude_type: string;
|
|
18
18
|
mmi: number | null;
|
|
19
19
|
place: string;
|
|
@@ -129,6 +129,8 @@ export interface EarthquakeQueryParams {
|
|
|
129
129
|
minFelt?: number;
|
|
130
130
|
minMagnitude?: number;
|
|
131
131
|
minSignificance?: number;
|
|
132
|
+
/** 1-based index of the first event to return. Both FDSN upstreams reject 0. */
|
|
133
|
+
offset?: number;
|
|
132
134
|
orderBy?: string;
|
|
133
135
|
radiusKm?: number;
|
|
134
136
|
startTime?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/usgs/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IACpD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/usgs/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,12 @@ export declare class UsgsService {
|
|
|
17
17
|
count: number;
|
|
18
18
|
feedUrl: string;
|
|
19
19
|
}>;
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Query USGS FDSN event API. `params.offset` pages through the match set
|
|
22
|
+
* (1-based, forwarded to the upstream `offset` parameter). When results are
|
|
23
|
+
* truncated at the requested limit, a follow-up count query populates
|
|
24
|
+
* totalCount with the real match total for the whole filter set.
|
|
25
|
+
*/
|
|
21
26
|
searchEvents(params: EarthquakeQueryParams, ctx: Context): Promise<{
|
|
22
27
|
events: EarthquakeEvent[];
|
|
23
28
|
count: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usgs-service.d.ts","sourceRoot":"","sources":["../../../src/services/usgs/usgs-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"usgs-service.d.ts","sourceRoot":"","sources":["../../../src/services/usgs/usgs-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EAItB,MAAM,YAAY,CAAC;AA2DpB,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGjC,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM;IAMnB,gDAAgD;IAChD,OAAO,CACL,aAAa,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,aAAa,EAC5D,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,EAC7C,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAwC9F;;;;;OAKG;IACG,YAAY,CAChB,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QACT,MAAM,EAAE,eAAe,EAAE,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAwDF,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAuCjE,qCAAqC;IACrC,WAAW,CACT,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,OAAO,GACX,OAAO,CAAC;QACT,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;IAoCF,2CAA2C;IAC3C,OAAO,CAAC,cAAc;CAsBvB;AAMD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,IAAI,CAEN;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module services/usgs/usgs-service
|
|
4
4
|
*/
|
|
5
5
|
import { notFound, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
6
|
-
import { fetchWithTimeout,
|
|
6
|
+
import { fetchWithTimeout, requestContextService, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
7
7
|
/** Convert a USGS epoch-millisecond timestamp to an ISO 8601 string. */
|
|
8
8
|
function epochMsToIso(ms) {
|
|
9
9
|
if (ms == null)
|
|
@@ -35,7 +35,7 @@ function normalizeUsgsFeature(f) {
|
|
|
35
35
|
return {
|
|
36
36
|
id: f.id,
|
|
37
37
|
title: p.title ?? `M ${p.mag ?? '?'} - ${p.place ?? 'Unknown location'}`,
|
|
38
|
-
magnitude: p.mag ??
|
|
38
|
+
magnitude: p.mag ?? null,
|
|
39
39
|
magnitude_type: p.magType ?? 'unknown',
|
|
40
40
|
time: epochMsToIso(p.time),
|
|
41
41
|
updated: epochMsToIso(p.updated),
|
|
@@ -70,12 +70,8 @@ export class UsgsService {
|
|
|
70
70
|
signal: ctx.signal,
|
|
71
71
|
headers: { Accept: 'application/json' },
|
|
72
72
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
service: 'USGS Feed',
|
|
76
|
-
data: { feedUrl },
|
|
77
|
-
});
|
|
78
|
-
}
|
|
73
|
+
// fetchWithTimeout throws a status-mapped McpError on any non-2xx before
|
|
74
|
+
// returning, so a Response here is always 2xx.
|
|
79
75
|
const text = await response.text();
|
|
80
76
|
if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
|
|
81
77
|
throw serviceUnavailable('USGS returned HTML instead of GeoJSON — likely rate-limited or a CDN error.', { feedUrl });
|
|
@@ -95,41 +91,32 @@ export class UsgsService {
|
|
|
95
91
|
signal: ctx.signal,
|
|
96
92
|
});
|
|
97
93
|
}
|
|
98
|
-
/**
|
|
99
|
-
|
|
94
|
+
/**
|
|
95
|
+
* Query USGS FDSN event API. `params.offset` pages through the match set
|
|
96
|
+
* (1-based, forwarded to the upstream `offset` parameter). When results are
|
|
97
|
+
* truncated at the requested limit, a follow-up count query populates
|
|
98
|
+
* totalCount with the real match total for the whole filter set.
|
|
99
|
+
*/
|
|
100
|
+
async searchEvents(params, ctx) {
|
|
100
101
|
const query = this.buildFdsnQuery(params);
|
|
101
102
|
const url = `${this.baseUrl}/fdsnws/event/1/query?format=geojson&${query}`;
|
|
102
103
|
const reqCtx = makeReqCtx('UsgsService.searchEvents', ctx);
|
|
103
|
-
|
|
104
|
+
const result = await withRetry(async () => {
|
|
104
105
|
const response = await fetchWithTimeout(url, this.timeoutMs, reqCtx, {
|
|
105
106
|
signal: ctx.signal,
|
|
106
107
|
headers: { Accept: 'application/json' },
|
|
107
108
|
});
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const body = await response.text();
|
|
111
|
-
const broadMatch = /(\d+) matching events exceeds search limit/.exec(body);
|
|
112
|
-
if (broadMatch?.[1]) {
|
|
113
|
-
const totalCount = parseInt(broadMatch[1], 10);
|
|
114
|
-
throw Object.assign(new Error(`Query matches ${totalCount} events, exceeding the 20,000-event limit. ` +
|
|
115
|
-
'Narrow time range, raise min_magnitude, or add location filters.'), { code: -32007, data: { reason: 'query_too_broad', totalCount } });
|
|
116
|
-
}
|
|
117
|
-
throw await httpErrorFromResponse(response, { service: 'USGS FDSN' });
|
|
118
|
-
}
|
|
119
|
-
if (!response.ok) {
|
|
120
|
-
throw await httpErrorFromResponse(response, { service: 'USGS FDSN', data: { url } });
|
|
121
|
-
}
|
|
109
|
+
// fetchWithTimeout throws a status-mapped McpError on any non-2xx before
|
|
110
|
+
// returning, so a Response here is always 2xx.
|
|
122
111
|
const text = await response.text();
|
|
123
112
|
if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
|
|
124
113
|
throw serviceUnavailable('USGS returned HTML instead of GeoJSON.', { url });
|
|
125
114
|
}
|
|
126
115
|
const data = JSON.parse(text);
|
|
127
116
|
const events = data.features.map(normalizeUsgsFeature);
|
|
128
|
-
const requestedLimit = params.limit ?? 100;
|
|
129
117
|
return {
|
|
130
118
|
events,
|
|
131
119
|
count: events.length,
|
|
132
|
-
...(data.metadata.count > requestedLimit ? { totalCount: data.metadata.count } : {}),
|
|
133
120
|
};
|
|
134
121
|
}, {
|
|
135
122
|
operation: 'UsgsService.searchEvents',
|
|
@@ -137,6 +124,26 @@ export class UsgsService {
|
|
|
137
124
|
baseDelayMs: 1000,
|
|
138
125
|
signal: ctx.signal,
|
|
139
126
|
});
|
|
127
|
+
// The query response's metadata.count is the returned-event count, not the
|
|
128
|
+
// database total — the real total comes from the FDSN count endpoint. Fetch
|
|
129
|
+
// it only when results were truncated at the limit; a count failure degrades
|
|
130
|
+
// to an absent totalCount rather than failing the search.
|
|
131
|
+
const requestedLimit = params.limit ?? 100;
|
|
132
|
+
if (result.count > 0 && result.count === requestedLimit) {
|
|
133
|
+
// The total is a property of the filter set, not of the page — offset,
|
|
134
|
+
// limit, and orderBy are stripped so every page reports the same total.
|
|
135
|
+
const { limit: _limit, offset: _offset, orderBy: _orderBy, ...countParams } = params;
|
|
136
|
+
try {
|
|
137
|
+
const { count: totalCount } = await this.countEvents(countParams, ctx);
|
|
138
|
+
return { ...result, totalCount };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
ctx.log.warning('Count sub-call for totalCount failed — returning results without it', {
|
|
142
|
+
error: err instanceof Error ? err.message : String(err),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
140
147
|
}
|
|
141
148
|
/** Fetch a single event by USGS event ID. */
|
|
142
149
|
getEvent(eventId, ctx) {
|
|
@@ -177,12 +184,8 @@ export class UsgsService {
|
|
|
177
184
|
signal: ctx.signal,
|
|
178
185
|
headers: { Accept: 'application/json' },
|
|
179
186
|
});
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
service: 'USGS Count',
|
|
183
|
-
data: { url },
|
|
184
|
-
});
|
|
185
|
-
}
|
|
187
|
+
// fetchWithTimeout throws a status-mapped McpError on any non-2xx before
|
|
188
|
+
// returning, so a Response here is always 2xx.
|
|
186
189
|
const text = await response.text();
|
|
187
190
|
if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
|
|
188
191
|
throw serviceUnavailable('USGS returned HTML instead of JSON.', { url });
|
|
@@ -230,6 +233,9 @@ export class UsgsService {
|
|
|
230
233
|
q.set('minsig', String(params.minSignificance));
|
|
231
234
|
if (params.limit != null)
|
|
232
235
|
q.set('limit', String(params.limit));
|
|
236
|
+
// FDSN offset is 1-based — offset=1 is the first match, and 0 is rejected.
|
|
237
|
+
if (params.offset != null)
|
|
238
|
+
q.set('offset', String(params.offset));
|
|
233
239
|
if (params.orderBy)
|
|
234
240
|
q.set('orderby', params.orderBy);
|
|
235
241
|
return q.toString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usgs-service.js","sourceRoot":"","sources":["../../../src/services/usgs/usgs-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAE7E,OAAO,
|
|
1
|
+
{"version":3,"file":"usgs-service.js","sourceRoot":"","sources":["../../../src/services/usgs/usgs-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/earthquake-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"mcpName": "io.github.cyanheads/earthquake-mcp-server",
|
|
5
5
|
"description": "Search USGS and EMSC seismic data — real-time feeds, event queries, and earthquake counts via MCP. STDIO or Streamable HTTP.",
|
|
6
6
|
"type": "module",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"url": "https://github.com/cyanheads/earthquake-mcp-server/issues"
|
|
56
56
|
},
|
|
57
57
|
"homepage": "https://github.com/cyanheads/earthquake-mcp-server#readme",
|
|
58
|
-
"author": "
|
|
58
|
+
"author": "Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)",
|
|
59
59
|
"funding": [
|
|
60
60
|
{
|
|
61
61
|
"type": "github",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
}
|
|
68
68
|
],
|
|
69
69
|
"license": "Apache-2.0",
|
|
70
|
-
"packageManager": "bun@1.3.
|
|
70
|
+
"packageManager": "bun@1.3.14",
|
|
71
71
|
"engines": {
|
|
72
72
|
"bun": ">=1.3.0",
|
|
73
73
|
"node": ">=24.0.0"
|
|
@@ -76,17 +76,18 @@
|
|
|
76
76
|
"access": "public"
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
|
-
"@cyanheads/mcp-ts-core": "^0.10.
|
|
79
|
+
"@cyanheads/mcp-ts-core": "^0.10.16",
|
|
80
80
|
"pino-pretty": "^13.1.3",
|
|
81
81
|
"zod": "^4.4.3"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
|
-
"@biomejs/biome": "^2.5.
|
|
85
|
-
"@
|
|
84
|
+
"@biomejs/biome": "^2.5.5",
|
|
85
|
+
"@socketsecurity/bun-security-scanner": "^1.1.2",
|
|
86
|
+
"@types/node": "^26.1.1",
|
|
86
87
|
"depcheck": "^1.4.7",
|
|
87
|
-
"ignore": "^7.0.
|
|
88
|
-
"tsc-alias": "^1.
|
|
88
|
+
"ignore": "^7.0.6",
|
|
89
|
+
"tsc-alias": "^1.9.1",
|
|
89
90
|
"typescript": "^6.0.3",
|
|
90
|
-
"vitest": "^4.1.
|
|
91
|
+
"vitest": "^4.1.10"
|
|
91
92
|
}
|
|
92
93
|
}
|
package/server.json
CHANGED
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
"url": "https://earthquake.caseyjhand.com/mcp"
|
|
13
13
|
}
|
|
14
14
|
],
|
|
15
|
-
"version": "0.
|
|
15
|
+
"version": "0.2.0",
|
|
16
16
|
"packages": [
|
|
17
17
|
{
|
|
18
18
|
"registryType": "npm",
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/earthquake-mcp-server",
|
|
21
21
|
"runtimeHint": "bun",
|
|
22
|
-
"version": "0.
|
|
22
|
+
"version": "0.2.0",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
49
49
|
"identifier": "@cyanheads/earthquake-mcp-server",
|
|
50
50
|
"runtimeHint": "bun",
|
|
51
|
-
"version": "0.
|
|
51
|
+
"version": "0.2.0",
|
|
52
52
|
"packageArguments": [
|
|
53
53
|
{
|
|
54
54
|
"type": "positional",
|