Skip to content

Commit 47b8452

Browse files
committed
chore(release): v0.4.117
1 parent 962c6ab commit 47b8452

4 files changed

Lines changed: 18 additions & 4 deletions

File tree

LOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22

33
## 2026-08-04
44

5+
### v0.4.117 — escaping portal-controlled strings
6+
7+
Field names, titles, cell values and every other short string coming from a third-party portal were interpolated into markdown structure unescaped. Since every response here is read by a model, that has two effects: a newline ends the construct and opens a line that reads as server-authored — indistinguishable from the `> **Note**:` lines this server writes to instruct the model — and an unescaped `|` adds table cells, shifting later values under the wrong header.
8+
9+
Worst case was `ckan_analyze_datasets`, which used none of the existing defenses and rendered the DataStore Data Dictionary (`info.notes`, publisher free text) straight into a bullet list. A newline let a portal fabricate a field entry, in the very tool an agent calls to learn which fields exist.
10+
11+
`sanitizeInline` now sits in `utils/formatting.ts` beside `wrapUntrusted` and `safeUrlText`: collapses newlines, escapes pipes, and replaces backticks with U+02BC so a value cannot close the inline code span it is rendered in. It promotes the private copy that lived in `datastore.ts` and retires the three ad-hoc `.replace(/[\r\n]+/g, ' ')` copies, which stripped newlines but escaped neither pipes nor backticks.
12+
13+
Long free text keeps `wrapUntrusted` — a fence states "this is data" better than escaping — and was already safe. The JSON path was never affected. URL query parameters use `encodeURIComponent`, not the markdown escaper: `&` and `#` would otherwise pass through.
14+
15+
Three review rounds on #45, each finding real gaps. Two are worth recording. The first automated sweep matched `markdown +=`, so every renderer's opening `let markdown = \`# ...\`` escaped it — all four top-level headings. And the sweep wrapped two scoring weights that are our own numbers, not portal strings; both reverted. A grep-driven audit produced a false sense of completeness twice; if anything else surfaces, the answer is a generative test that enumerates portal fields, not a fourth grep.
16+
17+
485 tests, 15 of them new.
18+
519
### v0.4.116
620

721
Ships the two DataStore output fixes below, plus `.greptile/rules.md`: the automated review on #43 produced one confident false positive, so the invariants a generic reviewer cannot know are now stated in the repo.

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"dxt_version": "0.1",
33
"name": "ckan-mcp-server",
4-
"version": "0.4.116",
4+
"version": "0.4.117",
55
"display_name": "CKAN MCP Server",
66
"description": "Explore open data portals based on CKAN (dati.gov.it, data.gov, open.canada.ca, ...)",
77
"long_description": "MCP server for interacting with CKAN-based open data portals. Provides tools for advanced dataset search with Solr syntax, DataStore queries for tabular data analysis, organization and group exploration, and complete metadata access.",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@aborruso/ckan-mcp-server",
3-
"version": "0.4.116",
3+
"version": "0.4.117",
44
"mcpName": "io.github.aborruso/ckan-mcp-server",
55
"description": "MCP server for interacting with CKAN open data portals",
66
"repository": {

server.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
"url": "https://github.com/ondata/ckan-mcp-server",
77
"source": "github"
88
},
9-
"version": "0.4.116",
9+
"version": "0.4.117",
1010
"packages": [
1111
{
1212
"registryType": "npm",
1313
"identifier": "@aborruso/ckan-mcp-server",
14-
"version": "0.4.116",
14+
"version": "0.4.117",
1515
"transport": {
1616
"type": "stdio"
1717
}

0 commit comments

Comments
 (0)