mcp-cnbs 1.0.2

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 (57) hide show
  1. package/License +201 -0
  2. package/README.md +226 -0
  3. package/README.zh-CN.md +225 -0
  4. package/dist/constants/index.d.ts +3 -0
  5. package/dist/constants/index.d.ts.map +1 -0
  6. package/dist/constants/index.js +3 -0
  7. package/dist/constants/index.js.map +1 -0
  8. package/dist/constants/regions.d.ts +16 -0
  9. package/dist/constants/regions.d.ts.map +1 -0
  10. package/dist/constants/regions.js +68 -0
  11. package/dist/constants/regions.js.map +1 -0
  12. package/dist/constants.d.ts +7 -0
  13. package/dist/constants.d.ts.map +1 -0
  14. package/dist/constants.js +7 -0
  15. package/dist/constants.js.map +1 -0
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +306 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/server.d.ts +3 -0
  21. package/dist/server.d.ts.map +1 -0
  22. package/dist/server.js +44 -0
  23. package/dist/server.js.map +1 -0
  24. package/dist/services/api.d.ts +47 -0
  25. package/dist/services/api.d.ts.map +1 -0
  26. package/dist/services/api.js +434 -0
  27. package/dist/services/api.js.map +1 -0
  28. package/dist/services/cache.d.ts +48 -0
  29. package/dist/services/cache.d.ts.map +1 -0
  30. package/dist/services/cache.js +215 -0
  31. package/dist/services/cache.js.map +1 -0
  32. package/dist/services/data.d.ts +16 -0
  33. package/dist/services/data.d.ts.map +1 -0
  34. package/dist/services/data.js +90 -0
  35. package/dist/services/data.js.map +1 -0
  36. package/dist/services/error.d.ts +44 -0
  37. package/dist/services/error.d.ts.map +1 -0
  38. package/dist/services/error.js +171 -0
  39. package/dist/services/error.js.map +1 -0
  40. package/dist/services/search.d.ts +18 -0
  41. package/dist/services/search.d.ts.map +1 -0
  42. package/dist/services/search.js +39 -0
  43. package/dist/services/search.js.map +1 -0
  44. package/dist/tools/index.d.ts +3 -0
  45. package/dist/tools/index.d.ts.map +1 -0
  46. package/dist/tools/index.js +686 -0
  47. package/dist/tools/index.js.map +1 -0
  48. package/dist/types/index.d.ts +182 -0
  49. package/dist/types/index.d.ts.map +1 -0
  50. package/dist/types/index.js +16 -0
  51. package/dist/types/index.js.map +1 -0
  52. package/dist/worker.d.ts +17 -0
  53. package/dist/worker.d.ts.map +1 -0
  54. package/dist/worker.js +262 -0
  55. package/dist/worker.js.map +1 -0
  56. package/llms.txt +603 -0
  57. package/package.json +63 -0
@@ -0,0 +1,68 @@
1
+ export const CNBS_REGIONS = [
2
+ { code: '000000000000', name: '全国', shortName: '全国', level: 'province' },
3
+ { code: '110000000000', name: '北京市', shortName: '北京', level: 'province' },
4
+ { code: '120000000000', name: '天津市', shortName: '天津', level: 'province' },
5
+ { code: '130000000000', name: '河北省', shortName: '河北', level: 'province' },
6
+ { code: '140000000000', name: '山西省', shortName: '山西', level: 'province' },
7
+ { code: '150000000000', name: '内蒙古自治区', shortName: '内蒙古', level: 'province' },
8
+ { code: '210000000000', name: '辽宁省', shortName: '辽宁', level: 'province' },
9
+ { code: '220000000000', name: '吉林省', shortName: '吉林', level: 'province' },
10
+ { code: '230000000000', name: '黑龙江省', shortName: '黑龙江', level: 'province' },
11
+ { code: '310000000000', name: '上海市', shortName: '上海', level: 'province' },
12
+ { code: '320000000000', name: '江苏省', shortName: '江苏', level: 'province' },
13
+ { code: '330000000000', name: '浙江省', shortName: '浙江', level: 'province' },
14
+ { code: '340000000000', name: '安徽省', shortName: '安徽', level: 'province' },
15
+ { code: '350000000000', name: '福建省', shortName: '福建', level: 'province' },
16
+ { code: '360000000000', name: '江西省', shortName: '江西', level: 'province' },
17
+ { code: '370000000000', name: '山东省', shortName: '山东', level: 'province' },
18
+ { code: '410000000000', name: '河南省', shortName: '河南', level: 'province' },
19
+ { code: '420000000000', name: '湖北省', shortName: '湖北', level: 'province' },
20
+ { code: '430000000000', name: '湖南省', shortName: '湖南', level: 'province' },
21
+ { code: '440000000000', name: '广东省', shortName: '广东', level: 'province' },
22
+ { code: '450000000000', name: '广西壮族自治区', shortName: '广西', level: 'province' },
23
+ { code: '460000000000', name: '海南省', shortName: '海南', level: 'province' },
24
+ { code: '500000000000', name: '重庆市', shortName: '重庆', level: 'province' },
25
+ { code: '510000000000', name: '四川省', shortName: '四川', level: 'province' },
26
+ { code: '520000000000', name: '贵州省', shortName: '贵州', level: 'province' },
27
+ { code: '530000000000', name: '云南省', shortName: '云南', level: 'province' },
28
+ { code: '540000000000', name: '西藏自治区', shortName: '西藏', level: 'province' },
29
+ { code: '610000000000', name: '陕西省', shortName: '陕西', level: 'province' },
30
+ { code: '620000000000', name: '甘肃省', shortName: '甘肃', level: 'province' },
31
+ { code: '630000000000', name: '青海省', shortName: '青海', level: 'province' },
32
+ { code: '640000000000', name: '宁夏回族自治区', shortName: '宁夏', level: 'province' },
33
+ { code: '650000000000', name: '新疆维吾尔自治区', shortName: '新疆', level: 'province' },
34
+ { code: '710000000000', name: '台湾省', shortName: '台湾', level: 'province' },
35
+ { code: '810000000000', name: '香港特别行政区', shortName: '香港', level: 'province' },
36
+ { code: '820000000000', name: '澳门特别行政区', shortName: '澳门', level: 'province' },
37
+ ];
38
+ export const CNBS_CATEGORY_INFO = {
39
+ '1': { name: '月度数据', code: '1', dtType: 'MM' },
40
+ '2': { name: '季度数据', code: '2', dtType: 'SS' },
41
+ '3': { name: '年度数据', code: '3', dtType: 'YY' },
42
+ '5': { name: '分省季度数据', code: '5', dtType: 'SS' },
43
+ '6': { name: '分省年度数据', code: '6', dtType: 'YY' },
44
+ '7': { name: '其他数据', code: '7', dtType: 'YY' },
45
+ '8': { name: '主要城市年度数据', code: '8', dtType: 'YY' },
46
+ '9': { name: '港澳台月度数据', code: '9', dtType: 'MM' },
47
+ '10': { name: '港澳台年度数据', code: '10', dtType: 'YY' },
48
+ '11': { name: '主要国家(地区)月度数据', code: '11', dtType: 'MM' },
49
+ '12': { name: '三大经济体月度数据', code: '12', dtType: 'MM' },
50
+ '14': { name: '主要国家(地区)年度数据', code: '14', dtType: 'YY' },
51
+ '32': { name: '澳门特别行政区年度数据', code: '32', dtType: 'YY' },
52
+ };
53
+ export function getRegionByCode(code) {
54
+ return CNBS_REGIONS.find(r => r.code === code);
55
+ }
56
+ export function getRegionByName(name) {
57
+ return CNBS_REGIONS.find(r => r.name === name ||
58
+ r.shortName === name ||
59
+ r.name.includes(name) ||
60
+ name.includes(r.shortName));
61
+ }
62
+ export function searchRegions(keyword) {
63
+ const lowerKeyword = keyword.toLowerCase();
64
+ return CNBS_REGIONS.filter(r => r.name.toLowerCase().includes(lowerKeyword) ||
65
+ r.shortName.toLowerCase().includes(lowerKeyword) ||
66
+ r.code.includes(keyword));
67
+ }
68
+ //# sourceMappingURL=regions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regions.js","sourceRoot":"","sources":["../../src/constants/regions.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACxE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE;IAC7E,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE;IAC3E,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IAC7E,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IAC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"}
@@ -0,0 +1,7 @@
1
+ export declare const CNBS_API_BASE = "https://data.stats.gov.cn/dg/website/publicrelease/web/external";
2
+ export declare const CNBS_TEXT_LIMIT = 25000;
3
+ export declare const CNBS_NODE_CACHE_TTL: number;
4
+ export declare const CNBS_METRIC_CACHE_TTL: number;
5
+ export declare const CNBS_DATA_CACHE_TTL: number;
6
+ export declare const CNBS_DEFAULT_ROOT = "fc982599aa684be7969d7b90b1bd0e84";
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,oEAAoE,CAAC;AAE/F,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC,eAAO,MAAM,mBAAmB,QAAsB,CAAC;AACvD,eAAO,MAAM,qBAAqB,QAAsB,CAAC;AACzD,eAAO,MAAM,mBAAmB,QAAiB,CAAC;AAElD,eAAO,MAAM,iBAAiB,qCAAqC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const CNBS_API_BASE = 'https://data.stats.gov.cn/dg/website/publicrelease/web/external';
2
+ export const CNBS_TEXT_LIMIT = 25000;
3
+ export const CNBS_NODE_CACHE_TTL = 24 * 60 * 60 * 1000;
4
+ export const CNBS_METRIC_CACHE_TTL = 12 * 60 * 60 * 1000;
5
+ export const CNBS_DATA_CACHE_TTL = 60 * 60 * 1000;
6
+ export const CNBS_DEFAULT_ROOT = 'fc982599aa684be7969d7b90b1bd0e84';
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,iEAAiE,CAAC;AAE/F,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AAErC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,MAAM,CAAC,MAAM,iBAAiB,GAAG,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# 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,306 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
5
+ import { Command } from 'commander';
6
+ import http from 'http';
7
+ import { createCnbsServer } from './server.js';
8
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
9
+ function checkAuth(authToken, authHeader) {
10
+ if (!authToken) {
11
+ return { authorized: true };
12
+ }
13
+ if (!authHeader) {
14
+ return { authorized: false, error: 'Missing Authorization header. Please provide: Authorization: Bearer <token>' };
15
+ }
16
+ const match = authHeader.match(/^Bearer\s+(.+)$/i);
17
+ if (!match) {
18
+ return { authorized: false, error: 'Invalid Authorization format. Use: Bearer <token>' };
19
+ }
20
+ const token = match[1];
21
+ if (token !== authToken) {
22
+ return { authorized: false, error: 'Invalid token. Please check your authentication token.' };
23
+ }
24
+ return { authorized: true };
25
+ }
26
+ const corsHeaders = {
27
+ 'Access-Control-Allow-Origin': '*',
28
+ 'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
29
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version',
30
+ };
31
+ async function launchCnbsServer() {
32
+ const program = new Command();
33
+ program
34
+ .option('-p, --port <port>', 'Port to listen on for HTTP/SSE mode')
35
+ .option('-H, --host <host>', 'Host to listen on for HTTP/SSE mode', '127.0.0.1')
36
+ .option('-a, --auth-token <token>', 'Authorization token for HTTP mode (or use MCP_CNBS_AUTH_TOKEN env var)')
37
+ .parse();
38
+ const options = program.opts();
39
+ const authToken = options.authToken || process.env.MCP_CNBS_AUTH_TOKEN;
40
+ if (options.port) {
41
+ const port = parseInt(options.port, 10);
42
+ const transports = new Map();
43
+ const sseTransports = new Map();
44
+ if (authToken) {
45
+ console.error(`CNBS MCP HTTP server running on ${options.host}:${port} with authentication enabled`);
46
+ console.error('Authorization: Bearer <token> required');
47
+ }
48
+ else {
49
+ console.error(`CNBS MCP HTTP server running on ${options.host}:${port} (no authentication)`);
50
+ }
51
+ const server = http.createServer(async (req, res) => {
52
+ const url = new URL(req.url || '/', `http://${req.headers.host}`);
53
+ if (req.method === 'OPTIONS') {
54
+ res.writeHead(204, corsHeaders);
55
+ res.end();
56
+ return;
57
+ }
58
+ const authResult = checkAuth(authToken, req.headers.authorization);
59
+ if (!authResult.authorized) {
60
+ res.writeHead(401, { 'Content-Type': 'application/json', ...corsHeaders });
61
+ res.end(JSON.stringify({
62
+ jsonrpc: '2.0',
63
+ error: { code: -32600, message: `Authentication failed: ${authResult.error}` },
64
+ id: null
65
+ }));
66
+ return;
67
+ }
68
+ // SSE endpoint
69
+ if (url.pathname === '/sse' || url.pathname === '/sse/') {
70
+ if (req.method !== 'GET') {
71
+ res.writeHead(405, { 'Content-Type': 'application/json', ...corsHeaders });
72
+ res.end(JSON.stringify({
73
+ jsonrpc: '2.0',
74
+ error: { code: -32601, message: 'Method not allowed. Use GET for SSE endpoint.' },
75
+ id: null
76
+ }));
77
+ return;
78
+ }
79
+ const transport = new SSEServerTransport('/message', res);
80
+ sseTransports.set(transport.sessionId, transport);
81
+ res.on('close', () => {
82
+ sseTransports.delete(transport.sessionId);
83
+ });
84
+ const mcpServer = createCnbsServer();
85
+ await mcpServer.connect(transport);
86
+ return;
87
+ }
88
+ // SSE message endpoint
89
+ if (url.pathname === '/message') {
90
+ if (req.method !== 'POST') {
91
+ res.writeHead(405, { 'Content-Type': 'application/json', ...corsHeaders });
92
+ res.end(JSON.stringify({
93
+ jsonrpc: '2.0',
94
+ error: { code: -32601, message: 'Method not allowed. Use POST for message endpoint.' },
95
+ id: null
96
+ }));
97
+ return;
98
+ }
99
+ const sessionId = url.searchParams.get('sessionId');
100
+ if (!sessionId) {
101
+ res.writeHead(400, { 'Content-Type': 'application/json', ...corsHeaders });
102
+ res.end(JSON.stringify({
103
+ jsonrpc: '2.0',
104
+ error: { code: -32600, message: 'Missing sessionId parameter' },
105
+ id: null
106
+ }));
107
+ return;
108
+ }
109
+ const transport = sseTransports.get(sessionId);
110
+ if (!transport) {
111
+ res.writeHead(404, { 'Content-Type': 'application/json', ...corsHeaders });
112
+ res.end(JSON.stringify({
113
+ jsonrpc: '2.0',
114
+ error: { code: -32001, message: 'Session not found' },
115
+ id: null
116
+ }));
117
+ return;
118
+ }
119
+ let body = null;
120
+ try {
121
+ body = await new Promise((resolve, reject) => {
122
+ let data = '';
123
+ req.on('data', chunk => data += chunk);
124
+ req.on('end', () => {
125
+ try {
126
+ resolve(JSON.parse(data));
127
+ }
128
+ catch {
129
+ resolve(null);
130
+ }
131
+ });
132
+ req.on('error', reject);
133
+ });
134
+ }
135
+ catch (error) {
136
+ res.writeHead(500, { 'Content-Type': 'application/json', ...corsHeaders });
137
+ res.end(JSON.stringify({
138
+ jsonrpc: '2.0',
139
+ error: { code: -32603, message: 'Internal error reading request body' },
140
+ id: null
141
+ }));
142
+ return;
143
+ }
144
+ await transport.handlePostMessage(req, res, body);
145
+ return;
146
+ }
147
+ // Streamable HTTP endpoints
148
+ const sessionId = req.headers['mcp-session-id'];
149
+ if (sessionId) {
150
+ const transport = transports.get(sessionId);
151
+ if (!transport) {
152
+ res.writeHead(404, { 'Content-Type': 'application/json', ...corsHeaders });
153
+ res.end(JSON.stringify({
154
+ jsonrpc: '2.0',
155
+ error: { code: -32001, message: 'Session not found. Server not initialized.' },
156
+ id: null
157
+ }));
158
+ return;
159
+ }
160
+ if (req.method === 'POST') {
161
+ let body = null;
162
+ try {
163
+ body = await new Promise((resolve, reject) => {
164
+ let data = '';
165
+ req.on('data', chunk => data += chunk);
166
+ req.on('end', () => {
167
+ try {
168
+ resolve(JSON.parse(data));
169
+ }
170
+ catch {
171
+ resolve(null);
172
+ }
173
+ });
174
+ req.on('error', reject);
175
+ });
176
+ }
177
+ catch (error) {
178
+ res.writeHead(500, { 'Content-Type': 'application/json', ...corsHeaders });
179
+ res.end(JSON.stringify({
180
+ jsonrpc: '2.0',
181
+ error: { code: -32603, message: 'Internal error reading request body' },
182
+ id: null
183
+ }));
184
+ return;
185
+ }
186
+ await transport.handleRequest(req, res, body);
187
+ return;
188
+ }
189
+ if (req.method === 'GET') {
190
+ const acceptHeader = req.headers['accept'] || '';
191
+ if (!acceptHeader.includes('text/event-stream')) {
192
+ res.writeHead(406, { 'Content-Type': 'application/json', ...corsHeaders });
193
+ res.end(JSON.stringify({
194
+ jsonrpc: '2.0',
195
+ error: { code: -32600, message: 'Not Acceptable: Client must accept text/event-stream for GET requests' },
196
+ id: null
197
+ }));
198
+ return;
199
+ }
200
+ await transport.handleRequest(req, res);
201
+ return;
202
+ }
203
+ if (req.method === 'DELETE') {
204
+ await transport.handleRequest(req, res);
205
+ transports.delete(sessionId);
206
+ return;
207
+ }
208
+ res.writeHead(405, { 'Content-Type': 'application/json', ...corsHeaders });
209
+ res.end(JSON.stringify({
210
+ jsonrpc: '2.0',
211
+ error: { code: -32601, message: 'Method not allowed. Use POST, GET, or DELETE.' },
212
+ id: null
213
+ }));
214
+ return;
215
+ }
216
+ if (req.method === 'POST' && (url.pathname === '/' || url.pathname === '/mcp')) {
217
+ let body;
218
+ try {
219
+ body = await new Promise((resolve, reject) => {
220
+ let data = '';
221
+ req.on('data', chunk => data += chunk);
222
+ req.on('end', () => {
223
+ try {
224
+ resolve(JSON.parse(data));
225
+ }
226
+ catch {
227
+ resolve(null);
228
+ }
229
+ });
230
+ req.on('error', reject);
231
+ });
232
+ }
233
+ catch (error) {
234
+ res.writeHead(500, { 'Content-Type': 'application/json', ...corsHeaders });
235
+ res.end(JSON.stringify({
236
+ jsonrpc: '2.0',
237
+ error: { code: -32603, message: 'Internal error reading request body' },
238
+ id: null
239
+ }));
240
+ return;
241
+ }
242
+ if (!body) {
243
+ res.writeHead(400, { 'Content-Type': 'application/json', ...corsHeaders });
244
+ res.end(JSON.stringify({
245
+ jsonrpc: '2.0',
246
+ error: { code: -32700, message: 'Parse error: Invalid JSON' },
247
+ id: null
248
+ }));
249
+ return;
250
+ }
251
+ const messages = Array.isArray(body) ? body : [body];
252
+ const isInit = messages.some((m) => isInitializeRequest(m));
253
+ if (isInit) {
254
+ const transport = new StreamableHTTPServerTransport({
255
+ sessionIdGenerator: () => crypto.randomUUID(),
256
+ onsessioninitialized: (sessionId) => {
257
+ transports.set(sessionId, transport);
258
+ }
259
+ });
260
+ transport.onclose = () => {
261
+ if (transport.sessionId) {
262
+ transports.delete(transport.sessionId);
263
+ }
264
+ };
265
+ const mcpServer = createCnbsServer();
266
+ await mcpServer.connect(transport);
267
+ await transport.handleRequest(req, res, body);
268
+ return;
269
+ }
270
+ res.writeHead(400, { 'Content-Type': 'application/json', ...corsHeaders });
271
+ res.end(JSON.stringify({
272
+ jsonrpc: '2.0',
273
+ error: { code: -32002, message: 'Server not initialized. Send initialize request first.' },
274
+ id: null
275
+ }));
276
+ return;
277
+ }
278
+ if (req.method === 'GET' && (url.pathname === '/' || url.pathname === '/mcp')) {
279
+ res.writeHead(400, { 'Content-Type': 'application/json', ...corsHeaders });
280
+ res.end(JSON.stringify({
281
+ jsonrpc: '2.0',
282
+ error: { code: -32002, message: 'Server not initialized. Send initialize request first.' },
283
+ id: null
284
+ }));
285
+ return;
286
+ }
287
+ res.writeHead(404, { 'Content-Type': 'application/json', ...corsHeaders });
288
+ res.end(JSON.stringify({
289
+ jsonrpc: '2.0',
290
+ error: { code: -32601, message: 'Method not found. Use POST / for Streamable HTTP or GET /sse for SSE.' },
291
+ id: null
292
+ }));
293
+ });
294
+ server.listen(port, options.host);
295
+ }
296
+ else {
297
+ const server = createCnbsServer();
298
+ const transport = new StdioServerTransport();
299
+ await server.connect(transport);
300
+ }
301
+ }
302
+ launchCnbsServer().catch((error) => {
303
+ console.error('Failed to launch CNBS server:', error);
304
+ process.exit(1);
305
+ });
306
+ //# 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,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createCnbsServer(): McpServer;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,gBAAgB,cAyC/B"}
package/dist/server.js ADDED
@@ -0,0 +1,44 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { registerCnbsTools } from './tools/index.js';
3
+ const CNBS_VERSION = '1.0.0';
4
+ export function createCnbsServer() {
5
+ const server = new McpServer({
6
+ name: 'mcp-cnbs',
7
+ version: CNBS_VERSION,
8
+ });
9
+ server.instructions = `
10
+ 该服务用于查询中国国家统计局的统计数据(基于 UUID 标识符的新版 API)。
11
+
12
+ 数据查询三步走:
13
+ 1. cnbs_search - 关键词搜索, 找到目标数据集的 setId
14
+ 2. cnbs_fetch_metrics - 根据 setId 获取指标列表, 找到 metricId
15
+ 3. cnbs_fetch_series - 用 setId + metricId + 时间范围查询具体数据
16
+
17
+ 核心工具说明:
18
+ - cnbs_search(keyword, sortBy, sortOrder, categories, periodRange): 关键词搜索, 支持排序和过滤
19
+ - cnbs_fetch_nodes(category, parentId?): 浏览分类树, category=1月度/2季度/3年度/5分省季度/6分省年度/7其他。isEnd=true 的 id 即为 setId
20
+ - cnbs_fetch_metrics(setId): 获取某数据集下的所有指标
21
+ - cnbs_fetch_series(setId, metricIds, periods, areas?): 核心数据查询接口
22
+ - cnbs_fetch_end_nodes(category): 递归获取所有叶子节点(耗时, 不建议频繁用)
23
+ - cnbs_format_number(value, precision): 格式化数据值, 支持设置精度
24
+ - cnbs_transform_unit(value, sourceUnit, targetUnit): 在不同单位之间转换数据值
25
+ - cnbs_compute_stats(values): 计算数据的基本统计信息
26
+ - cnbs_get_cache_stats(): 获取缓存使用情况
27
+ - cnbs_flush_caches(): 清除所有缓存数据
28
+
29
+ 时间格式:
30
+ - 月度: YYYYMM, 如 202501, 后缀 MM
31
+ - 季度: YYYYQ, 如 20254, 后缀 SS
32
+ - 年度: YYYY, 如 2025, 后缀 YY
33
+ - 范围: Start-End, 如 202501MM-202503MM
34
+
35
+ 地区代码:
36
+ - 000000000000 = 全国
37
+
38
+ ---
39
+ author's blog is https://log.cns.red
40
+ `;
41
+ registerCnbsTools(server);
42
+ return server;
43
+ }
44
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,YAAY,GAAG,OAAO,CAAC;AAE7B,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,YAAY;KACtB,CAAC,CAAC;IAEF,MAAc,CAAC,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BhC,CAAC;IAEA,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { CnbsSeriesQuery, CnbsNodeQuery, CnbsMetricQuery, CnbsSearchQuery, CnbsCategory, CnbsClientConfig, LegacyApiResponse, LegacySearchResult, LegacyParsedResult, LegacyCategoryResponse, LegacyPeriodResponse } from '../types/index.js';
2
+ export declare class CnbsLegacyClient {
3
+ private baseUrl;
4
+ private codeMap;
5
+ find(keyword: string, db?: string, page?: number): Promise<LegacySearchResult>;
6
+ processFindResult(result: LegacySearchResult): LegacyParsedResult[];
7
+ fetchCategories(dbCode: string, dimCode?: string): Promise<LegacyCategoryResponse>;
8
+ fetchEndNodes(dbCode: string): Promise<LegacyCategoryResponse>;
9
+ private fetchSpecificNode;
10
+ fetchPeriodOptions(dbCode: string): Promise<LegacyPeriodResponse>;
11
+ fetchData(metricCode: string, dbCode: string, period?: string): Promise<LegacyApiResponse>;
12
+ batchFetch(queries: Array<{
13
+ metricCode: string;
14
+ dbCode: string;
15
+ period: string;
16
+ }>): Promise<Array<{
17
+ query: {
18
+ metricCode: string;
19
+ dbCode: string;
20
+ period: string;
21
+ };
22
+ result: LegacyApiResponse | null;
23
+ error?: string;
24
+ }>>;
25
+ }
26
+ export declare class CnbsModernClient {
27
+ private baseUrl;
28
+ private timeout;
29
+ private rootId;
30
+ private nodeCache;
31
+ private metricCache;
32
+ private seriesCache;
33
+ constructor(config?: CnbsClientConfig);
34
+ findItems(params: CnbsSearchQuery): Promise<any>;
35
+ batchFindItems(keywords: string[], pageSize?: number): Promise<Record<string, any>>;
36
+ fetchNodes(params: CnbsNodeQuery): Promise<any>;
37
+ fetchAllEndNodes(category: CnbsCategory): Promise<any[]>;
38
+ fetchMetrics(params: CnbsMetricQuery): Promise<any>;
39
+ fetchSeries(params: CnbsSeriesQuery): Promise<any>;
40
+ findAndFetch(keyword: string, metricName?: string, startPeriod?: string, endPeriod?: string): Promise<any>;
41
+ private extractSetIdFromGlobalRef;
42
+ flushAllCaches(): void;
43
+ getCacheStats(): any;
44
+ updateRootId(rootId: string): void;
45
+ fetchRootId(): string;
46
+ }
47
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,eAAe,EACf,aAAa,EACb,eAAe,EACf,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAGb;IAEI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAE,MAAW,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqB3F,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,EAAE;IAyB7D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAsBxF,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;YAoCtD,iBAAiB;IAsBzB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0BjE,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4BpG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QACtG,KAAK,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9D,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CAsBJ;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,WAAW,CAAM;gBAEb,MAAM,CAAC,EAAE,gBAAgB;IAwB/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAqBhD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAetF,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IA8B/C,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IA2BxD,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAiCnD,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IA0ClD,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,CAAC;IA0Df,OAAO,CAAC,yBAAyB;IAMjC,cAAc,IAAI,IAAI;IAMtB,aAAa,IAAI,GAAG;IAIpB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,WAAW,IAAI,MAAM;CAGtB"}