@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 +49 -1
- package/README.md +36 -61
- package/dist/index.js +40 -1
- package/dist/worker.js +4 -4
- package/package.json +1 -1
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
|
-
-
|
|
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
|
-
##
|
|
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
|
-
|
|
41
|
+
---
|
|
30
42
|
|
|
31
|
-
|
|
32
|
-
npm install -g @aborruso/ckan-mcp-server
|
|
33
|
-
```
|
|
43
|
+
## Installation
|
|
34
44
|
|
|
35
|
-
|
|
45
|
+
Install via npm:
|
|
36
46
|
|
|
37
47
|
```bash
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
+
### Quick Testing with Workers (optional)
|
|
58
54
|
|
|
59
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
|
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
|
-
|
|
401
|
+
Verified portals with public API access:
|
|
426
402
|
|
|
427
|
-
- 🇮🇹 **www.dati.gov.it/opendata** -
|
|
428
|
-
- 🇺🇸 **data.gov** - United States
|
|
429
|
-
- 🇨🇦 **open.canada.ca/data** - Canada
|
|
430
|
-
-
|
|
431
|
-
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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};
|