@aborruso/ckan-mcp-server 0.4.91 → 0.4.93
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 +10 -0
- package/dist/index.js +104 -102
- package/dist/worker.js +20 -20
- package/package.json +1 -1
package/LOG.md
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
# LOG
|
|
2
2
|
|
|
3
|
+
## 2026-03-24
|
|
4
|
+
|
|
5
|
+
### v0.4.93
|
|
6
|
+
|
|
7
|
+
- fix(worker): return 405 immediately for GET /mcp — prevents bot scanners from hanging the Worker and consuming CPU quota
|
|
8
|
+
|
|
3
9
|
## 2026-03-23
|
|
4
10
|
|
|
11
|
+
### v0.4.92
|
|
12
|
+
|
|
13
|
+
- fix(http): create server + transport per request — SDK 1.26.0 security fix enforces stateless transport cannot be reused across requests
|
|
14
|
+
|
|
5
15
|
### v0.4.91
|
|
6
16
|
|
|
7
17
|
- 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(
|
|
1098
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
1943
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
2436
|
-
|
|
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
|
-
|
|
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(
|
|
2611
|
-
|
|
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(
|
|
2697
|
-
|
|
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(
|
|
2918
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
3834
|
-
|
|
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
|
-
|
|
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(
|
|
4019
|
-
|
|
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(
|
|
4146
|
-
|
|
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(
|
|
4315
|
-
|
|
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(
|
|
4439
|
-
|
|
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
|
|
4539
|
-
return { server
|
|
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(
|
|
4544
|
-
|
|
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(
|
|
4588
|
-
|
|
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(
|
|
4632
|
-
|
|
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 = (
|
|
4697
|
-
|
|
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(
|
|
4739
|
-
registerDatasetFilterResource(
|
|
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(
|
|
4748
|
-
registerDatasetFilterResource(
|
|
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(
|
|
4757
|
-
registerDatasetFilterResource(
|
|
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(
|
|
4766
|
-
registerDatasetFilterResource(
|
|
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(
|
|
4777
|
-
registerDatasetResource(
|
|
4778
|
-
registerResourceResource(
|
|
4779
|
-
registerOrganizationResource(
|
|
4780
|
-
registerGroupDatasetsResource(
|
|
4781
|
-
registerOrganizationDatasetsResource(
|
|
4782
|
-
registerTagDatasetsResource(
|
|
4783
|
-
registerFormatDatasetsResource(
|
|
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 = (
|
|
4842
|
-
|
|
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 = (
|
|
4887
|
-
|
|
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 = (
|
|
4921
|
-
|
|
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 = (
|
|
4979
|
-
|
|
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 = (
|
|
5030
|
-
|
|
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 = (
|
|
5101
|
-
|
|
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 = (
|
|
5120
|
-
registerThemePrompt(
|
|
5121
|
-
registerOrganizationPrompt(
|
|
5122
|
-
registerFormatPrompt(
|
|
5123
|
-
registerRecentPrompt(
|
|
5124
|
-
registerDatasetAnalysisPrompt(
|
|
5125
|
-
registerHvdPrompt(
|
|
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.
|
|
5132
|
+
version: "0.4.93"
|
|
5133
5133
|
});
|
|
5134
5134
|
}
|
|
5135
|
-
function registerAll(
|
|
5136
|
-
registerPackageTools(
|
|
5137
|
-
registerOrganizationTools(
|
|
5138
|
-
registerDatastoreTools(
|
|
5139
|
-
registerStatusTools(
|
|
5140
|
-
registerTagTools(
|
|
5141
|
-
registerGroupTools(
|
|
5142
|
-
registerQualityTools(
|
|
5143
|
-
registerAnalyzeTools(
|
|
5144
|
-
registerCatalogStatsTools(
|
|
5145
|
-
registerSparqlTools(
|
|
5146
|
-
registerPortalDiscoveryTools(
|
|
5147
|
-
registerAllResources(
|
|
5148
|
-
registerAllPrompts(
|
|
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(
|
|
5153
|
+
async function runStdio(server) {
|
|
5154
5154
|
const transport2 = new StdioServerTransport();
|
|
5155
|
-
await
|
|
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(
|
|
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(
|
|
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);
|