@aborruso/ckan-mcp-server 0.4.37 → 0.4.39

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,52 @@
1
1
  # LOG
2
2
 
3
+ ## 2026-02-02
4
+
5
+ ### Release v0.4.39 - Local Install Promotion
6
+
7
+ **Objective**: Strongly encourage users to install locally instead of using shared Cloudflare Workers demo.
8
+
9
+ **Changes**:
10
+ - Added prominent banner in README recommending local npm installation
11
+ - Simplified Installation section - npm as primary method
12
+ - Repositioned Workers endpoint as "testing only" option
13
+ - Added visible footer to all tool responses when running on Workers
14
+ - Added HTTP headers to Workers responses (X-Service-Notice, X-Recommendation)
15
+ - Updated all MCP client configuration examples to prioritize local install
16
+ - Added note in DEPLOYMENT.md clarifying it's internal team documentation
17
+
18
+ **Footer shown to Workers users**:
19
+ ```
20
+ ℹ️ Demo instance (100k requests/month shared globally). For unlimited access: https://github.com/ondata/ckan-mcp-server#installation
21
+ ```
22
+
23
+ **Files modified**:
24
+ - README.md (banner, installation section, client config examples)
25
+ - src/utils/formatting.ts (isWorkers(), addDemoFooter() functions)
26
+ - src/tools/*.ts (7 tool files - applied footer to markdown responses)
27
+ - src/worker.ts (HTTP headers for debugging)
28
+ - docs/DEPLOYMENT.md (internal documentation note)
29
+
30
+ **No breaking changes** - All existing functionality preserved
31
+
32
+ ---
33
+
34
+ ### Website - Fix flag emoji rendering on Linux/desktop
35
+
36
+ - **Fix**: Replace emoji flags with SVG images from Twemoji CDN
37
+ - **Problem**: Country flag emojis (🇮🇹, 🇺🇸, 🇨🇦, 🇦🇺, 🇬🇧, 🇨🇭) not visible on Linux/desktop browsers lacking color emoji fonts
38
+ - **Solution**: Use `<img>` tags pointing to `https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/svg/`
39
+ - **Benefits**: Works on all platforms, consistent appearance, better accessibility
40
+ - **Files**: `website/src/pages/index.astro` (6 flag replacements), `website/src/styles/global.css` (removed `.emoji-flag` class)
41
+ - **Impact**: Flags now visible on all devices (Linux, Windows, macOS, mobile)
42
+
43
+ ### Release v0.4.38
44
+
45
+ - Enhancement: add portal entries and API base URLs for catalog.data.gov, open.canada.ca, data.gov.au, and opendata.swiss
46
+ - Fix: align server and worker reported version with package version
47
+ - Files: `src/portals.json`, `package.json`, `package-lock.json`, `src/server.ts`, `src/worker.ts`
48
+ - No breaking changes
49
+
3
50
  ## 2026-02-01
4
51
 
5
52
  ### Release v0.4.37
@@ -19,7 +66,8 @@
19
66
 
20
67
  ### Unreleased
21
68
 
22
- - None
69
+ - Docs: clarify GitHub release notes formatting (use here-doc + --notes-file)
70
+ - Files: `AGENTS.md`, `CLAUDE.md`
23
71
 
24
72
  ### Release v0.4.35
25
73
 
package/README.md CHANGED
@@ -24,71 +24,47 @@ MCP (Model Context Protocol) server for interacting with CKAN-based open data po
24
24
 
25
25
  ---
26
26
 
27
- ## Installation
27
+ > ## 🚀 **Recommended: Install Locally**
28
+ >
29
+ > ```bash
30
+ > npm install -g @aborruso/ckan-mcp-server
31
+ > ```
32
+ >
33
+ > **Benefits:**
34
+ > - ✅ **No request limits** - unlimited queries
35
+ > - ✅ **Faster** - no network latency
36
+ > - ✅ **Always available** - no shared quota
37
+ > - ✅ **Free** - open source, no costs
38
+ >
39
+ > The Cloudflare Workers endpoint is only for quick testing (100k requests/month shared globally across all users).
28
40
 
29
- ### From npm (recommended)
41
+ ---
30
42
 
31
- ```bash
32
- npm install -g @aborruso/ckan-mcp-server
33
- ```
43
+ ## Installation
34
44
 
35
- ### From source
45
+ Install via npm:
36
46
 
37
47
  ```bash
38
- # Clone or copy the project
39
- cd ckan-mcp-server
40
-
41
- # Install dependencies
42
- npm install
43
-
44
- # Build with esbuild (fast, ~4ms)
45
- npm run build
46
-
47
- # Run tests (212 tests)
48
- npm test
48
+ npm install -g @aborruso/ckan-mcp-server
49
49
  ```
50
50
 
51
- ## Usage Options
52
-
53
- ### Option 1: Local Installation (stdio mode)
54
-
55
- **Best for**: Personal use with local MCP clients
51
+ That's it! The server will be available as `ckan-mcp-server` command or via `npx @aborruso/ckan-mcp-server`.
56
52
 
57
- Install and run locally on your machine (see Installation section above).
53
+ ### Quick Testing with Workers (optional)
58
54
 
59
- ### Option 2: Self-Hosted HTTP Server
55
+ For quick testing without installation, you can use the public Cloudflare Workers endpoint:
60
56
 
61
- **Best for**: Team use, custom infrastructure
62
-
63
- Deploy on your own server using Node.js:
64
-
65
- ```bash
66
- TRANSPORT=http PORT=3000 npm start
67
57
  ```
68
-
69
- ### Option 3: Cloudflare Workers
70
-
71
- **Best for**: Global access, zero infrastructure, free hosting
72
-
73
- Use the public Workers endpoint (no local install required):
74
-
75
- ```json
76
- {
77
- "mcpServers": {
78
- "ckan": {
79
- "url": "https://ckan-mcp-server.andy-pr.workers.dev/mcp"
80
- }
81
- }
82
- }
58
+ https://ckan-mcp-server.andy-pr.workers.dev/mcp
83
59
  ```
84
60
 
85
- **NOTE**: This service uses the Cloudflare Workers free tier which has a limit of 100,000 requests per month. **ITS OPERATION IS THEREFORE NOT GUARANTEED**. With local installation, you will not have any problems.
86
-
87
- Want your own deployment? See [DEPLOYMENT.md](docs/DEPLOYMENT.md).
61
+ **⚠️ Warning**: This is a demo instance with 100,000 requests/month shared globally across all users. Not recommended for production use. Install locally for reliable service.
88
62
 
89
63
  ## MCP Client Configuration
90
64
 
91
- This server works with any MCP-compatible client. Below are configuration examples for popular clients, organized by category. Using `@aborruso/ckan-mcp-server@latest` ensures you always get the latest version.
65
+ This server works with any MCP-compatible client. Below are configuration examples for popular clients, organized by category.
66
+
67
+ **Recommended**: Use `@aborruso/ckan-mcp-server@latest` to always get the latest version.
92
68
 
93
69
  ### CLI Tools
94
70
 
@@ -203,7 +179,9 @@ npm install -g @aborruso/ckan-mcp-server
203
179
  }
204
180
  ```
205
181
 
206
- **Using Cloudflare Workers (HTTP)**:
182
+ [Detailed guide](https://github.com/ondata/ckan-mcp-server/discussions/4#discussion-9359684)
183
+
184
+ **For testing only - Cloudflare Workers endpoint**:
207
185
 
208
186
  ```json
209
187
  {
@@ -215,9 +193,7 @@ npm install -g @aborruso/ckan-mcp-server
215
193
  }
216
194
  ```
217
195
 
218
- **NOTE**: The Cloudflare Workers endpoint uses the free tier (100,000 requests/month limit).
219
-
220
- [Detailed guide](https://github.com/ondata/ckan-mcp-server/discussions/4#discussion-9359684)
196
+ ⚠️ **Warning**: Demo instance with 100,000 requests/month shared globally across all users. Not reliable for production use.
221
197
 
222
198
  ### Web Tools
223
199
 
@@ -229,7 +205,7 @@ See [ChatGPT web guide](docs/guide/chatgpt/chatgpt_web.md)
229
205
 
230
206
  See [Claude web guide](docs/guide/claude/claude_web.md)
231
207
 
232
- **Note**: Web tools use a public demo server with 100,000 calls/month limit. For reliable usage, install the server locally.
208
+ ⚠️ **Note**: Web tools use a demo server with 100,000 requests/month shared globally across all users. **For reliable usage, install the server locally** (see Installation section above).
233
209
 
234
210
  ## Available Tools
235
211
 
@@ -422,14 +398,13 @@ ckan_datastore_search_sql({
422
398
 
423
399
  ## Supported CKAN Portals
424
400
 
425
- Some of the main compatible portals:
401
+ Verified portals with public API access:
426
402
 
427
- - 🇮🇹 **www.dati.gov.it/opendata** - Italy
428
- - 🇺🇸 **data.gov** - United States
429
- - 🇨🇦 **open.canada.ca/data** - Canada
430
- - 🇬🇧 **data.gov.uk** - United Kingdom
431
- - 🇪🇺 **data.europa.eu** - European Union
432
- - 🌍 **demo.ckan.org** - CKAN Demo
403
+ - 🇮🇹 **https://www.dati.gov.it/opendata** - Italian National Open Data Portal (CKAN 2.10.3)
404
+ - 🇺🇸 **https://catalog.data.gov** - United States Open Data (CKAN 2.11.4)
405
+ - 🇨🇦 **https://open.canada.ca/data** - Canada Open Government (CKAN 2.10.8)
406
+ - 🇦🇺 **https://data.gov.au** - Australian Government Open Data (CKAN 2.11.4)
407
+ - 🇬🇧 **https://data.gov.uk** - United Kingdom Open Data
433
408
  - And 500+ more portals worldwide
434
409
 
435
410
  ### Portal View URL Templates
package/dist/index.js CHANGED
@@ -59,6 +59,45 @@ var portals_default = {
59
59
  api_path: "/api/action",
60
60
  dataset_view_url: "https://data.gov.uk/dataset/{name}",
61
61
  organization_view_url: "https://data.gov.uk/publisher/{name}"
62
+ },
63
+ {
64
+ id: "catalog-data-gov",
65
+ name: "catalog.data.gov",
66
+ api_url: "https://catalog.data.gov",
67
+ api_url_aliases: [
68
+ "http://catalog.data.gov"
69
+ ]
70
+ },
71
+ {
72
+ id: "open-canada",
73
+ name: "open.canada.ca",
74
+ api_url: "https://open.canada.ca/data",
75
+ api_url_aliases: [
76
+ "http://open.canada.ca/data",
77
+ "https://open.canada.ca",
78
+ "http://open.canada.ca"
79
+ ]
80
+ },
81
+ {
82
+ id: "data-gov-au",
83
+ name: "data.gov.au",
84
+ api_url: "https://data.gov.au",
85
+ api_url_aliases: [
86
+ "http://data.gov.au",
87
+ "https://www.data.gov.au",
88
+ "http://www.data.gov.au"
89
+ ]
90
+ },
91
+ {
92
+ id: "opendata-swiss",
93
+ name: "opendata.swiss",
94
+ api_url: "https://ckan.opendata.swiss",
95
+ api_url_aliases: [
96
+ "https://opendata.swiss",
97
+ "http://opendata.swiss",
98
+ "https://www.opendata.swiss",
99
+ "http://www.opendata.swiss"
100
+ ]
62
101
  }
63
102
  ],
64
103
  defaults: {
@@ -3686,7 +3725,7 @@ var registerAllPrompts = (server2) => {
3686
3725
  function createServer() {
3687
3726
  return new McpServer({
3688
3727
  name: "ckan-mcp-server",
3689
- version: "0.4.36"
3728
+ version: "0.4.38"
3690
3729
  });
3691
3730
  }
3692
3731
  function registerAll(server2) {
package/dist/worker.js CHANGED
@@ -41,7 +41,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
41
41
  `)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...r){let n=new this(e);return r.forEach(o=>n.set(o)),n}static accessor(e){let n=(this[ev]=this[ev]={accessors:{}}).accessors,o=this.prototype;function s(i){let a=cs(i);n[a]||(oO(o,i),n[a]=!0)}return y.isArray(e)?e.forEach(s):s(e),this}};Gn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);y.reduceDescriptors(Gn.prototype,({value:t},e)=>{let r=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(n){this[r]=n}}});y.freezeMethods(Gn);var ze=Gn;function us(t,e){let r=this||Wn,n=e||r,o=ze.from(n.headers),s=n.data;return y.forEach(t,function(a){s=a.call(r,s,o.normalize(),e?e.status:void 0)}),o.normalize(),s}function ls(t){return!!(t&&t.__CANCEL__)}function tv(t,e,r){q.call(this,t??"canceled",q.ERR_CANCELED,e,r),this.name="CanceledError"}y.inherits(tv,q,{__CANCEL__:!0});var jt=tv;function ds(t,e,r){let n=r.config.validateStatus;!r.status||!n||n(r.status)?t(r):e(new q("Request failed with status code "+r.status,[q.ERR_BAD_REQUEST,q.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}function vp(t){let e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(t);return e&&e[1]||""}function sO(t,e){t=t||10;let r=new Array(t),n=new Array(t),o=0,s=0,i;return e=e!==void 0?e:1e3,function(c){let u=Date.now(),l=n[s];i||(i=u),r[o]=c,n[o]=u;let d=s,h=0;for(;d!==o;)h+=r[d++],d=d%t;if(o=(o+1)%t,o===s&&(s=(s+1)%t),u-i<e)return;let f=l&&u-l;return f?Math.round(h*1e3/f):void 0}}var rv=sO;function iO(t,e){let r=0,n=1e3/e,o,s,i=(u,l=Date.now())=>{r=l,o=null,s&&(clearTimeout(s),s=null),t(...u)};return[(...u)=>{let l=Date.now(),d=l-r;d>=n?i(u,l):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},n-d)))},()=>o&&i(o)]}var nv=iO;var Qn=(t,e,r=3)=>{let n=0,o=rv(50,250);return nv(s=>{let i=s.loaded,a=s.lengthComputable?s.total:void 0,c=i-n,u=o(c),l=i<=a;n=i;let d={loaded:i,total:a,progress:a?i/a:void 0,bytes:c,rate:u||void 0,estimated:u&&a&&l?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[e?"download":"upload"]:!0};t(d)},r)},bp=(t,e)=>{let r=t!=null;return[n=>e[0]({lengthComputable:r,total:t,loaded:n}),e[1]]},xp=t=>(...e)=>y.asap(()=>t(...e));var ov=xe.hasStandardBrowserEnv?((t,e)=>r=>(r=new URL(r,xe.origin),t.protocol===r.protocol&&t.host===r.host&&(e||t.port===r.port)))(new URL(xe.origin),xe.navigator&&/(msie|trident)/i.test(xe.navigator.userAgent)):()=>!0;var sv=xe.hasStandardBrowserEnv?{write(t,e,r,n,o,s,i){if(typeof document>"u")return;let a=[`${t}=${encodeURIComponent(e)}`];y.isNumber(r)&&a.push(`expires=${new Date(r).toUTCString()}`),y.isString(n)&&a.push(`path=${n}`),y.isString(o)&&a.push(`domain=${o}`),s===!0&&a.push("secure"),y.isString(i)&&a.push(`SameSite=${i}`),document.cookie=a.join("; ")},read(t){if(typeof document>"u")return null;let e=document.cookie.match(new RegExp("(?:^|; )"+t+"=([^;]*)"));return e?decodeURIComponent(e[1]):null},remove(t){this.write(t,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function wp(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)}function $p(t,e){return e?t.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):t}function ps(t,e,r){let n=!wp(e);return t&&(n||r==!1)?$p(t,e):e}var iv=t=>t instanceof ze?{...t}:t;function $t(t,e){e=e||{};let r={};function n(u,l,d,h){return y.isPlainObject(u)&&y.isPlainObject(l)?y.merge.call({caseless:h},u,l):y.isPlainObject(l)?y.merge({},l):y.isArray(l)?l.slice():l}function o(u,l,d,h){if(y.isUndefined(l)){if(!y.isUndefined(u))return n(void 0,u,d,h)}else return n(u,l,d,h)}function s(u,l){if(!y.isUndefined(l))return n(void 0,l)}function i(u,l){if(y.isUndefined(l)){if(!y.isUndefined(u))return n(void 0,u)}else return n(void 0,l)}function a(u,l,d){if(d in e)return n(u,l);if(d in t)return n(void 0,u)}let c={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(u,l,d)=>o(iv(u),iv(l),d,!0)};return y.forEach(Object.keys({...t,...e}),function(l){let d=c[l]||o,h=d(t[l],e[l],l);y.isUndefined(h)&&d!==a||(r[l]=h)}),r}var _a=t=>{let e=$t({},t),{data:r,withXSRFToken:n,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=e;if(e.headers=i=ze.from(i),e.url=as(ps(e.baseURL,e.url,e.allowAbsoluteUrls),t.params,t.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),y.isFormData(r)){if(xe.hasStandardBrowserEnv||xe.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if(y.isFunction(r.getHeaders)){let c=r.getHeaders(),u=["content-type","content-length"];Object.entries(c).forEach(([l,d])=>{u.includes(l.toLowerCase())&&i.set(l,d)})}}if(xe.hasStandardBrowserEnv&&(n&&y.isFunction(n)&&(n=n(e)),n||n!==!1&&ov(e.url))){let c=o&&s&&sv.read(s);c&&i.set(o,c)}return e};var aO=typeof XMLHttpRequest<"u",av=aO&&function(t){return new Promise(function(r,n){let o=_a(t),s=o.data,i=ze.from(o.headers).normalize(),{responseType:a,onUploadProgress:c,onDownloadProgress:u}=o,l,d,h,f,p;function m(){f&&f(),p&&p(),o.cancelToken&&o.cancelToken.unsubscribe(l),o.signal&&o.signal.removeEventListener("abort",l)}let g=new XMLHttpRequest;g.open(o.method.toUpperCase(),o.url,!0),g.timeout=o.timeout;function _(){if(!g)return;let w=ze.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders()),O={data:!a||a==="text"||a==="json"?g.responseText:g.response,status:g.status,statusText:g.statusText,headers:w,config:t,request:g};ds(function(de){r(de),m()},function(de){n(de),m()},O),g=null}"onloadend"in g?g.onloadend=_:g.onreadystatechange=function(){!g||g.readyState!==4||g.status===0&&!(g.responseURL&&g.responseURL.indexOf("file:")===0)||setTimeout(_)},g.onabort=function(){g&&(n(new q("Request aborted",q.ECONNABORTED,t,g)),g=null)},g.onerror=function(z){let O=z&&z.message?z.message:"Network Error",_e=new q(O,q.ERR_NETWORK,t,g);_e.event=z||null,n(_e),g=null},g.ontimeout=function(){let z=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded",O=o.transitional||ha;o.timeoutErrorMessage&&(z=o.timeoutErrorMessage),n(new q(z,O.clarifyTimeoutError?q.ETIMEDOUT:q.ECONNABORTED,t,g)),g=null},s===void 0&&i.setContentType(null),"setRequestHeader"in g&&y.forEach(i.toJSON(),function(z,O){g.setRequestHeader(O,z)}),y.isUndefined(o.withCredentials)||(g.withCredentials=!!o.withCredentials),a&&a!=="json"&&(g.responseType=o.responseType),u&&([h,p]=Qn(u,!0),g.addEventListener("progress",h)),c&&g.upload&&([d,f]=Qn(c),g.upload.addEventListener("progress",d),g.upload.addEventListener("loadend",f)),(o.cancelToken||o.signal)&&(l=w=>{g&&(n(!w||w.type?new jt(null,t,g):w),g.abort(),g=null)},o.cancelToken&&o.cancelToken.subscribe(l),o.signal&&(o.signal.aborted?l():o.signal.addEventListener("abort",l)));let x=vp(o.url);if(x&&xe.protocols.indexOf(x)===-1){n(new q("Unsupported protocol "+x+":",q.ERR_BAD_REQUEST,t));return}g.send(s||null)})};var cO=(t,e)=>{let{length:r}=t=t?t.filter(Boolean):[];if(e||r){let n=new AbortController,o,s=function(u){if(!o){o=!0,a();let l=u instanceof Error?u:this.reason;n.abort(l instanceof q?l:new jt(l instanceof Error?l.message:l))}},i=e&&setTimeout(()=>{i=null,s(new q(`timeout ${e} of ms exceeded`,q.ETIMEDOUT))},e),a=()=>{t&&(i&&clearTimeout(i),i=null,t.forEach(u=>{u.unsubscribe?u.unsubscribe(s):u.removeEventListener("abort",s)}),t=null)};t.forEach(u=>u.addEventListener("abort",s));let{signal:c}=n;return c.unsubscribe=()=>y.asap(a),c}},cv=cO;var uO=function*(t,e){let r=t.byteLength;if(!e||r<e){yield t;return}let n=0,o;for(;n<r;)o=n+e,yield t.slice(n,o),n=o},lO=async function*(t,e){for await(let r of dO(t))yield*uO(r,e)},dO=async function*(t){if(t[Symbol.asyncIterator]){yield*t;return}let e=t.getReader();try{for(;;){let{done:r,value:n}=await e.read();if(r)break;yield n}}finally{await e.cancel()}},Sp=(t,e,r,n)=>{let o=lO(t,e),s=0,i,a=c=>{i||(i=!0,n&&n(c))};return new ReadableStream({async pull(c){try{let{done:u,value:l}=await o.next();if(u){a(),c.close();return}let d=l.byteLength;if(r){let h=s+=d;r(h)}c.enqueue(new Uint8Array(l))}catch(u){throw a(u),u}},cancel(c){return a(c),o.return()}},{highWaterMark:2})};var uv=64*1024,{isFunction:va}=y,pO=(({Request:t,Response:e})=>({Request:t,Response:e}))(y.global),{ReadableStream:lv,TextEncoder:dv}=y.global,pv=(t,...e)=>{try{return!!t(...e)}catch{return!1}},fO=t=>{t=y.merge.call({skipUndefined:!0},pO,t);let{fetch:e,Request:r,Response:n}=t,o=e?va(e):typeof fetch=="function",s=va(r),i=va(n);if(!o)return!1;let a=o&&va(lv),c=o&&(typeof dv=="function"?(p=>m=>p.encode(m))(new dv):async p=>new Uint8Array(await new r(p).arrayBuffer())),u=s&&a&&pv(()=>{let p=!1,m=new r(xe.origin,{body:new lv,method:"POST",get duplex(){return p=!0,"half"}}).headers.has("Content-Type");return p&&!m}),l=i&&a&&pv(()=>y.isReadableStream(new n("").body)),d={stream:l&&(p=>p.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(p=>{!d[p]&&(d[p]=(m,g)=>{let _=m&&m[p];if(_)return _.call(m);throw new q(`Response type '${p}' is not supported`,q.ERR_NOT_SUPPORT,g)})});let h=async p=>{if(p==null)return 0;if(y.isBlob(p))return p.size;if(y.isSpecCompliantForm(p))return(await new r(xe.origin,{method:"POST",body:p}).arrayBuffer()).byteLength;if(y.isArrayBufferView(p)||y.isArrayBuffer(p))return p.byteLength;if(y.isURLSearchParams(p)&&(p=p+""),y.isString(p))return(await c(p)).byteLength},f=async(p,m)=>{let g=y.toFiniteNumber(p.getContentLength());return g??h(m)};return async p=>{let{url:m,method:g,data:_,signal:x,cancelToken:w,timeout:z,onDownloadProgress:O,onUploadProgress:_e,responseType:de,headers:St,withCredentials:Xt="same-origin",fetchOptions:Yt}=_a(p),dn=e||fetch;de=de?(de+"").toLowerCase():"text";let Tr=cv([x,w&&w.toAbortSignal()],z),er=null,qt=Tr&&Tr.unsubscribe&&(()=>{Tr.unsubscribe()}),qp;try{if(_e&&u&&g!=="get"&&g!=="head"&&(qp=await f(St,_))!==0){let rr=new r(m,{method:"POST",body:_,duplex:"half"}),pn;if(y.isFormData(_)&&(pn=rr.headers.get("content-type"))&&St.setContentType(pn),rr.body){let[Ra,ys]=bp(qp,Qn(xp(_e)));_=Sp(rr.body,uv,Ra,ys)}}y.isString(Xt)||(Xt=Xt?"include":"omit");let kt=s&&"credentials"in r.prototype,Lp={...Yt,signal:Tr,method:g.toUpperCase(),headers:St.normalize().toJSON(),body:_,duplex:"half",credentials:kt?Xt:void 0};er=s&&new r(m,Lp);let tr=await(s?dn(er,Yt):dn(m,Lp)),Up=l&&(de==="stream"||de==="response");if(l&&(O||Up&&qt)){let rr={};["status","statusText","headers"].forEach(Fp=>{rr[Fp]=tr[Fp]});let pn=y.toFiniteNumber(tr.headers.get("content-length")),[Ra,ys]=O&&bp(pn,Qn(xp(O),!0))||[];tr=new n(Sp(tr.body,uv,Ra,()=>{ys&&ys(),qt&&qt()}),rr)}de=de||"text";let sb=await d[y.findKey(d,de)||"text"](tr,p);return!Up&&qt&&qt(),await new Promise((rr,pn)=>{ds(rr,pn,{data:sb,headers:ze.from(tr.headers),status:tr.status,statusText:tr.statusText,config:p,request:er})})}catch(kt){throw qt&&qt(),kt&&kt.name==="TypeError"&&/Load failed|fetch/i.test(kt.message)?Object.assign(new q("Network Error",q.ERR_NETWORK,p,er),{cause:kt.cause||kt}):q.from(kt,kt&&kt.code,p,er)}}},mO=new Map,kp=t=>{let e=t&&t.env||{},{fetch:r,Request:n,Response:o}=e,s=[n,o,r],i=s.length,a=i,c,u,l=mO;for(;a--;)c=s[a],u=l.get(c),u===void 0&&l.set(c,u=a?new Map:fO(e)),l=u;return u},sq=kp();var zp={http:fa,xhr:av,fetch:{get:kp}};y.forEach(zp,(t,e)=>{if(t){try{Object.defineProperty(t,"name",{value:e})}catch{}Object.defineProperty(t,"adapterName",{value:e})}});var fv=t=>`- ${t}`,gO=t=>y.isFunction(t)||t===null||t===!1;function yO(t,e){t=y.isArray(t)?t:[t];let{length:r}=t,n,o,s={};for(let i=0;i<r;i++){n=t[i];let a;if(o=n,!gO(n)&&(o=zp[(a=String(n)).toLowerCase()],o===void 0))throw new q(`Unknown adapter '${a}'`);if(o&&(y.isFunction(o)||(o=o.get(e))))break;s[a||"#"+i]=o}if(!o){let i=Object.entries(s).map(([c,u])=>`adapter ${c} `+(u===!1?"is not supported by the environment":"is not available in the build")),a=r?i.length>1?`since :
42
42
  `+i.map(fv).join(`
43
43
  `):" "+fv(i[0]):"as no adapter specified";throw new q("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return o}var ba={getAdapter:yO,adapters:zp};function Tp(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new jt(null,t)}function xa(t){return Tp(t),t.headers=ze.from(t.headers),t.data=us.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),ba.getAdapter(t.adapter||Wn.adapter,t)(t).then(function(n){return Tp(t),n.data=us.call(t,t.transformResponse,n),n.headers=ze.from(n.headers),n},function(n){return ls(n)||(Tp(t),n&&n.response&&(n.response.data=us.call(t,t.transformResponse,n.response),n.response.headers=ze.from(n.response.headers))),Promise.reject(n)})}var wa="1.13.2";var $a={};["object","boolean","number","function","string","symbol"].forEach((t,e)=>{$a[t]=function(n){return typeof n===t||"a"+(e<1?"n ":" ")+t}});var mv={};$a.transitional=function(e,r,n){function o(s,i){return"[Axios v"+wa+"] Transitional option '"+s+"'"+i+(n?". "+n:"")}return(s,i,a)=>{if(e===!1)throw new q(o(i," has been removed"+(r?" in "+r:"")),q.ERR_DEPRECATED);return r&&!mv[i]&&(mv[i]=!0,console.warn(o(i," has been deprecated since v"+r+" and will be removed in the near future"))),e?e(s,i,a):!0}};$a.spelling=function(e){return(r,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};function _O(t,e,r){if(typeof t!="object")throw new q("options must be an object",q.ERR_BAD_OPTION_VALUE);let n=Object.keys(t),o=n.length;for(;o-- >0;){let s=n[o],i=e[s];if(i){let a=t[s],c=a===void 0||i(a,s,t);if(c!==!0)throw new q("option "+s+" must be "+c,q.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new q("Unknown option "+s,q.ERR_BAD_OPTION)}}var fs={assertOptions:_O,validators:$a};var Zt=fs.validators,Xn=class{constructor(e){this.defaults=e||{},this.interceptors={request:new pp,response:new pp}}async request(e,r){try{return await this._request(e,r)}catch(n){if(n instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;let s=o.stack?o.stack.replace(/^.+\n/,""):"";try{n.stack?s&&!String(n.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(n.stack+=`
44
- `+s):n.stack=s}catch{}}throw n}}_request(e,r){typeof e=="string"?(r=r||{},r.url=e):r=e||{},r=$t(this.defaults,r);let{transitional:n,paramsSerializer:o,headers:s}=r;n!==void 0&&fs.assertOptions(n,{silentJSONParsing:Zt.transitional(Zt.boolean),forcedJSONParsing:Zt.transitional(Zt.boolean),clarifyTimeoutError:Zt.transitional(Zt.boolean)},!1),o!=null&&(y.isFunction(o)?r.paramsSerializer={serialize:o}:fs.assertOptions(o,{encode:Zt.function,serialize:Zt.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),fs.assertOptions(r,{baseUrl:Zt.spelling("baseURL"),withXsrfToken:Zt.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let i=s&&y.merge(s.common,s[r.method]);s&&y.forEach(["delete","get","head","post","put","patch","common"],p=>{delete s[p]}),r.headers=ze.concat(i,s);let a=[],c=!0;this.interceptors.request.forEach(function(m){typeof m.runWhen=="function"&&m.runWhen(r)===!1||(c=c&&m.synchronous,a.unshift(m.fulfilled,m.rejected))});let u=[];this.interceptors.response.forEach(function(m){u.push(m.fulfilled,m.rejected)});let l,d=0,h;if(!c){let p=[xa.bind(this),void 0];for(p.unshift(...a),p.push(...u),h=p.length,l=Promise.resolve(r);d<h;)l=l.then(p[d++],p[d++]);return l}h=a.length;let f=r;for(;d<h;){let p=a[d++],m=a[d++];try{f=p(f)}catch(g){m.call(this,g);break}}try{l=xa.call(this,f)}catch(p){return Promise.reject(p)}for(d=0,h=u.length;d<h;)l=l.then(u[d++],u[d++]);return l}getUri(e){e=$t(this.defaults,e);let r=ps(e.baseURL,e.url,e.allowAbsoluteUrls);return as(r,e.params,e.paramsSerializer)}};y.forEach(["delete","get","head","options"],function(e){Xn.prototype[e]=function(r,n){return this.request($t(n||{},{method:e,url:r,data:(n||{}).data}))}});y.forEach(["post","put","patch"],function(e){function r(n){return function(s,i,a){return this.request($t(a||{},{method:e,headers:n?{"Content-Type":"multipart/form-data"}:{},url:s,data:i}))}}Xn.prototype[e]=r(),Xn.prototype[e+"Form"]=r(!0)});var ms=Xn;var Ep=class t{constructor(e){if(typeof e!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(s){r=s});let n=this;this.promise.then(o=>{if(!n._listeners)return;let s=n._listeners.length;for(;s-- >0;)n._listeners[s](o);n._listeners=null}),this.promise.then=o=>{let s,i=new Promise(a=>{n.subscribe(a),s=a}).then(o);return i.cancel=function(){n.unsubscribe(s)},i},e(function(s,i,a){n.reason||(n.reason=new jt(s,i,a),r(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let r=this._listeners.indexOf(e);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){let e=new AbortController,r=n=>{e.abort(n)};return this.subscribe(r),e.signal.unsubscribe=()=>this.unsubscribe(r),e.signal}static source(){let e;return{token:new t(function(o){e=o}),cancel:e}}},hv=Ep;function Rp(t){return function(r){return t.apply(null,r)}}function Pp(t){return y.isObject(t)&&t.isAxiosError===!0}var Op={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Op).forEach(([t,e])=>{Op[e]=t});var gv=Op;function yv(t){let e=new ms(t),r=ns(ms.prototype.request,e);return y.extend(r,ms.prototype,e,{allOwnKeys:!0}),y.extend(r,e,null,{allOwnKeys:!0}),r.create=function(o){return yv($t(t,o))},r}var Se=yv(Wn);Se.Axios=ms;Se.CanceledError=jt;Se.CancelToken=hv;Se.isCancel=ls;Se.VERSION=wa;Se.toFormData=Sr;Se.AxiosError=q;Se.Cancel=Se.CanceledError;Se.all=function(e){return Promise.all(e)};Se.spread=Rp;Se.isAxiosError=Pp;Se.mergeConfig=$t;Se.AxiosHeaders=ze;Se.formToJSON=t=>ga(y.isHTMLForm(t)?new FormData(t):t);Se.getAdapter=ba.getAdapter;Se.HttpStatusCode=gv;Se.default=Se;var kr=Se;var{Axios:rL,AxiosError:nL,CanceledError:oL,isCancel:sL,CancelToken:iL,VERSION:aL,all:cL,Cancel:uL,isAxiosError:lL,spread:dL,toFormData:pL,AxiosHeaders:fL,HttpStatusCode:mL,formToJSON:hL,getAdapter:gL,mergeConfig:yL}=kr;var un={portals:[{id:"dati-gov-it",name:"dati.gov.it",api_url:"https://www.dati.gov.it/opendata",api_url_aliases:["https://dati.gov.it/opendata","http://www.dati.gov.it/opendata","http://dati.gov.it/opendata"],search:{force_text_field:!0},dataset_view_url:"https://www.dati.gov.it/view-dataset/dataset?id={id}",organization_view_url:"https://www.dati.gov.it/view-dataset?organization={name}"},{id:"anac-opendata",name:"dati.anticorruzione.it/opendata",api_url:"https://dati.anticorruzione.it/opendata",api_url_aliases:["http://dati.anticorruzione.it/opendata","https://dati.anticorruzione.it","http://dati.anticorruzione.it"]},{id:"data-gov-uk",name:"data.gov.uk",api_url:"https://data.gov.uk",api_url_aliases:["https://www.data.gov.uk","http://data.gov.uk","http://www.data.gov.uk"],api_path:"/api/action",dataset_view_url:"https://data.gov.uk/dataset/{name}",organization_view_url:"https://data.gov.uk/publisher/{name}"}],defaults:{dataset_view_url:"{server_url}/dataset/{name}",organization_view_url:"{server_url}/organization/{name}",search:{force_text_field:!1}}};function hs(t){return t.replace(/\/$/,"")}function bO(t){try{return new URL(t).hostname}catch{return null}}function gs(t){let e=hs(t);return un.portals.find(n=>{let o=hs(n.api_url),s=(n.api_url_aliases||[]).map(hs);return o===e||s.includes(e)})||null}function _v(t){let e=gs(t),r=un.defaults?.search||{};return{force_text_field:e?.search?.force_text_field??r.force_text_field??!1}}function Ap(t){return hs(t)}function Sa(t){let e=un.portals.find(r=>[r.api_url,...r.api_url_aliases||[]].some(o=>bO(o)===t));return e?hs(e.api_url):null}function vv(t){return gs(t)?.api_path||"/api/3/action"}var xO=(()=>{let t=null;return async()=>(t||(t=(async()=>{try{return await import("node:zlib")}catch{return null}})()),t)})();function bv(t,e){if(!t)return;let r=e.toLowerCase();for(let[n,o]of Object.entries(t))if(n.toLowerCase()===r)return Array.isArray(o)?o.join(","):String(o)}function wO(t){if(t&&!(typeof Buffer>"u")){if(Buffer.isBuffer(t))return t;if(t instanceof ArrayBuffer)return Buffer.from(t);if(ArrayBuffer.isView(t))return Buffer.from(t.buffer,t.byteOffset,t.byteLength)}}function $O(t){if(t){if(t instanceof ArrayBuffer)return t;if(ArrayBuffer.isView(t))return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}}async function SO(t,e){if(e&&typeof DecompressionStream<"u")try{let r=new DecompressionStream(e.includes("br")?"br":e.includes("deflate")?"deflate":"gzip"),n=await new Response(new Blob([t]).stream().pipeThrough(r)).arrayBuffer();return new TextDecoder("utf-8").decode(n).trim()}catch{}return new TextDecoder("utf-8").decode(t).trim()}async function xv(t,e){if(t==null)return t;let r=$O(t);if(r&&typeof Buffer>"u"){let c=bv(e,"content-encoding"),u=await SO(r,c);if(!u)return u;try{return JSON.parse(u)}catch{return u}}if(typeof t=="string")try{return JSON.parse(t)}catch{return t}let n=wO(t);if(!n)return t;let o=bv(e,"content-encoding"),s=n,i=await xO();try{i&&(o?.includes("gzip")?s=i.gunzipSync(n):o?.includes("br")?s=i.brotliDecompressSync(n):o?.includes("deflate")?s=i.inflateSync(n):n.length>=2&&n[0]===31&&n[1]===139&&(s=i.gunzipSync(n)))}catch{s=n}let a=s.toString("utf-8").trim();if(!a)return a;try{return JSON.parse(a)}catch{return a}}async function ne(t,e,r={}){let n=typeof process<"u"&&!!process.versions?.node,o=t;try{let c=new URL(t).hostname,u=Sa(c);u&&(o=u)}catch{}let s=o.replace(/\/$/,""),i=vv(o),a=`${s}${i}/${e}`;try{let c;if(n){let u=await kr.get(a,{params:r,timeout:3e4,responseType:"arraybuffer",headers:{Accept:"application/json, text/plain, */*","Accept-Language":"en-US,en;q=0.9,it;q=0.8","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive",Referer:`${s}/`,"Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"navigate","Sec-Fetch-Dest":"document","Upgrade-Insecure-Requests":"1","Sec-CH-UA":'"Chromium";v="120", "Not?A_Brand";v="24", "Google Chrome";v="120"',"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Linux"',"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}});c=await xv(u.data,u.headers)}else{let u=new URLSearchParams;for(let[p,m]of Object.entries(r))m!=null&&u.set(p,String(m));let l=u.toString()?`${a}?${u.toString()}`:a,d=await fetch(l,{method:"GET",headers:{Accept:"application/json, text/plain, */*","Accept-Language":"en-US,en;q=0.9,it;q=0.8","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive",Referer:`${s}/`,"Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"navigate","Sec-Fetch-Dest":"document","Upgrade-Insecure-Requests":"1","Sec-CH-UA":'"Chromium";v="120", "Not?A_Brand";v="24", "Google Chrome";v="120"',"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Linux"',"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}});if(!d.ok)throw new Error(`CKAN API error (${d.status}): ${d.statusText}`);let h=await d.arrayBuffer(),f={};d.headers.forEach((p,m)=>{f[m]=p}),c=await xv(h,f)}if(c&&c.success===!0)return c.result;throw new Error(`CKAN API returned success=false: ${JSON.stringify(c)}`)}catch(c){if(kr.isAxiosError(c)){let u=c;if(u.response){let l=u.response.status,d=u.response.data,h=d?.error?.message||d?.error||"Unknown error";throw new Error(`CKAN API error (${l}): ${h}`)}else throw u.code==="ECONNABORTED"?new Error(`Request timeout connecting to ${t}`):u.code==="ENOTFOUND"?new Error(`Server not found: ${t}`):new Error(`Network error: ${u.message}`)}throw c}}function K(t,e=N_){return t.length<=e?t:t.substring(0,e)+`
44
+ `+s):n.stack=s}catch{}}throw n}}_request(e,r){typeof e=="string"?(r=r||{},r.url=e):r=e||{},r=$t(this.defaults,r);let{transitional:n,paramsSerializer:o,headers:s}=r;n!==void 0&&fs.assertOptions(n,{silentJSONParsing:Zt.transitional(Zt.boolean),forcedJSONParsing:Zt.transitional(Zt.boolean),clarifyTimeoutError:Zt.transitional(Zt.boolean)},!1),o!=null&&(y.isFunction(o)?r.paramsSerializer={serialize:o}:fs.assertOptions(o,{encode:Zt.function,serialize:Zt.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),fs.assertOptions(r,{baseUrl:Zt.spelling("baseURL"),withXsrfToken:Zt.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let i=s&&y.merge(s.common,s[r.method]);s&&y.forEach(["delete","get","head","post","put","patch","common"],p=>{delete s[p]}),r.headers=ze.concat(i,s);let a=[],c=!0;this.interceptors.request.forEach(function(m){typeof m.runWhen=="function"&&m.runWhen(r)===!1||(c=c&&m.synchronous,a.unshift(m.fulfilled,m.rejected))});let u=[];this.interceptors.response.forEach(function(m){u.push(m.fulfilled,m.rejected)});let l,d=0,h;if(!c){let p=[xa.bind(this),void 0];for(p.unshift(...a),p.push(...u),h=p.length,l=Promise.resolve(r);d<h;)l=l.then(p[d++],p[d++]);return l}h=a.length;let f=r;for(;d<h;){let p=a[d++],m=a[d++];try{f=p(f)}catch(g){m.call(this,g);break}}try{l=xa.call(this,f)}catch(p){return Promise.reject(p)}for(d=0,h=u.length;d<h;)l=l.then(u[d++],u[d++]);return l}getUri(e){e=$t(this.defaults,e);let r=ps(e.baseURL,e.url,e.allowAbsoluteUrls);return as(r,e.params,e.paramsSerializer)}};y.forEach(["delete","get","head","options"],function(e){Xn.prototype[e]=function(r,n){return this.request($t(n||{},{method:e,url:r,data:(n||{}).data}))}});y.forEach(["post","put","patch"],function(e){function r(n){return function(s,i,a){return this.request($t(a||{},{method:e,headers:n?{"Content-Type":"multipart/form-data"}:{},url:s,data:i}))}}Xn.prototype[e]=r(),Xn.prototype[e+"Form"]=r(!0)});var ms=Xn;var Ep=class t{constructor(e){if(typeof e!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(s){r=s});let n=this;this.promise.then(o=>{if(!n._listeners)return;let s=n._listeners.length;for(;s-- >0;)n._listeners[s](o);n._listeners=null}),this.promise.then=o=>{let s,i=new Promise(a=>{n.subscribe(a),s=a}).then(o);return i.cancel=function(){n.unsubscribe(s)},i},e(function(s,i,a){n.reason||(n.reason=new jt(s,i,a),r(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let r=this._listeners.indexOf(e);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){let e=new AbortController,r=n=>{e.abort(n)};return this.subscribe(r),e.signal.unsubscribe=()=>this.unsubscribe(r),e.signal}static source(){let e;return{token:new t(function(o){e=o}),cancel:e}}},hv=Ep;function Rp(t){return function(r){return t.apply(null,r)}}function Pp(t){return y.isObject(t)&&t.isAxiosError===!0}var Op={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Op).forEach(([t,e])=>{Op[e]=t});var gv=Op;function yv(t){let e=new ms(t),r=ns(ms.prototype.request,e);return y.extend(r,ms.prototype,e,{allOwnKeys:!0}),y.extend(r,e,null,{allOwnKeys:!0}),r.create=function(o){return yv($t(t,o))},r}var Se=yv(Wn);Se.Axios=ms;Se.CanceledError=jt;Se.CancelToken=hv;Se.isCancel=ls;Se.VERSION=wa;Se.toFormData=Sr;Se.AxiosError=q;Se.Cancel=Se.CanceledError;Se.all=function(e){return Promise.all(e)};Se.spread=Rp;Se.isAxiosError=Pp;Se.mergeConfig=$t;Se.AxiosHeaders=ze;Se.formToJSON=t=>ga(y.isHTMLForm(t)?new FormData(t):t);Se.getAdapter=ba.getAdapter;Se.HttpStatusCode=gv;Se.default=Se;var kr=Se;var{Axios:rL,AxiosError:nL,CanceledError:oL,isCancel:sL,CancelToken:iL,VERSION:aL,all:cL,Cancel:uL,isAxiosError:lL,spread:dL,toFormData:pL,AxiosHeaders:fL,HttpStatusCode:mL,formToJSON:hL,getAdapter:gL,mergeConfig:yL}=kr;var un={portals:[{id:"dati-gov-it",name:"dati.gov.it",api_url:"https://www.dati.gov.it/opendata",api_url_aliases:["https://dati.gov.it/opendata","http://www.dati.gov.it/opendata","http://dati.gov.it/opendata"],search:{force_text_field:!0},dataset_view_url:"https://www.dati.gov.it/view-dataset/dataset?id={id}",organization_view_url:"https://www.dati.gov.it/view-dataset?organization={name}"},{id:"anac-opendata",name:"dati.anticorruzione.it/opendata",api_url:"https://dati.anticorruzione.it/opendata",api_url_aliases:["http://dati.anticorruzione.it/opendata","https://dati.anticorruzione.it","http://dati.anticorruzione.it"]},{id:"data-gov-uk",name:"data.gov.uk",api_url:"https://data.gov.uk",api_url_aliases:["https://www.data.gov.uk","http://data.gov.uk","http://www.data.gov.uk"],api_path:"/api/action",dataset_view_url:"https://data.gov.uk/dataset/{name}",organization_view_url:"https://data.gov.uk/publisher/{name}"},{id:"catalog-data-gov",name:"catalog.data.gov",api_url:"https://catalog.data.gov",api_url_aliases:["http://catalog.data.gov"]},{id:"open-canada",name:"open.canada.ca",api_url:"https://open.canada.ca/data",api_url_aliases:["http://open.canada.ca/data","https://open.canada.ca","http://open.canada.ca"]},{id:"data-gov-au",name:"data.gov.au",api_url:"https://data.gov.au",api_url_aliases:["http://data.gov.au","https://www.data.gov.au","http://www.data.gov.au"]},{id:"opendata-swiss",name:"opendata.swiss",api_url:"https://ckan.opendata.swiss",api_url_aliases:["https://opendata.swiss","http://opendata.swiss","https://www.opendata.swiss","http://www.opendata.swiss"]}],defaults:{dataset_view_url:"{server_url}/dataset/{name}",organization_view_url:"{server_url}/organization/{name}",search:{force_text_field:!1}}};function hs(t){return t.replace(/\/$/,"")}function bO(t){try{return new URL(t).hostname}catch{return null}}function gs(t){let e=hs(t);return un.portals.find(n=>{let o=hs(n.api_url),s=(n.api_url_aliases||[]).map(hs);return o===e||s.includes(e)})||null}function _v(t){let e=gs(t),r=un.defaults?.search||{};return{force_text_field:e?.search?.force_text_field??r.force_text_field??!1}}function Ap(t){return hs(t)}function Sa(t){let e=un.portals.find(r=>[r.api_url,...r.api_url_aliases||[]].some(o=>bO(o)===t));return e?hs(e.api_url):null}function vv(t){return gs(t)?.api_path||"/api/3/action"}var xO=(()=>{let t=null;return async()=>(t||(t=(async()=>{try{return await import("node:zlib")}catch{return null}})()),t)})();function bv(t,e){if(!t)return;let r=e.toLowerCase();for(let[n,o]of Object.entries(t))if(n.toLowerCase()===r)return Array.isArray(o)?o.join(","):String(o)}function wO(t){if(t&&!(typeof Buffer>"u")){if(Buffer.isBuffer(t))return t;if(t instanceof ArrayBuffer)return Buffer.from(t);if(ArrayBuffer.isView(t))return Buffer.from(t.buffer,t.byteOffset,t.byteLength)}}function $O(t){if(t){if(t instanceof ArrayBuffer)return t;if(ArrayBuffer.isView(t))return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}}async function SO(t,e){if(e&&typeof DecompressionStream<"u")try{let r=new DecompressionStream(e.includes("br")?"br":e.includes("deflate")?"deflate":"gzip"),n=await new Response(new Blob([t]).stream().pipeThrough(r)).arrayBuffer();return new TextDecoder("utf-8").decode(n).trim()}catch{}return new TextDecoder("utf-8").decode(t).trim()}async function xv(t,e){if(t==null)return t;let r=$O(t);if(r&&typeof Buffer>"u"){let c=bv(e,"content-encoding"),u=await SO(r,c);if(!u)return u;try{return JSON.parse(u)}catch{return u}}if(typeof t=="string")try{return JSON.parse(t)}catch{return t}let n=wO(t);if(!n)return t;let o=bv(e,"content-encoding"),s=n,i=await xO();try{i&&(o?.includes("gzip")?s=i.gunzipSync(n):o?.includes("br")?s=i.brotliDecompressSync(n):o?.includes("deflate")?s=i.inflateSync(n):n.length>=2&&n[0]===31&&n[1]===139&&(s=i.gunzipSync(n)))}catch{s=n}let a=s.toString("utf-8").trim();if(!a)return a;try{return JSON.parse(a)}catch{return a}}async function ne(t,e,r={}){let n=typeof process<"u"&&!!process.versions?.node,o=t;try{let c=new URL(t).hostname,u=Sa(c);u&&(o=u)}catch{}let s=o.replace(/\/$/,""),i=vv(o),a=`${s}${i}/${e}`;try{let c;if(n){let u=await kr.get(a,{params:r,timeout:3e4,responseType:"arraybuffer",headers:{Accept:"application/json, text/plain, */*","Accept-Language":"en-US,en;q=0.9,it;q=0.8","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive",Referer:`${s}/`,"Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"navigate","Sec-Fetch-Dest":"document","Upgrade-Insecure-Requests":"1","Sec-CH-UA":'"Chromium";v="120", "Not?A_Brand";v="24", "Google Chrome";v="120"',"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Linux"',"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}});c=await xv(u.data,u.headers)}else{let u=new URLSearchParams;for(let[p,m]of Object.entries(r))m!=null&&u.set(p,String(m));let l=u.toString()?`${a}?${u.toString()}`:a,d=await fetch(l,{method:"GET",headers:{Accept:"application/json, text/plain, */*","Accept-Language":"en-US,en;q=0.9,it;q=0.8","Accept-Encoding":"gzip, deflate, br",Connection:"keep-alive",Referer:`${s}/`,"Sec-Fetch-Site":"same-origin","Sec-Fetch-Mode":"navigate","Sec-Fetch-Dest":"document","Upgrade-Insecure-Requests":"1","Sec-CH-UA":'"Chromium";v="120", "Not?A_Brand";v="24", "Google Chrome";v="120"',"Sec-CH-UA-Mobile":"?0","Sec-CH-UA-Platform":'"Linux"',"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}});if(!d.ok)throw new Error(`CKAN API error (${d.status}): ${d.statusText}`);let h=await d.arrayBuffer(),f={};d.headers.forEach((p,m)=>{f[m]=p}),c=await xv(h,f)}if(c&&c.success===!0)return c.result;throw new Error(`CKAN API returned success=false: ${JSON.stringify(c)}`)}catch(c){if(kr.isAxiosError(c)){let u=c;if(u.response){let l=u.response.status,d=u.response.data,h=d?.error?.message||d?.error||"Unknown error";throw new Error(`CKAN API error (${l}): ${h}`)}else throw u.code==="ECONNABORTED"?new Error(`Request timeout connecting to ${t}`):u.code==="ENOTFOUND"?new Error(`Server not found: ${t}`):new Error(`Network error: ${u.message}`)}throw c}}function K(t,e=N_){return t.length<=e?t:t.substring(0,e)+`
45
45
 
46
46
  ... [Response truncated at ${e} characters]`}function Xe(t){try{if(!t)return"Invalid Date";let e=new Date(t);return Number.isNaN(e.getTime())?"Invalid Date":e.toISOString().slice(0,10)}catch{return"Invalid Date"}}function Np(t,e){let r=Ap(t);return(gs(t)?.dataset_view_url||un.defaults.dataset_view_url).replace("{server_url}",r).replace("{id}",e.id).replace("{name}",e.name)}function ka(t,e){let r=Ap(t);return(gs(t)?.organization_view_url||un.defaults.organization_view_url).replace("{server_url}",r).replace("{id}",e.id).replace("{name}",e.name)}var kO="*:*",zO=/\b[a-zA-Z_][\w-]*:/,TO=/[+\-!(){}[\]^"~*?:\\/|&]/g;function EO(t){return zO.test(t)}function RO(t){return t.replace(TO,"\\$&")}function PO(t){let e=new Date,r=e.toISOString(),n=/\b(?!metadata_)(modified|issued):\[NOW-(\d+)(DAYS?|MONTHS?|YEARS?)\s+TO\s+NOW\]/gi;return t.replace(n,(o,s,i,a)=>{let c=parseInt(i,10),u=new Date(e);switch(a.toLowerCase().replace(/s$/,"")){case"day":u.setDate(u.getDate()-c);break;case"month":u.setMonth(u.getMonth()-c);break;case"year":u.setFullYear(u.getFullYear()-c);break;default:return o}let d=u.toISOString();return`${s}:[${d} TO ${r}]`})}function Ip(t,e,r){let o=_v(t).force_text_field??!1,s=!1;if(r==="text")s=!0;else if(r==="default")s=!1;else if(o){let a=e.trim();s=a!==kO&&!EO(a)}let i=s?`text:(${RO(e)})`:e;return i=PO(i),{effectiveQuery:i,forcedTextField:s}}var wv={title:4,notes:2,tags:3,organization:1},OO=new Set(["a","an","the","and","or","but","in","on","at","to","for","of","with","by","from","as","is","was","are","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","can","this","that","these","those"]),$v=t=>{let r=(t.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).filter(n=>n.length>1&&!OO.has(n));return Array.from(new Set(r))},AO=t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Sv=(t,e)=>{if(!t||e.length===0)return!1;let r=t.toLowerCase().replace(/_/g," ");return e.some(n=>new RegExp(`\\b${AO(n)}\\b`,"i").test(r))},Cp=(t,e,r)=>Sv(t,e)?r:0,NO=(t,e,r=wv)=>{let n=$v(t),o=e.title||e.name||"",s=e.notes||"",i=e.organization?.title||e.organization?.name||e.owner_org||"",a={title:Cp(o,n,r.title),notes:Cp(s,n,r.notes),tags:0,organization:Cp(i,n,r.organization),total:0};if(Array.isArray(e.tags)&&e.tags.length>0&&n.length>0){let c=e.tags.some(u=>{let l=typeof u=="string"?u:u?.name;return Sv(l,n)});a.tags=c?r.tags:0}return a.total=a.title+a.notes+a.tags+a.organization,{total:a.total,breakdown:a,terms:n}},kv=t=>{if(!t||t.access_services==null)return[];let e=t.access_services;if(Array.isArray(e))return e;if(typeof e=="string"&&e.trim().length>0)try{let r=JSON.parse(e);return Array.isArray(r)?r:[]}catch{return[]}return[]},zv=t=>{let e=[];for(let r of t){let n=r.endpoint_url;if(Array.isArray(n))for(let o of n)typeof o=="string"&&o.trim().length>0&&e.push(o.trim());else typeof n=="string"&&n.trim().length>0&&e.push(n.trim())}return Array.from(new Set(e))},Tv=t=>{if(!t)return null;let e=typeof t.download_url=="string"?t.download_url.trim():"",r=typeof t.access_url=="string"?t.access_url.trim():"",n=typeof t.url=="string"?t.url.trim():"";return e||r||n||null},IO=t=>({...t,metadata_harvested_at:t.metadata_modified??null,resources:Array.isArray(t.resources)?t.resources.map(e=>{let r=kv(e),n=zv(r),o=Tv(e);return n.length===0&&!o?e:{...e,...n.length>0?{access_service_endpoints:n}:{},...o?{effective_download_url:o}:{}}}):t.resources}),CO=(t,e)=>{let r=`# Dataset: ${t.title||t.name}
47
47
 
@@ -778,7 +778,7 @@ For aggregates, use SQL:
778
778
  ckan_datastore_search_sql({
779
779
  server_url: "${t}",
780
780
  sql: "SELECT * FROM "<resource-id>" LIMIT 10"
781
- })`,Yv=t=>{t.registerPrompt(aA,{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})=>Dt(cA(e,r)))};var eb=t=>{Wv(t),Gv(t),Qv(t),Xv(t),Yv(t)};function tb(){return new ca({name:"ckan-mcp-server",version:"0.4.36"})}function rb(t){Ev(t),Rv(t),Pv(t),Ov(t),Av(t),Iv(t),qv(t),Jv(t),eb(t)}var Ea=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}
781
+ })`,Yv=t=>{t.registerPrompt(aA,{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})=>Dt(cA(e,r)))};var eb=t=>{Wv(t),Gv(t),Qv(t),Xv(t),Yv(t)};function tb(){return new ca({name:"ckan-mcp-server",version:"0.4.38"})}function rb(t){Ev(t),Rv(t),Pv(t),Ov(t),Av(t),Iv(t),qv(t),Jv(t),eb(t)}var Ea=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}
782
782
  data:
783
783
 
784
784
  `;this._retryInterval!==void 0&&(i=`id: ${s}
@@ -961,8 +961,8 @@ data:
961
961
  <pre><code>curl ${e.origin}/health</code></pre>
962
962
 
963
963
  <div class="footer">
964
- Version 0.4.36 \u2022 Running on Cloudflare Workers \u2022 <a href="https://github.com/ondata/ckan-mcp-server/blob/main/LICENSE.txt" target="_blank">MIT License</a>
964
+ Version 0.4.38 \u2022 Running on Cloudflare Workers \u2022 <a href="https://github.com/ondata/ckan-mcp-server/blob/main/LICENSE.txt" target="_blank">MIT License</a>
965
965
  </div>
966
966
  </div>
967
967
  </body>
968
- </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.36",tools:15,resources:7,prompts:5,runtime:"cloudflare-workers"}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});if(e.pathname==="/mcp")try{let r=await ob.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{k4 as default};
968
+ </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.38",tools:15,resources:7,prompts:5,runtime:"cloudflare-workers"}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});if(e.pathname==="/mcp")try{let r=await ob.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{k4 as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aborruso/ckan-mcp-server",
3
- "version": "0.4.37",
3
+ "version": "0.4.39",
4
4
  "description": "MCP server for interacting with CKAN open data portals",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",