@openephemeris/mcp-server 3.13.5 → 3.13.7

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.
@@ -304,14 +304,6 @@ registerTool({
304
304
  content: [
305
305
  { type: "text", text: summary },
306
306
  { type: "text", text: JSON.stringify({ ...payload, server_version: SERVER_VERSION }) },
307
- {
308
- type: "resource",
309
- resource: {
310
- uri: BI_WHEEL_RESOURCE_URI,
311
- mimeType: BI_WHEEL_MIME_TYPE,
312
- text: getBiWheelBundle(),
313
- },
314
- },
315
307
  ],
316
308
  _meta: {
317
309
  ui: { resourceUri: BI_WHEEL_RESOURCE_URI },
@@ -286,14 +286,6 @@ registerTool({
286
286
  content: [
287
287
  { type: "text", text: summary },
288
288
  { type: "text", text: JSON.stringify({ ...modelPayload, server_version: SERVER_VERSION }) },
289
- {
290
- type: "resource",
291
- resource: {
292
- uri: BODYGRAPH_RESOURCE_URI,
293
- mimeType: BODYGRAPH_MIME_TYPE,
294
- text: getBodygraphBundle(),
295
- },
296
- },
297
289
  ],
298
290
  _meta: {
299
291
  ui: { resourceUri: BODYGRAPH_RESOURCE_URI },
@@ -182,14 +182,6 @@ registerTool({
182
182
  content: [
183
183
  { type: "text", text: summary },
184
184
  { type: "text", text: JSON.stringify({ ...modelPayload, server_version: SERVER_VERSION }) },
185
- {
186
- type: "resource",
187
- resource: {
188
- uri: CHART_WHEEL_RESOURCE_URI,
189
- mimeType: CHART_WHEEL_MIME_TYPE,
190
- text: getChartWheelBundle(),
191
- },
192
- },
193
185
  ],
194
186
  _meta: {
195
187
  ui: { resourceUri: CHART_WHEEL_RESOURCE_URI },
@@ -453,7 +445,10 @@ function buildModelPayload(chartData, birthParams, houseSystem, svgBase) {
453
445
  // ── 2. Compute aspects from longitude data (API doesn't return them) ──────
454
446
  const aspects = computeAspects(planetsArray);
455
447
  return {
456
- ...chartData,
448
+ ascendant: chartData.ascendant,
449
+ midheaven: chartData.midheaven,
450
+ chart_ruler: chartData.chart_ruler,
451
+ houses: chartData.houses,
457
452
  // Typed array replaces the keyed object — the renderer can now iterate it
458
453
  planets: planetsArray,
459
454
  // Structured aspect array — powers highlighting and info panel
@@ -54,6 +54,7 @@ registerTool({
54
54
  required: ["birth_datetime", "birth_latitude", "birth_longitude"],
55
55
  additionalProperties: false,
56
56
  },
57
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
57
58
  handler: async (args) => {
58
59
  validateRequired(args, ["birth_datetime", "birth_latitude", "birth_longitude"]);
59
60
  const body = {
@@ -146,6 +147,7 @@ registerTool({
146
147
  required: ["birth_datetime", "birth_latitude", "birth_longitude", "query_latitude", "query_longitude"],
147
148
  additionalProperties: false,
148
149
  },
150
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
149
151
  handler: async (args) => {
150
152
  validateRequired(args, ["birth_datetime", "birth_latitude", "birth_longitude", "query_latitude", "query_longitude"]);
151
153
  const body = {
@@ -39,6 +39,7 @@ registerTool({
39
39
  },
40
40
  additionalProperties: false,
41
41
  },
42
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
42
43
  handler: async (args) => {
43
44
  let year = args.year;
44
45
  let month = args.month;
@@ -38,6 +38,7 @@ registerTool({
38
38
  required: ["datetime_a", "latitude_a", "longitude_a", "datetime_b", "latitude_b", "longitude_b"],
39
39
  additionalProperties: false,
40
40
  },
41
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
41
42
  handler: async (args) => {
42
43
  validateRequired(args, ["datetime_a", "latitude_a", "longitude_a", "datetime_b", "latitude_b", "longitude_b"]);
43
44
  const body = {
@@ -46,6 +46,7 @@ registerTool({
46
46
  required: ["datetime", "latitude", "longitude"],
47
47
  additionalProperties: false,
48
48
  },
49
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
49
50
  handler: async (args) => {
50
51
  validateRequired(args, ["datetime", "latitude", "longitude"]);
51
52
  const body = {
@@ -42,6 +42,7 @@ registerTool({
42
42
  ],
43
43
  additionalProperties: false,
44
44
  },
45
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
45
46
  handler: async (args) => {
46
47
  validateRequired(args, [
47
48
  "person_a_datetime", "person_a_latitude", "person_a_longitude",
@@ -86,6 +87,7 @@ registerTool({
86
87
  ],
87
88
  additionalProperties: false,
88
89
  },
90
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
89
91
  handler: async (args) => {
90
92
  validateRequired(args, [
91
93
  "person_a_datetime", "person_a_latitude", "person_a_longitude",
@@ -130,6 +132,7 @@ registerTool({
130
132
  ],
131
133
  additionalProperties: false,
132
134
  },
135
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
133
136
  handler: async (args) => {
134
137
  validateRequired(args, [
135
138
  "person_a_datetime", "person_a_latitude", "person_a_longitude",
@@ -171,6 +174,7 @@ registerTool({
171
174
  required: ["natal_datetime", "natal_latitude", "natal_longitude"],
172
175
  additionalProperties: false,
173
176
  },
177
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
174
178
  handler: async (args) => {
175
179
  validateRequired(args, ["natal_datetime", "natal_latitude", "natal_longitude"]);
176
180
  // Backend expects: { subject: {...}, transit_datetime?: {...} }
@@ -40,6 +40,7 @@ registerTool({
40
40
  required: ["eclipse_type"],
41
41
  additionalProperties: false,
42
42
  },
43
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
43
44
  handler: async (args) => {
44
45
  validateRequired(args, ["eclipse_type"]);
45
46
  validateCoordinates(args, "latitude", "longitude");
@@ -56,6 +56,7 @@ registerTool({
56
56
  required: ["start_date", "end_date", "latitude", "longitude"],
57
57
  additionalProperties: false,
58
58
  },
59
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
59
60
  handler: async (args) => {
60
61
  validateRequired(args, ["start_date", "end_date", "latitude", "longitude"]);
61
62
  const query = {
@@ -105,6 +106,7 @@ registerTool({
105
106
  required: [],
106
107
  additionalProperties: false,
107
108
  },
109
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
108
110
  handler: async (args) => {
109
111
  const query = {};
110
112
  if (args.date)
@@ -155,6 +157,7 @@ registerTool({
155
157
  required: [],
156
158
  additionalProperties: false,
157
159
  },
160
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
158
161
  handler: async (args) => {
159
162
  const query = {};
160
163
  // Map human-readable planet names to IDs if needed
@@ -213,6 +216,7 @@ registerTool({
213
216
  required: [],
214
217
  additionalProperties: false,
215
218
  },
219
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
216
220
  handler: async (args) => {
217
221
  const query = {};
218
222
  if (args.date)
@@ -34,6 +34,7 @@ registerTool({
34
34
  required: ["planet_id", "datetime"],
35
35
  additionalProperties: false,
36
36
  },
37
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
37
38
  handler: async (args) => {
38
39
  validateRequired(args, ["planet_id", "datetime"]);
39
40
  const body = {
@@ -80,6 +81,7 @@ registerTool({
80
81
  required: ["datetime", "latitude", "longitude"],
81
82
  additionalProperties: false,
82
83
  },
84
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
83
85
  handler: async (args) => {
84
86
  validateRequired(args, ["datetime", "latitude", "longitude"]);
85
87
  const body = {
@@ -42,6 +42,7 @@ registerTool({
42
42
  required: ["subjects"],
43
43
  additionalProperties: false,
44
44
  },
45
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
45
46
  handler: async (args) => {
46
47
  validateRequired(args, ["subjects"]);
47
48
  const items = args.subjects.map((s) => ({
@@ -64,6 +65,7 @@ registerTool({
64
65
  required: ["datetime"],
65
66
  additionalProperties: false,
66
67
  },
68
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
67
69
  handler: async (args) => {
68
70
  validateRequired(args, ["datetime"]);
69
71
  return await getActiveClient().post("/ephemeris/dignities", {
@@ -90,6 +92,7 @@ registerTool({
90
92
  required: ["datetime"],
91
93
  additionalProperties: false,
92
94
  },
95
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
93
96
  handler: async (args) => {
94
97
  validateRequired(args, ["datetime"]);
95
98
  const client = getActiveClient();
@@ -138,6 +141,7 @@ registerTool({
138
141
  required: ["datetime", "latitude", "longitude"],
139
142
  additionalProperties: false,
140
143
  },
144
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
141
145
  handler: async (args) => {
142
146
  validateRequired(args, ["datetime", "latitude", "longitude"]);
143
147
  return await getActiveClient().post("/ephemeris/midpoints", {
@@ -167,6 +171,7 @@ registerTool({
167
171
  required: ["datetime"],
168
172
  additionalProperties: false,
169
173
  },
174
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
170
175
  handler: async (args) => {
171
176
  validateRequired(args, ["datetime"]);
172
177
  const body = {
@@ -226,6 +231,7 @@ registerTool({
226
231
  required: ["datetime", "latitude", "longitude"],
227
232
  additionalProperties: false,
228
233
  },
234
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
229
235
  handler: async (args) => {
230
236
  validateRequired(args, ["datetime", "latitude", "longitude"]);
231
237
  return await getActiveClient().post("/ephemeris/hermetic-lots", {
@@ -251,6 +257,7 @@ registerTool({
251
257
  required: ["datetime", "latitude", "longitude"],
252
258
  additionalProperties: false,
253
259
  },
260
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
254
261
  handler: async (args) => {
255
262
  validateRequired(args, ["datetime", "latitude", "longitude"]);
256
263
  return await getActiveClient().post("/ephemeris/angles-points", {
@@ -278,6 +285,7 @@ registerTool({
278
285
  required: ["longitude_1", "longitude_2"],
279
286
  additionalProperties: false,
280
287
  },
288
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
281
289
  handler: async (args) => {
282
290
  validateRequired(args, ["longitude_1", "longitude_2"]);
283
291
  // Backend field names are longitude1 / longitude2 (no underscore)
@@ -39,6 +39,7 @@ registerTool({
39
39
  required: ["datetime"],
40
40
  additionalProperties: false,
41
41
  },
42
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
42
43
  handler: async (args) => {
43
44
  validateRequired(args, ["datetime"]);
44
45
  const body = {
@@ -49,6 +49,7 @@ registerTool({
49
49
  required: ["planet", "datetime", "return_year"],
50
50
  additionalProperties: false,
51
51
  },
52
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
52
53
  handler: async (args) => {
53
54
  validateRequired(args, ["planet", "datetime", "return_year"]);
54
55
  return await getActiveClient().request("POST", "/human-design/cycles/return", {
@@ -99,6 +100,7 @@ registerTool({
99
100
  required: ["planet", "datetime", "target_year"],
100
101
  additionalProperties: false,
101
102
  },
103
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
102
104
  handler: async (args) => {
103
105
  validateRequired(args, ["planet", "datetime", "target_year"]);
104
106
  return await getActiveClient().request("POST", "/human-design/cycles/opposition", {
@@ -28,6 +28,7 @@ registerTool({
28
28
  required: ["person_a_datetime", "person_b_datetime"],
29
29
  additionalProperties: false,
30
30
  },
31
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
31
32
  handler: async (args) => {
32
33
  validateRequired(args, ["person_a_datetime", "person_b_datetime"]);
33
34
  const body = {
@@ -87,6 +88,7 @@ registerTool({
87
88
  required: ["group_name", "members"],
88
89
  additionalProperties: false,
89
90
  },
91
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
90
92
  handler: async (args) => {
91
93
  validateRequired(args, ["group_name", "members"]);
92
94
  const members = args.members.map((m) => ({
@@ -64,6 +64,7 @@ registerTool({
64
64
  required: ["datetime"],
65
65
  additionalProperties: false,
66
66
  },
67
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
67
68
  handler: async (args) => {
68
69
  validateRequired(args, ["datetime"]);
69
70
  const body = {
@@ -33,6 +33,7 @@ registerTool({
33
33
  required: [],
34
34
  additionalProperties: false,
35
35
  },
36
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
36
37
  handler: async (args) => {
37
38
  validateCoordinates(args, "latitude", "longitude");
38
39
  const params = {};
@@ -90,6 +91,7 @@ registerTool({
90
91
  required: ["phase"],
91
92
  additionalProperties: false,
92
93
  },
94
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
93
95
  handler: async (args) => {
94
96
  // Map our clean enum to display names the calendar API returns
95
97
  const phaseNameMap = {
@@ -73,6 +73,7 @@ registerTool({
73
73
  required: ["datetime", "latitude", "longitude"],
74
74
  additionalProperties: false,
75
75
  },
76
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
76
77
  handler: async (args) => {
77
78
  validateRequired(args, ["datetime", "latitude", "longitude"]);
78
79
  const body = {
@@ -56,6 +56,7 @@ registerTool({
56
56
  required: ["birth_datetime", "birth_latitude", "birth_longitude", "target_datetime"],
57
57
  additionalProperties: false,
58
58
  },
59
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
59
60
  handler: async (args) => {
60
61
  validateRequired(args, ["birth_datetime", "birth_latitude", "birth_longitude", "target_datetime"]);
61
62
  const body = {
@@ -46,6 +46,7 @@ registerTool({
46
46
  required: ["natal_datetime", "natal_latitude", "natal_longitude", "relocation_latitude", "relocation_longitude"],
47
47
  additionalProperties: false,
48
48
  },
49
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
49
50
  handler: async (args) => {
50
51
  validateRequired(args, ["natal_datetime", "natal_latitude", "natal_longitude", "relocation_latitude", "relocation_longitude"]);
51
52
  const body = {
@@ -59,6 +59,7 @@ registerTool({
59
59
  required: ["birth_datetime"],
60
60
  additionalProperties: false,
61
61
  },
62
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
62
63
  handler: async (args) => {
63
64
  validateRequired(args, ["birth_datetime"]);
64
65
  // Default target to current year if not provided
@@ -126,6 +127,7 @@ registerTool({
126
127
  required: ["birth_datetime"],
127
128
  additionalProperties: false,
128
129
  },
130
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
129
131
  handler: async (args) => {
130
132
  validateRequired(args, ["birth_datetime"]);
131
133
  const targetDt = args.target_datetime ?? new Date().toISOString();
@@ -180,6 +182,7 @@ registerTool({
180
182
  required: ["body", "birth_datetime", "target_datetime"],
181
183
  additionalProperties: false,
182
184
  },
185
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
183
186
  handler: async (args) => {
184
187
  validateRequired(args, ["body", "birth_datetime", "target_datetime"]);
185
188
  const requestBody = {
@@ -50,6 +50,7 @@ registerTool({
50
50
  ],
51
51
  additionalProperties: false,
52
52
  },
53
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
53
54
  handler: async (args) => {
54
55
  validateRequired(args, [
55
56
  "person_a_datetime", "person_a_latitude", "person_a_longitude",
@@ -66,6 +66,7 @@ registerTool({
66
66
  required: ["natal_datetime", "natal_latitude", "natal_longitude", "start_date", "end_date"],
67
67
  additionalProperties: false,
68
68
  },
69
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
69
70
  handler: async (args) => {
70
71
  validateRequired(args, ["natal_datetime", "natal_latitude", "natal_longitude", "start_date", "end_date"]);
71
72
  // ── Step 1: Compute natal chart to extract real planetary longitudes ──
@@ -33,6 +33,7 @@ registerTool({
33
33
  required: ["datetime", "latitude", "longitude"],
34
34
  additionalProperties: false,
35
35
  },
36
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
36
37
  handler: async (args) => {
37
38
  validateRequired(args, ["datetime", "latitude", "longitude"]);
38
39
  validateCoordinates(args, "latitude", "longitude");
@@ -29,6 +29,7 @@ registerTool({
29
29
  required: ["datetime", "latitude", "longitude"],
30
30
  additionalProperties: false,
31
31
  },
32
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
32
33
  handler: async (args) => {
33
34
  validateRequired(args, ["datetime", "latitude", "longitude"]);
34
35
  const query = {};
@@ -58,6 +59,7 @@ registerTool({
58
59
  required: ["start_date", "end_date"],
59
60
  additionalProperties: false,
60
61
  },
62
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
61
63
  handler: async (args) => {
62
64
  validateRequired(args, ["start_date", "end_date"]);
63
65
  const query = {};
@@ -87,6 +89,7 @@ registerTool({
87
89
  required: ["date"],
88
90
  additionalProperties: false,
89
91
  },
92
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
90
93
  handler: async (args) => {
91
94
  validateRequired(args, ["date"]);
92
95
  const query = {};
@@ -117,6 +120,7 @@ registerTool({
117
120
  required: [],
118
121
  additionalProperties: false,
119
122
  },
123
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
120
124
  handler: async (args) => {
121
125
  const query = {};
122
126
  if (args.format)
@@ -143,6 +147,7 @@ registerTool({
143
147
  required: ["start_date", "end_date"],
144
148
  additionalProperties: false,
145
149
  },
150
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
146
151
  handler: async (args) => {
147
152
  validateRequired(args, ["start_date", "end_date"]);
148
153
  const query = {};
@@ -172,6 +177,7 @@ registerTool({
172
177
  required: ["start_date"],
173
178
  additionalProperties: false,
174
179
  },
180
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true },
175
181
  handler: async (args) => {
176
182
  validateRequired(args, ["start_date"]);
177
183
  const query = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openephemeris/mcp-server",
3
- "version": "3.13.5",
3
+ "version": "3.13.7",
4
4
  "description": "Model Context Protocol server for the Open Ephemeris astronomical computation API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",