@aborruso/ckan-mcp-server 0.4.91 → 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
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## 2026-03-23
4
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
+
5
9
  ### v0.4.91
6
10
 
7
11
  - fix(worker): create server + transport per request — SDK 1.27.1 enforces stateless transport cannot be reused across requests
package/dist/index.js CHANGED
@@ -1094,8 +1094,8 @@ function compactPackageShow(result, serverUrl) {
1094
1094
  } : {}
1095
1095
  };
1096
1096
  }
1097
- function registerPackageTools(server2) {
1098
- server2.registerTool(
1097
+ function registerPackageTools(server) {
1098
+ server.registerTool(
1099
1099
  "ckan_package_search",
1100
1100
  {
1101
1101
  title: "Search CKAN Datasets",
@@ -1448,7 +1448,7 @@ Note: showing top ${sorted.length} only. Use \`response_format: json\` for full
1448
1448
  }
1449
1449
  }
1450
1450
  );
1451
- server2.registerTool(
1451
+ server.registerTool(
1452
1452
  "ckan_find_relevant_datasets",
1453
1453
  {
1454
1454
  title: "Find Relevant CKAN Datasets",
@@ -1636,7 +1636,7 @@ Typical workflow: ckan_find_relevant_datasets \u2192 ckan_package_show (inspect
1636
1636
  }
1637
1637
  }
1638
1638
  );
1639
- server2.registerTool(
1639
+ server.registerTool(
1640
1640
  "ckan_package_show",
1641
1641
  {
1642
1642
  title: "Show CKAN Dataset Details",
@@ -1715,7 +1715,7 @@ Typical workflow: ckan_package_show \u2192 pick a resource with datastore_active
1715
1715
  }
1716
1716
  }
1717
1717
  );
1718
- server2.registerTool(
1718
+ server.registerTool(
1719
1719
  "ckan_list_resources",
1720
1720
  {
1721
1721
  title: "List CKAN Dataset Resources",
@@ -1939,8 +1939,8 @@ function compactOrganizationShow(result, serverUrl) {
1939
1939
  }))
1940
1940
  };
1941
1941
  }
1942
- function registerOrganizationTools(server2) {
1943
- server2.registerTool(
1942
+ function registerOrganizationTools(server) {
1943
+ server.registerTool(
1944
1944
  "ckan_organization_list",
1945
1945
  {
1946
1946
  title: "List CKAN Organizations",
@@ -2134,7 +2134,7 @@ Note: organization_list returned 500; using package_search facets.
2134
2134
  }
2135
2135
  }
2136
2136
  );
2137
- server2.registerTool(
2137
+ server.registerTool(
2138
2138
  "ckan_organization_show",
2139
2139
  {
2140
2140
  title: "Show CKAN Organization Details",
@@ -2198,7 +2198,7 @@ Typical workflow: ckan_organization_show \u2192 ckan_package_show (inspect a dat
2198
2198
  }
2199
2199
  }
2200
2200
  );
2201
- server2.registerTool(
2201
+ server.registerTool(
2202
2202
  "ckan_organization_search",
2203
2203
  {
2204
2204
  title: "Search CKAN Organizations by Name",
@@ -2432,8 +2432,8 @@ function compactDatastoreResult(result) {
2432
2432
  total: result.total ?? 0
2433
2433
  };
2434
2434
  }
2435
- function registerDatastoreTools(server2) {
2436
- server2.registerTool(
2435
+ function registerDatastoreTools(server) {
2436
+ server.registerTool(
2437
2437
  "ckan_datastore_search",
2438
2438
  {
2439
2439
  title: "Search CKAN DataStore",
@@ -2524,7 +2524,7 @@ Typical workflow: ckan_package_search \u2192 ckan_package_show (find resource_id
2524
2524
  }
2525
2525
  }
2526
2526
  );
2527
- server2.registerTool(
2527
+ server.registerTool(
2528
2528
  "ckan_datastore_search_sql",
2529
2529
  {
2530
2530
  title: "Search CKAN DataStore with SQL",
@@ -2607,8 +2607,8 @@ function formatStatusMarkdown(result, serverUrl, hvdCount) {
2607
2607
  **Site URL**: ${result.site_url || "N/A"}
2608
2608
  ` + sparqlLine + hvdLine;
2609
2609
  }
2610
- function registerStatusTools(server2) {
2611
- server2.registerTool(
2610
+ function registerStatusTools(server) {
2611
+ server.registerTool(
2612
2612
  "ckan_status_show",
2613
2613
  {
2614
2614
  title: "Check CKAN Server Status",
@@ -2693,8 +2693,8 @@ function normalizeTagFacets(result) {
2693
2693
  }
2694
2694
  return [];
2695
2695
  }
2696
- function registerTagTools(server2) {
2697
- server2.registerTool(
2696
+ function registerTagTools(server) {
2697
+ server.registerTool(
2698
2698
  "ckan_tag_list",
2699
2699
  {
2700
2700
  title: "List CKAN Tags",
@@ -2914,8 +2914,8 @@ function compactGroupShow(result) {
2914
2914
  }))
2915
2915
  };
2916
2916
  }
2917
- function registerGroupTools(server2) {
2918
- server2.registerTool(
2917
+ function registerGroupTools(server) {
2918
+ server.registerTool(
2919
2919
  "ckan_group_list",
2920
2920
  {
2921
2921
  title: "List CKAN Groups",
@@ -3041,7 +3041,7 @@ Typical workflow: ckan_group_list \u2192 ckan_group_show (inspect one) \u2192 ck
3041
3041
  }
3042
3042
  }
3043
3043
  );
3044
- server2.registerTool(
3044
+ server.registerTool(
3045
3045
  "ckan_group_show",
3046
3046
  {
3047
3047
  title: "Show CKAN Group Details",
@@ -3102,7 +3102,7 @@ Typical workflow: ckan_group_show \u2192 ckan_package_show (inspect a dataset) \
3102
3102
  }
3103
3103
  }
3104
3104
  );
3105
- server2.registerTool(
3105
+ server.registerTool(
3106
3106
  "ckan_group_search",
3107
3107
  {
3108
3108
  title: "Search CKAN Groups by Name",
@@ -3830,8 +3830,8 @@ function formatQualityDetailsMarkdown(data, datasetId) {
3830
3830
  lines.push(`Metrics endpoint: ${breakdown.metricsUrl || `${MQA_METRICS_BASE}/${portalId}/metrics`}`);
3831
3831
  return lines.join("\n");
3832
3832
  }
3833
- function registerQualityTools(server2) {
3834
- server2.registerTool(
3833
+ function registerQualityTools(server) {
3834
+ server.registerTool(
3835
3835
  "ckan_get_mqa_quality",
3836
3836
  {
3837
3837
  title: "Get MQA Quality Score",
@@ -3880,7 +3880,7 @@ The MQA (Metadata Quality Assurance) system is operated by data.europa.eu and on
3880
3880
  }
3881
3881
  }
3882
3882
  );
3883
- server2.registerTool(
3883
+ server.registerTool(
3884
3884
  "ckan_get_mqa_quality_details",
3885
3885
  {
3886
3886
  title: "Get MQA Quality Details",
@@ -4015,8 +4015,8 @@ function formatAnalyzeDatasetsMarkdown(serverUrl, query, total, datasets) {
4015
4015
  }
4016
4016
  return md;
4017
4017
  }
4018
- function registerAnalyzeTools(server2) {
4019
- server2.registerTool(
4018
+ function registerAnalyzeTools(server) {
4019
+ server.registerTool(
4020
4020
  "ckan_analyze_datasets",
4021
4021
  {
4022
4022
  title: "Analyze CKAN Datasets and DataStore Schema",
@@ -4142,8 +4142,8 @@ function formatCatalogStatsMarkdown(serverUrl, total, facets) {
4142
4142
  }
4143
4143
  return md;
4144
4144
  }
4145
- function registerCatalogStatsTools(server2) {
4146
- server2.registerTool(
4145
+ function registerCatalogStatsTools(server) {
4146
+ server.registerTool(
4147
4147
  "ckan_catalog_stats",
4148
4148
  {
4149
4149
  title: "Get CKAN Portal Statistics",
@@ -4311,8 +4311,8 @@ function formatSparqlJson(data) {
4311
4311
  });
4312
4312
  return { count: rows.length, columns: vars, rows };
4313
4313
  }
4314
- function registerSparqlTools(server2) {
4315
- server2.registerTool(
4314
+ function registerSparqlTools(server) {
4315
+ server.registerTool(
4316
4316
  "sparql_query",
4317
4317
  {
4318
4318
  title: "SPARQL Query",
@@ -4435,8 +4435,8 @@ ${rows}
4435
4435
  ---
4436
4436
  \u{1F4A1} Use the portal URL as \`server_url\` in any CKAN tool.`;
4437
4437
  }
4438
- function registerPortalDiscoveryTools(server2) {
4439
- server2.registerTool(
4438
+ function registerPortalDiscoveryTools(server) {
4439
+ server.registerTool(
4440
4440
  "ckan_find_portals",
4441
4441
  {
4442
4442
  title: "Find CKAN Portals",
@@ -4535,13 +4535,13 @@ function parseCkanUri(uri) {
4535
4535
  if (!type || !id) {
4536
4536
  throw new Error("Invalid ckan:// URI: missing type or id");
4537
4537
  }
4538
- const server2 = getPortalApiUrlForHostname(hostname) || `https://${hostname}`;
4539
- return { server: server2, type, id };
4538
+ const server = getPortalApiUrlForHostname(hostname) || `https://${hostname}`;
4539
+ return { server, type, id };
4540
4540
  }
4541
4541
 
4542
4542
  // src/resources/dataset.ts
4543
- function registerDatasetResource(server2) {
4544
- server2.registerResource(
4543
+ function registerDatasetResource(server) {
4544
+ server.registerResource(
4545
4545
  "ckan-dataset",
4546
4546
  new ResourceTemplate("ckan://{server}/dataset/{id}", { list: void 0 }),
4547
4547
  {
@@ -4584,8 +4584,8 @@ function registerDatasetResource(server2) {
4584
4584
 
4585
4585
  // src/resources/resource.ts
4586
4586
  import { ResourceTemplate as ResourceTemplate2 } from "@modelcontextprotocol/sdk/server/mcp.js";
4587
- function registerResourceResource(server2) {
4588
- server2.registerResource(
4587
+ function registerResourceResource(server) {
4588
+ server.registerResource(
4589
4589
  "ckan-resource",
4590
4590
  new ResourceTemplate2("ckan://{server}/resource/{id}", { list: void 0 }),
4591
4591
  {
@@ -4628,8 +4628,8 @@ function registerResourceResource(server2) {
4628
4628
 
4629
4629
  // src/resources/organization.ts
4630
4630
  import { ResourceTemplate as ResourceTemplate3 } from "@modelcontextprotocol/sdk/server/mcp.js";
4631
- function registerOrganizationResource(server2) {
4632
- server2.registerResource(
4631
+ function registerOrganizationResource(server) {
4632
+ server.registerResource(
4633
4633
  "ckan-organization",
4634
4634
  new ResourceTemplate3("ckan://{server}/organization/{name}", {
4635
4635
  list: void 0
@@ -4693,8 +4693,8 @@ var buildFormatFilter = (rawFormat) => {
4693
4693
  );
4694
4694
  return `(${clauses.join(" OR ")})`;
4695
4695
  };
4696
- var registerDatasetFilterResource = (server2, config) => {
4697
- server2.registerResource(
4696
+ var registerDatasetFilterResource = (server, config) => {
4697
+ server.registerResource(
4698
4698
  config.name,
4699
4699
  new ResourceTemplate4(config.template, { list: void 0 }),
4700
4700
  {
@@ -4735,8 +4735,8 @@ var registerDatasetFilterResource = (server2, config) => {
4735
4735
  }
4736
4736
  );
4737
4737
  };
4738
- function registerGroupDatasetsResource(server2) {
4739
- registerDatasetFilterResource(server2, {
4738
+ function registerGroupDatasetsResource(server) {
4739
+ registerDatasetFilterResource(server, {
4740
4740
  name: "ckan-group-datasets",
4741
4741
  template: "ckan://{server}/group/{name}/datasets",
4742
4742
  title: "CKAN Group Datasets",
@@ -4744,8 +4744,8 @@ function registerGroupDatasetsResource(server2) {
4744
4744
  buildFq: (variables) => `groups:"${escapeSolrTerm(variables.name)}"`
4745
4745
  });
4746
4746
  }
4747
- function registerOrganizationDatasetsResource(server2) {
4748
- registerDatasetFilterResource(server2, {
4747
+ function registerOrganizationDatasetsResource(server) {
4748
+ registerDatasetFilterResource(server, {
4749
4749
  name: "ckan-organization-datasets",
4750
4750
  template: "ckan://{server}/organization/{name}/datasets",
4751
4751
  title: "CKAN Organization Datasets",
@@ -4753,8 +4753,8 @@ function registerOrganizationDatasetsResource(server2) {
4753
4753
  buildFq: (variables) => `organization:"${escapeSolrTerm(variables.name)}"`
4754
4754
  });
4755
4755
  }
4756
- function registerTagDatasetsResource(server2) {
4757
- registerDatasetFilterResource(server2, {
4756
+ function registerTagDatasetsResource(server) {
4757
+ registerDatasetFilterResource(server, {
4758
4758
  name: "ckan-tag-datasets",
4759
4759
  template: "ckan://{server}/tag/{name}/datasets",
4760
4760
  title: "CKAN Tag Datasets",
@@ -4762,8 +4762,8 @@ function registerTagDatasetsResource(server2) {
4762
4762
  buildFq: (variables) => `tags:"${escapeSolrTerm(variables.name)}"`
4763
4763
  });
4764
4764
  }
4765
- function registerFormatDatasetsResource(server2) {
4766
- registerDatasetFilterResource(server2, {
4765
+ function registerFormatDatasetsResource(server) {
4766
+ registerDatasetFilterResource(server, {
4767
4767
  name: "ckan-format-datasets",
4768
4768
  template: "ckan://{server}/format/{format}/datasets",
4769
4769
  title: "CKAN Format Datasets",
@@ -4773,14 +4773,14 @@ function registerFormatDatasetsResource(server2) {
4773
4773
  }
4774
4774
 
4775
4775
  // src/resources/index.ts
4776
- function registerAllResources(server2) {
4777
- registerDatasetResource(server2);
4778
- registerResourceResource(server2);
4779
- registerOrganizationResource(server2);
4780
- registerGroupDatasetsResource(server2);
4781
- registerOrganizationDatasetsResource(server2);
4782
- registerTagDatasetsResource(server2);
4783
- 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);
4784
4784
  }
4785
4785
 
4786
4786
  // src/prompts/theme.ts
@@ -4838,8 +4838,8 @@ ckan_package_search({
4838
4838
  Note: metadata_modified is a CKAN record timestamp (publish time on source portals,
4839
4839
  harvest time on aggregators). If the user asks for
4840
4840
  content publication dates, prefer issued (or modified) with explicit ISO ranges.`;
4841
- var registerThemePrompt = (server2) => {
4842
- server2.registerPrompt(
4841
+ var registerThemePrompt = (server) => {
4842
+ server.registerPrompt(
4843
4843
  THEME_PROMPT_NAME,
4844
4844
  {
4845
4845
  title: "Search datasets by theme",
@@ -4883,8 +4883,8 @@ ckan_package_search({
4883
4883
  Note: metadata_modified is a CKAN record timestamp (publish time on source portals,
4884
4884
  harvest time on aggregators). If the user asks for
4885
4885
  content publication dates, prefer issued (or modified) with explicit ISO ranges.`;
4886
- var registerOrganizationPrompt = (server2) => {
4887
- server2.registerPrompt(
4886
+ var registerOrganizationPrompt = (server) => {
4887
+ server.registerPrompt(
4888
4888
  ORGANIZATION_PROMPT_NAME,
4889
4889
  {
4890
4890
  title: "Search datasets by organization",
@@ -4917,8 +4917,8 @@ Tip: try uppercase (CSV/JSON) or common variants if results are sparse.
4917
4917
  Note: metadata_modified is a CKAN record timestamp (publish time on source portals,
4918
4918
  harvest time on aggregators). If the user asks for
4919
4919
  content publication dates, prefer issued (or modified) with explicit ISO ranges.`;
4920
- var registerFormatPrompt = (server2) => {
4921
- server2.registerPrompt(
4920
+ var registerFormatPrompt = (server) => {
4921
+ server.registerPrompt(
4922
4922
  FORMAT_PROMPT_NAME,
4923
4923
  {
4924
4924
  title: "Search datasets by resource format",
@@ -4975,8 +4975,8 @@ ckan_package_search({
4975
4975
  content_recent_days: 30,
4976
4976
  rows: ${rows}
4977
4977
  })`;
4978
- var registerRecentPrompt = (server2) => {
4979
- server2.registerPrompt(
4978
+ var registerRecentPrompt = (server) => {
4979
+ server.registerPrompt(
4980
4980
  RECENT_PROMPT_NAME,
4981
4981
  {
4982
4982
  title: "Find recently updated datasets",
@@ -5026,8 +5026,8 @@ ckan_datastore_search_sql({
5026
5026
  server_url: "${serverUrl}",
5027
5027
  sql: "SELECT * FROM "<resource-id>" LIMIT 10"
5028
5028
  })`;
5029
- var registerDatasetAnalysisPrompt = (server2) => {
5030
- server2.registerPrompt(
5029
+ var registerDatasetAnalysisPrompt = (server) => {
5030
+ server.registerPrompt(
5031
5031
  DATASET_ANALYSIS_PROMPT_NAME,
5032
5032
  {
5033
5033
  title: "Analyze a dataset",
@@ -5097,8 +5097,8 @@ Note: HVD categories are defined by EU regulation. Common ones on Italian portal
5097
5097
  - Statistical: \`http://data.europa.eu/bna/c_e1da4e07\`
5098
5098
  - Meteorological: \`http://data.europa.eu/bna/c_164e0bf5\``;
5099
5099
  };
5100
- var registerHvdPrompt = (server2) => {
5101
- server2.registerPrompt(
5100
+ var registerHvdPrompt = (server) => {
5101
+ server.registerPrompt(
5102
5102
  HVD_PROMPT_NAME,
5103
5103
  {
5104
5104
  title: "Search High-Value Datasets (HVD)",
@@ -5116,61 +5116,63 @@ var registerHvdPrompt = (server2) => {
5116
5116
  };
5117
5117
 
5118
5118
  // src/prompts/index.ts
5119
- var registerAllPrompts = (server2) => {
5120
- registerThemePrompt(server2);
5121
- registerOrganizationPrompt(server2);
5122
- registerFormatPrompt(server2);
5123
- registerRecentPrompt(server2);
5124
- registerDatasetAnalysisPrompt(server2);
5125
- registerHvdPrompt(server2);
5119
+ var registerAllPrompts = (server) => {
5120
+ registerThemePrompt(server);
5121
+ registerOrganizationPrompt(server);
5122
+ registerFormatPrompt(server);
5123
+ registerRecentPrompt(server);
5124
+ registerDatasetAnalysisPrompt(server);
5125
+ registerHvdPrompt(server);
5126
5126
  };
5127
5127
 
5128
5128
  // src/server.ts
5129
5129
  function createServer() {
5130
5130
  return new McpServer({
5131
5131
  name: "ckan-mcp-server",
5132
- version: "0.4.91"
5132
+ version: "0.4.92"
5133
5133
  });
5134
5134
  }
5135
- function registerAll(server2) {
5136
- registerPackageTools(server2);
5137
- registerOrganizationTools(server2);
5138
- registerDatastoreTools(server2);
5139
- registerStatusTools(server2);
5140
- registerTagTools(server2);
5141
- registerGroupTools(server2);
5142
- registerQualityTools(server2);
5143
- registerAnalyzeTools(server2);
5144
- registerCatalogStatsTools(server2);
5145
- registerSparqlTools(server2);
5146
- registerPortalDiscoveryTools(server2);
5147
- registerAllResources(server2);
5148
- 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);
5149
5149
  }
5150
5150
 
5151
5151
  // src/transport/stdio.ts
5152
5152
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5153
- async function runStdio(server2) {
5153
+ async function runStdio(server) {
5154
5154
  const transport2 = new StdioServerTransport();
5155
- await server2.connect(transport2);
5155
+ await server.connect(transport2);
5156
5156
  console.error("CKAN MCP server running on stdio");
5157
5157
  }
5158
5158
 
5159
5159
  // src/transport/http.ts
5160
5160
  import express from "express";
5161
5161
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
5162
- async function runHTTP(server2) {
5162
+ async function runHTTP() {
5163
5163
  const app = express();
5164
5164
  app.use(express.json());
5165
- const transport2 = new StreamableHTTPServerTransport({
5166
- sessionIdGenerator: void 0,
5167
- enableJsonResponse: true
5168
- });
5169
- await server2.connect(transport2);
5170
5165
  app.get("/.well-known/oauth-authorization-server", (_req, res) => {
5171
5166
  res.status(404).json({ error: "authorization_not_supported", error_description: "This server does not require authentication" });
5172
5167
  });
5173
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);
5174
5176
  await transport2.handleRequest(req, res, req.body);
5175
5177
  });
5176
5178
  const port = parseInt(process.env.PORT || "3000");
@@ -5180,15 +5182,15 @@ async function runHTTP(server2) {
5180
5182
  }
5181
5183
 
5182
5184
  // src/index.ts
5183
- var server = createServer();
5184
- registerAll(server);
5185
5185
  var transport = process.env.TRANSPORT || "stdio";
5186
5186
  if (transport === "http") {
5187
- runHTTP(server).catch((error) => {
5187
+ runHTTP().catch((error) => {
5188
5188
  console.error("Server error:", error);
5189
5189
  process.exit(1);
5190
5190
  });
5191
5191
  } else {
5192
+ const server = createServer();
5193
+ registerAll(server);
5192
5194
  runStdio(server).catch((error) => {
5193
5195
  console.error("Server error:", error);
5194
5196
  process.exit(1);
package/dist/worker.js CHANGED
@@ -1086,7 +1086,7 @@ ckan_package_search({
1086
1086
  })
1087
1087
  \`\`\`
1088
1088
 
1089
- If the portal supports HVD classification, look for datasets with fields like \`hvd_category\` or \`applicable_legislation\`.`,$b=t=>{t.registerPrompt(sC,{title:"Search High-Value Datasets (HVD)",description:"Guided prompt to find High-Value Datasets (HVD) on a CKAN portal. Automatically uses the correct filter field from portal configuration.",argsSchema:{server_url:v.string().url().describe("Base URL of the CKAN server"),rows:v.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,rows:r})=>{let n=co(e);return ht(iC(e,r,n?.category_field??null))})};var Sb=t=>{vb(t),bb(t),wb(t),xb(t),kb(t),$b(t)};function zb(){return new ga({name:"ckan-mcp-server",version:"0.4.90"})}function Tb(t){Kv(t),Jv(t),Gv(t),Qv(t),Yv(t),eb(t),ib(t),ab(t),cb(t),ub(t),lb(t),_b(t),Sb(t)}var qa=class{constructor(e={}){this._started=!1,this._hasHandledRequest=!1,this._streamMapping=new Map,this._requestToStreamMapping=new Map,this._requestResponseMap=new Map,this._initialized=!1,this._enableJsonResponse=!1,this._standaloneSseStreamId="_GET_stream",this.sessionIdGenerator=e.sessionIdGenerator,this._enableJsonResponse=e.enableJsonResponse??!1,this._eventStore=e.eventStore,this._onsessioninitialized=e.onsessioninitialized,this._onsessionclosed=e.onsessionclosed,this._allowedHosts=e.allowedHosts,this._allowedOrigins=e.allowedOrigins,this._enableDnsRebindingProtection=e.enableDnsRebindingProtection??!1,this._retryInterval=e.retryInterval}async start(){if(this._started)throw new Error("Transport already started");this._started=!0}createJsonErrorResponse(e,r,n,o){let s={code:r,message:n};return o?.data!==void 0&&(s.data=o.data),new Response(JSON.stringify({jsonrpc:"2.0",error:s,id:null}),{status:e,headers:{"Content-Type":"application/json",...o?.headers}})}validateRequestHeaders(e){if(this._enableDnsRebindingProtection){if(this._allowedHosts&&this._allowedHosts.length>0){let r=e.headers.get("host");if(!r||!this._allowedHosts.includes(r)){let n=`Invalid Host header: ${r}`;return this.onerror?.(new Error(n)),this.createJsonErrorResponse(403,-32e3,n)}}if(this._allowedOrigins&&this._allowedOrigins.length>0){let r=e.headers.get("origin");if(r&&!this._allowedOrigins.includes(r)){let n=`Invalid Origin header: ${r}`;return this.onerror?.(new Error(n)),this.createJsonErrorResponse(403,-32e3,n)}}}}async handleRequest(e,r){if(!this.sessionIdGenerator&&this._hasHandledRequest)throw new Error("Stateless transport cannot be reused across requests. Create a new transport per request.");this._hasHandledRequest=!0;let n=this.validateRequestHeaders(e);if(n)return n;switch(e.method){case"POST":return this.handlePostRequest(e,r);case"GET":return this.handleGetRequest(e);case"DELETE":return this.handleDeleteRequest(e);default:return this.handleUnsupportedRequest()}}async writePrimingEvent(e,r,n,o){if(!this._eventStore||o<"2025-11-25")return;let s=await this._eventStore.storeEvent(n,{}),i=`id: ${s}
1089
+ If the portal supports HVD classification, look for datasets with fields like \`hvd_category\` or \`applicable_legislation\`.`,$b=t=>{t.registerPrompt(sC,{title:"Search High-Value Datasets (HVD)",description:"Guided prompt to find High-Value Datasets (HVD) on a CKAN portal. Automatically uses the correct filter field from portal configuration.",argsSchema:{server_url:v.string().url().describe("Base URL of the CKAN server"),rows:v.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,rows:r})=>{let n=co(e);return ht(iC(e,r,n?.category_field??null))})};var Sb=t=>{vb(t),bb(t),wb(t),xb(t),kb(t),$b(t)};function zb(){return new ga({name:"ckan-mcp-server",version:"0.4.91"})}function Tb(t){Kv(t),Jv(t),Gv(t),Qv(t),Yv(t),eb(t),ib(t),ab(t),cb(t),ub(t),lb(t),_b(t),Sb(t)}var qa=class{constructor(e={}){this._started=!1,this._hasHandledRequest=!1,this._streamMapping=new Map,this._requestToStreamMapping=new Map,this._requestResponseMap=new Map,this._initialized=!1,this._enableJsonResponse=!1,this._standaloneSseStreamId="_GET_stream",this.sessionIdGenerator=e.sessionIdGenerator,this._enableJsonResponse=e.enableJsonResponse??!1,this._eventStore=e.eventStore,this._onsessioninitialized=e.onsessioninitialized,this._onsessionclosed=e.onsessionclosed,this._allowedHosts=e.allowedHosts,this._allowedOrigins=e.allowedOrigins,this._enableDnsRebindingProtection=e.enableDnsRebindingProtection??!1,this._retryInterval=e.retryInterval}async start(){if(this._started)throw new Error("Transport already started");this._started=!0}createJsonErrorResponse(e,r,n,o){let s={code:r,message:n};return o?.data!==void 0&&(s.data=o.data),new Response(JSON.stringify({jsonrpc:"2.0",error:s,id:null}),{status:e,headers:{"Content-Type":"application/json",...o?.headers}})}validateRequestHeaders(e){if(this._enableDnsRebindingProtection){if(this._allowedHosts&&this._allowedHosts.length>0){let r=e.headers.get("host");if(!r||!this._allowedHosts.includes(r)){let n=`Invalid Host header: ${r}`;return this.onerror?.(new Error(n)),this.createJsonErrorResponse(403,-32e3,n)}}if(this._allowedOrigins&&this._allowedOrigins.length>0){let r=e.headers.get("origin");if(r&&!this._allowedOrigins.includes(r)){let n=`Invalid Origin header: ${r}`;return this.onerror?.(new Error(n)),this.createJsonErrorResponse(403,-32e3,n)}}}}async handleRequest(e,r){if(!this.sessionIdGenerator&&this._hasHandledRequest)throw new Error("Stateless transport cannot be reused across requests. Create a new transport per request.");this._hasHandledRequest=!0;let n=this.validateRequestHeaders(e);if(n)return n;switch(e.method){case"POST":return this.handlePostRequest(e,r);case"GET":return this.handleGetRequest(e);case"DELETE":return this.handleDeleteRequest(e);default:return this.handleUnsupportedRequest()}}async writePrimingEvent(e,r,n,o){if(!this._eventStore||o<"2025-11-25")return;let s=await this._eventStore.storeEvent(n,{}),i=`id: ${s}
1090
1090
  data:
1091
1091
 
1092
1092
  `;this._retryInterval!==void 0&&(i=`id: ${s}
@@ -1280,4 +1280,4 @@ data:
1280
1280
  </div>
1281
1281
  </div>
1282
1282
  </body>
1283
- </html>`,{headers:{"Content-Type":"text/html; charset=utf-8","Access-Control-Allow-Origin":"*"}});if(t.method==="GET"&&e.pathname==="/health")return new Response(JSON.stringify({status:"ok",version:"0.4.90",tools:20,resources:7,prompts:6,runtime:"cloudflare-workers"}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});if(e.pathname==="/mcp"){if(t.method==="OPTIONS")return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Accept, Authorization, Mcp-Session-Id","Access-Control-Max-Age":"86400"}});try{let r=zb();Tb(r);let n=new qa({sessionIdGenerator:void 0,enableJsonResponse:!0});await r.connect(n);let o=t.clone();try{let a=await o.json();if(a?.method==="tools/call"&&a?.params?.name){let c=a.params.name,u=a.params.arguments??{},l={tool:c,server:u.server_url??u.endpoint_url??""};u.q!==void 0&&(l.q=u.q),u.fq!==void 0&&(l.fq=u.fq),u.query!==void 0&&(l.query=u.query),u.id!==void 0&&(l.id=u.id),u.name!==void 0&&(l.name=u.name),u.pattern!==void 0&&(l.pattern=u.pattern),u.resource_id!==void 0&&(l.resource_id=u.resource_id),u.format_filter!==void 0&&(l.format_filter=u.format_filter),u.sort!==void 0&&(l.sort=u.sort),u.rows!==void 0&&(l.rows=u.rows),u.limit!==void 0&&(l.limit=u.limit),u.sql!==void 0&&(l.sql=String(u.sql).slice(0,200)),u.country!==void 0&&(l.country=u.country),u.language!==void 0&&(l.language=u.language),u.has_datastore!==void 0&&(l.has_datastore=u.has_datastore),u.min_datasets!==void 0&&(l.min_datasets=u.min_datasets),console.log(JSON.stringify(l))}}catch{}let s=await n.handleRequest(t),i=new Headers(s.headers);return i.set("Access-Control-Allow-Origin","*"),i.set("X-Service-Notice","Demo instance - 100k requests/day shared quota"),i.set("X-Recommendation","https://github.com/ondata/ckan-mcp-server#installation"),new Response(s.body,{status:s.status,statusText:s.statusText,headers:i})}catch(r){return console.error("Worker error:",r),new Response(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal error",data:r instanceof Error?r.message:String(r)},id:null}),{status:500,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}})}}return new Response("Not Found",{status:404,headers:{"Access-Control-Allow-Origin":"*"}})}};export{nF as default};
1283
+ </html>`,{headers:{"Content-Type":"text/html; charset=utf-8","Access-Control-Allow-Origin":"*"}});if(t.method==="GET"&&e.pathname==="/health")return new Response(JSON.stringify({status:"ok",version:"0.4.91",tools:20,resources:7,prompts:6,runtime:"cloudflare-workers"}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});if(e.pathname==="/mcp"){if(t.method==="OPTIONS")return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Accept, Authorization, Mcp-Session-Id","Access-Control-Max-Age":"86400"}});try{let r=zb();Tb(r);let n=new qa({sessionIdGenerator:void 0,enableJsonResponse:!0});await r.connect(n);let o=t.clone();try{let a=await o.json();if(a?.method==="tools/call"&&a?.params?.name){let c=a.params.name,u=a.params.arguments??{},l={tool:c,server:u.server_url??u.endpoint_url??""};u.q!==void 0&&(l.q=u.q),u.fq!==void 0&&(l.fq=u.fq),u.query!==void 0&&(l.query=u.query),u.id!==void 0&&(l.id=u.id),u.name!==void 0&&(l.name=u.name),u.pattern!==void 0&&(l.pattern=u.pattern),u.resource_id!==void 0&&(l.resource_id=u.resource_id),u.format_filter!==void 0&&(l.format_filter=u.format_filter),u.sort!==void 0&&(l.sort=u.sort),u.rows!==void 0&&(l.rows=u.rows),u.limit!==void 0&&(l.limit=u.limit),u.sql!==void 0&&(l.sql=String(u.sql).slice(0,200)),u.country!==void 0&&(l.country=u.country),u.language!==void 0&&(l.language=u.language),u.has_datastore!==void 0&&(l.has_datastore=u.has_datastore),u.min_datasets!==void 0&&(l.min_datasets=u.min_datasets),console.log(JSON.stringify(l))}}catch{}let s=await n.handleRequest(t),i=new Headers(s.headers);return i.set("Access-Control-Allow-Origin","*"),i.set("X-Service-Notice","Demo instance - 100k requests/day shared quota"),i.set("X-Recommendation","https://github.com/ondata/ckan-mcp-server#installation"),new Response(s.body,{status:s.status,statusText:s.statusText,headers:i})}catch(r){return console.error("Worker error:",r),new Response(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal error",data:r instanceof Error?r.message:String(r)},id:null}),{status:500,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}})}}return new Response("Not Found",{status:404,headers:{"Access-Control-Allow-Origin":"*"}})}};export{nF as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aborruso/ckan-mcp-server",
3
- "version": "0.4.91",
3
+ "version": "0.4.92",
4
4
  "mcpName": "io.github.aborruso/ckan-mcp-server",
5
5
  "description": "MCP server for interacting with CKAN open data portals",
6
6
  "main": "dist/index.js",