aqc-mcp 1.0.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/LICENSE +28 -0
- package/README.md +422 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ads.d.ts +4 -0
- package/dist/tools/ads.d.ts.map +1 -0
- package/dist/tools/ads.js +31 -0
- package/dist/tools/ads.js.map +1 -0
- package/dist/tools/alma.d.ts +4 -0
- package/dist/tools/alma.d.ts.map +1 -0
- package/dist/tools/alma.js +40 -0
- package/dist/tools/alma.js.map +1 -0
- package/dist/tools/call.d.ts +15 -0
- package/dist/tools/call.d.ts.map +1 -0
- package/dist/tools/call.js +31 -0
- package/dist/tools/call.js.map +1 -0
- package/dist/tools/gaia.d.ts +4 -0
- package/dist/tools/gaia.d.ts.map +1 -0
- package/dist/tools/gaia.js +31 -0
- package/dist/tools/gaia.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +72 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/simbad.d.ts +4 -0
- package/dist/tools/simbad.d.ts.map +1 -0
- package/dist/tools/simbad.js +29 -0
- package/dist/tools/simbad.js.map +1 -0
- package/dist/tools/vizier.d.ts +4 -0
- package/dist/tools/vizier.d.ts.map +1 -0
- package/dist/tools/vizier.js +38 -0
- package/dist/tools/vizier.js.map +1 -0
- package/dist/utils/executor.d.ts +12 -0
- package/dist/utils/executor.d.ts.map +1 -0
- package/dist/utils/executor.js +48 -0
- package/dist/utils/executor.js.map +1 -0
- package/package.json +38 -0
- package/src/index.ts +199 -0
- package/src/tools/ads.ts +41 -0
- package/src/tools/alma.ts +47 -0
- package/src/tools/gaia.ts +42 -0
- package/src/tools/index.ts +95 -0
- package/src/tools/simbad.ts +40 -0
- package/src/tools/vizier.ts +46 -0
- package/src/utils/executor.ts +59 -0
- package/tsconfig.json +20 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, inoribea
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.md
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
# Astroquery MCP Server 🚀
|
|
2
|
+
|
|
3
|
+
A Model Context Protocol (MCP) server for astroquery-cli, providing HTTP and SSE (Server-Sent Events) transport options.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview ✨
|
|
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.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Features 🌟
|
|
14
|
+
|
|
15
|
+
- ⚡ **MCP Protocol**: Full implementation of MCP specification
|
|
16
|
+
- 🌐 **Multiple Transports**:
|
|
17
|
+
- HTTP (default)
|
|
18
|
+
- SSE (Server-Sent Events)
|
|
19
|
+
- Stdio (for Claude Desktop)
|
|
20
|
+
- 🔌 **Extensible**: Easy to add new tools and modules
|
|
21
|
+
- 🌍 **Language Support**: Multi-language output (English, Chinese, Japanese)
|
|
22
|
+
- 📊 **Rich Output**: Formatted tables and structured results
|
|
23
|
+
- 🔑 **ADS API Token Support**: Environment variable injection for authenticated queries
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Supported Modules 🧩
|
|
28
|
+
|
|
29
|
+
Currently implemented tools:
|
|
30
|
+
|
|
31
|
+
- **SIMBAD**: Query SIMBAD astronomical database
|
|
32
|
+
- **VizieR**: Query VizieR catalog database
|
|
33
|
+
- **ALMA**: Query ALMA observations archive
|
|
34
|
+
- **ADS**: NASA Astrophysics Data System queries (requires API token)
|
|
35
|
+
- **Gaia**: Gaia archive cone search
|
|
36
|
+
|
|
37
|
+
> ⚠️ More modules (ESASky, IRSA, Heasarc, JPL, MAST, NED, NIST, Exoplanet, SDSS, ESO, Splatalogue) coming soon!
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Installation 🛠️
|
|
42
|
+
|
|
43
|
+
### Prerequisites
|
|
44
|
+
|
|
45
|
+
- **Node.js** ≥ 18.0.0
|
|
46
|
+
- **Python** ≥ 3.11
|
|
47
|
+
- **astroquery-cli** installed via poetry in the parent directory
|
|
48
|
+
|
|
49
|
+
### Directory Structure
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
astroquery-cli/ # Main CLI project (with poetry)
|
|
53
|
+
├── astroquery_cli/
|
|
54
|
+
├── pyproject.toml
|
|
55
|
+
└── astroquery-mcp/ # This MCP server
|
|
56
|
+
├── src/
|
|
57
|
+
└── package.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Installation Steps
|
|
61
|
+
|
|
62
|
+
1. **Install astroquery-cli first** (in parent directory):
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
cd astroquery-cli
|
|
66
|
+
poetry install
|
|
67
|
+
poetry run aqc --help # Verify installation
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
2. **Install MCP dependencies**:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
cd astroquery-mcp
|
|
74
|
+
npm install
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
3. **Build the MCP server**:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm run build
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
4. **Configure ADS API Token** (Optional but recommended for ADS queries):
|
|
84
|
+
|
|
85
|
+
Get your token from: https://ui.adsabs.harvard.edu/user/settings/token
|
|
86
|
+
|
|
87
|
+
Then set the environment variable:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
export ADS_API_KEY="your-ads-api-token-here"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Or add to your shell profile (~/.bashrc, ~/.zshrc):
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
echo 'export ADS_API_KEY="your-token"' >> ~/.bashrc
|
|
97
|
+
source ~/.bashrc
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Usage 🚀
|
|
103
|
+
|
|
104
|
+
### 1. Start Server
|
|
105
|
+
|
|
106
|
+
#### HTTP Mode (default)
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm start
|
|
110
|
+
# or
|
|
111
|
+
npm run dev
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Server will start on `http://localhost:3000`
|
|
115
|
+
|
|
116
|
+
#### With ADS API Token
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
ADS_API_KEY="your-token" npm start
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### Custom Port
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
PORT=8080 npm start
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### SSE Mode
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
MCP_TRANSPORT=http npm start
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
#### Stdio Mode (for Claude Desktop)
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
MCP_TRANSPORT=stdio npm run dev
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### 2. API Endpoints
|
|
143
|
+
|
|
144
|
+
#### Health Check
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
curl http://localhost:3000/health
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### Server Info
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
curl http://localhost:3000/
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
#### SSE Connection
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
curl http://localhost:3000/sse
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## MCP Tools 🔧
|
|
165
|
+
|
|
166
|
+
### simbad_query
|
|
167
|
+
|
|
168
|
+
Query SIMBAD astronomical database.
|
|
169
|
+
|
|
170
|
+
**Parameters:**
|
|
171
|
+
- `object_name` (string, required): Object name (e.g., "M31", "NGC 1234")
|
|
172
|
+
- `lang` (string, optional): Output language ("en", "zh", "ja")
|
|
173
|
+
|
|
174
|
+
**Example:**
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"name": "simbad_query",
|
|
179
|
+
"arguments": {
|
|
180
|
+
"object_name": "M31",
|
|
181
|
+
"lang": "en"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### vizier_query
|
|
189
|
+
|
|
190
|
+
Query VizieR catalog database.
|
|
191
|
+
|
|
192
|
+
**Parameters:**
|
|
193
|
+
- `target` (string, required): Target name or coordinates
|
|
194
|
+
- `radius` (string, required): Search radius (e.g., "10arcsec", "0.5deg")
|
|
195
|
+
- `catalog` (string, optional): Specific catalog name
|
|
196
|
+
- `lang` (string, optional): Output language
|
|
197
|
+
|
|
198
|
+
**Example:**
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"name": "vizier_query",
|
|
203
|
+
"arguments": {
|
|
204
|
+
"target": "M31",
|
|
205
|
+
"radius": "10arcsec",
|
|
206
|
+
"catalog": "I/345/gaia2"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
### alma_query
|
|
214
|
+
|
|
215
|
+
Query ALMA observations archive.
|
|
216
|
+
|
|
217
|
+
**Parameters:**
|
|
218
|
+
- `object_name` (string, required): Object name
|
|
219
|
+
- `lang` (string, optional): Output language
|
|
220
|
+
|
|
221
|
+
**Example:**
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"name": "alma_query",
|
|
226
|
+
"arguments": {
|
|
227
|
+
"object_name": "Orion KL"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
### ads_query
|
|
235
|
+
|
|
236
|
+
Query NASA Astrophysics Data System.
|
|
237
|
+
|
|
238
|
+
**Parameters:**
|
|
239
|
+
- `query` (string, optional): Search query string
|
|
240
|
+
- `latest` (boolean, optional): Get latest papers
|
|
241
|
+
- `review` (boolean, optional): Get review articles only
|
|
242
|
+
- `lang` (string, optional): Output language
|
|
243
|
+
|
|
244
|
+
**Requirements:**
|
|
245
|
+
- Set `ADS_API_KEY` environment variable before starting the server
|
|
246
|
+
|
|
247
|
+
**Example:**
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"name": "ads_query",
|
|
252
|
+
"arguments": {
|
|
253
|
+
"latest": true,
|
|
254
|
+
"lang": "en"
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
### gaia_cone_search
|
|
262
|
+
|
|
263
|
+
Query Gaia archive via cone search.
|
|
264
|
+
|
|
265
|
+
**Parameters:**
|
|
266
|
+
- `target` (string, required): Target name or coordinates
|
|
267
|
+
- `radius` (string, optional): Search radius (default: "10arcsec")
|
|
268
|
+
- `lang` (string, optional): Output language
|
|
269
|
+
|
|
270
|
+
**Example:**
|
|
271
|
+
|
|
272
|
+
```json
|
|
273
|
+
{
|
|
274
|
+
"name": "gaia_cone_search",
|
|
275
|
+
"arguments": {
|
|
276
|
+
"target": "M31",
|
|
277
|
+
"radius": "1arcmin"
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## HTTP API Examples 📡
|
|
285
|
+
|
|
286
|
+
### Call a Single Tool
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
curl -X POST http://localhost:3000/tools/call \
|
|
290
|
+
-H "Content-Type: application/json" \
|
|
291
|
+
-d '{
|
|
292
|
+
"name": "simbad_query",
|
|
293
|
+
"arguments": {
|
|
294
|
+
"object_name": "M31"
|
|
295
|
+
}
|
|
296
|
+
}'
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Batch Call Multiple Tools
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
curl -X POST http://localhost:3000/tools/batch \
|
|
303
|
+
-H "Content-Type: application/json" \
|
|
304
|
+
-d '{
|
|
305
|
+
"tools": [
|
|
306
|
+
{
|
|
307
|
+
"name": "simbad_query",
|
|
308
|
+
"arguments": {"object_name": "M31"}
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"name": "gaia_cone_search",
|
|
312
|
+
"arguments": {"target": "M31", "radius": "10arcsec"}
|
|
313
|
+
}
|
|
314
|
+
]
|
|
315
|
+
}'
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Claude Desktop Integration 🖥️
|
|
321
|
+
|
|
322
|
+
Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
323
|
+
|
|
324
|
+
```json
|
|
325
|
+
{
|
|
326
|
+
"mcpServers": {
|
|
327
|
+
"astroquery": {
|
|
328
|
+
"command": "node",
|
|
329
|
+
"args": ["/path/to/astroquery-cli/astroquery-mcp/dist/index.js"],
|
|
330
|
+
"env": {
|
|
331
|
+
"MCP_TRANSPORT": "stdio",
|
|
332
|
+
"ADS_API_KEY": "your-ads-api-token-here"
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Development 🔨
|
|
342
|
+
|
|
343
|
+
### Watch Mode
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
npm run watch
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Project Structure
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
astroquery-mcp/
|
|
353
|
+
├── src/
|
|
354
|
+
│ ├── index.ts # Main server entry
|
|
355
|
+
│ ├── tools/ # MCP tool definitions
|
|
356
|
+
│ │ ├── index.ts # Tool registration
|
|
357
|
+
│ │ ├── simbad.ts
|
|
358
|
+
│ │ ├── vizier.ts
|
|
359
|
+
│ │ ├── alma.ts
|
|
360
|
+
│ │ ├── ads.ts
|
|
361
|
+
│ │ └── gaia.ts
|
|
362
|
+
│ └── utils/
|
|
363
|
+
│ └── executor.ts # CLI command executor
|
|
364
|
+
├── dist/ # Compiled JavaScript
|
|
365
|
+
├── package.json
|
|
366
|
+
└── tsconfig.json
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Environment Variables 🔧
|
|
372
|
+
|
|
373
|
+
| Variable | Description | Default | Required |
|
|
374
|
+
|----------|-------------|---------|----------|
|
|
375
|
+
| `MCP_TRANSPORT` | Transport mode (`http`, `stdio`) | `stdio` | No |
|
|
376
|
+
| `PORT` | HTTP server port | `3000` | No |
|
|
377
|
+
| `ADS_API_KEY` | NASA ADS API token | - | For ADS queries |
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Troubleshooting 🔍
|
|
382
|
+
|
|
383
|
+
### "aqc: command not found"
|
|
384
|
+
|
|
385
|
+
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.
|
|
386
|
+
|
|
387
|
+
### ADS queries fail
|
|
388
|
+
|
|
389
|
+
Set the `ADS_API_KEY` environment variable:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
export ADS_API_KEY="your-token"
|
|
393
|
+
npm start
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Port already in use
|
|
397
|
+
|
|
398
|
+
Change the port:
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
PORT=8080 npm start
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## License 📄
|
|
407
|
+
|
|
408
|
+
BSD-3-Clause
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## Contributing 🤝
|
|
413
|
+
|
|
414
|
+
Contributions welcome! Please open an issue or PR.
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Links 🔗
|
|
419
|
+
|
|
420
|
+
- [astroquery-cli](../README.md)
|
|
421
|
+
- [MCP Specification](https://modelcontextprotocol.io/)
|
|
422
|
+
- [NASA ADS API](https://ui.adsabs.harvard.edu/)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { executeAqc } from './utils/executor.js';
|
|
4
|
+
import { listTools } from './tools/index.js';
|
|
5
|
+
const PORT = process.env.PORT ? parseInt(process.env.PORT) : 3000;
|
|
6
|
+
async function createMcpServer() {
|
|
7
|
+
const server = new McpServer({
|
|
8
|
+
name: 'astroquery-mcp',
|
|
9
|
+
version: '1.0.0',
|
|
10
|
+
}, {
|
|
11
|
+
capabilities: {
|
|
12
|
+
tools: {},
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
await listTools(server);
|
|
16
|
+
return server;
|
|
17
|
+
}
|
|
18
|
+
// Helper function to build command arguments
|
|
19
|
+
function buildArgs(module, command, mainArg, extraArgs) {
|
|
20
|
+
const args = [module, command, mainArg];
|
|
21
|
+
for (const arg of extraArgs) {
|
|
22
|
+
if (arg)
|
|
23
|
+
args.push(arg);
|
|
24
|
+
}
|
|
25
|
+
return args;
|
|
26
|
+
}
|
|
27
|
+
async function startHttpServer() {
|
|
28
|
+
const express = (await import('express')).default;
|
|
29
|
+
const cors = (await import('cors')).default;
|
|
30
|
+
const app = express();
|
|
31
|
+
app.use(cors());
|
|
32
|
+
app.use(express.json());
|
|
33
|
+
const mcpServer = await createMcpServer();
|
|
34
|
+
// GET /health - Health check
|
|
35
|
+
app.get('/health', (req, res) => {
|
|
36
|
+
res.json({ status: 'ok' });
|
|
37
|
+
});
|
|
38
|
+
// GET / - Server info
|
|
39
|
+
app.get('/', (req, res) => {
|
|
40
|
+
res.json({
|
|
41
|
+
name: 'astroquery-mcp',
|
|
42
|
+
version: '1.0.0',
|
|
43
|
+
protocol: 'MCP',
|
|
44
|
+
transport: 'HTTP',
|
|
45
|
+
endpoints: {
|
|
46
|
+
health: '/health',
|
|
47
|
+
sse: '/sse',
|
|
48
|
+
tools: '/tools'
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
// GET /sse - SSE endpoint
|
|
53
|
+
app.get('/sse', async (req, res) => {
|
|
54
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
55
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
56
|
+
res.setHeader('Connection', 'keep-alive');
|
|
57
|
+
res.write(`data: ${JSON.stringify({ type: 'connected' })}\n\n`);
|
|
58
|
+
req.on('close', () => {
|
|
59
|
+
res.end();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
// POST /tools/list - List available tools
|
|
63
|
+
app.get('/tools/list', (req, res) => {
|
|
64
|
+
res.json({ message: 'Use MCP protocol to list tools' });
|
|
65
|
+
});
|
|
66
|
+
// POST /tools/call - Call a tool directly (for HTTP clients)
|
|
67
|
+
app.post('/tools/call', async (req, res) => {
|
|
68
|
+
try {
|
|
69
|
+
const { name, arguments: args } = req.body;
|
|
70
|
+
if (!name) {
|
|
71
|
+
return res.status(400).json({ error: 'Tool name is required' });
|
|
72
|
+
}
|
|
73
|
+
const cmdArgs = [];
|
|
74
|
+
switch (name) {
|
|
75
|
+
case 'simbad_query':
|
|
76
|
+
cmdArgs.push('simbad', 'object', args.object_name);
|
|
77
|
+
break;
|
|
78
|
+
case 'vizier_query':
|
|
79
|
+
cmdArgs.push('vizier', 'object', args.target, args.radius);
|
|
80
|
+
if (args.catalog)
|
|
81
|
+
cmdArgs.push('--catalog', args.catalog);
|
|
82
|
+
break;
|
|
83
|
+
case 'alma_query':
|
|
84
|
+
cmdArgs.push('alma', 'object', args.object_name);
|
|
85
|
+
break;
|
|
86
|
+
case 'ads_query':
|
|
87
|
+
cmdArgs.push('ads', 'query');
|
|
88
|
+
if (args.latest)
|
|
89
|
+
cmdArgs.push('--latest');
|
|
90
|
+
if (args.review)
|
|
91
|
+
cmdArgs.push('--review');
|
|
92
|
+
if (args.query)
|
|
93
|
+
cmdArgs.push(args.query);
|
|
94
|
+
break;
|
|
95
|
+
case 'gaia_cone_search':
|
|
96
|
+
cmdArgs.push('gaia', 'cone-search', args.target);
|
|
97
|
+
if (args.radius)
|
|
98
|
+
cmdArgs.push('--radius', args.radius);
|
|
99
|
+
break;
|
|
100
|
+
default:
|
|
101
|
+
throw new Error(`Tool '${name}' not found`);
|
|
102
|
+
}
|
|
103
|
+
const result = await executeAqc(cmdArgs);
|
|
104
|
+
res.json({ content: [{ type: 'text', text: result.output || '' }] });
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
res.status(500).json({ error: error.message });
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// POST /tools/batch - Call multiple tools in parallel
|
|
111
|
+
app.post('/tools/batch', async (req, res) => {
|
|
112
|
+
try {
|
|
113
|
+
const { tools } = req.body;
|
|
114
|
+
if (!Array.isArray(tools)) {
|
|
115
|
+
return res.status(400).json({ error: 'Tools must be an array' });
|
|
116
|
+
}
|
|
117
|
+
const results = await Promise.all(tools.map(async ({ name, arguments: args }) => {
|
|
118
|
+
try {
|
|
119
|
+
const cmdArgs = [];
|
|
120
|
+
switch (name) {
|
|
121
|
+
case 'simbad_query':
|
|
122
|
+
cmdArgs.push('simbad', 'object', args.object_name);
|
|
123
|
+
break;
|
|
124
|
+
case 'vizier_query':
|
|
125
|
+
cmdArgs.push('vizier', 'object', args.target, args.radius);
|
|
126
|
+
if (args.catalog)
|
|
127
|
+
cmdArgs.push('--catalog', args.catalog);
|
|
128
|
+
break;
|
|
129
|
+
case 'alma_query':
|
|
130
|
+
cmdArgs.push('alma', 'object', args.object_name);
|
|
131
|
+
break;
|
|
132
|
+
case 'ads_query':
|
|
133
|
+
cmdArgs.push('ads', 'query');
|
|
134
|
+
if (args.latest)
|
|
135
|
+
cmdArgs.push('--latest');
|
|
136
|
+
if (args.review)
|
|
137
|
+
cmdArgs.push('--review');
|
|
138
|
+
if (args.query)
|
|
139
|
+
cmdArgs.push(args.query);
|
|
140
|
+
break;
|
|
141
|
+
case 'gaia_cone_search':
|
|
142
|
+
cmdArgs.push('gaia', 'cone-search', args.target);
|
|
143
|
+
if (args.radius)
|
|
144
|
+
cmdArgs.push('--radius', args.radius);
|
|
145
|
+
break;
|
|
146
|
+
default:
|
|
147
|
+
throw new Error(`Tool '${name}' not found`);
|
|
148
|
+
}
|
|
149
|
+
const result = await executeAqc(cmdArgs);
|
|
150
|
+
return { name, success: true, result: { content: [{ type: 'text', text: result.output || '' }] } };
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
return { name, success: false, error: error.message };
|
|
154
|
+
}
|
|
155
|
+
}));
|
|
156
|
+
res.json(results);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
res.status(500).json({ error: error.message });
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
app.listen(PORT, () => {
|
|
163
|
+
console.log(`Astroquery MCP Server running on http://localhost:${PORT}`);
|
|
164
|
+
console.log(`Health check: http://localhost:${PORT}/health`);
|
|
165
|
+
console.log(`Tools list: http://localhost:${PORT}/tools/list`);
|
|
166
|
+
console.log(`SSE endpoint: http://localhost:${PORT}/sse`);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
async function startStdioServer() {
|
|
170
|
+
const server = await createMcpServer();
|
|
171
|
+
const transport = new StdioServerTransport();
|
|
172
|
+
await server.connect(transport);
|
|
173
|
+
}
|
|
174
|
+
// Start server based on transport mode
|
|
175
|
+
const mode = process.env.MCP_TRANSPORT || 'stdio';
|
|
176
|
+
if (mode === 'http') {
|
|
177
|
+
startHttpServer();
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
startStdioServer();
|
|
181
|
+
}
|
|
182
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"ads.d.ts","sourceRoot":"","sources":["../../src/tools/ads.ts"],"names":[],"mappings":"AAGA,QAAA,IAAI,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAExE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,QAiC3C;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeAqc } from '../utils/executor.js';
|
|
3
|
+
let executeAdsQuery;
|
|
4
|
+
export function registerAdsTools(server) {
|
|
5
|
+
executeAdsQuery = async (query, lang) => {
|
|
6
|
+
const args = ['ads', 'query'];
|
|
7
|
+
if (query)
|
|
8
|
+
args.push('--query', query);
|
|
9
|
+
if (lang)
|
|
10
|
+
args.push('--lang', lang);
|
|
11
|
+
const result = await executeAqc(args);
|
|
12
|
+
if (!result.success) {
|
|
13
|
+
throw new Error(result.error);
|
|
14
|
+
}
|
|
15
|
+
return result.output || '';
|
|
16
|
+
};
|
|
17
|
+
server.tool('ads_query', 'Query NASA Astrophysics Data System for papers and bibliographic information', {
|
|
18
|
+
query: z.string().optional().describe('Search query (e.g., "latest papers", "highly cited reviews")'),
|
|
19
|
+
lang: z.enum(['en', 'zh']).optional().describe('Output language'),
|
|
20
|
+
}, async ({ query, lang }) => {
|
|
21
|
+
const output = await executeAdsQuery(query, lang);
|
|
22
|
+
return {
|
|
23
|
+
content: [{
|
|
24
|
+
type: 'text',
|
|
25
|
+
text: output
|
|
26
|
+
}]
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export { executeAdsQuery };
|
|
31
|
+
//# sourceMappingURL=ads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ads.js","sourceRoot":"","sources":["../../src/tools/ads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,IAAI,eAAmE,CAAC;AAExE,MAAM,UAAU,gBAAgB,CAAC,MAAW;IAC1C,eAAe,GAAG,KAAK,EAAE,KAAc,EAAE,IAAa,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,8EAA8E,EAC9E;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QACrG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KAClE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAElD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;iBACb,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|