@aborruso/ckan-mcp-server 0.4.96 → 0.4.98
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 +13 -0
- package/dist/index.js +19 -19
- package/dist/worker.js +8 -8
- package/package.json +1 -1
package/LOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# LOG
|
|
2
2
|
|
|
3
|
+
## 2026-04-05
|
|
4
|
+
|
|
5
|
+
- Fix `ckan_package_search`: quoted phrases (e.g. `"aree protette"`) now work inside `text:(...)` wrapping — removed `"` from `escapeSolrQuery` special chars so phrase queries are preserved
|
|
6
|
+
|
|
7
|
+
## 2026-04-03
|
|
8
|
+
|
|
9
|
+
### v0.4.97
|
|
10
|
+
|
|
11
|
+
- Improve tool parameter descriptions for Code Mode compatibility (group, tag, package tools)
|
|
12
|
+
- Add `.describe()` to all parameters in `ckan_group_list`, `ckan_group_show`, `ckan_group_search`
|
|
13
|
+
- Add `.describe()` to all parameters in `ckan_tag_list`
|
|
14
|
+
- Improve `ckan_package_show` parameter descriptions (server_url example, id UUID/slug hint)
|
|
15
|
+
|
|
3
16
|
## 2026-03-26
|
|
4
17
|
|
|
5
18
|
### v0.4.96
|
package/dist/index.js
CHANGED
|
@@ -610,7 +610,7 @@ function getOrganizationViewUrl(serverUrl, org) {
|
|
|
610
610
|
// src/utils/search.ts
|
|
611
611
|
var DEFAULT_SEARCH_QUERY = "*:*";
|
|
612
612
|
var FIELD_QUERY_PATTERN = /\b[a-zA-Z_][\w-]*:/;
|
|
613
|
-
var SOLR_SPECIAL_CHARS = /[+\-!(){}[\]
|
|
613
|
+
var SOLR_SPECIAL_CHARS = /[+\-!(){}[\]^~*?:\\/|&]/g;
|
|
614
614
|
function isFieldedQuery(query) {
|
|
615
615
|
return FIELD_QUERY_PATTERN.test(query);
|
|
616
616
|
}
|
|
@@ -1699,8 +1699,8 @@ Examples:
|
|
|
1699
1699
|
|
|
1700
1700
|
Typical workflow: ckan_package_show \u2192 pick a resource with datastore_active=true \u2192 ckan_datastore_search (query its data)`,
|
|
1701
1701
|
inputSchema: z2.object({
|
|
1702
|
-
server_url: z2.string().url().describe("Base URL of the CKAN server"),
|
|
1703
|
-
id: z2.string().min(1).describe("Dataset ID or name"),
|
|
1702
|
+
server_url: z2.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),
|
|
1703
|
+
id: z2.string().min(1).describe("Dataset ID (UUID) or machine-readable name slug (e.g., 'raccolta-differenziata-comuni')"),
|
|
1704
1704
|
include_tracking: z2.boolean().optional().default(false).describe("Include tracking statistics"),
|
|
1705
1705
|
response_format: ResponseFormatSchema
|
|
1706
1706
|
}).strict(),
|
|
@@ -2745,11 +2745,11 @@ Returns:
|
|
|
2745
2745
|
|
|
2746
2746
|
Typical workflow: ckan_tag_list \u2192 ckan_package_search with fq="tags:tag_name" (find datasets by tag) \u2192 ckan_package_show`,
|
|
2747
2747
|
inputSchema: z6.object({
|
|
2748
|
-
server_url: z6.string().url(),
|
|
2749
|
-
q: z6.string().optional().default("*:*"),
|
|
2750
|
-
fq: z6.string().optional(),
|
|
2751
|
-
tag_query: z6.string().optional(),
|
|
2752
|
-
limit: z6.number().int().min(1).max(1e3).optional().default(100),
|
|
2748
|
+
server_url: z6.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),
|
|
2749
|
+
q: z6.string().optional().default("*:*").describe("Dataset search query in Solr syntax to scope the tag facet (default: '*:*' for all datasets)"),
|
|
2750
|
+
fq: z6.string().optional().describe("Filter query in Solr syntax (e.g., 'organization:comune-palermo') to restrict which datasets contribute to tag counts"),
|
|
2751
|
+
tag_query: z6.string().optional().describe("Substring filter applied to tag names after faceting (e.g., 'acqua' to keep only tags containing 'acqua')"),
|
|
2752
|
+
limit: z6.number().int().min(1).max(1e3).optional().default(100).describe("Max tags to return (default 100, max 1000); tags are sorted by count descending"),
|
|
2753
2753
|
response_format: ResponseFormatSchema
|
|
2754
2754
|
}).strict(),
|
|
2755
2755
|
annotations: {
|
|
@@ -2966,11 +2966,11 @@ Returns:
|
|
|
2966
2966
|
|
|
2967
2967
|
Typical workflow: ckan_group_list \u2192 ckan_group_show (inspect one) \u2192 ckan_package_search with fq="groups:name" (browse its datasets)`,
|
|
2968
2968
|
inputSchema: z7.object({
|
|
2969
|
-
server_url: z7.string().url(),
|
|
2970
|
-
all_fields: z7.boolean().optional().default(false),
|
|
2971
|
-
sort: z7.string().optional().default("name asc"),
|
|
2972
|
-
limit: z7.number().int().min(0).optional().default(100),
|
|
2973
|
-
offset: z7.number().int().min(0).optional().default(0),
|
|
2969
|
+
server_url: z7.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),
|
|
2970
|
+
all_fields: z7.boolean().optional().default(false).describe("Return full group objects (true) or just name slugs (false)"),
|
|
2971
|
+
sort: z7.string().optional().default("name asc").describe("Sort field and direction (e.g., 'name asc', 'package_count desc')"),
|
|
2972
|
+
limit: z7.number().int().min(0).optional().default(100).describe("Max groups to return. Use 0 to get only the count via faceting"),
|
|
2973
|
+
offset: z7.number().int().min(0).optional().default(0).describe("Pagination offset"),
|
|
2974
2974
|
response_format: ResponseFormatSchema
|
|
2975
2975
|
}).strict(),
|
|
2976
2976
|
annotations: {
|
|
@@ -3088,9 +3088,9 @@ Returns:
|
|
|
3088
3088
|
|
|
3089
3089
|
Typical workflow: ckan_group_show \u2192 ckan_package_show (inspect a dataset) \u2192 ckan_datastore_search (query its data)`,
|
|
3090
3090
|
inputSchema: z7.object({
|
|
3091
|
-
server_url: z7.string().url(),
|
|
3092
|
-
id: z7.string().min(1),
|
|
3093
|
-
include_datasets: z7.boolean().optional().default(true),
|
|
3091
|
+
server_url: z7.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),
|
|
3092
|
+
id: z7.string().min(1).describe("Group ID (UUID) or machine-readable name slug (e.g., 'transport', 'energia')"),
|
|
3093
|
+
include_datasets: z7.boolean().optional().default(true).describe("Include the list of datasets belonging to this group"),
|
|
3094
3094
|
response_format: ResponseFormatSchema
|
|
3095
3095
|
}).strict(),
|
|
3096
3096
|
annotations: {
|
|
@@ -3151,8 +3151,8 @@ Returns:
|
|
|
3151
3151
|
|
|
3152
3152
|
Typical workflow: ckan_group_search \u2192 ckan_group_show (get details) \u2192 ckan_package_search with fq="groups:name"`,
|
|
3153
3153
|
inputSchema: z7.object({
|
|
3154
|
-
server_url: z7.string().url(),
|
|
3155
|
-
pattern: z7.string().min(1).describe("
|
|
3154
|
+
server_url: z7.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),
|
|
3155
|
+
pattern: z7.string().min(1).describe("Name pattern to search for (wildcards added automatically, e.g., 'energia', 'salute')"),
|
|
3156
3156
|
response_format: ResponseFormatSchema
|
|
3157
3157
|
}).strict(),
|
|
3158
3158
|
annotations: {
|
|
@@ -5159,7 +5159,7 @@ var registerAllPrompts = (server) => {
|
|
|
5159
5159
|
function createServer() {
|
|
5160
5160
|
return new McpServer({
|
|
5161
5161
|
name: "ckan-mcp-server",
|
|
5162
|
-
version: "0.4.
|
|
5162
|
+
version: "0.4.98"
|
|
5163
5163
|
});
|
|
5164
5164
|
}
|
|
5165
5165
|
function registerAll(server) {
|
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[dv]=this[dv]={accessors:{}}).accessors,o=this.prototype;function s(i){let a=_s(i);n[a]||(TA(o,i),n[a]=!0)}return y.isArray(e)?e.forEach(s):s(e),this}};so.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);y.reduceDescriptors(so.prototype,({value:t},e)=>{let r=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(n){this[r]=n}}});y.freezeMethods(so);var Te=so;function vs(t,e){let r=this||oo,n=e||r,o=Te.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 bs(t){return!!(t&&t.__CANCEL__)}function fv(t,e,r){Z.call(this,t??"canceled",Z.ERR_CANCELED,e,r),this.name="CanceledError"}y.inherits(fv,Z,{__CANCEL__:!0});var Lt=fv;function ws(t,e,r){let n=r.config.validateStatus;!r.status||!n||n(r.status)?t(r):e(new Z("Request failed with status code "+r.status,[Z.ERR_BAD_REQUEST,Z.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}function Ef(t){let e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(t);return e&&e[1]||""}function RA(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,p=0;for(;d!==o;)p+=r[d++],d=d%t;if(o=(o+1)%t,o===s&&(s=(s+1)%t),u-i<e)return;let h=l&&u-l;return h?Math.round(p*1e3/h):void 0}}var pv=RA;function EA(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 mv=EA;var io=(t,e,r=3)=>{let n=0,o=pv(50,250);return mv(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)},Pf=(t,e)=>{let r=t!=null;return[n=>e[0]({lengthComputable:r,total:t,loaded:n}),e[1]]},Af=t=>(...e)=>y.asap(()=>t(...e));var hv=ke.hasStandardBrowserEnv?((t,e)=>r=>(r=new URL(r,ke.origin),t.protocol===r.protocol&&t.host===r.host&&(e||t.port===r.port)))(new URL(ke.origin),ke.navigator&&/(msie|trident)/i.test(ke.navigator.userAgent)):()=>!0;var gv=ke.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 Of(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)}function Cf(t,e){return e?t.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):t}function xs(t,e,r){let n=!Of(e);return t&&(n||r==!1)?Cf(t,e):e}var yv=t=>t instanceof Te?{...t}:t;function zt(t,e){e=e||{};let r={};function n(u,l,d,p){return y.isPlainObject(u)&&y.isPlainObject(l)?y.merge.call({caseless:p},u,l):y.isPlainObject(l)?y.merge({},l):y.isArray(l)?l.slice():l}function o(u,l,d,p){if(y.isUndefined(l)){if(!y.isUndefined(u))return n(void 0,u,d,p)}else return n(u,l,d,p)}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(yv(u),yv(l),d,!0)};return y.forEach(Object.keys({...t,...e}),function(l){let d=c[l]||o,p=d(t[l],e[l],l);y.isUndefined(p)&&d!==a||(r[l]=p)}),r}var za=t=>{let e=zt({},t),{data:r,withXSRFToken:n,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=e;if(e.headers=i=Te.from(i),e.url=ys(xs(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(ke.hasStandardBrowserEnv||ke.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(ke.hasStandardBrowserEnv&&(n&&y.isFunction(n)&&(n=n(e)),n||n!==!1&&hv(e.url))){let c=o&&s&&gv.read(s);c&&i.set(o,c)}return e};var PA=typeof XMLHttpRequest<"u",_v=PA&&function(t){return new Promise(function(r,n){let o=za(t),s=o.data,i=Te.from(o.headers).normalize(),{responseType:a,onUploadProgress:c,onDownloadProgress:u}=o,l,d,p,h,f;function m(){h&&h(),f&&f(),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 k=Te.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders()),A={data:!a||a==="text"||a==="json"?g.responseText:g.response,status:g.status,statusText:g.statusText,headers:k,config:t,request:g};ws(function(pe){r(pe),m()},function(pe){n(pe),m()},A),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 Z("Request aborted",Z.ECONNABORTED,t,g)),g=null)},g.onerror=function(z){let A=z&&z.message?z.message:"Network Error",be=new Z(A,Z.ERR_NETWORK,t,g);be.event=z||null,n(be),g=null},g.ontimeout=function(){let z=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded",A=o.transitional||ka;o.timeoutErrorMessage&&(z=o.timeoutErrorMessage),n(new Z(z,A.clarifyTimeoutError?Z.ETIMEDOUT:Z.ECONNABORTED,t,g)),g=null},s===void 0&&i.setContentType(null),"setRequestHeader"in g&&y.forEach(i.toJSON(),function(z,A){g.setRequestHeader(A,z)}),y.isUndefined(o.withCredentials)||(g.withCredentials=!!o.withCredentials),a&&a!=="json"&&(g.responseType=o.responseType),u&&([p,f]=io(u,!0),g.addEventListener("progress",p)),c&&g.upload&&([d,h]=io(c),g.upload.addEventListener("progress",d),g.upload.addEventListener("loadend",h)),(o.cancelToken||o.signal)&&(l=k=>{g&&(n(!k||k.type?new Lt(null,t,g):k),g.abort(),g=null)},o.cancelToken&&o.cancelToken.subscribe(l),o.signal&&(o.signal.aborted?l():o.signal.addEventListener("abort",l)));let x=Ef(o.url);if(x&&ke.protocols.indexOf(x)===-1){n(new Z("Unsupported protocol "+x+":",Z.ERR_BAD_REQUEST,t));return}g.send(s||null)})};var AA=(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 Z?l:new Lt(l instanceof Error?l.message:l))}},i=e&&setTimeout(()=>{i=null,s(new Z(`timeout ${e} of ms exceeded`,Z.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}},vv=AA;var OA=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},CA=async function*(t,e){for await(let r of NA(t))yield*OA(r,e)},NA=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()}},Nf=(t,e,r,n)=>{let o=CA(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 p=s+=d;r(p)}c.enqueue(new Uint8Array(l))}catch(u){throw a(u),u}},cancel(c){return a(c),o.return()}},{highWaterMark:2})};var bv=64*1024,{isFunction:Ta}=y,IA=(({Request:t,Response:e})=>({Request:t,Response:e}))(y.global),{ReadableStream:wv,TextEncoder:xv}=y.global,kv=(t,...e)=>{try{return!!t(...e)}catch{return!1}},MA=t=>{t=y.merge.call({skipUndefined:!0},IA,t);let{fetch:e,Request:r,Response:n}=t,o=e?Ta(e):typeof fetch=="function",s=Ta(r),i=Ta(n);if(!o)return!1;let a=o&&Ta(wv),c=o&&(typeof xv=="function"?(f=>m=>f.encode(m))(new xv):async f=>new Uint8Array(await new r(f).arrayBuffer())),u=s&&a&&kv(()=>{let f=!1,m=new r(ke.origin,{body:new wv,method:"POST",get duplex(){return f=!0,"half"}}).headers.has("Content-Type");return f&&!m}),l=i&&a&&kv(()=>y.isReadableStream(new n("").body)),d={stream:l&&(f=>f.body)};o&&["text","arrayBuffer","blob","formData","stream"].forEach(f=>{!d[f]&&(d[f]=(m,g)=>{let _=m&&m[f];if(_)return _.call(m);throw new Z(`Response type '${f}' is not supported`,Z.ERR_NOT_SUPPORT,g)})});let p=async f=>{if(f==null)return 0;if(y.isBlob(f))return f.size;if(y.isSpecCompliantForm(f))return(await new r(ke.origin,{method:"POST",body:f}).arrayBuffer()).byteLength;if(y.isArrayBufferView(f)||y.isArrayBuffer(f))return f.byteLength;if(y.isURLSearchParams(f)&&(f=f+""),y.isString(f))return(await c(f)).byteLength},h=async(f,m)=>{let g=y.toFiniteNumber(f.getContentLength());return g??p(m)};return async f=>{let{url:m,method:g,data:_,signal:x,cancelToken:k,timeout:z,onDownloadProgress:A,onUploadProgress:be,responseType:pe,headers:Tt,withCredentials:nr="same-origin",fetchOptions:or}=za(f),_n=e||fetch;pe=pe?(pe+"").toLowerCase():"text";let Or=vv([x,k&&k.toAbortSignal()],z),sr=null,Ht=Or&&Or.unsubscribe&&(()=>{Or.unsubscribe()}),Xf;try{if(be&&u&&g!=="get"&&g!=="head"&&(Xf=await h(Tt,_))!==0){let ar=new r(m,{method:"POST",body:_,duplex:"half"}),vn;if(y.isFormData(_)&&(vn=ar.headers.get("content-type"))&&Tt.setContentType(vn),ar.body){let[Da,zs]=Pf(Xf,io(Af(be)));_=Nf(ar.body,bv,Da,zs)}}y.isString(nr)||(nr=nr?"include":"omit");let Rt=s&&"credentials"in r.prototype,ep={...or,signal:Or,method:g.toUpperCase(),headers:Tt.normalize().toJSON(),body:_,duplex:"half",credentials:Rt?nr:void 0};sr=s&&new r(m,ep);let ir=await(s?_n(sr,or):_n(m,ep)),tp=l&&(pe==="stream"||pe==="response");if(l&&(A||tp&&Ht)){let ar={};["status","statusText","headers"].forEach(rp=>{ar[rp]=ir[rp]});let vn=y.toFiniteNumber(ir.headers.get("content-length")),[Da,zs]=A&&Pf(vn,io(Af(A),!0))||[];ir=new n(Nf(ir.body,bv,Da,()=>{zs&&zs(),Ht&&Ht()}),ar)}pe=pe||"text";let Rb=await d[y.findKey(d,pe)||"text"](ir,f);return!tp&&Ht&&Ht(),await new Promise((ar,vn)=>{ws(ar,vn,{data:Rb,headers:Te.from(ir.headers),status:ir.status,statusText:ir.statusText,config:f,request:sr})})}catch(Rt){throw Ht&&Ht(),Rt&&Rt.name==="TypeError"&&/Load failed|fetch/i.test(Rt.message)?Object.assign(new Z("Network Error",Z.ERR_NETWORK,f,sr),{cause:Rt.cause||Rt}):Z.from(Rt,Rt&&Rt.code,f,sr)}}},jA=new Map,If=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=jA;for(;a--;)c=s[a],u=l.get(c),u===void 0&&l.set(c,u=a?new Map:MA(e)),l=u;return u},oL=If();var Mf={http:wa,xhr:_v,fetch:{get:If}};y.forEach(Mf,(t,e)=>{if(t){try{Object.defineProperty(t,"name",{value:e})}catch{}Object.defineProperty(t,"adapterName",{value:e})}});var Sv=t=>`- ${t}`,DA=t=>y.isFunction(t)||t===null||t===!1;function ZA(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,!DA(n)&&(o=Mf[(a=String(n)).toLowerCase()],o===void 0))throw new Z(`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(Sv).join(`
|
|
43
43
|
`):" "+Sv(i[0]):"as no adapter specified";throw new Z("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return o}var Ra={getAdapter:ZA,adapters:Mf};function jf(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new Lt(null,t)}function Ea(t){return jf(t),t.headers=Te.from(t.headers),t.data=vs.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),Ra.getAdapter(t.adapter||oo.adapter,t)(t).then(function(n){return jf(t),n.data=vs.call(t,t.transformResponse,n),n.headers=Te.from(n.headers),n},function(n){return bs(n)||(jf(t),n&&n.response&&(n.response.data=vs.call(t,t.transformResponse,n.response),n.response.headers=Te.from(n.response.headers))),Promise.reject(n)})}var Pa="1.13.2";var Aa={};["object","boolean","number","function","string","symbol"].forEach((t,e)=>{Aa[t]=function(n){return typeof n===t||"a"+(e<1?"n ":" ")+t}});var $v={};Aa.transitional=function(e,r,n){function o(s,i){return"[Axios v"+Pa+"] Transitional option '"+s+"'"+i+(n?". "+n:"")}return(s,i,a)=>{if(e===!1)throw new Z(o(i," has been removed"+(r?" in "+r:"")),Z.ERR_DEPRECATED);return r&&!$v[i]&&($v[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}};Aa.spelling=function(e){return(r,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};function LA(t,e,r){if(typeof t!="object")throw new Z("options must be an object",Z.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 Z("option "+s+" must be "+c,Z.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new Z("Unknown option "+s,Z.ERR_BAD_OPTION)}}var ks={assertOptions:LA,validators:Aa};var Ut=ks.validators,ao=class{constructor(e){this.defaults=e||{},this.interceptors={request:new xf,response:new xf}}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=zt(this.defaults,r);let{transitional:n,paramsSerializer:o,headers:s}=r;n!==void 0&&ks.assertOptions(n,{silentJSONParsing:Ut.transitional(Ut.boolean),forcedJSONParsing:Ut.transitional(Ut.boolean),clarifyTimeoutError:Ut.transitional(Ut.boolean)},!1),o!=null&&(y.isFunction(o)?r.paramsSerializer={serialize:o}:ks.assertOptions(o,{encode:Ut.function,serialize:Ut.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),ks.assertOptions(r,{baseUrl:Ut.spelling("baseURL"),withXsrfToken:Ut.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"],f=>{delete s[f]}),r.headers=Te.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,p;if(!c){let f=[Ea.bind(this),void 0];for(f.unshift(...a),f.push(...u),p=f.length,l=Promise.resolve(r);d<p;)l=l.then(f[d++],f[d++]);return l}p=a.length;let h=r;for(;d<p;){let f=a[d++],m=a[d++];try{h=f(h)}catch(g){m.call(this,g);break}}try{l=Ea.call(this,h)}catch(f){return Promise.reject(f)}for(d=0,p=u.length;d<p;)l=l.then(u[d++],u[d++]);return l}getUri(e){e=zt(this.defaults,e);let r=xs(e.baseURL,e.url,e.allowAbsoluteUrls);return ys(r,e.params,e.paramsSerializer)}};y.forEach(["delete","get","head","options"],function(e){ao.prototype[e]=function(r,n){return this.request(zt(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(zt(a||{},{method:e,headers:n?{"Content-Type":"multipart/form-data"}:{},url:s,data:i}))}}ao.prototype[e]=r(),ao.prototype[e+"Form"]=r(!0)});var Ss=ao;var qf=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 Lt(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}}},zv=qf;function Df(t){return function(r){return t.apply(null,r)}}function Zf(t){return y.isObject(t)&&t.isAxiosError===!0}var Lf={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(Lf).forEach(([t,e])=>{Lf[e]=t});var Tv=Lf;function Rv(t){let e=new Ss(t),r=ps(Ss.prototype.request,e);return y.extend(r,Ss.prototype,e,{allOwnKeys:!0}),y.extend(r,e,null,{allOwnKeys:!0}),r.create=function(o){return Rv(zt(t,o))},r}var $e=Rv(oo);$e.Axios=Ss;$e.CanceledError=Lt;$e.CancelToken=zv;$e.isCancel=bs;$e.VERSION=Pa;$e.toFormData=Er;$e.AxiosError=Z;$e.Cancel=$e.CanceledError;$e.all=function(e){return Promise.all(e)};$e.spread=Df;$e.isAxiosError=Zf;$e.mergeConfig=zt;$e.AxiosHeaders=Te;$e.formToJSON=t=>Sa(y.isHTMLForm(t)?new FormData(t):t);$e.getAdapter=Ra.getAdapter;$e.HttpStatusCode=Tv;$e.default=$e;var Ft=$e;var{Axios:t2,AxiosError:r2,CanceledError:n2,isCancel:o2,CancelToken:s2,VERSION:i2,all:a2,Cancel:c2,isAxiosError:u2,spread:l2,toFormData:d2,AxiosHeaders:f2,HttpStatusCode:p2,formToJSON:m2,getAdapter:h2,mergeConfig:g2}=Ft;var Pr={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","https://dati.gov.it","https://www.dati.gov.it"],search:{force_text_field:!0},hvd:{category_field:"hvd_category"},sparql:{endpoint_url:"https://lod.dati.gov.it/sparql",method:"GET"},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:"dati-arpae-it",name:"dati.arpae.it",api_url:"https://dati.arpae.it",api_url_aliases:["http://dati.arpae.it"],search:{force_text_field:!0}},{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",search:{force_text_field:!0},dataset_view_url:"https://www.data.gov.uk/dataset/{id}/{name}",organization_view_url:"https://www.data.gov.uk/organization/{name}"},{id:"catalog-data-gov",name:"catalog.data.gov",api_url:"https://catalog.data.gov",api_url_aliases:["http://catalog.data.gov"],search:{force_text_field:!0}},{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"],search:{force_text_field:!0}},{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"],dataset_view_url:"https://data.gov.au/data/dataset/{name}",organization_view_url:"https://data.gov.au/data/organization/{name}"},{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"]},{id:"data-stadt-zuerich-ch",name:"data.stadt-zuerich.ch",api_url:"https://data.stadt-zuerich.ch",api_url_aliases:["http://data.stadt-zuerich.ch","https://www.data.stadt-zuerich.ch","https://ckan-prod.zurich.datopian.com"],organization_view_url:"https://ckan-prod.zurich.datopian.com/organization/{name}"},{id:"data-gov-ua",name:"data.gov.ua",api_url:"https://data.gov.ua",api_url_aliases:["http://data.gov.ua"],search:{force_text_field:!1}},{id:"govdata-de",name:"govdata.de",api_url:"https://ckan.govdata.de",api_url_aliases:["https://www.govdata.de","https://govdata.de","https://www.govdata.de/daten","https://data.gov.de","https://www.data.gov.de"],dataset_view_url:"https://ckan.govdata.de/dataset/{name}",organization_view_url:"https://ckan.govdata.de/organization/{name}"}],defaults:{dataset_view_url:"{server_url}/dataset/{name}",organization_view_url:"{server_url}/organization/{name}",search:{force_text_field:!1}}};function mn(t){return t.replace(/\/$/,"")}function FA(t){try{return new URL(t).hostname}catch{return null}}function rr(t){let e=mn(t);return Pr.portals.find(n=>{let o=mn(n.api_url),s=(n.api_url_aliases||[]).map(mn);return o===e||s.includes(e)})||null}function Ev(t){let e=rr(t),r=Pr.defaults?.search||{};return{force_text_field:e?.search?.force_text_field??r.force_text_field??!1}}function Pv(t){return rr(t)?.search?.force_text_field!==void 0}function Uf(t){return mn(t)}function Oa(t){let e=Pr.portals.find(r=>[r.api_url,...r.api_url_aliases||[]].some(o=>FA(o)===t));return e?mn(e.api_url):null}function co(t){return rr(t)?.hvd??null}function Av(t){let e=mn(t);return Pr.portals.find(n=>n.sparql&&mn(n.sparql.endpoint_url)===e)?.sparql??null}function Ov(t){return rr(t)?.sparql??null}function hn(t){return rr(t)?.api_path||"/api/3/action"}function Ff(t){return rr(t)?.normalize==="multilingual"}var HA=(()=>{let t=null;return async()=>(t||(t=(async()=>{try{return await import("node:zlib")}catch{return null}})()),t)})();function Cv(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 VA(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 BA(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 KA(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 Nv(t,e){if(t==null)return t;let r=BA(t);if(r&&typeof Buffer>"u"){let c=Cv(e,"content-encoding"),u=await KA(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=VA(t);if(!n)return t;let o=Cv(e,"content-encoding"),s=n,i=await HA();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}}function Hf(t){let e;try{e=new URL(t)}catch{throw new Error(`Invalid URL: ${t}`)}if(e.protocol!=="http:"&&e.protocol!=="https:")throw new Error(`Disallowed protocol "${e.protocol}". Only http and https are allowed.`);let r=e.hostname.toLowerCase();if(r==="localhost")throw new Error(`Access to "${r}" is not allowed.`);let n=r.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(n){let[o,s]=n.slice(1).map(Number);if(o===0||o===10||o===127||o===100&&s>=64&&s<=127||o===169&&s===254||o===172&&s>=16&&s<=31||o===192&&s===168||o===255)throw new Error("Access to private/internal IP addresses is not allowed.")}if(r.startsWith("[")){let s=r.slice(1,-1).toLowerCase();if(s==="::1"||s==="::"||s.startsWith("fc")||s.startsWith("fd")||s.startsWith("fe80")||s.startsWith("::ffff:"))throw new Error("Access to private/internal IPv6 addresses is not allowed.")}}async function F(t,e,r={}){let n=typeof process<"u"&&!!process.versions?.node;Hf(t);let o=t;try{let c=new URL(t).hostname,u=Oa(c);u&&(o=u)}catch{}let s=o.replace(/\/$/,""),i=hn(o),a=`${s}${i}/${e}`;try{let c;if(n){let u=await Ft.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","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 Nv(u.data,u.headers)}else{let u=new URLSearchParams;for(let[g,_]of Object.entries(r))_!=null&&u.set(g,String(_));let l=u.toString()?`${a}?${u.toString()}`:a,d=new AbortController,p=setTimeout(()=>d.abort(),3e4),h;try{h=await fetch(l,{method:"GET",signal:d.signal,headers:{Accept:"application/json, text/plain, */*","Accept-Encoding":"identity","User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}})}finally{clearTimeout(p)}if(!h.ok)throw new Error(`CKAN API error (${h.status}): ${h.statusText}`);let f=await h.arrayBuffer(),m={};h.headers.forEach((g,_)=>{m[_]=g}),c=await Nv(f,m)}if(c&&c.success===!0)return c.result;throw new Error(`CKAN API returned success=false: ${JSON.stringify(c)}`)}catch(c){if(Ft.isAxiosError(c)){let u=c;if(u.response){let l=u.response.status,d=u.response.data,p=d?.error?.message||d?.error||"Unknown error";throw new Error(`CKAN API error (${l}): ${p}`)}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 W(t,e=Rr){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=zt(this.defaults,r);let{transitional:n,paramsSerializer:o,headers:s}=r;n!==void 0&&ks.assertOptions(n,{silentJSONParsing:Ut.transitional(Ut.boolean),forcedJSONParsing:Ut.transitional(Ut.boolean),clarifyTimeoutError:Ut.transitional(Ut.boolean)},!1),o!=null&&(y.isFunction(o)?r.paramsSerializer={serialize:o}:ks.assertOptions(o,{encode:Ut.function,serialize:Ut.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),ks.assertOptions(r,{baseUrl:Ut.spelling("baseURL"),withXsrfToken:Ut.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"],f=>{delete s[f]}),r.headers=Te.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,p;if(!c){let f=[Ea.bind(this),void 0];for(f.unshift(...a),f.push(...u),p=f.length,l=Promise.resolve(r);d<p;)l=l.then(f[d++],f[d++]);return l}p=a.length;let h=r;for(;d<p;){let f=a[d++],m=a[d++];try{h=f(h)}catch(g){m.call(this,g);break}}try{l=Ea.call(this,h)}catch(f){return Promise.reject(f)}for(d=0,p=u.length;d<p;)l=l.then(u[d++],u[d++]);return l}getUri(e){e=zt(this.defaults,e);let r=xs(e.baseURL,e.url,e.allowAbsoluteUrls);return ys(r,e.params,e.paramsSerializer)}};y.forEach(["delete","get","head","options"],function(e){ao.prototype[e]=function(r,n){return this.request(zt(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(zt(a||{},{method:e,headers:n?{"Content-Type":"multipart/form-data"}:{},url:s,data:i}))}}ao.prototype[e]=r(),ao.prototype[e+"Form"]=r(!0)});var Ss=ao;var qf=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 Lt(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}}},zv=qf;function Df(t){return function(r){return t.apply(null,r)}}function Zf(t){return y.isObject(t)&&t.isAxiosError===!0}var Lf={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(Lf).forEach(([t,e])=>{Lf[e]=t});var Tv=Lf;function Rv(t){let e=new Ss(t),r=ps(Ss.prototype.request,e);return y.extend(r,Ss.prototype,e,{allOwnKeys:!0}),y.extend(r,e,null,{allOwnKeys:!0}),r.create=function(o){return Rv(zt(t,o))},r}var $e=Rv(oo);$e.Axios=Ss;$e.CanceledError=Lt;$e.CancelToken=zv;$e.isCancel=bs;$e.VERSION=Pa;$e.toFormData=Er;$e.AxiosError=Z;$e.Cancel=$e.CanceledError;$e.all=function(e){return Promise.all(e)};$e.spread=Df;$e.isAxiosError=Zf;$e.mergeConfig=zt;$e.AxiosHeaders=Te;$e.formToJSON=t=>Sa(y.isHTMLForm(t)?new FormData(t):t);$e.getAdapter=Ra.getAdapter;$e.HttpStatusCode=Tv;$e.default=$e;var Ft=$e;var{Axios:t2,AxiosError:r2,CanceledError:n2,isCancel:o2,CancelToken:s2,VERSION:i2,all:a2,Cancel:c2,isAxiosError:u2,spread:l2,toFormData:d2,AxiosHeaders:f2,HttpStatusCode:p2,formToJSON:m2,getAdapter:h2,mergeConfig:g2}=Ft;var Pr={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","https://dati.gov.it","https://www.dati.gov.it"],search:{force_text_field:!0},hvd:{category_field:"hvd_category"},sparql:{endpoint_url:"https://lod.dati.gov.it/sparql",method:"GET"},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:"dati-arpae-it",name:"dati.arpae.it",api_url:"https://dati.arpae.it",api_url_aliases:["http://dati.arpae.it"],search:{force_text_field:!0}},{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",search:{force_text_field:!0},dataset_view_url:"https://www.data.gov.uk/dataset/{id}/{name}",organization_view_url:"https://www.data.gov.uk/organization/{name}"},{id:"catalog-data-gov",name:"catalog.data.gov",api_url:"https://catalog.data.gov",api_url_aliases:["http://catalog.data.gov"],search:{force_text_field:!0}},{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"],search:{force_text_field:!0}},{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"],dataset_view_url:"https://data.gov.au/data/dataset/{name}",organization_view_url:"https://data.gov.au/data/organization/{name}"},{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"]},{id:"data-stadt-zuerich-ch",name:"data.stadt-zuerich.ch",api_url:"https://data.stadt-zuerich.ch",api_url_aliases:["http://data.stadt-zuerich.ch","https://www.data.stadt-zuerich.ch","https://ckan-prod.zurich.datopian.com"],organization_view_url:"https://ckan-prod.zurich.datopian.com/organization/{name}"},{id:"data-gov-ua",name:"data.gov.ua",api_url:"https://data.gov.ua",api_url_aliases:["http://data.gov.ua"],search:{force_text_field:!1}},{id:"dati-regione-sicilia",name:"dati.regione.sicilia.it",api_url:"https://dati.regione.sicilia.it",api_url_aliases:["http://dati.regione.sicilia.it"],search:{force_text_field:!1}},{id:"govdata-de",name:"govdata.de",api_url:"https://ckan.govdata.de",api_url_aliases:["https://www.govdata.de","https://govdata.de","https://www.govdata.de/daten","https://data.gov.de","https://www.data.gov.de"],dataset_view_url:"https://ckan.govdata.de/dataset/{name}",organization_view_url:"https://ckan.govdata.de/organization/{name}"}],defaults:{dataset_view_url:"{server_url}/dataset/{name}",organization_view_url:"{server_url}/organization/{name}",search:{force_text_field:!1}}};function mn(t){return t.replace(/\/$/,"")}function FA(t){try{return new URL(t).hostname}catch{return null}}function rr(t){let e=mn(t);return Pr.portals.find(n=>{let o=mn(n.api_url),s=(n.api_url_aliases||[]).map(mn);return o===e||s.includes(e)})||null}function Ev(t){let e=rr(t),r=Pr.defaults?.search||{};return{force_text_field:e?.search?.force_text_field??r.force_text_field??!1}}function Pv(t){return rr(t)?.search?.force_text_field!==void 0}function Uf(t){return mn(t)}function Oa(t){let e=Pr.portals.find(r=>[r.api_url,...r.api_url_aliases||[]].some(o=>FA(o)===t));return e?mn(e.api_url):null}function co(t){return rr(t)?.hvd??null}function Av(t){let e=mn(t);return Pr.portals.find(n=>n.sparql&&mn(n.sparql.endpoint_url)===e)?.sparql??null}function Ov(t){return rr(t)?.sparql??null}function hn(t){return rr(t)?.api_path||"/api/3/action"}function Ff(t){return rr(t)?.normalize==="multilingual"}var HA=(()=>{let t=null;return async()=>(t||(t=(async()=>{try{return await import("node:zlib")}catch{return null}})()),t)})();function Cv(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 VA(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 BA(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 KA(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 Nv(t,e){if(t==null)return t;let r=BA(t);if(r&&typeof Buffer>"u"){let c=Cv(e,"content-encoding"),u=await KA(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=VA(t);if(!n)return t;let o=Cv(e,"content-encoding"),s=n,i=await HA();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}}function Hf(t){let e;try{e=new URL(t)}catch{throw new Error(`Invalid URL: ${t}`)}if(e.protocol!=="http:"&&e.protocol!=="https:")throw new Error(`Disallowed protocol "${e.protocol}". Only http and https are allowed.`);let r=e.hostname.toLowerCase();if(r==="localhost")throw new Error(`Access to "${r}" is not allowed.`);let n=r.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(n){let[o,s]=n.slice(1).map(Number);if(o===0||o===10||o===127||o===100&&s>=64&&s<=127||o===169&&s===254||o===172&&s>=16&&s<=31||o===192&&s===168||o===255)throw new Error("Access to private/internal IP addresses is not allowed.")}if(r.startsWith("[")){let s=r.slice(1,-1).toLowerCase();if(s==="::1"||s==="::"||s.startsWith("fc")||s.startsWith("fd")||s.startsWith("fe80")||s.startsWith("::ffff:"))throw new Error("Access to private/internal IPv6 addresses is not allowed.")}}async function F(t,e,r={}){let n=typeof process<"u"&&!!process.versions?.node;Hf(t);let o=t;try{let c=new URL(t).hostname,u=Oa(c);u&&(o=u)}catch{}let s=o.replace(/\/$/,""),i=hn(o),a=`${s}${i}/${e}`;try{let c;if(n){let u=await Ft.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","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 Nv(u.data,u.headers)}else{let u=new URLSearchParams;for(let[g,_]of Object.entries(r))_!=null&&u.set(g,String(_));let l=u.toString()?`${a}?${u.toString()}`:a,d=new AbortController,p=setTimeout(()=>d.abort(),3e4),h;try{h=await fetch(l,{method:"GET",signal:d.signal,headers:{Accept:"application/json, text/plain, */*","Accept-Encoding":"identity","User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}})}finally{clearTimeout(p)}if(!h.ok)throw new Error(`CKAN API error (${h.status}): ${h.statusText}`);let f=await h.arrayBuffer(),m={};h.headers.forEach((g,_)=>{m[_]=g}),c=await Nv(f,m)}if(c&&c.success===!0)return c.result;throw new Error(`CKAN API returned success=false: ${JSON.stringify(c)}`)}catch(c){if(Ft.isAxiosError(c)){let u=c;if(u.response){let l=u.response.status,d=u.response.data,p=d?.error?.message||d?.error||"Unknown error";throw new Error(`CKAN API error (${l}): ${p}`)}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 W(t,e=Rr){return t.length<=e?t:t.substring(0,e)+`
|
|
45
45
|
|
|
46
46
|
... [Response truncated at ${e} characters]`}function nt(t,e=Rr){let r=JSON.stringify(t,null,2);if(r.length<=e||(r=JSON.stringify(t),r.length<=e))return r;let n=structuredClone(t),o=["results","records","resources","packages","organizations","groups","tags"];for(let s of o)if(Array.isArray(n[s])&&n[s].length>0){let i=n[s].length;for(;n[s].length>1;)if(n[s].pop(),n._truncated=!0,n._original_count=i,r=JSON.stringify(n),r.length<=e)return r}return W(JSON.stringify(n),e)}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 Iv(t){if(!t||t===0)return"0 B";let e=1024,r=["B","KB","MB","GB"],n=Math.floor(Math.log(t)/Math.log(e));return parseFloat((t/Math.pow(e,n)).toFixed(2))+" "+r[n]}function JA(){try{return typeof WorkerGlobalScope<"u"}catch{return!1}}function se(t){return JA()?t+`
|
|
47
47
|
|
|
@@ -369,7 +369,7 @@ Examples:
|
|
|
369
369
|
- { server_url: "https://dati.gov.it/opendata", id: "dataset-name" }
|
|
370
370
|
- { server_url: "...", id: "abc-123-def", include_tracking: true }
|
|
371
371
|
|
|
372
|
-
Typical workflow: ckan_package_show \u2192 pick a resource with datastore_active=true \u2192 ckan_datastore_search (query its data)`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server"),id:v.string().min(1).describe("Dataset ID or name"),include_tracking:v.boolean().optional().default(!1).describe("Include tracking statistics"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},async e=>{try{let r=await F(e.server_url,"package_show",{id:e.id,include_tracking:e.include_tracking});if(e.response_format==="json"){let o=lO(sO(r),e.server_url);return{content:[{type:"text",text:nt(o)}],structuredContent:o}}let n=iO(r,e.server_url);return{content:[{type:"text",text:W(se(n))}]}}catch(r){return{content:[{type:"text",text:`Error fetching package: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}),t.registerTool("ckan_list_resources",{title:"List CKAN Dataset Resources",description:`List all resources in a dataset with a compact summary.
|
|
372
|
+
Typical workflow: ckan_package_show \u2192 pick a resource with datastore_active=true \u2192 ckan_datastore_search (query its data)`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),id:v.string().min(1).describe("Dataset ID (UUID) or machine-readable name slug (e.g., 'raccolta-differenziata-comuni')"),include_tracking:v.boolean().optional().default(!1).describe("Include tracking statistics"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},async e=>{try{let r=await F(e.server_url,"package_show",{id:e.id,include_tracking:e.include_tracking});if(e.response_format==="json"){let o=lO(sO(r),e.server_url);return{content:[{type:"text",text:nt(o)}],structuredContent:o}}let n=iO(r,e.server_url);return{content:[{type:"text",text:W(se(n))}]}}catch(r){return{content:[{type:"text",text:`Error fetching package: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}),t.registerTool("ckan_list_resources",{title:"List CKAN Dataset Resources",description:`List all resources in a dataset with a compact summary.
|
|
373
373
|
|
|
374
374
|
Returns a focused table of resources showing format, size, DataStore availability, and download URL.
|
|
375
375
|
Use this to quickly assess what files a dataset contains before deciding how to access the data.
|
|
@@ -648,7 +648,7 @@ Args:
|
|
|
648
648
|
Returns:
|
|
649
649
|
List of tags with counts (from faceting)
|
|
650
650
|
|
|
651
|
-
Typical workflow: ckan_tag_list \u2192 ckan_package_search with fq="tags:tag_name" (find datasets by tag) \u2192 ckan_package_show`,inputSchema:v.object({server_url:v.string().url(),q:v.string().optional().default("*:*"),fq:v.string().optional(),tag_query:v.string().optional(),limit:v.number().int().min(1).max(1e3).optional().default(100),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0}},async e=>{try{let r={q:e.q,rows:0,"facet.field":JSON.stringify(["tags"]),"facet.limit":e.limit};e.fq&&(r.fq=e.fq);let n=await F(e.server_url,"package_search",r),o=yO(n);if(e.tag_query){let i=e.tag_query.toLowerCase();o=o.filter(a=>a.name.toLowerCase().includes(i))}if(o=o.sort((i,a)=>a.count-i.count||i.name.localeCompare(a.name)).slice(0,e.limit),e.response_format==="json"){let i={count:o.length,tags:o};return{content:[{type:"text",text:W(JSON.stringify(i,null,2))}],structuredContent:i}}let s=`# CKAN Tags
|
|
651
|
+
Typical workflow: ckan_tag_list \u2192 ckan_package_search with fq="tags:tag_name" (find datasets by tag) \u2192 ckan_package_show`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),q:v.string().optional().default("*:*").describe("Dataset search query in Solr syntax to scope the tag facet (default: '*:*' for all datasets)"),fq:v.string().optional().describe("Filter query in Solr syntax (e.g., 'organization:comune-palermo') to restrict which datasets contribute to tag counts"),tag_query:v.string().optional().describe("Substring filter applied to tag names after faceting (e.g., 'acqua' to keep only tags containing 'acqua')"),limit:v.number().int().min(1).max(1e3).optional().default(100).describe("Max tags to return (default 100, max 1000); tags are sorted by count descending"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0}},async e=>{try{let r={q:e.q,rows:0,"facet.field":JSON.stringify(["tags"]),"facet.limit":e.limit};e.fq&&(r.fq=e.fq);let n=await F(e.server_url,"package_search",r),o=yO(n);if(e.tag_query){let i=e.tag_query.toLowerCase();o=o.filter(a=>a.name.toLowerCase().includes(i))}if(o=o.sort((i,a)=>a.count-i.count||i.name.localeCompare(a.name)).slice(0,e.limit),e.response_format==="json"){let i={count:o.length,tags:o};return{content:[{type:"text",text:W(JSON.stringify(i,null,2))}],structuredContent:i}}let s=`# CKAN Tags
|
|
652
652
|
|
|
653
653
|
`;if(s+=`**Server**: ${e.server_url}
|
|
654
654
|
`,s+=`**Query**: ${e.q}
|
|
@@ -696,7 +696,7 @@ Args:
|
|
|
696
696
|
Returns:
|
|
697
697
|
List of groups with metadata. When limit=0, returns only the count of groups with datasets.
|
|
698
698
|
|
|
699
|
-
Typical workflow: ckan_group_list \u2192 ckan_group_show (inspect one) \u2192 ckan_package_search with fq="groups:name" (browse its datasets)`,inputSchema:v.object({server_url:v.string().url(),all_fields:v.boolean().optional().default(!1),sort:v.string().optional().default("name asc"),limit:v.number().int().min(0).optional().default(100),offset:v.number().int().min(0).optional().default(0),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},async e=>{try{if(e.limit===0){let s=(await F(e.server_url,"package_search",{rows:0,"facet.field":JSON.stringify(["groups"]),"facet.limit":-1})).search_facets?.groups?.items?.length||0;return e.response_format==="json"?{content:[{type:"text",text:JSON.stringify({count:s},null,2)}],structuredContent:{count:s}}:{content:[{type:"text",text:`# CKAN Groups Count
|
|
699
|
+
Typical workflow: ckan_group_list \u2192 ckan_group_show (inspect one) \u2192 ckan_package_search with fq="groups:name" (browse its datasets)`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),all_fields:v.boolean().optional().default(!1).describe("Return full group objects (true) or just name slugs (false)"),sort:v.string().optional().default("name asc").describe("Sort field and direction (e.g., 'name asc', 'package_count desc')"),limit:v.number().int().min(0).optional().default(100).describe("Max groups to return. Use 0 to get only the count via faceting"),offset:v.number().int().min(0).optional().default(0).describe("Pagination offset"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},async e=>{try{if(e.limit===0){let s=(await F(e.server_url,"package_search",{rows:0,"facet.field":JSON.stringify(["groups"]),"facet.limit":-1})).search_facets?.groups?.items?.length||0;return e.response_format==="json"?{content:[{type:"text",text:JSON.stringify({count:s},null,2)}],structuredContent:{count:s}}:{content:[{type:"text",text:`# CKAN Groups Count
|
|
700
700
|
|
|
701
701
|
**Server**: ${e.server_url}
|
|
702
702
|
**Total groups (with datasets)**: ${s}
|
|
@@ -726,7 +726,7 @@ Args:
|
|
|
726
726
|
Returns:
|
|
727
727
|
Group details with optional datasets
|
|
728
728
|
|
|
729
|
-
Typical workflow: ckan_group_show \u2192 ckan_package_show (inspect a dataset) \u2192 ckan_datastore_search (query its data)`,inputSchema:v.object({server_url:v.string().url(),id:v.string().min(1),include_datasets:v.boolean().optional().default(!0),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},async e=>{try{let r=await F(e.server_url,"group_show",{id:e.id,include_datasets:e.include_datasets});if(e.response_format==="json"){let o=wO(r);return{content:[{type:"text",text:nt(o)}],structuredContent:o}}let n=_O(r,e.server_url);return{content:[{type:"text",text:W(se(n))}]}}catch(r){return{content:[{type:"text",text:`Error fetching group: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}),t.registerTool("ckan_group_search",{title:"Search CKAN Groups by Name",description:`Search for groups by name pattern.
|
|
729
|
+
Typical workflow: ckan_group_show \u2192 ckan_package_show (inspect a dataset) \u2192 ckan_datastore_search (query its data)`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),id:v.string().min(1).describe("Group ID (UUID) or machine-readable name slug (e.g., 'transport', 'energia')"),include_datasets:v.boolean().optional().default(!0).describe("Include the list of datasets belonging to this group"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},async e=>{try{let r=await F(e.server_url,"group_show",{id:e.id,include_datasets:e.include_datasets});if(e.response_format==="json"){let o=wO(r);return{content:[{type:"text",text:nt(o)}],structuredContent:o}}let n=_O(r,e.server_url);return{content:[{type:"text",text:W(se(n))}]}}catch(r){return{content:[{type:"text",text:`Error fetching group: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}),t.registerTool("ckan_group_search",{title:"Search CKAN Groups by Name",description:`Search for groups by name pattern.
|
|
730
730
|
|
|
731
731
|
This tool provides a simpler interface than package_search for finding groups.
|
|
732
732
|
Wildcards are automatically added around the search pattern.
|
|
@@ -739,7 +739,7 @@ Args:
|
|
|
739
739
|
Returns:
|
|
740
740
|
List of matching groups with dataset counts
|
|
741
741
|
|
|
742
|
-
Typical workflow: ckan_group_search \u2192 ckan_group_show (get details) \u2192 ckan_package_search with fq="groups:name"`,inputSchema:v.object({server_url:v.string().url(),pattern:v.string().min(1).describe("
|
|
742
|
+
Typical workflow: ckan_group_search \u2192 ckan_group_show (get details) \u2192 ckan_package_search with fq="groups:name"`,inputSchema:v.object({server_url:v.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),pattern:v.string().min(1).describe("Name pattern to search for (wildcards added automatically, e.g., 'energia', 'salute')"),response_format:fe}).strict(),annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0}},async e=>{try{let r=`groups:*${e.pattern}*`,n=await F(e.server_url,"package_search",{q:r,rows:0,"facet.field":JSON.stringify(["groups"]),"facet.limit":500}),o=vO(n),s=n.count||0;if(e.response_format==="json"){let a={count:o.length,total_datasets:s,groups:o.map(c=>({name:c.name,display_name:c.display_name,dataset_count:c.count}))};return{content:[{type:"text",text:W(JSON.stringify(a,null,2))}],structuredContent:a}}let i=`# CKAN Group Search Results
|
|
743
743
|
|
|
744
744
|
`;if(i+=`**Server**: ${e.server_url}
|
|
745
745
|
`,i+=`**Pattern**: "${e.pattern}"
|
|
@@ -1093,7 +1093,7 @@ ckan_package_search({
|
|
|
1093
1093
|
})
|
|
1094
1094
|
\`\`\`
|
|
1095
1095
|
|
|
1096
|
-
If the portal supports HVD classification, look for datasets with fields like \`hvd_category\` or \`applicable_legislation\`.`,Sb=t=>{t.registerPrompt(sC,{title:"Search High-Value Datasets (HVD)",description:"Guided prompt to find High-Value Datasets (HVD) on a CKAN portal. Automatically uses the correct filter field from portal configuration.",argsSchema:{server_url:v.string().url().describe("Base URL of the CKAN server"),rows:v.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,rows:r})=>{let n=co(e);return ht(iC(e,r,n?.category_field??null))})};var $b=t=>{vb(t),bb(t),wb(t),xb(t),kb(t),Sb(t)};function zb(){return new ga({name:"ckan-mcp-server",version:"0.4.
|
|
1096
|
+
If the portal supports HVD classification, look for datasets with fields like \`hvd_category\` or \`applicable_legislation\`.`,Sb=t=>{t.registerPrompt(sC,{title:"Search High-Value Datasets (HVD)",description:"Guided prompt to find High-Value Datasets (HVD) on a CKAN portal. Automatically uses the correct filter field from portal configuration.",argsSchema:{server_url:v.string().url().describe("Base URL of the CKAN server"),rows:v.coerce.number().int().positive().default(10).describe("Max results to return")}},async({server_url:e,rows:r})=>{let n=co(e);return ht(iC(e,r,n?.category_field??null))})};var $b=t=>{vb(t),bb(t),wb(t),xb(t),kb(t),Sb(t)};function zb(){return new ga({name:"ckan-mcp-server",version:"0.4.97"})}function Tb(t){Kv(t),Jv(t),Gv(t),Qv(t),Yv(t),eb(t),ib(t),ab(t),cb(t),ub(t),lb(t),_b(t),$b(t)}var qa=class{constructor(e={}){this._started=!1,this._hasHandledRequest=!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){if(!this.sessionIdGenerator&&this._hasHandledRequest)throw new Error("Stateless transport cannot be reused across requests. Create a new transport per request.");this._hasHandledRequest=!0;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}
|
|
1097
1097
|
data:
|
|
1098
1098
|
|
|
1099
1099
|
`;this._retryInterval!==void 0&&(i=`id: ${s}
|
|
@@ -1287,4 +1287,4 @@ data:
|
|
|
1287
1287
|
</div>
|
|
1288
1288
|
</div>
|
|
1289
1289
|
</body>
|
|
1290
|
-
</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.
|
|
1290
|
+
</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.97",tools:20,resources:7,prompts:6,runtime:"cloudflare-workers"}),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});if(e.pathname==="/mcp"){if(t.method!=="POST"&&t.method!=="OPTIONS")return new Response("Method Not Allowed",{status:405,headers:{Allow:"POST, OPTIONS","Access-Control-Allow-Origin":"*"}});if(t.method==="OPTIONS")return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Accept, Authorization, Mcp-Session-Id","Access-Control-Max-Age":"86400"}});try{let r=zb();Tb(r);let n=new qa({sessionIdGenerator:void 0,enableJsonResponse:!0});await r.connect(n);let o=t.clone();try{let a=await o.json();if(a?.method==="tools/call"&&a?.params?.name){let c=a.params.name,u=a.params.arguments??{},l={tool:c,server:u.server_url??u.endpoint_url??""};u.q!==void 0&&(l.q=u.q),u.fq!==void 0&&(l.fq=u.fq),u.query!==void 0&&(l.query=u.query),u.id!==void 0&&(l.id=u.id),u.name!==void 0&&(l.name=u.name),u.pattern!==void 0&&(l.pattern=u.pattern),u.resource_id!==void 0&&(l.resource_id=u.resource_id),u.format_filter!==void 0&&(l.format_filter=u.format_filter),u.sort!==void 0&&(l.sort=u.sort),u.rows!==void 0&&(l.rows=u.rows),u.limit!==void 0&&(l.limit=u.limit),u.sql!==void 0&&(l.sql=String(u.sql).slice(0,200)),u.country!==void 0&&(l.country=u.country),u.language!==void 0&&(l.language=u.language),u.has_datastore!==void 0&&(l.has_datastore=u.has_datastore),u.min_datasets!==void 0&&(l.min_datasets=u.min_datasets),console.log(JSON.stringify(l))}}catch{}let s=await n.handleRequest(t),i=new Headers(s.headers);return i.set("Access-Control-Allow-Origin","*"),i.set("X-Service-Notice","Demo instance - 100k requests/day shared quota"),i.set("X-Recommendation","https://github.com/ondata/ckan-mcp-server#installation"),new Response(s.body,{status:s.status,statusText:s.statusText,headers:i})}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{nF as default};
|
package/package.json
CHANGED