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