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.
- package/README.md +64 -25
- package/dist/index.js +3 -1
- package/dist/tools/aavso.js +120 -0
- package/dist/tools/esasky.js +23 -9
- package/dist/tools/fermi.js +69 -0
- package/dist/tools/heasarc.js +21 -16
- package/dist/tools/index.js +4 -0
- package/dist/tools/mast.js +3 -3
- package/dist/utils/http.js +32 -0
- package/package.json +13 -10
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/tools/ads.d.ts +0 -2
- package/dist/tools/ads.d.ts.map +0 -1
- package/dist/tools/ads.js.map +0 -1
- package/dist/tools/alma.d.ts +0 -2
- package/dist/tools/alma.d.ts.map +0 -1
- package/dist/tools/alma.js.map +0 -1
- package/dist/tools/esasky.d.ts +0 -2
- package/dist/tools/esasky.d.ts.map +0 -1
- package/dist/tools/esasky.js.map +0 -1
- package/dist/tools/eso.d.ts +0 -2
- package/dist/tools/eso.d.ts.map +0 -1
- package/dist/tools/eso.js.map +0 -1
- package/dist/tools/exoplanet.d.ts +0 -2
- package/dist/tools/exoplanet.d.ts.map +0 -1
- package/dist/tools/exoplanet.js.map +0 -1
- package/dist/tools/gaia.d.ts +0 -2
- package/dist/tools/gaia.d.ts.map +0 -1
- package/dist/tools/gaia.js.map +0 -1
- package/dist/tools/heasarc.d.ts +0 -2
- package/dist/tools/heasarc.d.ts.map +0 -1
- package/dist/tools/heasarc.js.map +0 -1
- package/dist/tools/index.d.ts +0 -3
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/irsa.d.ts +0 -2
- package/dist/tools/irsa.d.ts.map +0 -1
- package/dist/tools/irsa.js.map +0 -1
- package/dist/tools/jpl.d.ts +0 -2
- package/dist/tools/jpl.d.ts.map +0 -1
- package/dist/tools/jpl.js.map +0 -1
- package/dist/tools/mast.d.ts +0 -2
- package/dist/tools/mast.d.ts.map +0 -1
- package/dist/tools/mast.js.map +0 -1
- package/dist/tools/ned.d.ts +0 -2
- package/dist/tools/ned.d.ts.map +0 -1
- package/dist/tools/ned.js.map +0 -1
- package/dist/tools/nist.d.ts +0 -2
- package/dist/tools/nist.d.ts.map +0 -1
- package/dist/tools/nist.js.map +0 -1
- package/dist/tools/sdss.d.ts +0 -2
- package/dist/tools/sdss.d.ts.map +0 -1
- package/dist/tools/sdss.js.map +0 -1
- package/dist/tools/simbad.d.ts +0 -2
- package/dist/tools/simbad.d.ts.map +0 -1
- package/dist/tools/simbad.js.map +0 -1
- package/dist/tools/splatalogue.d.ts +0 -2
- package/dist/tools/splatalogue.d.ts.map +0 -1
- package/dist/tools/splatalogue.js.map +0 -1
- package/dist/tools/vizier.d.ts +0 -2
- package/dist/tools/vizier.d.ts.map +0 -1
- package/dist/tools/vizier.js.map +0 -1
- package/dist/utils/http.d.ts +0 -34
- package/dist/utils/http.d.ts.map +0 -1
- package/dist/utils/http.js.map +0 -1
- package/src/index.ts +0 -45
- package/src/tools/ads.ts +0 -56
- package/src/tools/alma.ts +0 -39
- package/src/tools/esasky.ts +0 -49
- package/src/tools/eso.ts +0 -44
- package/src/tools/exoplanet.ts +0 -34
- package/src/tools/gaia.ts +0 -41
- package/src/tools/heasarc.ts +0 -45
- package/src/tools/index.ts +0 -36
- package/src/tools/irsa.ts +0 -42
- package/src/tools/jpl.ts +0 -129
- package/src/tools/mast.ts +0 -116
- package/src/tools/ned.ts +0 -64
- package/src/tools/nist.ts +0 -175
- package/src/tools/sdss.ts +0 -97
- package/src/tools/simbad.ts +0 -35
- package/src/tools/splatalogue.ts +0 -145
- package/src/tools/vizier.ts +0 -38
- package/src/utils/http.ts +0 -223
- 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
|
|
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
|
-
- 🔌 **
|
|
21
|
-
- 🌍 **Language Support**: Multi-language output (English, Chinese
|
|
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
|
-
- **
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
│ │
|
|
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
|
-
│ └──
|
|
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
|
-
- [
|
|
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
|
-
|
|
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
|
package/dist/tools/esasky.js
CHANGED
|
@@ -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('
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
package/dist/tools/heasarc.js
CHANGED
|
@@ -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
|
-
//
|
|
13
|
-
|
|
14
|
-
//
|
|
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',
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
package/dist/tools/index.js
CHANGED
|
@@ -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);
|
package/dist/tools/mast.js
CHANGED
|
@@ -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
|
|
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/
|
|
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) {
|
package/dist/utils/http.js
CHANGED
|
@@ -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.
|
|
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
package/dist/index.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/tools/ads.d.ts
DELETED
package/dist/tools/ads.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/tools/ads.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ads.js","sourceRoot":"","sources":["../../src/tools/ads.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/alma.d.ts
DELETED
package/dist/tools/alma.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/tools/alma.js.map
DELETED
|
@@ -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"}
|
package/dist/tools/esasky.d.ts
DELETED
|
@@ -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"}
|