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 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 PORT = process.env.PORT ? parseInt(process.env.PORT) : 3000;
7
+ const VERSION = '1.2.2';
7
8
  async function createMcpServer() {
8
9
  const server = new McpServer({
9
10
  name: 'astroquery-mcp',
10
- version: '1.0.0',
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
- // Helper function to build command arguments
20
- function buildArgs(module, command, mainArg, extraArgs) {
21
- const args = [module, command, mainArg];
22
- for (const arg of extraArgs) {
23
- if (arg)
24
- args.push(arg);
25
- }
26
- return args;
27
- }
28
- async function startHttpServer() {
29
- const express = (await import('express')).default;
30
- const cors = (await import('cors')).default;
31
- const app = express();
32
- app.use(cors());
33
- app.use(express.json());
34
- const mcpServer = await createMcpServer();
35
- // GET /health - Health check
36
- app.get('/health', (req, res) => {
37
- res.json({ status: 'ok' });
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
- catch (error) {
160
- res.status(500).json({ error: error.message });
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
- app.listen(PORT, () => {
164
- console.log(`Astroquery MCP Server running on http://localhost:${PORT}`);
165
- console.log(`Health check: http://localhost:${PORT}/health`);
166
- console.log(`Tools list: http://localhost:${PORT}/tools/list`);
167
- console.log(`SSE endpoint: http://localhost:${PORT}/sse`);
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":"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"}
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.1",
3
+ "version": "1.2.3",
4
4
  "description": "MCP server for astroquery-cli with HTTP and SSE support",
5
- "keywords": ["mcp", "astroquery", "astronomy", "sse", "http", "simbad", "vizier", "gaia", "alma", "ads"],
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
- "cors": "^2.8.5"
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 PORT = process.env.PORT ? parseInt(process.env.PORT) : 3000;
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: '1.0.0',
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
- // Helper function to build command arguments
28
- function buildArgs(module: string, command: string, mainArg: string, extraArgs: (string | null | undefined)[]): string[] {
29
- const args: string[] = [module, command, mainArg];
30
- for (const arg of extraArgs) {
31
- if (arg) args.push(arg);
32
- }
33
- return args;
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 { tools } = req.body;
130
-
131
- if (!Array.isArray(tools)) {
132
- return res.status(400).json({ error: 'Tools must be an array' });
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
- const results = await Promise.all(
136
- tools.map(async ({ name, arguments: args }: any) => {
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
- app.listen(PORT, () => {
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();