stellarium-mcp 0.1.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 ADDED
@@ -0,0 +1,110 @@
1
+ # Stellarium MCP Server
2
+
3
+ An MCP (Model Context Protocol) server that lets AI agents control [Stellarium](https://stellarium.org/) — the open-source planetarium software — via its Remote Control HTTP API.
4
+
5
+ Built for astronomy workflows including telescope alignment, observation planning, and sky exploration. Especially useful in the southern hemisphere where Polaris is not available for polar alignment.
6
+
7
+ ## Prerequisites
8
+
9
+ - **Node.js** 18+ installed
10
+ - **Stellarium** installed with the **Remote Control** plugin enabled
11
+ - Open Stellarium → Press `F2` → Plugins → Remote Control
12
+ - Check "Load at startup"
13
+ - Click "configure" → Check "Server enabled" and "Enable automatically on startup"
14
+ - Default port: `8090`
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ cd stellarium-mcp
20
+ npm install
21
+ npm run build
22
+ ```
23
+
24
+ ## Usage with Claude Desktop
25
+
26
+ Add this to your Claude Desktop configuration file:
27
+
28
+ **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "stellarium": {
34
+ "command": "node",
35
+ "args": ["/FULL/PATH/TO/stellarium-mcp/build/index.js"],
36
+ "env": {
37
+ "STELLARIUM_HOST": "localhost",
38
+ "STELLARIUM_PORT": "8090"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ ## Usage with Claude Code
46
+
47
+ ```bash
48
+ claude mcp add stellarium node /FULL/PATH/TO/stellarium-mcp/build/index.js
49
+ ```
50
+
51
+ ## Environment Variables
52
+
53
+ | Variable | Default | Description |
54
+ |---|---|---|
55
+ | `STELLARIUM_HOST` | `localhost` | Stellarium Remote Control host |
56
+ | `STELLARIUM_PORT` | `8090` | Stellarium Remote Control port |
57
+ | `STELLARIUM_PASSWORD` | *(none)* | Password if authentication is enabled |
58
+
59
+ ## Available Tools
60
+
61
+ ### Core Tools
62
+
63
+ | Tool | Description |
64
+ |---|---|
65
+ | `get_status` | Get current observer location, time, view direction, and FOV |
66
+ | `search_object` | Search for celestial objects by name |
67
+ | `get_object_info` | Get detailed info (coordinates, magnitude, rise/set times) |
68
+ | `point_to_object` | Point the view/telescope to a named object |
69
+ | `get_current_view` | Get current viewing direction in multiple coordinate systems |
70
+ | `set_fov` | Set the field of view (zoom level) |
71
+
72
+ ### Alignment Helpers
73
+
74
+ | Tool | Description |
75
+ |---|---|
76
+ | `suggest_alignment_stars` | Suggest optimal stars for telescope multi-star alignment |
77
+ | `list_visible_objects` | List objects of a given type in the catalogue |
78
+ | `list_object_types` | List all available object type categories |
79
+
80
+ ### Time & Location
81
+
82
+ | Tool | Description |
83
+ |---|---|
84
+ | `set_time` | Set simulation time (Julian Day, UTC string, or time rate) |
85
+ | `set_time_to_now` | Reset simulation to current real-world time |
86
+
87
+ ### Advanced
88
+
89
+ | Tool | Description |
90
+ |---|---|
91
+ | `simbad_lookup` | Query the SIMBAD astronomical database |
92
+ | `run_script` | Execute Stellarium Script commands directly |
93
+ | `get_property` | Read a Stellarium internal property |
94
+ | `set_property` | Write a Stellarium internal property |
95
+ | `toggle_display_feature` | Toggle display features (grids, constellations, atmosphere, etc.) |
96
+
97
+ ## Example Conversations
98
+
99
+ **"What bright stars can I use to align my telescope tonight?"**
100
+ → Agent uses `get_status` to check location/time, then `suggest_alignment_stars` to find the best 3 stars.
101
+
102
+ **"Show me where the Southern Cross is"**
103
+ → Agent uses `search_object` for "Crux", then `point_to_object` to center the view.
104
+
105
+ **"What planets are visible right now?"**
106
+ → Agent uses `list_visible_objects` with type "Planet", then `get_object_info` on each to check altitude.
107
+
108
+ ## License
109
+
110
+ MIT
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stellarium MCP Server
4
+ *
5
+ * An MCP server that provides AI agents with tools to control
6
+ * the Stellarium planetarium software via its Remote Control HTTP API.
7
+ *
8
+ * Designed for astronomy workflows including telescope alignment,
9
+ * observation planning, and sky exploration — especially useful
10
+ * in the southern hemisphere where Polaris is not available.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
package/build/index.js ADDED
@@ -0,0 +1,466 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stellarium MCP Server
4
+ *
5
+ * An MCP server that provides AI agents with tools to control
6
+ * the Stellarium planetarium software via its Remote Control HTTP API.
7
+ *
8
+ * Designed for astronomy workflows including telescope alignment,
9
+ * observation planning, and sky exploration — especially useful
10
+ * in the southern hemisphere where Polaris is not available.
11
+ */
12
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
13
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
14
+ import { z } from "zod";
15
+ import { StellariumClient } from "./stellarium-client.js";
16
+ // ─── Configuration ───────────────────────────────────────────────────
17
+ const STELLARIUM_HOST = process.env.STELLARIUM_HOST ?? "localhost";
18
+ const STELLARIUM_PORT = parseInt(process.env.STELLARIUM_PORT ?? "8090", 10);
19
+ const STELLARIUM_PASSWORD = process.env.STELLARIUM_PASSWORD;
20
+ const client = new StellariumClient({
21
+ host: STELLARIUM_HOST,
22
+ port: STELLARIUM_PORT,
23
+ password: STELLARIUM_PASSWORD,
24
+ });
25
+ // ─── Server Setup ────────────────────────────────────────────────────
26
+ const server = new McpServer({
27
+ name: "stellarium-mcp",
28
+ version: "0.1.0",
29
+ });
30
+ // ─── Helper: format a tool response ─────────────────────────────────
31
+ function textResult(data) {
32
+ const text = typeof data === "string" ? data : JSON.stringify(data, null, 2);
33
+ return { content: [{ type: "text", text }] };
34
+ }
35
+ function errorResult(err) {
36
+ const message = err instanceof Error ? err.message : String(err);
37
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
38
+ }
39
+ // ═══════════════════════════════════════════════════════════════════════
40
+ // CORE TOOLS
41
+ // ═══════════════════════════════════════════════════════════════════════
42
+ // ─── 1. get_status ───────────────────────────────────────────────────
43
+ server.tool("get_status", "Get the current Stellarium status including observer location, simulation time, view direction, and field of view. Use this to understand the current state before performing other operations.", {}, async () => {
44
+ try {
45
+ const [status, view] = await Promise.all([client.getStatus(), client.getView()]);
46
+ return textResult({
47
+ location: status.location,
48
+ time: status.time,
49
+ view: {
50
+ fov_degrees: status.view.fov,
51
+ ...view,
52
+ },
53
+ selected_object: status.selectionInfo || "none",
54
+ });
55
+ }
56
+ catch (err) {
57
+ return errorResult(err);
58
+ }
59
+ });
60
+ // ─── 2. search_object ────────────────────────────────────────────────
61
+ server.tool("search_object", "Search for celestial objects by name. Returns a list of matching object names. Use this to find stars, planets, deep sky objects, constellations, etc.", {
62
+ query: z
63
+ .string()
64
+ .describe("The name or partial name to search for (e.g. 'Sirius', 'M42', 'Alpha Cen')"),
65
+ }, async ({ query }) => {
66
+ try {
67
+ const results = await client.findObject(query);
68
+ return textResult({
69
+ query,
70
+ matches: results,
71
+ count: results.length,
72
+ });
73
+ }
74
+ catch (err) {
75
+ return errorResult(err);
76
+ }
77
+ });
78
+ // ─── 3. get_object_info ──────────────────────────────────────────────
79
+ server.tool("get_object_info", "Get detailed information about a specific celestial object including coordinates (RA/Dec, Alt/Az), magnitude, type, rise/set times, and more. The object must be an exact name (use search_object first if needed).", {
80
+ name: z
81
+ .string()
82
+ .describe("The exact name of the object (e.g. 'Sirius', 'Jupiter', 'M42')"),
83
+ }, async ({ name }) => {
84
+ try {
85
+ const info = await client.getObjectInfo(name);
86
+ return textResult(info);
87
+ }
88
+ catch (err) {
89
+ return errorResult(err);
90
+ }
91
+ });
92
+ // ─── 4. point_to_object ─────────────────────────────────────────────
93
+ server.tool("point_to_object", "Point the Stellarium view (and connected telescope, if any) to a named celestial object. The view will center on the object.", {
94
+ name: z
95
+ .string()
96
+ .describe("The exact name of the object to point to (e.g. 'Canopus', 'Saturn')"),
97
+ }, async ({ name }) => {
98
+ try {
99
+ await client.focusObject(name);
100
+ // Give Stellarium a moment to slew, then get the object info
101
+ await new Promise((r) => setTimeout(r, 500));
102
+ const info = await client.getObjectInfo(name);
103
+ return textResult({
104
+ message: `Now pointing at ${name}`,
105
+ object_info: info,
106
+ });
107
+ }
108
+ catch (err) {
109
+ return errorResult(err);
110
+ }
111
+ });
112
+ // ─── 5. get_current_view ─────────────────────────────────────────────
113
+ server.tool("get_current_view", "Get the current viewing direction in multiple coordinate systems (J2000 equatorial, current epoch, and altitude/azimuth). Also returns the current field of view.", {}, async () => {
114
+ try {
115
+ const [status, view] = await Promise.all([client.getStatus(), client.getView()]);
116
+ return textResult({
117
+ fov_degrees: status.view.fov,
118
+ coordinates: view,
119
+ });
120
+ }
121
+ catch (err) {
122
+ return errorResult(err);
123
+ }
124
+ });
125
+ // ─── 6. set_fov ──────────────────────────────────────────────────────
126
+ server.tool("set_fov", "Set the field of view (zoom level) in degrees. Smaller values zoom in, larger values zoom out. Typical eyepiece view is 1-2 degrees, naked eye is about 60-120 degrees.", {
127
+ fov: z
128
+ .number()
129
+ .positive()
130
+ .describe("Field of view in degrees (e.g. 60 for wide view, 1 for telescopic view)"),
131
+ }, async ({ fov }) => {
132
+ try {
133
+ await client.setFov(fov);
134
+ return textResult({ message: `Field of view set to ${fov}°` });
135
+ }
136
+ catch (err) {
137
+ return errorResult(err);
138
+ }
139
+ });
140
+ // ═══════════════════════════════════════════════════════════════════════
141
+ // ALIGNMENT HELPER TOOLS
142
+ // ═══════════════════════════════════════════════════════════════════════
143
+ // ─── 7. suggest_alignment_stars ──────────────────────────────────────
144
+ server.tool("suggest_alignment_stars", `Suggest the best stars for telescope multi-star alignment based on the current observer location and time. Returns bright stars that are currently above the horizon, well-spaced in azimuth, and suitable for alignment. Especially useful in the southern hemisphere where Polaris is not available.`, {
145
+ count: z
146
+ .number()
147
+ .int()
148
+ .min(1)
149
+ .max(10)
150
+ .default(3)
151
+ .describe("Number of alignment stars to suggest (default: 3)"),
152
+ min_altitude: z
153
+ .number()
154
+ .default(15)
155
+ .describe("Minimum altitude above horizon in degrees (default: 15)"),
156
+ max_magnitude: z
157
+ .number()
158
+ .default(2.0)
159
+ .describe("Maximum (faintest) apparent magnitude to consider (default: 2.0, brighter stars only)"),
160
+ }, async ({ count, min_altitude, max_magnitude }) => {
161
+ try {
162
+ // Well-known bright stars used for alignment, covering all parts of the sky
163
+ const alignmentCandidates = [
164
+ "Sirius", "Canopus", "Rigil Kentaurus", "Arcturus", "Vega",
165
+ "Capella", "Rigel", "Procyon", "Achernar", "Betelgeuse",
166
+ "Hadar", "Acrux", "Altair", "Aldebaran", "Antares",
167
+ "Spica", "Pollux", "Fomalhaut", "Mimosa", "Deneb",
168
+ "Regulus", "Adhara", "Gacrux", "Shaula", "Bellatrix",
169
+ "Alnath", "Alnilam", "Alioth", "Dubhe", "Mirfak",
170
+ "Wezen", "Sargas", "Kaus Australis", "Avior", "Menkalinan",
171
+ "Atria", "Alhena", "Peacock", "Alsephina", "Mirzam",
172
+ "Alphard", "Polaris", "Hamal", "Algieba", "Diphda",
173
+ "Miaplacidus", "Ankaa", "Suhail", "Aspidiske", "Naos",
174
+ ];
175
+ // Query each candidate for current position
176
+ const starData = [];
177
+ for (const starName of alignmentCandidates) {
178
+ try {
179
+ const info = await client.getObjectInfo(starName);
180
+ if (!info || !info.found)
181
+ continue;
182
+ const alt = info.altitude;
183
+ const az = info.azimuth;
184
+ const mag = info.vmag;
185
+ if (alt === undefined || az === undefined || mag === undefined)
186
+ continue;
187
+ if (alt >= min_altitude && mag <= max_magnitude) {
188
+ starData.push({
189
+ name: starName,
190
+ altitude: Math.round(alt * 100) / 100,
191
+ azimuth: Math.round(((az + 360) % 360) * 100) / 100,
192
+ magnitude: Math.round(mag * 100) / 100,
193
+ });
194
+ }
195
+ }
196
+ catch {
197
+ // Star not found or error — skip
198
+ continue;
199
+ }
200
+ }
201
+ // Sort by magnitude (brightest first)
202
+ starData.sort((a, b) => a.magnitude - b.magnitude);
203
+ // Select well-spaced stars using a greedy algorithm
204
+ const selected = [];
205
+ const remaining = [...starData];
206
+ if (remaining.length > 0) {
207
+ // Start with the brightest star
208
+ selected.push(remaining.shift());
209
+ while (selected.length < count && remaining.length > 0) {
210
+ // Find the star that maximizes minimum angular separation from already selected stars
211
+ let bestIdx = 0;
212
+ let bestMinSep = -1;
213
+ for (let i = 0; i < remaining.length; i++) {
214
+ let minSep = Infinity;
215
+ for (const sel of selected) {
216
+ // Angular separation approximation using azimuth difference
217
+ const azDiff = Math.abs(remaining[i].azimuth - sel.azimuth);
218
+ const sep = Math.min(azDiff, 360 - azDiff);
219
+ minSep = Math.min(minSep, sep);
220
+ }
221
+ if (minSep > bestMinSep) {
222
+ bestMinSep = minSep;
223
+ bestIdx = i;
224
+ }
225
+ }
226
+ selected.push(remaining.splice(bestIdx, 1)[0]);
227
+ }
228
+ }
229
+ return textResult({
230
+ suggested_alignment_stars: selected.map((s, i) => ({
231
+ order: i + 1,
232
+ name: s.name,
233
+ altitude_deg: s.altitude,
234
+ azimuth_deg: s.azimuth,
235
+ magnitude: s.magnitude,
236
+ })),
237
+ total_visible_bright_stars: starData.length,
238
+ criteria: {
239
+ min_altitude_deg: min_altitude,
240
+ max_magnitude: max_magnitude,
241
+ requested_count: count,
242
+ },
243
+ tip: "Stars are selected to be well-spaced in azimuth for best alignment accuracy. Point to each star in order using point_to_object.",
244
+ });
245
+ }
246
+ catch (err) {
247
+ return errorResult(err);
248
+ }
249
+ });
250
+ // ─── 8. list_visible_objects ─────────────────────────────────────────
251
+ server.tool("list_visible_objects", "List objects of a given type that are currently catalogued in Stellarium. Note: this returns all objects of that type in the catalogue, not just those above the horizon. Use get_object_info to check individual object positions.", {
252
+ type: z
253
+ .string()
254
+ .describe("Object type key (e.g. 'Star', 'Planet', 'Nebula', 'Galaxy', 'Constellation'). Use list_object_types to see all available types."),
255
+ english: z
256
+ .boolean()
257
+ .default(true)
258
+ .describe("Return names in English (default: true)"),
259
+ }, async ({ type, english }) => {
260
+ try {
261
+ const objects = await client.listObjectsByType(type, { english });
262
+ return textResult({
263
+ type,
264
+ objects: objects.slice(0, 100), // Limit to prevent huge responses
265
+ total_count: objects.length,
266
+ note: objects.length > 100
267
+ ? "Showing first 100 results. Use search_object for specific targets."
268
+ : undefined,
269
+ });
270
+ }
271
+ catch (err) {
272
+ return errorResult(err);
273
+ }
274
+ });
275
+ // ─── 9. list_object_types ────────────────────────────────────────────
276
+ server.tool("list_object_types", "List all available celestial object type categories in Stellarium (e.g. Star, Planet, Nebula, Galaxy). Use these type keys with list_visible_objects.", {}, async () => {
277
+ try {
278
+ const types = await client.listObjectTypes();
279
+ return textResult(types);
280
+ }
281
+ catch (err) {
282
+ return errorResult(err);
283
+ }
284
+ });
285
+ // ═══════════════════════════════════════════════════════════════════════
286
+ // TIME & LOCATION TOOLS
287
+ // ═══════════════════════════════════════════════════════════════════════
288
+ // ─── 10. set_time ────────────────────────────────────────────────────
289
+ server.tool("set_time", "Set the simulation time in Stellarium. You can set an absolute time (as Julian Day or ISO UTC string) and/or change the time rate. Use time rate 0 to pause, 1 for real-time, or larger values for fast-forward.", {
290
+ jday: z
291
+ .number()
292
+ .optional()
293
+ .describe("Julian Day number to set the time to"),
294
+ utc: z
295
+ .string()
296
+ .optional()
297
+ .describe("ISO 8601 UTC time string (e.g. '2026-04-06T03:00:00Z')"),
298
+ timerate: z
299
+ .number()
300
+ .optional()
301
+ .describe("Time rate in seconds per second (0 = paused, 1 = real-time, 3600 = 1 hour/sec)"),
302
+ }, async ({ jday, utc, timerate }) => {
303
+ try {
304
+ await client.setTime({
305
+ time: jday,
306
+ utc: utc,
307
+ timerate: timerate,
308
+ });
309
+ // Get updated status
310
+ await new Promise((r) => setTimeout(r, 200));
311
+ const status = await client.getStatus();
312
+ return textResult({
313
+ message: "Time updated",
314
+ current_time: status.time,
315
+ });
316
+ }
317
+ catch (err) {
318
+ return errorResult(err);
319
+ }
320
+ });
321
+ // ─── 11. set_time_to_now ─────────────────────────────────────────────
322
+ server.tool("set_time_to_now", "Reset the simulation time to the current real-world time. Useful after fast-forwarding or rewinding.", {}, async () => {
323
+ try {
324
+ // Setting timerate to 1 and using the action to sync to now
325
+ await client.doAction("actionSet_TimeRate_0");
326
+ await new Promise((r) => setTimeout(r, 100));
327
+ await client.doAction("actionReturn_To_Current_Time");
328
+ await new Promise((r) => setTimeout(r, 200));
329
+ const status = await client.getStatus();
330
+ return textResult({
331
+ message: "Time reset to now",
332
+ current_time: status.time,
333
+ });
334
+ }
335
+ catch (err) {
336
+ return errorResult(err);
337
+ }
338
+ });
339
+ // ═══════════════════════════════════════════════════════════════════════
340
+ // ADVANCED TOOLS
341
+ // ═══════════════════════════════════════════════════════════════════════
342
+ // ─── 12. simbad_lookup ───────────────────────────────────────────────
343
+ server.tool("simbad_lookup", "Look up an object in the SIMBAD astronomical database. Returns professional astronomical data about the object.", {
344
+ name: z
345
+ .string()
346
+ .describe("Object name or designation to look up in SIMBAD"),
347
+ }, async ({ name }) => {
348
+ try {
349
+ const result = await client.simbadLookup(name);
350
+ return textResult(result);
351
+ }
352
+ catch (err) {
353
+ return errorResult(err);
354
+ }
355
+ });
356
+ // ─── 13. run_script ──────────────────────────────────────────────────
357
+ server.tool("run_script", "Execute a Stellarium script command directly. This gives low-level access to Stellarium's scripting engine for advanced operations. See Stellarium scripting documentation for available commands.", {
358
+ code: z
359
+ .string()
360
+ .describe("Stellarium Script code to execute (e.g. 'core.setObserverLocation(-19.73, -42.63, 300, 0, \"My Location\", \"Earth\")')"),
361
+ }, async ({ code }) => {
362
+ try {
363
+ const result = await client.directScript(code);
364
+ return textResult({
365
+ message: "Script executed",
366
+ result: result || "ok",
367
+ });
368
+ }
369
+ catch (err) {
370
+ return errorResult(err);
371
+ }
372
+ });
373
+ // ─── 14. get_property ────────────────────────────────────────────────
374
+ server.tool("get_property", "Get the value of a Stellarium internal property. Properties control many aspects of Stellarium's behavior and display.", {
375
+ id: z
376
+ .string()
377
+ .describe("Property ID (e.g. 'StelMovementMgr.currentFov', 'StelSkyDrawer.limitMagnitude')"),
378
+ }, async ({ id }) => {
379
+ try {
380
+ const result = await client.getProperty(id);
381
+ return textResult(result);
382
+ }
383
+ catch (err) {
384
+ return errorResult(err);
385
+ }
386
+ });
387
+ // ─── 15. set_property ────────────────────────────────────────────────
388
+ server.tool("set_property", "Set a Stellarium internal property value. Use with caution — this can change any aspect of Stellarium's behavior.", {
389
+ id: z
390
+ .string()
391
+ .describe("Property ID to set"),
392
+ value: z
393
+ .string()
394
+ .describe("New value for the property (as string)"),
395
+ }, async ({ id, value }) => {
396
+ try {
397
+ await client.setProperty(id, value);
398
+ return textResult({ message: `Property ${id} set to ${value}` });
399
+ }
400
+ catch (err) {
401
+ return errorResult(err);
402
+ }
403
+ });
404
+ // ─── 16. toggle_display_feature ──────────────────────────────────────
405
+ server.tool("toggle_display_feature", "Toggle Stellarium display features on/off. Common features: constellation_lines, constellation_labels, constellation_art, atmosphere, ground, cardinal_points, equatorial_grid, azimuthal_grid, stars, planets, nebulae, milky_way.", {
406
+ feature: z
407
+ .enum([
408
+ "constellation_lines",
409
+ "constellation_labels",
410
+ "constellation_art",
411
+ "atmosphere",
412
+ "ground",
413
+ "cardinal_points",
414
+ "equatorial_grid",
415
+ "azimuthal_grid",
416
+ "stars",
417
+ "planets",
418
+ "nebulae",
419
+ "milky_way",
420
+ ])
421
+ .describe("The display feature to toggle"),
422
+ }, async ({ feature }) => {
423
+ try {
424
+ const actionMap = {
425
+ constellation_lines: "actionShow_Constellation_Lines",
426
+ constellation_labels: "actionShow_Constellation_Labels",
427
+ constellation_art: "actionShow_Constellation_Art",
428
+ atmosphere: "actionShow_Atmosphere",
429
+ ground: "actionShow_Ground",
430
+ cardinal_points: "actionShow_Cardinal_Points",
431
+ equatorial_grid: "actionShow_Equatorial_Grid",
432
+ azimuthal_grid: "actionShow_Azimuthal_Grid",
433
+ stars: "actionShow_Stars",
434
+ planets: "actionShow_Planets",
435
+ nebulae: "actionShow_Nebulae",
436
+ milky_way: "actionShow_MilkyWay",
437
+ };
438
+ const actionId = actionMap[feature];
439
+ if (!actionId) {
440
+ return errorResult(`Unknown feature: ${feature}`);
441
+ }
442
+ const result = await client.doAction(actionId);
443
+ return textResult({
444
+ message: `Toggled ${feature}`,
445
+ result,
446
+ });
447
+ }
448
+ catch (err) {
449
+ return errorResult(err);
450
+ }
451
+ });
452
+ // ═══════════════════════════════════════════════════════════════════════
453
+ // START SERVER
454
+ // ═══════════════════════════════════════════════════════════════════════
455
+ async function main() {
456
+ const transport = new StdioServerTransport();
457
+ await server.connect(transport);
458
+ // Log to stderr (not stdout — stdout is reserved for MCP JSON-RPC)
459
+ console.error("Stellarium MCP server running on stdio");
460
+ console.error(`Connecting to Stellarium at ${STELLARIUM_HOST}:${STELLARIUM_PORT}`);
461
+ }
462
+ main().catch((err) => {
463
+ console.error("Fatal error:", err);
464
+ process.exit(1);
465
+ });
466
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Stellarium Remote Control HTTP Client
3
+ *
4
+ * Wraps the Stellarium Remote Control plugin API (default: http://localhost:8090).
5
+ * See: https://stellarium.org/doc/23.0/remoteControlApi.html
6
+ *
7
+ * Uses Node's http module instead of fetch because Stellarium's built-in HTTP
8
+ * server does not support chunked Transfer-Encoding, which Node's undici-based
9
+ * fetch sends for POST requests.
10
+ */
11
+ export interface StellariumClientOptions {
12
+ host?: string;
13
+ port?: number;
14
+ password?: string;
15
+ }
16
+ export interface StellariumStatus {
17
+ location: {
18
+ name: string;
19
+ latitude: number;
20
+ longitude: number;
21
+ altitude: number;
22
+ planet: string;
23
+ };
24
+ time: {
25
+ jDay: number;
26
+ utc: string;
27
+ local: string;
28
+ deltaT: number;
29
+ gmtShift: number;
30
+ timeRate: number;
31
+ isTimeNow: boolean;
32
+ };
33
+ view: {
34
+ fov: number;
35
+ j2000: [number, number, number];
36
+ jNow: [number, number, number];
37
+ altAz: [number, number, number];
38
+ };
39
+ selectionInfo: string;
40
+ actionChanges: Record<string, boolean>;
41
+ propertyChanges: Record<string, unknown>;
42
+ }
43
+ export interface ObjectInfo {
44
+ found: boolean;
45
+ name: string;
46
+ "localized-name": string;
47
+ type: string;
48
+ "star-type"?: string;
49
+ ra: number;
50
+ dec: number;
51
+ raJ2000: number;
52
+ decJ2000: number;
53
+ altitude: number;
54
+ azimuth: number;
55
+ vmag: number;
56
+ "absolute-mag"?: number;
57
+ "distance-ly"?: number;
58
+ rise?: string;
59
+ "rise-dhr"?: number;
60
+ transit?: string;
61
+ "transit-dhr"?: number;
62
+ set?: string;
63
+ "set-dhr"?: number;
64
+ "above-horizon": boolean;
65
+ iauConstellation: string;
66
+ "size-deg"?: string;
67
+ "spectral-class"?: string;
68
+ [key: string]: unknown;
69
+ }
70
+ export declare class StellariumClient {
71
+ private host;
72
+ private port;
73
+ private authHeader?;
74
+ constructor(options?: StellariumClientOptions);
75
+ private request;
76
+ private get;
77
+ private post;
78
+ /** Get the full Stellarium status (location, time, view direction, etc.) */
79
+ getStatus(): Promise<StellariumStatus>;
80
+ /** Get the current view direction */
81
+ getView(): Promise<{
82
+ j2000: number[];
83
+ jNow: number[];
84
+ altAz: number[];
85
+ }>;
86
+ /** Set the view direction using a coordinate vector */
87
+ setView(coords: [number, number, number], coordSystem?: "j2000" | "jNow" | "altAz"): Promise<string>;
88
+ /** Set the field of view in degrees */
89
+ setFov(fovDegrees: number): Promise<string>;
90
+ /** Focus on an object by name */
91
+ focusObject(objectName: string): Promise<string>;
92
+ /** Move the view (simulates arrow key presses) */
93
+ moveView(x: number, y: number): Promise<string>;
94
+ /** Convert a Date or ISO string to Julian Day number */
95
+ private utcToJulianDay;
96
+ /** Set the simulation time */
97
+ setTime(params: {
98
+ time?: number;
99
+ timerate?: number;
100
+ utc?: string;
101
+ }): Promise<string>;
102
+ /** Search for objects by name (returns a list of matching names) */
103
+ findObject(name: string): Promise<string[]>;
104
+ /** Get detailed information about a specific object */
105
+ getObjectInfo(name: string): Promise<ObjectInfo>;
106
+ /** List all available object types */
107
+ listObjectTypes(): Promise<Array<{
108
+ key: string;
109
+ name: string;
110
+ }>>;
111
+ /** List objects of a specific type */
112
+ listObjectsByType(type: string, options?: {
113
+ english?: boolean;
114
+ }): Promise<string[]>;
115
+ /** List available locations */
116
+ listLocations(): Promise<string[]>;
117
+ /** List countries */
118
+ listCountries(): Promise<string[]>;
119
+ /** Look up an object in the SIMBAD astronomical database */
120
+ simbadLookup(name: string): Promise<unknown>;
121
+ /** Trigger or toggle a Stellarium action by ID */
122
+ doAction(actionId: string): Promise<unknown>;
123
+ /** Get the value of a Stellarium property */
124
+ getProperty(propId: string): Promise<unknown>;
125
+ /** Set a Stellarium property value */
126
+ setProperty(propId: string, value: string): Promise<string>;
127
+ /** List available scripts */
128
+ listScripts(): Promise<unknown>;
129
+ /** Run a script by filename */
130
+ runScript(scriptId: string): Promise<string>;
131
+ /** Execute Stellarium Script code directly */
132
+ directScript(code: string): Promise<string>;
133
+ /** Get script execution status */
134
+ getScriptStatus(): Promise<unknown>;
135
+ /** Stop the currently running script */
136
+ stopScript(): Promise<string>;
137
+ /** Check if the Stellarium API is reachable */
138
+ ping(): Promise<boolean>;
139
+ }
140
+ //# sourceMappingURL=stellarium-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stellarium-client.d.ts","sourceRoot":"","sources":["../src/stellarium-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Stellarium Remote Control HTTP Client
3
+ *
4
+ * Wraps the Stellarium Remote Control plugin API (default: http://localhost:8090).
5
+ * See: https://stellarium.org/doc/23.0/remoteControlApi.html
6
+ *
7
+ * Uses Node's http module instead of fetch because Stellarium's built-in HTTP
8
+ * server does not support chunked Transfer-Encoding, which Node's undici-based
9
+ * fetch sends for POST requests.
10
+ */
11
+ import * as http from "node:http";
12
+ export class StellariumClient {
13
+ host;
14
+ port;
15
+ authHeader;
16
+ constructor(options = {}) {
17
+ this.host = options.host ?? "localhost";
18
+ this.port = options.port ?? 8090;
19
+ if (options.password) {
20
+ const encoded = Buffer.from(`:${options.password}`).toString("base64");
21
+ this.authHeader = `Basic ${encoded}`;
22
+ }
23
+ }
24
+ // ─── Low-level HTTP helpers ────────────────────────────────────────
25
+ request(method, path, body) {
26
+ return new Promise((resolve, reject) => {
27
+ const headers = {};
28
+ if (body !== undefined) {
29
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
30
+ headers["Content-Length"] = Buffer.byteLength(body).toString();
31
+ }
32
+ if (this.authHeader) {
33
+ headers["Authorization"] = this.authHeader;
34
+ }
35
+ const req = http.request({ hostname: this.host, port: this.port, path, method, headers }, (res) => {
36
+ let data = "";
37
+ res.on("data", (chunk) => (data += chunk));
38
+ res.on("end", () => resolve({ status: res.statusCode ?? 0, data }));
39
+ });
40
+ req.on("error", reject);
41
+ if (body !== undefined)
42
+ req.write(body);
43
+ req.end();
44
+ });
45
+ }
46
+ async get(path, params) {
47
+ const url = new URL(path, `http://${this.host}:${this.port}`);
48
+ if (params) {
49
+ for (const [k, v] of Object.entries(params)) {
50
+ url.searchParams.set(k, v);
51
+ }
52
+ }
53
+ const { status, data } = await this.request("GET", url.pathname + url.search);
54
+ if (status < 200 || status >= 300) {
55
+ throw new Error(`Stellarium API error ${status}: ${data}`);
56
+ }
57
+ try {
58
+ return JSON.parse(data);
59
+ }
60
+ catch {
61
+ return data;
62
+ }
63
+ }
64
+ async post(path, body) {
65
+ const encoded = body ? new URLSearchParams(body).toString() : undefined;
66
+ const { status, data } = await this.request("POST", path, encoded);
67
+ if (status < 200 || status >= 300) {
68
+ throw new Error(`Stellarium API error ${status}: ${data}`);
69
+ }
70
+ try {
71
+ return JSON.parse(data);
72
+ }
73
+ catch {
74
+ return data;
75
+ }
76
+ }
77
+ // ─── Main Service ──────────────────────────────────────────────────
78
+ /** Get the full Stellarium status (location, time, view direction, etc.) */
79
+ async getStatus() {
80
+ return (await this.get("/api/main/status"));
81
+ }
82
+ /** Get the current view direction */
83
+ async getView() {
84
+ return (await this.get("/api/main/view"));
85
+ }
86
+ /** Set the view direction using a coordinate vector */
87
+ async setView(coords, coordSystem = "j2000") {
88
+ return (await this.post("/api/main/view", {
89
+ [coordSystem]: JSON.stringify(coords),
90
+ }));
91
+ }
92
+ /** Set the field of view in degrees */
93
+ async setFov(fovDegrees) {
94
+ return (await this.post("/api/main/fov", {
95
+ fov: fovDegrees.toString(),
96
+ }));
97
+ }
98
+ /** Focus on an object by name */
99
+ async focusObject(objectName) {
100
+ return (await this.post("/api/main/focus", {
101
+ target: objectName,
102
+ }));
103
+ }
104
+ /** Move the view (simulates arrow key presses) */
105
+ async moveView(x, y) {
106
+ return (await this.post("/api/main/move", {
107
+ x: x.toString(),
108
+ y: y.toString(),
109
+ }));
110
+ }
111
+ /** Convert a Date or ISO string to Julian Day number */
112
+ utcToJulianDay(utc) {
113
+ const d = typeof utc === "string" ? new Date(utc) : utc;
114
+ return d.getTime() / 86400000 + 2440587.5;
115
+ }
116
+ /** Set the simulation time */
117
+ async setTime(params) {
118
+ const body = {};
119
+ if (params.utc !== undefined) {
120
+ body["time"] = this.utcToJulianDay(params.utc).toString();
121
+ }
122
+ else if (params.time !== undefined) {
123
+ body["time"] = params.time.toString();
124
+ }
125
+ if (params.timerate !== undefined)
126
+ body["timerate"] = params.timerate.toString();
127
+ return (await this.post("/api/main/time", body));
128
+ }
129
+ // ─── Object Service ────────────────────────────────────────────────
130
+ /** Search for objects by name (returns a list of matching names) */
131
+ async findObject(name) {
132
+ const result = await this.get("/api/objects/find", { str: name });
133
+ // The API returns a newline-separated list or JSON array
134
+ if (typeof result === "string") {
135
+ return result
136
+ .split("\n")
137
+ .map((s) => s.trim())
138
+ .filter(Boolean);
139
+ }
140
+ return result;
141
+ }
142
+ /** Get detailed information about a specific object */
143
+ async getObjectInfo(name) {
144
+ return (await this.get("/api/objects/info", { name, format: "json" }));
145
+ }
146
+ /** List all available object types */
147
+ async listObjectTypes() {
148
+ return (await this.get("/api/objects/listobjecttypes"));
149
+ }
150
+ /** List objects of a specific type */
151
+ async listObjectsByType(type, options) {
152
+ const params = { type };
153
+ if (options?.english)
154
+ params["english"] = "true";
155
+ const result = await this.get("/api/objects/listobjectsbytype", params);
156
+ if (typeof result === "string") {
157
+ return result
158
+ .split("\n")
159
+ .map((s) => s.trim())
160
+ .filter(Boolean);
161
+ }
162
+ return result;
163
+ }
164
+ // ─── Location Service ──────────────────────────────────────────────
165
+ /** List available locations */
166
+ async listLocations() {
167
+ const result = await this.get("/api/location/list");
168
+ if (typeof result === "string") {
169
+ return result
170
+ .split("\n")
171
+ .map((s) => s.trim())
172
+ .filter(Boolean);
173
+ }
174
+ return result;
175
+ }
176
+ /** List countries */
177
+ async listCountries() {
178
+ const result = await this.get("/api/location/countrylist");
179
+ if (typeof result === "string") {
180
+ return result
181
+ .split("\n")
182
+ .map((s) => s.trim())
183
+ .filter(Boolean);
184
+ }
185
+ return result;
186
+ }
187
+ // ─── SIMBAD Service ────────────────────────────────────────────────
188
+ /** Look up an object in the SIMBAD astronomical database */
189
+ async simbadLookup(name) {
190
+ return this.get("/api/simbad/lookup", { str: name });
191
+ }
192
+ // ─── StelAction Service ────────────────────────────────────────────
193
+ /** Trigger or toggle a Stellarium action by ID */
194
+ async doAction(actionId) {
195
+ return this.post("/api/stelaction/do", { id: actionId });
196
+ }
197
+ // ─── StelProperty Service ──────────────────────────────────────────
198
+ /** Get the value of a Stellarium property */
199
+ async getProperty(propId) {
200
+ const all = (await this.get("/api/stelproperty/list"));
201
+ if (propId in all) {
202
+ return { [propId]: all[propId] };
203
+ }
204
+ throw new Error(`Property not found: ${propId}`);
205
+ }
206
+ /** Set a Stellarium property value */
207
+ async setProperty(propId, value) {
208
+ return (await this.post("/api/stelproperty/set", {
209
+ id: propId,
210
+ value,
211
+ }));
212
+ }
213
+ // ─── Script Service ────────────────────────────────────────────────
214
+ /** List available scripts */
215
+ async listScripts() {
216
+ return this.get("/api/scripts/list");
217
+ }
218
+ /** Run a script by filename */
219
+ async runScript(scriptId) {
220
+ return (await this.post("/api/scripts/run", { id: scriptId }));
221
+ }
222
+ /** Execute Stellarium Script code directly */
223
+ async directScript(code) {
224
+ return (await this.post("/api/scripts/direct", { code }));
225
+ }
226
+ /** Get script execution status */
227
+ async getScriptStatus() {
228
+ return this.get("/api/scripts/status");
229
+ }
230
+ /** Stop the currently running script */
231
+ async stopScript() {
232
+ return (await this.post("/api/scripts/stop"));
233
+ }
234
+ // ─── Utility / Health ──────────────────────────────────────────────
235
+ /** Check if the Stellarium API is reachable */
236
+ async ping() {
237
+ try {
238
+ await this.getStatus();
239
+ return true;
240
+ }
241
+ catch {
242
+ return false;
243
+ }
244
+ }
245
+ }
246
+ //# sourceMappingURL=stellarium-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stellarium-client.js","sourceRoot":"","sources":["../src/stellarium-client.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "stellarium-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for controlling Stellarium planetarium software",
5
+ "type": "module",
6
+ "bin": {
7
+ "stellarium-mcp": "build/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc && chmod +x build/index.js",
11
+ "dev": "tsc --watch",
12
+ "start": "node build/index.js",
13
+ "test": "vitest run",
14
+ "test:watch": "vitest"
15
+ },
16
+ "files": [
17
+ "build"
18
+ ],
19
+ "dependencies": {
20
+ "@modelcontextprotocol/sdk": "^1.12.0",
21
+ "zod": "^3.25.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^22.0.0",
25
+ "typescript": "^5.7.0",
26
+ "vitest": "^4.1.2"
27
+ },
28
+ "keywords": [
29
+ "mcp",
30
+ "stellarium",
31
+ "astronomy",
32
+ "telescope",
33
+ "planetarium"
34
+ ],
35
+ "license": "MIT"
36
+ }