@morphemeris/mcp 0.1.1 → 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/dist/index.js CHANGED
@@ -322,8 +322,218 @@ function registerGetSiderealTime(server2, client) {
322
322
  );
323
323
  }
324
324
 
325
- // src/tools/list-available-values.ts
325
+ // src/tools/find-eclipses-solar.ts
326
326
  import { z as z8 } from "zod";
327
+ function registerFindSolarEclipses(server2, client) {
328
+ server2.tool(
329
+ "find_solar_eclipses",
330
+ "Finds upcoming or past solar eclipses from a given date. Returns global eclipse data by default, or location-specific data (magnitude, obscuration) when observer coordinates are provided. Supports filtering by eclipse type and returning multiple results.",
331
+ {
332
+ datetime: z8.string().optional().describe("ISO 8601 UTC datetime to search from. Provide either datetime or jd."),
333
+ jd: z8.number().optional().describe("Julian Day number in UT1 to search from. Provide either datetime or jd."),
334
+ lat: z8.number().min(-90).max(90).optional().describe("Observer latitude (-90 to 90). Enables local mode with magnitude and obscuration."),
335
+ lon: z8.number().min(-180).max(180).optional().describe("Observer longitude (-180 to 180, east positive)."),
336
+ alt: z8.number().optional().describe("Observer altitude in meters above sea level."),
337
+ type: z8.string().optional().describe("Filter by eclipse type: 'total', 'annular', 'partial', 'annular_total' (comma-separated)."),
338
+ backward: z8.boolean().optional().describe("If true, search backward in time. Default: false."),
339
+ count: z8.number().min(1).max(10).optional().describe("Number of eclipses to return (1-10). Default: 1.")
340
+ },
341
+ async ({ datetime, jd, lat, lon, alt, type, backward, count }) => {
342
+ if (!datetime && jd === void 0) {
343
+ return {
344
+ isError: true,
345
+ content: [{ type: "text", text: "Either 'datetime' or 'jd' is required." }]
346
+ };
347
+ }
348
+ const body = {};
349
+ if (datetime) body.datetime = datetime;
350
+ if (jd !== void 0) body.jd = jd;
351
+ if (lat !== void 0) body.lat = lat;
352
+ if (lon !== void 0) body.lon = lon;
353
+ if (alt !== void 0) body.alt = alt;
354
+ if (type) body.type = type;
355
+ if (backward !== void 0) body.backward = backward;
356
+ if (count !== void 0) body.count = count;
357
+ const response = await client.callEndpoint("/v1/eclipses/solar", body);
358
+ return {
359
+ content: [{ type: "text", text: JSON.stringify(response, null, 2) }]
360
+ };
361
+ }
362
+ );
363
+ }
364
+
365
+ // src/tools/find-eclipses-lunar.ts
366
+ import { z as z9 } from "zod";
367
+ function registerFindLunarEclipses(server2, client) {
368
+ server2.tool(
369
+ "find_lunar_eclipses",
370
+ "Finds upcoming or past lunar eclipses from a given date. Returns eclipse phase times (penumbral, partial, total). When observer coordinates are provided, includes a visibility flag. Supports filtering by type and returning multiple results.",
371
+ {
372
+ datetime: z9.string().optional().describe("ISO 8601 UTC datetime to search from. Provide either datetime or jd."),
373
+ jd: z9.number().optional().describe("Julian Day number in UT1 to search from. Provide either datetime or jd."),
374
+ lat: z9.number().min(-90).max(90).optional().describe("Observer latitude (-90 to 90). Enables visibility check."),
375
+ lon: z9.number().min(-180).max(180).optional().describe("Observer longitude (-180 to 180, east positive)."),
376
+ alt: z9.number().optional().describe("Observer altitude in meters above sea level."),
377
+ type: z9.string().optional().describe("Filter by eclipse type: 'total', 'partial', 'penumbral' (comma-separated)."),
378
+ backward: z9.boolean().optional().describe("If true, search backward in time. Default: false."),
379
+ count: z9.number().min(1).max(10).optional().describe("Number of eclipses to return (1-10). Default: 1.")
380
+ },
381
+ async ({ datetime, jd, lat, lon, alt, type, backward, count }) => {
382
+ if (!datetime && jd === void 0) {
383
+ return {
384
+ isError: true,
385
+ content: [{ type: "text", text: "Either 'datetime' or 'jd' is required." }]
386
+ };
387
+ }
388
+ const body = {};
389
+ if (datetime) body.datetime = datetime;
390
+ if (jd !== void 0) body.jd = jd;
391
+ if (lat !== void 0) body.lat = lat;
392
+ if (lon !== void 0) body.lon = lon;
393
+ if (alt !== void 0) body.alt = alt;
394
+ if (type) body.type = type;
395
+ if (backward !== void 0) body.backward = backward;
396
+ if (count !== void 0) body.count = count;
397
+ const response = await client.callEndpoint("/v1/eclipses/lunar", body);
398
+ return {
399
+ content: [{ type: "text", text: JSON.stringify(response, null, 2) }]
400
+ };
401
+ }
402
+ );
403
+ }
404
+
405
+ // src/tools/find-heliacal-event.ts
406
+ import { z as z10 } from "zod";
407
+ function registerFindHeliacalEvent(server2, client) {
408
+ server2.tool(
409
+ "find_heliacal_event",
410
+ "Finds the next heliacal rising or setting of a planet \u2014 when it first becomes visible in the morning or evening sky. Requires observer location. Uses the Schaefer sky brightness model with configurable atmospheric and observer parameters. Sun and Moon are excluded. Outer planets cannot have evening_first or morning_last events.",
411
+ {
412
+ datetime: z10.string().optional().describe("ISO 8601 UTC datetime to search from. Provide either datetime or jd."),
413
+ jd: z10.number().optional().describe("Julian Day number in UT1 to search from. Provide either datetime or jd."),
414
+ body: z10.string().describe("Planet name (not sun or moon). E.g., 'venus', 'mars', 'jupiter'."),
415
+ event: z10.enum([
416
+ "morning_first",
417
+ "evening_last",
418
+ "evening_first",
419
+ "morning_last",
420
+ "acronychal_rising",
421
+ "acronychal_setting"
422
+ ]).describe("Heliacal event type. evening_first and morning_last are for inner planets only."),
423
+ lat: z10.number().min(-90).max(90).describe("Observer latitude in decimal degrees (-90 to 90). Required."),
424
+ lon: z10.number().min(-180).max(180).describe("Observer longitude in decimal degrees (-180 to 180, east positive). Required."),
425
+ alt: z10.number().optional().describe("Observer altitude in meters above sea level. Default: 0."),
426
+ pressure_mbar: z10.number().optional().describe("Atmospheric pressure in mbar. Default: 1013.25."),
427
+ temp_celsius: z10.number().optional().describe("Temperature in Celsius. Default: 15.0."),
428
+ humidity_pct: z10.number().optional().describe("Relative humidity (0-100). Default: 40.0."),
429
+ visibility_range_km: z10.number().optional().describe("Visibility range in km (0 = model default). Default: 0.0."),
430
+ age_years: z10.number().optional().describe("Observer age in years. Default: 36.0."),
431
+ snellen_ratio: z10.number().optional().describe("Visual acuity (1.0 = normal). Default: 1.0."),
432
+ binoculars: z10.boolean().optional().describe("Binocular vision. Default: true."),
433
+ telescope_aperture_cm: z10.number().optional().describe("Telescope aperture in cm (0 = naked eye). Default: 0.0."),
434
+ telescope_magnification: z10.number().optional().describe("Telescope magnification (1.0 = naked eye). Default: 1.0.")
435
+ },
436
+ async ({
437
+ datetime,
438
+ jd,
439
+ body: bodyName,
440
+ event,
441
+ lat,
442
+ lon,
443
+ alt,
444
+ pressure_mbar,
445
+ temp_celsius,
446
+ humidity_pct,
447
+ visibility_range_km,
448
+ age_years,
449
+ snellen_ratio,
450
+ binoculars,
451
+ telescope_aperture_cm,
452
+ telescope_magnification
453
+ }) => {
454
+ if (!datetime && jd === void 0) {
455
+ return {
456
+ isError: true,
457
+ content: [{ type: "text", text: "Either 'datetime' or 'jd' is required." }]
458
+ };
459
+ }
460
+ const reqBody = {};
461
+ if (datetime) reqBody.datetime = datetime;
462
+ if (jd !== void 0) reqBody.jd = jd;
463
+ reqBody.body = bodyName;
464
+ reqBody.event = event;
465
+ reqBody.lat = lat;
466
+ reqBody.lon = lon;
467
+ if (alt !== void 0) reqBody.alt = alt;
468
+ if (pressure_mbar !== void 0) reqBody.pressure_mbar = pressure_mbar;
469
+ if (temp_celsius !== void 0) reqBody.temp_celsius = temp_celsius;
470
+ if (humidity_pct !== void 0) reqBody.humidity_pct = humidity_pct;
471
+ if (visibility_range_km !== void 0) reqBody.visibility_range_km = visibility_range_km;
472
+ if (age_years !== void 0) reqBody.age_years = age_years;
473
+ if (snellen_ratio !== void 0) reqBody.snellen_ratio = snellen_ratio;
474
+ if (binoculars !== void 0) reqBody.binoculars = binoculars;
475
+ if (telescope_aperture_cm !== void 0) reqBody.telescope_aperture_cm = telescope_aperture_cm;
476
+ if (telescope_magnification !== void 0) reqBody.telescope_magnification = telescope_magnification;
477
+ const response = await client.callEndpoint("/v1/heliacal", reqBody);
478
+ return {
479
+ content: [{ type: "text", text: JSON.stringify(response, null, 2) }]
480
+ };
481
+ }
482
+ );
483
+ }
484
+
485
+ // src/tools/find-ingresses.ts
486
+ import { z as z11 } from "zod";
487
+ function registerFindIngresses(server2, client) {
488
+ server2.tool(
489
+ "find_ingresses",
490
+ "Finds when a planet crosses into a zodiac sign or reaches a specific ecliptic longitude. Useful for tracking equinoxes, solstices, and zodiac ingresses. Provide either 'sign' (e.g., 'aries') or 'longitude' (0-360), not both. Supported bodies: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto.",
491
+ {
492
+ datetime: z11.string().optional().describe("ISO 8601 UTC datetime to search from. Provide either datetime or jd."),
493
+ jd: z11.number().optional().describe("Julian Day number in UT1 to search from. Provide either datetime or jd."),
494
+ body: z11.string().describe("Body name: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto."),
495
+ sign: z11.string().optional().describe("Zodiac sign name (e.g., 'aries', 'taurus'). Provide either sign or longitude."),
496
+ longitude: z11.number().min(0).max(360).optional().describe("Target ecliptic longitude (0-360). Provide either sign or longitude."),
497
+ backward: z11.boolean().optional().describe("If true, search backward in time. Default: false."),
498
+ count: z11.number().min(1).max(10).optional().describe("Number of ingresses to return (1-10). Default: 1.")
499
+ },
500
+ async ({ datetime, jd, body: bodyName, sign, longitude, backward, count }) => {
501
+ if (!datetime && jd === void 0) {
502
+ return {
503
+ isError: true,
504
+ content: [{ type: "text", text: "Either 'datetime' or 'jd' is required." }]
505
+ };
506
+ }
507
+ if (!sign && longitude === void 0) {
508
+ return {
509
+ isError: true,
510
+ content: [{ type: "text", text: "Either 'sign' or 'longitude' is required." }]
511
+ };
512
+ }
513
+ if (sign && longitude !== void 0) {
514
+ return {
515
+ isError: true,
516
+ content: [{ type: "text", text: "Provide either 'sign' or 'longitude', not both." }]
517
+ };
518
+ }
519
+ const reqBody = {};
520
+ if (datetime) reqBody.datetime = datetime;
521
+ if (jd !== void 0) reqBody.jd = jd;
522
+ reqBody.body = bodyName;
523
+ if (sign) reqBody.sign = sign;
524
+ if (longitude !== void 0) reqBody.longitude = longitude;
525
+ if (backward !== void 0) reqBody.backward = backward;
526
+ if (count !== void 0) reqBody.count = count;
527
+ const response = await client.callEndpoint("/v1/ingresses", reqBody);
528
+ return {
529
+ content: [{ type: "text", text: JSON.stringify(response, null, 2) }]
530
+ };
531
+ }
532
+ );
533
+ }
534
+
535
+ // src/tools/list-available-values.ts
536
+ import { z as z12 } from "zod";
327
537
 
328
538
  // src/data/bodies.ts
329
539
  var CELESTIAL_BODIES = [
@@ -441,14 +651,61 @@ var AYANAMSHA_SYSTEMS = [
441
651
  var VALID_AYANAMSHA_NAMES = new Set(AYANAMSHA_SYSTEMS.map((a) => a.name));
442
652
  var VALID_AYANAMSHA_IDS = new Set(AYANAMSHA_SYSTEMS.map((a) => a.id));
443
653
 
654
+ // src/data/eclipse-types.ts
655
+ var SOLAR_ECLIPSE_TYPES = [
656
+ { name: "total", description: "Total solar eclipse \u2014 Moon completely covers the Sun" },
657
+ { name: "annular", description: "Annular solar eclipse \u2014 Moon covers center of Sun, leaving a ring" },
658
+ { name: "partial", description: "Partial solar eclipse \u2014 Moon partially covers the Sun" },
659
+ { name: "annular_total", description: "Hybrid eclipse \u2014 annular in some locations, total in others" }
660
+ ];
661
+ var LUNAR_ECLIPSE_TYPES = [
662
+ { name: "total", description: "Total lunar eclipse \u2014 Moon fully enters Earth's umbra" },
663
+ { name: "partial", description: "Partial lunar eclipse \u2014 Moon partially enters Earth's umbra" },
664
+ { name: "penumbral", description: "Penumbral lunar eclipse \u2014 Moon passes through Earth's penumbra" }
665
+ ];
666
+
667
+ // src/data/heliacal-events.ts
668
+ var HELIACAL_EVENTS = [
669
+ { name: "morning_first", description: "First appearance in morning sky (heliacal rising)", applies_to: "all eligible bodies" },
670
+ { name: "evening_last", description: "Last appearance in evening sky before superior conjunction", applies_to: "all eligible bodies" },
671
+ { name: "evening_first", description: "First appearance in evening sky after superior conjunction", applies_to: "inner planets only (Mercury, Venus)" },
672
+ { name: "morning_last", description: "Last appearance in morning sky", applies_to: "inner planets only (Mercury, Venus)" },
673
+ { name: "acronychal_rising", description: "Rising at sunset", applies_to: "all eligible bodies" },
674
+ { name: "acronychal_setting", description: "Setting at sunrise", applies_to: "all eligible bodies" }
675
+ ];
676
+
677
+ // src/data/zodiac-signs.ts
678
+ var ZODIAC_SIGNS = [
679
+ { name: "aries", longitude: 0, description: "Aries (0\xB0)" },
680
+ { name: "taurus", longitude: 30, description: "Taurus (30\xB0)" },
681
+ { name: "gemini", longitude: 60, description: "Gemini (60\xB0)" },
682
+ { name: "cancer", longitude: 90, description: "Cancer (90\xB0)" },
683
+ { name: "leo", longitude: 120, description: "Leo (120\xB0)" },
684
+ { name: "virgo", longitude: 150, description: "Virgo (150\xB0)" },
685
+ { name: "libra", longitude: 180, description: "Libra (180\xB0)" },
686
+ { name: "scorpio", longitude: 210, description: "Scorpio (210\xB0)" },
687
+ { name: "sagittarius", longitude: 240, description: "Sagittarius (240\xB0)" },
688
+ { name: "capricorn", longitude: 270, description: "Capricorn (270\xB0)" },
689
+ { name: "aquarius", longitude: 300, description: "Aquarius (300\xB0)" },
690
+ { name: "pisces", longitude: 330, description: "Pisces (330\xB0)" }
691
+ ];
692
+ var VALID_SIGN_NAMES = new Set(ZODIAC_SIGNS.map((s) => s.name));
693
+
444
694
  // src/tools/list-available-values.ts
445
695
  function registerListAvailableValues(server2) {
446
696
  server2.tool(
447
697
  "list_available_values",
448
- "Lists valid values for celestial bodies, house systems, or ayanamsha systems. Use this to discover what values are accepted by other tools.",
698
+ "Lists valid values for celestial bodies, house systems, ayanamsha systems, eclipse types, heliacal events, or zodiac signs. Use this to discover what values are accepted by other tools.",
449
699
  {
450
- category: z8.enum(["bodies", "house_systems", "ayanamsha_systems"]).describe(
451
- "Which category to list: 'bodies' (celestial bodies and groups), 'house_systems', or 'ayanamsha_systems'"
700
+ category: z12.enum([
701
+ "bodies",
702
+ "house_systems",
703
+ "ayanamsha_systems",
704
+ "eclipse_types",
705
+ "heliacal_events",
706
+ "zodiac_signs"
707
+ ]).describe(
708
+ "Which category to list: 'bodies', 'house_systems', 'ayanamsha_systems', 'eclipse_types', 'heliacal_events', or 'zodiac_signs'"
452
709
  )
453
710
  },
454
711
  async ({ category }) => {
@@ -485,6 +742,36 @@ function registerListAvailableValues(server2) {
485
742
  }))
486
743
  };
487
744
  break;
745
+ case "eclipse_types":
746
+ result = {
747
+ solar_eclipse_types: SOLAR_ECLIPSE_TYPES.map((t) => ({
748
+ name: t.name,
749
+ description: t.description
750
+ })),
751
+ lunar_eclipse_types: LUNAR_ECLIPSE_TYPES.map((t) => ({
752
+ name: t.name,
753
+ description: t.description
754
+ }))
755
+ };
756
+ break;
757
+ case "heliacal_events":
758
+ result = {
759
+ heliacal_events: HELIACAL_EVENTS.map((e) => ({
760
+ name: e.name,
761
+ description: e.description,
762
+ applies_to: e.applies_to
763
+ }))
764
+ };
765
+ break;
766
+ case "zodiac_signs":
767
+ result = {
768
+ zodiac_signs: ZODIAC_SIGNS.map((s) => ({
769
+ name: s.name,
770
+ longitude: s.longitude,
771
+ description: s.description
772
+ }))
773
+ };
774
+ break;
488
775
  }
489
776
  return {
490
777
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
@@ -502,6 +789,10 @@ function registerAllTools(server2, client) {
502
789
  registerGetAyanamsha(server2, client);
503
790
  registerGetDeltaT(server2, client);
504
791
  registerGetSiderealTime(server2, client);
792
+ registerFindSolarEclipses(server2, client);
793
+ registerFindLunarEclipses(server2, client);
794
+ registerFindHeliacalEvent(server2, client);
795
+ registerFindIngresses(server2, client);
505
796
  registerListAvailableValues(server2);
506
797
  }
507
798
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/client.ts","../src/tools/calculate-positions.ts","../src/tools/calculate-houses.ts","../src/tools/calculate-chart.ts","../src/tools/get-fixed-stars.ts","../src/tools/get-ayanamsha.ts","../src/tools/get-delta-t.ts","../src/tools/get-sidereal-time.ts","../src/tools/list-available-values.ts","../src/data/bodies.ts","../src/data/house-systems.ts","../src/data/ayanamsha-systems.ts","../src/tools/index.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\n\nconst apiKey = process.env.MORPHEMERIS_API_KEY;\nif (!apiKey) {\n process.stderr.write(\n \"Error: MORPHEMERIS_API_KEY environment variable is required.\\n\" +\n \"Get your API key at https://morphemeris.com/dashboard/keys\\n\",\n );\n process.exit(1);\n}\n\nconst server = createServer({\n apiKey,\n baseUrl: process.env.MORPHEMERIS_API_URL,\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { MorphemerisClient } from \"./client.js\";\nimport { registerAllTools } from \"./tools/index.js\";\n\nexport interface CreateServerOptions {\n apiKey: string;\n baseUrl?: string;\n fetchFn?: typeof fetch;\n}\n\nexport function createServer(options: CreateServerOptions): McpServer {\n const client = new MorphemerisClient({\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n fetchFn: options.fetchFn,\n });\n\n const server = new McpServer({\n name: \"morphemeris\",\n version: \"0.1.0\",\n });\n\n registerAllTools(server, client);\n\n return server;\n}\n","export interface MorphemerisClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetchFn?: typeof fetch;\n}\n\nexport interface ApiError {\n code: string;\n message: string;\n suggestion?: string;\n docs_url?: string;\n}\n\nexport interface ApiResponse<T = unknown> {\n data: T;\n meta: {\n version: string;\n request_id: string;\n timestamp: string;\n credits_used: number;\n credits_remaining: number;\n computation_ms: number;\n };\n warnings?: string[];\n}\n\nexport interface ApiErrorResponse {\n errors: ApiError[];\n}\n\nexport class MorphemerisApiError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly errors: ApiError[],\n ) {\n const primary = errors[0];\n const parts = [primary?.message ?? \"API request failed\"];\n if (primary?.suggestion) parts.push(`Suggestion: ${primary.suggestion}`);\n if (primary?.docs_url) parts.push(`Docs: ${primary.docs_url}`);\n super(parts.join(\". \"));\n this.name = \"MorphemerisApiError\";\n }\n}\n\nexport class MorphemerisClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchFn: typeof fetch;\n\n constructor(options: MorphemerisClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? \"https://api.morphemeris.com\").replace(\n /\\/$/,\n \"\",\n );\n this.fetchFn = options.fetchFn ?? globalThis.fetch;\n }\n\n async callEndpoint<T = unknown>(\n path: string,\n body: Record<string, unknown>,\n ): Promise<ApiResponse<T>> {\n let response: Response;\n try {\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify(body),\n });\n } catch (err) {\n throw new Error(\n `Morphemeris API unreachable at ${this.baseUrl}. Check your network connection and try again.`,\n );\n }\n\n const json = await response.json();\n\n if (!response.ok) {\n const errorBody = json as ApiErrorResponse;\n throw new MorphemerisApiError(\n response.status,\n errorBody.errors ?? [\n {\n code: \"unknown_error\",\n message: `HTTP ${response.status}: ${response.statusText}`,\n },\n ],\n );\n }\n\n return json as ApiResponse<T>;\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerCalculatePositions(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"calculate_positions\",\n \"Calculates ecliptic positions (longitude, latitude, distance, daily motion) for celestial bodies at a given moment. Supports tropical and sidereal zodiacs, heliocentric and topocentric corrections, and equatorial coordinates.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n bodies: z\n .string()\n .optional()\n .describe(\"Comma-separated body names, or group name: 'planets' (default), 'asteroids', 'all'. Use list_available_values to see all options.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .optional()\n .describe(\"Observer latitude in decimal degrees (-90 to 90). Required for topocentric correction.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). Required for topocentric correction.\"),\n alt: z\n .number()\n .optional()\n .describe(\"Observer altitude in meters above sea level.\"),\n sidereal: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or ID for sidereal positions. Use list_available_values to see options.\"),\n equatorial: z\n .boolean()\n .optional()\n .describe(\"If true, return Right Ascension / Declination instead of ecliptic longitude/latitude.\"),\n speed: z\n .boolean()\n .optional()\n .describe(\"Include daily motion in the response. Default: true.\"),\n topocentric: z\n .boolean()\n .optional()\n .describe(\"Apply topocentric correction (requires lat and lon).\"),\n heliocentric: z\n .boolean()\n .optional()\n .describe(\"Return heliocentric positions instead of geocentric.\"),\n no_nutation: z\n .boolean()\n .optional()\n .describe(\"Skip nutation correction.\"),\n j2000: z\n .boolean()\n .optional()\n .describe(\"Use J2000 reference frame instead of ecliptic of date.\"),\n },\n async ({ datetime, jd, bodies, lat, lon, alt, sidereal, equatorial, speed, topocentric, heliocentric, no_nutation, j2000 }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (bodies) body.bodies = bodies;\n if (lat !== undefined) body.lat = lat;\n if (lon !== undefined) body.lon = lon;\n if (alt !== undefined) body.alt = alt;\n if (sidereal) body.sidereal = sidereal;\n if (equatorial !== undefined) body.equatorial = equatorial;\n if (speed !== undefined) body.speed = speed;\n if (topocentric !== undefined) body.topocentric = topocentric;\n if (heliocentric !== undefined) body.heliocentric = heliocentric;\n if (no_nutation !== undefined) body.no_nutation = no_nutation;\n if (j2000 !== undefined) body.j2000 = j2000;\n\n const response = await client.callEndpoint(\"/v1/positions\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerCalculateHouses(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"calculate_houses\",\n \"Calculates house cusps and angles (Ascendant, MC, etc.) for a given moment and location. Supports 21 house systems and sidereal mode. Use list_available_values with category 'house_systems' to see all options.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .describe(\"Observer latitude in decimal degrees (-90 to 90). REQUIRED.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). REQUIRED.\"),\n system: z\n .string()\n .optional()\n .describe(\"House system name or single-letter code. Default: 'placidus'. Use list_available_values to see options.\"),\n sidereal: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or ID for sidereal house cusps.\"),\n },\n async ({ datetime, jd, lat, lon, system, sidereal }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = { lat, lon };\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (system) body.system = system;\n if (sidereal) body.sidereal = sidereal;\n\n const response = await client.callEndpoint(\"/v1/houses\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerCalculateChart(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"calculate_chart\",\n \"Calculates a complete astrological chart: planetary positions, house cusps, and angles for a given moment and location. Combines calculate_positions and calculate_houses into one call. This is the most commonly used tool for natal charts, transits, and event charts.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .describe(\"Observer latitude in decimal degrees (-90 to 90). REQUIRED.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). REQUIRED.\"),\n bodies: z\n .string()\n .optional()\n .describe(\"Comma-separated body names, or group name: 'planets' (default), 'asteroids', 'all'.\"),\n alt: z\n .number()\n .optional()\n .describe(\"Observer altitude in meters above sea level.\"),\n system: z\n .string()\n .optional()\n .describe(\"House system name or single-letter code. Default: 'placidus'.\"),\n sidereal: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or ID for sidereal positions and house cusps.\"),\n equatorial: z\n .boolean()\n .optional()\n .describe(\"If true, return Right Ascension / Declination instead of ecliptic coordinates.\"),\n speed: z\n .boolean()\n .optional()\n .describe(\"Include daily motion. Default: true.\"),\n topocentric: z\n .boolean()\n .optional()\n .describe(\"Apply topocentric correction.\"),\n heliocentric: z\n .boolean()\n .optional()\n .describe(\"Return heliocentric positions.\"),\n no_nutation: z\n .boolean()\n .optional()\n .describe(\"Skip nutation correction.\"),\n j2000: z\n .boolean()\n .optional()\n .describe(\"Use J2000 reference frame.\"),\n },\n async ({ datetime, jd, lat, lon, bodies, alt, system, sidereal, equatorial, speed, topocentric, heliocentric, no_nutation, j2000 }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = { lat, lon };\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (bodies) body.bodies = bodies;\n if (alt !== undefined) body.alt = alt;\n if (system) body.system = system;\n if (sidereal) body.sidereal = sidereal;\n if (equatorial !== undefined) body.equatorial = equatorial;\n if (speed !== undefined) body.speed = speed;\n if (topocentric !== undefined) body.topocentric = topocentric;\n if (heliocentric !== undefined) body.heliocentric = heliocentric;\n if (no_nutation !== undefined) body.no_nutation = no_nutation;\n if (j2000 !== undefined) body.j2000 = j2000;\n\n const response = await client.callEndpoint(\"/v1/chart\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetFixedStars(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_fixed_stars\",\n \"Returns position data for one or all fixed stars at a given moment. Includes ecliptic coordinates, magnitude, and spectral type. Use star name (e.g. 'Aldebaran') or Bayer designation (e.g. 'alTau'), or 'all' for the full catalog.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n star: z\n .string()\n .describe(\"Star name (e.g. 'Aldebaran', 'Regulus'), Bayer designation (e.g. 'alTau'), or 'all' for every star.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .optional()\n .describe(\"Observer latitude in decimal degrees (-90 to 90).\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive).\"),\n equatorial: z\n .boolean()\n .optional()\n .describe(\"If true, return Right Ascension / Declination instead of ecliptic coordinates.\"),\n },\n async ({ datetime, jd, star, lat, lon, equatorial }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = { star };\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (lat !== undefined) body.lat = lat;\n if (lon !== undefined) body.lon = lon;\n if (equatorial !== undefined) body.equatorial = equatorial;\n\n const response = await client.callEndpoint(\"/v1/stars\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetAyanamsha(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_ayanamsha\",\n \"Returns the ayanamsha value (precession offset) for a given moment and system. Used to convert between tropical and sidereal zodiacs. Use list_available_values with category 'ayanamsha_systems' to see all 47 supported systems.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n system: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or numeric ID. Default: 'lahiri'. Use 'all' to return all 47 systems.\"),\n },\n async ({ datetime, jd, system }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (system) body.system = system;\n\n const response = await client.callEndpoint(\"/v1/ayanamsha\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetDeltaT(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_delta_t\",\n \"Returns Delta T (the difference between Terrestrial Time and Universal Time) for a given moment. Useful for converting between time scales in astronomical calculations.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1, e.g. 2460310.0. Provide either datetime or jd.\"),\n },\n async ({ datetime, jd }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n\n const response = await client.callEndpoint(\"/v1/delta-t\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetSiderealTime(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_sidereal_time\",\n \"Returns Greenwich Apparent Sidereal Time (GAST) and optionally Local Sidereal Time (LST) for a given moment. LST is included when longitude is provided.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). If provided, Local Sidereal Time is included.\"),\n },\n async ({ datetime, jd, lon }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (lon !== undefined) body.lon = lon;\n\n const response = await client.callEndpoint(\"/v1/sidereal-time\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { CELESTIAL_BODIES, BODY_GROUPS } from \"../data/bodies.js\";\nimport { HOUSE_SYSTEMS } from \"../data/house-systems.js\";\nimport { AYANAMSHA_SYSTEMS } from \"../data/ayanamsha-systems.js\";\n\nexport function registerListAvailableValues(server: McpServer): void {\n server.tool(\n \"list_available_values\",\n \"Lists valid values for celestial bodies, house systems, or ayanamsha systems. Use this to discover what values are accepted by other tools.\",\n {\n category: z\n .enum([\"bodies\", \"house_systems\", \"ayanamsha_systems\"])\n .describe(\n \"Which category to list: 'bodies' (celestial bodies and groups), 'house_systems', or 'ayanamsha_systems'\",\n ),\n },\n async ({ category }) => {\n let result: unknown;\n\n switch (category) {\n case \"bodies\":\n result = {\n bodies: CELESTIAL_BODIES.map((b) => ({\n name: b.name,\n description: b.description,\n ...(\"aliases\" in b ? { aliases: b.aliases } : {}),\n })),\n groups: BODY_GROUPS.map((g) => ({\n name: g.name,\n description: g.description,\n })),\n };\n break;\n case \"house_systems\":\n result = {\n house_systems: HOUSE_SYSTEMS.map((h) => ({\n name: h.name,\n code: h.code,\n description: h.description,\n })),\n };\n break;\n case \"ayanamsha_systems\":\n result = {\n ayanamsha_systems: AYANAMSHA_SYSTEMS.map((a) => ({\n name: a.name,\n id: a.id,\n description: a.description,\n })),\n };\n break;\n }\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n","export const CELESTIAL_BODIES = [\n { name: \"sun\", description: \"The Sun\" },\n { name: \"moon\", description: \"The Moon\" },\n { name: \"mercury\", description: \"Mercury\" },\n { name: \"venus\", description: \"Venus\" },\n { name: \"mars\", description: \"Mars\" },\n { name: \"jupiter\", description: \"Jupiter\" },\n { name: \"saturn\", description: \"Saturn\" },\n { name: \"uranus\", description: \"Uranus\" },\n { name: \"neptune\", description: \"Neptune\" },\n { name: \"pluto\", description: \"Pluto\" },\n { name: \"mean_node\", description: \"Mean Lunar Node (North Node / Rahu)\", aliases: [\"meannode\", \"north_node\"] },\n { name: \"true_node\", description: \"True Lunar Node (North Node)\", aliases: [\"truenode\"] },\n { name: \"mean_apogee\", description: \"Mean Lunar Apogee (Black Moon Lilith)\", aliases: [\"meanapogee\", \"lilith\"] },\n { name: \"osc_apogee\", description: \"Osculating Lunar Apogee\", aliases: [\"oscapogee\"] },\n { name: \"chiron\", description: \"Chiron (asteroid 2060)\" },\n { name: \"pholus\", description: \"Pholus (asteroid 5145)\" },\n { name: \"ceres\", description: \"Ceres (dwarf planet)\" },\n { name: \"pallas\", description: \"Pallas (asteroid 2)\" },\n { name: \"juno\", description: \"Juno (asteroid 3)\" },\n { name: \"vesta\", description: \"Vesta (asteroid 4)\" },\n] as const;\n\nexport const BODY_GROUPS = [\n { name: \"planets\", description: \"Sun through Pluto + Mean Node (11 bodies, the default)\" },\n { name: \"asteroids\", description: \"Chiron, Pholus, Ceres, Pallas, Juno, Vesta (6 bodies)\" },\n { name: \"all\", description: \"All 20 available bodies\" },\n] as const;\n\nexport const VALID_BODY_NAMES = new Set([\n ...CELESTIAL_BODIES.map((b) => b.name),\n ...CELESTIAL_BODIES.flatMap((b) => (\"aliases\" in b ? b.aliases : [])),\n ...BODY_GROUPS.map((g) => g.name),\n]);\n","export const HOUSE_SYSTEMS = [\n { name: \"placidus\", code: \"P\", description: \"Placidus (default, most popular in Western astrology)\" },\n { name: \"koch\", code: \"K\", description: \"Koch\" },\n { name: \"porphyrius\", code: \"O\", description: \"Porphyrius\" },\n { name: \"regiomontanus\", code: \"R\", description: \"Regiomontanus\" },\n { name: \"campanus\", code: \"C\", description: \"Campanus\" },\n { name: \"equal\", code: \"E\", description: \"Equal (from Ascendant)\" },\n { name: \"whole_sign\", code: \"W\", description: \"Whole Sign\" },\n { name: \"vehlow_equal\", code: \"V\", description: \"Vehlow Equal\" },\n { name: \"axial_rotation\", code: \"X\", description: \"Axial Rotation / Meridian\" },\n { name: \"azimuthal\", code: \"H\", description: \"Azimuthal / Horizontal\" },\n { name: \"topocentric\", code: \"T\", description: \"Polich-Page / Topocentric\" },\n { name: \"alcabitius\", code: \"B\", description: \"Alcabitius\" },\n { name: \"morinus\", code: \"M\", description: \"Morinus\" },\n { name: \"krusinski\", code: \"U\", description: \"Krusinski-Pisa\" },\n { name: \"sunshine\", code: \"I\", description: \"Sunshine (Makransky)\" },\n { name: \"sripati\", code: \"S\", description: \"Sripati\" },\n { name: \"apc\", code: \"Y\", description: \"APC Houses\" },\n { name: \"carter_poli_equatorial\", code: \"F\", description: \"Carter Poli-Equatorial\" },\n { name: \"pullen_sd\", code: \"L\", description: \"Pullen (sinusoidal delta)\" },\n { name: \"pullen_sr\", code: \"N\", description: \"Pullen (sinusoidal ratio)\" },\n { name: \"equal_mc\", code: \"D\", description: \"Equal (from MC)\" },\n] as const;\n\nexport const VALID_HOUSE_SYSTEMS = new Set([\n ...HOUSE_SYSTEMS.map((h) => h.name),\n ...HOUSE_SYSTEMS.map((h) => h.code),\n]);\n","export const AYANAMSHA_SYSTEMS = [\n { name: \"fagan_bradley\", id: 0, description: \"Fagan-Bradley\" },\n { name: \"lahiri\", id: 1, description: \"Lahiri (default, Indian standard)\" },\n { name: \"deluce\", id: 2, description: \"De Luce\" },\n { name: \"raman\", id: 3, description: \"B.V. Raman\" },\n { name: \"usha_shashi\", id: 4, description: \"Usha-Shashi\" },\n { name: \"krishnamurti\", id: 5, description: \"Krishnamurti (KP)\" },\n { name: \"djwhal_khul\", id: 6, description: \"Djwhal Khul\" },\n { name: \"yukteshwar\", id: 7, description: \"Sri Yukteshwar\" },\n { name: \"jn_bhasin\", id: 8, description: \"J.N. Bhasin\" },\n { name: \"babyl_kugler1\", id: 9, description: \"Babylonian (Kugler 1)\" },\n { name: \"babyl_kugler2\", id: 10, description: \"Babylonian (Kugler 2)\" },\n { name: \"babyl_kugler3\", id: 11, description: \"Babylonian (Kugler 3)\" },\n { name: \"babyl_huber\", id: 12, description: \"Babylonian (Huber)\" },\n { name: \"babyl_eta_piscium\", id: 13, description: \"Babylonian (Eta Piscium)\" },\n { name: \"babyl_aldebaran_15tau\", id: 14, description: \"Babylonian (Aldebaran at 15 Taurus)\" },\n { name: \"hipparchos\", id: 15, description: \"Hipparchos\" },\n { name: \"sassanian\", id: 16, description: \"Sassanian\" },\n { name: \"galcent_cochrane\", id: 17, description: \"Galactic Center (Cochrane)\" },\n { name: \"galcent_fiorenza\", id: 18, description: \"Galactic Center (Fiorenza)\" },\n { name: \"valens_moon\", id: 19, description: \"Vettius Valens (Moon)\" },\n { name: \"lahiri_icrc\", id: 20, description: \"Lahiri (ICRC)\" },\n { name: \"lahiri_vp\", id: 21, description: \"Lahiri (VP)\" },\n { name: \"krishnamurti_vp\", id: 22, description: \"Krishnamurti (VP)\" },\n { name: \"ss_citra\", id: 23, description: \"Surya Siddhanta (Citra)\" },\n { name: \"ss_revati\", id: 24, description: \"Surya Siddhanta (Revati)\" },\n { name: \"suryasiddhanta\", id: 25, description: \"Surya Siddhanta\" },\n { name: \"suryasiddhanta_meansun\", id: 26, description: \"Surya Siddhanta (Mean Sun)\" },\n { name: \"aryabhata\", id: 27, description: \"Aryabhata\" },\n { name: \"aryabhata_meansun\", id: 28, description: \"Aryabhata (Mean Sun)\" },\n { name: \"ss_semo\", id: 29, description: \"SS (Semo)\" },\n { name: \"ss_citra_pushya\", id: 30, description: \"SS Citra (Pushya)\" },\n { name: \"true_citra\", id: 31, description: \"True Citra\" },\n { name: \"true_revati\", id: 32, description: \"True Revati\" },\n { name: \"true_pushya\", id: 33, description: \"True Pushya\" },\n { name: \"galcent_rgbrand\", id: 34, description: \"Galactic Center (R.G. Brand)\" },\n { name: \"galcent_cochrane_2\", id: 35, description: \"Galactic Center (Cochrane 2)\" },\n { name: \"galequat_iau1958\", id: 36, description: \"Galactic Equator (IAU 1958)\" },\n { name: \"galequat_true\", id: 37, description: \"Galactic Equator (True)\" },\n { name: \"galequat_mula\", id: 38, description: \"Galactic Equator (Mula)\" },\n { name: \"galeqiau_fiorenza\", id: 39, description: \"Galactic Equator IAU (Fiorenza)\" },\n { name: \"vedaweb_mueller\", id: 40, description: \"Vedaweb (Mueller)\" },\n { name: \"cochrane_galcent_mulaw\", id: 41, description: \"Cochrane (Galactic Center Mula-Wilhelm)\" },\n { name: \"galcent_mss\", id: 42, description: \"Galactic Center (MSS)\" },\n { name: \"aryabhata_robinson\", id: 43, description: \"Aryabhata (Robinson)\" },\n { name: \"skydram_mathers\", id: 44, description: \"Skydram (Mathers)\" },\n { name: \"true_mula\", id: 45, description: \"True Mula\" },\n { name: \"true_sheoran\", id: 46, description: \"True Sheoran\" },\n] as const;\n\nexport const VALID_AYANAMSHA_NAMES = new Set(AYANAMSHA_SYSTEMS.map((a) => a.name));\nexport const VALID_AYANAMSHA_IDS = new Set(AYANAMSHA_SYSTEMS.map((a) => a.id));\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { MorphemerisClient } from \"../client.js\";\nimport { registerCalculatePositions } from \"./calculate-positions.js\";\nimport { registerCalculateHouses } from \"./calculate-houses.js\";\nimport { registerCalculateChart } from \"./calculate-chart.js\";\nimport { registerGetFixedStars } from \"./get-fixed-stars.js\";\nimport { registerGetAyanamsha } from \"./get-ayanamsha.js\";\nimport { registerGetDeltaT } from \"./get-delta-t.js\";\nimport { registerGetSiderealTime } from \"./get-sidereal-time.js\";\nimport { registerListAvailableValues } from \"./list-available-values.js\";\n\nexport function registerAllTools(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n registerCalculatePositions(server, client);\n registerCalculateHouses(server, client);\n registerCalculateChart(server, client);\n registerGetFixedStars(server, client);\n registerGetAyanamsha(server, client);\n registerGetDeltaT(server, client);\n registerGetSiderealTime(server, client);\n registerListAvailableValues(server);\n}\n"],"mappings":"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","names":["server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","server"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/client.ts","../src/tools/calculate-positions.ts","../src/tools/calculate-houses.ts","../src/tools/calculate-chart.ts","../src/tools/get-fixed-stars.ts","../src/tools/get-ayanamsha.ts","../src/tools/get-delta-t.ts","../src/tools/get-sidereal-time.ts","../src/tools/find-eclipses-solar.ts","../src/tools/find-eclipses-lunar.ts","../src/tools/find-heliacal-event.ts","../src/tools/find-ingresses.ts","../src/tools/list-available-values.ts","../src/data/bodies.ts","../src/data/house-systems.ts","../src/data/ayanamsha-systems.ts","../src/data/eclipse-types.ts","../src/data/heliacal-events.ts","../src/data/zodiac-signs.ts","../src/tools/index.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\n\nconst apiKey = process.env.MORPHEMERIS_API_KEY;\nif (!apiKey) {\n process.stderr.write(\n \"Error: MORPHEMERIS_API_KEY environment variable is required.\\n\" +\n \"Get your API key at https://morphemeris.com/dashboard/keys\\n\",\n );\n process.exit(1);\n}\n\nconst server = createServer({\n apiKey,\n baseUrl: process.env.MORPHEMERIS_API_URL,\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { MorphemerisClient } from \"./client.js\";\nimport { registerAllTools } from \"./tools/index.js\";\n\nexport interface CreateServerOptions {\n apiKey: string;\n baseUrl?: string;\n fetchFn?: typeof fetch;\n}\n\nexport function createServer(options: CreateServerOptions): McpServer {\n const client = new MorphemerisClient({\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n fetchFn: options.fetchFn,\n });\n\n const server = new McpServer({\n name: \"morphemeris\",\n version: \"0.1.0\",\n });\n\n registerAllTools(server, client);\n\n return server;\n}\n","export interface MorphemerisClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetchFn?: typeof fetch;\n}\n\nexport interface ApiError {\n code: string;\n message: string;\n suggestion?: string;\n docs_url?: string;\n}\n\nexport interface ApiResponse<T = unknown> {\n data: T;\n meta: {\n version: string;\n request_id: string;\n timestamp: string;\n credits_used: number;\n credits_remaining: number;\n computation_ms: number;\n };\n warnings?: string[];\n}\n\nexport interface ApiErrorResponse {\n errors: ApiError[];\n}\n\nexport class MorphemerisApiError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly errors: ApiError[],\n ) {\n const primary = errors[0];\n const parts = [primary?.message ?? \"API request failed\"];\n if (primary?.suggestion) parts.push(`Suggestion: ${primary.suggestion}`);\n if (primary?.docs_url) parts.push(`Docs: ${primary.docs_url}`);\n super(parts.join(\". \"));\n this.name = \"MorphemerisApiError\";\n }\n}\n\nexport class MorphemerisClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchFn: typeof fetch;\n\n constructor(options: MorphemerisClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? \"https://api.morphemeris.com\").replace(\n /\\/$/,\n \"\",\n );\n this.fetchFn = options.fetchFn ?? globalThis.fetch;\n }\n\n async callEndpoint<T = unknown>(\n path: string,\n body: Record<string, unknown>,\n ): Promise<ApiResponse<T>> {\n let response: Response;\n try {\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify(body),\n });\n } catch (err) {\n throw new Error(\n `Morphemeris API unreachable at ${this.baseUrl}. Check your network connection and try again.`,\n );\n }\n\n const json = await response.json();\n\n if (!response.ok) {\n const errorBody = json as ApiErrorResponse;\n throw new MorphemerisApiError(\n response.status,\n errorBody.errors ?? [\n {\n code: \"unknown_error\",\n message: `HTTP ${response.status}: ${response.statusText}`,\n },\n ],\n );\n }\n\n return json as ApiResponse<T>;\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerCalculatePositions(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"calculate_positions\",\n \"Calculates ecliptic positions (longitude, latitude, distance, daily motion) for celestial bodies at a given moment. Supports tropical and sidereal zodiacs, heliocentric and topocentric corrections, and equatorial coordinates.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n bodies: z\n .string()\n .optional()\n .describe(\"Comma-separated body names, or group name: 'planets' (default), 'asteroids', 'all'. Use list_available_values to see all options.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .optional()\n .describe(\"Observer latitude in decimal degrees (-90 to 90). Required for topocentric correction.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). Required for topocentric correction.\"),\n alt: z\n .number()\n .optional()\n .describe(\"Observer altitude in meters above sea level.\"),\n sidereal: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or ID for sidereal positions. Use list_available_values to see options.\"),\n equatorial: z\n .boolean()\n .optional()\n .describe(\"If true, return Right Ascension / Declination instead of ecliptic longitude/latitude.\"),\n speed: z\n .boolean()\n .optional()\n .describe(\"Include daily motion in the response. Default: true.\"),\n topocentric: z\n .boolean()\n .optional()\n .describe(\"Apply topocentric correction (requires lat and lon).\"),\n heliocentric: z\n .boolean()\n .optional()\n .describe(\"Return heliocentric positions instead of geocentric.\"),\n no_nutation: z\n .boolean()\n .optional()\n .describe(\"Skip nutation correction.\"),\n j2000: z\n .boolean()\n .optional()\n .describe(\"Use J2000 reference frame instead of ecliptic of date.\"),\n },\n async ({ datetime, jd, bodies, lat, lon, alt, sidereal, equatorial, speed, topocentric, heliocentric, no_nutation, j2000 }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (bodies) body.bodies = bodies;\n if (lat !== undefined) body.lat = lat;\n if (lon !== undefined) body.lon = lon;\n if (alt !== undefined) body.alt = alt;\n if (sidereal) body.sidereal = sidereal;\n if (equatorial !== undefined) body.equatorial = equatorial;\n if (speed !== undefined) body.speed = speed;\n if (topocentric !== undefined) body.topocentric = topocentric;\n if (heliocentric !== undefined) body.heliocentric = heliocentric;\n if (no_nutation !== undefined) body.no_nutation = no_nutation;\n if (j2000 !== undefined) body.j2000 = j2000;\n\n const response = await client.callEndpoint(\"/v1/positions\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerCalculateHouses(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"calculate_houses\",\n \"Calculates house cusps and angles (Ascendant, MC, etc.) for a given moment and location. Supports 21 house systems and sidereal mode. Use list_available_values with category 'house_systems' to see all options.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .describe(\"Observer latitude in decimal degrees (-90 to 90). REQUIRED.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). REQUIRED.\"),\n system: z\n .string()\n .optional()\n .describe(\"House system name or single-letter code. Default: 'placidus'. Use list_available_values to see options.\"),\n sidereal: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or ID for sidereal house cusps.\"),\n },\n async ({ datetime, jd, lat, lon, system, sidereal }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = { lat, lon };\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (system) body.system = system;\n if (sidereal) body.sidereal = sidereal;\n\n const response = await client.callEndpoint(\"/v1/houses\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerCalculateChart(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"calculate_chart\",\n \"Calculates a complete astrological chart: planetary positions, house cusps, and angles for a given moment and location. Combines calculate_positions and calculate_houses into one call. This is the most commonly used tool for natal charts, transits, and event charts.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .describe(\"Observer latitude in decimal degrees (-90 to 90). REQUIRED.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). REQUIRED.\"),\n bodies: z\n .string()\n .optional()\n .describe(\"Comma-separated body names, or group name: 'planets' (default), 'asteroids', 'all'.\"),\n alt: z\n .number()\n .optional()\n .describe(\"Observer altitude in meters above sea level.\"),\n system: z\n .string()\n .optional()\n .describe(\"House system name or single-letter code. Default: 'placidus'.\"),\n sidereal: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or ID for sidereal positions and house cusps.\"),\n equatorial: z\n .boolean()\n .optional()\n .describe(\"If true, return Right Ascension / Declination instead of ecliptic coordinates.\"),\n speed: z\n .boolean()\n .optional()\n .describe(\"Include daily motion. Default: true.\"),\n topocentric: z\n .boolean()\n .optional()\n .describe(\"Apply topocentric correction.\"),\n heliocentric: z\n .boolean()\n .optional()\n .describe(\"Return heliocentric positions.\"),\n no_nutation: z\n .boolean()\n .optional()\n .describe(\"Skip nutation correction.\"),\n j2000: z\n .boolean()\n .optional()\n .describe(\"Use J2000 reference frame.\"),\n },\n async ({ datetime, jd, lat, lon, bodies, alt, system, sidereal, equatorial, speed, topocentric, heliocentric, no_nutation, j2000 }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = { lat, lon };\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (bodies) body.bodies = bodies;\n if (alt !== undefined) body.alt = alt;\n if (system) body.system = system;\n if (sidereal) body.sidereal = sidereal;\n if (equatorial !== undefined) body.equatorial = equatorial;\n if (speed !== undefined) body.speed = speed;\n if (topocentric !== undefined) body.topocentric = topocentric;\n if (heliocentric !== undefined) body.heliocentric = heliocentric;\n if (no_nutation !== undefined) body.no_nutation = no_nutation;\n if (j2000 !== undefined) body.j2000 = j2000;\n\n const response = await client.callEndpoint(\"/v1/chart\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetFixedStars(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_fixed_stars\",\n \"Returns position data for one or all fixed stars at a given moment. Includes ecliptic coordinates, magnitude, and spectral type. Use star name (e.g. 'Aldebaran') or Bayer designation (e.g. 'alTau'), or 'all' for the full catalog.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n star: z\n .string()\n .describe(\"Star name (e.g. 'Aldebaran', 'Regulus'), Bayer designation (e.g. 'alTau'), or 'all' for every star.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .optional()\n .describe(\"Observer latitude in decimal degrees (-90 to 90).\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive).\"),\n equatorial: z\n .boolean()\n .optional()\n .describe(\"If true, return Right Ascension / Declination instead of ecliptic coordinates.\"),\n },\n async ({ datetime, jd, star, lat, lon, equatorial }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = { star };\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (lat !== undefined) body.lat = lat;\n if (lon !== undefined) body.lon = lon;\n if (equatorial !== undefined) body.equatorial = equatorial;\n\n const response = await client.callEndpoint(\"/v1/stars\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetAyanamsha(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_ayanamsha\",\n \"Returns the ayanamsha value (precession offset) for a given moment and system. Used to convert between tropical and sidereal zodiacs. Use list_available_values with category 'ayanamsha_systems' to see all 47 supported systems.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n system: z\n .string()\n .optional()\n .describe(\"Ayanamsha system name or numeric ID. Default: 'lahiri'. Use 'all' to return all 47 systems.\"),\n },\n async ({ datetime, jd, system }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (system) body.system = system;\n\n const response = await client.callEndpoint(\"/v1/ayanamsha\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetDeltaT(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_delta_t\",\n \"Returns Delta T (the difference between Terrestrial Time and Universal Time) for a given moment. Useful for converting between time scales in astronomical calculations.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1, e.g. 2460310.0. Provide either datetime or jd.\"),\n },\n async ({ datetime, jd }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n\n const response = await client.callEndpoint(\"/v1/delta-t\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerGetSiderealTime(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"get_sidereal_time\",\n \"Returns Greenwich Apparent Sidereal Time (GAST) and optionally Local Sidereal Time (LST) for a given moment. LST is included when longitude is provided.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime, e.g. '2024-01-01T12:00:00Z'. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1. Provide either datetime or jd.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). If provided, Local Sidereal Time is included.\"),\n },\n async ({ datetime, jd, lon }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (lon !== undefined) body.lon = lon;\n\n const response = await client.callEndpoint(\"/v1/sidereal-time\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerFindSolarEclipses(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"find_solar_eclipses\",\n \"Finds upcoming or past solar eclipses from a given date. Returns global eclipse data by default, or location-specific data (magnitude, obscuration) when observer coordinates are provided. Supports filtering by eclipse type and returning multiple results.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime to search from. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1 to search from. Provide either datetime or jd.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .optional()\n .describe(\"Observer latitude (-90 to 90). Enables local mode with magnitude and obscuration.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude (-180 to 180, east positive).\"),\n alt: z\n .number()\n .optional()\n .describe(\"Observer altitude in meters above sea level.\"),\n type: z\n .string()\n .optional()\n .describe(\"Filter by eclipse type: 'total', 'annular', 'partial', 'annular_total' (comma-separated).\"),\n backward: z\n .boolean()\n .optional()\n .describe(\"If true, search backward in time. Default: false.\"),\n count: z\n .number()\n .min(1)\n .max(10)\n .optional()\n .describe(\"Number of eclipses to return (1-10). Default: 1.\"),\n },\n async ({ datetime, jd, lat, lon, alt, type, backward, count }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (lat !== undefined) body.lat = lat;\n if (lon !== undefined) body.lon = lon;\n if (alt !== undefined) body.alt = alt;\n if (type) body.type = type;\n if (backward !== undefined) body.backward = backward;\n if (count !== undefined) body.count = count;\n\n const response = await client.callEndpoint(\"/v1/eclipses/solar\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerFindLunarEclipses(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"find_lunar_eclipses\",\n \"Finds upcoming or past lunar eclipses from a given date. Returns eclipse phase times (penumbral, partial, total). When observer coordinates are provided, includes a visibility flag. Supports filtering by type and returning multiple results.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime to search from. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1 to search from. Provide either datetime or jd.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .optional()\n .describe(\"Observer latitude (-90 to 90). Enables visibility check.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .optional()\n .describe(\"Observer longitude (-180 to 180, east positive).\"),\n alt: z\n .number()\n .optional()\n .describe(\"Observer altitude in meters above sea level.\"),\n type: z\n .string()\n .optional()\n .describe(\"Filter by eclipse type: 'total', 'partial', 'penumbral' (comma-separated).\"),\n backward: z\n .boolean()\n .optional()\n .describe(\"If true, search backward in time. Default: false.\"),\n count: z\n .number()\n .min(1)\n .max(10)\n .optional()\n .describe(\"Number of eclipses to return (1-10). Default: 1.\"),\n },\n async ({ datetime, jd, lat, lon, alt, type, backward, count }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const body: Record<string, unknown> = {};\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (lat !== undefined) body.lat = lat;\n if (lon !== undefined) body.lon = lon;\n if (alt !== undefined) body.alt = alt;\n if (type) body.type = type;\n if (backward !== undefined) body.backward = backward;\n if (count !== undefined) body.count = count;\n\n const response = await client.callEndpoint(\"/v1/eclipses/lunar\", body);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerFindHeliacalEvent(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"find_heliacal_event\",\n \"Finds the next heliacal rising or setting of a planet — when it first becomes visible in the morning or evening sky. Requires observer location. Uses the Schaefer sky brightness model with configurable atmospheric and observer parameters. Sun and Moon are excluded. Outer planets cannot have evening_first or morning_last events.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime to search from. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1 to search from. Provide either datetime or jd.\"),\n body: z\n .string()\n .describe(\"Planet name (not sun or moon). E.g., 'venus', 'mars', 'jupiter'.\"),\n event: z\n .enum([\n \"morning_first\",\n \"evening_last\",\n \"evening_first\",\n \"morning_last\",\n \"acronychal_rising\",\n \"acronychal_setting\",\n ])\n .describe(\"Heliacal event type. evening_first and morning_last are for inner planets only.\"),\n lat: z\n .number()\n .min(-90)\n .max(90)\n .describe(\"Observer latitude in decimal degrees (-90 to 90). Required.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .describe(\"Observer longitude in decimal degrees (-180 to 180, east positive). Required.\"),\n alt: z\n .number()\n .optional()\n .describe(\"Observer altitude in meters above sea level. Default: 0.\"),\n pressure_mbar: z\n .number()\n .optional()\n .describe(\"Atmospheric pressure in mbar. Default: 1013.25.\"),\n temp_celsius: z\n .number()\n .optional()\n .describe(\"Temperature in Celsius. Default: 15.0.\"),\n humidity_pct: z\n .number()\n .optional()\n .describe(\"Relative humidity (0-100). Default: 40.0.\"),\n visibility_range_km: z\n .number()\n .optional()\n .describe(\"Visibility range in km (0 = model default). Default: 0.0.\"),\n age_years: z\n .number()\n .optional()\n .describe(\"Observer age in years. Default: 36.0.\"),\n snellen_ratio: z\n .number()\n .optional()\n .describe(\"Visual acuity (1.0 = normal). Default: 1.0.\"),\n binoculars: z\n .boolean()\n .optional()\n .describe(\"Binocular vision. Default: true.\"),\n telescope_aperture_cm: z\n .number()\n .optional()\n .describe(\"Telescope aperture in cm (0 = naked eye). Default: 0.0.\"),\n telescope_magnification: z\n .number()\n .optional()\n .describe(\"Telescope magnification (1.0 = naked eye). Default: 1.0.\"),\n },\n async ({\n datetime,\n jd,\n body: bodyName,\n event,\n lat,\n lon,\n alt,\n pressure_mbar,\n temp_celsius,\n humidity_pct,\n visibility_range_km,\n age_years,\n snellen_ratio,\n binoculars,\n telescope_aperture_cm,\n telescope_magnification,\n }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n\n const reqBody: Record<string, unknown> = {};\n if (datetime) reqBody.datetime = datetime;\n if (jd !== undefined) reqBody.jd = jd;\n reqBody.body = bodyName;\n reqBody.event = event;\n reqBody.lat = lat;\n reqBody.lon = lon;\n if (alt !== undefined) reqBody.alt = alt;\n if (pressure_mbar !== undefined) reqBody.pressure_mbar = pressure_mbar;\n if (temp_celsius !== undefined) reqBody.temp_celsius = temp_celsius;\n if (humidity_pct !== undefined) reqBody.humidity_pct = humidity_pct;\n if (visibility_range_km !== undefined) reqBody.visibility_range_km = visibility_range_km;\n if (age_years !== undefined) reqBody.age_years = age_years;\n if (snellen_ratio !== undefined) reqBody.snellen_ratio = snellen_ratio;\n if (binoculars !== undefined) reqBody.binoculars = binoculars;\n if (telescope_aperture_cm !== undefined) reqBody.telescope_aperture_cm = telescope_aperture_cm;\n if (telescope_magnification !== undefined) reqBody.telescope_magnification = telescope_magnification;\n\n const response = await client.callEndpoint(\"/v1/heliacal\", reqBody);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\nexport function registerFindIngresses(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"find_ingresses\",\n \"Finds when a planet crosses into a zodiac sign or reaches a specific ecliptic longitude. Useful for tracking equinoxes, solstices, and zodiac ingresses. Provide either 'sign' (e.g., 'aries') or 'longitude' (0-360), not both. Supported bodies: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto.\",\n {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime to search from. Provide either datetime or jd.\"),\n jd: z\n .number()\n .optional()\n .describe(\"Julian Day number in UT1 to search from. Provide either datetime or jd.\"),\n body: z\n .string()\n .describe(\"Body name: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto.\"),\n sign: z\n .string()\n .optional()\n .describe(\"Zodiac sign name (e.g., 'aries', 'taurus'). Provide either sign or longitude.\"),\n longitude: z\n .number()\n .min(0)\n .max(360)\n .optional()\n .describe(\"Target ecliptic longitude (0-360). Provide either sign or longitude.\"),\n backward: z\n .boolean()\n .optional()\n .describe(\"If true, search backward in time. Default: false.\"),\n count: z\n .number()\n .min(1)\n .max(10)\n .optional()\n .describe(\"Number of ingresses to return (1-10). Default: 1.\"),\n },\n async ({ datetime, jd, body: bodyName, sign, longitude, backward, count }) => {\n if (!datetime && jd === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }],\n };\n }\n if (!sign && longitude === undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Either 'sign' or 'longitude' is required.\" }],\n };\n }\n if (sign && longitude !== undefined) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Provide either 'sign' or 'longitude', not both.\" }],\n };\n }\n\n const reqBody: Record<string, unknown> = {};\n if (datetime) reqBody.datetime = datetime;\n if (jd !== undefined) reqBody.jd = jd;\n reqBody.body = bodyName;\n if (sign) reqBody.sign = sign;\n if (longitude !== undefined) reqBody.longitude = longitude;\n if (backward !== undefined) reqBody.backward = backward;\n if (count !== undefined) reqBody.count = count;\n\n const response = await client.callEndpoint(\"/v1/ingresses\", reqBody);\n return {\n content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { CELESTIAL_BODIES, BODY_GROUPS } from \"../data/bodies.js\";\nimport { HOUSE_SYSTEMS } from \"../data/house-systems.js\";\nimport { AYANAMSHA_SYSTEMS } from \"../data/ayanamsha-systems.js\";\nimport { SOLAR_ECLIPSE_TYPES, LUNAR_ECLIPSE_TYPES } from \"../data/eclipse-types.js\";\nimport { HELIACAL_EVENTS } from \"../data/heliacal-events.js\";\nimport { ZODIAC_SIGNS } from \"../data/zodiac-signs.js\";\n\nexport function registerListAvailableValues(server: McpServer): void {\n server.tool(\n \"list_available_values\",\n \"Lists valid values for celestial bodies, house systems, ayanamsha systems, eclipse types, heliacal events, or zodiac signs. Use this to discover what values are accepted by other tools.\",\n {\n category: z\n .enum([\n \"bodies\",\n \"house_systems\",\n \"ayanamsha_systems\",\n \"eclipse_types\",\n \"heliacal_events\",\n \"zodiac_signs\",\n ])\n .describe(\n \"Which category to list: 'bodies', 'house_systems', 'ayanamsha_systems', 'eclipse_types', 'heliacal_events', or 'zodiac_signs'\",\n ),\n },\n async ({ category }) => {\n let result: unknown;\n\n switch (category) {\n case \"bodies\":\n result = {\n bodies: CELESTIAL_BODIES.map((b) => ({\n name: b.name,\n description: b.description,\n ...(\"aliases\" in b ? { aliases: b.aliases } : {}),\n })),\n groups: BODY_GROUPS.map((g) => ({\n name: g.name,\n description: g.description,\n })),\n };\n break;\n case \"house_systems\":\n result = {\n house_systems: HOUSE_SYSTEMS.map((h) => ({\n name: h.name,\n code: h.code,\n description: h.description,\n })),\n };\n break;\n case \"ayanamsha_systems\":\n result = {\n ayanamsha_systems: AYANAMSHA_SYSTEMS.map((a) => ({\n name: a.name,\n id: a.id,\n description: a.description,\n })),\n };\n break;\n case \"eclipse_types\":\n result = {\n solar_eclipse_types: SOLAR_ECLIPSE_TYPES.map((t) => ({\n name: t.name,\n description: t.description,\n })),\n lunar_eclipse_types: LUNAR_ECLIPSE_TYPES.map((t) => ({\n name: t.name,\n description: t.description,\n })),\n };\n break;\n case \"heliacal_events\":\n result = {\n heliacal_events: HELIACAL_EVENTS.map((e) => ({\n name: e.name,\n description: e.description,\n applies_to: e.applies_to,\n })),\n };\n break;\n case \"zodiac_signs\":\n result = {\n zodiac_signs: ZODIAC_SIGNS.map((s) => ({\n name: s.name,\n longitude: s.longitude,\n description: s.description,\n })),\n };\n break;\n }\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n","export const CELESTIAL_BODIES = [\n { name: \"sun\", description: \"The Sun\" },\n { name: \"moon\", description: \"The Moon\" },\n { name: \"mercury\", description: \"Mercury\" },\n { name: \"venus\", description: \"Venus\" },\n { name: \"mars\", description: \"Mars\" },\n { name: \"jupiter\", description: \"Jupiter\" },\n { name: \"saturn\", description: \"Saturn\" },\n { name: \"uranus\", description: \"Uranus\" },\n { name: \"neptune\", description: \"Neptune\" },\n { name: \"pluto\", description: \"Pluto\" },\n { name: \"mean_node\", description: \"Mean Lunar Node (North Node / Rahu)\", aliases: [\"meannode\", \"north_node\"] },\n { name: \"true_node\", description: \"True Lunar Node (North Node)\", aliases: [\"truenode\"] },\n { name: \"mean_apogee\", description: \"Mean Lunar Apogee (Black Moon Lilith)\", aliases: [\"meanapogee\", \"lilith\"] },\n { name: \"osc_apogee\", description: \"Osculating Lunar Apogee\", aliases: [\"oscapogee\"] },\n { name: \"chiron\", description: \"Chiron (asteroid 2060)\" },\n { name: \"pholus\", description: \"Pholus (asteroid 5145)\" },\n { name: \"ceres\", description: \"Ceres (dwarf planet)\" },\n { name: \"pallas\", description: \"Pallas (asteroid 2)\" },\n { name: \"juno\", description: \"Juno (asteroid 3)\" },\n { name: \"vesta\", description: \"Vesta (asteroid 4)\" },\n] as const;\n\nexport const BODY_GROUPS = [\n { name: \"planets\", description: \"Sun through Pluto + Mean Node (11 bodies, the default)\" },\n { name: \"asteroids\", description: \"Chiron, Pholus, Ceres, Pallas, Juno, Vesta (6 bodies)\" },\n { name: \"all\", description: \"All 20 available bodies\" },\n] as const;\n\nexport const VALID_BODY_NAMES = new Set([\n ...CELESTIAL_BODIES.map((b) => b.name),\n ...CELESTIAL_BODIES.flatMap((b) => (\"aliases\" in b ? b.aliases : [])),\n ...BODY_GROUPS.map((g) => g.name),\n]);\n","export const HOUSE_SYSTEMS = [\n { name: \"placidus\", code: \"P\", description: \"Placidus (default, most popular in Western astrology)\" },\n { name: \"koch\", code: \"K\", description: \"Koch\" },\n { name: \"porphyrius\", code: \"O\", description: \"Porphyrius\" },\n { name: \"regiomontanus\", code: \"R\", description: \"Regiomontanus\" },\n { name: \"campanus\", code: \"C\", description: \"Campanus\" },\n { name: \"equal\", code: \"E\", description: \"Equal (from Ascendant)\" },\n { name: \"whole_sign\", code: \"W\", description: \"Whole Sign\" },\n { name: \"vehlow_equal\", code: \"V\", description: \"Vehlow Equal\" },\n { name: \"axial_rotation\", code: \"X\", description: \"Axial Rotation / Meridian\" },\n { name: \"azimuthal\", code: \"H\", description: \"Azimuthal / Horizontal\" },\n { name: \"topocentric\", code: \"T\", description: \"Polich-Page / Topocentric\" },\n { name: \"alcabitius\", code: \"B\", description: \"Alcabitius\" },\n { name: \"morinus\", code: \"M\", description: \"Morinus\" },\n { name: \"krusinski\", code: \"U\", description: \"Krusinski-Pisa\" },\n { name: \"sunshine\", code: \"I\", description: \"Sunshine (Makransky)\" },\n { name: \"sripati\", code: \"S\", description: \"Sripati\" },\n { name: \"apc\", code: \"Y\", description: \"APC Houses\" },\n { name: \"carter_poli_equatorial\", code: \"F\", description: \"Carter Poli-Equatorial\" },\n { name: \"pullen_sd\", code: \"L\", description: \"Pullen (sinusoidal delta)\" },\n { name: \"pullen_sr\", code: \"N\", description: \"Pullen (sinusoidal ratio)\" },\n { name: \"equal_mc\", code: \"D\", description: \"Equal (from MC)\" },\n] as const;\n\nexport const VALID_HOUSE_SYSTEMS = new Set([\n ...HOUSE_SYSTEMS.map((h) => h.name),\n ...HOUSE_SYSTEMS.map((h) => h.code),\n]);\n","export const AYANAMSHA_SYSTEMS = [\n { name: \"fagan_bradley\", id: 0, description: \"Fagan-Bradley\" },\n { name: \"lahiri\", id: 1, description: \"Lahiri (default, Indian standard)\" },\n { name: \"deluce\", id: 2, description: \"De Luce\" },\n { name: \"raman\", id: 3, description: \"B.V. Raman\" },\n { name: \"usha_shashi\", id: 4, description: \"Usha-Shashi\" },\n { name: \"krishnamurti\", id: 5, description: \"Krishnamurti (KP)\" },\n { name: \"djwhal_khul\", id: 6, description: \"Djwhal Khul\" },\n { name: \"yukteshwar\", id: 7, description: \"Sri Yukteshwar\" },\n { name: \"jn_bhasin\", id: 8, description: \"J.N. Bhasin\" },\n { name: \"babyl_kugler1\", id: 9, description: \"Babylonian (Kugler 1)\" },\n { name: \"babyl_kugler2\", id: 10, description: \"Babylonian (Kugler 2)\" },\n { name: \"babyl_kugler3\", id: 11, description: \"Babylonian (Kugler 3)\" },\n { name: \"babyl_huber\", id: 12, description: \"Babylonian (Huber)\" },\n { name: \"babyl_eta_piscium\", id: 13, description: \"Babylonian (Eta Piscium)\" },\n { name: \"babyl_aldebaran_15tau\", id: 14, description: \"Babylonian (Aldebaran at 15 Taurus)\" },\n { name: \"hipparchos\", id: 15, description: \"Hipparchos\" },\n { name: \"sassanian\", id: 16, description: \"Sassanian\" },\n { name: \"galcent_cochrane\", id: 17, description: \"Galactic Center (Cochrane)\" },\n { name: \"galcent_fiorenza\", id: 18, description: \"Galactic Center (Fiorenza)\" },\n { name: \"valens_moon\", id: 19, description: \"Vettius Valens (Moon)\" },\n { name: \"lahiri_icrc\", id: 20, description: \"Lahiri (ICRC)\" },\n { name: \"lahiri_vp\", id: 21, description: \"Lahiri (VP)\" },\n { name: \"krishnamurti_vp\", id: 22, description: \"Krishnamurti (VP)\" },\n { name: \"ss_citra\", id: 23, description: \"Surya Siddhanta (Citra)\" },\n { name: \"ss_revati\", id: 24, description: \"Surya Siddhanta (Revati)\" },\n { name: \"suryasiddhanta\", id: 25, description: \"Surya Siddhanta\" },\n { name: \"suryasiddhanta_meansun\", id: 26, description: \"Surya Siddhanta (Mean Sun)\" },\n { name: \"aryabhata\", id: 27, description: \"Aryabhata\" },\n { name: \"aryabhata_meansun\", id: 28, description: \"Aryabhata (Mean Sun)\" },\n { name: \"ss_semo\", id: 29, description: \"SS (Semo)\" },\n { name: \"ss_citra_pushya\", id: 30, description: \"SS Citra (Pushya)\" },\n { name: \"true_citra\", id: 31, description: \"True Citra\" },\n { name: \"true_revati\", id: 32, description: \"True Revati\" },\n { name: \"true_pushya\", id: 33, description: \"True Pushya\" },\n { name: \"galcent_rgbrand\", id: 34, description: \"Galactic Center (R.G. Brand)\" },\n { name: \"galcent_cochrane_2\", id: 35, description: \"Galactic Center (Cochrane 2)\" },\n { name: \"galequat_iau1958\", id: 36, description: \"Galactic Equator (IAU 1958)\" },\n { name: \"galequat_true\", id: 37, description: \"Galactic Equator (True)\" },\n { name: \"galequat_mula\", id: 38, description: \"Galactic Equator (Mula)\" },\n { name: \"galeqiau_fiorenza\", id: 39, description: \"Galactic Equator IAU (Fiorenza)\" },\n { name: \"vedaweb_mueller\", id: 40, description: \"Vedaweb (Mueller)\" },\n { name: \"cochrane_galcent_mulaw\", id: 41, description: \"Cochrane (Galactic Center Mula-Wilhelm)\" },\n { name: \"galcent_mss\", id: 42, description: \"Galactic Center (MSS)\" },\n { name: \"aryabhata_robinson\", id: 43, description: \"Aryabhata (Robinson)\" },\n { name: \"skydram_mathers\", id: 44, description: \"Skydram (Mathers)\" },\n { name: \"true_mula\", id: 45, description: \"True Mula\" },\n { name: \"true_sheoran\", id: 46, description: \"True Sheoran\" },\n] as const;\n\nexport const VALID_AYANAMSHA_NAMES = new Set(AYANAMSHA_SYSTEMS.map((a) => a.name));\nexport const VALID_AYANAMSHA_IDS = new Set(AYANAMSHA_SYSTEMS.map((a) => a.id));\n","export const SOLAR_ECLIPSE_TYPES = [\n { name: \"total\", description: \"Total solar eclipse — Moon completely covers the Sun\" },\n { name: \"annular\", description: \"Annular solar eclipse — Moon covers center of Sun, leaving a ring\" },\n { name: \"partial\", description: \"Partial solar eclipse — Moon partially covers the Sun\" },\n { name: \"annular_total\", description: \"Hybrid eclipse — annular in some locations, total in others\" },\n] as const;\n\nexport const LUNAR_ECLIPSE_TYPES = [\n { name: \"total\", description: \"Total lunar eclipse — Moon fully enters Earth's umbra\" },\n { name: \"partial\", description: \"Partial lunar eclipse — Moon partially enters Earth's umbra\" },\n { name: \"penumbral\", description: \"Penumbral lunar eclipse — Moon passes through Earth's penumbra\" },\n] as const;\n","export const HELIACAL_EVENTS = [\n { name: \"morning_first\", description: \"First appearance in morning sky (heliacal rising)\", applies_to: \"all eligible bodies\" },\n { name: \"evening_last\", description: \"Last appearance in evening sky before superior conjunction\", applies_to: \"all eligible bodies\" },\n { name: \"evening_first\", description: \"First appearance in evening sky after superior conjunction\", applies_to: \"inner planets only (Mercury, Venus)\" },\n { name: \"morning_last\", description: \"Last appearance in morning sky\", applies_to: \"inner planets only (Mercury, Venus)\" },\n { name: \"acronychal_rising\", description: \"Rising at sunset\", applies_to: \"all eligible bodies\" },\n { name: \"acronychal_setting\", description: \"Setting at sunrise\", applies_to: \"all eligible bodies\" },\n] as const;\n","export const ZODIAC_SIGNS = [\n { name: \"aries\", longitude: 0, description: \"Aries (0°)\" },\n { name: \"taurus\", longitude: 30, description: \"Taurus (30°)\" },\n { name: \"gemini\", longitude: 60, description: \"Gemini (60°)\" },\n { name: \"cancer\", longitude: 90, description: \"Cancer (90°)\" },\n { name: \"leo\", longitude: 120, description: \"Leo (120°)\" },\n { name: \"virgo\", longitude: 150, description: \"Virgo (150°)\" },\n { name: \"libra\", longitude: 180, description: \"Libra (180°)\" },\n { name: \"scorpio\", longitude: 210, description: \"Scorpio (210°)\" },\n { name: \"sagittarius\", longitude: 240, description: \"Sagittarius (240°)\" },\n { name: \"capricorn\", longitude: 270, description: \"Capricorn (270°)\" },\n { name: \"aquarius\", longitude: 300, description: \"Aquarius (300°)\" },\n { name: \"pisces\", longitude: 330, description: \"Pisces (330°)\" },\n] as const;\n\nexport const VALID_SIGN_NAMES = new Set(ZODIAC_SIGNS.map((s) => s.name));\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { MorphemerisClient } from \"../client.js\";\nimport { registerCalculatePositions } from \"./calculate-positions.js\";\nimport { registerCalculateHouses } from \"./calculate-houses.js\";\nimport { registerCalculateChart } from \"./calculate-chart.js\";\nimport { registerGetFixedStars } from \"./get-fixed-stars.js\";\nimport { registerGetAyanamsha } from \"./get-ayanamsha.js\";\nimport { registerGetDeltaT } from \"./get-delta-t.js\";\nimport { registerGetSiderealTime } from \"./get-sidereal-time.js\";\nimport { registerFindSolarEclipses } from \"./find-eclipses-solar.js\";\nimport { registerFindLunarEclipses } from \"./find-eclipses-lunar.js\";\nimport { registerFindHeliacalEvent } from \"./find-heliacal-event.js\";\nimport { registerFindIngresses } from \"./find-ingresses.js\";\nimport { registerListAvailableValues } from \"./list-available-values.js\";\n\nexport function registerAllTools(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n registerCalculatePositions(server, client);\n registerCalculateHouses(server, client);\n registerCalculateChart(server, client);\n registerGetFixedStars(server, client);\n registerGetAyanamsha(server, client);\n registerGetDeltaT(server, client);\n registerGetSiderealTime(server, client);\n registerFindSolarEclipses(server, client);\n registerFindLunarEclipses(server, client);\n registerFindHeliacalEvent(server, client);\n registerFindIngresses(server, client);\n registerListAvailableValues(server);\n}\n"],"mappings":"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","names":["server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","server"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morphemeris/mcp",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "MCP server for the Morphemeris astronomical ephemeris API",
5
5
  "license": "MIT",
6
6
  "type": "module",