aqc-mcp 1.2.5 → 2.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 (105) hide show
  1. package/dist/index.d.ts +0 -0
  2. package/dist/index.d.ts.map +0 -0
  3. package/dist/index.js +19 -32
  4. package/dist/index.js.map +1 -1
  5. package/dist/tools/ads.d.ts +0 -2
  6. package/dist/tools/ads.d.ts.map +1 -1
  7. package/dist/tools/ads.js +38 -25
  8. package/dist/tools/ads.js.map +1 -1
  9. package/dist/tools/alma.d.ts +0 -2
  10. package/dist/tools/alma.d.ts.map +1 -1
  11. package/dist/tools/alma.js +24 -34
  12. package/dist/tools/alma.js.map +1 -1
  13. package/dist/tools/esasky.d.ts +2 -0
  14. package/dist/tools/esasky.d.ts.map +1 -0
  15. package/dist/tools/esasky.js +25 -0
  16. package/dist/tools/esasky.js.map +1 -0
  17. package/dist/tools/eso.d.ts +2 -0
  18. package/dist/tools/eso.d.ts.map +1 -0
  19. package/dist/tools/eso.js +34 -0
  20. package/dist/tools/eso.js.map +1 -0
  21. package/dist/tools/exoplanet.d.ts +2 -0
  22. package/dist/tools/exoplanet.d.ts.map +1 -0
  23. package/dist/tools/exoplanet.js +25 -0
  24. package/dist/tools/exoplanet.js.map +1 -0
  25. package/dist/tools/gaia.d.ts +0 -2
  26. package/dist/tools/gaia.d.ts.map +1 -1
  27. package/dist/tools/gaia.js +23 -26
  28. package/dist/tools/gaia.js.map +1 -1
  29. package/dist/tools/heasarc.d.ts +2 -0
  30. package/dist/tools/heasarc.d.ts.map +1 -0
  31. package/dist/tools/heasarc.js +31 -0
  32. package/dist/tools/heasarc.js.map +1 -0
  33. package/dist/tools/index.d.ts +1 -1
  34. package/dist/tools/index.d.ts.map +1 -1
  35. package/dist/tools/index.js +33 -70
  36. package/dist/tools/index.js.map +1 -1
  37. package/dist/tools/irsa.d.ts +2 -0
  38. package/dist/tools/irsa.d.ts.map +1 -0
  39. package/dist/tools/irsa.js +29 -0
  40. package/dist/tools/irsa.js.map +1 -0
  41. package/dist/tools/jpl.d.ts +2 -0
  42. package/dist/tools/jpl.d.ts.map +1 -0
  43. package/dist/tools/jpl.js +106 -0
  44. package/dist/tools/jpl.js.map +1 -0
  45. package/dist/tools/mast.d.ts +2 -0
  46. package/dist/tools/mast.d.ts.map +1 -0
  47. package/dist/tools/mast.js +100 -0
  48. package/dist/tools/mast.js.map +1 -0
  49. package/dist/tools/ned.d.ts +2 -0
  50. package/dist/tools/ned.d.ts.map +1 -0
  51. package/dist/tools/ned.js +58 -0
  52. package/dist/tools/ned.js.map +1 -0
  53. package/dist/tools/nist.d.ts +2 -0
  54. package/dist/tools/nist.d.ts.map +1 -0
  55. package/dist/tools/nist.js +151 -0
  56. package/dist/tools/nist.js.map +1 -0
  57. package/dist/tools/sdss.d.ts +2 -0
  58. package/dist/tools/sdss.d.ts.map +1 -0
  59. package/dist/tools/sdss.js +74 -0
  60. package/dist/tools/sdss.js.map +1 -0
  61. package/dist/tools/simbad.d.ts +0 -2
  62. package/dist/tools/simbad.d.ts.map +1 -1
  63. package/dist/tools/simbad.js +23 -24
  64. package/dist/tools/simbad.js.map +1 -1
  65. package/dist/tools/splatalogue.d.ts +2 -0
  66. package/dist/tools/splatalogue.d.ts.map +1 -0
  67. package/dist/tools/splatalogue.js +116 -0
  68. package/dist/tools/splatalogue.js.map +1 -0
  69. package/dist/tools/vizier.d.ts +0 -2
  70. package/dist/tools/vizier.d.ts.map +1 -1
  71. package/dist/tools/vizier.js +24 -32
  72. package/dist/tools/vizier.js.map +1 -1
  73. package/dist/utils/http.d.ts +34 -0
  74. package/dist/utils/http.d.ts.map +1 -0
  75. package/dist/utils/http.js +153 -0
  76. package/dist/utils/http.js.map +1 -0
  77. package/package.json +2 -3
  78. package/src/index.ts +31 -46
  79. package/src/tools/ads.ts +46 -31
  80. package/src/tools/alma.ts +27 -35
  81. package/src/tools/esasky.ts +34 -0
  82. package/src/tools/eso.ts +44 -0
  83. package/src/tools/exoplanet.ts +34 -0
  84. package/src/tools/gaia.ts +28 -29
  85. package/src/tools/heasarc.ts +37 -0
  86. package/src/tools/index.ts +34 -93
  87. package/src/tools/irsa.ts +42 -0
  88. package/src/tools/jpl.ts +129 -0
  89. package/src/tools/mast.ts +120 -0
  90. package/src/tools/ned.ts +64 -0
  91. package/src/tools/nist.ts +175 -0
  92. package/src/tools/sdss.ts +97 -0
  93. package/src/tools/simbad.ts +24 -29
  94. package/src/tools/splatalogue.ts +145 -0
  95. package/src/tools/vizier.ts +27 -35
  96. package/src/utils/http.ts +191 -0
  97. package/dist/tools/call.d.ts +0 -15
  98. package/dist/tools/call.d.ts.map +0 -1
  99. package/dist/tools/call.js +0 -31
  100. package/dist/tools/call.js.map +0 -1
  101. package/dist/utils/executor.d.ts +0 -12
  102. package/dist/utils/executor.d.ts.map +0 -1
  103. package/dist/utils/executor.js +0 -48
  104. package/dist/utils/executor.js.map +0 -1
  105. package/src/utils/executor.ts +0 -59
package/dist/index.d.ts CHANGED
File without changes
File without changes
package/dist/index.js CHANGED
@@ -1,44 +1,31 @@
1
1
  #!/usr/bin/env node
2
- import { program } from 'commander';
3
2
  import { startSseAndStreamableHttpMcpServer } from 'mcp-http-server';
4
3
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
4
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
- import { listTools } from './tools/index.js';
7
- const VERSION = '1.2.5';
8
- async function createMcpServer() {
9
- const server = new McpServer({
10
- name: 'astroquery-mcp',
11
- version: VERSION,
12
- }, {
13
- capabilities: {
14
- tools: {},
15
- },
16
- });
17
- await listTools(server);
5
+ import { registerAllTools } from './tools/index.js';
6
+ const VERSION = '2.0.0';
7
+ function createMcpServer() {
8
+ const server = new McpServer({ name: 'astroquery-mcp', version: VERSION }, { capabilities: { tools: {} } });
9
+ registerAllTools(server);
18
10
  return server;
19
11
  }
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')
26
- .action(async (options) => {
12
+ async function main() {
13
+ const args = process.argv.slice(2);
14
+ const portIdx = args.indexOf('--port');
15
+ const hostIdx = args.indexOf('--host');
16
+ const port = portIdx !== -1 ? parseInt(args[portIdx + 1], 10) : undefined;
17
+ const host = hostIdx !== -1 ? args[hostIdx + 1] : undefined;
27
18
  try {
28
- const server = await createMcpServer();
29
- if (options.port || options.host) {
30
- // HTTP mode with SSE support
19
+ if (port || host) {
31
20
  await startSseAndStreamableHttpMcpServer({
32
- host: options.host,
33
- port: parseInt(options.port),
34
- // @ts-ignore
35
- createMcpServer: async ({ headers }) => {
36
- return server;
37
- },
21
+ host,
22
+ port: port,
23
+ // @ts-ignore - createMcpServer signature mismatch
24
+ createMcpServer: async () => createMcpServer(),
38
25
  });
39
26
  }
40
27
  else {
41
- // stdio mode
28
+ const server = createMcpServer();
42
29
  const transport = new StdioServerTransport();
43
30
  await server.connect(transport);
44
31
  console.error('AstroQuery MCP server running on stdio');
@@ -48,6 +35,6 @@ program
48
35
  console.error('Fatal error:', error);
49
36
  process.exit(1);
50
37
  }
51
- });
52
- program.parse();
38
+ }
39
+ main();
53
40
  //# 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,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,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QAEvC,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjC,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"}
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"}
@@ -1,4 +1,2 @@
1
- declare let executeAdsQuery: (query?: string, lang?: string) => Promise<string>;
2
1
  export declare function registerAdsTools(server: any): void;
3
- export { executeAdsQuery };
4
2
  //# sourceMappingURL=ads.d.ts.map
@@ -1 +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"}
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 CHANGED
@@ -1,31 +1,44 @@
1
1
  import { z } from 'zod';
2
- import { executeAqc } from '../utils/executor.js';
3
- let executeAdsQuery;
2
+ import { restGet } from '../utils/http.js';
3
+ const ADS_API = 'https://api.adsabs.harvard.edu/v1/search/query';
4
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);
5
+ server.tool('ads_search', 'Search NASA ADS (Astrophysics Data System) for academic papers. Requires ADS_DEV_KEY or ADS_API_KEY env var.', {
6
+ query: z.string().describe('Search query (e.g. "author:Einstein", "title:dark matter", "abs:exoplanet")'),
7
+ max_results: z.number().default(10).describe('Maximum number of results'),
8
+ sort: z.string().default('date desc').describe('Sort order (e.g. "date desc", "citation_count desc")'),
9
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
10
+ }, async ({ query, max_results, sort, lang }) => {
11
+ const apiKey = process.env.ADS_DEV_KEY || process.env.ADS_API_KEY;
12
+ if (!apiKey) {
13
+ return { content: [{ type: 'text', text: lang === 'zh' ? '错误: 未设置 ADS_DEV_KEY 或 ADS_API_KEY 环境变量' : 'Error: ADS_DEV_KEY or ADS_API_KEY environment variable not set' }] };
14
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
- };
15
+ const params = new URLSearchParams({
16
+ q: query,
17
+ rows: String(max_results),
18
+ sort,
19
+ fl: 'title,author,year,bibcode,citation_count,abstract,pub,doi',
20
+ });
21
+ const data = await restGet(`${ADS_API}?${params}`, {
22
+ headers: { Authorization: `Bearer ${apiKey}` },
23
+ });
24
+ const docs = data?.response?.docs ?? [];
25
+ const total = data?.response?.numFound ?? 0;
26
+ if (docs.length === 0) {
27
+ return { content: [{ type: 'text', text: lang === 'zh' ? '未找到结果。' : 'No results found.' }] };
28
+ }
29
+ const lines = [];
30
+ lines.push(lang === 'zh' ? `## ADS 搜索结果 (共 ${total} 条,显示 ${docs.length} 条)\n` : `## ADS Search Results (${total} total, showing ${docs.length})\n`);
31
+ for (const doc of docs) {
32
+ const title = Array.isArray(doc.title) ? doc.title[0] : doc.title;
33
+ const authors = Array.isArray(doc.author) ? doc.author.slice(0, 3).join(', ') + (doc.author.length > 3 ? ' et al.' : '') : '';
34
+ lines.push(`**${title}**`);
35
+ lines.push(` ${authors} (${doc.year})`);
36
+ lines.push(` Bibcode: ${doc.bibcode} | Citations: ${doc.citation_count ?? 0}`);
37
+ if (doc.doi)
38
+ lines.push(` DOI: ${Array.isArray(doc.doi) ? doc.doi[0] : doc.doi}`);
39
+ lines.push('');
40
+ }
41
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
28
42
  });
29
43
  }
30
- export { executeAdsQuery };
31
44
  //# sourceMappingURL=ads.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"ads.js","sourceRoot":"","sources":["../../src/tools/ads.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,2 @@
1
- declare let executeAlmaQuery: (ra?: number, dec?: number, radius?: number, catalog?: string, lang?: string) => Promise<string>;
2
1
  export declare function registerAlmaTools(server: any): void;
3
- export { executeAlmaQuery };
4
2
  //# sourceMappingURL=alma.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"alma.d.ts","sourceRoot":"","sources":["../../src/tools/alma.ts"],"names":[],"mappings":"AAGA,QAAA,IAAI,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,QAuC5C;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"alma.d.ts","sourceRoot":"","sources":["../../src/tools/alma.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,QAiC5C"}
@@ -1,40 +1,30 @@
1
1
  import { z } from 'zod';
2
- import { executeAqc } from '../utils/executor.js';
3
- let executeAlmaQuery;
2
+ import { tapQuery, formatTapResult } from '../utils/http.js';
3
+ const ALMA_TAP = 'https://almascience.eso.org/tap/sync';
4
4
  export function registerAlmaTools(server) {
5
- executeAlmaQuery = async (ra, dec, radius, catalog, lang) => {
6
- const args = ['alma', 'query'];
7
- if (ra !== undefined)
8
- args.push('--ra', ra.toString());
9
- if (dec !== undefined)
10
- args.push('--dec', dec.toString());
11
- if (radius !== undefined)
12
- args.push('--radius', radius.toString());
13
- if (catalog)
14
- args.push('--catalog', catalog);
15
- if (lang)
16
- args.push('--lang', lang);
17
- const result = await executeAqc(args);
18
- if (!result.success) {
19
- throw new Error(result.error);
5
+ server.tool('alma_query', 'Query ALMA (Atacama Large Millimeter Array) archive by object name or coordinates', {
6
+ target: z.string().optional().describe('Object name (e.g. "M83", "NGC 253")'),
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 arcminutes'),
10
+ max_results: z.number().default(50).describe('Maximum number of results'),
11
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
12
+ }, async ({ target, ra, dec, radius, max_results, lang }) => {
13
+ if (!target && (ra === undefined || dec === undefined)) {
14
+ return { content: [{ type: 'text', text: lang === 'zh' ? '请提供目标名称或坐标 (ra + dec)' : 'Please provide a target name or coordinates (ra + dec)' }] };
20
15
  }
21
- return result.output || '';
22
- };
23
- server.tool('alma_query', 'Query ALMA archive for observations', {
24
- ra: z.number().optional().describe('Right Ascension (degrees)'),
25
- dec: z.number().optional().describe('Declination (degrees)'),
26
- radius: z.number().optional().describe('Search radius (degrees)'),
27
- catalog: z.string().optional().describe('Specific catalog to search'),
28
- lang: z.enum(['en', 'zh']).optional().describe('Output language'),
29
- }, async ({ ra, dec, radius, catalog, lang }) => {
30
- const output = await executeAlmaQuery(ra, dec, radius, catalog, lang);
31
- return {
32
- content: [{
33
- type: 'text',
34
- text: output
35
- }]
36
- };
16
+ const radiusDeg = radius / 60;
17
+ let where;
18
+ if (ra !== undefined && dec !== undefined) {
19
+ where = `CONTAINS(POINT('ICRS', s_ra, s_dec), CIRCLE('ICRS', ${ra}, ${dec}, ${radiusDeg})) = 1`;
20
+ }
21
+ else {
22
+ where = `target_name = '${target.replace(/'/g, "''")}'`;
23
+ }
24
+ const adql = `SELECT TOP ${max_results} target_name, s_ra, s_dec, frequency, bandwidth, t_exptime, instrument_name, proposal_id, obs_id FROM ivoa.obscore WHERE ${where}`;
25
+ const result = await tapQuery({ endpoint: ALMA_TAP, adql, maxrec: max_results });
26
+ const title = lang === 'zh' ? `ALMA 查询结果: ${target ?? `${ra}, ${dec}`}` : `ALMA Query Result: ${target ?? `${ra}, ${dec}`}`;
27
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
37
28
  });
38
29
  }
39
- export { executeAlmaQuery };
40
30
  //# sourceMappingURL=alma.js.map
@@ -1 +1 @@
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,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,IAAI,gBAAkH,CAAC;AAEvH,MAAM,UAAU,iBAAiB,CAAC,MAAW;IAC3C,gBAAgB,GAAG,KAAK,EAAE,EAAW,EAAE,GAAY,EAAE,MAAe,EAAE,OAAgB,EAAE,IAAa,EAAE,EAAE;QACvG,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,IAAI,EAAE,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,IAAI,GAAG,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC7C,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,YAAY,EACZ,qCAAqC,EACrC;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC/D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACjE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACrE,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,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAO,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEtE,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,gBAAgB,EAAE,CAAC"}
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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerEsaskyTools(server: any): void;
2
+ //# sourceMappingURL=esasky.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esasky.d.ts","sourceRoot":"","sources":["../../src/tools/esasky.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,QA4B9C"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import { tapQuery, formatTapResult } from '../utils/http.js';
3
+ const ESASKY_TAP = 'https://sky.esa.int/esasky-tap/tap/sync';
4
+ export function registerEsaskyTools(server) {
5
+ server.tool('esasky_query', 'Query ESASky archive for astronomical observations by position and radius', {
6
+ ra: z.number().describe('Right Ascension in degrees (0-360)'),
7
+ dec: z.number().describe('Declination in degrees (-90 to 90)'),
8
+ radius: z.number().default(10).describe('Search radius in arcminutes'),
9
+ mission: z.string().default('all').describe('Mission name (e.g. "XMM", "HST", "Herschel", "all")'),
10
+ max_results: z.number().default(50).describe('Maximum number of results'),
11
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
12
+ }, async ({ ra, dec, radius, mission, max_results, lang }) => {
13
+ const radiusDeg = radius / 60;
14
+ let tableName = 'ivoa.obscore';
15
+ let missionFilter = '';
16
+ if (mission !== 'all') {
17
+ missionFilter = ` AND obs_collection = '${mission.replace(/'/g, "''")}'`;
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})`;
22
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
23
+ });
24
+ }
25
+ //# sourceMappingURL=esasky.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esasky.js","sourceRoot":"","sources":["../../src/tools/esasky.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,UAAU,GAAG,yCAAyC,CAAC;AAE7D,MAAM,UAAU,mBAAmB,CAAC,MAAW;IAC7C,MAAM,CAAC,IAAI,CACT,cAAc,EACd,2EAA2E,EAC3E;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC7D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC9D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACtE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAClG,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,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAmG,EAAE,EAAE;QACzJ,MAAM,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;QAC9B,IAAI,SAAS,GAAG,cAAc,CAAC;QAC/B,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,aAAa,GAAG,0BAA0B,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;QAC3E,CAAC;QAED,MAAM,IAAI,GAAG,cAAc,WAAW,kGAAkG,SAAS,8DAA8D,EAAE,KAAK,GAAG,KAAK,SAAS,SAAS,aAAa,EAAE,CAAC;QAEhQ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,yBAAyB,EAAE,KAAK,GAAG,GAAG,CAAC;QACtG,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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerEsoTools(server: any): void;
2
+ //# sourceMappingURL=eso.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eso.d.ts","sourceRoot":"","sources":["../../src/tools/eso.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,QAsC3C"}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ import { tapQuery, formatTapResult } from '../utils/http.js';
3
+ const ESO_TAP = 'http://archive.eso.org/tap_obs/sync';
4
+ export function registerEsoTools(server) {
5
+ server.tool('eso_query', 'Query ESO (European Southern Observatory) science archive by target, instrument, or coordinates', {
6
+ target: z.string().optional().describe('Target object name (e.g. "NGC 1068")'),
7
+ instrument: z.string().optional().describe('Instrument name (e.g. "UVES", "XSHOOTER", "MUSE")'),
8
+ ra: z.number().optional().describe('Right Ascension in degrees'),
9
+ dec: z.number().optional().describe('Declination in degrees'),
10
+ radius: z.number().default(10).describe('Search radius in arcminutes'),
11
+ max_results: z.number().default(50).describe('Maximum number of results'),
12
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
13
+ }, async ({ target, instrument, ra, dec, radius, max_results, lang }) => {
14
+ const conditions = [];
15
+ if (target) {
16
+ conditions.push(`target = '${target.replace(/'/g, "''")}'`);
17
+ }
18
+ if (instrument) {
19
+ conditions.push(`instrument = '${instrument.replace(/'/g, "''")}'`);
20
+ }
21
+ if (ra !== undefined && dec !== undefined) {
22
+ const radiusDeg = radius / 60;
23
+ conditions.push(`CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', ${ra}, ${dec}, ${radiusDeg})) = 1`);
24
+ }
25
+ if (conditions.length === 0) {
26
+ return { content: [{ type: 'text', text: lang === 'zh' ? '请至少提供一个查询条件 (target, instrument, 或坐标)' : 'Please provide at least one search criterion (target, instrument, or coordinates)' }] };
27
+ }
28
+ const adql = `SELECT TOP ${max_results} target, ra, dec, instrument, filter, exptime, date_obs, prog_id, dp_id FROM dbo.raw WHERE ${conditions.join(' AND ')}`;
29
+ const result = await tapQuery({ endpoint: ESO_TAP, adql, maxrec: max_results });
30
+ const title = lang === 'zh' ? `ESO 档案查询结果` : `ESO Archive Query Result`;
31
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
32
+ });
33
+ }
34
+ //# sourceMappingURL=eso.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eso.js","sourceRoot":"","sources":["../../src/tools/eso.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,OAAO,GAAG,qCAAqC,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAAC,MAAW;IAC1C,MAAM,CAAC,IAAI,CACT,WAAW,EACX,iGAAiG,EACjG;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC/F,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAChE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACtE,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,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAA0H,EAAE,EAAE;QAC3L,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,EAAE,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,mDAAmD,EAAE,KAAK,GAAG,KAAK,SAAS,QAAQ,CAAC,CAAC;QACvG,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,mFAAmF,EAAE,CAAC,EAAE,CAAC;QACvM,CAAC;QAED,MAAM,IAAI,GAAG,cAAc,WAAW,8FAA8F,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAE/J,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC;QACxE,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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerExoplanetTools(server: any): void;
2
+ //# sourceMappingURL=exoplanet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exoplanet.d.ts","sourceRoot":"","sources":["../../src/tools/exoplanet.ts"],"names":[],"mappings":"AAKA,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,QA4BjD"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import { tapQuery, formatTapResult } from '../utils/http.js';
3
+ const EXOPLANET_TAP = 'https://exoplanetarchive.ipac.caltech.edu/TAP/sync';
4
+ export function registerExoplanetTools(server) {
5
+ server.tool('exoplanet_query', 'Query NASA Exoplanet Archive for confirmed exoplanet data', {
6
+ planet_name: z.string().optional().describe('Planet name (e.g. "Kepler-22 b", "TRAPPIST-1 e")'),
7
+ hostname: z.string().optional().describe('Host star name (e.g. "TRAPPIST-1", "Kepler-22")'),
8
+ max_results: z.number().default(50).describe('Maximum number of results'),
9
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
10
+ }, async ({ planet_name, hostname, max_results, lang }) => {
11
+ const conditions = [];
12
+ if (planet_name) {
13
+ conditions.push(`pl_name = '${planet_name.replace(/'/g, "''")}'`);
14
+ }
15
+ if (hostname) {
16
+ conditions.push(`hostname = '${hostname.replace(/'/g, "''")}'`);
17
+ }
18
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
19
+ const adql = `SELECT TOP ${max_results} pl_name, hostname, discoverymethod, disc_year, pl_orbper, pl_rade, pl_bmasse, pl_eqt, st_teff, st_rad, st_mass, sy_dist FROM ps ${where} ORDER BY disc_year DESC`;
20
+ const result = await tapQuery({ endpoint: EXOPLANET_TAP, adql, maxrec: max_results });
21
+ const title = lang === 'zh' ? `系外行星查询结果` : `Exoplanet Query Result`;
22
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
23
+ });
24
+ }
25
+ //# sourceMappingURL=exoplanet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exoplanet.js","sourceRoot":"","sources":["../../src/tools/exoplanet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,aAAa,GAAG,oDAAoD,CAAC;AAE3E,MAAM,UAAU,sBAAsB,CAAC,MAAW;IAChD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,2DAA2D,EAC3D;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC3F,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,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAkF,EAAE,EAAE;QACrI,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,WAAW,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,GAAG,cAAc,WAAW,oIAAoI,KAAK,0BAA0B,CAAC;QAE1M,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC;QACpE,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"}
@@ -1,4 +1,2 @@
1
- declare let executeGaiaConeSearch: (ra: number, dec: number, radius?: number, lang?: string) => Promise<string>;
2
1
  export declare function registerGaiaTools(server: any): void;
3
- export { executeGaiaConeSearch };
4
2
  //# sourceMappingURL=gaia.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gaia.d.ts","sourceRoot":"","sources":["../../src/tools/gaia.ts"],"names":[],"mappings":"AAGA,QAAA,IAAI,qBAAqB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAExG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,QAkC5C;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"gaia.d.ts","sourceRoot":"","sources":["../../src/tools/gaia.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,QAmC5C"}
@@ -1,31 +1,28 @@
1
1
  import { z } from 'zod';
2
- import { executeAqc } from '../utils/executor.js';
3
- let executeGaiaConeSearch;
2
+ import { tapQuery, formatTapResult } from '../utils/http.js';
3
+ const GAIA_TAP = 'https://gea.esac.esa.int/tap-server/tap/sync';
4
4
  export function registerGaiaTools(server) {
5
- executeGaiaConeSearch = async (ra, dec, radius, lang) => {
6
- const args = ['gaia', 'cone-search', '--ra', ra.toString(), '--dec', dec.toString(), '--radius', (radius || 1).toString()];
7
- if (lang)
8
- args.push('--lang', lang);
9
- const result = await executeAqc(args);
10
- if (!result.success) {
11
- throw new Error(result.error);
12
- }
13
- return result.output || '';
14
- };
15
- server.tool('gaia_cone_search', 'Query Gaia archive via cone search', {
16
- ra: z.number().describe('Right Ascension (degrees)'),
17
- dec: z.number().describe('Declination (degrees)'),
18
- radius: z.number().optional().default(1).describe('Search radius (degrees)'),
19
- lang: z.enum(['en', 'zh']).optional().describe('Output language'),
20
- }, async ({ ra, dec, radius, lang }) => {
21
- const output = await executeGaiaConeSearch(ra, dec, radius, lang);
22
- return {
23
- content: [{
24
- type: 'text',
25
- text: output
26
- }]
27
- };
5
+ server.tool('gaia_cone_search', 'Cone search on Gaia DR3 catalog by coordinates and radius', {
6
+ ra: z.number().describe('Right Ascension in degrees (0-360)'),
7
+ dec: z.number().describe('Declination in degrees (-90 to 90)'),
8
+ radius: z.number().default(5).describe('Search radius in arcseconds'),
9
+ max_results: z.number().default(50).describe('Maximum number of results'),
10
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
11
+ }, async ({ ra, dec, radius, max_results, lang }) => {
12
+ const radiusDeg = radius / 3600;
13
+ const adql = `SELECT TOP ${max_results} source_id, ra, dec, parallax, pmra, pmdec, phot_g_mean_mag, bp_rp, radial_velocity, teff_gspphot FROM gaiadr3.gaia_source WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', ${ra}, ${dec}, ${radiusDeg})) = 1 ORDER BY phot_g_mean_mag ASC`;
14
+ const result = await tapQuery({ endpoint: GAIA_TAP, adql, maxrec: max_results });
15
+ const title = lang === 'zh' ? `Gaia DR3 锥形搜索: (${ra}, ${dec})` : `Gaia DR3 Cone Search: (${ra}, ${dec})`;
16
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
17
+ });
18
+ server.tool('gaia_adql', 'Execute a raw ADQL query on the Gaia archive', {
19
+ adql: z.string().describe('ADQL query string'),
20
+ max_results: z.number().default(100).describe('Maximum number of results'),
21
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
22
+ }, async ({ adql, max_results, lang }) => {
23
+ const result = await tapQuery({ endpoint: GAIA_TAP, adql, maxrec: max_results });
24
+ const title = lang === 'zh' ? 'Gaia ADQL 查询结果' : 'Gaia ADQL Query Result';
25
+ return { content: [{ type: 'text', text: formatTapResult(result, title) }] };
28
26
  });
29
27
  }
30
- export { executeGaiaConeSearch };
31
28
  //# sourceMappingURL=gaia.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gaia.js","sourceRoot":"","sources":["../../src/tools/gaia.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,IAAI,qBAAmG,CAAC;AAExG,MAAM,UAAU,iBAAiB,CAAC,MAAW;IAC3C,qBAAqB,GAAG,KAAK,EAAE,EAAU,EAAE,GAAW,EAAE,MAAe,EAAE,IAAa,EAAE,EAAE;QACxF,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3H,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,kBAAkB,EAClB,oCAAoC,EACpC;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACpD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACjD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC5E,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,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAO,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAElE,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,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"gaia.js","sourceRoot":"","sources":["../../src/tools/gaia.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,8CAA8C,CAAC;AAEhE,MAAM,UAAU,iBAAiB,CAAC,MAAW;IAC3C,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2DAA2D,EAC3D;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC7D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC9D,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,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAkF,EAAE,EAAE;QAC/H,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;QAChC,MAAM,IAAI,GAAG,cAAc,WAAW,oLAAoL,EAAE,KAAK,GAAG,KAAK,SAAS,qCAAqC,CAAC;QAExR,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,mBAAmB,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,0BAA0B,EAAE,KAAK,GAAG,GAAG,CAAC;QACzG,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;IAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,8CAA8C,EAC9C;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1E,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,IAAI,EAAE,WAAW,EAAE,IAAI,EAAuD,EAAE,EAAE;QACzF,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,gBAAgB,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAC1E,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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerHeasarcTools(server: any): void;
2
+ //# sourceMappingURL=heasarc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heasarc.d.ts","sourceRoot":"","sources":["../../src/tools/heasarc.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,QA+B/C"}
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import { tapQuery, formatTapResult } from '../utils/http.js';
3
+ const HEASARC_TAP = 'https://heasarc.gsfc.nasa.gov/xamin/vo/tap/sync';
4
+ export function registerHeasarcTools(server) {
5
+ server.tool('heasarc_query', 'Query HEASARC (High Energy Astrophysics Science Archive) by object name and mission catalog', {
6
+ object_name: z.string().describe('Object name (e.g. "Crab Nebula", "Cyg X-1")'),
7
+ mission: z.string().default('xmmmaster').describe('Mission/catalog table (e.g. "xmmmaster", "chanmaster", "swiftmastr", "rosmaster")'),
8
+ radius: z.number().default(10).describe('Search radius in arcminutes'),
9
+ max_results: z.number().default(50).describe('Maximum number of results'),
10
+ lang: z.enum(['en', 'zh']).default('en').describe('Output language'),
11
+ }, async ({ object_name, mission, radius, max_results, lang }) => {
12
+ // HEASARC TAP uses name resolver internally via a special function
13
+ // We query the mission table with a cone search around resolved coordinates
14
+ // First try a simple name-based query
15
+ const radiusDeg = radius / 60;
16
+ const adql = `SELECT TOP ${max_results} * FROM ${mission} WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', COORD1(SIMBAD('${object_name.replace(/'/g, "''")}')), COORD2(SIMBAD('${object_name.replace(/'/g, "''")}')), ${radiusDeg})) = 1`;
17
+ try {
18
+ const result = await tapQuery({ endpoint: HEASARC_TAP, adql, maxrec: max_results });
19
+ const title = lang === 'zh' ? `HEASARC 查询结果: ${object_name} (${mission})` : `HEASARC Query Result: ${object_name} (${mission})`;
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
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=heasarc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heasarc.js","sourceRoot":"","sources":["../../src/tools/heasarc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,WAAW,GAAG,iDAAiD,CAAC;AAEtE,MAAM,UAAU,oBAAoB,CAAC,MAAW;IAC9C,MAAM,CAAC,IAAI,CACT,eAAe,EACf,6FAA6F,EAC7F;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC/E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,mFAAmF,CAAC;QACtI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACtE,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,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAA+F,EAAE,EAAE;QACzJ,mEAAmE;QACnE,4EAA4E;QAC5E,sCAAsC;QACtC,MAAM,SAAS,GAAG,MAAM,GAAG,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,cAAc,WAAW,WAAW,OAAO,yEAAyE,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,uBAAuB,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,SAAS,QAAQ,CAAC;QAEhP,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACpF,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,WAAW,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,yBAAyB,WAAW,KAAK,OAAO,GAAG,CAAC;YAChI,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;YACzD,MAAM,YAAY,GAAG,cAAc,WAAW,WAAW,OAAO,sBAAsB,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;YAC5I,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAClG,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,WAAW,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,yBAAyB,WAAW,KAAK,OAAO,GAAG,CAAC;YAChI,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACxF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function listTools(mcpServer: McpServer): Promise<void>;
2
+ export declare function registerAllTools(server: McpServer): void;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAsB,SAAS,CAAC,SAAS,EAAE,SAAS,iBA0FnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAiBjD"}