@aborruso/ckan-mcp-server 0.4.10 → 0.4.11

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,11 @@
2
2
 
3
3
  ## 2026-01-15
4
4
 
5
+ ### Version 0.4.11 - Prompt argument coercion
6
+ - **Fix**: Prompt arguments now coerce numeric strings (e.g., rows) for MCP prompt requests
7
+ - **Docs**: Updated evaluation notes for 0.4.11
8
+ - **No breaking changes**: Prompt names and outputs unchanged
9
+
5
10
  ### Version 0.4.10 - Guided MCP prompts
6
11
  - **Feature**: Added 5 guided MCP prompts (theme, organization, format, recent datasets, dataset analysis)
7
12
  - **Docs**: README and new `docs/prompts.md` updated with usage examples
package/dist/index.js CHANGED
@@ -2282,7 +2282,7 @@ var registerThemePrompt = (server2) => {
2282
2282
  argsSchema: {
2283
2283
  server_url: z8.string().url().describe("Base URL of the CKAN server"),
2284
2284
  theme: z8.string().min(1).describe("Theme or group name to search"),
2285
- rows: z8.number().int().positive().default(10).describe("Max results to return")
2285
+ rows: z8.coerce.number().int().positive().default(10).describe("Max results to return")
2286
2286
  }
2287
2287
  },
2288
2288
  async ({ server_url, theme, rows }) => createTextPrompt(buildThemePromptText(server_url, theme, rows))
@@ -2323,7 +2323,7 @@ var registerOrganizationPrompt = (server2) => {
2323
2323
  argsSchema: {
2324
2324
  server_url: z9.string().url().describe("Base URL of the CKAN server"),
2325
2325
  organization: z9.string().min(1).describe("Organization name or keyword"),
2326
- rows: z9.number().int().positive().default(10).describe("Max results to return")
2326
+ rows: z9.coerce.number().int().positive().default(10).describe("Max results to return")
2327
2327
  }
2328
2328
  },
2329
2329
  async ({ server_url, organization, rows }) => createTextPrompt(buildOrganizationPromptText(server_url, organization, rows))
@@ -2354,7 +2354,7 @@ var registerFormatPrompt = (server2) => {
2354
2354
  argsSchema: {
2355
2355
  server_url: z10.string().url().describe("Base URL of the CKAN server"),
2356
2356
  format: z10.string().min(1).describe("Resource format (e.g., CSV, JSON)"),
2357
- rows: z10.number().int().positive().default(10).describe("Max results to return")
2357
+ rows: z10.coerce.number().int().positive().default(10).describe("Max results to return")
2358
2358
  }
2359
2359
  },
2360
2360
  async ({ server_url, format, rows }) => createTextPrompt(buildFormatPromptText(server_url, format, rows))
@@ -2391,7 +2391,7 @@ var registerRecentPrompt = (server2) => {
2391
2391
  description: "Guided prompt to list recently updated datasets on a CKAN portal.",
2392
2392
  argsSchema: {
2393
2393
  server_url: z11.string().url().describe("Base URL of the CKAN server"),
2394
- rows: z11.number().int().positive().default(10).describe("Max results to return")
2394
+ rows: z11.coerce.number().int().positive().default(10).describe("Max results to return")
2395
2395
  }
2396
2396
  },
2397
2397
  async ({ server_url, rows }) => createTextPrompt(buildRecentPromptText(server_url, rows))
@@ -2462,7 +2462,7 @@ var registerAllPrompts = (server2) => {
2462
2462
  function createServer() {
2463
2463
  return new McpServer({
2464
2464
  name: "ckan-mcp-server",
2465
- version: "0.4.10"
2465
+ version: "0.4.11"
2466
2466
  });
2467
2467
  }
2468
2468
  function registerAll(server2) {
package/dist/worker.js CHANGED
@@ -623,7 +623,7 @@ ckan_package_search({
623
623
  q: "tags:${e}",
624
624
  sort: "metadata_modified desc",
625
625
  rows: ${r}
626
- })`,$v=t=>{t.registerPrompt(rO,{title:"Search datasets by theme",description:"Guided prompt to discover a theme and search datasets under it.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),theme:$.string().min(1).describe("Theme or group name to search"),rows:$.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,theme:r,rows:n})=>jt(nO(e,r,n)))};var oO="ckan-search-by-organization",sO=(t,e,r)=>`# Guided search: datasets by organization
626
+ })`,$v=t=>{t.registerPrompt(rO,{title:"Search datasets by theme",description:"Guided prompt to discover a theme and search datasets under it.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),theme:$.string().min(1).describe("Theme or group name to search"),rows:$.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,theme:r,rows:n})=>jt(nO(e,r,n)))};var oO="ckan-search-by-organization",sO=(t,e,r)=>`# Guided search: datasets by organization
627
627
 
628
628
  ## Step 1: Discover matching organizations
629
629
  Use \`ckan_package_search\` with an organization wildcard and facets:
@@ -644,7 +644,7 @@ ckan_package_search({
644
644
  fq: "organization:<org-id>",
645
645
  sort: "metadata_modified desc",
646
646
  rows: ${r}
647
- })`,Sv=t=>{t.registerPrompt(oO,{title:"Search datasets by organization",description:"Guided prompt to find a publisher and list its datasets.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),organization:$.string().min(1).describe("Organization name or keyword"),rows:$.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,organization:r,rows:n})=>jt(sO(e,r,n)))};var iO="ckan-search-by-format",aO=(t,e,r)=>`# Guided search: datasets by resource format
647
+ })`,Sv=t=>{t.registerPrompt(oO,{title:"Search datasets by organization",description:"Guided prompt to find a publisher and list its datasets.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),organization:$.string().min(1).describe("Organization name or keyword"),rows:$.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,organization:r,rows:n})=>jt(sO(e,r,n)))};var iO="ckan-search-by-format",aO=(t,e,r)=>`# Guided search: datasets by resource format
648
648
 
649
649
  Use \`ckan_package_search\` with a format filter:
650
650
 
@@ -655,7 +655,7 @@ ckan_package_search({
655
655
  rows: ${r}
656
656
  })
657
657
 
658
- Tip: try uppercase (CSV/JSON) or common variants if results are sparse.`,kv=t=>{t.registerPrompt(iO,{title:"Search datasets by resource format",description:"Guided prompt to find datasets with a given resource format.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),format:$.string().min(1).describe("Resource format (e.g., CSV, JSON)"),rows:$.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,format:r,rows:n})=>jt(aO(e,r,n)))};var cO="ckan-recent-datasets",uO=(t,e)=>`# Guided search: recent datasets
658
+ Tip: try uppercase (CSV/JSON) or common variants if results are sparse.`,kv=t=>{t.registerPrompt(iO,{title:"Search datasets by resource format",description:"Guided prompt to find datasets with a given resource format.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),format:$.string().min(1).describe("Resource format (e.g., CSV, JSON)"),rows:$.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,format:r,rows:n})=>jt(aO(e,r,n)))};var cO="ckan-recent-datasets",uO=(t,e)=>`# Guided search: recent datasets
659
659
 
660
660
  Use \`ckan_package_search\` sorted by modification date:
661
661
 
@@ -673,7 +673,7 @@ ckan_package_search({
673
673
  q: "metadata_modified:[NOW-30DAYS TO *]",
674
674
  sort: "metadata_modified desc",
675
675
  rows: ${e}
676
- })`,zv=t=>{t.registerPrompt(cO,{title:"Find recently updated datasets",description:"Guided prompt to list recently updated datasets on a CKAN portal.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),rows:$.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,rows:r})=>jt(uO(e,r)))};var lO="ckan-analyze-dataset",dO=(t,e)=>`# Guided analysis: dataset
676
+ })`,zv=t=>{t.registerPrompt(cO,{title:"Find recently updated datasets",description:"Guided prompt to list recently updated datasets on a CKAN portal.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),rows:$.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,rows:r})=>jt(uO(e,r)))};var lO="ckan-analyze-dataset",dO=(t,e)=>`# Guided analysis: dataset
677
677
 
678
678
  ## Step 1: Get dataset metadata
679
679
  Use \`ckan_package_show\` to load full metadata and resources:
@@ -705,7 +705,7 @@ For aggregates, use SQL:
705
705
  ckan_datastore_search_sql({
706
706
  server_url: "${t}",
707
707
  sql: "SELECT * FROM "<resource-id>" LIMIT 10"
708
- })`,Tv=t=>{t.registerPrompt(lO,{title:"Analyze a dataset",description:"Guided prompt to inspect dataset metadata and explore DataStore tables.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),id:$.string().min(1).describe("Dataset id or name (CKAN package id)")}},async({server_url:e,id:r})=>jt(dO(e,r)))};var Ev=t=>{$v(t),Sv(t),kv(t),zv(t),Tv(t)};function Rv(){return new na({name:"ckan-mcp-server",version:"0.4.10"})}function Pv(t){pv(t),fv(t),mv(t),hv(t),gv(t),_v(t),wv(t),Ev(t)}var wa=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}
708
+ })`,Tv=t=>{t.registerPrompt(lO,{title:"Analyze a dataset",description:"Guided prompt to inspect dataset metadata and explore DataStore tables.",argsSchema:{server_url:$.string().url().describe("Base URL of the CKAN server"),id:$.string().min(1).describe("Dataset id or name (CKAN package id)")}},async({server_url:e,id:r})=>jt(dO(e,r)))};var Ev=t=>{$v(t),Sv(t),kv(t),zv(t),Tv(t)};function Rv(){return new na({name:"ckan-mcp-server",version:"0.4.11"})}function Pv(t){pv(t),fv(t),mv(t),hv(t),gv(t),_v(t),wv(t),Ev(t)}var wa=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}
709
709
  data:
710
710
 
711
711
  `;this._retryInterval!==void 0&&(i=`id: ${s}
@@ -888,8 +888,8 @@ data:
888
888
  <pre><code>curl ${e.origin}/health</code></pre>
889
889
 
890
890
  <div class="footer">
891
- Version 0.4.10 \u2022 Running on Cloudflare Workers \u2022 <a href="https://github.com/aborruso/ckan-mcp-server/blob/main/LICENSE.txt" target="_blank">MIT License</a>
891
+ Version 0.4.11 \u2022 Running on Cloudflare Workers \u2022 <a href="https://github.com/aborruso/ckan-mcp-server/blob/main/LICENSE.txt" target="_blank">MIT License</a>
892
892
  </div>
893
893
  </div>
894
894
  </body>
895
- </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.10",tools:13,resources:3,prompts:5,runtime:"cloudflare-workers"}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});if(e.pathname==="/mcp")try{let r=await Nv.handleRequest(t),n=new Headers(r.headers);return n.set("Access-Control-Allow-Origin","*"),new Response(r.body,{status:r.status,statusText:r.statusText,headers:n})}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{mL as default};
895
+ </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.11",tools:13,resources:3,prompts:5,runtime:"cloudflare-workers"}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});if(e.pathname==="/mcp")try{let r=await Nv.handleRequest(t),n=new Headers(r.headers);return n.set("Access-Control-Allow-Origin","*"),new Response(r.body,{status:r.status,statusText:r.statusText,headers:n})}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{mL as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aborruso/ckan-mcp-server",
3
- "version": "0.4.10",
3
+ "version": "0.4.11",
4
4
  "description": "MCP server for interacting with CKAN open data portals",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",