@aborruso/ckan-mcp-server 0.4.51 → 0.4.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LOG.md +6 -0
- package/dist/index.js +12 -4
- package/package.json +1 -1
package/LOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# LOG
|
|
2
2
|
|
|
3
|
+
## 2026-02-28 (v0.4.52)
|
|
4
|
+
|
|
5
|
+
- fix: HTTP transport — `/.well-known/oauth-authorization-server` now returns JSON 404 instead of HTML; fixes Claude Code HTTP transport connection failure
|
|
6
|
+
- fix: `ckan_datastore_search` — `limit` min changed 1→0; allows column discovery without fetching data
|
|
7
|
+
- docs: `ckan_datastore_search` description updated — fields always returned, `limit=0` pattern documented
|
|
8
|
+
|
|
3
9
|
## 2026-02-27 (v0.4.51)
|
|
4
10
|
|
|
5
11
|
- refactor: domain types for all tool files — `CkanTag`, `CkanResource`, `CkanPackage`, `CkanOrganization`, `CkanField`, `CkanDatastoreResult` in `src/types.ts`; `any` reduced 32 → 1
|
package/dist/index.js
CHANGED
|
@@ -2043,6 +2043,10 @@ function registerDatastoreTools(server2) {
|
|
|
2043
2043
|
|
|
2044
2044
|
The DataStore allows SQL-like queries on tabular data. Not all resources have DataStore enabled.
|
|
2045
2045
|
|
|
2046
|
+
The response always includes a Fields section listing all available column names and types.
|
|
2047
|
+
Use limit=0 to discover column names without fetching data \u2014 do this before using filters
|
|
2048
|
+
to avoid guessing column names and getting HTTP 400 errors.
|
|
2049
|
+
|
|
2046
2050
|
Args:
|
|
2047
2051
|
- server_url (string): Base URL of CKAN server
|
|
2048
2052
|
- resource_id (string): ID of the DataStore resource
|
|
@@ -2056,20 +2060,21 @@ Args:
|
|
|
2056
2060
|
- response_format ('markdown' | 'json'): Output format
|
|
2057
2061
|
|
|
2058
2062
|
Returns:
|
|
2059
|
-
DataStore records matching query
|
|
2063
|
+
DataStore records matching query, always including available column names and types
|
|
2060
2064
|
|
|
2061
2065
|
Examples:
|
|
2066
|
+
- { server_url: "...", resource_id: "abc-123", limit: 0 } \u2190 discover columns first
|
|
2062
2067
|
- { server_url: "...", resource_id: "abc-123", limit: 50 }
|
|
2063
2068
|
- { server_url: "...", resource_id: "...", filters: { "regione": "Sicilia" } }
|
|
2064
2069
|
- { server_url: "...", resource_id: "...", sort: "anno desc", limit: 100 }
|
|
2065
2070
|
|
|
2066
|
-
Typical workflow: ckan_package_search \u2192 ckan_package_show (find resource_id with datastore_active=true) \u2192 ckan_datastore_search`,
|
|
2071
|
+
Typical workflow: ckan_package_search \u2192 ckan_package_show (find resource_id with datastore_active=true) \u2192 ckan_datastore_search (limit=0 to get columns) \u2192 ckan_datastore_search (with filters)`,
|
|
2067
2072
|
inputSchema: z4.object({
|
|
2068
2073
|
server_url: z4.string().url().describe("Base URL of the CKAN server (e.g., https://dati.gov.it/opendata)"),
|
|
2069
2074
|
resource_id: z4.string().min(1).describe("UUID of the DataStore resource (from ckan_package_show resource.id where datastore_active is true)"),
|
|
2070
2075
|
q: z4.string().optional().describe("Full-text search across all fields"),
|
|
2071
2076
|
filters: z4.record(z4.any()).optional().describe('Key-value filters for exact matches (e.g., { "regione": "Sicilia", "anno": 2023 })'),
|
|
2072
|
-
limit: z4.number().int().min(
|
|
2077
|
+
limit: z4.number().int().min(0).max(32e3).optional().default(100).describe("Max rows to return (default 100, max 32000); use 0 to get only column names without data"),
|
|
2073
2078
|
offset: z4.number().int().min(0).optional().default(0).describe("Pagination offset"),
|
|
2074
2079
|
fields: z4.array(z4.string()).optional().describe("Specific field names to return; omit to return all fields"),
|
|
2075
2080
|
sort: z4.string().optional().describe("Sort expression (e.g., 'anno desc', 'nome asc')"),
|
|
@@ -4004,7 +4009,7 @@ var registerAllPrompts = (server2) => {
|
|
|
4004
4009
|
function createServer() {
|
|
4005
4010
|
return new McpServer({
|
|
4006
4011
|
name: "ckan-mcp-server",
|
|
4007
|
-
version: "0.4.
|
|
4012
|
+
version: "0.4.52"
|
|
4008
4013
|
});
|
|
4009
4014
|
}
|
|
4010
4015
|
function registerAll(server2) {
|
|
@@ -4038,6 +4043,9 @@ async function runHTTP(server2) {
|
|
|
4038
4043
|
enableJsonResponse: true
|
|
4039
4044
|
});
|
|
4040
4045
|
await server2.connect(transport2);
|
|
4046
|
+
app.get("/.well-known/oauth-authorization-server", (_req, res) => {
|
|
4047
|
+
res.status(404).json({ error: "authorization_not_supported", error_description: "This server does not require authentication" });
|
|
4048
|
+
});
|
|
4041
4049
|
app.post("/mcp", async (req, res) => {
|
|
4042
4050
|
await transport2.handleRequest(req, res, req.body);
|
|
4043
4051
|
});
|