@cyanheads/ris-austria-mcp-server 0.4.2 → 0.4.3
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/AGENTS.md +22 -19
- package/CLAUDE.md +22 -19
- package/README.md +2 -2
- package/changelog/0.4.x/0.4.3.md +33 -0
- package/changelog/template.md +7 -24
- package/dist/mcp-server/resources/definitions/ris-document.resource.js +1 -1
- package/dist/services/ris/ris-service.d.ts +2 -3
- package/dist/services/ris/ris-service.d.ts.map +1 -1
- package/dist/services/ris/ris-service.js +6 -29
- package/dist/services/ris/ris-service.js.map +1 -1
- package/package.json +10 -9
- package/server.json +31 -3
package/AGENTS.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Developer Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** ris-austria-mcp-server
|
|
4
|
-
**Version:** 0.4.
|
|
5
|
-
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.
|
|
6
|
-
**Engines:** Bun ≥1.
|
|
4
|
+
**Version:** 0.4.3
|
|
5
|
+
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.0`
|
|
6
|
+
**Engines:** Bun ≥1.4.0, Node ≥24.0.0
|
|
7
7
|
**MCP SDK:** `@modelcontextprotocol/server` ^2.0.0
|
|
8
|
-
**Zod:** ^4.
|
|
8
|
+
**Zod:** ^4.6.1
|
|
9
9
|
|
|
10
10
|
> **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
|
|
11
11
|
|
|
@@ -37,6 +37,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
|
|
|
37
37
|
- **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.
|
|
38
38
|
- **Need input the caller didn't supply?** `return ctx.requestInput(...)` and read `ctx.inputs` when the handler is re-entered. Never `await` for user input mid-handler.
|
|
39
39
|
- **Secrets in env vars only** — never hardcoded.
|
|
40
|
+
- **Cut noise.** Add only what earns its place: no speculative generality, no guards for states the framework already prevents (Zod-validated params, classified errors), no abstraction until a third caller proves it, no option nothing sets.
|
|
40
41
|
- **Close the loop on issues.** When implementing work tracked by a GitHub issue, comment on the issue with what landed and close it. Do both — a comment without a close leaves stale issues open; a close without a comment leaves no record of what shipped. The comment is for future readers — state the concrete changes, not the conversation that produced them.
|
|
41
42
|
|
|
42
43
|
---
|
|
@@ -180,7 +181,7 @@ Handlers receive a unified `ctx` object. Key properties:
|
|
|
180
181
|
|
|
181
182
|
Handlers throw — the framework catches, classifies, and formats.
|
|
182
183
|
|
|
183
|
-
**Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reason')` as the throw's data to put it on the wire (`data.recovery.hint`, mirrored into `content[]` text); override with an explicit `{ recovery: { hint: '...' } }` when dynamic runtime context matters. Baseline codes (`InternalError`, `ServiceUnavailable`, `Timeout`, `ValidationError`, `SerializationError`) bubble freely and don't need declaring.
|
|
184
|
+
**Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reason')` as the throw's data to put it on the wire (`data.recovery.hint`, mirrored into `content[]` text); override with an explicit `{ recovery: { hint: '...' } }` when dynamic runtime context matters. Baseline codes (`InternalError`, `ServiceUnavailable`, `Timeout`, `ValidationError`, `SerializationError`, `RequestCancelled`) bubble freely and don't need declaring.
|
|
184
185
|
|
|
185
186
|
```ts
|
|
186
187
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
@@ -213,7 +214,7 @@ throw new Error('Invalid query format'); // → ValidationError
|
|
|
213
214
|
|
|
214
215
|
// McpError — when no factory exists for the code
|
|
215
216
|
import { McpError, JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
216
|
-
throw new McpError(JsonRpcErrorCode.
|
|
217
|
+
throw new McpError(JsonRpcErrorCode.InitializationFailed, 'Connection failed', { pool: 'primary' });
|
|
217
218
|
```
|
|
218
219
|
|
|
219
220
|
See framework CLAUDE.md and the `api-errors` skill for the full auto-classification table, all available factories, and the contract reference.
|
|
@@ -257,9 +258,9 @@ src/
|
|
|
257
258
|
|
|
258
259
|
## Skills
|
|
259
260
|
|
|
260
|
-
Skills are modular instructions in `skills/` at the project root. Read them directly when a task matches — e.g., `skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry.
|
|
261
|
+
Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry.
|
|
261
262
|
|
|
262
|
-
**Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
|
|
263
|
+
**Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `framework-skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
|
|
263
264
|
|
|
264
265
|
Available skills:
|
|
265
266
|
|
|
@@ -278,8 +279,9 @@ Available skills:
|
|
|
278
279
|
| `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
|
|
279
280
|
| `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
|
|
280
281
|
| `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
|
|
281
|
-
| `git-wrapup` |
|
|
282
|
-
| `release-and-publish` |
|
|
282
|
+
| `git-wrapup` | Version bump, changelog, verification, and commit stack; leaves tagging to release-and-publish |
|
|
283
|
+
| `release-and-publish` | Tag, push, npm, MCP Registry, GitHub Release, and Docker publication after git-wrapup |
|
|
284
|
+
| `release-pr-review` | Review an opt-in gated release PR before publishing |
|
|
283
285
|
| `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
|
|
284
286
|
| `orchestrations` | Chain task skills into a gated multi-phase pipeline — build-out, QA-fix, update-ship — when you can spawn sub-agents |
|
|
285
287
|
| `report-issue-framework` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
|
|
@@ -298,7 +300,7 @@ Available skills:
|
|
|
298
300
|
| `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
|
|
299
301
|
| `api-workers` | Cloudflare Workers runtime |
|
|
300
302
|
|
|
301
|
-
**Chaining skills into pipelines.** When the user wants a multi-phase effort — build this server out, QA-and-fix the surface, update-and-ship — *and you can spawn sub-agents*, `skills/orchestrations/SKILL.md` sequences the task skills above into a gated pipeline with verification at each step. Read it to drive the run. Optional: skip it if you can't orchestrate sub-agents, and ignore it entirely if you were *spawned* as one — you've already been scoped to a single phase.
|
|
303
|
+
**Chaining skills into pipelines.** When the user wants a multi-phase effort — build this server out, QA-and-fix the surface, update-and-ship — *and you can spawn sub-agents*, `framework-skills/orchestrations/SKILL.md` sequences the task skills above into a gated pipeline with verification at each step. Read it to drive the run. Optional: skip it if you can't orchestrate sub-agents, and ignore it entirely if you were *spawned* as one — you've already been scoped to a single phase.
|
|
302
304
|
|
|
303
305
|
When you complete a skill's checklist, check the boxes and add a completion timestamp at the end (e.g., `Completed: 2026-03-11`).
|
|
304
306
|
|
|
@@ -314,7 +316,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
314
316
|
| `bun run rebuild` | Clean + build |
|
|
315
317
|
| `bun run clean` | Remove build artifacts |
|
|
316
318
|
| `bun run devcheck` | Lint + format + typecheck + security + changelog sync |
|
|
317
|
-
| `bun run audit:
|
|
319
|
+
| `bun run audit:fix` | Run `bun audit fix` to upgrade vulnerable packages within existing ranges. First response to a transitive advisory; then `bun update <name>`, then `bun dedupe`. |
|
|
320
|
+
| `bun run audit:refresh` | Delete `bun.lock` and reinstall. Last resort after targeted fixes; every ranged dependency re-resolves. |
|
|
318
321
|
| `bun run lint:mcp` | Run the MCP definition linter standalone (rule catalog: `api-linter` skill) |
|
|
319
322
|
| `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |
|
|
320
323
|
| `bun run list-skills` | Print the skill registry |
|
|
@@ -332,11 +335,11 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
332
335
|
|
|
333
336
|
## Bundling
|
|
334
337
|
|
|
335
|
-
`npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. A server using DataCanvas therefore ships a portable bundle without the DuckDB native — `@duckdb/node-api` is an optional peer loaded lazily, so canvas tools report an actionable install hint and every other tool works normally. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
|
|
338
|
+
`npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`framework-skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. A server using DataCanvas therefore ships a portable bundle without the DuckDB native — `@duckdb/node-api` is an optional peer loaded lazily, so canvas tools report an actionable install hint and every other tool works normally. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
|
|
336
339
|
|
|
337
340
|
**Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
|
|
338
341
|
|
|
339
|
-
**README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `skills/polish-docs-meta/references/readme.md`.
|
|
342
|
+
**README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `framework-skills/polish-docs-meta/references/readme.md`.
|
|
340
343
|
|
|
341
344
|
---
|
|
342
345
|
|
|
@@ -361,9 +364,9 @@ security: false # optional — true ONLY for a source
|
|
|
361
364
|
|
|
362
365
|
`agent-notes` is an optional free-form field for maintenance agents processing the release downstream. Content here won't appear in the rendered CHANGELOG — it's consumed by agents running the `maintenance` skill. Use it for adoption instructions that don't fit the human-facing sections: new files to create, fields to populate, one-time migration steps. Omit entirely when there's nothing to say.
|
|
363
366
|
|
|
364
|
-
**Section order
|
|
367
|
+
**Section order:** Added, Changed, Deprecated, Removed, Fixed, Security, then Dependencies. Include only sections with entries — don't ship empty headers.
|
|
365
368
|
|
|
366
|
-
**Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `
|
|
369
|
+
**Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `framework-skills/release-and-publish/SKILL.md` for the tag format.
|
|
367
370
|
|
|
368
371
|
---
|
|
369
372
|
|
|
@@ -393,7 +396,7 @@ import { getMyService } from '@/services/my-domain/my-service.js';
|
|
|
393
396
|
- [ ] If wrapping external API: tests include at least one sparse payload case with omitted upstream fields
|
|
394
397
|
- [ ] Registered in `createApp()` arrays (directly or via barrel exports)
|
|
395
398
|
- [ ] Tests use `createMockContext()` from `@cyanheads/mcp-ts-core/testing`
|
|
396
|
-
- [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` =
|
|
397
|
-
- [ ] `.codex-plugin/mcp.json` updated — server name key
|
|
398
|
-
- [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry
|
|
399
|
+
- [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = the unscoped repo name; `interface.shortDescription` from `package.json` description
|
|
400
|
+
- [ ] `.codex-plugin/mcp.json` updated — server name key is the unscoped repo name; user-supplied variables are listed in `env_vars`, never empty `env` values
|
|
401
|
+
- [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry keyed by the unscoped repo name; user-supplied variables declared in `userConfig` and referenced as `${user_config.<option>}`
|
|
399
402
|
- [ ] `npm run devcheck` passes
|
package/CLAUDE.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Developer Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** ris-austria-mcp-server
|
|
4
|
-
**Version:** 0.4.
|
|
5
|
-
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.
|
|
6
|
-
**Engines:** Bun ≥1.
|
|
4
|
+
**Version:** 0.4.3
|
|
5
|
+
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.0`
|
|
6
|
+
**Engines:** Bun ≥1.4.0, Node ≥24.0.0
|
|
7
7
|
**MCP SDK:** `@modelcontextprotocol/server` ^2.0.0
|
|
8
|
-
**Zod:** ^4.
|
|
8
|
+
**Zod:** ^4.6.1
|
|
9
9
|
|
|
10
10
|
> **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
|
|
11
11
|
|
|
@@ -37,6 +37,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
|
|
|
37
37
|
- **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.
|
|
38
38
|
- **Need input the caller didn't supply?** `return ctx.requestInput(...)` and read `ctx.inputs` when the handler is re-entered. Never `await` for user input mid-handler.
|
|
39
39
|
- **Secrets in env vars only** — never hardcoded.
|
|
40
|
+
- **Cut noise.** Add only what earns its place: no speculative generality, no guards for states the framework already prevents (Zod-validated params, classified errors), no abstraction until a third caller proves it, no option nothing sets.
|
|
40
41
|
- **Close the loop on issues.** When implementing work tracked by a GitHub issue, comment on the issue with what landed and close it. Do both — a comment without a close leaves stale issues open; a close without a comment leaves no record of what shipped. The comment is for future readers — state the concrete changes, not the conversation that produced them.
|
|
41
42
|
|
|
42
43
|
---
|
|
@@ -180,7 +181,7 @@ Handlers receive a unified `ctx` object. Key properties:
|
|
|
180
181
|
|
|
181
182
|
Handlers throw — the framework catches, classifies, and formats.
|
|
182
183
|
|
|
183
|
-
**Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reason')` as the throw's data to put it on the wire (`data.recovery.hint`, mirrored into `content[]` text); override with an explicit `{ recovery: { hint: '...' } }` when dynamic runtime context matters. Baseline codes (`InternalError`, `ServiceUnavailable`, `Timeout`, `ValidationError`, `SerializationError`) bubble freely and don't need declaring.
|
|
184
|
+
**Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reason')` as the throw's data to put it on the wire (`data.recovery.hint`, mirrored into `content[]` text); override with an explicit `{ recovery: { hint: '...' } }` when dynamic runtime context matters. Baseline codes (`InternalError`, `ServiceUnavailable`, `Timeout`, `ValidationError`, `SerializationError`, `RequestCancelled`) bubble freely and don't need declaring.
|
|
184
185
|
|
|
185
186
|
```ts
|
|
186
187
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
@@ -213,7 +214,7 @@ throw new Error('Invalid query format'); // → ValidationError
|
|
|
213
214
|
|
|
214
215
|
// McpError — when no factory exists for the code
|
|
215
216
|
import { McpError, JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
216
|
-
throw new McpError(JsonRpcErrorCode.
|
|
217
|
+
throw new McpError(JsonRpcErrorCode.InitializationFailed, 'Connection failed', { pool: 'primary' });
|
|
217
218
|
```
|
|
218
219
|
|
|
219
220
|
See framework CLAUDE.md and the `api-errors` skill for the full auto-classification table, all available factories, and the contract reference.
|
|
@@ -257,9 +258,9 @@ src/
|
|
|
257
258
|
|
|
258
259
|
## Skills
|
|
259
260
|
|
|
260
|
-
Skills are modular instructions in `skills/` at the project root. Read them directly when a task matches — e.g., `skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry.
|
|
261
|
+
Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry.
|
|
261
262
|
|
|
262
|
-
**Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
|
|
263
|
+
**Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `framework-skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
|
|
263
264
|
|
|
264
265
|
Available skills:
|
|
265
266
|
|
|
@@ -278,8 +279,9 @@ Available skills:
|
|
|
278
279
|
| `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
|
|
279
280
|
| `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
|
|
280
281
|
| `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
|
|
281
|
-
| `git-wrapup` |
|
|
282
|
-
| `release-and-publish` |
|
|
282
|
+
| `git-wrapup` | Version bump, changelog, verification, and commit stack; leaves tagging to release-and-publish |
|
|
283
|
+
| `release-and-publish` | Tag, push, npm, MCP Registry, GitHub Release, and Docker publication after git-wrapup |
|
|
284
|
+
| `release-pr-review` | Review an opt-in gated release PR before publishing |
|
|
283
285
|
| `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
|
|
284
286
|
| `orchestrations` | Chain task skills into a gated multi-phase pipeline — build-out, QA-fix, update-ship — when you can spawn sub-agents |
|
|
285
287
|
| `report-issue-framework` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
|
|
@@ -298,7 +300,7 @@ Available skills:
|
|
|
298
300
|
| `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
|
|
299
301
|
| `api-workers` | Cloudflare Workers runtime |
|
|
300
302
|
|
|
301
|
-
**Chaining skills into pipelines.** When the user wants a multi-phase effort — build this server out, QA-and-fix the surface, update-and-ship — *and you can spawn sub-agents*, `skills/orchestrations/SKILL.md` sequences the task skills above into a gated pipeline with verification at each step. Read it to drive the run. Optional: skip it if you can't orchestrate sub-agents, and ignore it entirely if you were *spawned* as one — you've already been scoped to a single phase.
|
|
303
|
+
**Chaining skills into pipelines.** When the user wants a multi-phase effort — build this server out, QA-and-fix the surface, update-and-ship — *and you can spawn sub-agents*, `framework-skills/orchestrations/SKILL.md` sequences the task skills above into a gated pipeline with verification at each step. Read it to drive the run. Optional: skip it if you can't orchestrate sub-agents, and ignore it entirely if you were *spawned* as one — you've already been scoped to a single phase.
|
|
302
304
|
|
|
303
305
|
When you complete a skill's checklist, check the boxes and add a completion timestamp at the end (e.g., `Completed: 2026-03-11`).
|
|
304
306
|
|
|
@@ -314,7 +316,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
314
316
|
| `bun run rebuild` | Clean + build |
|
|
315
317
|
| `bun run clean` | Remove build artifacts |
|
|
316
318
|
| `bun run devcheck` | Lint + format + typecheck + security + changelog sync |
|
|
317
|
-
| `bun run audit:
|
|
319
|
+
| `bun run audit:fix` | Run `bun audit fix` to upgrade vulnerable packages within existing ranges. First response to a transitive advisory; then `bun update <name>`, then `bun dedupe`. |
|
|
320
|
+
| `bun run audit:refresh` | Delete `bun.lock` and reinstall. Last resort after targeted fixes; every ranged dependency re-resolves. |
|
|
318
321
|
| `bun run lint:mcp` | Run the MCP definition linter standalone (rule catalog: `api-linter` skill) |
|
|
319
322
|
| `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |
|
|
320
323
|
| `bun run list-skills` | Print the skill registry |
|
|
@@ -332,11 +335,11 @@ When you complete a skill's checklist, check the boxes and add a completion time
|
|
|
332
335
|
|
|
333
336
|
## Bundling
|
|
334
337
|
|
|
335
|
-
`npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. A server using DataCanvas therefore ships a portable bundle without the DuckDB native — `@duckdb/node-api` is an optional peer loaded lazily, so canvas tools report an actionable install hint and every other tool works normally. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
|
|
338
|
+
`npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`framework-skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. A server using DataCanvas therefore ships a portable bundle without the DuckDB native — `@duckdb/node-api` is an optional peer loaded lazily, so canvas tools report an actionable install hint and every other tool works normally. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
|
|
336
339
|
|
|
337
340
|
**Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
|
|
338
341
|
|
|
339
|
-
**README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `skills/polish-docs-meta/references/readme.md`.
|
|
342
|
+
**README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `framework-skills/polish-docs-meta/references/readme.md`.
|
|
340
343
|
|
|
341
344
|
---
|
|
342
345
|
|
|
@@ -361,9 +364,9 @@ security: false # optional — true ONLY for a source
|
|
|
361
364
|
|
|
362
365
|
`agent-notes` is an optional free-form field for maintenance agents processing the release downstream. Content here won't appear in the rendered CHANGELOG — it's consumed by agents running the `maintenance` skill. Use it for adoption instructions that don't fit the human-facing sections: new files to create, fields to populate, one-time migration steps. Omit entirely when there's nothing to say.
|
|
363
366
|
|
|
364
|
-
**Section order
|
|
367
|
+
**Section order:** Added, Changed, Deprecated, Removed, Fixed, Security, then Dependencies. Include only sections with entries — don't ship empty headers.
|
|
365
368
|
|
|
366
|
-
**Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `
|
|
369
|
+
**Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `framework-skills/release-and-publish/SKILL.md` for the tag format.
|
|
367
370
|
|
|
368
371
|
---
|
|
369
372
|
|
|
@@ -393,7 +396,7 @@ import { getMyService } from '@/services/my-domain/my-service.js';
|
|
|
393
396
|
- [ ] If wrapping external API: tests include at least one sparse payload case with omitted upstream fields
|
|
394
397
|
- [ ] Registered in `createApp()` arrays (directly or via barrel exports)
|
|
395
398
|
- [ ] Tests use `createMockContext()` from `@cyanheads/mcp-ts-core/testing`
|
|
396
|
-
- [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` =
|
|
397
|
-
- [ ] `.codex-plugin/mcp.json` updated — server name key
|
|
398
|
-
- [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry
|
|
399
|
+
- [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = the unscoped repo name; `interface.shortDescription` from `package.json` description
|
|
400
|
+
- [ ] `.codex-plugin/mcp.json` updated — server name key is the unscoped repo name; user-supplied variables are listed in `env_vars`, never empty `env` values
|
|
401
|
+
- [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry keyed by the unscoped repo name; user-supplied variables declared in `userConfig` and referenced as `${user_config.<option>}`
|
|
399
402
|
- [ ] `npm run devcheck` passes
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/ris-austria-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/ris-austria-mcp-server) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
11
11
|
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -369,7 +369,7 @@ build with `--build-arg OTEL_ENABLED=false` to omit them.
|
|
|
369
369
|
| `src/services/ris` | RIS request building, HTTP access, normalization, and static reference data. |
|
|
370
370
|
| `docs/design.md` | Settled v1 design — tool surface, service spec, live-confirmed RIS API reference. |
|
|
371
371
|
| `tests/` | Unit and integration tests mirroring `src/`. |
|
|
372
|
-
| `skills/` |
|
|
372
|
+
| `framework-skills/` | Development skills synced from `@cyanheads/mcp-ts-core`. |
|
|
373
373
|
|
|
374
374
|
## Development guide
|
|
375
375
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Upstream 5xx classification moves to the framework, a 501 no longer retries, a caller disconnect reports RequestCancelled, and the RIS endpoint overrides are declared in the registry and install metadata."
|
|
3
|
+
breaking: false
|
|
4
|
+
security: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 0.4.3 — 2026-09-13
|
|
8
|
+
|
|
9
|
+
## Added
|
|
10
|
+
|
|
11
|
+
- **`RIS_API_BASE_URL` and `RIS_CONTENT_BASE_URL` are declared** in `server.json`, `manifest.json`, and both plugin manifests. Both were already read by `getServerConfig()`; a registry entry or one-click install now surfaces them, each falling back to the official RIS endpoint when left blank.
|
|
12
|
+
- **`bun run audit:fix`** runs `bun audit fix` — the first response to a transitive advisory, ahead of `bun update <name>` and `audit:refresh` (mcp-ts-core 0.13.0).
|
|
13
|
+
|
|
14
|
+
## Changed
|
|
15
|
+
|
|
16
|
+
- **Upstream error classification comes from the framework** — the local `reclassifyUpstreamServerError` shim is gone. An envelope-less 5xx on the search and content paths still reports `ServiceUnavailable`, since mcp-ts-core 0.12.4 stopped mapping any HTTP status to `InternalError`. The RIS in-band error envelope is still translated first, so a rejected parameter stays a `ValidationError`.
|
|
17
|
+
- **An HTTP 501 is not retried** — it carries `data.retryable: false` alongside the transient `ServiceUnavailable` code (mcp-ts-core 0.12.4), so a method RIS does not implement fails on the first attempt instead of spending the retry budget.
|
|
18
|
+
- **A caller disconnect reports `RequestCancelled` (-32011)** rather than `InternalError` (mcp-ts-core 0.12.4); `data.errorSource` stays `FetchAborted`.
|
|
19
|
+
- **A rejected tool argument returns the structured error envelope** — an unknown root key or failed constraint answers `isError: true` with `error.code` `-32602` (`InvalidParams`) in `structuredContent` and the same readable text in `content[]` (mcp-ts-core 0.12.7).
|
|
20
|
+
- **A blank or unsubstituted `${…}` value for a RIS variable reads as unset** (mcp-ts-core 0.13.0) — a one-click install that leaves an optional field empty now falls back to the documented default instead of failing URL validation.
|
|
21
|
+
- **Development skills moved from `skills/` to `framework-skills/`** (mcp-ts-core 0.13.0) — plugin hosts auto-load a root `skills/`, so installing this server no longer hands its development skills to the agent.
|
|
22
|
+
- **Bun engines floor raised to `>=1.4.0`** (mcp-ts-core 0.12.9). Node stays `>=24.0.0`, and the published container already runs Bun 1.4.
|
|
23
|
+
- **Inherited HTTP-transport fixes** — a trailing slash on `MCP_PUBLIC_URL` no longer doubles in advertised links and `MCP_RESPONSE_VERBOSITY` and `OAUTH_PROXY_*` are no longer recognized (mcp-ts-core 0.12.8, neither configured here); the landing page's curl snippet sends a handshake `initialize` accepts and a cancelled request's SSE stream closes immediately (0.12.9); records logged during `setup()` are replayed rather than dropped (0.12.5).
|
|
24
|
+
|
|
25
|
+
## Dependencies
|
|
26
|
+
|
|
27
|
+
- `@cyanheads/mcp-ts-core` ^0.12.3 → ^0.13.0
|
|
28
|
+
- `zod` ^4.4.3 → ^4.6.1
|
|
29
|
+
- `@biomejs/biome` 2.5.10 → 2.5.13
|
|
30
|
+
- `@types/node` 26.2.0 → 26.5.1
|
|
31
|
+
- `ignore` ^7.0.6 → ^7.0.9
|
|
32
|
+
- `tsc-alias` ^1.9.2 → ^1.9.4
|
|
33
|
+
- `vitest` ^4.1.11 → ^5.0.0
|
package/changelog/template.md
CHANGED
|
@@ -117,30 +117,13 @@ security: false
|
|
|
117
117
|
in that unrelated item's metadata.
|
|
118
118
|
|
|
119
119
|
TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
|
|
120
|
-
via `gh release create --notes-from-tag`.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
Dependency bumps: ← section header
|
|
128
|
-
← blank line
|
|
129
|
-
- `@cyanheads/mcp-ts-core` ^0.9.1 → ^0.9.6 ← bullet
|
|
130
|
-
← blank line
|
|
131
|
-
Changed: ← only sections with entries
|
|
132
|
-
← blank line
|
|
133
|
-
- `format()` output includes `query` in text mode
|
|
134
|
-
← blank line
|
|
135
|
-
Added:
|
|
136
|
-
← blank line
|
|
137
|
-
- `manifest.json` scaffolded for MCPB bundle support
|
|
138
|
-
- Install badges (Claude Desktop, Cursor, VS Code)
|
|
139
|
-
← blank line
|
|
140
|
-
<N> tests pass; `bun run devcheck` clean. ← footer
|
|
141
|
-
|
|
142
|
-
Never a flat comma-separated string. Always structured markdown with
|
|
143
|
-
sections. The tag must scan well as a rendered GitHub Release page.
|
|
120
|
+
via `gh release create --notes-from-tag`. It is a condensed digest of this
|
|
121
|
+
entry, never a copy, and its format is owned by the `release-and-publish`
|
|
122
|
+
skill (step 4, "Create the annotated tag"): the entry's `summary:` as the
|
|
123
|
+
theme line without the version, flat headline bullets — no Keep-a-Changelog
|
|
124
|
+
section headers, no gates line — at most one deps line, issue backlinks,
|
|
125
|
+
and the changelog link last. In release-PR mode the `git-wrapup` skill
|
|
126
|
+
authors that digest as the PR body's `## Changes` and the tag copies it.
|
|
144
127
|
-->
|
|
145
128
|
|
|
146
129
|
## Added
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { resource, z } from '@cyanheads/mcp-ts-core';
|
|
13
13
|
import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
|
|
14
|
-
import { addressableSections, exampleSectionNames, outlineDocument, renderDocument, renderOutlineSections, } from '
|
|
14
|
+
import { addressableSections, exampleSectionNames, outlineDocument, renderDocument, renderOutlineSections, } from '../../tools/definitions/ris-get-document.tool.js';
|
|
15
15
|
import { RIS_APPLICATIONS } from '../../../services/ris/reference/index.js';
|
|
16
16
|
const APPLICATION_CODES = RIS_APPLICATIONS.map((app) => app.code);
|
|
17
17
|
export const risDocumentResource = resource('ris://document/{application}/{documentNumber}', {
|
|
@@ -11,9 +11,8 @@
|
|
|
11
11
|
* RIS Client errors surface as `ValidationError` (non-transient — not retried) whether they
|
|
12
12
|
* arrive in-band on a 200 or as the same envelope on a 500 error response, which
|
|
13
13
|
* `fetchJson` translates rather than letting the status decide. An upstream 5xx carrying no
|
|
14
|
-
* such envelope
|
|
15
|
-
*
|
|
16
|
-
* retries.
|
|
14
|
+
* such envelope uses the framework's `ServiceUnavailable` classification; HTTP 501 opts
|
|
15
|
+
* out of retry, and caller cancellation remains `RequestCancelled`.
|
|
17
16
|
* Content fetches are allowlisted to the content host's `/Dokumente/` tree (SSRF guard).
|
|
18
17
|
* @module services/ris/ris-service
|
|
19
18
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ris-service.d.ts","sourceRoot":"","sources":["../../../src/services/ris/ris-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ris-service.d.ts","sourceRoot":"","sources":["../../../src/services/ris/ris-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAuB/D,OAAO,EACL,KAAK,yBAAyB,EAO9B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAE5B,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+DpF,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,YAAI,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAC1E,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AASpE;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,GAAG,CAenF;AAED;;;GAGG;AACH,qBAAa,UAAU;IAET,OAAO,CAAC,QAAQ,CAAC,QAAQ;IADrC,wEAAwE;IACxE,YAA6B,QAAQ,EAAE,MAAM,EAAI;IAEjD,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,SAAS;IAKjB,2FAA2F;IAC3F,OAAO,CAAC,cAAc;IAOtB,gFAAgF;IAC1E,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/F;IAED,mFAAmF;IAC7E,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAEvF;IAED,6FAA6F;IACvF,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAEvF;IAED,+EAA+E;IACzE,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAErF;IAED,qEAAqE;IAC/D,mBAAmB,CACvB,MAAM,EAAE,yBAAyB,EACjC,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,eAAe,CAAC,CAE1B;IAED,8EAA8E;IACxE,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAOlF;IAED;;;;;;;;;;OAUG;IACH,uBAAuB,CACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,gBAAgB,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CA8BR;IAED,8EAA8E;IACxE,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+BjF;IAED,kFAAkF;YACpE,MAAM;IASpB;;;;OAIG;YACW,OAAO;IAsBrB,oFAAoF;YACtE,SAAS;CAwCxB;AAMD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEtD;AAED,uFAAuF;AACvF,wBAAgB,aAAa,IAAI,UAAU,CAK1C"}
|
|
@@ -11,13 +11,12 @@
|
|
|
11
11
|
* RIS Client errors surface as `ValidationError` (non-transient — not retried) whether they
|
|
12
12
|
* arrive in-band on a 200 or as the same envelope on a 500 error response, which
|
|
13
13
|
* `fetchJson` translates rather than letting the status decide. An upstream 5xx carrying no
|
|
14
|
-
* such envelope
|
|
15
|
-
*
|
|
16
|
-
* retries.
|
|
14
|
+
* such envelope uses the framework's `ServiceUnavailable` classification; HTTP 501 opts
|
|
15
|
+
* out of retry, and caller cancellation remains `RequestCancelled`.
|
|
17
16
|
* Content fetches are allowlisted to the content host's `/Dokumente/` tree (SSRF guard).
|
|
18
17
|
* @module services/ris/ris-service
|
|
19
18
|
*/
|
|
20
|
-
import {
|
|
19
|
+
import { McpError, serviceUnavailable, timeout, validationError, } from '@cyanheads/mcp-ts-core/errors';
|
|
21
20
|
import { fetchWithTimeout, requestContextService, withRetry, } from '@cyanheads/mcp-ts-core/utils';
|
|
22
21
|
import { getServerConfig } from '../../config/server-config.js';
|
|
23
22
|
import { errorFromResponseBody, isHtmlErrorPage, parseHistoryResponse, parseSearchResponse, } from './normalizer.js';
|
|
@@ -65,24 +64,6 @@ const RETRY_BASE_DELAY_MS = 1_500;
|
|
|
65
64
|
*/
|
|
66
65
|
const CONTENT_TIMEOUT_MS = 25_000;
|
|
67
66
|
const CONTENT_MAX_RETRIES = 1;
|
|
68
|
-
/**
|
|
69
|
-
* Reclassify an unclassified upstream 5xx as transient. `fetchWithTimeout` maps 500/501 to
|
|
70
|
-
* `InternalError` — a code no tool or resource contract declares and `withRetry` does not
|
|
71
|
-
* treat as transient — so a degraded RIS reached the wire as a bare -32603 with no reason,
|
|
72
|
-
* no retryable flag, and no recovery. Reads the canonical `status` field (0.10.15+), which
|
|
73
|
-
* also keeps an abort-sourced `InternalError` (no status) out of the reclassification.
|
|
74
|
-
*
|
|
75
|
-
* Runs only after the RIS error-envelope translation has had its chance: a 500 carrying an
|
|
76
|
-
* `OgdSearchResult.Error` is a rejected parameter, not a server fault.
|
|
77
|
-
*/
|
|
78
|
-
function reclassifyUpstreamServerError(error) {
|
|
79
|
-
if (!(error instanceof McpError) || error.code !== JsonRpcErrorCode.InternalError)
|
|
80
|
-
return error;
|
|
81
|
-
const status = error.data?.status;
|
|
82
|
-
if (typeof status !== 'number' || status < 500)
|
|
83
|
-
return error;
|
|
84
|
-
return serviceUnavailable(`RIS returned HTTP ${status} with no error envelope — the upstream is degraded.`, { status }, { cause: error });
|
|
85
|
-
}
|
|
86
67
|
/**
|
|
87
68
|
* Opt a search deadline out of retry. RIS answers a search by scanning as much of the corpus
|
|
88
69
|
* as the filters leave — a request it could not finish inside the deadline is expensive, not
|
|
@@ -219,8 +200,6 @@ export class RisService {
|
|
|
219
200
|
expectedStatuses: [404],
|
|
220
201
|
headers: { 'User-Agent': this.userAgent() },
|
|
221
202
|
signal: ctx.signal,
|
|
222
|
-
}).catch((error) => {
|
|
223
|
-
throw reclassifyUpstreamServerError(error);
|
|
224
203
|
});
|
|
225
204
|
const text = await response.text();
|
|
226
205
|
const contentType = response.headers.get('content-type');
|
|
@@ -270,16 +249,14 @@ export class RisService {
|
|
|
270
249
|
signal: ctx.signal,
|
|
271
250
|
}).catch((error) => {
|
|
272
251
|
// RIS reports a rejected parameter as HTTP 500 carrying the in-band error envelope,
|
|
273
|
-
// which fetchWithTimeout captures as data.body
|
|
274
|
-
//
|
|
275
|
-
// without one is a genuine server fault — reclassify so it lands on the callers'
|
|
276
|
-
// declared upstream_error rather than an undeclared InternalError.
|
|
252
|
+
// which fetchWithTimeout captures as data.body. Translate that domain error before
|
|
253
|
+
// retrying a generic upstream failure, preserving the rejected parameter detail.
|
|
277
254
|
if (error instanceof McpError) {
|
|
278
255
|
const translated = errorFromResponseBody(error.data?.body, { cause: error });
|
|
279
256
|
if (translated)
|
|
280
257
|
throw translated;
|
|
281
258
|
}
|
|
282
|
-
throw failFastOnDeadline(
|
|
259
|
+
throw failFastOnDeadline(error);
|
|
283
260
|
});
|
|
284
261
|
const text = await response.text();
|
|
285
262
|
if (isHtmlErrorPage(text)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ris-service.js","sourceRoot":"","sources":["../../../src/services/ris/ris-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ris-service.js","sourceRoot":"","sources":["../../../src/services/ris/ris-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/ris-austria-mcp-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"mcpName": "io.github.cyanheads/ris-austria-mcp-server",
|
|
5
5
|
"description": "Search Austrian consolidated federal & state law, court decisions, and the authentic Bundesgesetzblatt from the official RIS via MCP. Keyless. STDIO or Streamable HTTP.",
|
|
6
6
|
"type": "module",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"rebuild": "bun run scripts/clean.ts && bun run scripts/build.ts",
|
|
26
26
|
"clean": "bun run scripts/clean.ts",
|
|
27
27
|
"devcheck": "bun run scripts/devcheck.ts",
|
|
28
|
+
"audit:fix": "bun audit fix",
|
|
28
29
|
"audit:refresh": "rm -f bun.lock && bun install && bun audit",
|
|
29
30
|
"tree": "bun run scripts/tree.ts",
|
|
30
31
|
"list-skills": "bun run scripts/list-skills.ts",
|
|
@@ -82,7 +83,7 @@
|
|
|
82
83
|
"license": "Apache-2.0",
|
|
83
84
|
"packageManager": "bun@1.4.0",
|
|
84
85
|
"engines": {
|
|
85
|
-
"bun": ">=1.
|
|
86
|
+
"bun": ">=1.4.0",
|
|
86
87
|
"node": ">=24.0.0"
|
|
87
88
|
},
|
|
88
89
|
"publishConfig": {
|
|
@@ -90,19 +91,19 @@
|
|
|
90
91
|
},
|
|
91
92
|
"trustedDependencies": ["@socketsecurity/bun-security-scanner"],
|
|
92
93
|
"dependencies": {
|
|
93
|
-
"@cyanheads/mcp-ts-core": "^0.
|
|
94
|
+
"@cyanheads/mcp-ts-core": "^0.13.0",
|
|
94
95
|
"node-html-markdown": "^2.0.0",
|
|
95
96
|
"pino-pretty": "^13.1.3",
|
|
96
|
-
"zod": "^4.
|
|
97
|
+
"zod": "^4.6.1"
|
|
97
98
|
},
|
|
98
99
|
"devDependencies": {
|
|
99
|
-
"@biomejs/biome": "2.5.
|
|
100
|
+
"@biomejs/biome": "2.5.13",
|
|
100
101
|
"@socketsecurity/bun-security-scanner": "^1.1.2",
|
|
101
|
-
"@types/node": "26.
|
|
102
|
+
"@types/node": "26.5.1",
|
|
102
103
|
"depcheck": "^1.4.7",
|
|
103
|
-
"ignore": "^7.0.
|
|
104
|
-
"tsc-alias": "^1.9.
|
|
104
|
+
"ignore": "^7.0.9",
|
|
105
|
+
"tsc-alias": "^1.9.4",
|
|
105
106
|
"typescript": "^7.0.2",
|
|
106
|
-
"vitest": "^
|
|
107
|
+
"vitest": "^5.0.0"
|
|
107
108
|
}
|
|
108
109
|
}
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/ris-austria-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.4.
|
|
9
|
+
"version": "0.4.3",
|
|
10
10
|
"remotes": [
|
|
11
11
|
{
|
|
12
12
|
"type": "streamable-http",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/ris-austria-mcp-server",
|
|
21
21
|
"runtimeHint": "node",
|
|
22
|
-
"version": "0.4.
|
|
22
|
+
"version": "0.4.3",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -43,6 +43,20 @@
|
|
|
43
43
|
"description": "Optional contact string appended to the User-Agent (RIS netiquette asks integrators to be identifiable).",
|
|
44
44
|
"format": "string",
|
|
45
45
|
"isRequired": false
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "RIS_API_BASE_URL",
|
|
49
|
+
"description": "RIS OGD REST API base URL.",
|
|
50
|
+
"format": "string",
|
|
51
|
+
"isRequired": false,
|
|
52
|
+
"default": "https://data.bka.gv.at/ris/api/v2.6"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "RIS_CONTENT_BASE_URL",
|
|
56
|
+
"description": "RIS document content host and allowlist origin.",
|
|
57
|
+
"format": "string",
|
|
58
|
+
"isRequired": false,
|
|
59
|
+
"default": "https://www.ris.bka.gv.at"
|
|
46
60
|
}
|
|
47
61
|
],
|
|
48
62
|
"transport": {
|
|
@@ -54,7 +68,7 @@
|
|
|
54
68
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
55
69
|
"identifier": "@cyanheads/ris-austria-mcp-server",
|
|
56
70
|
"runtimeHint": "node",
|
|
57
|
-
"version": "0.4.
|
|
71
|
+
"version": "0.4.3",
|
|
58
72
|
"packageArguments": [
|
|
59
73
|
{
|
|
60
74
|
"type": "positional",
|
|
@@ -106,6 +120,20 @@
|
|
|
106
120
|
"description": "Optional contact string appended to the User-Agent (RIS netiquette asks integrators to be identifiable).",
|
|
107
121
|
"format": "string",
|
|
108
122
|
"isRequired": false
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"name": "RIS_API_BASE_URL",
|
|
126
|
+
"description": "RIS OGD REST API base URL.",
|
|
127
|
+
"format": "string",
|
|
128
|
+
"isRequired": false,
|
|
129
|
+
"default": "https://data.bka.gv.at/ris/api/v2.6"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "RIS_CONTENT_BASE_URL",
|
|
133
|
+
"description": "RIS document content host and allowlist origin.",
|
|
134
|
+
"format": "string",
|
|
135
|
+
"isRequired": false,
|
|
136
|
+
"default": "https://www.ris.bka.gv.at"
|
|
109
137
|
}
|
|
110
138
|
],
|
|
111
139
|
"transport": {
|