Skip to content

Releases: Roee-Tsur/mcp-signal

v0.2.1

Choose a tag to compare

@Roee-Tsur Roee-Tsur released this 15 Jul 20:51

Fixed

  • Type resolution for CJS and legacy consumers. require('mcp-signal') and the
    mcp-signal/server + mcp-signal/inline subpaths now resolve correct type declarations across
    node10 / node16 (CJS + ESM) / bundler — via per-condition types (.d.cts for require) plus
    typesVersions. Verified green with publint +
    arethetypeswrong. No API or runtime changes.

🔏 First release published through automated CI with npm provenance.

Full Changelog: v0.2.0...v0.2.1

v0.1.1 · docs & repo polish

Choose a tag to compare

@Roee-Tsur Roee-Tsur released this 15 Jul 15:29

Documentation and repository polish — no code changes. The published SDK behaves exactly like v0.1.0; this release refreshes the npm page and README.

Changed

  • README rebuilt on the layout leading OSS packages use: a centered hero (logo mark, one-line value prop, curated + verified badges, nav links, animated demo), a scannable Features section, a dedicated How the bridge works diagram section, and a collapsible Configuration table.

Added

  • Animated demo (assets/demo.gif) at the top of the README and a project logo mark (assets/logo.png).
npm install mcp-signal@0.1.1

Full diff: v0.1.0...v0.1.1

v0.1.0 · first release

Choose a tag to compare

@Roee-Tsur Roee-Tsur released this 15 Jul 14:19

Tiny, zero-dependency telemetry SDK for MCP widgets. Drop it into an interactive MCP widget (Claude MCP Apps, ChatGPT Apps SDK, mcp-ui) to capture usage and forward it to any destination — PostHog, a webhook, your console, or an adapter you write.

The hard part it solves: a host's Content-Security-Policy blocks a widget from fetch-ing your analytics endpoint, so your events can't get out. mcp-signal's bridge routes them through a model-invisible MCP tool call to your own server, which forwards them — no CSP changes, your key stays server-side. Direct HTTP is available too when you control the widget's CSP.

npm install mcp-signal
import { createSignal, consoleAdapter } from 'mcp-signal';

const signal = createSignal({ widgetName: 'weather', adapters: [consoleAdapter()] });
signal.track('forecast_expanded', { day: 'tue' });

In this release

  • createSignal() client — batching (size + interval), exponential-backoff retries, best-effort teardown flushing, a beforeSend redaction hook, and an enabled: false hard opt-out.
  • Pluggable adapter contract + consoleAdapter, webhookAdapter, and posthogAdapter (PostHog Cloud US/EU + self-hosted).
  • Bridge transportbridgeAdapter (model-invisible, app-only MCP tool call) with the server-side createSignalReceiver and a ready-made signalToolDefinition descriptor (mcp-signal/server).
  • Auto-capture — lifecycle (loaded/visible/hidden/closed), uncaught errors + unhandled rejections, and opt-in [data-mcp-signal] click capture.
  • CSP helpersrequiredConnectDomains() / cspMeta() to declare a widget's connect-src for direct adapters.
  • Best-effort context — anonymous per-load session id, host/theme/locale/viewport. No user identity, no fingerprinting, no phone-home.
  • Builds — ESM + CJS + type declarations + a standalone minified IIFE (window.McpSignal). Zero runtime dependencies. 111 passing tests.

Full notes in the changelog · docs in the README.