@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.
Files changed (3) hide show
  1. package/LOG.md +6 -0
  2. package/dist/index.js +12 -4
  3. 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(1).max(32e3).optional().default(100).describe("Max rows to return (default 100, max 32000)"),
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.50"
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aborruso/ckan-mcp-server",
3
- "version": "0.4.51",
3
+ "version": "0.4.52",
4
4
  "description": "MCP server for interacting with CKAN open data portals",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",