@morphemeris/mcp 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/dist/index.js +615 -133
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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/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/batch-requests.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 { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\ninterface SubRequest {\n endpoint: string;\n params: Record<string, unknown>;\n}\n\nexport function registerBatchRequests(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.tool(\n \"batch_requests\",\n \"Send up to 50 sub-requests in a single API call. Each sub-request specifies an endpoint and its parameters. Sub-requests execute sequentially; individual failures do not abort the batch. Credit cost is the sum of individual endpoint costs. Counts as 1 rate-limit request. Ideal for computing positions across a date range, fetching a full chart (positions + houses + stars), or any workflow that would otherwise require many sequential API calls.\",\n {\n requests_json: z\n .string()\n .describe(\n 'JSON array of sub-requests. Each element: {\"endpoint\": \"/v1/positions\", \"params\": {...}}. ' +\n \"Allowed endpoints: /v1/positions, /v1/houses, /v1/chart, /v1/stars, /v1/ayanamsha, \" +\n \"/v1/delta-t, /v1/sidereal-time, /v1/eclipses/solar, /v1/eclipses/lunar, /v1/heliacal, \" +\n \"/v1/ingresses. Max 50 sub-requests. Nested /v1/batch is NOT allowed. \" +\n 'Example: [{\"endpoint\":\"/v1/positions\",\"params\":{\"datetime\":\"2024-01-01T00:00:00Z\",\"bodies\":\"sun,moon\"}}]',\n ),\n },\n async ({ requests_json }) => {\n let requests: SubRequest[];\n try {\n requests = JSON.parse(requests_json);\n } catch {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Invalid JSON in requests_json. Provide a valid JSON array of sub-requests.\",\n },\n ],\n };\n }\n\n if (!Array.isArray(requests) || requests.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"requests_json must be a non-empty JSON array of sub-requests.\",\n },\n ],\n };\n }\n\n if (requests.length > 50) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Too many sub-requests. Maximum is 50.\",\n },\n ],\n };\n }\n\n const body: Record<string, unknown> = { requests };\n const response = await client.callEndpoint(\"/v1/batch\", 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 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\";\nimport { registerBatchRequests } from \"./batch-requests.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 registerBatchRequests(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","z","server","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/batch-requests.ts","../src/tools/natal-chart.ts","../src/tools/aspects.ts","../src/tools/dignities.ts","../src/tools/synastry.ts","../src/tools/composite.ts","../src/tools/davison.ts","../src/tools/progressed.ts","../src/tools/draconic.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: __MCP_VERSION__,\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.registerTool(\n \"calculate_positions\",\n {\n title: \"Calculate Planetary Positions\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"calculate_houses\",\n {\n title: \"Calculate House Cusps\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"calculate_chart\",\n {\n title: \"Calculate Complete Chart\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"get_fixed_stars\",\n {\n title: \"Get Fixed Star Positions\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"get_ayanamsha\",\n {\n title: \"Get Ayanamsha Value\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"get_delta_t\",\n {\n title: \"Get Delta T\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"get_sidereal_time\",\n {\n title: \"Get Sidereal Time\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"find_solar_eclipses\",\n {\n title: \"Find Solar Eclipses\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"find_lunar_eclipses\",\n {\n title: \"Find Lunar Eclipses\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"find_heliacal_event\",\n {\n title: \"Find Heliacal Event\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"find_ingresses\",\n {\n title: \"Find Zodiac Ingresses\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\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.registerTool(\n \"list_available_values\",\n {\n title: \"List Available Values\",\n description:\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 inputSchema: {\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 annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: false,\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 { z } from \"zod\";\nimport type { MorphemerisClient } from \"../client.js\";\n\ninterface SubRequest {\n endpoint: string;\n params: Record<string, unknown>;\n}\n\nexport function registerBatchRequests(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"batch_requests\",\n {\n title: \"Batch API Requests\",\n description:\n \"Send up to 50 sub-requests in a single API call. Each sub-request specifies an endpoint and its parameters. Sub-requests execute sequentially; individual failures do not abort the batch. Credit cost is the sum of individual endpoint costs. Counts as 1 rate-limit request. Ideal for computing positions across a date range, fetching a full chart (positions + houses + stars), or any workflow that would otherwise require many sequential API calls.\",\n inputSchema: {\n requests_json: z\n .string()\n .describe(\n 'JSON array of sub-requests. Each element: {\"endpoint\": \"/v1/positions\", \"params\": {...}}. ' +\n \"Allowed endpoints: /v1/positions, /v1/houses, /v1/chart, /v1/stars, /v1/ayanamsha, \" +\n \"/v1/delta-t, /v1/sidereal-time, /v1/eclipses/solar, /v1/eclipses/lunar, /v1/heliacal, \" +\n \"/v1/ingresses. Max 50 sub-requests. Nested /v1/batch is NOT allowed. \" +\n 'Example: [{\"endpoint\":\"/v1/positions\",\"params\":{\"datetime\":\"2024-01-01T00:00:00Z\",\"bodies\":\"sun,moon\"}}]',\n ),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ requests_json }) => {\n let requests: SubRequest[];\n try {\n requests = JSON.parse(requests_json);\n } catch {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Invalid JSON in requests_json. Provide a valid JSON array of sub-requests.\",\n },\n ],\n };\n }\n\n if (!Array.isArray(requests) || requests.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"requests_json must be a non-empty JSON array of sub-requests.\",\n },\n ],\n };\n }\n\n if (requests.length > 50) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Too many sub-requests. Maximum is 50.\",\n },\n ],\n };\n }\n\n const body: Record<string, unknown> = { requests };\n const response = await client.callEndpoint(\"/v1/batch\", 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 registerNatalChart(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"natal_chart\",\n {\n title: \"Compute Natal Chart\",\n description:\n \"Computes a full natal chart with positions (sign, house, retrograde, out-of-bounds), house cusps, aspects, and parallels. This is the recommended tool for complete chart analysis — it returns everything in one call. Cost: 2 credits.\",\n inputSchema: {\n datetime: z\n .string()\n .optional()\n .describe(\"ISO 8601 UTC datetime. 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. REQUIRED.\"),\n lon: z\n .number()\n .min(-180)\n .max(180)\n .describe(\"Observer longitude in decimal degrees (east positive). REQUIRED.\"),\n bodies: z\n .string()\n .optional()\n .describe(\"Comma-separated body names, or 'planets' (default), 'asteroids', 'all'.\"),\n system: z\n .string()\n .optional()\n .describe(\"House system name or code. Default: 'placidus'.\"),\n sidereal: z.string().optional().describe(\"Ayanamsha system for sidereal positions.\"),\n aspects: z\n .string()\n .optional()\n .describe(\"Comma-separated aspect types. Default: conjunction,opposition,trine,square,sextile,semi_sextile,quincunx.\"),\n orb: z.number().optional().describe(\"Default orb in degrees for all aspects (0-30).\"),\n applying: z.boolean().optional().describe(\"Compute applying/separating status. Default: true.\"),\n parallels: z.boolean().optional().describe(\"Include parallels/contraparallels. Default: true.\"),\n parallel_orb: z.number().optional().describe(\"Parallel orb in degrees (0-5). Default: 1.0.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime, jd, lat, lon, bodies, system, sidereal, aspects, orb, applying, parallels, parallel_orb }) => {\n if (!datetime && jd === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }] };\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 (system) body.system = system;\n if (sidereal) body.sidereal = sidereal;\n if (aspects) body.aspects = aspects;\n if (orb !== undefined) body.orb = orb;\n if (applying !== undefined) body.applying = applying;\n if (parallels !== undefined) body.parallels = parallels;\n if (parallel_orb !== undefined) body.parallel_orb = parallel_orb;\n\n const response = await client.callEndpoint(\"/v1/natal-chart\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\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 registerAspects(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"calculate_aspects\",\n {\n title: \"Calculate Aspects\",\n description:\n \"Computes aspects (angular relationships) and optionally parallels between bodies at a given time. No location or houses required. Returns aspect type, orb, and applying/separating status. Cost: 1 credit.\",\n inputSchema: {\n datetime: z.string().optional().describe(\"ISO 8601 UTC datetime. Provide either datetime or jd.\"),\n jd: z.number().optional().describe(\"Julian Day number in UT1.\"),\n bodies: z.string().optional().describe(\"Comma-separated body names, or 'planets' (default), 'asteroids', 'all'.\"),\n aspects: z.string().optional().describe(\"Comma-separated aspect types. Default: major aspects. Available: conjunction, opposition, trine, square, sextile, semi_sextile, quincunx, semi_square, sesquiquadrate, quintile, bi_quintile, septile, bi_septile, tri_septile, quindecile.\"),\n orb: z.number().optional().describe(\"Default orb in degrees for all aspects (0-30).\"),\n applying: z.boolean().optional().describe(\"Compute applying/separating status. Default: true.\"),\n parallels: z.boolean().optional().describe(\"Include parallels/contraparallels. Default: true.\"),\n parallel_orb: z.number().optional().describe(\"Parallel orb in degrees (0-5). Default: 1.0.\"),\n contraparallel: z.boolean().optional().describe(\"Include contraparallels. Default: true.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime, jd, bodies, aspects, orb, applying, parallels, parallel_orb, contraparallel }) => {\n if (!datetime && jd === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }] };\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 (aspects) body.aspects = aspects;\n if (orb !== undefined) body.orb = orb;\n if (applying !== undefined) body.applying = applying;\n if (parallels !== undefined) body.parallels = parallels;\n if (parallel_orb !== undefined) body.parallel_orb = parallel_orb;\n if (contraparallel !== undefined) body.contraparallel = contraparallel;\n\n const response = await client.callEndpoint(\"/v1/aspects\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\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 registerDignities(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"calculate_dignities\",\n {\n title: \"Calculate Essential Dignities\",\n description:\n \"Computes essential dignities (domicile, exaltation, triplicity, term, face) with Lilly-style scores. Optionally includes dispositorship chains, mutual receptions, and final dispositors. Cost: 1 credit.\",\n inputSchema: {\n datetime: z.string().optional().describe(\"ISO 8601 UTC datetime. Provide either datetime or jd.\"),\n jd: z.number().optional().describe(\"Julian Day number in UT1.\"),\n bodies: z.string().optional().describe(\"Comma-separated body names, or 'planets' (default).\"),\n rulership: z.string().optional().describe(\"Rulership scheme: 'modern' (default, includes outer planets) or 'classical' (visible planets only).\"),\n day_chart: z.string().optional().describe(\"Is this a day chart? 'true', 'false', or 'auto' (default, skips triplicity).\"),\n dispositors: z.boolean().optional().describe(\"Include dispositorship chains, mutual receptions, final dispositors. Default: false.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime, jd, bodies, rulership, day_chart, dispositors }) => {\n if (!datetime && jd === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }] };\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 (rulership) body.rulership = rulership;\n if (day_chart) body.day_chart = day_chart;\n if (dispositors !== undefined) body.dispositors = dispositors;\n\n const response = await client.callEndpoint(\"/v1/dignities\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\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 registerSynastry(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"calculate_synastry\",\n {\n title: \"Calculate Synastry\",\n description:\n \"Computes synastry between two natal charts: each chart's positions, houses, and aspects, plus inter-chart aspects and parallels. Requires two sets of datetime and location (suffixed _a and _b). Cost: 3 credits.\",\n inputSchema: {\n datetime_a: z.string().optional().describe(\"Chart A datetime (ISO 8601 UTC). Provide either datetime_a or jd_a.\"),\n jd_a: z.number().optional().describe(\"Chart A Julian Day in UT1.\"),\n lat_a: z.number().min(-90).max(90).describe(\"Chart A latitude. REQUIRED.\"),\n lon_a: z.number().min(-180).max(180).describe(\"Chart A longitude (east positive). REQUIRED.\"),\n datetime_b: z.string().optional().describe(\"Chart B datetime (ISO 8601 UTC). Provide either datetime_b or jd_b.\"),\n jd_b: z.number().optional().describe(\"Chart B Julian Day in UT1.\"),\n lat_b: z.number().min(-90).max(90).describe(\"Chart B latitude. REQUIRED.\"),\n lon_b: z.number().min(-180).max(180).describe(\"Chart B longitude (east positive). REQUIRED.\"),\n bodies: z.string().optional().describe(\"Comma-separated body names. Default: 'planets'.\"),\n system: z.string().optional().describe(\"House system. Default: 'placidus'.\"),\n aspects: z.string().optional().describe(\"Comma-separated aspect types.\"),\n orb: z.number().optional().describe(\"Default orb in degrees.\"),\n parallels: z.boolean().optional().describe(\"Include parallels. Default: true.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime_a, jd_a, lat_a, lon_a, datetime_b, jd_b, lat_b, lon_b, bodies, system, aspects, orb, parallels }) => {\n if (!datetime_a && jd_a === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Chart A requires either 'datetime_a' or 'jd_a'.\" }] };\n }\n if (!datetime_b && jd_b === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Chart B requires either 'datetime_b' or 'jd_b'.\" }] };\n }\n const body: Record<string, unknown> = { lat_a, lon_a, lat_b, lon_b };\n if (datetime_a) body.datetime_a = datetime_a;\n if (jd_a !== undefined) body.jd_a = jd_a;\n if (datetime_b) body.datetime_b = datetime_b;\n if (jd_b !== undefined) body.jd_b = jd_b;\n if (bodies) body.bodies = bodies;\n if (system) body.system = system;\n if (aspects) body.aspects = aspects;\n if (orb !== undefined) body.orb = orb;\n if (parallels !== undefined) body.parallels = parallels;\n\n const response = await client.callEndpoint(\"/v1/synastry\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\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 registerComposite(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"calculate_composite\",\n {\n title: \"Calculate Composite Chart\",\n description:\n \"Computes a midpoint composite chart from two natal charts. Each position is the shortest-arc midpoint of the two charts' positions. Cost: 3 credits.\",\n inputSchema: {\n datetime_a: z.string().optional().describe(\"Chart A datetime (ISO 8601 UTC).\"),\n jd_a: z.number().optional().describe(\"Chart A Julian Day.\"),\n lat_a: z.number().min(-90).max(90).describe(\"Chart A latitude. REQUIRED.\"),\n lon_a: z.number().min(-180).max(180).describe(\"Chart A longitude. REQUIRED.\"),\n datetime_b: z.string().optional().describe(\"Chart B datetime (ISO 8601 UTC).\"),\n jd_b: z.number().optional().describe(\"Chart B Julian Day.\"),\n lat_b: z.number().min(-90).max(90).describe(\"Chart B latitude. REQUIRED.\"),\n lon_b: z.number().min(-180).max(180).describe(\"Chart B longitude. REQUIRED.\"),\n bodies: z.string().optional().describe(\"Comma-separated body names. Default: 'planets'.\"),\n system: z.string().optional().describe(\"House system. Default: 'placidus'.\"),\n aspects: z.string().optional().describe(\"Comma-separated aspect types.\"),\n resolution: z.string().optional().describe(\"Midpoint resolution: 'lower' (default) or 'higher'.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime_a, jd_a, lat_a, lon_a, datetime_b, jd_b, lat_b, lon_b, bodies, system, aspects, resolution }) => {\n if (!datetime_a && jd_a === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Chart A requires either 'datetime_a' or 'jd_a'.\" }] };\n }\n if (!datetime_b && jd_b === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Chart B requires either 'datetime_b' or 'jd_b'.\" }] };\n }\n const body: Record<string, unknown> = { lat_a, lon_a, lat_b, lon_b };\n if (datetime_a) body.datetime_a = datetime_a;\n if (jd_a !== undefined) body.jd_a = jd_a;\n if (datetime_b) body.datetime_b = datetime_b;\n if (jd_b !== undefined) body.jd_b = jd_b;\n if (bodies) body.bodies = bodies;\n if (system) body.system = system;\n if (aspects) body.aspects = aspects;\n if (resolution) body.resolution = resolution;\n\n const response = await client.callEndpoint(\"/v1/composite\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\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 registerDavison(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"calculate_davison\",\n {\n title: \"Calculate Davison Chart\",\n description:\n \"Computes a Davison relationship chart — a natal chart cast at the time-space midpoint of two charts. Uses great-circle geographic midpoint and Julian Day midpoint. Cost: 3 credits.\",\n inputSchema: {\n datetime_a: z.string().optional().describe(\"Chart A datetime (ISO 8601 UTC).\"),\n jd_a: z.number().optional().describe(\"Chart A Julian Day.\"),\n lat_a: z.number().min(-90).max(90).describe(\"Chart A latitude. REQUIRED.\"),\n lon_a: z.number().min(-180).max(180).describe(\"Chart A longitude. REQUIRED.\"),\n datetime_b: z.string().optional().describe(\"Chart B datetime (ISO 8601 UTC).\"),\n jd_b: z.number().optional().describe(\"Chart B Julian Day.\"),\n lat_b: z.number().min(-90).max(90).describe(\"Chart B latitude. REQUIRED.\"),\n lon_b: z.number().min(-180).max(180).describe(\"Chart B longitude. REQUIRED.\"),\n bodies: z.string().optional().describe(\"Comma-separated body names. Default: 'planets'.\"),\n system: z.string().optional().describe(\"House system. Default: 'placidus'.\"),\n aspects: z.string().optional().describe(\"Comma-separated aspect types.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime_a, jd_a, lat_a, lon_a, datetime_b, jd_b, lat_b, lon_b, bodies, system, aspects }) => {\n if (!datetime_a && jd_a === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Chart A requires either 'datetime_a' or 'jd_a'.\" }] };\n }\n if (!datetime_b && jd_b === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Chart B requires either 'datetime_b' or 'jd_b'.\" }] };\n }\n const body: Record<string, unknown> = { lat_a, lon_a, lat_b, lon_b };\n if (datetime_a) body.datetime_a = datetime_a;\n if (jd_a !== undefined) body.jd_a = jd_a;\n if (datetime_b) body.datetime_b = datetime_b;\n if (jd_b !== undefined) body.jd_b = jd_b;\n if (bodies) body.bodies = bodies;\n if (system) body.system = system;\n if (aspects) body.aspects = aspects;\n\n const response = await client.callEndpoint(\"/v1/davison\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\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 registerProgressed(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"calculate_progressed\",\n {\n title: \"Calculate Progressed Chart\",\n description:\n \"Computes a secondary progressed chart using the day-for-a-year method. Provide the natal birth datetime and a target date to progress to. Returns a full chart at the progressed datetime. Cost: 2 credits.\",\n inputSchema: {\n datetime: z.string().optional().describe(\"Natal birth datetime (ISO 8601 UTC). Provide either datetime or jd.\"),\n jd: z.number().optional().describe(\"Natal birth Julian Day.\"),\n target_datetime: z.string().optional().describe(\"Target date to progress to (ISO 8601 UTC). Provide either target_datetime or target_jd.\"),\n target_jd: z.number().optional().describe(\"Target Julian Day to progress to.\"),\n lat: z.number().min(-90).max(90).describe(\"Birth location latitude. REQUIRED.\"),\n lon: z.number().min(-180).max(180).describe(\"Birth location longitude. REQUIRED.\"),\n bodies: z.string().optional().describe(\"Comma-separated body names. Default: 'planets'.\"),\n system: z.string().optional().describe(\"House system. Default: 'placidus'.\"),\n aspects: z.string().optional().describe(\"Comma-separated aspect types.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime, jd, target_datetime, target_jd, lat, lon, bodies, system, aspects }) => {\n if (!datetime && jd === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Natal birth time required: provide either 'datetime' or 'jd'.\" }] };\n }\n if (!target_datetime && target_jd === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Target date required: provide either 'target_datetime' or 'target_jd'.\" }] };\n }\n const body: Record<string, unknown> = { lat, lon };\n if (datetime) body.datetime = datetime;\n if (jd !== undefined) body.jd = jd;\n if (target_datetime) body.target_datetime = target_datetime;\n if (target_jd !== undefined) body.target_jd = target_jd;\n if (bodies) body.bodies = bodies;\n if (system) body.system = system;\n if (aspects) body.aspects = aspects;\n\n const response = await client.callEndpoint(\"/v1/progressed\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\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 registerDraconic(\n server: McpServer,\n client: MorphemerisClient,\n): void {\n server.registerTool(\n \"calculate_draconic\",\n {\n title: \"Calculate Draconic Chart\",\n description:\n \"Computes a draconic chart by rotating all positions so the North Node falls at 0° Aries. Make sure to include mean_node or true_node in the bodies list. Cost: 2 credits.\",\n inputSchema: {\n datetime: z.string().optional().describe(\"ISO 8601 UTC datetime. Provide either datetime or jd.\"),\n jd: z.number().optional().describe(\"Julian Day number in UT1.\"),\n lat: z.number().min(-90).max(90).describe(\"Observer latitude. REQUIRED.\"),\n lon: z.number().min(-180).max(180).describe(\"Observer longitude. REQUIRED.\"),\n bodies: z.string().optional().describe(\"Comma-separated body names. Must include mean_node or true_node. Default: 'planets' (includes mean_node).\"),\n system: z.string().optional().describe(\"House system. Default: 'placidus'.\"),\n node: z.string().optional().describe(\"Node body for rotation: 'mean_node' (default) or 'true_node'.\"),\n aspects: z.string().optional().describe(\"Comma-separated aspect types.\"),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async ({ datetime, jd, lat, lon, bodies, system, node, aspects }) => {\n if (!datetime && jd === undefined) {\n return { isError: true, content: [{ type: \"text\", text: \"Either 'datetime' or 'jd' is required.\" }] };\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 (system) body.system = system;\n if (node) body.node = node;\n if (aspects) body.aspects = aspects;\n\n const response = await client.callEndpoint(\"/v1/draconic\", body);\n return { content: [{ type: \"text\", text: JSON.stringify(response, null, 2) }] };\n },\n );\n}\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\";\nimport { registerBatchRequests } from \"./batch-requests.js\";\nimport { registerNatalChart } from \"./natal-chart.js\";\nimport { registerAspects } from \"./aspects.js\";\nimport { registerDignities } from \"./dignities.js\";\nimport { registerSynastry } from \"./synastry.js\";\nimport { registerComposite } from \"./composite.js\";\nimport { registerDavison } from \"./davison.js\";\nimport { registerProgressed } from \"./progressed.js\";\nimport { registerDraconic } from \"./draconic.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 registerBatchRequests(server, client);\n registerNatalChart(server, client);\n registerAspects(server, client);\n registerDignities(server, client);\n registerSynastry(server, client);\n registerComposite(server, client);\n registerDavison(server, client);\n registerProgressed(server, client);\n registerDraconic(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","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","z","server","server","server"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@morphemeris/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "MCP server for the Morphemeris astronomical ephemeris API",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"README.md"
|
|
13
13
|
],
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
15
|
+
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
16
16
|
"zod": "^4.3.6"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|