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.
Files changed (48) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +422 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +182 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tools/ads.d.ts +4 -0
  8. package/dist/tools/ads.d.ts.map +1 -0
  9. package/dist/tools/ads.js +31 -0
  10. package/dist/tools/ads.js.map +1 -0
  11. package/dist/tools/alma.d.ts +4 -0
  12. package/dist/tools/alma.d.ts.map +1 -0
  13. package/dist/tools/alma.js +40 -0
  14. package/dist/tools/alma.js.map +1 -0
  15. package/dist/tools/call.d.ts +15 -0
  16. package/dist/tools/call.d.ts.map +1 -0
  17. package/dist/tools/call.js +31 -0
  18. package/dist/tools/call.js.map +1 -0
  19. package/dist/tools/gaia.d.ts +4 -0
  20. package/dist/tools/gaia.d.ts.map +1 -0
  21. package/dist/tools/gaia.js +31 -0
  22. package/dist/tools/gaia.js.map +1 -0
  23. package/dist/tools/index.d.ts +3 -0
  24. package/dist/tools/index.d.ts.map +1 -0
  25. package/dist/tools/index.js +72 -0
  26. package/dist/tools/index.js.map +1 -0
  27. package/dist/tools/simbad.d.ts +4 -0
  28. package/dist/tools/simbad.d.ts.map +1 -0
  29. package/dist/tools/simbad.js +29 -0
  30. package/dist/tools/simbad.js.map +1 -0
  31. package/dist/tools/vizier.d.ts +4 -0
  32. package/dist/tools/vizier.d.ts.map +1 -0
  33. package/dist/tools/vizier.js +38 -0
  34. package/dist/tools/vizier.js.map +1 -0
  35. package/dist/utils/executor.d.ts +12 -0
  36. package/dist/utils/executor.d.ts.map +1 -0
  37. package/dist/utils/executor.js +48 -0
  38. package/dist/utils/executor.js.map +1 -0
  39. package/package.json +38 -0
  40. package/src/index.ts +199 -0
  41. package/src/tools/ads.ts +41 -0
  42. package/src/tools/alma.ts +47 -0
  43. package/src/tools/gaia.ts +42 -0
  44. package/src/tools/index.ts +95 -0
  45. package/src/tools/simbad.ts +40 -0
  46. package/src/tools/vizier.ts +46 -0
  47. package/src/utils/executor.ts +59 -0
  48. 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/)
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ declare let executeAdsQuery: (query?: string, lang?: string) => Promise<string>;
2
+ export declare function registerAdsTools(server: any): void;
3
+ export { executeAdsQuery };
4
+ //# sourceMappingURL=ads.d.ts.map
@@ -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"}