viafrei 1.4.6 → 1.4.9

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/API.md CHANGED
@@ -9,7 +9,7 @@ the server's own text, reproduced verbatim, because that text is what an
9
9
  assistant reads when it decides which tool to call; paraphrasing it here would
10
10
  document a different server.
11
11
 
12
- **It is a dated snapshot, taken on 2026-09-29.** Generating this file makes
12
+ **It is a dated snapshot, taken on 2026-10-01.** Generating this file makes
13
13
  it impossible for the document and the snapshot to disagree — CI regenerates and
14
14
  compares — but it cannot keep the snapshot from ageing against the live server,
15
15
  because a capture is a point in time. **The source of truth is the running
@@ -17,11 +17,11 @@ server:** connect any MCP client and call `tools/list`.
17
17
 
18
18
  | | |
19
19
  | --- | --- |
20
- | Server | `viafrei` 1.4.6 |
20
+ | Server | `viafrei` 1.4.9 |
21
21
  | MCP protocol | `2025-06-18` |
22
22
  | Streamable HTTP | https://mcp.viafrei.de/mcp |
23
23
  | Legacy HTTP+SSE | https://mcp.viafrei.de/sse |
24
- | Captured from | `https://mcp.viafrei.de/mcp` on 2026-09-29 |
24
+ | Captured from | `https://mcp.viafrei.de/mcp` on 2026-10-01 |
25
25
  | Surface | 19 tools, 10 resources, 2 resource templates, 9 prompts |
26
26
  | Parameter schemas | JSON Schema draft-07 |
27
27
  | Capabilities | `tools`, `resources`, `prompts`, `logging` |
@@ -655,5 +655,5 @@ single call.
655
655
  ---
656
656
 
657
657
  Generated from `catalogue.json` by `scripts/gen-api-doc.mjs`. The snapshot was
658
- read from `https://mcp.viafrei.de/mcp` on 2026-09-29; no tool was invoked to
658
+ read from `https://mcp.viafrei.de/mcp` on 2026-10-01; no tool was invoked to
659
659
  produce it, so no data provider was contacted.
package/CHANGELOG.md CHANGED
@@ -5,7 +5,199 @@ a Changelog and the versions follow Semantic Versioning.
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
- Nothing yet.
8
+ ## [1.4.9] - 2026-10-01
9
+
10
+ **Mirrors the server.** The bridge is versioned to match the ViaFrei MCP server
11
+ it relays to, and prod moved to 1.4.9; this release carries the three changes
12
+ that had been waiting under `[Unreleased]` for a number to mirror. The shipped
13
+ reference was re-captured from the running server at the cut, and the probe that
14
+ did it reported the surface **unchanged** — only the version string and the
15
+ capture date moved.
16
+
17
+ ### Added
18
+
19
+ - **The sources page is now checked against the catalogue snapshot** (`scripts/check-sources.mjs`,
20
+ `npm run check:sources`), in CI and in the publish workflow (#32).
21
+
22
+ `SOURCES.md` states counts *about the server* — how many tools it exposes, how many are
23
+ read-only, which are fuel and therefore excluded from its spot check. Nothing compared
24
+ them with `catalogue.json`, which ships in the same tarball and holds the answers, and
25
+ the page spent two releases describing a server it no longer matched.
26
+
27
+ **Offline on purpose, and that is what makes it worth having.** Both files already ship
28
+ together, so this needs no network and runs on every push rather than at the cut. It
29
+ would have caught all three defects of the previous entry, including the one that got
30
+ past a first review round: the **derived** call count is computed as read-only minus the
31
+ excluded fuel tools, never read from the prose, because that is the one number on the
32
+ page a reader might act on.
33
+
34
+ The licence arm is the one that matters: a fuel tool present in the snapshot and not
35
+ named by the page is a failure, because that exclusion is an MTS-K condition rather
36
+ than a convenience, and a tool counts as fuel-constrained if its NAME says so **or**
37
+ its DESCRIPTION names the provider — measured on this snapshot, both fuel tools name
38
+ theirs in prose and no other tool does, so a rename alone cannot hide one. `npm run
39
+ test:sources` prints the case count; no number is written here, because this entry's
40
+ first draft stated one and it was stale within the round.
41
+
42
+ Two limits are pinned rather than assumed. A fuel rule gone inert REFUSES (exit 2)
43
+ instead of reporting an empty excluded set. And a tool renamed away from `fuel` *whose
44
+ description also stops naming the provider* matches neither arm and is not on the floor,
45
+ so that one still fails through the arithmetic, with a message about a call count rather
46
+ than about an unprotected tool. That is the honest reach of two text rules, and the
47
+ weaker behaviour is asserted rather than hoped for.
48
+
49
+ - **A cut-time probe that compares the shipped reference with the running server**
50
+ (`scripts/probe-catalogue.mjs`, `npm run probe:catalogue`; `--write` re-captures) (#33).
51
+
52
+ At the 1.4.6 cut the shipped reference described server 1.3.22 and omitted a tool the
53
+ server exposed. `check:docs` passed throughout — it proves `API.md` matches
54
+ `catalogue.json`, so **a stale pair passes together**. Nothing compared either with the
55
+ server.
56
+
57
+ **It is deliberately not a CI step.** This repository's test posture is that CI reaches
58
+ nothing, which is why every other check here is offline; a comparison with the running
59
+ server needs a network call, so this is run by a person at the cut and is the only
60
+ script here that touches the network. It is named `probe:` rather than `check:` so that
61
+ distinction is visible in `package.json`.
62
+
63
+ Read-only: `initialize` and the four list calls, **no tool invoked**, session deleted
64
+ afterwards. That is a licence requirement and not courtesy — the fuel source sets a
65
+ per-station floor.
66
+
67
+ **Its report distinguishes WRONG from DATED**, because those are the two real histories
68
+ and they need different remedies: 1.4.6's reference omitted a tool, which misleads a
69
+ reader about what they are holding; 1.4.8's had only a stale version string. Reporting
70
+ one as the other would be worse than no probe. Ten self-test cases, none of which touch
71
+ the network — every one runs against a local stub — including both halves of that
72
+ distinction, an empty list refused rather than compared equal, and `--write` proved to
73
+ produce a snapshot the comparator then accepts.
74
+
75
+ - **`runToolAsync`** in `scripts/tools.mjs`, with the same deadline and refusal as
76
+ `runTool`. The synchronous runner blocks the caller's event loop, so a caller that is
77
+ itself serving the child cannot use it — the probe's self-test serves a stub in-process
78
+ and spawns the probe against it, and every case deadlocked until this existed. Added to
79
+ the one `SPAWNERS` array the bare-name sweep derives from, so it is covered by the same
80
+ rule as its sibling rather than being a quiet exemption.
81
+
82
+ ### Fixed
83
+
84
+ - **Both CI deprecation warnings, in both workflows.** `build-and-test` was emitting two
85
+ notices: the Node-20 runtime of `actions/checkout@v4` and `actions/setup-node@v4` is
86
+ deprecated and GitHub is already forcing those actions onto Node 24, and the
87
+ `ubuntu-latest` label migrates to Ubuntu 26 from 2026-10-19.
88
+
89
+ **The warning named one workflow; the measurement named two.** `publish.yml` pinned both
90
+ actions by commit sha, which looked like the careful half of the repository — but
91
+ `action.yml` at each of those pinned shas declares `using: node20`. So the workflow that
92
+ publishes to npm was on the deprecated runtime too and said nothing about it, because a
93
+ sha pin does not report its own age. A fix confined to `ci.yml` would have cleared the
94
+ log and left the publish path exactly where it was.
95
+
96
+ Both files now pin the same runner image, `ubuntu-24.04`, and the same two actions by
97
+ sha: checkout **v7.0.1** and setup-node **v7.0.0**, resolved from the API rather than
98
+ transcribed, and each verified to declare `using: node24` at the sha actually pinned —
99
+ which is what closes the notice rather than deferring it. That also leaves one version
100
+ of each action in the repository instead of two.
101
+
102
+ **v7, not v5, and it is a three-major move.** v5 clears today's warning and leaves this
103
+ repository two majors behind the same deadline. The first draft of this entry described
104
+ v7.0.0's release notes and called them the only behaviour change — true of that release,
105
+ false of the upgrade, and the paragraph's whole job is to justify the size of the jump.
106
+
107
+ The jump was therefore checked mechanically instead, which is shorter and re-runnable:
108
+ **diff the declared input sets at the two shas.** Across v4.4.0 → v7.0.0 setup-node
109
+ removes exactly one input, `always-auth`, and adds `package-manager-cache`; checkout
110
+ removes and adds none. Between them the two workflows pass four inputs — `node-version`,
111
+ `registry-url`, `cache` and `fetch-depth` — and all four are still declared, so the
112
+ `registry-url` → `.npmrc` path the publish depends on is intact.
113
+
114
+ The breaking changes the intervening majors do declare are inert here, by enumeration
115
+ rather than by assumption: setup-node v5's automatic package-manager detection and v6's
116
+ narrowing of it to npm cannot apply, because both jobs pass `cache: npm` explicitly and
117
+ this `package.json` has no `packageManager` field; checkout v5's minimum runner version
118
+ (2.327.1) is far below what GitHub-hosted runners run; checkout v7's refusal to check out
119
+ a fork's head applies to `pull_request_target` and `workflow_run`, neither of which
120
+ appears anywhere under `.github/`; and setup-node v7's removal of the dummy
121
+ `NODE_AUTH_TOKEN` export is an **improvement** on this path — that variable appears
122
+ nowhere in either workflow, and upstream's own pull request says the dummy value could
123
+ corrupt an `.npmrc` during an OIDC publish, which is how publishing here works.
124
+
125
+ One is named rather than waved past, because it touches the publish gate. checkout v6
126
+ moved the persisted git credential into a separate file, and `publish.yml` runs one git
127
+ command that touches the remote after checkout: the `git fetch origin main` the
128
+ tag-containment guard needs (the step's other two, a `rev-parse` and a `merge-base`, are
129
+ local). This repository is public, so that fetch succeeds with or without a credential;
130
+ and if it ever did not, the guard exits **2** and refuses to publish rather than
131
+ publishing a commit `main` does not contain. Fail-closed, so the bad outcome is a blocked
132
+ release and never a wrong one. It is also the one step a `workflow_dispatch` dry run
133
+ cannot exercise, since the guard is gated on a tag.
134
+
135
+ A floating tag is what hid this, so nothing here floats: all four `- uses:` lines in the
136
+ repository are now `@<sha> # vX.Y.Z`, and neither `runs-on` is a label that can change
137
+ under a workflow nobody re-read.
138
+
139
+ Written while prod and the registry were both at 1.4.8, so this said "no version bump:
140
+ there is no number to mirror". Prod moved to 1.4.9 before the cut, so the number now
141
+ exists and this ships under it.
142
+
143
+ - **`SOURCES.md` claimed a measurement that stopped being true, and the stale half is
144
+ a licence condition.** The page said its status column was measured by calling
145
+ "fifteen of the server's sixteen read-only tools — every one except
146
+ `find_cheapest_fuel`". As of the 2026-09-29 capture shipped alongside it, the server
147
+ exposes nineteen tools, seventeen of them read-only, and — this is the part that
148
+ matters — a **second** fuel tool, `find_fuel_station`.
149
+
150
+ The exclusion of `find_cheapest_fuel` is not a convenience: MTS-K sets a minimum
151
+ interval per station and its terms make needless querying a real risk to the access
152
+ itself. That reasoning applies to `find_fuel_station` identically, and the page did
153
+ not name it, so a reader following the page's own method would have called a fuel
154
+ tool the page meant to exclude.
155
+
156
+ The measurement is now scoped to the date and the server it was taken against, the
157
+ growth since is stated, and **both** fuel tools are named as excluded. It is
158
+ deliberately **not** re-run: that would still cost **fifteen** live calls against
159
+ real providers to re-confirm statuses already known — the same fifteen as at the
160
+ original measurement, because the one read-only tool the server gained is the
161
+ second fuel tool and is excluded. Sixteen minus one was fifteen; seventeen minus
162
+ two is fifteen again. Dated on purpose, and said out loud — a measurement carried forward under a present-tense sentence is
163
+ the failure that section exists to avoid.
164
+
165
+ Not released on its own: when it was written prod was at 1.4.8, already published, and
166
+ putting the package a patch ahead of the endpoint it relays to would have been worse than
167
+ waiting. It rode the next version sync, which is this one.
168
+
169
+ ## [1.4.8] - 2026-09-29
170
+
171
+ **A version-sync release.** The bridge is published at the version the ViaFrei server
172
+ is serving, so that `npx viafrei@X.Y.Z` and the endpoint it relays to are named by one
173
+ number. `mcp.viafrei.de` moved to `1.4.8`, so the bridge follows. 1.4.7 is absent from
174
+ the registry for the same reason 1.4.0–1.4.5 were: that platform version carried no
175
+ bridge change.
176
+
177
+ **Nothing in the bridge changed at all** — not the runtime, not the tooling, not a
178
+ gate. The diff against 1.4.6 is the three version fields plus the re-captured API
179
+ reference. If 1.4.6 works for you, this is the same code under a number that matches
180
+ the server.
181
+
182
+ ### Changed
183
+
184
+ - **The API reference is re-captured at 1.4.8** (`API.md`, `catalogue.json`). Unlike
185
+ 1.4.6's re-capture, this one is only a date and a version string: the server's
186
+ surface did **not** change between 1.4.6 and 1.4.8. Verified rather than assumed —
187
+ the same 19 tools, 10 resources, 2 resource templates and 9 prompts, with no tool
188
+ added or removed, no description altered and no `required` list moved, compared
189
+ field-by-field against the stored snapshot before the new one was written.
190
+
191
+ That distinction is the whole reason this entry says so out loud. At 1.4.6 the
192
+ shipped reference was *wrong* — it omitted a tool the server exposed. Here it was
193
+ merely *old*. The two need different remedies and only one of them is honest in each
194
+ case, so which one applied is recorded rather than left for a reader to guess.
195
+
196
+ Captured read-only: `initialize`, `tools/list`, `resources/list`,
197
+ `resources/templates/list`, `prompts/list`. No tool was invoked, so no data provider
198
+ was contacted, and the session was deleted afterwards. The two substitutions the
199
+ snapshot documents are unchanged and asserted on the way in and out: 19 of 19
200
+ `$schema` URIs dropped, exactly 2 long patterns stored as `patternLength`.
9
201
 
10
202
  ## [1.4.6] - 2026-09-29
11
203
 
@@ -1259,6 +1451,7 @@ for it, so the number is free; the bridge will use it when the platform does.
1259
1451
  commits, and a squash makes them unreachable from `main` - which would turn
1260
1452
  the check red on `main` for everybody, for something no contributor did.
1261
1453
 
1454
+ [1.4.9]: https://github.com/mavrovde/viafrei-bridge/releases/tag/v1.4.9
1262
1455
  [1.3.22]: https://github.com/mavrovde/viafrei-bridge/releases/tag/v1.3.22
1263
1456
  [1.3.16]: https://github.com/mavrovde/viafrei-bridge/releases/tag/v1.3.16
1264
1457
  [1.3.15]: https://github.com/mavrovde/viafrei-bridge/releases/tag/v1.3.15
package/SOURCES.md CHANGED
@@ -134,13 +134,32 @@ one labelled `not re-measured`** was checked by calling the public endpoint on
134
134
  **2026-09-27** and reading which source the answer named. A source can be licensed, cleared and loaded and still not answer
135
135
  a question today; where that is so, this page says it.
136
136
 
137
- The measurement was taken by calling **fifteen of the server's sixteen read-only
138
- tools — every one except `find_cheapest_fuel`** — once each, and reading
139
- `_meta.sources` out of the result: not by reading the code, and not by asking
140
- whether a feed was running. Thirteen sources were named by at least one answer.
141
- The tool not called is the one whose row is deliberately not re-measured, and
142
- the count above says so rather than absorbing it: a status this page cannot stand behind is
143
- worse than an honest gap.
137
+ The measurement was taken **on 2026-09-27**, when the server exposed sixteen
138
+ read-only tools, by calling **fifteen of them — every one except
139
+ `find_cheapest_fuel`** — once each, and reading `_meta.sources` out of the result:
140
+ not by reading the code, and not by asking whether a feed was running. Thirteen
141
+ sources were named by at least one answer. The tool not called is the one whose row
142
+ is deliberately not re-measured, and the count says so rather than absorbing it: a
143
+ status this page cannot stand behind is worse than an honest gap.
144
+
145
+ **The server has grown since that measurement, and this page has not re-run it.**
146
+ As of the 2026-09-29 capture shipped alongside this page it exposes nineteen tools,
147
+ seventeen of them read-only, including a SECOND fuel tool, `find_fuel_station`.
148
+ That one is excluded from any spot check for exactly the same reason
149
+ `find_cheapest_fuel` is, and the reason is a licence condition rather
150
+ than a convenience: MTS-K sets a minimum interval per station and its terms make
151
+ needless querying a real risk to the access itself. **Both fuel tools are excluded,
152
+ not one.**
153
+
154
+ The sentence above therefore describes what was measured on 2026-09-27 and not what
155
+ the server offers today. Re-running it would still mean **fifteen** live calls
156
+ against real providers — the same fifteen, because the one read-only tool the server
157
+ gained is the second fuel tool, and that one is excluded. Sixteen read-only minus one
158
+ fuel tool was fifteen; seventeen minus two is fifteen again. Those calls would
159
+ re-confirm statuses this page already knows, so it is dated on purpose rather than
160
+ refreshed on a schedule — and dated is said out loud, because a measurement silently
161
+ carried forward under a present-tense sentence is the failure this section exists to
162
+ avoid.
144
163
 
145
164
  - **live** — an answer came back naming it when this page was checked;
146
165
  - **in the service** — licensed and loaded, and the spot check produced no
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "viafrei",
3
- "version": "1.4.6",
3
+ "version": "1.4.9",
4
4
  "description": "German traffic, rail, parking, charging, fuel, address and weather data in your AI assistant - MCP, no API key. stdio bridge to the hosted ViaFrei MCP server.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -75,6 +75,10 @@
75
75
  "check:versions": "node scripts/check-versions.mjs",
76
76
  "docs:api": "node scripts/gen-api-doc.mjs",
77
77
  "check:docs": "node scripts/gen-api-doc.mjs --check",
78
+ "check:sources": "node scripts/check-sources.mjs",
79
+ "test:sources": "node scripts/check-sources.test.mjs",
80
+ "probe:catalogue": "node scripts/probe-catalogue.mjs",
81
+ "test:probe": "node scripts/probe-catalogue.test.mjs",
78
82
  "rules:show": "node scripts/show-rules.mjs"
79
83
  },
80
84
  "dependencies": {