@aborruso/ckan-mcp-server 0.4.90 → 0.4.92

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/LOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # LOG
2
2
 
3
+ ## 2026-03-23
4
+
5
+ ### v0.4.92
6
+
7
+ - fix(http): create server + transport per request — SDK 1.26.0 security fix enforces stateless transport cannot be reused across requests
8
+
9
+ ### v0.4.91
10
+
11
+ - fix(worker): create server + transport per request — SDK 1.27.1 enforces stateless transport cannot be reused across requests
12
+
3
13
  ## 2026-03-22
4
14
 
5
15
  ### v0.4.90
package/dist/index.js CHANGED
@@ -29,7 +29,9 @@ var portals_default = {
29
29
  api_url_aliases: [
30
30
  "https://dati.gov.it/opendata",
31
31
  "http://www.dati.gov.it/opendata",
32
- "http://dati.gov.it/opendata"
32
+ "http://dati.gov.it/opendata",
33
+ "https://dati.gov.it",
34
+ "https://www.dati.gov.it"
33
35
  ],
34
36
  search: {
35
37
  force_text_field: true
@@ -1092,8 +1094,8 @@ function compactPackageShow(result, serverUrl) {
1092
1094
  } : {}
1093
1095
  };
1094
1096
  }
1095
- function registerPackageTools(server2) {
1096
- server2.registerTool(
1097
+ function registerPackageTools(server) {
1098
+ server.registerTool(
1097
1099
  "ckan_package_search",
1098
1100
  {
1099
1101
  title: "Search CKAN Datasets",
@@ -1446,7 +1448,7 @@ Note: showing top ${sorted.length} only. Use \`response_format: json\` for full
1446
1448
  }
1447
1449
  }
1448
1450
  );
1449
- server2.registerTool(
1451
+ server.registerTool(
1450
1452
  "ckan_find_relevant_datasets",
1451
1453
  {
1452
1454
  title: "Find Relevant CKAN Datasets",
@@ -1634,7 +1636,7 @@ Typical workflow: ckan_find_relevant_datasets \u2192 ckan_package_show (inspect
1634
1636
  }
1635
1637
  }
1636
1638
  );
1637
- server2.registerTool(
1639
+ server.registerTool(
1638
1640
  "ckan_package_show",
1639
1641
  {
1640
1642
  title: "Show CKAN Dataset Details",
@@ -1713,7 +1715,7 @@ Typical workflow: ckan_package_show \u2192 pick a resource with datastore_active
1713
1715
  }
1714
1716
  }
1715
1717
  );
1716
- server2.registerTool(
1718
+ server.registerTool(
1717
1719
  "ckan_list_resources",
1718
1720
  {
1719
1721
  title: "List CKAN Dataset Resources",
@@ -1937,8 +1939,8 @@ function compactOrganizationShow(result, serverUrl) {
1937
1939
  }))
1938
1940
  };
1939
1941
  }
1940
- function registerOrganizationTools(server2) {
1941
- server2.registerTool(
1942
+ function registerOrganizationTools(server) {
1943
+ server.registerTool(
1942
1944
  "ckan_organization_list",
1943
1945
  {
1944
1946
  title: "List CKAN Organizations",
@@ -2132,7 +2134,7 @@ Note: organization_list returned 500; using package_search facets.
2132
2134
  }
2133
2135
  }
2134
2136
  );
2135
- server2.registerTool(
2137
+ server.registerTool(
2136
2138
  "ckan_organization_show",
2137
2139
  {
2138
2140
  title: "Show CKAN Organization Details",
@@ -2196,7 +2198,7 @@ Typical workflow: ckan_organization_show \u2192 ckan_package_show (inspect a dat
2196
2198
  }
2197
2199
  }
2198
2200
  );
2199
- server2.registerTool(
2201
+ server.registerTool(
2200
2202
  "ckan_organization_search",
2201
2203
  {
2202
2204
  title: "Search CKAN Organizations by Name",
@@ -2430,8 +2432,8 @@ function compactDatastoreResult(result) {
2430
2432
  total: result.total ?? 0
2431
2433
  };
2432
2434
  }
2433
- function registerDatastoreTools(server2) {
2434
- server2.registerTool(
2435
+ function registerDatastoreTools(server) {
2436
+ server.registerTool(
2435
2437
  "ckan_datastore_search",
2436
2438
  {
2437
2439
  title: "Search CKAN DataStore",
@@ -2522,7 +2524,7 @@ Typical workflow: ckan_package_search \u2192 ckan_package_show (find resource_id
2522
2524
  }
2523
2525
  }
2524
2526
  );
2525
- server2.registerTool(
2527
+ server.registerTool(
2526
2528
  "ckan_datastore_search_sql",
2527
2529
  {
2528
2530
  title: "Search CKAN DataStore with SQL",
@@ -2605,8 +2607,8 @@ function formatStatusMarkdown(result, serverUrl, hvdCount) {
2605
2607
  **Site URL**: ${result.site_url || "N/A"}
2606
2608
  ` + sparqlLine + hvdLine;
2607
2609
  }
2608
- function registerStatusTools(server2) {
2609
- server2.registerTool(
2610
+ function registerStatusTools(server) {
2611
+ server.registerTool(
2610
2612
  "ckan_status_show",
2611
2613
  {
2612
2614
  title: "Check CKAN Server Status",
@@ -2691,8 +2693,8 @@ function normalizeTagFacets(result) {
2691
2693
  }
2692
2694
  return [];
2693
2695
  }
2694
- function registerTagTools(server2) {
2695
- server2.registerTool(
2696
+ function registerTagTools(server) {
2697
+ server.registerTool(
2696
2698
  "ckan_tag_list",
2697
2699
  {
2698
2700
  title: "List CKAN Tags",
@@ -2912,8 +2914,8 @@ function compactGroupShow(result) {
2912
2914
  }))
2913
2915
  };
2914
2916
  }
2915
- function registerGroupTools(server2) {
2916
- server2.registerTool(
2917
+ function registerGroupTools(server) {
2918
+ server.registerTool(
2917
2919
  "ckan_group_list",
2918
2920
  {
2919
2921
  title: "List CKAN Groups",
@@ -3039,7 +3041,7 @@ Typical workflow: ckan_group_list \u2192 ckan_group_show (inspect one) \u2192 ck
3039
3041
  }
3040
3042
  }
3041
3043
  );
3042
- server2.registerTool(
3044
+ server.registerTool(
3043
3045
  "ckan_group_show",
3044
3046
  {
3045
3047
  title: "Show CKAN Group Details",
@@ -3100,7 +3102,7 @@ Typical workflow: ckan_group_show \u2192 ckan_package_show (inspect a dataset) \
3100
3102
  }
3101
3103
  }
3102
3104
  );
3103
- server2.registerTool(
3105
+ server.registerTool(
3104
3106
  "ckan_group_search",
3105
3107
  {
3106
3108
  title: "Search CKAN Groups by Name",
@@ -3828,8 +3830,8 @@ function formatQualityDetailsMarkdown(data, datasetId) {
3828
3830
  lines.push(`Metrics endpoint: ${breakdown.metricsUrl || `${MQA_METRICS_BASE}/${portalId}/metrics`}`);
3829
3831
  return lines.join("\n");
3830
3832
  }
3831
- function registerQualityTools(server2) {
3832
- server2.registerTool(
3833
+ function registerQualityTools(server) {
3834
+ server.registerTool(
3833
3835
  "ckan_get_mqa_quality",
3834
3836
  {
3835
3837
  title: "Get MQA Quality Score",
@@ -3878,7 +3880,7 @@ The MQA (Metadata Quality Assurance) system is operated by data.europa.eu and on
3878
3880
  }
3879
3881
  }
3880
3882
  );
3881
- server2.registerTool(
3883
+ server.registerTool(
3882
3884
  "ckan_get_mqa_quality_details",
3883
3885
  {
3884
3886
  title: "Get MQA Quality Details",
@@ -4013,8 +4015,8 @@ function formatAnalyzeDatasetsMarkdown(serverUrl, query, total, datasets) {
4013
4015
  }
4014
4016
  return md;
4015
4017
  }
4016
- function registerAnalyzeTools(server2) {
4017
- server2.registerTool(
4018
+ function registerAnalyzeTools(server) {
4019
+ server.registerTool(
4018
4020
  "ckan_analyze_datasets",
4019
4021
  {
4020
4022
  title: "Analyze CKAN Datasets and DataStore Schema",
@@ -4140,8 +4142,8 @@ function formatCatalogStatsMarkdown(serverUrl, total, facets) {
4140
4142
  }
4141
4143
  return md;
4142
4144
  }
4143
- function registerCatalogStatsTools(server2) {
4144
- server2.registerTool(
4145
+ function registerCatalogStatsTools(server) {
4146
+ server.registerTool(
4145
4147
  "ckan_catalog_stats",
4146
4148
  {
4147
4149
  title: "Get CKAN Portal Statistics",
@@ -4309,8 +4311,8 @@ function formatSparqlJson(data) {
4309
4311
  });
4310
4312
  return { count: rows.length, columns: vars, rows };
4311
4313
  }
4312
- function registerSparqlTools(server2) {
4313
- server2.registerTool(
4314
+ function registerSparqlTools(server) {
4315
+ server.registerTool(
4314
4316
  "sparql_query",
4315
4317
  {
4316
4318
  title: "SPARQL Query",
@@ -4433,8 +4435,8 @@ ${rows}
4433
4435
  ---
4434
4436
  \u{1F4A1} Use the portal URL as \`server_url\` in any CKAN tool.`;
4435
4437
  }
4436
- function registerPortalDiscoveryTools(server2) {
4437
- server2.registerTool(
4438
+ function registerPortalDiscoveryTools(server) {
4439
+ server.registerTool(
4438
4440
  "ckan_find_portals",
4439
4441
  {
4440
4442
  title: "Find CKAN Portals",
@@ -4533,13 +4535,13 @@ function parseCkanUri(uri) {
4533
4535
  if (!type || !id) {
4534
4536
  throw new Error("Invalid ckan:// URI: missing type or id");
4535
4537
  }
4536
- const server2 = getPortalApiUrlForHostname(hostname) || `https://${hostname}`;
4537
- return { server: server2, type, id };
4538
+ const server = getPortalApiUrlForHostname(hostname) || `https://${hostname}`;
4539
+ return { server, type, id };
4538
4540
  }
4539
4541
 
4540
4542
  // src/resources/dataset.ts
4541
- function registerDatasetResource(server2) {
4542
- server2.registerResource(
4543
+ function registerDatasetResource(server) {
4544
+ server.registerResource(
4543
4545
  "ckan-dataset",
4544
4546
  new ResourceTemplate("ckan://{server}/dataset/{id}", { list: void 0 }),
4545
4547
  {
@@ -4582,8 +4584,8 @@ function registerDatasetResource(server2) {
4582
4584
 
4583
4585
  // src/resources/resource.ts
4584
4586
  import { ResourceTemplate as ResourceTemplate2 } from "@modelcontextprotocol/sdk/server/mcp.js";
4585
- function registerResourceResource(server2) {
4586
- server2.registerResource(
4587
+ function registerResourceResource(server) {
4588
+ server.registerResource(
4587
4589
  "ckan-resource",
4588
4590
  new ResourceTemplate2("ckan://{server}/resource/{id}", { list: void 0 }),
4589
4591
  {
@@ -4626,8 +4628,8 @@ function registerResourceResource(server2) {
4626
4628
 
4627
4629
  // src/resources/organization.ts
4628
4630
  import { ResourceTemplate as ResourceTemplate3 } from "@modelcontextprotocol/sdk/server/mcp.js";
4629
- function registerOrganizationResource(server2) {
4630
- server2.registerResource(
4631
+ function registerOrganizationResource(server) {
4632
+ server.registerResource(
4631
4633
  "ckan-organization",
4632
4634
  new ResourceTemplate3("ckan://{server}/organization/{name}", {
4633
4635
  list: void 0
@@ -4691,8 +4693,8 @@ var buildFormatFilter = (rawFormat) => {
4691
4693
  );
4692
4694
  return `(${clauses.join(" OR ")})`;
4693
4695
  };
4694
- var registerDatasetFilterResource = (server2, config) => {
4695
- server2.registerResource(
4696
+ var registerDatasetFilterResource = (server, config) => {
4697
+ server.registerResource(
4696
4698
  config.name,
4697
4699
  new ResourceTemplate4(config.template, { list: void 0 }),
4698
4700
  {
@@ -4733,8 +4735,8 @@ var registerDatasetFilterResource = (server2, config) => {
4733
4735
  }
4734
4736
  );
4735
4737
  };
4736
- function registerGroupDatasetsResource(server2) {
4737
- registerDatasetFilterResource(server2, {
4738
+ function registerGroupDatasetsResource(server) {
4739
+ registerDatasetFilterResource(server, {
4738
4740
  name: "ckan-group-datasets",
4739
4741
  template: "ckan://{server}/group/{name}/datasets",
4740
4742
  title: "CKAN Group Datasets",
@@ -4742,8 +4744,8 @@ function registerGroupDatasetsResource(server2) {
4742
4744
  buildFq: (variables) => `groups:"${escapeSolrTerm(variables.name)}"`
4743
4745
  });
4744
4746
  }
4745
- function registerOrganizationDatasetsResource(server2) {
4746
- registerDatasetFilterResource(server2, {
4747
+ function registerOrganizationDatasetsResource(server) {
4748
+ registerDatasetFilterResource(server, {
4747
4749
  name: "ckan-organization-datasets",
4748
4750
  template: "ckan://{server}/organization/{name}/datasets",
4749
4751
  title: "CKAN Organization Datasets",
@@ -4751,8 +4753,8 @@ function registerOrganizationDatasetsResource(server2) {
4751
4753
  buildFq: (variables) => `organization:"${escapeSolrTerm(variables.name)}"`
4752
4754
  });
4753
4755
  }
4754
- function registerTagDatasetsResource(server2) {
4755
- registerDatasetFilterResource(server2, {
4756
+ function registerTagDatasetsResource(server) {
4757
+ registerDatasetFilterResource(server, {
4756
4758
  name: "ckan-tag-datasets",
4757
4759
  template: "ckan://{server}/tag/{name}/datasets",
4758
4760
  title: "CKAN Tag Datasets",
@@ -4760,8 +4762,8 @@ function registerTagDatasetsResource(server2) {
4760
4762
  buildFq: (variables) => `tags:"${escapeSolrTerm(variables.name)}"`
4761
4763
  });
4762
4764
  }
4763
- function registerFormatDatasetsResource(server2) {
4764
- registerDatasetFilterResource(server2, {
4765
+ function registerFormatDatasetsResource(server) {
4766
+ registerDatasetFilterResource(server, {
4765
4767
  name: "ckan-format-datasets",
4766
4768
  template: "ckan://{server}/format/{format}/datasets",
4767
4769
  title: "CKAN Format Datasets",
@@ -4771,14 +4773,14 @@ function registerFormatDatasetsResource(server2) {
4771
4773
  }
4772
4774
 
4773
4775
  // src/resources/index.ts
4774
- function registerAllResources(server2) {
4775
- registerDatasetResource(server2);
4776
- registerResourceResource(server2);
4777
- registerOrganizationResource(server2);
4778
- registerGroupDatasetsResource(server2);
4779
- registerOrganizationDatasetsResource(server2);
4780
- registerTagDatasetsResource(server2);
4781
- registerFormatDatasetsResource(server2);
4776
+ function registerAllResources(server) {
4777
+ registerDatasetResource(server);
4778
+ registerResourceResource(server);
4779
+ registerOrganizationResource(server);
4780
+ registerGroupDatasetsResource(server);
4781
+ registerOrganizationDatasetsResource(server);
4782
+ registerTagDatasetsResource(server);
4783
+ registerFormatDatasetsResource(server);
4782
4784
  }
4783
4785
 
4784
4786
  // src/prompts/theme.ts
@@ -4836,8 +4838,8 @@ ckan_package_search({
4836
4838
  Note: metadata_modified is a CKAN record timestamp (publish time on source portals,
4837
4839
  harvest time on aggregators). If the user asks for
4838
4840
  content publication dates, prefer issued (or modified) with explicit ISO ranges.`;
4839
- var registerThemePrompt = (server2) => {
4840
- server2.registerPrompt(
4841
+ var registerThemePrompt = (server) => {
4842
+ server.registerPrompt(
4841
4843
  THEME_PROMPT_NAME,
4842
4844
  {
4843
4845
  title: "Search datasets by theme",
@@ -4881,8 +4883,8 @@ ckan_package_search({
4881
4883
  Note: metadata_modified is a CKAN record timestamp (publish time on source portals,
4882
4884
  harvest time on aggregators). If the user asks for
4883
4885
  content publication dates, prefer issued (or modified) with explicit ISO ranges.`;
4884
- var registerOrganizationPrompt = (server2) => {
4885
- server2.registerPrompt(
4886
+ var registerOrganizationPrompt = (server) => {
4887
+ server.registerPrompt(
4886
4888
  ORGANIZATION_PROMPT_NAME,
4887
4889
  {
4888
4890
  title: "Search datasets by organization",
@@ -4915,8 +4917,8 @@ Tip: try uppercase (CSV/JSON) or common variants if results are sparse.
4915
4917
  Note: metadata_modified is a CKAN record timestamp (publish time on source portals,
4916
4918
  harvest time on aggregators). If the user asks for
4917
4919
  content publication dates, prefer issued (or modified) with explicit ISO ranges.`;
4918
- var registerFormatPrompt = (server2) => {
4919
- server2.registerPrompt(
4920
+ var registerFormatPrompt = (server) => {
4921
+ server.registerPrompt(
4920
4922
  FORMAT_PROMPT_NAME,
4921
4923
  {
4922
4924
  title: "Search datasets by resource format",
@@ -4973,8 +4975,8 @@ ckan_package_search({
4973
4975
  content_recent_days: 30,
4974
4976
  rows: ${rows}
4975
4977
  })`;
4976
- var registerRecentPrompt = (server2) => {
4977
- server2.registerPrompt(
4978
+ var registerRecentPrompt = (server) => {
4979
+ server.registerPrompt(
4978
4980
  RECENT_PROMPT_NAME,
4979
4981
  {
4980
4982
  title: "Find recently updated datasets",
@@ -5024,8 +5026,8 @@ ckan_datastore_search_sql({
5024
5026
  server_url: "${serverUrl}",
5025
5027
  sql: "SELECT * FROM "<resource-id>" LIMIT 10"
5026
5028
  })`;
5027
- var registerDatasetAnalysisPrompt = (server2) => {
5028
- server2.registerPrompt(
5029
+ var registerDatasetAnalysisPrompt = (server) => {
5030
+ server.registerPrompt(
5029
5031
  DATASET_ANALYSIS_PROMPT_NAME,
5030
5032
  {
5031
5033
  title: "Analyze a dataset",
@@ -5095,8 +5097,8 @@ Note: HVD categories are defined by EU regulation. Common ones on Italian portal
5095
5097
  - Statistical: \`http://data.europa.eu/bna/c_e1da4e07\`
5096
5098
  - Meteorological: \`http://data.europa.eu/bna/c_164e0bf5\``;
5097
5099
  };
5098
- var registerHvdPrompt = (server2) => {
5099
- server2.registerPrompt(
5100
+ var registerHvdPrompt = (server) => {
5101
+ server.registerPrompt(
5100
5102
  HVD_PROMPT_NAME,
5101
5103
  {
5102
5104
  title: "Search High-Value Datasets (HVD)",
@@ -5114,61 +5116,63 @@ var registerHvdPrompt = (server2) => {
5114
5116
  };
5115
5117
 
5116
5118
  // src/prompts/index.ts
5117
- var registerAllPrompts = (server2) => {
5118
- registerThemePrompt(server2);
5119
- registerOrganizationPrompt(server2);
5120
- registerFormatPrompt(server2);
5121
- registerRecentPrompt(server2);
5122
- registerDatasetAnalysisPrompt(server2);
5123
- registerHvdPrompt(server2);
5119
+ var registerAllPrompts = (server) => {
5120
+ registerThemePrompt(server);
5121
+ registerOrganizationPrompt(server);
5122
+ registerFormatPrompt(server);
5123
+ registerRecentPrompt(server);
5124
+ registerDatasetAnalysisPrompt(server);
5125
+ registerHvdPrompt(server);
5124
5126
  };
5125
5127
 
5126
5128
  // src/server.ts
5127
5129
  function createServer() {
5128
5130
  return new McpServer({
5129
5131
  name: "ckan-mcp-server",
5130
- version: "0.4.90"
5132
+ version: "0.4.92"
5131
5133
  });
5132
5134
  }
5133
- function registerAll(server2) {
5134
- registerPackageTools(server2);
5135
- registerOrganizationTools(server2);
5136
- registerDatastoreTools(server2);
5137
- registerStatusTools(server2);
5138
- registerTagTools(server2);
5139
- registerGroupTools(server2);
5140
- registerQualityTools(server2);
5141
- registerAnalyzeTools(server2);
5142
- registerCatalogStatsTools(server2);
5143
- registerSparqlTools(server2);
5144
- registerPortalDiscoveryTools(server2);
5145
- registerAllResources(server2);
5146
- registerAllPrompts(server2);
5135
+ function registerAll(server) {
5136
+ registerPackageTools(server);
5137
+ registerOrganizationTools(server);
5138
+ registerDatastoreTools(server);
5139
+ registerStatusTools(server);
5140
+ registerTagTools(server);
5141
+ registerGroupTools(server);
5142
+ registerQualityTools(server);
5143
+ registerAnalyzeTools(server);
5144
+ registerCatalogStatsTools(server);
5145
+ registerSparqlTools(server);
5146
+ registerPortalDiscoveryTools(server);
5147
+ registerAllResources(server);
5148
+ registerAllPrompts(server);
5147
5149
  }
5148
5150
 
5149
5151
  // src/transport/stdio.ts
5150
5152
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5151
- async function runStdio(server2) {
5153
+ async function runStdio(server) {
5152
5154
  const transport2 = new StdioServerTransport();
5153
- await server2.connect(transport2);
5155
+ await server.connect(transport2);
5154
5156
  console.error("CKAN MCP server running on stdio");
5155
5157
  }
5156
5158
 
5157
5159
  // src/transport/http.ts
5158
5160
  import express from "express";
5159
5161
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
5160
- async function runHTTP(server2) {
5162
+ async function runHTTP() {
5161
5163
  const app = express();
5162
5164
  app.use(express.json());
5163
- const transport2 = new StreamableHTTPServerTransport({
5164
- sessionIdGenerator: void 0,
5165
- enableJsonResponse: true
5166
- });
5167
- await server2.connect(transport2);
5168
5165
  app.get("/.well-known/oauth-authorization-server", (_req, res) => {
5169
5166
  res.status(404).json({ error: "authorization_not_supported", error_description: "This server does not require authentication" });
5170
5167
  });
5171
5168
  app.post("/mcp", async (req, res) => {
5169
+ const server = createServer();
5170
+ registerAll(server);
5171
+ const transport2 = new StreamableHTTPServerTransport({
5172
+ sessionIdGenerator: void 0,
5173
+ enableJsonResponse: true
5174
+ });
5175
+ await server.connect(transport2);
5172
5176
  await transport2.handleRequest(req, res, req.body);
5173
5177
  });
5174
5178
  const port = parseInt(process.env.PORT || "3000");
@@ -5178,15 +5182,15 @@ async function runHTTP(server2) {
5178
5182
  }
5179
5183
 
5180
5184
  // src/index.ts
5181
- var server = createServer();
5182
- registerAll(server);
5183
5185
  var transport = process.env.TRANSPORT || "stdio";
5184
5186
  if (transport === "http") {
5185
- runHTTP(server).catch((error) => {
5187
+ runHTTP().catch((error) => {
5186
5188
  console.error("Server error:", error);
5187
5189
  process.exit(1);
5188
5190
  });
5189
5191
  } else {
5192
+ const server = createServer();
5193
+ registerAll(server);
5190
5194
  runStdio(server).catch((error) => {
5191
5195
  console.error("Server error:", error);
5192
5196
  process.exit(1);