aqc-mcp 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +64 -25
  2. package/dist/index.js +3 -1
  3. package/dist/tools/aavso.js +120 -0
  4. package/dist/tools/esasky.js +23 -9
  5. package/dist/tools/fermi.js +69 -0
  6. package/dist/tools/heasarc.js +21 -16
  7. package/dist/tools/index.js +4 -0
  8. package/dist/tools/mast.js +3 -3
  9. package/dist/utils/http.js +32 -0
  10. package/package.json +13 -10
  11. package/dist/index.d.ts +0 -3
  12. package/dist/index.d.ts.map +0 -1
  13. package/dist/index.js.map +0 -1
  14. package/dist/tools/ads.d.ts +0 -2
  15. package/dist/tools/ads.d.ts.map +0 -1
  16. package/dist/tools/ads.js.map +0 -1
  17. package/dist/tools/alma.d.ts +0 -2
  18. package/dist/tools/alma.d.ts.map +0 -1
  19. package/dist/tools/alma.js.map +0 -1
  20. package/dist/tools/esasky.d.ts +0 -2
  21. package/dist/tools/esasky.d.ts.map +0 -1
  22. package/dist/tools/esasky.js.map +0 -1
  23. package/dist/tools/eso.d.ts +0 -2
  24. package/dist/tools/eso.d.ts.map +0 -1
  25. package/dist/tools/eso.js.map +0 -1
  26. package/dist/tools/exoplanet.d.ts +0 -2
  27. package/dist/tools/exoplanet.d.ts.map +0 -1
  28. package/dist/tools/exoplanet.js.map +0 -1
  29. package/dist/tools/gaia.d.ts +0 -2
  30. package/dist/tools/gaia.d.ts.map +0 -1
  31. package/dist/tools/gaia.js.map +0 -1
  32. package/dist/tools/heasarc.d.ts +0 -2
  33. package/dist/tools/heasarc.d.ts.map +0 -1
  34. package/dist/tools/heasarc.js.map +0 -1
  35. package/dist/tools/index.d.ts +0 -3
  36. package/dist/tools/index.d.ts.map +0 -1
  37. package/dist/tools/index.js.map +0 -1
  38. package/dist/tools/irsa.d.ts +0 -2
  39. package/dist/tools/irsa.d.ts.map +0 -1
  40. package/dist/tools/irsa.js.map +0 -1
  41. package/dist/tools/jpl.d.ts +0 -2
  42. package/dist/tools/jpl.d.ts.map +0 -1
  43. package/dist/tools/jpl.js.map +0 -1
  44. package/dist/tools/mast.d.ts +0 -2
  45. package/dist/tools/mast.d.ts.map +0 -1
  46. package/dist/tools/mast.js.map +0 -1
  47. package/dist/tools/ned.d.ts +0 -2
  48. package/dist/tools/ned.d.ts.map +0 -1
  49. package/dist/tools/ned.js.map +0 -1
  50. package/dist/tools/nist.d.ts +0 -2
  51. package/dist/tools/nist.d.ts.map +0 -1
  52. package/dist/tools/nist.js.map +0 -1
  53. package/dist/tools/sdss.d.ts +0 -2
  54. package/dist/tools/sdss.d.ts.map +0 -1
  55. package/dist/tools/sdss.js.map +0 -1
  56. package/dist/tools/simbad.d.ts +0 -2
  57. package/dist/tools/simbad.d.ts.map +0 -1
  58. package/dist/tools/simbad.js.map +0 -1
  59. package/dist/tools/splatalogue.d.ts +0 -2
  60. package/dist/tools/splatalogue.d.ts.map +0 -1
  61. package/dist/tools/splatalogue.js.map +0 -1
  62. package/dist/tools/vizier.d.ts +0 -2
  63. package/dist/tools/vizier.d.ts.map +0 -1
  64. package/dist/tools/vizier.js.map +0 -1
  65. package/dist/utils/http.d.ts +0 -34
  66. package/dist/utils/http.d.ts.map +0 -1
  67. package/dist/utils/http.js.map +0 -1
  68. package/src/index.ts +0 -45
  69. package/src/tools/ads.ts +0 -56
  70. package/src/tools/alma.ts +0 -39
  71. package/src/tools/esasky.ts +0 -49
  72. package/src/tools/eso.ts +0 -44
  73. package/src/tools/exoplanet.ts +0 -34
  74. package/src/tools/gaia.ts +0 -41
  75. package/src/tools/heasarc.ts +0 -45
  76. package/src/tools/index.ts +0 -36
  77. package/src/tools/irsa.ts +0 -42
  78. package/src/tools/jpl.ts +0 -129
  79. package/src/tools/mast.ts +0 -116
  80. package/src/tools/ned.ts +0 -64
  81. package/src/tools/nist.ts +0 -175
  82. package/src/tools/sdss.ts +0 -97
  83. package/src/tools/simbad.ts +0 -35
  84. package/src/tools/splatalogue.ts +0 -145
  85. package/src/tools/vizier.ts +0 -38
  86. package/src/utils/http.ts +0 -223
  87. package/tsconfig.json +0 -20
package/README.md CHANGED
@@ -6,7 +6,7 @@ A Model Context Protocol (MCP) server for astroquery-cli, providing HTTP and SSE
6
6
 
7
7
  ## Overview ✨
8
8
 
9
- The astroquery-mcp server exposes astroquery CLI functionality as MCP tools, allowing AI applications and other services to query astronomical databases through standardized MCP protocols. Supports both HTTP and SSE transports.
9
+ The aqc-mcp server provides direct HTTP/TAP API access to 17+ astronomical databases as MCP tools, allowing AI applications and other services to query astronomical data through standardized MCP protocols. Supports both HTTP and SSE transports.
10
10
 
11
11
  ---
12
12
 
@@ -17,24 +17,54 @@ The astroquery-mcp server exposes astroquery CLI functionality as MCP tools, all
17
17
  - HTTP (default)
18
18
  - SSE (Server-Sent Events)
19
19
  - Stdio (for Claude Desktop)
20
- - 🔌 **Extensible**: Easy to add new tools and modules
21
- - 🌍 **Language Support**: Multi-language output (English, Chinese, Japanese)
20
+ - 🔌 **17 Databases**: Direct TAP/REST API access to major astronomical archives
21
+ - 🌍 **Language Support**: Multi-language output (English, Chinese)
22
22
  - 📊 **Rich Output**: Formatted tables and structured results
23
23
  - 🔑 **ADS API Token Support**: Environment variable injection for authenticated queries
24
+ - ⚡ **No Python Required**: Pure Node.js/TypeScript implementation
24
25
 
25
26
  ---
26
27
 
27
28
  ## Supported Modules 🧩
28
29
 
29
- Currently implemented tools:
30
+ Currently implemented tools (17 astronomical databases):
30
31
 
32
+ ### General Astronomy
31
33
  - **SIMBAD**: Query SIMBAD astronomical database
32
34
  - **VizieR**: Query VizieR catalog database
33
- - **ALMA**: Query ALMA observations archive
35
+ - **NED**: NASA/IPAC Extragalactic Database
34
36
  - **ADS**: NASA Astrophysics Data System queries (requires API token)
35
- - **Gaia**: Gaia archive cone search
36
37
 
37
- > ⚠️ More modules (ESASky, IRSA, Heasarc, JPL, MAST, NED, NIST, Exoplanet, SDSS, ESO, Splatalogue) coming soon!
38
+ ### Radio & Millimeter
39
+ - **ALMA**: Query ALMA observations archive
40
+ - **ESO**: European Southern Observatory science archive
41
+
42
+ ### High Energy & X-ray
43
+ - **Fermi LAT**: Fermi Large Area Telescope gamma-ray source catalog
44
+ - **HEASARC**: High Energy Astrophysics Science Archive (multiple missions)
45
+
46
+ ### Infrared & Submillimeter
47
+ - **IRSA**: NASA/IPAC Infrared Science Archive
48
+
49
+ ### Space Observatories
50
+ - **MAST**: Barbara A. Mikulski Archive for Space Telescopes
51
+ - **ESASky**: Multi-mission all-sky archive
52
+
53
+ ### Solar System
54
+ - **JPL Horizons**: Solar system body ephemerides and state vectors
55
+ - **JPL SBDB**: Small-Body Database for asteroids and comets
56
+
57
+ ### Exoplanets & Stars
58
+ - **Exoplanet**: NASA Exoplanet Archive
59
+ - **AAVSO**: Variable Star Index (VSX catalog)
60
+ - **NIST**: Atomic Spectra Database for spectral lines
61
+
62
+ ### Optical Surveys
63
+ - **Gaia**: Gaia DR3 catalog cone search and ADQL queries
64
+ - **SDSS**: Sloan Digital Sky Survey (DR18)
65
+ - **Splatalogue**: Spectral line database
66
+
67
+ ### Total: 17 databases, 30+ tools
38
68
 
39
69
  ---
40
70
 
@@ -43,13 +73,9 @@ Currently implemented tools:
43
73
  ### Quick Start
44
74
 
45
75
  **Prerequisites:**
46
- - Python ≥ 3.11
47
76
  - Node.js ≥ 18.0.0
48
77
 
49
- **Install Python CLI:**
50
- ```bash
51
- pip install astroquery-cli
52
- ```
78
+ **No Python dependency required** - aqc-mcp uses direct HTTP/TAP APIs to astronomical services.
53
79
 
54
80
  ### MCP Server Configuration
55
81
 
@@ -355,18 +381,31 @@ npm run watch
355
381
  ### Project Structure
356
382
 
357
383
  ```
358
- astroquery-mcp/
384
+ aqc-mcp/
359
385
  ├── src/
360
386
  │ ├── index.ts # Main server entry
361
- │ ├── tools/ # MCP tool definitions
387
+ │ ├── tools/ # MCP tool definitions (17 databases)
362
388
  │ │ ├── index.ts # Tool registration
363
- │ │ ├── simbad.ts
364
- │ │ ├── vizier.ts
365
- │ │ ├── alma.ts
366
- │ │ ├── ads.ts
367
- │ │ └── gaia.ts
389
+ │ │ ├── simbad.ts # SIMBAD queries
390
+ │ │ ├── vizier.ts # VizieR catalog queries
391
+ │ │ ├── alma.ts # ALMA archive queries
392
+ │ │ ├── ads.ts # ADS bibliographic queries
393
+ │ │ ├── gaia.ts # Gaia DR3 queries
394
+ │ │ ├── aavso.ts # AAVSO VSX variable stars
395
+ │ │ ├── fermi.ts # Fermi LAT gamma-ray sources
396
+ │ │ ├── heasarc.ts # HEASARC queries
397
+ │ │ ├── esasky.ts # ESASky multi-mission archive
398
+ │ │ ├── eso.ts # ESO science archive
399
+ │ │ ├── exoplanet.ts # NASA Exoplanet Archive
400
+ │ │ ├── irsa.ts # IRSA infrared archive
401
+ │ │ ├── jpl.ts # JPL Horizons & SBDB
402
+ │ │ ├── mast.ts # MAST space telescopes
403
+ │ │ ├── ned.ts # NED extragalactic DB
404
+ │ │ ├── nist.ts # NIST atomic spectra
405
+ │ │ ├── sdss.ts # SDSS optical survey
406
+ │ │ └── splatalogue.ts # Spectral line database
368
407
  │ └── utils/
369
- │ └── executor.ts # CLI command executor
408
+ │ └── http.ts # HTTP/TAP client utilities
370
409
  ├── dist/ # Compiled JavaScript
371
410
  ├── package.json
372
411
  └── tsconfig.json
@@ -386,10 +425,6 @@ astroquery-mcp/
386
425
 
387
426
  ## Troubleshooting 🔍
388
427
 
389
- ### "aqc: command not found"
390
-
391
- Make sure you're running the MCP server from within the `astroquery-mcp` directory, and that the parent `astroquery-cli` project has been installed via poetry.
392
-
393
428
  ### ADS queries fail
394
429
 
395
430
  Set the `ADS_API_KEY` environment variable:
@@ -407,6 +442,10 @@ Change the port:
407
442
  PORT=8080 npm start
408
443
  ```
409
444
 
445
+ ### Query timeouts
446
+
447
+ Some astronomical databases (e.g., Fermi LAT, HEASARC) may take longer to respond. The server uses reasonable timeout values, but you can adjust them if needed by modifying the `timeout` parameter in the HTTP client.
448
+
410
449
  ---
411
450
 
412
451
  ## License 📄
@@ -423,6 +462,6 @@ Contributions welcome! Please open an issue or PR.
423
462
 
424
463
  ## Links 🔗
425
464
 
426
- - [astroquery-cli](../README.md)
465
+ - [GitHub Repository](https://github.com/inoribea/aqc-mcp)
427
466
  - [MCP Specification](https://modelcontextprotocol.io/)
428
467
  - [NASA ADS API](https://ui.adsabs.harvard.edu/)
package/dist/index.js CHANGED
@@ -3,7 +3,9 @@ import { startSseAndStreamableHttpMcpServer } from 'mcp-http-server';
3
3
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
4
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
5
  import { registerAllTools } from './tools/index.js';
6
- const VERSION = '2.0.0';
6
+ import { createRequire } from 'module';
7
+ const require = createRequire(import.meta.url);
8
+ const VERSION = require('../package.json').version;
7
9
  function createMcpServer() {
8
10
  const server = new McpServer({ name: 'astroquery-mcp', version: VERSION }, { capabilities: { tools: {} } });
9
11
  registerAllTools(server);
@@ -0,0 +1,120 @@
1
+ import { z } from 'zod';
2
+ const AAVSO_VSX_BASE = 'https://www.aavso.org/vsx/index.php';
3
+ function parseVOTable(xmlText) {
4
+ const columns = [];
5
+ const rows = [];
6
+ const fieldRegex = /<FIELD\s+name="([^"]+)"/g;
7
+ let match;
8
+ while ((match = fieldRegex.exec(xmlText)) !== null) {
9
+ columns.push(match[1]);
10
+ }
11
+ const trRegex = /<TR>([\s\S]*?)<\/TR>/g;
12
+ let trMatch;
13
+ while ((trMatch = trRegex.exec(xmlText)) !== null) {
14
+ const tdRegex = /<TD>([\s\S]*?)<\/TD>/g;
15
+ const values = [];
16
+ let tdMatch;
17
+ while ((tdMatch = tdRegex.exec(trMatch[1])) !== null) {
18
+ values.push(tdMatch[1].trim());
19
+ }
20
+ const row = {};
21
+ columns.forEach((col, i) => {
22
+ row[col] = values[i] || null;
23
+ });
24
+ rows.push(row);
25
+ }
26
+ return { columns, rows };
27
+ }
28
+ function formatAavsoResult(data, title) {
29
+ const lines = [];
30
+ if (title)
31
+ lines.push(`## ${title}\n`);
32
+ if (data.rows.length === 0) {
33
+ lines.push('No results found.');
34
+ return lines.join('\n');
35
+ }
36
+ lines.push(`Found ${data.rows.length} result(s).\n`);
37
+ data.rows.forEach((row, idx) => {
38
+ if (data.rows.length > 1)
39
+ lines.push(`--- Result ${idx + 1} ---`);
40
+ for (const [key, value] of Object.entries(row)) {
41
+ if (value !== null && value !== undefined && value !== '' && value !== '\n') {
42
+ const cleanValue = String(value).replace(/<[^>]+>/g, '').trim();
43
+ if (cleanValue) {
44
+ lines.push(` ${key}: ${cleanValue}`);
45
+ }
46
+ }
47
+ }
48
+ lines.push('');
49
+ });
50
+ return lines.join('\n');
51
+ }
52
+ export function registerAavsoTools(server) {
53
+ server.tool('aavso_query_star', 'Query AAVSO VSX (Variable Star Index) for a specific variable star by name', {
54
+ star_name: z.string().describe('Variable star name or identifier (e.g., "Mira", "Delta Cephei", "SX Uma")'),
55
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
56
+ }, async ({ star_name, lang }) => {
57
+ const url = `${AAVSO_VSX_BASE}?view=query.votable&ident=${encodeURIComponent(star_name)}`;
58
+ try {
59
+ const text = await (await fetch(url)).text();
60
+ const result = parseVOTable(text);
61
+ const title = lang === 'zh'
62
+ ? `AAVSO 变星查询: ${star_name}`
63
+ : `AAVSO Variable Star Query: ${star_name}`;
64
+ const output = formatAavsoResult(result, title);
65
+ return { content: [{ type: 'text', text: output }] };
66
+ }
67
+ catch (error) {
68
+ const errorMsg = lang === 'zh'
69
+ ? `查询失败: ${error instanceof Error ? error.message : String(error)}`
70
+ : `Query failed: ${error instanceof Error ? error.message : String(error)}`;
71
+ return { content: [{ type: 'text', text: errorMsg }] };
72
+ }
73
+ });
74
+ server.tool('aavso_query_region', 'Query AAVSO VSX for variable stars in a circular region around coordinates', {
75
+ ra: z.number().describe('Right Ascension in degrees (0-360)'),
76
+ dec: z.number().describe('Declination in degrees (-90 to 90)'),
77
+ radius: z.number().default(10).describe('Search radius in arcminutes'),
78
+ max_magnitude: z.number().optional().describe('Maximum magnitude filter (brighter than)'),
79
+ format: z.enum(['votable', 'json', 'xml']).default('votable').describe('Response format'),
80
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
81
+ }, async ({ ra, dec, radius, max_magnitude, format, lang, }) => {
82
+ const params = new URLSearchParams({
83
+ view: 'api.list',
84
+ ra: String(ra),
85
+ dec: String(dec >= 0 ? `+${dec}` : dec),
86
+ radius: String(radius / 60),
87
+ format,
88
+ });
89
+ if (max_magnitude !== undefined) {
90
+ params.set('tomag', String(max_magnitude));
91
+ }
92
+ const url = `${AAVSO_VSX_BASE}?${params.toString()}`;
93
+ try {
94
+ const text = await (await fetch(url)).text();
95
+ let result;
96
+ if (format === 'json') {
97
+ const json = JSON.parse(text);
98
+ result = {
99
+ columns: json.columns || [],
100
+ rows: json.data || [],
101
+ };
102
+ }
103
+ else {
104
+ result = parseVOTable(text);
105
+ }
106
+ const title = lang === 'zh'
107
+ ? `AAVSO 区域查询: (${ra}, ${dec})`
108
+ : `AAVSO Regional Query: (${ra}, ${dec})`;
109
+ const output = formatAavsoResult(result, title);
110
+ return { content: [{ type: 'text', text: output }] };
111
+ }
112
+ catch (error) {
113
+ const errorMsg = lang === 'zh'
114
+ ? `查询失败: ${error instanceof Error ? error.message : String(error)}`
115
+ : `Query failed: ${error instanceof Error ? error.message : String(error)}`;
116
+ return { content: [{ type: 'text', text: errorMsg }] };
117
+ }
118
+ });
119
+ }
120
+ //# sourceMappingURL=aavso.js.map
@@ -1,24 +1,38 @@
1
1
  import { z } from 'zod';
2
2
  import { tapQuery, formatTapResult } from '../utils/http.js';
3
3
  const ESASKY_TAP = 'https://sky.esa.int/esasky-tap/tap/sync';
4
+ const MISSION_TABLES = {
5
+ 'xmm': 'observations.mv_v_v_xsa_esasky_photo_fdw_fdw',
6
+ 'hst': 'observations.mv_v_v_hst_mmi_observation_fdw_fdw',
7
+ 'alma': 'observations.mv_v_v_alma_obs_fdw',
8
+ 'jwst': 'observations.mv_v_jwst_obs_fdw',
9
+ 'chandra': 'observations.mv_chandra_obs_photo_fdw',
10
+ 'herschel': 'observations.mv_v_v_hsa_esasky_photo_fdw_fdw',
11
+ 'spitzer': 'observations.mv_spitzer_irac_fdw',
12
+ 'suzaku': 'observations.mv_suzaku_data_fdw',
13
+ 'cheops': 'observations.mv_cheops_obs_fdw',
14
+ 'xmm-om': 'observations.mv_v_esasky_xmm_om_uv_fdw',
15
+ 'iso': 'observations.mv_iso_spectra_fdw',
16
+ 'iue': 'observations.mv_iue_spectra_fdw',
17
+ 'akari': 'observations.mv_akari_irc_fdw',
18
+ };
19
+ const SUPPORTED_MISSIONS = Object.keys(MISSION_TABLES).join(', ');
4
20
  export function registerEsaskyTools(server) {
5
21
  server.tool('esasky_query', 'Query ESASky archive for astronomical observations by position and radius', {
6
22
  ra: z.number().describe('Right Ascension in degrees (0-360)'),
7
23
  dec: z.number().describe('Declination in degrees (-90 to 90)'),
8
24
  radius: z.number().default(10).describe('Search radius in arcminutes'),
9
- mission: z.string().default('all').describe('Mission name (e.g. "XMM", "HST", "Herschel", "all")'),
25
+ mission: z.string().default('xmm').describe(`Mission name: ${SUPPORTED_MISSIONS}, or "all" for XMM default`),
10
26
  max_results: z.number().default(50).describe('Maximum number of results'),
11
27
  lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
12
28
  }, async ({ ra, dec, radius, mission, max_results, lang }) => {
29
+ const missionKey = mission.toLowerCase();
30
+ const tableName = MISSION_TABLES[missionKey] ?? MISSION_TABLES['xmm'];
13
31
  const radiusDeg = radius / 60;
14
- let tableName = 'ivoa.obscore';
15
- let missionFilter = '';
16
- if (mission !== 'all') {
17
- missionFilter = ` AND obs_collection = '${mission.replace(/'/g, "''")}'`;
18
- }
19
- const adql = `SELECT TOP ${max_results} obs_id, obs_collection, target_name, s_ra, s_dec, instrument_name, t_exptime, access_url FROM ${tableName} WHERE CONTAINS(POINT('ICRS', s_ra, s_dec), CIRCLE('ICRS', ${ra}, ${dec}, ${radiusDeg})) = 1${missionFilter}`;
20
- const result = await tapQuery({ endpoint: ESASKY_TAP, adql, maxrec: max_results });
21
- const title = lang === 'zh' ? `ESASky 查询结果: (${ra}, ${dec})` : `ESASky Query Result: (${ra}, ${dec})`;
32
+ const adql = `SELECT TOP ${max_results} observation_id, ra_deg, dec_deg, target_name, start_time, end_time FROM ${tableName} WHERE CONTAINS(POINT('ICRS', ra_deg, dec_deg), CIRCLE('ICRS', ${ra}, ${dec}, ${radiusDeg})) = 1`;
33
+ const result = await tapQuery({ endpoint: ESASKY_TAP, adql, format: 'csv', maxrec: max_results });
34
+ const resolvedMission = MISSION_TABLES[missionKey] ? missionKey.toUpperCase() : 'XMM';
35
+ const title = lang === 'zh' ? `ESASky 查询结果: (${ra}, ${dec}) [${resolvedMission}]` : `ESASky Query Result: (${ra}, ${dec}) [${resolvedMission}]`;
22
36
  return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
23
37
  });
24
38
  }
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ import { tapQuery, formatTapResult } from '../utils/http.js';
3
+ const FERMI_TAP = 'https://fermi.gsfc.nasa.gov/ssc/data/access/lat/tap/sync';
4
+ export function registerFermiTools(server) {
5
+ server.tool('fermi_lat_catalog_query', 'Query Fermi LAT point source catalog (4FGL-DR4, the latest 14-year catalog)', {
6
+ target: z.string().optional().describe('Target name (e.g., "Crab Nebula", "3C 273")'),
7
+ ra: z.number().optional().describe('Right Ascension in degrees (0-360)'),
8
+ dec: z.number().optional().describe('Declination in degrees (-90 to 90)'),
9
+ radius: z.number().default(5).describe('Search radius in degrees'),
10
+ min_energy: z.number().optional().describe('Minimum energy in MeV (e.g., 100)'),
11
+ max_energy: z.number().optional().describe('Maximum energy in MeV (e.g., 100000)'),
12
+ max_results: z.number().default(50).describe('Maximum number of results'),
13
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
14
+ }, async ({ target, ra, dec, radius, min_energy, max_energy, max_results, lang, }) => {
15
+ if (!target && (ra === undefined || dec === undefined)) {
16
+ const msg = lang === 'zh' ? '请提供目标名称或坐标 (ra + dec)' : 'Please provide a target name or coordinates (ra + dec)';
17
+ return { content: [{ type: 'text', text: msg }] };
18
+ }
19
+ let where;
20
+ if (ra !== undefined && dec !== undefined) {
21
+ where = `CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', ${ra}, ${dec}, ${radius})) = 1`;
22
+ }
23
+ else {
24
+ where = `source_name = '${target.replace(/'/g, "''")}'`;
25
+ }
26
+ let adql = `SELECT TOP ${max_results} source_name, ra, dec, glon, glat, flux_100mev, flux_1000mev, flux_10000mev, flux_100000mev, spectral_index, variability FROM fermilat.4fgl_dr4 WHERE ${where}`;
27
+ if (min_energy !== undefined || max_energy !== undefined) {
28
+ const energyFilter = [];
29
+ if (min_energy !== undefined)
30
+ energyFilter.push(`energy_gev >= ${min_energy / 1000}`);
31
+ if (max_energy !== undefined)
32
+ energyFilter.push(`energy_gev <= ${max_energy / 1000}`);
33
+ if (energyFilter.length > 0) {
34
+ adql = adql.replace(`WHERE ${where}`, `WHERE ${where} AND ${energyFilter.join(' AND ')}`);
35
+ }
36
+ }
37
+ try {
38
+ const result = await tapQuery({ endpoint: FERMI_TAP, adql, maxrec: max_results, timeout: 120000 });
39
+ const title = lang === 'zh'
40
+ ? `Fermi LAT 目录查询: ${target ?? `(${ra}, ${dec})`}`
41
+ : `Fermi LAT Catalog Query: ${target ?? `(${ra}, ${dec})`}`;
42
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
43
+ }
44
+ catch (error) {
45
+ const errorMsg = lang === 'zh'
46
+ ? `查询失败: ${error instanceof Error ? error.message : String(error)}\n\n注意:Fermi LAT TAP 服务可能需要更长时间或暂时不可用。`
47
+ : `Query failed: ${error instanceof Error ? error.message : String(error)}\n\nNote: Fermi LAT TAP service may take longer or be temporarily unavailable.`;
48
+ return { content: [{ type: 'text', text: errorMsg }] };
49
+ }
50
+ });
51
+ server.tool('fermi_lat_adql', 'Execute a raw ADQL query on the Fermi LAT archive (TAP service)', {
52
+ adql: z.string().describe('ADQL query string'),
53
+ max_results: z.number().default(100).describe('Maximum number of results'),
54
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
55
+ }, async ({ adql, max_results, lang }) => {
56
+ try {
57
+ const result = await tapQuery({ endpoint: FERMI_TAP, adql, maxrec: max_results, timeout: 120000 });
58
+ const title = lang === 'zh' ? 'Fermi LAT ADQL 查询结果' : 'Fermi LAT ADQL Query Result';
59
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
60
+ }
61
+ catch (error) {
62
+ const errorMsg = lang === 'zh'
63
+ ? `查询失败: ${error instanceof Error ? error.message : String(error)}`
64
+ : `Query failed: ${error instanceof Error ? error.message : String(error)}`;
65
+ return { content: [{ type: 'text', text: errorMsg }] };
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=fermi.js.map
@@ -1,6 +1,20 @@
1
1
  import { z } from 'zod';
2
2
  import { tapQuery, formatTapResult } from '../utils/http.js';
3
3
  const HEASARC_TAP = 'https://heasarc.gsfc.nasa.gov/xamin/vo/tap/sync';
4
+ const SIMBAD_TAP = 'https://simbad.cds.unistra.fr/simbad/sim-tap/sync';
5
+ /**
6
+ * Resolve an object name to RA/Dec via SIMBAD TAP (supports JSON).
7
+ */
8
+ async function resolveCoords(name) {
9
+ const safeName = name.replace(/'/g, "''");
10
+ const adql = `SELECT ra, dec FROM basic JOIN ident ON oidref = oid WHERE id = '${safeName}'`;
11
+ const result = await tapQuery({ endpoint: SIMBAD_TAP, adql, format: 'json' });
12
+ if (result.rows.length === 0) {
13
+ throw new Error(`Could not resolve object name: ${name}`);
14
+ }
15
+ const row = result.rows[0];
16
+ return { ra: Number(row.ra), dec: Number(row.dec) };
17
+ }
4
18
  export function registerHeasarcTools(server) {
5
19
  server.tool('heasarc_query', 'Query HEASARC (High Energy Astrophysics Science Archive) by object name and mission catalog', {
6
20
  object_name: z.string().describe('Object name (e.g. "Crab Nebula", "Cyg X-1")'),
@@ -9,23 +23,14 @@ export function registerHeasarcTools(server) {
9
23
  max_results: z.number().default(50).describe('Maximum number of results'),
10
24
  lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
11
25
  }, async ({ object_name, mission, radius, max_results, lang }) => {
12
- // HEASARC TAP uses name resolver internally via a special function
13
- // We query the mission table with a cone search around resolved coordinates
14
- // First try a simple name-based query
26
+ // Step 1: Resolve object name to coordinates via SIMBAD
27
+ const coords = await resolveCoords(object_name);
28
+ // Step 2: Cone search on HEASARC with FORMAT=text (only format that works)
15
29
  const radiusDeg = radius / 60;
16
- const adql = `SELECT TOP ${max_results} * FROM ${mission} WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', COORD1(SIMBAD('${object_name.replace(/'/g, "''")}')), COORD2(SIMBAD('${object_name.replace(/'/g, "''")}')), ${radiusDeg})) = 1`;
17
- try {
18
- const result = await tapQuery({ endpoint: HEASARC_TAP, adql, maxrec: max_results });
19
- const title = lang === 'zh' ? `HEASARC 查询结果: ${object_name} (${mission})` : `HEASARC Query Result: ${object_name} (${mission})`;
20
- return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
21
- }
22
- catch {
23
- // Fallback: some HEASARC tables use name column directly
24
- const fallbackAdql = `SELECT TOP ${max_results} * FROM ${mission} WHERE name LIKE '%${object_name.replace(/'/g, "''").replace(/%/g, '')}%'`;
25
- const result = await tapQuery({ endpoint: HEASARC_TAP, adql: fallbackAdql, maxrec: max_results });
26
- const title = lang === 'zh' ? `HEASARC 查询结果: ${object_name} (${mission})` : `HEASARC Query Result: ${object_name} (${mission})`;
27
- return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
28
- }
30
+ const adql = `SELECT TOP ${max_results} * FROM ${mission} WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', ${coords.ra}, ${coords.dec}, ${radiusDeg})) = 1`;
31
+ const result = await tapQuery({ endpoint: HEASARC_TAP, adql, format: 'text', maxrec: max_results });
32
+ const title = lang === 'zh' ? `HEASARC 查询结果: ${object_name} (${mission})` : `HEASARC Query Result: ${object_name} (${mission})`;
33
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
29
34
  });
30
35
  }
31
36
  //# sourceMappingURL=heasarc.js.map
@@ -3,6 +3,8 @@ import { registerVizierTools } from './vizier.js';
3
3
  import { registerAlmaTools } from './alma.js';
4
4
  import { registerGaiaTools } from './gaia.js';
5
5
  import { registerAdsTools } from './ads.js';
6
+ import { registerAavsoTools } from './aavso.js';
7
+ import { registerFermiTools } from './fermi.js';
6
8
  import { registerEsaskyTools } from './esasky.js';
7
9
  import { registerEsoTools } from './eso.js';
8
10
  import { registerExoplanetTools } from './exoplanet.js';
@@ -20,6 +22,8 @@ export function registerAllTools(server) {
20
22
  registerAlmaTools(server);
21
23
  registerGaiaTools(server);
22
24
  registerAdsTools(server);
25
+ registerAavsoTools(server);
26
+ registerFermiTools(server);
23
27
  registerEsaskyTools(server);
24
28
  registerEsoTools(server);
25
29
  registerExoplanetTools(server);
@@ -1,14 +1,14 @@
1
1
  import { z } from 'zod';
2
2
  const MAST_API = 'https://mast.stsci.edu/api/v0/invoke';
3
3
  async function mastQuery(service, params, timeout = 60000) {
4
- const body = JSON.stringify({ service, params, format: 'json', timeout: Math.floor(timeout / 1000) });
4
+ const requestPayload = JSON.stringify({ service, params, format: 'json', timeout: Math.floor(timeout / 1000) });
5
5
  const controller = new AbortController();
6
6
  const timer = setTimeout(() => controller.abort(), timeout);
7
7
  try {
8
8
  const response = await fetch(MAST_API, {
9
9
  method: 'POST',
10
- headers: { 'Content-Type': 'application/json' },
11
- body,
10
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
11
+ body: `request=${encodeURIComponent(requestPayload)}`,
12
12
  signal: controller.signal,
13
13
  });
14
14
  if (!response.ok) {
@@ -48,9 +48,41 @@ function parseTapResponse(text, format) {
48
48
  if (format === 'csv') {
49
49
  return parseCsvResponse(text);
50
50
  }
51
+ if (format === 'text') {
52
+ return parseTextResponse(text);
53
+ }
51
54
  // votable — return raw text as single-row result
52
55
  return { columns: ['votable'], rows: [{ votable: text }] };
53
56
  }
57
+ /**
58
+ * Parse pipe-delimited text response from HEASARC TAP.
59
+ * Format: header row with | separators, data rows, footer with 'Number of rows/columns'.
60
+ */
61
+ function parseTextResponse(text) {
62
+ const lines = text.split('\n').filter(line => {
63
+ const trimmed = line.trim();
64
+ return trimmed.length > 0 && !trimmed.startsWith('Number of');
65
+ });
66
+ if (lines.length === 0) {
67
+ return { columns: [], rows: [] };
68
+ }
69
+ const headers = lines[0].split('|').map(h => h.trim()).filter(h => h.length > 0);
70
+ const rows = [];
71
+ for (let i = 1; i < lines.length; i++) {
72
+ const values = lines[i].split('|').map(v => v.trim());
73
+ // Skip separator lines (e.g. '---+---+---')
74
+ if (values.every(v => /^[-+]+$/.test(v) || v.length === 0))
75
+ continue;
76
+ const obj = {};
77
+ for (let j = 0; j < headers.length; j++) {
78
+ const val = values[j + (values.length > headers.length ? 1 : 0)] ?? '';
79
+ const num = Number(val);
80
+ obj[headers[j]] = val.length > 0 && !isNaN(num) && val !== '' ? num : val;
81
+ }
82
+ rows.push(obj);
83
+ }
84
+ return { columns: headers, rows };
85
+ }
54
86
  function parseJsonResponse(text) {
55
87
  const data = JSON.parse(text);
56
88
  // Standard TAP JSON response format (used by most TAP services)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aqc-mcp",
3
- "version": "2.0.1",
3
+ "version": "2.1.1",
4
4
  "description": "MCP server for astronomical database queries via direct HTTP/TAP APIs",
5
5
  "keywords": [
6
6
  "mcp",
@@ -12,7 +12,9 @@
12
12
  "vizier",
13
13
  "gaia",
14
14
  "alma",
15
- "ads"
15
+ "ads",
16
+ "aavso",
17
+ "fermi"
16
18
  ],
17
19
  "homepage": "https://github.com/inoribea/aqc-mcp",
18
20
  "repository": {
@@ -29,17 +31,12 @@
29
31
  },
30
32
  "main": "dist/index.js",
31
33
  "type": "module",
32
- "scripts": {
33
- "build": "tsc",
34
- "start": "node dist/index.js",
35
- "dev": "tsc && node dist/index.js",
36
- "watch": "tsc --watch"
37
- },
38
34
  "dependencies": {
39
35
  "@modelcontextprotocol/sdk": "^1.27.1",
40
36
  "cors": "^2.8.5",
41
37
  "express": "^4.18.2",
42
- "mcp-http-server": "^1.2.4"
38
+ "mcp-http-server": "^1.2.4",
39
+ "zod": "^4.3.6"
43
40
  },
44
41
  "devDependencies": {
45
42
  "@types/cors": "^2.8.17",
@@ -49,5 +46,11 @@
49
46
  },
50
47
  "engines": {
51
48
  "node": ">=18.0.0"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc",
52
+ "start": "node dist/index.js",
53
+ "dev": "tsc && node dist/index.js",
54
+ "watch": "tsc --watch"
52
55
  }
53
- }
56
+ }
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC5C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IACF,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,IAAI,CAAC;QACH,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,kCAAkC,CAAC;gBACvC,IAAI;gBACJ,IAAI,EAAE,IAAK;gBACX,kDAAkD;gBAClD,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe,EAAE;aAC/C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function registerAdsTools(server: any): void;
2
- //# sourceMappingURL=ads.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ads.d.ts","sourceRoot":"","sources":["../../src/tools/ads.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,QAkD3C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ads.js","sourceRoot":"","sources":["../../src/tools/ads.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function registerAlmaTools(server: any): void;
2
- //# sourceMappingURL=alma.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"alma.d.ts","sourceRoot":"","sources":["../../src/tools/alma.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,QAiC5C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alma.js","sourceRoot":"","sources":["../../src/tools/alma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AAExD,MAAM,UAAU,iBAAiB,CAAC,MAAW;IAC3C,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,mFAAmF,EACnF;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC7E,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACxE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACzE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACrE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACzE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KACrE,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAqG,EAAE,EAAE;QAC1J,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,EAAE,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wDAAwD,EAAE,CAAC,EAAE,CAAC;QAC5J,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;QAC9B,IAAI,KAAa,CAAC;QAElB,IAAI,EAAE,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1C,KAAK,GAAG,uDAAuD,EAAE,KAAK,GAAG,KAAK,SAAS,QAAQ,CAAC;QAClG,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,kBAAkB,MAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;QAC3D,CAAC;QAED,MAAM,IAAI,GAAG,cAAc,WAAW,4HAA4H,KAAK,EAAE,CAAC;QAE1K,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,MAAM,IAAI,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB,MAAM,IAAI,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC;QAC5H,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACxF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function registerEsaskyTools(server: any): void;
2
- //# sourceMappingURL=esasky.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"esasky.d.ts","sourceRoot":"","sources":["../../src/tools/esasky.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,QA4B9C"}