@skyelight/mcp 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,84 @@ keeps working. A **patch** is a fix or a wording change. A **major** would be
11
11
  removing a tool or an argument, or changing what an existing field means, and
12
12
  there has not been one.
13
13
 
14
+ ## 0.5.1 — unreleased
15
+
16
+ ### Changed
17
+
18
+ - **Skyelight's own address.** `npx @skyelight/mcp init` registers
19
+ `https://app.skyelight.ai/mcp` by default, instead of the deployment's
20
+ `.convex.site` host, and the README gives `https://app.skyelight.ai` as
21
+ `SKYELIGHT_API_URL`. Servers registered with the old address keep
22
+ working; re-run `init` to move to the new one.
23
+
24
+ ## 0.5.0 — 2026-09-29
25
+
26
+ ### Added
27
+
28
+ - **Seven tools for working with a project's history.** `whats_new` catches
29
+ you up since you last looked, from a bookmark kept per person per project.
30
+ `project_review` returns what a project settled, for a review or hand-off
31
+ document. `decision_log` quotes the threads where decisions were made and
32
+ returns the project's rules; `save_rule` keeps a new one (owners and
33
+ admins). `find_by_source` finds feedback by the file or component the build
34
+ plugin stamped. `find_similar` checks for an existing report, and
35
+ `merge_items` folds duplicates together. Needs a deployment with the
36
+ `/api/v1/review`, `/whats-new`, `/source`, `/similar`, `/decisions`,
37
+ `/rules` and `/items/merge` routes. `project_review` and `decision_log`
38
+ are paged (`section`, `offset`) so a result fits in an agent's context.
39
+
40
+ - **Hosted server speaks MCP 2026-07-28.** Not in this package (its stdio
41
+ server keeps the `initialize` handshake), but worth knowing: the hosted
42
+ `/mcp` now answers `server/discover` and modern requests in that
43
+ revision's shape, which ChatGPT requires.
44
+
45
+ - **The Skyelight mark and title.** `serverInfo` carries `title` and
46
+ `icons`, so clients that show a server's icon show ours. Each tool also
47
+ carries ChatGPT's status lines for while it runs and once it is done.
48
+
49
+ - **Tool annotations.** Every tool says whether it only reads
50
+ (`readOnlyHint`), and `merge_items` that it hides items
51
+ (`destructiveHint`), so clients can ask before a write.
52
+
53
+ - **Assigning and mentioning people (SKY-324).** `list_members` returns the
54
+ workspace's people. `assign` hands an item to one of them, or unassigns it
55
+ with `null`. `create_item` takes `assignee` and `mentions`, and
56
+ `post_update` takes `mentions`. People can be named by name, email, id or
57
+ `me`; an ambiguous name is refused with the candidates. They are notified
58
+ the way an assignment or a mention in the app notifies them. Needs a
59
+ deployment with the `/api/v1/members` and `/api/v1/items/assign` routes.
60
+
61
+ - **A picker when several agents are installed.** `init` detected them all
62
+ along and then refused to choose: it printed the list and exited 1, as
63
+ though having two editors were an error. Most developers have more than
64
+ one, so the commonest case on the first command anybody runs was a dead
65
+ end. It asks now, with `a` for every agent at once.
66
+ - **`--client all`**, the same thing without the question.
67
+ - **`npx @skyelight/mcp remove`**, which there was no command for at all —
68
+ uninstalling meant knowing where five different agents keep their config
69
+ and editing each by hand. Defaults to every agent rather than asking
70
+ which one to forget, takes Codex's `oauth` sub-table with the server
71
+ (removing only the first leaves a table that parses as a server with no
72
+ url), and leaves `mcpServers` in place when it empties: it is the
73
+ client's key, not ours.
74
+ - **Skyelight's own colours**, from `--accent` in the app's own tokens so the
75
+ terminal and the product are one blue rather than two that were each
76
+ chosen to look right alone. Everything degrades: 24-bit where `COLORTERM`
77
+ says so, the 256-colour cube otherwise, plain text under `NO_COLOR`, when
78
+ stdout is piped, or under `TERM=dumb`. Marks fall back to ASCII where the
79
+ locale is not UTF-8, because a console that cannot draw a glyph renders
80
+ corruption rather than plainness.
81
+ - **The deployment in the header.** Running this against the wrong one is the
82
+ mistake with the least visible symptom — everything succeeds, against
83
+ somebody else's data — and nothing said which one before it happened.
84
+
85
+ ### Changed
86
+
87
+ - **The help screen** lists the agents, the flags and the environment
88
+ variables in aligned columns, rather than two example commands.
89
+ - **Registering several agents** reports one summary at the end, telling
90
+ "added" from "already set up" instead of reporting neither.
91
+
14
92
  ## 0.4.1 — 2026-09-19
15
93
 
16
94
  ### Fixed
package/README.md CHANGED
@@ -4,13 +4,18 @@ An MCP server that lets a coding agent read the feedback people left on your
4
4
  running app — the thread, the page, and the element they were pointing at —
5
5
  and report back on it when the work is done.
6
6
 
7
- Works with anything that speaks MCP over stdio: Claude Code, Cursor, Grok, Codex.
7
+ Two ways to connect, with the same seventeen tools either way:
8
8
 
9
- ## Setup
9
+ - **Remote, with OAuth** — the default. Your agent talks to Skyelight over
10
+ HTTP and you sign in once in the browser. Nothing is pasted and no key is
11
+ stored on disk.
12
+ - **Local, with a token** — this package runs as a stdio server on your
13
+ machine and carries a personal token. For clients or machines where the
14
+ browser sign-in is not an option.
10
15
 
11
- **Get a personal access token.** In the Skyelight web app, go to your account
12
- settings → **API Keys** → create one. It is shown once, and you can give
13
- it an expiry.
16
+ Coding agents need a paid seat (owner, admin or collaborator) on a Pro plan or
17
+ above. A reviewer seat reads and comments in the web app but does not carry
18
+ agent tools.
14
19
 
15
20
  ## The short way
16
21
 
@@ -18,19 +23,26 @@ it an expiry.
18
23
  npx @skyelight/mcp init
19
24
  ```
20
25
 
21
- Finds your coding agent, registers the remote server with it, and leaves the
22
- sign-in to OAuth — nothing is pasted and no key is stored on disk. It shows
23
- what it will change and waits; `--yes` skips that once you have read it.
26
+ Finds your coding agents, registers Skyelight's remote server with them, and
27
+ leaves the sign-in to OAuth — the first time the agent connects it opens a
28
+ browser and you approve it there. It shows what it will change and waits;
29
+ `--yes` skips that once you have read it.
24
30
 
25
- It knows Claude Code, Cursor, Grok, Codex and Windsurf. Name one with
26
- `--client cursor` when more than one is installed, and point at another deployment with
27
- `SKYELIGHT_URL=https://…`. The deployment tells the installer its own MCP URL
28
- and OAuth client over `/mcp/install-config`, so this package holds no
29
- environment-specific constants.
31
+ It knows Claude Code, Cursor, Grok, Codex and Windsurf. With several
32
+ installed it asks which; `--client cursor` or `--client all` answers in
33
+ advance. `npx @skyelight/mcp remove` takes the entry out again. Point at
34
+ another deployment with `SKYELIGHT_URL=https://…`; the deployment tells the
35
+ installer its own MCP URL and OAuth client over `/mcp/install-config`, so this
36
+ package holds no environment-specific constants.
30
37
 
31
- The token is yours, not a service account's: anything the agent writes is
32
- attributed to you, marked with the tool it came through. That is deliberate —
33
- see [Who a write belongs to](#who-a-write-belongs-to).
38
+ The same setup, with a snippet per client, is in the Skyelight web app under
39
+ account settings → **Coding Agents**.
40
+
41
+ ## With a token
42
+
43
+ **Get a personal access token.** In the Skyelight web app, go to account
44
+ settings → **API Keys** → create one. It is shown once, belongs to the
45
+ organization you create it in, and can be given an expiry.
34
46
 
35
47
  Then add the server to your client:
36
48
 
@@ -41,7 +53,7 @@ Then add the server to your client:
41
53
  "command": "npx",
42
54
  "args": ["-y", "@skyelight/mcp"],
43
55
  "env": {
44
- "SKYELIGHT_API_URL": "https://<deployment>.convex.site",
56
+ "SKYELIGHT_API_URL": "https://app.skyelight.ai",
45
57
  "SKYELIGHT_API_TOKEN": "sky_..."
46
58
  }
47
59
  }
@@ -53,14 +65,14 @@ Claude Code users can skip the file:
53
65
 
54
66
  ```bash
55
67
  claude mcp add skyelight \
56
- --env SKYELIGHT_API_URL=https://<deployment>.convex.site \
68
+ --env SKYELIGHT_API_URL=https://app.skyelight.ai \
57
69
  --env SKYELIGHT_API_TOKEN=sky_... \
58
70
  -- npx -y @skyelight/mcp
59
71
  ```
60
72
 
61
- The API host is the Convex deployment with `.convex.cloud` swapped for
62
- `.convex.site` — Convex serves HTTP actions from the latter. The web app shows
63
- the right one when you create the token.
73
+ `SKYELIGHT_API_URL` is `https://app.skyelight.ai`, the same host as the MCP
74
+ URL on the **Coding Agents** page (`https://app.skyelight.ai/mcp`), without
75
+ `/mcp`. A deployment's `.convex.site` host also works.
64
76
 
65
77
  ### Credentials
66
78
 
@@ -72,14 +84,16 @@ Checked in order, so an existing setup keeps working:
72
84
 
73
85
  ### Binding a repo to a project
74
86
 
75
- If you can reach several projects, drop a `.skyelight.json` at the repo root:
87
+ With the local server, if you can reach several projects, drop a
88
+ `.skyelight.json` at the repo root:
76
89
 
77
90
  ```json
78
91
  { "projectId": "j57abc...", "projectName": "Checkout rebuild" }
79
92
  ```
80
93
 
81
- Tools then default to that project and nobody has to pass an id. Without it,
82
- `list_items` will ask you to call `list_projects` first rather than guess.
94
+ Tools then default to that project and nobody has to pass an id. Without it
95
+ (and always on the remote server), `list_items` asks for a project and the
96
+ agent calls `list_projects` first rather than guess.
83
97
 
84
98
  ## Tools
85
99
 
@@ -93,6 +107,15 @@ Tools then default to that project and nobody has to pass an id. Without it,
93
107
  | `post_update` | Report back on the thread the feedback came from. |
94
108
  | `create_item` | Raise a new item — an audit finding, something you noticed. |
95
109
  | `set_status` | Move an item to open, deferred or resolved. |
110
+ | `list_members` | Who is in the workspace, so you can name an assignee or a mention. |
111
+ | `assign` | Hand an item to a person, or unassign it. |
112
+ | `whats_new` | What changed since you last looked, from your own bookmark. |
113
+ | `project_review` | Where a project landed, for a wrap-up or hand-off document. |
114
+ | `decision_log` | What the team decided in its threads, quoted, and its current rules. |
115
+ | `save_rule` | Keep an agreed rule in the project context (owners and admins). |
116
+ | `find_by_source` | Feedback on a file or component before you edit it, or the hot spots. |
117
+ | `find_similar` | Check for an existing report before creating one. |
118
+ | `merge_items` | Fold duplicate items into one. |
96
119
 
97
120
  `list_items` leads with a summary — totals, breakdown by type and by page — so
98
121
  an agent can tell you the shape of the work before pulling any of it. Rows are
@@ -164,31 +187,24 @@ deployment, which branch the code it wants is actually on.
164
187
 
165
188
  ## Who a write belongs to
166
189
 
167
- Every write is **a person's**. A token carries your access, so a reply the
168
- agent posts is yours, with the tool it came through shown as a mark beside the
169
- timestamp rather than as the author.
170
-
171
- There is no service-account mode. Synthetic agent identities existed and were
172
- removed: a workspace should not grow a member for every tool somebody plugs in,
173
- and a reply nobody is accountable for is worse than one attributed plainly.
190
+ Every write is **a person's**. Your sign-in or token carries your access, so a
191
+ reply the agent posts is yours. Over the remote server, the editor it came
192
+ through is shown as a mark beside the timestamp rather than as the author.
174
193
 
175
- Workspace API keys (`sk_live_...`) used to be a second way in, for scripts and
176
- CI. They are gone — a credential that outlives whoever minted it is one nobody
177
- is accountable for, and the write tools already refused them for exactly that
178
- reason. A personal token is the only credential the API accepts.
194
+ There is no service-account mode, and workspace API keys (`sk_live_...`) no
195
+ longer work. The API accepts two credentials, both of which are you: an OAuth
196
+ sign-in and a personal token (`sky_...`).
179
197
 
180
198
  ## Permissions
181
199
 
182
- The server enforces nothing; the API does. Whatever your account can do in the
183
- web app, the agent can do through your token, and nothing more:
184
-
185
- - **Owner, admin, collaborator and reviewer** all read and write — a reviewer
186
- can reply on a thread and raise one, which is what a client seat is for.
187
- - A **reviewer** can only `set_status` on threads they opened themselves. Every
188
- other role can move anyone's. It is the rule the web app already applies:
189
- closing someone else's report is a decision about their report.
190
- - A **project-bound** credential answers 404 outside its project rather than
191
- reporting that something exists but is forbidden.
192
- - Workspaces your plan or seat does not cover are **listed and marked** rather
193
- than hidden, with the reason, so a client can see the workspace they know
194
- exists and be told which gate closed instead of being told it is missing.
200
+ The server enforces nothing; the API does. The agent can do what your account
201
+ can do in that workspace, and nothing more:
202
+
203
+ - Agent tools need a **paid seat** (owner, admin or collaborator) in an
204
+ organization on **Pro or above**. A reviewer seat, or a Free plan, is
205
+ refused with the reason — the workspace is listed and marked rather than
206
+ hidden, so you are told which gate closed instead of being told it does not
207
+ exist.
208
+ - Owners, admins and collaborators read, reply, raise items and change any
209
+ thread's status.
210
+ - A token only reaches workspaces in the organization it was created in.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@skyelight/mcp",
3
- "version": "0.4.1",
4
- "description": "MCP server for Skyelight \u2014 read feedback items from your project as an agent",
3
+ "version": "0.5.1",
4
+ "description": "MCP server for Skyelight — read feedback items from your project as an agent",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "skyelight-mcp": "./src/index.js"
@@ -26,15 +26,7 @@
26
26
  "feedback"
27
27
  ],
28
28
  "license": "MIT",
29
- "repository": {
30
- "type": "git",
31
- "url": "git+https://github.com/plastrlab/skyelight.git",
32
- "directory": "integrations/skyelight-mcp"
33
- },
34
- "homepage": "https://github.com/plastrlab/skyelight/tree/main/integrations/skyelight-mcp#readme",
35
- "bugs": {
36
- "url": "https://github.com/plastrlab/skyelight/issues"
37
- },
29
+ "homepage": "https://skyelight.ai",
38
30
  "publishConfig": {
39
31
  "access": "public"
40
32
  }
package/src/brand.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /** Types for brand.js; see tools.d.ts for why the package ships these. */
2
+
3
+ export declare const ICONS: Array<{
4
+ src: string;
5
+ mimeType: string;
6
+ sizes: string[];
7
+ }>;
8
+ export declare const ICON_PNG_BASE64: string;
9
+ export declare const STATUS: Record<string, [string, string]>;
package/src/brand.js ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * How Skyelight shows up inside an agent: its icon, and the words ChatGPT
3
+ * shows while a tool runs.
4
+ *
5
+ * The icon is embedded rather than linked. A link would name one host, and
6
+ * the same package serves QA, production and local deployments; a data URI
7
+ * is the same everywhere and needs no request. The mark from
8
+ * `public/favicon.png` (258 by 258), about 4 KB.
9
+ *
10
+ * Nothing here can animate while a tool runs. Clients draw their own
11
+ * loading state and give a server no way into it; the icon sits beside the
12
+ * connector and its tool calls, and ChatGPT's status line is the only text
13
+ * a server gets to put in that moment.
14
+ */
15
+
16
+ /** The mark itself, for a server that serves it at a URL instead. */
17
+ export const ICON_PNG_BASE64 =
18
+ "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";
19
+
20
+ /**
21
+ * Embedded, for the stdio package, which runs on the person's machine and
22
+ * has no URL of its own. The hosted server links to `/mcp/icon.png`
23
+ * instead, because revision 2026-07-28 repeats the server's identity in
24
+ * every result and an embedded image would ride along on each one.
25
+ */
26
+ export const ICONS = [
27
+ {
28
+ src: `data:image/png;base64,${ICON_PNG_BASE64}`,
29
+ mimeType: "image/png",
30
+ sizes: ["258x258"],
31
+ },
32
+ ];
33
+
34
+ /**
35
+ * ChatGPT's line under a running tool, then under a finished one
36
+ * (`openai/toolInvocation/invoking` and `invoked`, 64 characters at most).
37
+ * Other clients ignore these keys. Present tense while it runs, past once
38
+ * done, and never a number: the text is fixed per tool, not per call.
39
+ */
40
+ export const STATUS = {
41
+ list_workspaces: [
42
+ "Looking up your Skyelight workspaces",
43
+ "Found your workspaces",
44
+ ],
45
+ list_projects: ["Looking up Skyelight projects", "Found your projects"],
46
+ list_items: ["Reading Skyelight feedback", "Read the feedback"],
47
+ search_items: ["Searching Skyelight feedback", "Searched the feedback"],
48
+ get_item: ["Opening the thread", "Opened the thread"],
49
+ list_members: ["Looking up the team", "Found the team"],
50
+ post_update: ["Replying on the thread", "Replied on the thread"],
51
+ create_item: ["Creating a thread", "Created the thread"],
52
+ set_status: ["Updating the thread", "Updated the thread"],
53
+ assign: ["Assigning the thread", "Assigned the thread"],
54
+ project_review: [
55
+ "Reading the project's history",
56
+ "Read the project's history",
57
+ ],
58
+ whats_new: ["Checking what's new", "Caught up"],
59
+ find_by_source: ["Finding feedback by file", "Found feedback by file"],
60
+ find_similar: ["Checking for similar reports", "Checked for similar reports"],
61
+ merge_items: ["Merging duplicates", "Merged the duplicates"],
62
+ decision_log: ["Reading the decisions", "Read the decisions"],
63
+ save_rule: ["Saving the rule", "Saved the rule"],
64
+ };