Skip to content
v1.9.3May 15, 2026

Bug-fix release.

Bug-fix release. Closes upstream issue [massu-ai/massu#4](https://github.com/massu-ai/massu/issues/4) — `tools/list` emitted a non-standard top-level `tier` field on every Tool object, which Claude Code 2.1.143 (released 2026-05-15) silently rejects, causing all 67 `mcp__massu__*` tools to disappear from the deferre...

Bug-fix release. Closes upstream issue massu-ai/massu#4tools/list emitted a non-standard top-level tier field on every Tool object, which Claude Code 2.1.143 (released 2026-05-15) silently rejects, causing all 67 mcpmassu* tools to disappear from the deferred-tool registry on session start. The canonical MCP Tool schema (schema/2025-11-25/schema.ts line 1251) permits only name, title, description, inputSchema, execution, outputSchema, annotations, _meta, iconstier is not in the schema. Structured tier metadata now lives under annotations.tier (the spec-sanctioned extension point for tool metadata); the visible [PRO] / [TEAM] / [ENTERPRISE] description-prefix labelling is unchanged. Internal license enforcement at tools.ts:323-331 is unaffected because it reads getToolTier(name) from the static server-side TOOL_TIER_MAP, never from the wire-emitted field — no license-bypass risk. Structural drift-prevention: new vitest assertion (license.test.ts "emits only MCP-spec-permitted top-level fields") parses the annotated definitions against the canonical permitted set; the regression class becomes structurally impossible to reintroduce without test failure.

Fixed

  • packages/core/src/license.ts:194-203 annotateToolDefinitions() — replaced the top-level tier, spread with annotations: { ...(def.annotations ?? {}), tier },. Wire-format Tool objects now conform to MCP spec 2025-11-25 §Tool (extends BaseMetadata, Icons). Caller-supplied annotations (e.g. readOnlyHint, title) are preserved via shallow-merge before tier is added.
  • packages/core/src/tools.ts:43-48 ToolDefinition interface — dropped top-level tier?: 'free' | 'pro' | 'team' | 'enterprise'; added annotations?: Record<string, unknown> to mirror the MCP spec extension point. The local interface remains permissive (Record<string, unknown> vs. the spec's strictly-typed ToolAnnotations) so that tier can co-exist with caller-supplied annotation fields without a circular ToolTier type import.

Added

  • packages/core/src/tests/license.test.ts two new regression tests under the existing P3-029 annotateToolDefinitions() describe block:
  • Existing 9 annotated[N].tier assertions in the same describe block migrated to annotated[N].annotations?.tier to track the wire-format relocation.

Verification

  • cd packages/core && npm test — ALL pass (see commit message body for count).
  • cd packages/core && npx tsc --noEmit — 0 errors.
  • bash scripts/massu-pattern-scanner.sh — exit 0 (all 16 checks).
  • Diagnostic confirmation: stripping tier via a stdio wrapper restored all 67 mcpmassu* tools in Claude Code 2.1.143 (proves the fix root-cause-correct).
  • Spec citation: schema/2025-11-25/schema.ts line 1251interface Tool extends BaseMetadata, Icons with no tier field.

Try this release

Install the latest version of Massu and start governing your AI development today.