aqc-mcp 1.2.1 → 1.2.3
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/dist/index.js +35 -165
- package/dist/index.js.map +1 -1
- package/package.json +17 -4
- package/src/index.ts +32 -172
package/dist/index.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { program } from 'commander';
|
|
3
|
+
import { startSseAndStreamableHttpMcpServer } from 'mcp-http-server';
|
|
2
4
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
5
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import { executeAqc } from './utils/executor.js';
|
|
5
6
|
import { listTools } from './tools/index.js';
|
|
6
|
-
const
|
|
7
|
+
const VERSION = '1.2.2';
|
|
7
8
|
async function createMcpServer() {
|
|
8
9
|
const server = new McpServer({
|
|
9
10
|
name: 'astroquery-mcp',
|
|
10
|
-
version:
|
|
11
|
+
version: VERSION,
|
|
11
12
|
}, {
|
|
12
13
|
capabilities: {
|
|
13
14
|
tools: {},
|
|
@@ -16,168 +17,37 @@ async function createMcpServer() {
|
|
|
16
17
|
await listTools(server);
|
|
17
18
|
return server;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
39
|
-
// GET / - Server info
|
|
40
|
-
app.get('/', (req, res) => {
|
|
41
|
-
res.json({
|
|
42
|
-
name: 'astroquery-mcp',
|
|
43
|
-
version: '1.0.0',
|
|
44
|
-
protocol: 'MCP',
|
|
45
|
-
transport: 'HTTP',
|
|
46
|
-
endpoints: {
|
|
47
|
-
health: '/health',
|
|
48
|
-
sse: '/sse',
|
|
49
|
-
tools: '/tools'
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
// GET /sse - SSE endpoint
|
|
54
|
-
app.get('/sse', async (req, res) => {
|
|
55
|
-
res.setHeader('Content-Type', 'text/event-stream');
|
|
56
|
-
res.setHeader('Cache-Control', 'no-cache');
|
|
57
|
-
res.setHeader('Connection', 'keep-alive');
|
|
58
|
-
res.write(`data: ${JSON.stringify({ type: 'connected' })}\n\n`);
|
|
59
|
-
req.on('close', () => {
|
|
60
|
-
res.end();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
// POST /tools/list - List available tools
|
|
64
|
-
app.get('/tools/list', (req, res) => {
|
|
65
|
-
res.json({ message: 'Use MCP protocol to list tools' });
|
|
66
|
-
});
|
|
67
|
-
// POST /tools/call - Call a tool directly (for HTTP clients)
|
|
68
|
-
app.post('/tools/call', async (req, res) => {
|
|
69
|
-
try {
|
|
70
|
-
const { name, arguments: args } = req.body;
|
|
71
|
-
if (!name) {
|
|
72
|
-
return res.status(400).json({ error: 'Tool name is required' });
|
|
73
|
-
}
|
|
74
|
-
const cmdArgs = [];
|
|
75
|
-
switch (name) {
|
|
76
|
-
case 'simbad_query':
|
|
77
|
-
cmdArgs.push('simbad', 'object', args.object_name);
|
|
78
|
-
break;
|
|
79
|
-
case 'vizier_query':
|
|
80
|
-
cmdArgs.push('vizier', 'object', args.target, args.radius);
|
|
81
|
-
if (args.catalog)
|
|
82
|
-
cmdArgs.push('--catalog', args.catalog);
|
|
83
|
-
break;
|
|
84
|
-
case 'alma_query':
|
|
85
|
-
cmdArgs.push('alma', 'object', args.object_name);
|
|
86
|
-
break;
|
|
87
|
-
case 'ads_query':
|
|
88
|
-
cmdArgs.push('ads', 'query');
|
|
89
|
-
if (args.latest)
|
|
90
|
-
cmdArgs.push('--latest');
|
|
91
|
-
if (args.review)
|
|
92
|
-
cmdArgs.push('--review');
|
|
93
|
-
if (args.query)
|
|
94
|
-
cmdArgs.push(args.query);
|
|
95
|
-
break;
|
|
96
|
-
case 'gaia_cone_search':
|
|
97
|
-
cmdArgs.push('gaia', 'cone-search', args.target);
|
|
98
|
-
if (args.radius)
|
|
99
|
-
cmdArgs.push('--radius', args.radius);
|
|
100
|
-
break;
|
|
101
|
-
default:
|
|
102
|
-
throw new Error(`Tool '${name}' not found`);
|
|
103
|
-
}
|
|
104
|
-
const result = await executeAqc(cmdArgs);
|
|
105
|
-
res.json({ content: [{ type: 'text', text: result.output || '' }] });
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
res.status(500).json({ error: error.message });
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
// POST /tools/batch - Call multiple tools in parallel
|
|
112
|
-
app.post('/tools/batch', async (req, res) => {
|
|
113
|
-
try {
|
|
114
|
-
const { tools } = req.body;
|
|
115
|
-
if (!Array.isArray(tools)) {
|
|
116
|
-
return res.status(400).json({ error: 'Tools must be an array' });
|
|
117
|
-
}
|
|
118
|
-
const results = await Promise.all(tools.map(async ({ name, arguments: args }) => {
|
|
119
|
-
try {
|
|
120
|
-
const cmdArgs = [];
|
|
121
|
-
switch (name) {
|
|
122
|
-
case 'simbad_query':
|
|
123
|
-
cmdArgs.push('simbad', 'object', args.object_name);
|
|
124
|
-
break;
|
|
125
|
-
case 'vizier_query':
|
|
126
|
-
cmdArgs.push('vizier', 'object', args.target, args.radius);
|
|
127
|
-
if (args.catalog)
|
|
128
|
-
cmdArgs.push('--catalog', args.catalog);
|
|
129
|
-
break;
|
|
130
|
-
case 'alma_query':
|
|
131
|
-
cmdArgs.push('alma', 'object', args.object_name);
|
|
132
|
-
break;
|
|
133
|
-
case 'ads_query':
|
|
134
|
-
cmdArgs.push('ads', 'query');
|
|
135
|
-
if (args.latest)
|
|
136
|
-
cmdArgs.push('--latest');
|
|
137
|
-
if (args.review)
|
|
138
|
-
cmdArgs.push('--review');
|
|
139
|
-
if (args.query)
|
|
140
|
-
cmdArgs.push(args.query);
|
|
141
|
-
break;
|
|
142
|
-
case 'gaia_cone_search':
|
|
143
|
-
cmdArgs.push('gaia', 'cone-search', args.target);
|
|
144
|
-
if (args.radius)
|
|
145
|
-
cmdArgs.push('--radius', args.radius);
|
|
146
|
-
break;
|
|
147
|
-
default:
|
|
148
|
-
throw new Error(`Tool '${name}' not found`);
|
|
149
|
-
}
|
|
150
|
-
const result = await executeAqc(cmdArgs);
|
|
151
|
-
return { name, success: true, result: { content: [{ type: 'text', text: result.output || '' }] } };
|
|
152
|
-
}
|
|
153
|
-
catch (error) {
|
|
154
|
-
return { name, success: false, error: error.message };
|
|
155
|
-
}
|
|
156
|
-
}));
|
|
157
|
-
res.json(results);
|
|
20
|
+
program
|
|
21
|
+
.name('aqc-mcp')
|
|
22
|
+
.description('MCP server for astroquery-cli')
|
|
23
|
+
.version(VERSION)
|
|
24
|
+
.option('--port <port>', 'HTTP server port')
|
|
25
|
+
.option('--host <host>', 'HTTP server host', 'localhost')
|
|
26
|
+
.action(async (options) => {
|
|
27
|
+
try {
|
|
28
|
+
const server = await createMcpServer();
|
|
29
|
+
if (options.port) {
|
|
30
|
+
// HTTP mode with SSE support
|
|
31
|
+
await startSseAndStreamableHttpMcpServer({
|
|
32
|
+
host: options.host,
|
|
33
|
+
port: parseInt(options.port),
|
|
34
|
+
// @ts-ignore
|
|
35
|
+
createMcpServer: async ({ headers }) => {
|
|
36
|
+
return server;
|
|
37
|
+
},
|
|
38
|
+
});
|
|
158
39
|
}
|
|
159
|
-
|
|
160
|
-
|
|
40
|
+
else {
|
|
41
|
+
// stdio mode
|
|
42
|
+
const transport = new StdioServerTransport();
|
|
43
|
+
await server.connect(transport);
|
|
44
|
+
console.error('AstroQuery MCP server running on stdio');
|
|
161
45
|
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
console.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
async function startStdioServer() {
|
|
171
|
-
const server = await createMcpServer();
|
|
172
|
-
const transport = new StdioServerTransport();
|
|
173
|
-
await server.connect(transport);
|
|
174
|
-
}
|
|
175
|
-
// Start server based on transport mode
|
|
176
|
-
const mode = process.env.MCP_TRANSPORT || 'stdio';
|
|
177
|
-
if (mode === 'http') {
|
|
178
|
-
startHttpServer();
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
startStdioServer();
|
|
182
|
-
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error('Fatal error:', error);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
program.parse();
|
|
183
53
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,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,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,KAAK,UAAU,eAAe;IAC5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;KAC3C,MAAM,CAAC,eAAe,EAAE,kBAAkB,EAAE,WAAW,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QAEvC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,6BAA6B;YAC7B,MAAM,kCAAkC,CAAC;gBACvC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC5B,aAAa;gBACb,eAAe,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;oBACrC,OAAO,MAAM,CAAC;gBAChB,CAAC;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,aAAa;YACb,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,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aqc-mcp",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "MCP server for astroquery-cli with HTTP and SSE support",
|
|
5
|
-
"keywords": [
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"astroquery",
|
|
8
|
+
"astronomy",
|
|
9
|
+
"sse",
|
|
10
|
+
"http",
|
|
11
|
+
"simbad",
|
|
12
|
+
"vizier",
|
|
13
|
+
"gaia",
|
|
14
|
+
"alma",
|
|
15
|
+
"ads"
|
|
16
|
+
],
|
|
6
17
|
"homepage": "https://github.com/inoribea/aqc-mcp",
|
|
7
18
|
"repository": {
|
|
8
19
|
"type": "git",
|
|
@@ -26,13 +37,15 @@
|
|
|
26
37
|
},
|
|
27
38
|
"dependencies": {
|
|
28
39
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
40
|
+
"commander": "^14.0.3",
|
|
41
|
+
"cors": "^2.8.5",
|
|
29
42
|
"express": "^4.18.2",
|
|
30
|
-
"
|
|
43
|
+
"mcp-http-server": "^1.2.4"
|
|
31
44
|
},
|
|
32
45
|
"devDependencies": {
|
|
46
|
+
"@types/cors": "^2.8.17",
|
|
33
47
|
"@types/express": "^4.17.21",
|
|
34
48
|
"@types/node": "^20.10.0",
|
|
35
|
-
"@types/cors": "^2.8.17",
|
|
36
49
|
"typescript": "^5.3.3"
|
|
37
50
|
},
|
|
38
51
|
"engines": {
|
package/src/index.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { program } from 'commander';
|
|
3
|
+
import { startSseAndStreamableHttpMcpServer } from 'mcp-http-server';
|
|
2
4
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
5
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import { executeAqc } from './utils/executor.js';
|
|
5
6
|
import { listTools } from './tools/index.js';
|
|
6
7
|
|
|
7
|
-
const
|
|
8
|
+
const VERSION = '1.2.2';
|
|
8
9
|
|
|
9
10
|
async function createMcpServer() {
|
|
10
11
|
const server = new McpServer(
|
|
11
12
|
{
|
|
12
13
|
name: 'astroquery-mcp',
|
|
13
|
-
version:
|
|
14
|
+
version: VERSION,
|
|
14
15
|
},
|
|
15
16
|
{
|
|
16
17
|
capabilities: {
|
|
@@ -24,177 +25,36 @@ async function createMcpServer() {
|
|
|
24
25
|
return server;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async function startHttpServer() {
|
|
37
|
-
const express = (await import('express')).default;
|
|
38
|
-
const cors = (await import('cors')).default;
|
|
39
|
-
|
|
40
|
-
const app = express();
|
|
41
|
-
app.use(cors());
|
|
42
|
-
app.use(express.json());
|
|
43
|
-
|
|
44
|
-
const mcpServer = await createMcpServer();
|
|
45
|
-
|
|
46
|
-
// GET /health - Health check
|
|
47
|
-
app.get('/health', (req: any, res: any) => {
|
|
48
|
-
res.json({ status: 'ok' });
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
// GET / - Server info
|
|
52
|
-
app.get('/', (req: any, res: any) => {
|
|
53
|
-
res.json({
|
|
54
|
-
name: 'astroquery-mcp',
|
|
55
|
-
version: '1.0.0',
|
|
56
|
-
protocol: 'MCP',
|
|
57
|
-
transport: 'HTTP',
|
|
58
|
-
endpoints: {
|
|
59
|
-
health: '/health',
|
|
60
|
-
sse: '/sse',
|
|
61
|
-
tools: '/tools'
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// GET /sse - SSE endpoint
|
|
67
|
-
app.get('/sse', async (req: any, res: any) => {
|
|
68
|
-
res.setHeader('Content-Type', 'text/event-stream');
|
|
69
|
-
res.setHeader('Cache-Control', 'no-cache');
|
|
70
|
-
res.setHeader('Connection', 'keep-alive');
|
|
71
|
-
|
|
72
|
-
res.write(`data: ${JSON.stringify({ type: 'connected' })}\n\n`);
|
|
73
|
-
|
|
74
|
-
req.on('close', () => {
|
|
75
|
-
res.end();
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// POST /tools/list - List available tools
|
|
80
|
-
app.get('/tools/list', (req: any, res: any) => {
|
|
81
|
-
res.json({ message: 'Use MCP protocol to list tools' });
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// POST /tools/call - Call a tool directly (for HTTP clients)
|
|
85
|
-
app.post('/tools/call', async (req: any, res: any) => {
|
|
86
|
-
try {
|
|
87
|
-
const { name, arguments: args } = req.body;
|
|
88
|
-
|
|
89
|
-
if (!name) {
|
|
90
|
-
return res.status(400).json({ error: 'Tool name is required' });
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const cmdArgs: string[] = [];
|
|
94
|
-
switch (name) {
|
|
95
|
-
case 'simbad_query':
|
|
96
|
-
cmdArgs.push('simbad', 'object', args.object_name);
|
|
97
|
-
break;
|
|
98
|
-
case 'vizier_query':
|
|
99
|
-
cmdArgs.push('vizier', 'object', args.target, args.radius);
|
|
100
|
-
if (args.catalog) cmdArgs.push('--catalog', args.catalog);
|
|
101
|
-
break;
|
|
102
|
-
case 'alma_query':
|
|
103
|
-
cmdArgs.push('alma', 'object', args.object_name);
|
|
104
|
-
break;
|
|
105
|
-
case 'ads_query':
|
|
106
|
-
cmdArgs.push('ads', 'query');
|
|
107
|
-
if (args.latest) cmdArgs.push('--latest');
|
|
108
|
-
if (args.review) cmdArgs.push('--review');
|
|
109
|
-
if (args.query) cmdArgs.push(args.query);
|
|
110
|
-
break;
|
|
111
|
-
case 'gaia_cone_search':
|
|
112
|
-
cmdArgs.push('gaia', 'cone-search', args.target);
|
|
113
|
-
if (args.radius) cmdArgs.push('--radius', args.radius);
|
|
114
|
-
break;
|
|
115
|
-
default:
|
|
116
|
-
throw new Error(`Tool '${name}' not found`);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const result = await executeAqc(cmdArgs);
|
|
120
|
-
res.json({ content: [{ type: 'text', text: result.output || '' }] });
|
|
121
|
-
} catch (error: any) {
|
|
122
|
-
res.status(500).json({ error: error.message });
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// POST /tools/batch - Call multiple tools in parallel
|
|
127
|
-
app.post('/tools/batch', async (req: any, res: any) => {
|
|
28
|
+
program
|
|
29
|
+
.name('aqc-mcp')
|
|
30
|
+
.description('MCP server for astroquery-cli')
|
|
31
|
+
.version(VERSION)
|
|
32
|
+
.option('--port <port>', 'HTTP server port')
|
|
33
|
+
.option('--host <host>', 'HTTP server host', 'localhost')
|
|
34
|
+
.action(async (options) => {
|
|
128
35
|
try {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
if (
|
|
132
|
-
|
|
36
|
+
const server = await createMcpServer();
|
|
37
|
+
|
|
38
|
+
if (options.port) {
|
|
39
|
+
// HTTP mode with SSE support
|
|
40
|
+
await startSseAndStreamableHttpMcpServer({
|
|
41
|
+
host: options.host,
|
|
42
|
+
port: parseInt(options.port),
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
createMcpServer: async ({ headers }) => {
|
|
45
|
+
return server;
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
// stdio mode
|
|
50
|
+
const transport = new StdioServerTransport();
|
|
51
|
+
await server.connect(transport);
|
|
52
|
+
console.error('AstroQuery MCP server running on stdio');
|
|
133
53
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
try {
|
|
138
|
-
const cmdArgs: string[] = [];
|
|
139
|
-
switch (name) {
|
|
140
|
-
case 'simbad_query':
|
|
141
|
-
cmdArgs.push('simbad', 'object', args.object_name);
|
|
142
|
-
break;
|
|
143
|
-
case 'vizier_query':
|
|
144
|
-
cmdArgs.push('vizier', 'object', args.target, args.radius);
|
|
145
|
-
if (args.catalog) cmdArgs.push('--catalog', args.catalog);
|
|
146
|
-
break;
|
|
147
|
-
case 'alma_query':
|
|
148
|
-
cmdArgs.push('alma', 'object', args.object_name);
|
|
149
|
-
break;
|
|
150
|
-
case 'ads_query':
|
|
151
|
-
cmdArgs.push('ads', 'query');
|
|
152
|
-
if (args.latest) cmdArgs.push('--latest');
|
|
153
|
-
if (args.review) cmdArgs.push('--review');
|
|
154
|
-
if (args.query) cmdArgs.push(args.query);
|
|
155
|
-
break;
|
|
156
|
-
case 'gaia_cone_search':
|
|
157
|
-
cmdArgs.push('gaia', 'cone-search', args.target);
|
|
158
|
-
if (args.radius) cmdArgs.push('--radius', args.radius);
|
|
159
|
-
break;
|
|
160
|
-
default:
|
|
161
|
-
throw new Error(`Tool '${name}' not found`);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const result = await executeAqc(cmdArgs);
|
|
165
|
-
return { name, success: true, result: { content: [{ type: 'text', text: result.output || '' }] } };
|
|
166
|
-
} catch (error: any) {
|
|
167
|
-
return { name, success: false, error: error.message };
|
|
168
|
-
}
|
|
169
|
-
})
|
|
170
|
-
);
|
|
171
|
-
|
|
172
|
-
res.json(results);
|
|
173
|
-
} catch (error: any) {
|
|
174
|
-
res.status(500).json({ error: error.message });
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('Fatal error:', error);
|
|
56
|
+
process.exit(1);
|
|
175
57
|
}
|
|
176
58
|
});
|
|
177
59
|
|
|
178
|
-
|
|
179
|
-
console.log(`Astroquery MCP Server running on http://localhost:${PORT}`);
|
|
180
|
-
console.log(`Health check: http://localhost:${PORT}/health`);
|
|
181
|
-
console.log(`Tools list: http://localhost:${PORT}/tools/list`);
|
|
182
|
-
console.log(`SSE endpoint: http://localhost:${PORT}/sse`);
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
async function startStdioServer() {
|
|
187
|
-
const server = await createMcpServer();
|
|
188
|
-
const transport = new StdioServerTransport();
|
|
189
|
-
|
|
190
|
-
await server.connect(transport);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Start server based on transport mode
|
|
194
|
-
const mode = process.env.MCP_TRANSPORT || 'stdio';
|
|
195
|
-
|
|
196
|
-
if (mode === 'http') {
|
|
197
|
-
startHttpServer();
|
|
198
|
-
} else {
|
|
199
|
-
startStdioServer();
|
|
200
|
-
}
|
|
60
|
+
program.parse();
|