@openephemeris/mcp-server 3.15.0 → 3.16.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/CHANGELOG.md +11 -0
- package/README.md +5 -3
- package/dist/tools/apps/bodygraph-app.d.ts +9 -5
- package/dist/tools/apps/bodygraph-app.js +187 -5
- package/dist/ui/bi-wheel.html +7920 -0
- package/dist/ui/moon-phase.html +6787 -0
- package/dist/ui/transit-timeline.html +6874 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,17 @@ Version numbering follows [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [3.16.0] — 2026-07-05
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **`explore_human_design_transit`** — personalized Human Design transit overlay. Overlays a transiting moment on a person's natal bodygraph and highlights the channels the transit temporarily completes plus any newly-defined centers. Premium (Developer tier); renders an interactive overlay bodygraph in MCP Apps hosts.
|
|
14
|
+
- **`explore_human_design_connection`** — two-person Human Design connection (synastry) overlay. Classifies every connected channel as electromagnetic / companionship / dominance / compromise and renders a two-person overlay bodygraph. Premium (Developer tier).
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- **`human_design_composite` is now Developer-tier** (was Explorer) and returns real connection-channel scoring — the previously-stubbed relationship endpoint (`/human-design/composite`) is now live end-to-end.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
10
21
|
## [3.15.0] — 2026-06-15
|
|
11
22
|
|
|
12
23
|
### Changed
|
package/README.md
CHANGED
|
@@ -229,7 +229,9 @@ The server is hosted at `https://mcp.openephemeris.com/mcp` with full Streamable
|
|
|
229
229
|
| Station tracker | `electional_station_tracker` | Developer |
|
|
230
230
|
| Aspect search | `electional_aspect_search` | Developer |
|
|
231
231
|
| Human Design chart | `human_design_chart` | Explorer |
|
|
232
|
-
| HD composite | `human_design_composite` |
|
|
232
|
+
| HD composite | `human_design_composite` | Developer |
|
|
233
|
+
| HD transit overlay | `explore_human_design_transit` | Developer |
|
|
234
|
+
| HD connection (synastry) | `explore_human_design_connection` | Developer |
|
|
233
235
|
| HD penta | `human_design_penta` | Explorer |
|
|
234
236
|
| HD return / opposition | `hd_planetary_return`, `hd_opposition` | Explorer |
|
|
235
237
|
| Vedic chart | `vedic_chart` | Explorer |
|
|
@@ -355,8 +357,8 @@ Generated by `npm run sync:readme` from `config/dev-allowlist.json` and the live
|
|
|
355
357
|
|
|
356
358
|
- Allowlisted operations: **28**
|
|
357
359
|
- Methods: `GET=4`, `POST=24`, `PUT=0`, `PATCH=0`, `DELETE=0`
|
|
358
|
-
- Registered tools (`OPENEPHEMERIS_PROFILE=dev`): **
|
|
359
|
-
- Typed tools: `acg_hits`, `acg_power_lines`, `auth_login`, `auth_logout`, `auth_status`, `bazi_annual_pillar`, `bazi_chart`, `bazi_compatibility`, `bazi_element_balance`, `bazi_luck_pillars`, `bazi_ten_gods`, `bi_wheel_on_cross_aspect_click`, `bi_wheel_on_house_click`, `bi_wheel_on_planet_click`, `bi_wheel_recalculate`, `bi_wheel_synopsis`, `bodygraph_recalculate`, `chart_wheel_on_aspect_click`, `chart_wheel_on_house_click`, `chart_wheel_on_planet_click`, `chart_wheel_recalculate`, `chinese_bazi`, `dev_list_allowed`, `dev_read_api`, `dev_write_api`, `electional_aspect_search`, `electional_moment_analysis`, `electional_station_tracker`, `ephemeris_angles_points`, `ephemeris_aspect_check`, `ephemeris_bi_wheel`, `ephemeris_chart_wheel`, `ephemeris_composite`, `ephemeris_composite_midpoint`, `ephemeris_dignities`, `ephemeris_electional`, `ephemeris_fixed_stars`, `ephemeris_hermetic_lots`, `ephemeris_house_cusps`, `ephemeris_lunar_return`, `ephemeris_midpoints`, `ephemeris_moon_phase`, `ephemeris_natal_batch`, `ephemeris_natal_chart`, `ephemeris_natal_transits`, `ephemeris_next_eclipse`, `ephemeris_next_lunar_phase`, `ephemeris_overlay`, `ephemeris_planet_position`, `ephemeris_planetary_return`, `ephemeris_progressed_chart`, `ephemeris_relocation`, `ephemeris_retrograde_status`, `ephemeris_solar_return`, `ephemeris_synastry`, `ephemeris_transits`, `explore_bi_wheel`, `explore_human_design`, `explore_moon_phase`, `explore_natal_chart`, `hd_on_center_click`, `hd_on_channel_click`, `hd_on_gate_click`, `hd_on_planet_click`, `hd_on_variable_click`, `hd_opposition`, `hd_planetary_return`, `human_design_bodygraph`, `human_design_chart`, `human_design_composite`, `human_design_penta`, `location_search`, `timezone_resolve`, `vedic_chart`, `venus_eight_year_star`, `venus_elongations`, `venus_phase`, `venus_star_points`, `venus_star_points_conjunctions`, `venus_stations`
|
|
360
|
+
- Registered tools (`OPENEPHEMERIS_PROFILE=dev`): **82**
|
|
361
|
+
- Typed tools: `acg_hits`, `acg_power_lines`, `auth_login`, `auth_logout`, `auth_status`, `bazi_annual_pillar`, `bazi_chart`, `bazi_compatibility`, `bazi_element_balance`, `bazi_luck_pillars`, `bazi_ten_gods`, `bi_wheel_on_cross_aspect_click`, `bi_wheel_on_house_click`, `bi_wheel_on_planet_click`, `bi_wheel_recalculate`, `bi_wheel_synopsis`, `bodygraph_recalculate`, `chart_wheel_on_aspect_click`, `chart_wheel_on_house_click`, `chart_wheel_on_planet_click`, `chart_wheel_recalculate`, `chinese_bazi`, `dev_list_allowed`, `dev_read_api`, `dev_write_api`, `electional_aspect_search`, `electional_moment_analysis`, `electional_station_tracker`, `ephemeris_angles_points`, `ephemeris_aspect_check`, `ephemeris_bi_wheel`, `ephemeris_chart_wheel`, `ephemeris_composite`, `ephemeris_composite_midpoint`, `ephemeris_dignities`, `ephemeris_electional`, `ephemeris_fixed_stars`, `ephemeris_hermetic_lots`, `ephemeris_house_cusps`, `ephemeris_lunar_return`, `ephemeris_midpoints`, `ephemeris_moon_phase`, `ephemeris_natal_batch`, `ephemeris_natal_chart`, `ephemeris_natal_transits`, `ephemeris_next_eclipse`, `ephemeris_next_lunar_phase`, `ephemeris_overlay`, `ephemeris_planet_position`, `ephemeris_planetary_return`, `ephemeris_progressed_chart`, `ephemeris_relocation`, `ephemeris_retrograde_status`, `ephemeris_solar_return`, `ephemeris_synastry`, `ephemeris_transits`, `explore_bi_wheel`, `explore_human_design`, `explore_human_design_connection`, `explore_human_design_transit`, `explore_moon_phase`, `explore_natal_chart`, `hd_on_center_click`, `hd_on_channel_click`, `hd_on_gate_click`, `hd_on_planet_click`, `hd_on_variable_click`, `hd_opposition`, `hd_planetary_return`, `human_design_bodygraph`, `human_design_chart`, `human_design_composite`, `human_design_penta`, `location_search`, `timezone_resolve`, `vedic_chart`, `venus_eight_year_star`, `venus_elongations`, `venus_phase`, `venus_star_points`, `venus_star_points_conjunctions`, `venus_stations`
|
|
360
362
|
- Generic tools:
|
|
361
363
|
|
|
362
364
|
### Allowlist Families
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* bodygraph-app.ts — MCP App tool registration for the Human Design Bodygraph Explorer.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* • explore_human_design
|
|
6
|
-
* •
|
|
7
|
-
* •
|
|
8
|
-
*
|
|
4
|
+
* Entry tools [model + app]:
|
|
5
|
+
* • explore_human_design — natal bodygraph, data + UI resource
|
|
6
|
+
* • explore_human_design_transit — natal + transit overlay (premium)
|
|
7
|
+
* • explore_human_design_connection — two-person connection/synastry overlay (premium)
|
|
8
|
+
* Click handlers [app-only]: hd_on_center_click, hd_on_gate_click,
|
|
9
|
+
* hd_on_channel_click, hd_on_planet_click, hd_on_variable_click.
|
|
10
|
+
* The transit + connection tools reuse this bodygraph iframe resource; their
|
|
11
|
+
* overlay SVG is returned inline by /human-design/transit-chart and
|
|
12
|
+
* /human-design/composite (include_visual) rather than a separate render call.
|
|
9
13
|
*
|
|
10
14
|
* The bodygraph is rendered client-side from structured JSON — no SVG endpoint
|
|
11
15
|
* is called, keeping latency at zero and the architecture consistent with
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* bodygraph-app.ts — MCP App tool registration for the Human Design Bodygraph Explorer.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* • explore_human_design
|
|
6
|
-
* •
|
|
7
|
-
* •
|
|
8
|
-
*
|
|
4
|
+
* Entry tools [model + app]:
|
|
5
|
+
* • explore_human_design — natal bodygraph, data + UI resource
|
|
6
|
+
* • explore_human_design_transit — natal + transit overlay (premium)
|
|
7
|
+
* • explore_human_design_connection — two-person connection/synastry overlay (premium)
|
|
8
|
+
* Click handlers [app-only]: hd_on_center_click, hd_on_gate_click,
|
|
9
|
+
* hd_on_channel_click, hd_on_planet_click, hd_on_variable_click.
|
|
10
|
+
* The transit + connection tools reuse this bodygraph iframe resource; their
|
|
11
|
+
* overlay SVG is returned inline by /human-design/transit-chart and
|
|
12
|
+
* /human-design/composite (include_visual) rather than a separate render call.
|
|
9
13
|
*
|
|
10
14
|
* The bodygraph is rendered client-side from structured JSON — no SVG endpoint
|
|
11
15
|
* is called, keeping latency at zero and the architecture consistent with
|
|
@@ -1173,3 +1177,181 @@ registerTool({
|
|
|
1173
1177
|
};
|
|
1174
1178
|
},
|
|
1175
1179
|
});
|
|
1180
|
+
// ── Tool: explore_human_design_transit ───────────────────────────────────────
|
|
1181
|
+
// Personalized Human Design transit overlay (natal chart + a transiting moment).
|
|
1182
|
+
// Premium (Developer tier). Calls POST /human-design/transit-chart.
|
|
1183
|
+
registerTool({
|
|
1184
|
+
name: "explore_human_design_transit",
|
|
1185
|
+
description: "Overlay the current (or a chosen) planetary transit on a person's natal Human Design bodygraph. " +
|
|
1186
|
+
"Highlights the channels a transit temporarily COMPLETES with the natal chart and any centers it " +
|
|
1187
|
+
"newly defines — the core of a Human Design transit reading. " +
|
|
1188
|
+
"Returns an interactive overlay bodygraph in MCP Apps-capable hosts (Claude Desktop), with a text " +
|
|
1189
|
+
"summary fallback elsewhere. Premium (Developer tier). Calculated with NASA JPL DE440 ephemerides.",
|
|
1190
|
+
inputSchema: {
|
|
1191
|
+
type: "object",
|
|
1192
|
+
properties: {
|
|
1193
|
+
datetime: {
|
|
1194
|
+
type: "string",
|
|
1195
|
+
description: "Natal birth datetime, ISO 8601 (e.g. '1990-04-15T19:30:00Z'). Include 'Z' or an offset, " +
|
|
1196
|
+
"or supply timezone for local time. HD is time-sensitive to the minute.",
|
|
1197
|
+
},
|
|
1198
|
+
latitude: { type: "number", description: "Natal birth latitude (decimal degrees, +N). Optional." },
|
|
1199
|
+
longitude: { type: "number", description: "Natal birth longitude (decimal degrees, +E). Optional." },
|
|
1200
|
+
location: { type: "string", description: "Natal location name, display only." },
|
|
1201
|
+
timezone: { type: "string", description: "IANA timezone for the birth location (e.g. 'America/New_York')." },
|
|
1202
|
+
transit_datetime: {
|
|
1203
|
+
type: "string",
|
|
1204
|
+
description: "Transit moment, ISO 8601. Defaults to now (UTC) when omitted.",
|
|
1205
|
+
},
|
|
1206
|
+
},
|
|
1207
|
+
required: ["datetime"],
|
|
1208
|
+
},
|
|
1209
|
+
outputSchema: OUTPUT_SCHEMA_JSON,
|
|
1210
|
+
annotations: {
|
|
1211
|
+
title: "Human Design Transit Overlay",
|
|
1212
|
+
readOnlyHint: true,
|
|
1213
|
+
destructiveHint: false,
|
|
1214
|
+
idempotentHint: false,
|
|
1215
|
+
openWorldHint: false,
|
|
1216
|
+
},
|
|
1217
|
+
_meta: { ui: { resourceUri: BODYGRAPH_RESOURCE_URI, visibility: ["model", "app"] } },
|
|
1218
|
+
handler: async (args) => {
|
|
1219
|
+
const client = getActiveClient();
|
|
1220
|
+
const timezone = args.timezone;
|
|
1221
|
+
const natalIso = localToUtcIso(String(args.datetime), timezone);
|
|
1222
|
+
const lat = args.latitude ?? 0;
|
|
1223
|
+
const lon = args.longitude ?? 0;
|
|
1224
|
+
// SubjectRequest wire shape: name (required), birth_datetime.iso, and
|
|
1225
|
+
// birth_location with struct-typed coordinate/timezone inputs (matches the
|
|
1226
|
+
// live bi-wheel/transit-timeline tools — bare scalars are rejected).
|
|
1227
|
+
const body = {
|
|
1228
|
+
subject: {
|
|
1229
|
+
name: args.location ?? "Subject",
|
|
1230
|
+
birth_datetime: { iso: natalIso },
|
|
1231
|
+
birth_location: {
|
|
1232
|
+
latitude: { decimal: lat },
|
|
1233
|
+
longitude: { decimal: lon },
|
|
1234
|
+
...(timezone ? { timezone: { iana_name: timezone } } : {}),
|
|
1235
|
+
},
|
|
1236
|
+
},
|
|
1237
|
+
};
|
|
1238
|
+
if (args.transit_datetime) {
|
|
1239
|
+
body.transit_datetime = { iso: ensureTimezone(String(args.transit_datetime)) };
|
|
1240
|
+
}
|
|
1241
|
+
const bundleAvailable = Boolean(getBodygraphBundle());
|
|
1242
|
+
if (bundleAvailable)
|
|
1243
|
+
body.include_visual = true;
|
|
1244
|
+
const resp = await client.request("POST", "/human-design/transit-chart", { data: body });
|
|
1245
|
+
const transit = (resp?.transit ?? {});
|
|
1246
|
+
const completed = Array.isArray(transit.completed_channels) ? transit.completed_channels : [];
|
|
1247
|
+
const newCenters = Array.isArray(transit.newly_defined_centers) ? transit.newly_defined_centers : [];
|
|
1248
|
+
const natal = (resp?.natal ?? {});
|
|
1249
|
+
const svg = resp?.visual?.data;
|
|
1250
|
+
const summary = `**Human Design Transit Overlay**\n\n` +
|
|
1251
|
+
`Natal: ${natal.type ?? "—"} ${natal.profile ?? ""} · ${natal.authority ?? ""} authority.\n\n` +
|
|
1252
|
+
(completed.length
|
|
1253
|
+
? `The transit **completes ${completed.length} channel${completed.length === 1 ? "" : "s"}**: ${completed.join(", ")}.`
|
|
1254
|
+
: `The transit completes no channels right now.`) +
|
|
1255
|
+
(newCenters.length
|
|
1256
|
+
? `\n\nNewly-defined center${newCenters.length === 1 ? "" : "s"}: **${newCenters.join(", ")}** — a temporary shift while the transit holds.`
|
|
1257
|
+
: "");
|
|
1258
|
+
const payload = { ...resp, _svg: svg, server_version: SERVER_VERSION };
|
|
1259
|
+
if (bundleAvailable && svg) {
|
|
1260
|
+
return {
|
|
1261
|
+
content: [{ type: "text", text: summary }],
|
|
1262
|
+
structuredContent: payload,
|
|
1263
|
+
_meta: { "ui/resourceUri": BODYGRAPH_RESOURCE_URI, ui: { resourceUri: BODYGRAPH_RESOURCE_URI } },
|
|
1264
|
+
};
|
|
1265
|
+
}
|
|
1266
|
+
return { content: [{ type: "text", text: summary }], structuredContent: payload };
|
|
1267
|
+
},
|
|
1268
|
+
});
|
|
1269
|
+
// ── Tool: explore_human_design_connection ────────────────────────────────────
|
|
1270
|
+
// Two-person Human Design connection (synastry) overlay. Premium (Developer tier).
|
|
1271
|
+
// Calls POST /human-design/composite.
|
|
1272
|
+
registerTool({
|
|
1273
|
+
name: "explore_human_design_connection",
|
|
1274
|
+
description: "Compare two people's Human Design charts and classify every connected channel by HD connection " +
|
|
1275
|
+
"theory — electromagnetic (attraction), companionship (sameness), dominance (one defines), and " +
|
|
1276
|
+
"compromise (friction). Returns an interactive two-person overlay bodygraph in MCP Apps-capable " +
|
|
1277
|
+
"hosts, with a text summary fallback elsewhere. Premium (Developer tier). NASA JPL DE440 ephemerides.",
|
|
1278
|
+
inputSchema: {
|
|
1279
|
+
type: "object",
|
|
1280
|
+
properties: {
|
|
1281
|
+
person_a: {
|
|
1282
|
+
type: "object",
|
|
1283
|
+
description: "First person's birth data.",
|
|
1284
|
+
properties: {
|
|
1285
|
+
datetime: { type: "string", description: "Birth datetime, ISO 8601 (Z/offset, or local with timezone)." },
|
|
1286
|
+
latitude: { type: "number", description: "Birth latitude (decimal degrees, +N). Optional." },
|
|
1287
|
+
longitude: { type: "number", description: "Birth longitude (decimal degrees, +E). Optional." },
|
|
1288
|
+
timezone: { type: "string", description: "IANA timezone (e.g. 'America/New_York')." },
|
|
1289
|
+
},
|
|
1290
|
+
required: ["datetime"],
|
|
1291
|
+
},
|
|
1292
|
+
person_b: {
|
|
1293
|
+
type: "object",
|
|
1294
|
+
description: "Second person's birth data.",
|
|
1295
|
+
properties: {
|
|
1296
|
+
datetime: { type: "string", description: "Birth datetime, ISO 8601 (Z/offset, or local with timezone)." },
|
|
1297
|
+
latitude: { type: "number", description: "Birth latitude (decimal degrees, +N). Optional." },
|
|
1298
|
+
longitude: { type: "number", description: "Birth longitude (decimal degrees, +E). Optional." },
|
|
1299
|
+
timezone: { type: "string", description: "IANA timezone (e.g. 'America/New_York')." },
|
|
1300
|
+
},
|
|
1301
|
+
required: ["datetime"],
|
|
1302
|
+
},
|
|
1303
|
+
},
|
|
1304
|
+
required: ["person_a", "person_b"],
|
|
1305
|
+
},
|
|
1306
|
+
outputSchema: OUTPUT_SCHEMA_JSON,
|
|
1307
|
+
annotations: {
|
|
1308
|
+
title: "Human Design Connection (Synastry)",
|
|
1309
|
+
readOnlyHint: true,
|
|
1310
|
+
destructiveHint: false,
|
|
1311
|
+
idempotentHint: true,
|
|
1312
|
+
openWorldHint: false,
|
|
1313
|
+
},
|
|
1314
|
+
_meta: { ui: { resourceUri: BODYGRAPH_RESOURCE_URI, visibility: ["model", "app"] } },
|
|
1315
|
+
handler: async (args) => {
|
|
1316
|
+
const client = getActiveClient();
|
|
1317
|
+
const toSubject = (p) => {
|
|
1318
|
+
const tz = p?.timezone;
|
|
1319
|
+
return {
|
|
1320
|
+
birth_datetime_utc: localToUtcIso(String(p?.datetime), tz),
|
|
1321
|
+
latitude: p?.latitude ?? 0,
|
|
1322
|
+
longitude: p?.longitude ?? 0,
|
|
1323
|
+
};
|
|
1324
|
+
};
|
|
1325
|
+
const body = {
|
|
1326
|
+
subject_1: toSubject(args.person_a),
|
|
1327
|
+
subject_2: toSubject(args.person_b),
|
|
1328
|
+
};
|
|
1329
|
+
const bundleAvailable = Boolean(getBodygraphBundle());
|
|
1330
|
+
if (bundleAvailable)
|
|
1331
|
+
body.include_visual = true;
|
|
1332
|
+
const resp = await client.request("POST", "/human-design/composite", { data: body });
|
|
1333
|
+
const connections = Array.isArray(resp?.connections) ? resp.connections : [];
|
|
1334
|
+
const svg = resp?.visual?.data;
|
|
1335
|
+
const byType = (t) => connections.filter((c) => c?.type === t).map((c) => c.id);
|
|
1336
|
+
const line = (label, t) => {
|
|
1337
|
+
const ids = byType(t);
|
|
1338
|
+
return ids.length ? `\n- **${label}** (${ids.length}): ${ids.join(", ")}` : "";
|
|
1339
|
+
};
|
|
1340
|
+
const summary = `**Human Design Connection**\n\n` +
|
|
1341
|
+
`${connections.length} connected channel${connections.length === 1 ? "" : "s"}:` +
|
|
1342
|
+
line("Electromagnetic — attraction", "electromagnetic") +
|
|
1343
|
+
line("Companionship — sameness", "companionship") +
|
|
1344
|
+
line("Dominance — one defines", "dominance") +
|
|
1345
|
+
line("Compromise — friction", "compromise") +
|
|
1346
|
+
(connections.length ? "" : " none.");
|
|
1347
|
+
const payload = { ...resp, _svg: svg, server_version: SERVER_VERSION };
|
|
1348
|
+
if (bundleAvailable && svg) {
|
|
1349
|
+
return {
|
|
1350
|
+
content: [{ type: "text", text: summary }],
|
|
1351
|
+
structuredContent: payload,
|
|
1352
|
+
_meta: { "ui/resourceUri": BODYGRAPH_RESOURCE_URI, ui: { resourceUri: BODYGRAPH_RESOURCE_URI } },
|
|
1353
|
+
};
|
|
1354
|
+
}
|
|
1355
|
+
return { content: [{ type: "text", text: summary }], structuredContent: payload };
|
|
1356
|
+
},
|
|
1357
|
+
});
|