Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
},
"metadata": {
"description": "Manage remote Sprites development environments from Cursor.",
"version": "0.1.0"
"version": "0.2.0"
},
"plugins": [
{
Expand Down
37 changes: 37 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,43 @@ This repository is a Cursor Marketplace plugin. It bundles the hosted **Sprites

On first use, Cursor prompts you to authorize with Sprites via OAuth.

## Usage attribution

The plugin marks its hosted MCP requests as Cursor-driven using the coarse,
privacy-safe [`client-signals`](https://github.com/superfly/client-signals)
headers. The marker is advisory analytics only and is never used for access
control, gating, or rate-limiting.

`plugins/sprites/mcp.json` sets two static headers:

| Header | Value | Why |
|---|---|---|
| `Fly-Client-Agent` | `cursor` | The canonical agent tag from [`spec/markers.json`](https://github.com/superfly/client-signals/blob/main/spec/markers.json). Any other spelling would be classified as `other`. |
| `Fly-Client-Interactive` | `false` | Required. See below. |

**Don't remove `Fly-Client-Interactive`, and don't "correct" it to `true`.**
Both are easy mistakes to make, and both are silent:

- It is the *instrumentation sentinel*. Per
[`spec/request-metrics.md`](https://github.com/superfly/client-signals/blob/main/spec/request-metrics.md),
a request missing this header — or carrying an unparseable value — classifies
as `{"operator": "uninstrumented", "agent": "none"}`, and `Fly-Client-Agent`
is discarded along with it. Dropping this header zeroes out all attribution.
- `false` is correct despite Cursor being human-driven. `Interactive` means
"stdout looks attached to a terminal," not "a human is present." These
requests originate from Cursor's MCP client, where no terminal is attached.
The value is also inert for reporting: operator precedence is
`ci > agent > interactive`, so a present `Fly-Client-Agent` yields
`operator="agent"` either way.

`Fly-Client-Parent` and `Fly-Client-CI` are deliberately omitted — the spec
states that `Parent` must not affect classification, and false-valued `CI` is
omitted rather than sent.

To confirm attribution is arriving, check `fly_client_signals_requests_total`
server-side: `operator="agent", agent="cursor"` means the headers landed;
`operator="uninstrumented", agent="none"` means the client stripped them.

## What it provides

- **`plugins/sprites/mcp.json`** — the remote Sprites MCP server (`https://sprites.dev/mcp`).
Expand Down
2 changes: 1 addition & 1 deletion plugins/sprites/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "sprites",
"displayName": "Sprites",
"version": "0.1.0",
"version": "0.2.0",
"description": "Manage Sprites — remote, isolated development environments — from Cursor: create, exec, run services, and checkpoint.",
"author": {
"name": "Fly.io",
Expand Down
6 changes: 6 additions & 0 deletions plugins/sprites/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ With this plugin enabled, you can ask Cursor to:
- **MCP server** (`mcp.json`) — connects Cursor to `https://sprites.dev/mcp` (remote, OAuth-authenticated).
- **Skill** (`skills/sprites`) — workflow and safety guidance for operating sprites from Cursor.

## Usage attribution

This plugin tags its requests to the Sprites MCP server as coming from Cursor, using the coarse, privacy-safe [`client-signals`](https://github.com/superfly/client-signals) headers. Two fixed values are sent — `cursor` as the client name, and a flag marking the request as non-terminal — so Fly.io can estimate how much Sprites traffic comes through Cursor.

Nothing user-, machine-, or repository-specific is sent, the values never vary between installs, and the tag is advisory analytics only: it is never used for authentication, authorization, access control, gating, or rate-limiting.

## Learn more

- Sprites: https://sprites.dev
Expand Down
6 changes: 5 additions & 1 deletion plugins/sprites/mcp.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
{
"mcpServers": {
"sprites": {
"url": "https://sprites.dev/mcp"
"url": "https://sprites.dev/mcp",
"headers": {
"Fly-Client-Interactive": "false",
"Fly-Client-Agent": "cursor"
}
}
}
}
Loading