@cyanheads/earthquake-mcp-server 0.1.1
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 +388 -0
- package/Dockerfile +98 -0
- package/LICENSE +201 -0
- package/README.md +291 -0
- package/changelog/0.1.x/0.1.0.md +19 -0
- package/changelog/0.1.x/0.1.1.md +20 -0
- package/changelog/template.md +119 -0
- package/dist/config/server-config.d.ts +14 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +43 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/earthquake-event.resource.d.ts +40 -0
- package/dist/mcp-server/resources/definitions/earthquake-event.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/earthquake-event.resource.js +27 -0
- package/dist/mcp-server/resources/definitions/earthquake-event.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.d.ts +24 -0
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.js +76 -0
- package/dist/mcp-server/resources/definitions/earthquake-feed.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.d.ts +48 -0
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.js +170 -0
- package/dist/mcp-server/tools/definitions/earthquake-count.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-event.tool.d.ts +46 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-event.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-event.tool.js +50 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-event.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.d.ts +61 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.js +88 -0
- package/dist/mcp-server/tools/definitions/earthquake-get-feed.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.d.ts +89 -0
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.js +199 -0
- package/dist/mcp-server/tools/definitions/earthquake-search.tool.js.map +1 -0
- package/dist/mcp-server/tools/schemas.d.ts +60 -0
- package/dist/mcp-server/tools/schemas.d.ts.map +1 -0
- package/dist/mcp-server/tools/schemas.js +83 -0
- package/dist/mcp-server/tools/schemas.js.map +1 -0
- package/dist/services/emsc/emsc-service.d.ts +30 -0
- package/dist/services/emsc/emsc-service.d.ts.map +1 -0
- package/dist/services/emsc/emsc-service.js +170 -0
- package/dist/services/emsc/emsc-service.js.map +1 -0
- package/dist/services/usgs/types.d.ts +136 -0
- package/dist/services/usgs/types.d.ts.map +1 -0
- package/dist/services/usgs/types.js +6 -0
- package/dist/services/usgs/types.js.map +1 -0
- package/dist/services/usgs/usgs-service.d.ts +39 -0
- package/dist/services/usgs/usgs-service.d.ts.map +1 -0
- package/dist/services/usgs/usgs-service.js +283 -0
- package/dist/services/usgs/usgs-service.js.map +1 -0
- package/package.json +78 -0
- package/server.json +99 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Server-specific environment variable configuration for earthquake-mcp-server.
|
|
3
|
+
* @module config/server-config
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { parseEnvConfig } from '@cyanheads/mcp-ts-core/config';
|
|
7
|
+
const ServerConfigSchema = z.object({
|
|
8
|
+
usgsBaseUrl: z
|
|
9
|
+
.string()
|
|
10
|
+
.url()
|
|
11
|
+
.default('https://earthquake.usgs.gov')
|
|
12
|
+
.describe('USGS API base URL. Override for testing or mirroring.'),
|
|
13
|
+
emscBaseUrl: z
|
|
14
|
+
.string()
|
|
15
|
+
.url()
|
|
16
|
+
.default('https://www.seismicportal.eu')
|
|
17
|
+
.describe('EMSC API base URL. Override for testing or mirroring.'),
|
|
18
|
+
defaultLimit: z.coerce
|
|
19
|
+
.number()
|
|
20
|
+
.int()
|
|
21
|
+
.min(1)
|
|
22
|
+
.max(20000)
|
|
23
|
+
.default(100)
|
|
24
|
+
.describe('Default result limit for earthquake_search.'),
|
|
25
|
+
requestTimeoutMs: z.coerce
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(1000)
|
|
29
|
+
.max(120000)
|
|
30
|
+
.default(10000)
|
|
31
|
+
.describe('HTTP timeout in milliseconds.'),
|
|
32
|
+
});
|
|
33
|
+
let _config;
|
|
34
|
+
export function getServerConfig() {
|
|
35
|
+
_config ??= parseEnvConfig(ServerConfigSchema, {
|
|
36
|
+
usgsBaseUrl: 'USGS_BASE_URL',
|
|
37
|
+
emscBaseUrl: 'EMSC_BASE_URL',
|
|
38
|
+
defaultLimit: 'DEFAULT_LIMIT',
|
|
39
|
+
requestTimeoutMs: 'REQUEST_TIMEOUT_MS',
|
|
40
|
+
});
|
|
41
|
+
return _config;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=server-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,EAAE;SACL,OAAO,CAAC,6BAA6B,CAAC;SACtC,QAAQ,CAAC,uDAAuD,CAAC;IACpE,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,EAAE;SACL,OAAO,CAAC,8BAA8B,CAAC;SACvC,QAAQ,CAAC,uDAAuD,CAAC;IACpE,YAAY,EAAE,CAAC,CAAC,MAAM;SACnB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,KAAK,CAAC;SACV,OAAO,CAAC,GAAG,CAAC;SACZ,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,gBAAgB,EAAE,CAAC,CAAC,MAAM;SACvB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,IAAI,CAAC;SACT,GAAG,CAAC,MAAM,CAAC;SACX,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,+BAA+B,CAAC;CAC7C,CAAC,CAAC;AAEH,IAAI,OAAuD,CAAC;AAE5D,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,cAAc,CAAC,kBAAkB,EAAE;QAC7C,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,eAAe;QAC7B,gBAAgB,EAAE,oBAAoB;KACvC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview earthquake-mcp-server MCP server entry point.
|
|
4
|
+
* @module index
|
|
5
|
+
*/
|
|
6
|
+
import { createApp } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { getServerConfig } from './config/server-config.js';
|
|
8
|
+
import { earthquakeEventResource } from './mcp-server/resources/definitions/earthquake-event.resource.js';
|
|
9
|
+
import { earthquakeFeedResource } from './mcp-server/resources/definitions/earthquake-feed.resource.js';
|
|
10
|
+
import { earthquakeCount } from './mcp-server/tools/definitions/earthquake-count.tool.js';
|
|
11
|
+
import { earthquakeGetEvent } from './mcp-server/tools/definitions/earthquake-get-event.tool.js';
|
|
12
|
+
import { earthquakeGetFeed } from './mcp-server/tools/definitions/earthquake-get-feed.tool.js';
|
|
13
|
+
import { earthquakeSearch } from './mcp-server/tools/definitions/earthquake-search.tool.js';
|
|
14
|
+
import { initEmscService } from './services/emsc/emsc-service.js';
|
|
15
|
+
import { initUsgsService } from './services/usgs/usgs-service.js';
|
|
16
|
+
await createApp({
|
|
17
|
+
tools: [earthquakeGetFeed, earthquakeSearch, earthquakeGetEvent, earthquakeCount],
|
|
18
|
+
resources: [earthquakeFeedResource, earthquakeEventResource],
|
|
19
|
+
prompts: [],
|
|
20
|
+
setup(core) {
|
|
21
|
+
const config = getServerConfig();
|
|
22
|
+
initUsgsService(core.config, core.storage, config.usgsBaseUrl, config.requestTimeoutMs);
|
|
23
|
+
initEmscService(core.config, core.storage, config.emscBaseUrl, config.requestTimeoutMs);
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,EAAE,sBAAsB,EAAE,MAAM,gEAAgE,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,yDAAyD,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,4DAA4D,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,0DAA0D,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,SAAS,CAAC;IACd,KAAK,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,CAAC;IACjF,SAAS,EAAE,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;IAC5D,OAAO,EAAE,EAAE;IACX,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACxF,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC1F,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resource definition for accessing full USGS earthquake event detail by ID via URI.
|
|
3
|
+
* @module mcp-server/resources/definitions/earthquake-event.resource
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
export declare const earthquakeEventResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
|
|
7
|
+
event_id: z.ZodString;
|
|
8
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
9
|
+
event: z.ZodObject<{
|
|
10
|
+
id: z.ZodString;
|
|
11
|
+
title: z.ZodString;
|
|
12
|
+
magnitude: z.ZodNumber;
|
|
13
|
+
magnitude_type: z.ZodString;
|
|
14
|
+
time: z.ZodString;
|
|
15
|
+
updated: z.ZodString;
|
|
16
|
+
place: z.ZodString;
|
|
17
|
+
latitude: z.ZodNumber;
|
|
18
|
+
longitude: z.ZodNumber;
|
|
19
|
+
depth_km: z.ZodNumber;
|
|
20
|
+
felt: z.ZodNullable<z.ZodNumber>;
|
|
21
|
+
cdi: z.ZodNullable<z.ZodNumber>;
|
|
22
|
+
mmi: z.ZodNullable<z.ZodNumber>;
|
|
23
|
+
alert: z.ZodNullable<z.ZodEnum<{
|
|
24
|
+
green: "green";
|
|
25
|
+
yellow: "yellow";
|
|
26
|
+
orange: "orange";
|
|
27
|
+
red: "red";
|
|
28
|
+
}>>;
|
|
29
|
+
tsunami: z.ZodNumber;
|
|
30
|
+
significance: z.ZodNullable<z.ZodNumber>;
|
|
31
|
+
status: z.ZodEnum<{
|
|
32
|
+
automatic: "automatic";
|
|
33
|
+
reviewed: "reviewed";
|
|
34
|
+
deleted: "deleted";
|
|
35
|
+
}>;
|
|
36
|
+
event_url: z.ZodOptional<z.ZodString>;
|
|
37
|
+
detail_url: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
}, z.core.$strip>, undefined>;
|
|
40
|
+
//# sourceMappingURL=earthquake-event.resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-event.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/earthquake-event.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIrD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAsBlC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resource definition for accessing full USGS earthquake event detail by ID via URI.
|
|
3
|
+
* @module mcp-server/resources/definitions/earthquake-event.resource
|
|
4
|
+
*/
|
|
5
|
+
import { resource, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { EarthquakeEventSchema } from '../../../mcp-server/tools/schemas.js';
|
|
7
|
+
import { getUsgsService } from '../../../services/usgs/usgs-service.js';
|
|
8
|
+
export const earthquakeEventResource = resource('earthquake://event/{event_id}', {
|
|
9
|
+
name: 'earthquake-event',
|
|
10
|
+
title: 'USGS Earthquake Event',
|
|
11
|
+
description: 'Full earthquake event detail by USGS event ID as injectable context. ' +
|
|
12
|
+
'Returns the complete property set including felt reports, ShakeMap intensity, PAGER alert, and products metadata. ' +
|
|
13
|
+
'Use event IDs from earthquake_get_feed or earthquake_search results.',
|
|
14
|
+
mimeType: 'application/json',
|
|
15
|
+
params: z.object({
|
|
16
|
+
event_id: z.string().describe('USGS event ID, e.g. "us6000sznj" or "hv74966427".'),
|
|
17
|
+
}),
|
|
18
|
+
output: z.object({
|
|
19
|
+
event: EarthquakeEventSchema.describe('Full earthquake event detail.'),
|
|
20
|
+
}),
|
|
21
|
+
async handler(params, ctx) {
|
|
22
|
+
ctx.log.debug('Fetching event resource', { event_id: params.event_id });
|
|
23
|
+
const event = await getUsgsService().getEvent(params.event_id, ctx);
|
|
24
|
+
return { event };
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=earthquake-event.resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-event.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/earthquake-event.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC,+BAA+B,EAAE;IAC/E,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EACT,uEAAuE;QACvE,oHAAoH;QACpH,sEAAsE;IACxE,QAAQ,EAAE,kBAAkB;IAE5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KACnF,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KACvE,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resource definition for direct access to USGS real-time earthquake feeds by URI.
|
|
3
|
+
* @module mcp-server/resources/definitions/earthquake-feed.resource
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
export declare const earthquakeFeedResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
|
|
7
|
+
magnitude_tier: z.ZodString;
|
|
8
|
+
time_window: z.ZodString;
|
|
9
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
10
|
+
count: z.ZodNumber;
|
|
11
|
+
generated_at: z.ZodString;
|
|
12
|
+
events: z.ZodArray<z.ZodObject<{
|
|
13
|
+
id: z.ZodString;
|
|
14
|
+
title: z.ZodString;
|
|
15
|
+
magnitude: z.ZodNumber;
|
|
16
|
+
time: z.ZodString;
|
|
17
|
+
place: z.ZodString;
|
|
18
|
+
latitude: z.ZodNumber;
|
|
19
|
+
longitude: z.ZodNumber;
|
|
20
|
+
depth_km: z.ZodNumber;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
feed_url: z.ZodString;
|
|
23
|
+
}, z.core.$strip>, undefined>;
|
|
24
|
+
//# sourceMappingURL=earthquake-feed.resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-feed.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/earthquake-feed.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAOrD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;6BAoFjC,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resource definition for direct access to USGS real-time earthquake feeds by URI.
|
|
3
|
+
* @module mcp-server/resources/definitions/earthquake-feed.resource
|
|
4
|
+
*/
|
|
5
|
+
import { resource, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { notFound } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getUsgsService } from '../../../services/usgs/usgs-service.js';
|
|
8
|
+
const VALID_TIERS = ['all', '1.0', '2.5', '4.5', 'significant'];
|
|
9
|
+
const VALID_WINDOWS = ['hour', 'day', 'week', 'month'];
|
|
10
|
+
export const earthquakeFeedResource = resource('earthquake://feed/{magnitude_tier}/{time_window}', {
|
|
11
|
+
name: 'earthquake-feed',
|
|
12
|
+
title: 'USGS Earthquake Feed',
|
|
13
|
+
description: 'Direct access to a USGS real-time earthquake feed as injectable context. ' +
|
|
14
|
+
'magnitude_tier: all | 1.0 | 2.5 | 4.5 | significant. ' +
|
|
15
|
+
'time_window: hour | day | week | month.',
|
|
16
|
+
mimeType: 'application/json',
|
|
17
|
+
params: z.object({
|
|
18
|
+
magnitude_tier: z.string().describe('Magnitude tier: all, 1.0, 2.5, 4.5, or significant.'),
|
|
19
|
+
time_window: z.string().describe('Time window: hour, day, week, or month.'),
|
|
20
|
+
}),
|
|
21
|
+
output: z.object({
|
|
22
|
+
count: z.number().describe('Number of events in the feed.'),
|
|
23
|
+
generated_at: z.string().describe('ISO 8601 UTC timestamp when USGS generated this feed.'),
|
|
24
|
+
events: z
|
|
25
|
+
.array(z
|
|
26
|
+
.object({
|
|
27
|
+
id: z.string().describe('USGS event identifier.'),
|
|
28
|
+
title: z.string().describe('Human-readable event summary.'),
|
|
29
|
+
magnitude: z.number().describe('Preferred magnitude value.'),
|
|
30
|
+
time: z.string().describe('ISO 8601 UTC origin time.'),
|
|
31
|
+
place: z.string().describe('Nearest named location.'),
|
|
32
|
+
latitude: z.number().describe('Epicenter latitude in decimal degrees.'),
|
|
33
|
+
longitude: z.number().describe('Epicenter longitude in decimal degrees.'),
|
|
34
|
+
depth_km: z.number().describe('Hypocenter depth in kilometers.'),
|
|
35
|
+
})
|
|
36
|
+
.describe('A single earthquake event.'))
|
|
37
|
+
.describe('Earthquake events, newest first.'),
|
|
38
|
+
feed_url: z.string().describe('Source feed URL.'),
|
|
39
|
+
}),
|
|
40
|
+
async handler(params, ctx) {
|
|
41
|
+
if (!VALID_TIERS.includes(params.magnitude_tier)) {
|
|
42
|
+
throw notFound(`Unknown magnitude tier "${params.magnitude_tier}". Valid tiers: ${VALID_TIERS.join(', ')}.`, { magnitude_tier: params.magnitude_tier });
|
|
43
|
+
}
|
|
44
|
+
if (!VALID_WINDOWS.includes(params.time_window)) {
|
|
45
|
+
throw notFound(`Unknown time window "${params.time_window}". Valid windows: ${VALID_WINDOWS.join(', ')}.`, { time_window: params.time_window });
|
|
46
|
+
}
|
|
47
|
+
const tier = params.magnitude_tier;
|
|
48
|
+
const window = params.time_window;
|
|
49
|
+
ctx.log.debug('Fetching feed resource', { tier, window });
|
|
50
|
+
const result = await getUsgsService().getFeed(tier, window, ctx);
|
|
51
|
+
return {
|
|
52
|
+
count: result.count,
|
|
53
|
+
generated_at: result.generatedAt,
|
|
54
|
+
events: result.events.map((e) => ({
|
|
55
|
+
id: e.id,
|
|
56
|
+
title: e.title,
|
|
57
|
+
magnitude: e.magnitude,
|
|
58
|
+
time: e.time,
|
|
59
|
+
place: e.place,
|
|
60
|
+
latitude: e.latitude,
|
|
61
|
+
longitude: e.longitude,
|
|
62
|
+
depth_km: e.depth_km,
|
|
63
|
+
})),
|
|
64
|
+
feed_url: result.feedUrl,
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
list: () => ({
|
|
68
|
+
resources: VALID_TIERS.flatMap((tier) => VALID_WINDOWS.map((window) => ({
|
|
69
|
+
uri: `earthquake://feed/${tier}/${window}`,
|
|
70
|
+
name: `USGS ${tier} earthquakes (${window})`,
|
|
71
|
+
description: `USGS real-time feed: M${tier}+ events in the last ${window}.`,
|
|
72
|
+
mimeType: 'application/json',
|
|
73
|
+
}))),
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=earthquake-feed.resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-feed.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/earthquake-feed.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAU,CAAC;AACzE,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEhE,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,kDAAkD,EAAE;IACjG,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,sBAAsB;IAC7B,WAAW,EACT,2EAA2E;QAC3E,uDAAuD;QACvD,yCAAyC;IAC3C,QAAQ,EAAE,kBAAkB;IAE5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAC1F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KAC5E,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC3D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QAC1F,MAAM,EAAE,CAAC;aACN,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC3D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YACvE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACjE,CAAC;aACD,QAAQ,CAAC,4BAA4B,CAAC,CAC1C;aACA,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAClD,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,cAA8C,CAAC,EAAE,CAAC;YACjF,MAAM,QAAQ,CACZ,2BAA2B,MAAM,CAAC,cAAc,mBAAmB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAC5F,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAC1C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,WAA6C,CAAC,EAAE,CAAC;YAClF,MAAM,QAAQ,CACZ,wBAAwB,MAAM,CAAC,WAAW,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAC1F,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CACpC,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,cAA8C,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,CAAC,WAA6C,CAAC;QAEpE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAEjE,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;YACH,QAAQ,EAAE,MAAM,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACX,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACtC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7B,GAAG,EAAE,qBAAqB,IAAI,IAAI,MAAM,EAAE;YAC1C,IAAI,EAAE,QAAQ,IAAI,iBAAiB,MAAM,GAAG;YAC5C,WAAW,EAAE,yBAAyB,IAAI,wBAAwB,MAAM,GAAG;YAC3E,QAAQ,EAAE,kBAAkB;SAC7B,CAAC,CAAC,CACJ;KACF,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool definition for counting earthquakes matching filters without fetching full records.
|
|
3
|
+
* @module mcp-server/tools/definitions/earthquake-count.tool
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const earthquakeCount: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
start_time: z.ZodOptional<z.ZodString>;
|
|
9
|
+
end_time: z.ZodOptional<z.ZodString>;
|
|
10
|
+
min_magnitude: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
max_magnitude: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
latitude: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
longitude: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
radius_km: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
min_depth_km: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
max_depth_km: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
alert_level: z.ZodOptional<z.ZodEnum<{
|
|
18
|
+
green: "green";
|
|
19
|
+
yellow: "yellow";
|
|
20
|
+
orange: "orange";
|
|
21
|
+
red: "red";
|
|
22
|
+
}>>;
|
|
23
|
+
min_felt: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
min_significance: z.ZodOptional<z.ZodNumber>;
|
|
25
|
+
source: z.ZodDefault<z.ZodEnum<{
|
|
26
|
+
usgs: "usgs";
|
|
27
|
+
emsc: "emsc";
|
|
28
|
+
}>>;
|
|
29
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
30
|
+
count: z.ZodNumber;
|
|
31
|
+
max_allowed: z.ZodNullable<z.ZodNumber>;
|
|
32
|
+
source: z.ZodEnum<{
|
|
33
|
+
usgs: "usgs";
|
|
34
|
+
emsc: "emsc";
|
|
35
|
+
}>;
|
|
36
|
+
exceeds_limit: z.ZodBoolean;
|
|
37
|
+
}, z.core.$strip>, readonly [{
|
|
38
|
+
readonly reason: "invalid_radius";
|
|
39
|
+
readonly code: JsonRpcErrorCode.InvalidParams;
|
|
40
|
+
readonly when: "latitude or longitude provided without radius_km, or vice versa.";
|
|
41
|
+
readonly recovery: "Provide latitude, longitude, and radius_km together for a location-based count.";
|
|
42
|
+
}, {
|
|
43
|
+
readonly reason: "source_unavailable";
|
|
44
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
45
|
+
readonly when: "Selected source API returns non-2xx or times out.";
|
|
46
|
+
readonly recovery: "Try the other source (usgs or emsc) or retry after a short delay.";
|
|
47
|
+
}]>;
|
|
48
|
+
//# sourceMappingURL=earthquake-count.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-count.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/earthquake-count.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuM1B,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool definition for counting earthquakes matching filters without fetching full records.
|
|
3
|
+
* @module mcp-server/tools/definitions/earthquake-count.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getEmscService } from '../../../services/emsc/emsc-service.js';
|
|
8
|
+
import { getUsgsService } from '../../../services/usgs/usgs-service.js';
|
|
9
|
+
export const earthquakeCount = tool('earthquake_count', {
|
|
10
|
+
title: 'Count Earthquakes',
|
|
11
|
+
description: 'Count earthquakes matching filters without fetching full records. ' +
|
|
12
|
+
'Use for statistical queries ("how many M5+ earthquakes in 2025?") or to gauge result size ' +
|
|
13
|
+
'before calling earthquake_search. ' +
|
|
14
|
+
'When exceeds_limit is true, the count exceeds 20,000 and a full search would be truncated — ' +
|
|
15
|
+
'narrow filters before fetching. ' +
|
|
16
|
+
'USGS returns the max_allowed cap (20,000); EMSC count endpoint does not return this field ' +
|
|
17
|
+
'(max_allowed will be null). ' +
|
|
18
|
+
'USGS-specific filters (alert_level, min_felt, min_significance) are ignored when source=emsc.',
|
|
19
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
20
|
+
input: z.object({
|
|
21
|
+
start_time: z
|
|
22
|
+
.string()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Start of time range as ISO 8601 (e.g. "2026-01-01" or "2026-05-23T00:00:00"). ' +
|
|
25
|
+
'Defaults to 30 days before end_time if omitted.'),
|
|
26
|
+
end_time: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('End of time range as ISO 8601. Defaults to current time if omitted.'),
|
|
30
|
+
min_magnitude: z
|
|
31
|
+
.number()
|
|
32
|
+
.min(-1)
|
|
33
|
+
.max(10)
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('Minimum magnitude (Richter or equivalent). ' +
|
|
36
|
+
'M2.5+ is felt by some people; M5+ can cause damage; M7+ is major.'),
|
|
37
|
+
max_magnitude: z.number().min(-1).max(10).optional().describe('Maximum magnitude.'),
|
|
38
|
+
latitude: z
|
|
39
|
+
.number()
|
|
40
|
+
.min(-90)
|
|
41
|
+
.max(90)
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('Latitude for radius search. Requires longitude and radius_km.'),
|
|
44
|
+
longitude: z
|
|
45
|
+
.number()
|
|
46
|
+
.min(-180)
|
|
47
|
+
.max(180)
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Longitude for radius search. Requires latitude and radius_km.'),
|
|
50
|
+
radius_km: z
|
|
51
|
+
.number()
|
|
52
|
+
.min(0)
|
|
53
|
+
.max(20002)
|
|
54
|
+
.optional()
|
|
55
|
+
.describe('Search radius in kilometers from the lat/lon point. ' +
|
|
56
|
+
'Converted to degrees for EMSC (1° ≈ 111.2 km).'),
|
|
57
|
+
min_depth_km: z
|
|
58
|
+
.number()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('Minimum depth in kilometers. ' +
|
|
61
|
+
'Shallow quakes (0–70 km) typically cause more surface damage than deep quakes (>300 km).'),
|
|
62
|
+
max_depth_km: z.number().optional().describe('Maximum depth in kilometers.'),
|
|
63
|
+
alert_level: z
|
|
64
|
+
.enum(['green', 'yellow', 'orange', 'red'])
|
|
65
|
+
.optional()
|
|
66
|
+
.describe('Minimum PAGER alert level. PAGER estimates economic loss and casualties. ' +
|
|
67
|
+
'"green" = minimal impact; "red" = extreme. Only available from USGS.'),
|
|
68
|
+
min_felt: z
|
|
69
|
+
.number()
|
|
70
|
+
.int()
|
|
71
|
+
.min(1)
|
|
72
|
+
.optional()
|
|
73
|
+
.describe('Minimum number of DYFI (Did You Feel It?) reports. ' +
|
|
74
|
+
'Use to count events with confirmed public impact. Only available from USGS.'),
|
|
75
|
+
min_significance: z
|
|
76
|
+
.number()
|
|
77
|
+
.int()
|
|
78
|
+
.optional()
|
|
79
|
+
.describe('Minimum USGS significance score (0–2000+). ' +
|
|
80
|
+
'Combines magnitude, felt reports, and PAGER estimates. ' +
|
|
81
|
+
'Significant events typically score 600+. Only available from USGS.'),
|
|
82
|
+
source: z
|
|
83
|
+
.enum(['usgs', 'emsc'])
|
|
84
|
+
.default('usgs')
|
|
85
|
+
.describe('Data source. ' +
|
|
86
|
+
'"usgs" covers global events with PAGER, DYFI, and ShakeMap metadata. ' +
|
|
87
|
+
'"emsc" covers the European-Mediterranean region.'),
|
|
88
|
+
}),
|
|
89
|
+
output: z.object({
|
|
90
|
+
count: z.number().describe('Number of events matching the query.'),
|
|
91
|
+
max_allowed: z
|
|
92
|
+
.number()
|
|
93
|
+
.nullable()
|
|
94
|
+
.describe('Maximum events the API would return for a full fetch. 20000 for USGS. ' +
|
|
95
|
+
'Null for EMSC — the EMSC count endpoint does not return this field.'),
|
|
96
|
+
source: z.enum(['usgs', 'emsc']).describe('Data source used.'),
|
|
97
|
+
exceeds_limit: z
|
|
98
|
+
.boolean()
|
|
99
|
+
.describe('True when count exceeds 20000 — a full earthquake_search would be truncated. ' +
|
|
100
|
+
'For EMSC, evaluated against the known 20000 limit since max_allowed is not returned. ' +
|
|
101
|
+
'Narrow filters to retrieve all matching events.'),
|
|
102
|
+
}),
|
|
103
|
+
errors: [
|
|
104
|
+
{
|
|
105
|
+
reason: 'invalid_radius',
|
|
106
|
+
code: JsonRpcErrorCode.InvalidParams,
|
|
107
|
+
when: 'latitude or longitude provided without radius_km, or vice versa.',
|
|
108
|
+
recovery: 'Provide latitude, longitude, and radius_km together for a location-based count.',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
reason: 'source_unavailable',
|
|
112
|
+
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
113
|
+
when: 'Selected source API returns non-2xx or times out.',
|
|
114
|
+
recovery: 'Try the other source (usgs or emsc) or retry after a short delay.',
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
async handler(input, ctx) {
|
|
118
|
+
const latProvided = input.latitude != null;
|
|
119
|
+
const lonProvided = input.longitude != null;
|
|
120
|
+
const radiusProvided = input.radius_km != null;
|
|
121
|
+
if ((latProvided || lonProvided || radiusProvided) &&
|
|
122
|
+
!(latProvided && lonProvided && radiusProvided)) {
|
|
123
|
+
throw ctx.fail('invalid_radius', 'Radius search requires latitude, longitude, and radius_km — provide all three together.', { ...ctx.recoveryFor('invalid_radius') });
|
|
124
|
+
}
|
|
125
|
+
ctx.log.info('Counting earthquakes', {
|
|
126
|
+
source: input.source,
|
|
127
|
+
start_time: input.start_time,
|
|
128
|
+
min_magnitude: input.min_magnitude,
|
|
129
|
+
});
|
|
130
|
+
// Use conditional spreads to satisfy exactOptionalPropertyTypes
|
|
131
|
+
const params = {
|
|
132
|
+
...(input.start_time != null ? { startTime: input.start_time } : {}),
|
|
133
|
+
...(input.end_time != null ? { endTime: input.end_time } : {}),
|
|
134
|
+
...(input.min_magnitude != null ? { minMagnitude: input.min_magnitude } : {}),
|
|
135
|
+
...(input.max_magnitude != null ? { maxMagnitude: input.max_magnitude } : {}),
|
|
136
|
+
...(input.latitude != null ? { latitude: input.latitude } : {}),
|
|
137
|
+
...(input.longitude != null ? { longitude: input.longitude } : {}),
|
|
138
|
+
...(input.radius_km != null ? { radiusKm: input.radius_km } : {}),
|
|
139
|
+
...(input.min_depth_km != null ? { minDepthKm: input.min_depth_km } : {}),
|
|
140
|
+
...(input.max_depth_km != null ? { maxDepthKm: input.max_depth_km } : {}),
|
|
141
|
+
...(input.alert_level != null ? { alertLevel: input.alert_level } : {}),
|
|
142
|
+
...(input.min_felt != null ? { minFelt: input.min_felt } : {}),
|
|
143
|
+
...(input.min_significance != null ? { minSignificance: input.min_significance } : {}),
|
|
144
|
+
};
|
|
145
|
+
const result = input.source === 'emsc'
|
|
146
|
+
? await getEmscService().countEvents(params, ctx)
|
|
147
|
+
: await getUsgsService().countEvents(params, ctx);
|
|
148
|
+
ctx.log.info('Count completed', {
|
|
149
|
+
source: input.source,
|
|
150
|
+
count: result.count,
|
|
151
|
+
exceeds_limit: result.exceedsLimit,
|
|
152
|
+
});
|
|
153
|
+
return {
|
|
154
|
+
count: result.count,
|
|
155
|
+
max_allowed: result.maxAllowed,
|
|
156
|
+
source: input.source,
|
|
157
|
+
exceeds_limit: result.exceedsLimit,
|
|
158
|
+
};
|
|
159
|
+
},
|
|
160
|
+
format: (result) => {
|
|
161
|
+
const lines = [
|
|
162
|
+
`**Source:** ${result.source.toUpperCase()}`,
|
|
163
|
+
`**Count:** ${result.count}`,
|
|
164
|
+
`**Max allowed:** ${result.max_allowed ?? 'Not reported by EMSC'}`,
|
|
165
|
+
`**Exceeds limit:** ${result.exceeds_limit ? '⚠️ Yes — full search would be truncated. Narrow filters.' : 'No'}`,
|
|
166
|
+
];
|
|
167
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=earthquake-count.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-count.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/earthquake-count.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool definition for fetching full detail for a specific USGS earthquake event.
|
|
3
|
+
* @module mcp-server/tools/definitions/earthquake-get-event.tool
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
export declare const earthquakeGetEvent: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
|
+
event_id: z.ZodString;
|
|
9
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
10
|
+
event: z.ZodObject<{
|
|
11
|
+
id: z.ZodString;
|
|
12
|
+
title: z.ZodString;
|
|
13
|
+
magnitude: z.ZodNumber;
|
|
14
|
+
magnitude_type: z.ZodString;
|
|
15
|
+
time: z.ZodString;
|
|
16
|
+
updated: z.ZodString;
|
|
17
|
+
place: z.ZodString;
|
|
18
|
+
latitude: z.ZodNumber;
|
|
19
|
+
longitude: z.ZodNumber;
|
|
20
|
+
depth_km: z.ZodNumber;
|
|
21
|
+
felt: z.ZodNullable<z.ZodNumber>;
|
|
22
|
+
cdi: z.ZodNullable<z.ZodNumber>;
|
|
23
|
+
mmi: z.ZodNullable<z.ZodNumber>;
|
|
24
|
+
alert: z.ZodNullable<z.ZodEnum<{
|
|
25
|
+
green: "green";
|
|
26
|
+
yellow: "yellow";
|
|
27
|
+
orange: "orange";
|
|
28
|
+
red: "red";
|
|
29
|
+
}>>;
|
|
30
|
+
tsunami: z.ZodNumber;
|
|
31
|
+
significance: z.ZodNullable<z.ZodNumber>;
|
|
32
|
+
status: z.ZodEnum<{
|
|
33
|
+
automatic: "automatic";
|
|
34
|
+
reviewed: "reviewed";
|
|
35
|
+
deleted: "deleted";
|
|
36
|
+
}>;
|
|
37
|
+
event_url: z.ZodOptional<z.ZodString>;
|
|
38
|
+
detail_url: z.ZodOptional<z.ZodString>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
}, z.core.$strip>, readonly [{
|
|
41
|
+
readonly reason: "not_found";
|
|
42
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
43
|
+
readonly when: "No event matches the provided event_id.";
|
|
44
|
+
readonly recovery: string;
|
|
45
|
+
}]>;
|
|
46
|
+
//# sourceMappingURL=earthquake-get-event.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-get-event.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/earthquake-get-event.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoD7B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool definition for fetching full detail for a specific USGS earthquake event.
|
|
3
|
+
* @module mcp-server/tools/definitions/earthquake-get-event.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { EarthquakeEventSchema, formatEvent } from '../../../mcp-server/tools/schemas.js';
|
|
8
|
+
import { getUsgsService } from '../../../services/usgs/usgs-service.js';
|
|
9
|
+
export const earthquakeGetEvent = tool('earthquake_get_event', {
|
|
10
|
+
title: 'Get Earthquake Event Detail',
|
|
11
|
+
description: 'Fetch complete detail for a specific earthquake by USGS event ID. ' +
|
|
12
|
+
'Returns the full property set including felt reports count (DYFI), ShakeMap maximum intensity (MMI), ' +
|
|
13
|
+
'PAGER alert level, tsunami flag, and magnitude type. ' +
|
|
14
|
+
'Event IDs appear in the "id" field of earthquake_get_feed and earthquake_search results. ' +
|
|
15
|
+
'This tool is USGS-only — EMSC events have no per-event detail endpoint.',
|
|
16
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
17
|
+
input: z.object({
|
|
18
|
+
event_id: z
|
|
19
|
+
.string()
|
|
20
|
+
.describe('USGS event ID, e.g. "hv74966427" or "us6000sznj". ' +
|
|
21
|
+
'Found in the "id" field of earthquake_get_feed and earthquake_search results.'),
|
|
22
|
+
}),
|
|
23
|
+
output: z.object({
|
|
24
|
+
event: EarthquakeEventSchema.describe('Full earthquake event detail.'),
|
|
25
|
+
}),
|
|
26
|
+
errors: [
|
|
27
|
+
{
|
|
28
|
+
reason: 'not_found',
|
|
29
|
+
code: JsonRpcErrorCode.NotFound,
|
|
30
|
+
when: 'No event matches the provided event_id.',
|
|
31
|
+
recovery: 'Verify the event ID from a feed or search result. ' +
|
|
32
|
+
'IDs are network-specific strings like "us6000sznj" or "hv74966427".',
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
async handler(input, ctx) {
|
|
36
|
+
ctx.log.info('Fetching earthquake event detail', { event_id: input.event_id });
|
|
37
|
+
const event = await getUsgsService().getEvent(input.event_id, ctx);
|
|
38
|
+
ctx.log.info('Event fetched', {
|
|
39
|
+
event_id: input.event_id,
|
|
40
|
+
magnitude: event.magnitude,
|
|
41
|
+
place: event.place,
|
|
42
|
+
});
|
|
43
|
+
return { event };
|
|
44
|
+
},
|
|
45
|
+
format: (result) => {
|
|
46
|
+
const lines = formatEvent(result.event);
|
|
47
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=earthquake-get-event.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earthquake-get-event.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/earthquake-get-event.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,EAAE;IAC7D,KAAK,EAAE,6BAA6B;IACpC,WAAW,EACT,oEAAoE;QACpE,uGAAuG;QACvG,uDAAuD;QACvD,2FAA2F;QAC3F,yEAAyE;IAC3E,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAE9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CACP,oDAAoD;YAClD,+EAA+E,CAClF;KACJ,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KACvE,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,yCAAyC;YAC/C,QAAQ,EACN,oDAAoD;gBACpD,qEAAqE;SACxE;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE/E,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEnE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|