@thalovant/mcp-server 0.4.1 → 0.5.1

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.1 — 2026-09-13
4
+
5
+ - Expose advisory reply claim status and first-seen pipeline/skill identifiers, with shared conformance for fallback, mixed stages, legacy hubs and malformed stamps. Existing reply construction remains compatible.
6
+
7
+ ## 0.5.0 — 2026-09-13
8
+
9
+ - Use Node SDK 0.7.0 inventory models and Python-compatible question detection.
10
+ - Add an inventory `presentation` view with derived skill titles, explicit phrase-language order, and unknown catalog metadata preserved.
11
+ - Gate PRs and publication on the shared SDK acceptance contract and check for drift every six hours.
12
+
3
13
  ## 0.4.1 — 2026-09-12
4
14
 
5
15
  - Use Node SDK 0.6.1 with thalovant-languages 0.2.1 listing data, matching Python 0.6.8 across 270 languages.
package/README.md CHANGED
@@ -393,6 +393,14 @@ adds at most 1500ms. A silent listing can use engine manifests; disable this wit
393
393
  per-principal policy. `thalovant_get_operation` reads an operation ID returned by
394
394
  provisioning without replaying the write.
395
395
 
396
+ The additive `presentation` object contains the shared SDK inventory shape:
397
+ `cache_version`, `hub_id`, `hub_name`, `source`, `generated_at`, `skills`, `notes`,
398
+ and `languages_present`. Skill titles are derived from IDs. Runtime discovery
399
+ cannot prove catalog locales or hub display metadata, so those fields remain
400
+ unknown (empty lists/strings), with explanatory notes. Intent language order is
401
+ explicit and survives JSON key sorting. Each tool call retains its own identity
402
+ lease; the server does not persist inventory or share a session across callers.
403
+
396
404
  ## Request hints, embedded audio, and configuration merging
397
405
 
398
406
  `thalovant_ask` accepts `sttLang`, an ordered `pipeline`, and `location`
@@ -464,7 +472,7 @@ Runtime calls sharing the same hub client identity run sequentially within one
464
472
  MCP process. Use a distinct client identity for each independently running MCP
465
473
  server so the hub can keep their sessions separate.
466
474
 
467
- Version 0.4.1 requires `@thalovant/sdk` `^0.6.1` (0.6.1 through versions below 0.7.0). This release enforces
475
+ Version 0.5.1 requires `@thalovant/sdk` `^0.7.1` (0.7.1 through versions below 0.8.0). This release enforces
468
476
  secure effective MQTT URLs and carries a single connection deadline through
469
477
  MQTT setup and HTTP failure cleanup. Runtime tools support
470
478
  HiveMind v3 Noise over WSS, HTTPS and MQTT over TLS. `thalovant_healthcheck`
@@ -569,7 +577,7 @@ The CLI handles SIGTERM and SIGINT in stdio and HTTP modes, including when it
569
577
  runs as the container's PID 1. It closes sessions and HTTP connections before a
570
578
  successful exit, with a ten-second failure deadline for stalled cleanup.
571
579
 
572
- Version 0.4.1 uses Node SDK 0.6.1 and the same 270-language listing data as
573
- Python 0.6.8. With `sentence: true`, Spanish questions receive their question
580
+ Version 0.5.1 uses Node SDK 0.7.1 with Python 0.7.4-compatible inventory
581
+ and question detection, including Unicode question marks and omitted-language patterns. With `sentence: true`, Spanish questions receive their question
574
582
  mark and complete French phrases keep their final period. Undescribed
575
583
  languages remain bare.
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { inventoryPresentation } from "./inventory-output.js";
2
3
  import { runtimeReplyContent } from "./reply-output.js";
3
4
  import { throwIfRuntimeCancelled, withRuntimeLease } from "./runtime-lease.js";
4
5
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -1361,6 +1362,7 @@ export function createServer() {
1361
1362
  const inventory = await client.intents(languages, { describe, fallback, timeoutMs: clampTimeout(timeoutMs) });
1362
1363
  return jsonContent(redactSecrets({
1363
1364
  ...inventory.asObject(),
1365
+ presentation: inventoryPresentation(inventory),
1364
1366
  examples: inventory.intents.map(intent => ({ id: intent.id,
1365
1367
  languages: Object.fromEntries(inventory.languages.map(lang => [lang, intent.examples(lang, exampleLimit, { speakable, sentence, slots })])),
1366
1368
  })),
@@ -0,0 +1,12 @@
1
+ import type { HubIntentInventory } from "@thalovant/sdk";
2
+ /** Add a display view without claiming catalogue metadata from runtime phrases. */
3
+ export declare function inventoryPresentation(runtime: HubIntentInventory, generatedAt?: string): {
4
+ languages_present: string[];
5
+ cache_version: number;
6
+ hub_id: string;
7
+ hub_name: string;
8
+ source: string;
9
+ generated_at: string;
10
+ notes: string[];
11
+ skills: import("@thalovant/sdk").InventorySkillData[];
12
+ };
@@ -0,0 +1,12 @@
1
+ import { Inventory, Intent, Skill, friendlyTitle, languagesPresent } from "@thalovant/sdk";
2
+ /** Add a display view without claiming catalogue metadata from runtime phrases. */
3
+ export function inventoryPresentation(runtime, generatedAt = new Date().toISOString()) {
4
+ const notes = [
5
+ "Skill titles are derived from IDs; catalogue locales and hub metadata are unknown.",
6
+ `Runtime discovery source: ${runtime.source}.`,
7
+ ...runtime.denied.map(query => `Query refused or unanswered: ${query}.`),
8
+ ...(!runtime.fallbacksKnown ? ["Fallback skill support is unknown."] : []),
9
+ ];
10
+ const inventory = new Inventory("", "", "hub", generatedAt, runtime.skills.map(skill => new Skill(skill.skillId, friendlyTitle(skill.skillId), [], skill.intents.map(intent => new Intent(intent.id, intent.name, intent.skillId, intent.engine, intent.phrases, intent.languages)))), notes);
11
+ return { ...inventory.asObject(), languages_present: languagesPresent(inventory) };
12
+ }
@@ -29,6 +29,9 @@ export declare function runtimeReplyContent(reply: ThalovantReply, includeAudio?
29
29
  [x: string]: unknown;
30
30
  };
31
31
  } | undefined;
32
+ pipelineIds: string[];
33
+ skillIds: string[];
34
+ claimed: boolean;
32
35
  };
33
36
  clips: ({
34
37
  type: "audio";
@@ -1,3 +1,4 @@
1
+ import { replyClaimMetadata } from "@thalovant/sdk";
1
2
  import { createHash } from "node:crypto";
2
3
  function eventSummary(event) {
3
4
  const { binary_data: _encoded, ...data } = event.data;
@@ -31,6 +32,7 @@ export function runtimeReplyContent(reply, includeAudio = false) {
31
32
  return output;
32
33
  });
33
34
  return { summary: {
35
+ ...replyClaimMetadata(reply),
34
36
  text: reply.text, displayText: reply.displayText, utterances: reply.utterances,
35
37
  handled: reply.handled, ok: reply.ok, sessionId: reply.sessionId, requestId: reply.requestId,
36
38
  lang: reply.lang, hasAudio: reply.hasAudio ?? false, droppedMedia: reply.droppedMedia ?? 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thalovant/mcp-server",
3
- "version": "0.4.1",
3
+ "version": "0.5.1",
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",
@@ -64,7 +64,7 @@
64
64
  },
65
65
  "dependencies": {
66
66
  "@modelcontextprotocol/sdk": "^1.30.0",
67
- "@thalovant/sdk": "^0.6.1",
67
+ "@thalovant/sdk": "^0.7.1",
68
68
  "jose": "^6.2.8",
69
69
  "zod": "^3.25.76"
70
70
  },
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.4.1",
10
+ "version": "0.5.1",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@thalovant/mcp-server",
15
- "version": "0.4.1",
15
+ "version": "0.5.1",
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.4.1",
22
+ "identifier": "ghcr.io/thalovant/thalovant-mcp:0.5.1",
23
23
  "transport": {
24
24
  "type": "streamable-http",
25
25
  "url": "http://127.0.0.1:3000/mcp"