@thalovant/mcp-server 0.6.4 → 0.6.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
+ Last Edit: Codex (exact runtime model identifier unavailable) - 2026-10-25 - Motive: Document the scoped dependency security patch.
2
+
1
3
  # Changelog
2
4
 
5
+ ## 0.6.6 - Unreleased
6
+
7
+ - Update body-parser to 2.4.0 (CVE-2026-111181), Zod to 4.6.7 (patched bounds checks from 4.6.6), and the existing fast-uri override to 3.1.9. No audit suppression is added.
8
+ - Migrate five records to Zod 4's explicit string-key signature. Bounded arrays reject oversized input before parsing elements. UUIDs now enforce standard version/variant bits (plus nil/max UUIDs); memory-list offsets reject unsafe integers.
9
+ - Preserve the 50 default tools, Thalovant SDK version, permissions and transport behavior. Zod 4's generated input schemas inline repeated records, add string property names and omit the previous `additionalProperties: false` on stripping objects; unknown input keys remain stripped at runtime.
10
+ - Align package, registry and OCI metadata at 0.6.6. Publication, published-artifact smoke checks and deployment remain separate release steps.
11
+
12
+ ## 0.6.5 - 2026-10-23
13
+
14
+ - Lock the runtime transitive dependency `ip-address` to 10.7.4, fixing the IPv6 zone-identifier parsing denial of service (CVE-2026-111997). The MCP and Thalovant SDK versions, tool schemas, and protocol behavior are unchanged.
15
+ - Update development dependencies Vite to 8.3.3 and Vitest with its matching packages to 4.1.12, fixing CVE-2026-112942, CVE-2026-112949, and CVE-2026-112950. Neither Vite nor Vitest is included in the production OCI runtime.
16
+ - Align `package.json`, `server.json`, the OCI label, and the README at 0.6.5. Existing release security checks and published-artifact smoke checks remain unchanged.
17
+
3
18
  ## 0.6.4 — 2026-10-19
4
19
 
5
20
  - **Descriptions that say what a runtime tool changes.** `thalovant_send_action`, `thalovant_send_code` and `thalovant_wait_for_event` had one-line descriptions that didn't say whether the tool changes anything. A scanner that reads only names and descriptions rated all three as high-risk tools that execute, `thalovant_wait_for_event` included, though it was already annotated `readOnlyHint: true`. `thalovant_send_action` now says the hub routes its payload like a spoken request, so a skill may act on it. `thalovant_send_code` says the hub receives its value as an exact utterance, and both say they return without waiting for a reply and that `THALOVANT_MCP_READONLY` leaves them out. `thalovant_wait_for_event` says it only listens and sends the hub nothing, and that `sessionId`, `requestId` and `context` filter which events count. `payload`, `title`, `value`, `kind`, `label` and `eventName` now have their own descriptions. Schemas, annotations and behaviour are unchanged.
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ Last Edit: Codex (exact runtime model identifier unavailable) - 2026-10-25 - Motive: Record security dependency compatibility and the next patch version.
2
+
1
3
  # Thalovant MCP Server
2
4
 
3
5
  [![M8ven Live Monitored](https://m8ven.ai/badge/mcp/thalovant-thalovant-mcp-1cyhb4)](https://m8ven.ai/mcp/thalovant-thalovant-mcp-1cyhb4)
@@ -540,13 +542,15 @@ Runtime calls sharing the same hub client identity run sequentially within one
540
542
  MCP process. Use a distinct client identity for each independently running MCP
541
543
  server so the hub can keep their sessions separate.
542
544
 
543
- Version 0.6.4 requires `@thalovant/sdk` `^0.9.9` (0.9.9 through versions below 0.10.0). Since 0.5.1 the server enforces
545
+ Version 0.6.6 requires `@thalovant/sdk` `^0.9.9` (0.9.9 through versions below 0.10.0). Since 0.5.1 the server enforces
544
546
  secure effective MQTT URLs and carries a single connection deadline through
545
547
  MQTT setup and HTTP failure cleanup. Runtime tools support
546
548
  HiveMind v3 Noise over WSS, HTTPS and MQTT over TLS. `thalovant_healthcheck`
547
549
  reports readiness only after authentication; a reachable hub or broker alone
548
550
  does not establish a runtime session.
549
551
 
552
+ The Zod 4 security migration preserves the 50 default tools and string-keyed record values. Its JSON Schema output inlines repeated records, identifies string property names, and omits `additionalProperties: false` on stripping objects; unknown input keys are still stripped before handlers receive them. UUID validation now enforces standard version/variant bits (plus nil/max UUIDs), and memory-list offsets must be safe integers. See the [security audit](https://github.com/thalovant/thalovant-mcp/blob/main/AUDIT.md) for evidence and release gates.
553
+
550
554
  Keep the SDK configuration directory persistent and private between server
551
555
  restarts (`~/.config/thalovant`, or the configured XDG/Windows equivalent). It
552
556
  contains the client Noise key and trusted server pins. An authentication
package/dist/index.js CHANGED
@@ -75,7 +75,7 @@ const publicHubsLimitSchema = z
75
75
  .default(25)
76
76
  .describe("Page size, 1-48. The public hubs endpoint caps page size at 48.");
77
77
  const optionalCursorSchema = z.string().min(1).optional();
78
- const jsonRecordSchema = z.record(z.unknown());
78
+ const jsonRecordSchema = z.record(z.string(), z.unknown());
79
79
  const controlPlaneSchema = {
80
80
  loginScope: z
81
81
  .string()
@@ -197,8 +197,8 @@ const hubEtagSchema = z
197
197
  .describe("Required. The hub's current etag, sent as If-Match for optimistic locking. Read it from the `etag` field in the hub resource BODY returned by thalovant_get_hub — the API does not send an ETag response header, so you must fetch the hub first. A missing or stale value fails with HTTP 412 and changes nothing: re-fetch the hub, take the new etag, and retry.");
198
198
  const runtimeGroupResourceLimitsSchema = z
199
199
  .object({
200
- requests: z.record(z.string()).optional(),
201
- limits: z.record(z.string()).optional(),
200
+ requests: z.record(z.string(), z.string()).optional(),
201
+ limits: z.record(z.string(), z.string()).optional(),
202
202
  })
203
203
  .optional();
204
204
  const runtimeGroupSpecSchema = z
@@ -217,7 +217,7 @@ const releaseOptionsSchema = {
217
217
  channel: z.string().min(1).optional().describe("Release channel. Falls back to the workspace release policy when omitted."),
218
218
  mode: z.string().min(1).optional().describe('Release mode. Passing images without mode switches to "custom".'),
219
219
  version: z.string().min(1).optional().describe("Pinned release version."),
220
- images: z.record(z.string().min(1)).optional().describe("Explicit image overrides. Switches to custom mode unless mode is also set. Non-admins may pass only images the platform releases for each key: a catalog pin of the stable or alpha channel, the resource's current, recommended or release-policy image, or the platform's default image; runtime core also accepts any tag or digest of ghcr.io/thalovant/ovos-core and hub listener any tag or digest of ghcr.io/thalovant/hivemind-listener, while bus and preview_bridge take only the listed images. Anything else fails with 403 platform_image_required, whose error lists allowed_images and allowed_repositories per refused key."),
220
+ images: z.record(z.string(), z.string().min(1)).optional().describe("Explicit image overrides. Switches to custom mode unless mode is also set. Non-admins may pass only images the platform releases for each key: a catalog pin of the stable or alpha channel, the resource's current, recommended or release-policy image, or the platform's default image; runtime core also accepts any tag or digest of ghcr.io/thalovant/ovos-core and hub listener any tag or digest of ghcr.io/thalovant/hivemind-listener, while bus and preview_bridge take only the listed images. Anything else fails with 403 platform_image_required, whose error lists allowed_images and allowed_repositories per refused key."),
221
221
  reason: z.string().min(1).optional().describe("Audit reason recorded with the release."),
222
222
  };
223
223
  function releaseOptionsFrom(args) {
@@ -1620,7 +1620,7 @@ export function createServer() {
1620
1620
  languages: z.array(z.string().trim().min(1).max(100)).min(1).max(20).default(["en-us"]),
1621
1621
  speakable: z.boolean().default(false).describe("Render intent patterns with locale slot examples; preserve complete-phrase priority."),
1622
1622
  sentence: z.boolean().default(false).describe("Capitalize and punctuate examples using the selected locale. Implies speakable rendering."),
1623
- slots: z.record(z.string().max(500)).optional().describe("Example values for named intent slots."),
1623
+ slots: z.record(z.string(), z.string().max(500)).optional().describe("Example values for named intent slots."),
1624
1624
  exampleLimit: z.number().int().min(1).max(20).default(2),
1625
1625
  describe: z.boolean().default(true),
1626
1626
  fallback: z.boolean().default(true).describe("Try engine manifests if the intent listing is refused or unanswered."),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thalovant/mcp-server",
3
- "version": "0.6.4",
3
+ "version": "0.6.6",
4
4
  "description": "Stdio and Streamable HTTP MCP server for Thalovant control-plane and hub runtime APIs.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -66,14 +66,14 @@
66
66
  "@modelcontextprotocol/sdk": "^1.30.0",
67
67
  "@thalovant/sdk": "^0.9.9",
68
68
  "jose": "^6.2.8",
69
- "zod": "^3.25.76"
69
+ "zod": "^4.6.6"
70
70
  },
71
71
  "overrides": {
72
- "fast-uri": "3.1.8"
72
+ "fast-uri": "3.1.9"
73
73
  },
74
74
  "devDependencies": {
75
75
  "@types/node": "^22.18.12",
76
76
  "typescript": "^5.9.3",
77
- "vitest": "^4.1.11"
77
+ "vitest": "^4.1.12"
78
78
  }
79
79
  }
package/server.json CHANGED
@@ -7,19 +7,19 @@
7
7
  "url": "https://github.com/thalovant/thalovant-mcp",
8
8
  "source": "github"
9
9
  },
10
- "version": "0.6.4",
10
+ "version": "0.6.6",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@thalovant/mcp-server",
15
- "version": "0.6.4",
15
+ "version": "0.6.6",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }
19
19
  },
20
20
  {
21
21
  "registryType": "oci",
22
- "identifier": "ghcr.io/thalovant/thalovant-mcp:0.6.4",
22
+ "identifier": "ghcr.io/thalovant/thalovant-mcp:0.6.6",
23
23
  "transport": {
24
24
  "type": "streamable-http",
25
25
  "url": "http://127.0.0.1:3000/mcp"