Skip to content

Add Cursor client attribution - #2

Merged
aezell merged 2 commits into
mainfrom
alex/add-client-attribution
Aug 4, 2026
Merged

Add Cursor client attribution#2
aezell merged 2 commits into
mainfrom
alex/add-client-attribution

Conversation

@aezell

@aezell aezell commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add fixed privacy-safe client attribution headers to the hosted Sprites MCP configuration
  • identify requests as non-interactive Cursor traffic
  • document that attribution is advisory analytics only
  • document why Fly-Client-Interactive is false and must not be removed or "corrected"
  • add a plain-language attribution disclosure to the plugin README
  • bump both manifests to 0.2.0 so the change is distributed

User impact

The Fly backend can distinguish calls initiated through the Cursor plugin without changing authentication, authorization, or tool behavior.

Header contract

Verified against superfly/client-signals:

  • Fly-Client-Agent: cursor matches the canonical tag in spec/markers.json, so it classifies as agent="cursor" rather than the other fallback.
  • Fly-Client-Interactive: false is the instrumentation sentinel required by spec/request-metrics.md. Without it the request classifies as {"operator": "uninstrumented", "agent": "none"} and the agent header is discarded. false is correct because Interactive means "stdout attached to a terminal," not "a human is present."
  • Fly-Client-Parent and Fly-Client-CI are omitted deliberately — the spec states Parent must not affect classification, and false-valued CI is omitted rather than sent.

Testing

  • validated the exact MCP header configuration with jq
  • git diff --check

Verification still required before merge

Config validation only proves the JSON parses — it does not prove Cursor sends the headers. Cursor has a confirmed, unfixed bug where headers in mcp.json are ignored when the server exposes RFC 9728 OAuth discovery, which https://sprites.dev/.well-known/oauth-protected-resource does. The reports center on Authorization, so it is unclear whether unrelated headers are also stripped.

This fails silently in both directions — no client warning, no server rejection, just permanently zero attributed traffic. Confirm end-to-end by installing this branch, invoking one MCP tool, and reading fly_client_signals_requests_total:

  • operator="agent", agent="cursor" — headers landed, good to merge.
  • operator="uninstrumented", agent="none" — Cursor stripped them; this PR is a no-op and needs a client-side fix or server-side inference instead.

Deployment

No backend deployment is required. The updated plugin configuration takes effect when the plugin update is distributed.

aezell added 2 commits August 4, 2026 10:36
Explain why Fly-Client-Interactive is sent as "false" and why it must
not be removed: it is the instrumentation sentinel, so a missing or
unparseable value classifies the request as uninstrumented and discards
Fly-Client-Agent along with it. Both the removal and the "correction" to
true are silent failures that zero out attribution.

Add a plain-language attribution disclosure to the plugin README, which
is what Marketplace users actually read.

Bump both manifests to 0.2.0 so the header change is distributed.
@aezell
aezell merged commit 31db271 into main Aug 4, 2026
1 check passed
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.

1 participant