@aborruso/ckan-mcp-server 0.4.89 → 0.4.90
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 +6 -0
- package/dist/index.js +1 -1
- package/dist/worker.js +3 -3
- package/package.json +2 -2
package/LOG.md
CHANGED
package/dist/index.js
CHANGED
package/dist/worker.js
CHANGED
|
@@ -497,7 +497,7 @@ Examples:
|
|
|
497
497
|
- { server_url: "https://www.dati.gov.it/opendata", pattern: "toscana" }
|
|
498
498
|
- { server_url: "https://catalog.data.gov", pattern: "health" }
|
|
499
499
|
|
|
500
|
-
Typical workflow: ckan_organization_search \u2192 ckan_organization_show (get details) \u2192 ckan_package_search with fq="organization:name"`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),pattern:v.string().min(1).describe("Name pattern to search for (wildcards added automatically, e.g., 'toscana', 'health')"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0}},async e=>{try{let r=`organization:*${e.pattern}*`,n=await F(e.server_url,"package_search",{q:r,rows:0,"facet.field":JSON.stringify(["organization"]),"facet.limit":500}),o=n.search_facets?.organization?.items||[],s=n.count||0;if(e.response_format==="json"){let a={count:o.length,total_datasets:s,organizations:o.map(c=>({name:c.name,display_name:c.display_name,dataset_count:c.count,view_url:gn(e.server_url,{name:c.name})}))};return{content:[{type:"text",text:W(JSON.stringify(a,null,2))}],structuredContent:a}}let i=`# CKAN Organization Search Results
|
|
500
|
+
Typical workflow: ckan_organization_search \u2192 ckan_organization_show (get details) \u2192 ckan_package_search with fq="organization:name"`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),pattern:v.string().min(1).describe("Name pattern to search for (wildcards added automatically, e.g., 'toscana', 'health')"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0}},async e=>{try{let r=`organization:*${e.pattern.toLowerCase()}*`,n=await F(e.server_url,"package_search",{q:r,rows:0,"facet.field":JSON.stringify(["organization"]),"facet.limit":500}),o=n.search_facets?.organization?.items||[],s=n.count||0;if(e.response_format==="json"){let a={count:o.length,total_datasets:s,organizations:o.map(c=>({name:c.name,display_name:c.display_name,dataset_count:c.count,view_url:gn(e.server_url,{name:c.name})}))};return{content:[{type:"text",text:W(JSON.stringify(a,null,2))}],structuredContent:a}}let i=`# CKAN Organization Search Results
|
|
501
501
|
|
|
502
502
|
`;if(i+=`**Server**: ${e.server_url}
|
|
503
503
|
`,i+=`**Pattern**: "${e.pattern}"
|
|
@@ -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(aC,{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=io(e);return ht(cC(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 ha({name:"ckan-mcp-server",version:"0.4.
|
|
1089
|
+
If the portal supports HVD classification, look for datasets with fields like \`hvd_category\` or \`applicable_legislation\`.`,$b=t=>{t.registerPrompt(aC,{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=io(e);return ht(cC(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 ha({name:"ckan-mcp-server",version:"0.4.89"})}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 ja=class{constructor(e={}){this._started=!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){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.
|
|
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.89",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=t.clone();try{let s=await r.json();if(s?.method==="tools/call"&&s?.params?.name){let i=s.params.name,a=s.params.arguments??{},c={tool:i,server:a.server_url??a.endpoint_url??""};a.q!==void 0&&(c.q=a.q),a.fq!==void 0&&(c.fq=a.fq),a.query!==void 0&&(c.query=a.query),a.id!==void 0&&(c.id=a.id),a.name!==void 0&&(c.name=a.name),a.pattern!==void 0&&(c.pattern=a.pattern),a.resource_id!==void 0&&(c.resource_id=a.resource_id),a.format_filter!==void 0&&(c.format_filter=a.format_filter),a.sort!==void 0&&(c.sort=a.sort),a.rows!==void 0&&(c.rows=a.rows),a.limit!==void 0&&(c.limit=a.limit),a.sql!==void 0&&(c.sql=String(a.sql).slice(0,200)),a.country!==void 0&&(c.country=a.country),a.language!==void 0&&(c.language=a.language),a.has_datastore!==void 0&&(c.has_datastore=a.has_datastore),a.min_datasets!==void 0&&(c.min_datasets=a.min_datasets),console.log(JSON.stringify(c))}}catch{}let n=await Eb.handleRequest(t),o=new Headers(n.headers);return o.set("Access-Control-Allow-Origin","*"),o.set("X-Service-Notice","Demo instance - 100k requests/day shared quota"),o.set("X-Recommendation","https://github.com/ondata/ckan-mcp-server#installation"),new Response(n.body,{status:n.status,statusText:n.statusText,headers:o})}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{oF as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aborruso/ckan-mcp-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.90",
|
|
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",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"license": "MIT",
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@modelcontextprotocol/ext-apps": "^1.0.1",
|
|
40
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
40
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
41
41
|
"axios": "^1.7.2",
|
|
42
42
|
"express": "^4.19.2",
|
|
43
43
|
"zod": "^3.23.8"
|