Skip to content

feat: anonymous telemetry and in-app feedback (Spec 036)#345

Merged
Dumbris merged 7 commits into
mainfrom
feat/036-telemetry-and-feedback
Mar 23, 2026
Merged

feat: anonymous telemetry and in-app feedback (Spec 036)#345
Dumbris merged 7 commits into
mainfrom
feat/036-telemetry-and-feedback

Conversation

@Dumbris

@Dumbris Dumbris commented Mar 23, 2026

Copy link
Copy Markdown
Member

Summary

  • Add anonymous daily heartbeat telemetry to Cloudflare Worker (opt-out, no PII)
  • Add in-app feedback form that creates GitHub Issues via Worker
  • CLI commands: mcpproxy telemetry status/enable/disable, mcpproxy feedback
  • Web UI: Feedback page, telemetry banner, nav menu item
  • Full documentation at docs/features/telemetry.md

What's collected

Version, OS, arch, server/tool counts, uptime, routing mode. Never: server names, URLs, keys, tool content, user data.

How to disable

mcpproxy telemetry disable          # CLI
MCPPROXY_TELEMETRY=false            # Environment variable
{"telemetry": {"enabled": false}}   # Config file

Test plan

  • 19 new Go tests (telemetry service, feedback, config) — all pass with -race
  • Frontend build passes (npm run build)
  • make build passes (personal + tray editions)
  • OpenAPI spec regenerated
  • Telemetry silently handles endpoint failures (fire-and-forget, 10s timeout)
  • Feedback rate-limited to 5/hour

🤖 Generated with Claude Code

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Mar 23, 2026

Copy link
Copy Markdown

Deploying mcpproxy-docs with  Cloudflare Pages  Cloudflare Pages

Latest commit: f44b3f4
Status: ✅  Deploy successful!
Preview URL: https://6b8d89cd.mcpproxy-docs.pages.dev
Branch Preview URL: https://feat-036-telemetry-and-feedb.mcpproxy-docs.pages.dev

View logs

@github-actions

github-actions Bot commented Mar 23, 2026

Copy link
Copy Markdown

📦 Build Artifacts

Workflow Run: View Run
Branch: feat/036-telemetry-and-feedback

Available Artifacts

  • archive-darwin-amd64 (25 MB)
  • archive-darwin-arm64 (23 MB)
  • archive-linux-amd64 (14 MB)
  • archive-linux-arm64 (13 MB)
  • archive-windows-amd64 (25 MB)
  • archive-windows-arm64 (22 MB)
  • frontend-dist-pr (0 MB)
  • installer-dmg-darwin-amd64 (28 MB)
  • installer-dmg-darwin-arm64 (25 MB)

How to Download

Option 1: GitHub Web UI (easiest)

  1. Go to the workflow run page linked above
  2. Scroll to the bottom "Artifacts" section
  3. Click on the artifact you want to download

Option 2: GitHub CLI

gh run download 23449237372 --repo smart-mcp-proxy/mcpproxy-go

Note: Artifacts expire in 14 days.

claude added 7 commits March 23, 2026 18:49
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Detail telemetry enable/disable CLI behavior and output
- Add documentation deliverables: CLAUDE.md, docs/features/telemetry.md,
  configuration.md, swagger.yaml
- Clarify CLI feedback uses local API via socket

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…eedback feature

Add frontend components for Spec 036 (telemetry and feedback):
- Feedback.vue: form with category, message, email fields posting to /api/v1/feedback
- TelemetryBanner.vue: dismissible info banner on Dashboard (localStorage-persisted)
- Route /feedback added to router
- Feedback link added to SidebarNav and NavBar menus
- submitFeedback method added to API service

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… (036)

Backend implementation for anonymous usage telemetry and feedback:

- TelemetryConfig in config with IsTelemetryEnabled(), env var override
- Telemetry service: daily heartbeat, 5min startup delay, fire-and-forget
- Feedback: validation, rate limiting (5/hr), proxy to Cloudflare Worker
- HTTP API: POST /api/v1/feedback endpoint
- CLI: mcpproxy telemetry status/enable/disable, mcpproxy feedback
- Runtime wiring: RuntimeStats interface, background goroutine launch
- Tests: 19 new tests covering all paths

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Create docs/features/telemetry.md with full privacy policy,
  data collected/excluded, and three ways to disable
- Add telemetry/feedback CLI commands to CLAUDE.md
- Add MCPPROXY_TELEMETRY env var to CLAUDE.md
- Add POST /api/v1/feedback to API endpoints table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pass context through to http.NewRequestWithContext so in-flight
heartbeat requests are cancelled immediately on app shutdown instead
of blocking up to 10s on the client timeout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@Dumbris Dumbris force-pushed the feat/036-telemetry-and-feedback branch from ba9dd48 to f44b3f4 Compare March 23, 2026 16:50
@Dumbris Dumbris merged commit 14c1cc9 into main Mar 23, 2026
24 checks passed
@Dumbris Dumbris deleted the feat/036-telemetry-and-feedback branch March 23, 2026 16:57
Dumbris pushed a commit that referenced this pull request Apr 11, 2026
The telemetry enable/disable commands correctly loaded config via
loadTelemetryConfig() (which honors the --config flag) but then
hardcoded the save path to config.GetConfigPath(cfg.DataDir), so
`mcpproxy --config /custom.json telemetry disable` always wrote to
~/.mcpproxy/mcp_config.json instead of the custom path. This is a
pre-existing bug introduced in PR #345 (Spec 036), not Spec 042.

Add a small telemetryConfigSavePath helper that mirrors the load
logic: prefer the package-level configFile flag when set, else fall
back to GetConfigPath(DataDir). Apply it to runTelemetryEnable,
runTelemetryDisable, and runTelemetryShowPayload (the latter passes
the path to telemetry.New which persists the anonymous ID). Adds
regression tests covering both enable and disable, plus a direct
helper unit test, with HOME sandboxed to t.TempDir() so accidental
writes to the real home config are detected.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dumbris pushed a commit that referenced this pull request Apr 11, 2026
The telemetry enable/disable commands correctly loaded config via
loadTelemetryConfig() (which honors the --config flag) but then
hardcoded the save path to config.GetConfigPath(cfg.DataDir), so
`mcpproxy --config /custom.json telemetry disable` always wrote to
~/.mcpproxy/mcp_config.json instead of the custom path. This is a
pre-existing bug introduced in PR #345 (Spec 036), not Spec 042.

Add a small telemetryConfigSavePath helper that mirrors the load
logic: prefer the package-level configFile flag when set, else fall
back to GetConfigPath(DataDir). Apply it to runTelemetryEnable,
runTelemetryDisable, and runTelemetryShowPayload (the latter passes
the path to telemetry.New which persists the anonymous ID). Adds
regression tests covering both enable and disable, plus a direct
helper unit test, with HOME sandboxed to t.TempDir() so accidental
writes to the real home config are detected.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dumbris added a commit that referenced this pull request Apr 11, 2026
The telemetry enable/disable commands correctly loaded config via
loadTelemetryConfig() (which honors the --config flag) but then
hardcoded the save path to config.GetConfigPath(cfg.DataDir), so
`mcpproxy --config /custom.json telemetry disable` always wrote to
~/.mcpproxy/mcp_config.json instead of the custom path. This is a
pre-existing bug introduced in PR #345 (Spec 036), not Spec 042.

Add a small telemetryConfigSavePath helper that mirrors the load
logic: prefer the package-level configFile flag when set, else fall
back to GetConfigPath(DataDir). Apply it to runTelemetryEnable,
runTelemetryDisable, and runTelemetryShowPayload (the latter passes
the path to telemetry.New which persists the anonymous ID). Adds
regression tests covering both enable and disable, plus a direct
helper unit test, with HOME sandboxed to t.TempDir() so accidental
writes to the real home config are detected.

Co-authored-by: Claude Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants