@squawk/mcp 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.
Files changed (56) hide show
  1. package/README.md +301 -0
  2. package/dist/bin.d.ts +11 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/bin.js +41 -0
  5. package/dist/index.d.ts +24 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +23 -0
  8. package/dist/resolvers.d.ts +60 -0
  9. package/dist/resolvers.d.ts.map +1 -0
  10. package/dist/resolvers.js +94 -0
  11. package/dist/server.d.ts +45 -0
  12. package/dist/server.d.ts.map +1 -0
  13. package/dist/server.js +92 -0
  14. package/dist/tools/airports.d.ts +16 -0
  15. package/dist/tools/airports.d.ts.map +1 -0
  16. package/dist/tools/airports.js +142 -0
  17. package/dist/tools/airspace.d.ts +15 -0
  18. package/dist/tools/airspace.d.ts.map +1 -0
  19. package/dist/tools/airspace.js +81 -0
  20. package/dist/tools/airways.d.ts +14 -0
  21. package/dist/tools/airways.d.ts.map +1 -0
  22. package/dist/tools/airways.js +115 -0
  23. package/dist/tools/datasets.d.ts +18 -0
  24. package/dist/tools/datasets.d.ts.map +1 -0
  25. package/dist/tools/datasets.js +78 -0
  26. package/dist/tools/fixes.d.ts +14 -0
  27. package/dist/tools/fixes.d.ts.map +1 -0
  28. package/dist/tools/fixes.js +108 -0
  29. package/dist/tools/flight-math.d.ts +23 -0
  30. package/dist/tools/flight-math.d.ts.map +1 -0
  31. package/dist/tools/flight-math.js +643 -0
  32. package/dist/tools/flightplan.d.ts +17 -0
  33. package/dist/tools/flightplan.d.ts.map +1 -0
  34. package/dist/tools/flightplan.js +64 -0
  35. package/dist/tools/geo.d.ts +15 -0
  36. package/dist/tools/geo.d.ts.map +1 -0
  37. package/dist/tools/geo.js +127 -0
  38. package/dist/tools/icao-registry.d.ts +19 -0
  39. package/dist/tools/icao-registry.d.ts.map +1 -0
  40. package/dist/tools/icao-registry.js +45 -0
  41. package/dist/tools/navaids.d.ts +14 -0
  42. package/dist/tools/navaids.d.ts.map +1 -0
  43. package/dist/tools/navaids.js +143 -0
  44. package/dist/tools/notams.d.ts +13 -0
  45. package/dist/tools/notams.d.ts.map +1 -0
  46. package/dist/tools/notams.js +29 -0
  47. package/dist/tools/procedures.d.ts +15 -0
  48. package/dist/tools/procedures.d.ts.map +1 -0
  49. package/dist/tools/procedures.js +120 -0
  50. package/dist/tools/tool-helpers.d.ts +66 -0
  51. package/dist/tools/tool-helpers.d.ts.map +1 -0
  52. package/dist/tools/tool-helpers.js +55 -0
  53. package/dist/tools/weather.d.ts +18 -0
  54. package/dist/tools/weather.d.ts.map +1 -0
  55. package/dist/tools/weather.js +215 -0
  56. package/package.json +77 -0
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * Shared helpers used by multiple tool modules. Internal to `@squawk/mcp` and
4
+ * not re-exported from the package entrypoint.
5
+ */
6
+ /**
7
+ * A single per-record parse failure as returned by the AWC fetch helpers.
8
+ * Captures the raw record text and the thrown error.
9
+ */
10
+ export interface ParseRecordErrorLike {
11
+ /** The raw input record that failed to parse. */
12
+ raw: string;
13
+ /** The error thrown by the underlying parser. */
14
+ error: unknown;
15
+ }
16
+ /**
17
+ * Summary form of a per-record parse failure suitable for MCP tool output.
18
+ * The error is reduced to its message string so the structured payload
19
+ * round-trips cleanly through JSON.
20
+ */
21
+ export interface ParseRecordErrorSummary {
22
+ /** The raw input record that failed to parse. */
23
+ raw: string;
24
+ /** Human-readable message extracted from the parser's thrown error. */
25
+ message: string;
26
+ }
27
+ /**
28
+ * Reduces an array of {@link ParseRecordErrorLike} entries to a JSON-friendly
29
+ * shape. Used by every weather fetch tool to surface partial parse failures
30
+ * in `structuredContent` without leaking thrown error objects.
31
+ *
32
+ * @param errors - Per-record parse errors as returned by `@squawk/weather/fetch`.
33
+ * @returns The errors with each `error` value reduced to its message string.
34
+ */
35
+ export declare function summarizeParseErrors(errors: readonly ParseRecordErrorLike[]): ParseRecordErrorSummary[];
36
+ /**
37
+ * Runs a synchronous parser inside a tool handler and packages the outcome
38
+ * into the MCP result shape. On success the parsed record is returned as
39
+ * pretty JSON in `content` and as `structuredContent[resultKey]`. On failure
40
+ * the parser message is forwarded verbatim and the result is flagged
41
+ * `isError: true` so the model can react to the failure.
42
+ *
43
+ * The return type is intentionally an inline literal rather than a named
44
+ * interface: the MCP SDK's tool-result type carries an `[x: string]: unknown`
45
+ * index signature that nominal interfaces do not satisfy without explicit
46
+ * declaration, while inline object types are accepted at the call site
47
+ * through TypeScript's freshness rules.
48
+ *
49
+ * @param raw - The raw input string passed to the parser.
50
+ * @param parser - A pure parser function that may throw on bad input.
51
+ * @param resultKey - The key under which the parsed record is exposed in
52
+ * `structuredContent`.
53
+ * @returns The MCP tool result.
54
+ */
55
+ export declare function runParser<T>(raw: string, parser: (raw: string) => T, resultKey: string): {
56
+ /** Standard MCP content blocks (always a single text block here). */
57
+ content: {
58
+ type: 'text';
59
+ text: string;
60
+ }[];
61
+ /** Structured payload exposed to the client, keyed by `resultKey`. */
62
+ structuredContent: Record<string, T | null>;
63
+ /** Set to `true` when the parser threw; omitted on success. */
64
+ isError?: boolean;
65
+ };
66
+ //# sourceMappingURL=tool-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../../src/tools/tool-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,oBAAoB,EAAE,GACtC,uBAAuB,EAAE,CAK3B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,EAC1B,SAAS,EAAE,MAAM,GAChB;IACD,qEAAqE;IACrE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,sEAAsE;IACtE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5C,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAeA"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * Shared helpers used by multiple tool modules. Internal to `@squawk/mcp` and
4
+ * not re-exported from the package entrypoint.
5
+ */
6
+ /**
7
+ * Reduces an array of {@link ParseRecordErrorLike} entries to a JSON-friendly
8
+ * shape. Used by every weather fetch tool to surface partial parse failures
9
+ * in `structuredContent` without leaking thrown error objects.
10
+ *
11
+ * @param errors - Per-record parse errors as returned by `@squawk/weather/fetch`.
12
+ * @returns The errors with each `error` value reduced to its message string.
13
+ */
14
+ export function summarizeParseErrors(errors) {
15
+ return errors.map((err) => ({
16
+ raw: err.raw,
17
+ message: err.error instanceof Error ? err.error.message : String(err.error),
18
+ }));
19
+ }
20
+ /**
21
+ * Runs a synchronous parser inside a tool handler and packages the outcome
22
+ * into the MCP result shape. On success the parsed record is returned as
23
+ * pretty JSON in `content` and as `structuredContent[resultKey]`. On failure
24
+ * the parser message is forwarded verbatim and the result is flagged
25
+ * `isError: true` so the model can react to the failure.
26
+ *
27
+ * The return type is intentionally an inline literal rather than a named
28
+ * interface: the MCP SDK's tool-result type carries an `[x: string]: unknown`
29
+ * index signature that nominal interfaces do not satisfy without explicit
30
+ * declaration, while inline object types are accepted at the call site
31
+ * through TypeScript's freshness rules.
32
+ *
33
+ * @param raw - The raw input string passed to the parser.
34
+ * @param parser - A pure parser function that may throw on bad input.
35
+ * @param resultKey - The key under which the parsed record is exposed in
36
+ * `structuredContent`.
37
+ * @returns The MCP tool result.
38
+ */
39
+ export function runParser(raw, parser, resultKey) {
40
+ try {
41
+ const parsed = parser(raw);
42
+ return {
43
+ content: [{ type: 'text', text: JSON.stringify(parsed, null, 2) }],
44
+ structuredContent: { [resultKey]: parsed },
45
+ };
46
+ }
47
+ catch (err) {
48
+ const message = err instanceof Error ? err.message : String(err);
49
+ return {
50
+ content: [{ type: 'text', text: `Parse failed: ${message}` }],
51
+ structuredContent: { [resultKey]: null },
52
+ isError: true,
53
+ };
54
+ }
55
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * MCP tool module wrapping `@squawk/weather` parsing utilities and the live
4
+ * `@squawk/weather/fetch` client for the Aviation Weather Center text API.
5
+ *
6
+ * Parsing tools accept user-pasted METAR/TAF/SIGMET/AIRMET/PIREP strings and
7
+ * return the parsed objects. Fetch tools issue HTTP requests to the AWC API
8
+ * and return both the parsed records and any per-record parse errors so the
9
+ * model can surface partial failures.
10
+ */
11
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ /**
13
+ * Registers weather parsing and live-fetch tools on the given MCP server.
14
+ *
15
+ * @param server - The MCP server instance to register tools on.
16
+ */
17
+ export declare function registerWeatherTools(server: McpServer): void;
18
+ //# sourceMappingURL=weather.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather.d.ts","sourceRoot":"","sources":["../../src/tools/weather.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyDzE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsO5D"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * MCP tool module wrapping `@squawk/weather` parsing utilities and the live
4
+ * `@squawk/weather/fetch` client for the Aviation Weather Center text API.
5
+ *
6
+ * Parsing tools accept user-pasted METAR/TAF/SIGMET/AIRMET/PIREP strings and
7
+ * return the parsed objects. Fetch tools issue HTTP requests to the AWC API
8
+ * and return both the parsed records and any per-record parse errors so the
9
+ * model can surface partial failures.
10
+ */
11
+ import { parseAirmet, parseMetar, parsePirep, parseSigmet, parseTaf } from '@squawk/weather';
12
+ import { fetchInternationalSigmets, fetchMetar, fetchPirep, fetchSigmets, fetchTaf, } from '@squawk/weather/fetch';
13
+ import { z } from 'zod';
14
+ import { runParser, summarizeParseErrors } from './tool-helpers.js';
15
+ /** Allowed values for the AWC SIGMET hazard filter. */
16
+ const SIGMET_HAZARD_VALUES = [
17
+ 'conv',
18
+ 'turb',
19
+ 'ice',
20
+ 'ifr',
21
+ ];
22
+ /** Allowed values for the AWC PIREP minimum intensity filter. */
23
+ const PIREP_INTENSITY_VALUES = [
24
+ 'lgt',
25
+ 'mod',
26
+ 'sev',
27
+ ];
28
+ /**
29
+ * Optional override for the Aviation Weather Center base URL. Read once at
30
+ * module load from the `SQUAWK_AWC_BASE_URL` environment variable. When set,
31
+ * every live `fetch_*` tool routes its request through the override - useful
32
+ * for proxies, regional mirrors, and pointing tests at a local stub server.
33
+ * Empty/whitespace values are treated as unset.
34
+ */
35
+ const AWC_BASE_URL_OVERRIDE = (() => {
36
+ const raw = process.env.SQUAWK_AWC_BASE_URL;
37
+ if (raw === undefined) {
38
+ return undefined;
39
+ }
40
+ const trimmed = raw.trim();
41
+ return trimmed.length > 0 ? trimmed : undefined;
42
+ })();
43
+ /**
44
+ * Returns a fresh {@link FetchWeatherOptions} object pre-populated with the
45
+ * AWC base-URL override when one is configured. Each fetch tool spreads its
46
+ * own options on top of the result.
47
+ */
48
+ function baseFetchOptions() {
49
+ return AWC_BASE_URL_OVERRIDE !== undefined ? { baseUrl: AWC_BASE_URL_OVERRIDE } : {};
50
+ }
51
+ /**
52
+ * Registers weather parsing and live-fetch tools on the given MCP server.
53
+ *
54
+ * @param server - The MCP server instance to register tools on.
55
+ */
56
+ export function registerWeatherTools(server) {
57
+ // ---------------------------------------------------------------------------
58
+ // Parsers
59
+ // ---------------------------------------------------------------------------
60
+ server.registerTool('parse_metar', {
61
+ title: 'Parse a METAR or SPECI report',
62
+ description: 'Parses a raw METAR or SPECI observation string into a structured object including wind, visibility, RVR, weather phenomena, sky condition, temperature, dewpoint, altimeter, remarks, and a derived flight category (VFR/MVFR/IFR/LIFR).',
63
+ inputSchema: {
64
+ raw: z.string().min(1).describe('Raw METAR or SPECI report text.'),
65
+ },
66
+ }, ({ raw }) => runParser(raw, parseMetar, 'metar'));
67
+ server.registerTool('parse_taf', {
68
+ title: 'Parse a TAF forecast',
69
+ description: 'Parses a raw TAF (Terminal Aerodrome Forecast) string into a structured object with the validity period and ordered forecast change groups (FM, BECMG, TEMPO, PROB).',
70
+ inputSchema: {
71
+ raw: z.string().min(1).describe('Raw TAF report text.'),
72
+ },
73
+ }, ({ raw }) => runParser(raw, parseTaf, 'taf'));
74
+ server.registerTool('parse_sigmet', {
75
+ title: 'Parse a SIGMET bulletin',
76
+ description: 'Parses a raw SIGMET (Significant Meteorological Information) bulletin in either US domestic or international ICAO format, returning a structured object with the FIR/area, hazard type, validity period, geometry, and movement.',
77
+ inputSchema: {
78
+ raw: z.string().min(1).describe('Raw SIGMET bulletin text.'),
79
+ },
80
+ }, ({ raw }) => runParser(raw, parseSigmet, 'sigmet'));
81
+ server.registerTool('parse_airmet', {
82
+ title: 'Parse an AIRMET bulletin',
83
+ description: "Parses a raw AIRMET (Airmen's Meteorological Information) bulletin into a structured object with the issuing center, validity period, hazard type, and area.",
84
+ inputSchema: {
85
+ raw: z.string().min(1).describe('Raw AIRMET bulletin text.'),
86
+ },
87
+ }, ({ raw }) => runParser(raw, parseAirmet, 'airmet'));
88
+ server.registerTool('parse_pirep', {
89
+ title: 'Parse a PIREP report',
90
+ description: 'Parses a raw PIREP (Pilot Report) string into a structured object with location, time, aircraft type, altitude, sky cover, weather, turbulence, icing, and remarks.',
91
+ inputSchema: {
92
+ raw: z.string().min(1).describe('Raw PIREP report text.'),
93
+ },
94
+ }, ({ raw }) => runParser(raw, parsePirep, 'pirep'));
95
+ // ---------------------------------------------------------------------------
96
+ // Fetch (Aviation Weather Center text API)
97
+ // ---------------------------------------------------------------------------
98
+ server.registerTool('fetch_metar', {
99
+ title: 'Fetch live METARs from the Aviation Weather Center',
100
+ description: "Fetches current METARs for one or more stations from the Aviation Weather Center text API and parses each record. Returns both the parsed METARs and any per-record parse errors. Use the parsed METAR's flightCategory field to summarize conditions.",
101
+ inputSchema: {
102
+ stations: z
103
+ .array(z.string().min(1))
104
+ .min(1)
105
+ .describe('One or more ICAO station identifiers (e.g. ["KJFK", "KLAX"]). The AWC API joins these with commas in a single request.'),
106
+ },
107
+ }, async ({ stations }) => {
108
+ const { metars, parseErrors } = await fetchMetar(stations, baseFetchOptions());
109
+ const payload = { metars, parseErrors: summarizeParseErrors(parseErrors) };
110
+ return {
111
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
112
+ structuredContent: payload,
113
+ };
114
+ });
115
+ server.registerTool('fetch_taf', {
116
+ title: 'Fetch live TAFs from the Aviation Weather Center',
117
+ description: 'Fetches current TAFs for one or more stations from the Aviation Weather Center text API and parses each record. Returns both the parsed TAFs and any per-record parse errors.',
118
+ inputSchema: {
119
+ stations: z
120
+ .array(z.string().min(1))
121
+ .min(1)
122
+ .describe('One or more ICAO station identifiers (e.g. ["KJFK", "KLAX"]).'),
123
+ },
124
+ }, async ({ stations }) => {
125
+ const { tafs, parseErrors } = await fetchTaf(stations, baseFetchOptions());
126
+ const payload = { tafs, parseErrors: summarizeParseErrors(parseErrors) };
127
+ return {
128
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
129
+ structuredContent: payload,
130
+ };
131
+ });
132
+ server.registerTool('fetch_pirep', {
133
+ title: 'Fetch live PIREPs from the Aviation Weather Center',
134
+ description: 'Fetches recent PIREPs centered on a single 4-letter ICAO station (e.g. "KDEN") from the Aviation Weather Center text API. Returns the parsed PIREPs and any per-record parse errors.',
135
+ inputSchema: {
136
+ station: z
137
+ .string()
138
+ .min(4)
139
+ .max(4)
140
+ .describe('4-letter ICAO station identifier used as the search center (the API rejects shorter forms).'),
141
+ radiusNm: z
142
+ .number()
143
+ .positive()
144
+ .optional()
145
+ .describe('Optional search radius in nautical miles around the center station.'),
146
+ ageHours: z
147
+ .number()
148
+ .positive()
149
+ .optional()
150
+ .describe('Optional hours back to search for reports.'),
151
+ levelHundredsFt: z
152
+ .number()
153
+ .positive()
154
+ .optional()
155
+ .describe('Optional altitude in hundreds of feet; the AWC API widens +/-3000 ft around this value.'),
156
+ minimumIntensity: z
157
+ .enum(PIREP_INTENSITY_VALUES)
158
+ .optional()
159
+ .describe('Optional minimum report intensity ("lgt" = light, "mod" = moderate, "sev" = severe).'),
160
+ },
161
+ }, async ({ station, radiusNm, ageHours, levelHundredsFt, minimumIntensity }) => {
162
+ const options = baseFetchOptions();
163
+ if (radiusNm !== undefined) {
164
+ options.distance = radiusNm;
165
+ }
166
+ if (ageHours !== undefined) {
167
+ options.age = ageHours;
168
+ }
169
+ if (levelHundredsFt !== undefined) {
170
+ options.level = levelHundredsFt;
171
+ }
172
+ if (minimumIntensity !== undefined) {
173
+ options.inten = minimumIntensity;
174
+ }
175
+ const { pireps, parseErrors } = await fetchPirep(station, options);
176
+ const payload = { pireps, parseErrors: summarizeParseErrors(parseErrors) };
177
+ return {
178
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
179
+ structuredContent: payload,
180
+ };
181
+ });
182
+ server.registerTool('fetch_sigmets', {
183
+ title: 'Fetch active US (CONUS) SIGMETs',
184
+ description: 'Fetches all currently active US domestic SIGMETs from the Aviation Weather Center. The endpoint is not station-filtered; it returns the full active set. Optionally restrict to a single hazard type.',
185
+ inputSchema: {
186
+ hazard: z
187
+ .enum(SIGMET_HAZARD_VALUES)
188
+ .optional()
189
+ .describe('Optional hazard filter: "conv" (convective), "turb" (turbulence), "ice" (icing), or "ifr" (IFR conditions).'),
190
+ },
191
+ }, async ({ hazard }) => {
192
+ const options = baseFetchOptions();
193
+ if (hazard !== undefined) {
194
+ options.hazard = hazard;
195
+ }
196
+ const { sigmets, parseErrors } = await fetchSigmets(options);
197
+ const payload = { sigmets, parseErrors: summarizeParseErrors(parseErrors) };
198
+ return {
199
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
200
+ structuredContent: payload,
201
+ };
202
+ });
203
+ server.registerTool('fetch_international_sigmets', {
204
+ title: 'Fetch active international (ICAO-format) SIGMETs',
205
+ description: 'Fetches all currently active international SIGMETs (ICAO format) from the Aviation Weather Center. Excludes US domestic SIGMETs - use fetch_sigmets for those.',
206
+ inputSchema: {},
207
+ }, async () => {
208
+ const { sigmets, parseErrors } = await fetchInternationalSigmets(baseFetchOptions());
209
+ const payload = { sigmets, parseErrors: summarizeParseErrors(parseErrors) };
210
+ return {
211
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
212
+ structuredContent: payload,
213
+ };
214
+ });
215
+ }
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@squawk/mcp",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "description": "Model Context Protocol server exposing squawk's aviation libraries as tools for LLM clients",
6
+ "author": "Neil Cochran",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/neilcochran/squawk",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/neilcochran/squawk.git",
12
+ "directory": "packages/mcp"
13
+ },
14
+ "engines": {
15
+ "node": ">=22"
16
+ },
17
+ "typedocMain": "src/index.ts",
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "bin": {
21
+ "squawk-mcp": "./dist/bin.js"
22
+ },
23
+ "exports": {
24
+ ".": {
25
+ "import": "./dist/index.js",
26
+ "types": "./dist/index.d.ts"
27
+ }
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "!dist/**/*.spec.*"
32
+ ],
33
+ "scripts": {
34
+ "build": "tsc && chmod +x dist/bin.js",
35
+ "test": "node --test 'dist/**/*.spec.js'",
36
+ "lint": "tsc --noEmit && eslint src"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.29.0",
40
+ "@squawk/airport-data": "*",
41
+ "@squawk/airports": "*",
42
+ "@squawk/airspace": "*",
43
+ "@squawk/airspace-data": "*",
44
+ "@squawk/airway-data": "*",
45
+ "@squawk/airways": "*",
46
+ "@squawk/fix-data": "*",
47
+ "@squawk/fixes": "*",
48
+ "@squawk/flight-math": "*",
49
+ "@squawk/flightplan": "*",
50
+ "@squawk/geo": "*",
51
+ "@squawk/icao-registry": "*",
52
+ "@squawk/icao-registry-data": "*",
53
+ "@squawk/navaid-data": "*",
54
+ "@squawk/navaids": "*",
55
+ "@squawk/notams": "*",
56
+ "@squawk/procedure-data": "*",
57
+ "@squawk/procedures": "*",
58
+ "@squawk/types": "*",
59
+ "@squawk/weather": "*",
60
+ "zod": "^4.3.6"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^25.6.0"
64
+ },
65
+ "keywords": [
66
+ "aviation",
67
+ "typescript",
68
+ "mcp",
69
+ "model-context-protocol",
70
+ "llm",
71
+ "claude",
72
+ "anthropic"
73
+ ],
74
+ "publishConfig": {
75
+ "access": "public"
76
+ }
77
+ }