@skyelight/mcp 0.4.0 → 0.5.0
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 +189 -0
- package/README.md +108 -52
- package/package.json +4 -11
- package/src/brand.d.ts +9 -0
- package/src/brand.js +64 -0
- package/src/cli.js +354 -81
- package/src/client.js +9 -0
- package/src/config.js +5 -7
- package/src/index.js +11 -1
- package/src/insights.d.ts +15 -0
- package/src/insights.js +688 -0
- package/src/install.js +59 -2
- package/src/server.js +11 -2
- package/src/theme.js +120 -0
- package/src/tools.d.ts +10 -0
- package/src/tools.js +236 -14
- package/src/version.js +1 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable changes to `@skyelight/mcp`. Dates are npm publish dates.
|
|
4
|
+
|
|
5
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this package follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
What a version number means here: the tools are the interface. A **minor** is a
|
|
9
|
+
new tool, a new argument, or a new field in a result — an agent that ignores it
|
|
10
|
+
keeps working. A **patch** is a fix or a wording change. A **major** would be
|
|
11
|
+
removing a tool or an argument, or changing what an existing field means, and
|
|
12
|
+
there has not been one.
|
|
13
|
+
|
|
14
|
+
## 0.5.0 — unreleased
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **Seven tools for working with a project's history.** `whats_new` catches
|
|
19
|
+
you up since you last looked, from a bookmark kept per person per project.
|
|
20
|
+
`project_review` returns what a project settled, for a review or hand-off
|
|
21
|
+
document. `decision_log` quotes the threads where decisions were made and
|
|
22
|
+
returns the project's rules; `save_rule` keeps a new one (owners and
|
|
23
|
+
admins). `find_by_source` finds feedback by the file or component the build
|
|
24
|
+
plugin stamped. `find_similar` checks for an existing report, and
|
|
25
|
+
`merge_items` folds duplicates together. Needs a deployment with the
|
|
26
|
+
`/api/v1/review`, `/whats-new`, `/source`, `/similar`, `/decisions`,
|
|
27
|
+
`/rules` and `/items/merge` routes. `project_review` and `decision_log`
|
|
28
|
+
are paged (`section`, `offset`) so a result fits in an agent's context.
|
|
29
|
+
|
|
30
|
+
- **Hosted server speaks MCP 2026-07-28.** Not in this package (its stdio
|
|
31
|
+
server keeps the `initialize` handshake), but worth knowing: the hosted
|
|
32
|
+
`/mcp` now answers `server/discover` and modern requests in that
|
|
33
|
+
revision's shape, which ChatGPT requires.
|
|
34
|
+
|
|
35
|
+
- **The Skyelight mark and title.** `serverInfo` carries `title` and
|
|
36
|
+
`icons`, so clients that show a server's icon show ours. Each tool also
|
|
37
|
+
carries ChatGPT's status lines for while it runs and once it is done.
|
|
38
|
+
|
|
39
|
+
- **Tool annotations.** Every tool says whether it only reads
|
|
40
|
+
(`readOnlyHint`), and `merge_items` that it hides items
|
|
41
|
+
(`destructiveHint`), so clients can ask before a write.
|
|
42
|
+
|
|
43
|
+
- **Assigning and mentioning people (SKY-324).** `list_members` returns the
|
|
44
|
+
workspace's people. `assign` hands an item to one of them, or unassigns it
|
|
45
|
+
with `null`. `create_item` takes `assignee` and `mentions`, and
|
|
46
|
+
`post_update` takes `mentions`. People can be named by name, email, id or
|
|
47
|
+
`me`; an ambiguous name is refused with the candidates. They are notified
|
|
48
|
+
the way an assignment or a mention in the app notifies them. Needs a
|
|
49
|
+
deployment with the `/api/v1/members` and `/api/v1/items/assign` routes.
|
|
50
|
+
|
|
51
|
+
- **A picker when several agents are installed.** `init` detected them all
|
|
52
|
+
along and then refused to choose: it printed the list and exited 1, as
|
|
53
|
+
though having two editors were an error. Most developers have more than
|
|
54
|
+
one, so the commonest case on the first command anybody runs was a dead
|
|
55
|
+
end. It asks now, with `a` for every agent at once.
|
|
56
|
+
- **`--client all`**, the same thing without the question.
|
|
57
|
+
- **`npx @skyelight/mcp remove`**, which there was no command for at all —
|
|
58
|
+
uninstalling meant knowing where five different agents keep their config
|
|
59
|
+
and editing each by hand. Defaults to every agent rather than asking
|
|
60
|
+
which one to forget, takes Codex's `oauth` sub-table with the server
|
|
61
|
+
(removing only the first leaves a table that parses as a server with no
|
|
62
|
+
url), and leaves `mcpServers` in place when it empties: it is the
|
|
63
|
+
client's key, not ours.
|
|
64
|
+
- **Skyelight's own colours**, from `--accent` in the app's own tokens so the
|
|
65
|
+
terminal and the product are one blue rather than two that were each
|
|
66
|
+
chosen to look right alone. Everything degrades: 24-bit where `COLORTERM`
|
|
67
|
+
says so, the 256-colour cube otherwise, plain text under `NO_COLOR`, when
|
|
68
|
+
stdout is piped, or under `TERM=dumb`. Marks fall back to ASCII where the
|
|
69
|
+
locale is not UTF-8, because a console that cannot draw a glyph renders
|
|
70
|
+
corruption rather than plainness.
|
|
71
|
+
- **The deployment in the header.** Running this against the wrong one is the
|
|
72
|
+
mistake with the least visible symptom — everything succeeds, against
|
|
73
|
+
somebody else's data — and nothing said which one before it happened.
|
|
74
|
+
|
|
75
|
+
### Changed
|
|
76
|
+
|
|
77
|
+
- **The help screen** lists the agents, the flags and the environment
|
|
78
|
+
variables in aligned columns, rather than two example commands.
|
|
79
|
+
- **Registering several agents** reports one summary at the end, telling
|
|
80
|
+
"added" from "already set up" instead of reporting neither.
|
|
81
|
+
|
|
82
|
+
## 0.4.1 — 2026-09-19
|
|
83
|
+
|
|
84
|
+
### Fixed
|
|
85
|
+
|
|
86
|
+
- **Two wrong permission claims in the README**, which is what npm serves on
|
|
87
|
+
the package page. It said a reviewer "reads and cannot write" — a reviewer
|
|
88
|
+
replies and raises items like every other role. It also said resolving stays
|
|
89
|
+
a person's call "for a thread you do not own", which read as a rule for
|
|
90
|
+
everyone; the actual rule touches only reviewers, who may move threads they
|
|
91
|
+
opened and nobody else's. Both are now taken from `convex/mcp/writes.ts`.
|
|
92
|
+
- Documented the 0.4.0 tool surface, which the README had not caught up with:
|
|
93
|
+
the image blocks, merged duplicates, `assignee: "me"`, and the read ceiling.
|
|
94
|
+
|
|
95
|
+
### Added
|
|
96
|
+
|
|
97
|
+
- This changelog, and it ships in the package.
|
|
98
|
+
|
|
99
|
+
## 0.4.0 — 2026-09-19
|
|
100
|
+
|
|
101
|
+
Nine things the Skyelight web app had shown a person for months that the tool
|
|
102
|
+
results did not carry.
|
|
103
|
+
|
|
104
|
+
### Added
|
|
105
|
+
|
|
106
|
+
- **`get_item` returns the pictures as pictures.** The screenshot taken when
|
|
107
|
+
the pin was left, and any images people attached to the thread, come back as
|
|
108
|
+
MCP `image` content blocks instead of links no agent tool can open. Capped at
|
|
109
|
+
four per call and 4MB each; anything skipped is named with its link and the
|
|
110
|
+
reason. The stdio transport fetches the storage URL, and the remote endpoint
|
|
111
|
+
reads its own storage directly.
|
|
112
|
+
- **Merged duplicates leave the list**, and the item they were merged into
|
|
113
|
+
carries `reportCount`. Five reports of one problem used to read as five bugs.
|
|
114
|
+
- **`list_workspaces` returns `you`** — the caller's own user id and name — and
|
|
115
|
+
`list_items` accepts `assignee: "me"`. "What is assigned to me" had no way to
|
|
116
|
+
be asked before.
|
|
117
|
+
- **`get_item` carries `linear`**, naming the issue a thread was handed to and
|
|
118
|
+
who it was delegated to, so an agent stops starting work a Linear-hosted
|
|
119
|
+
agent is already finishing.
|
|
120
|
+
- **`get_item` carries `attachments` and `reactions`.** Attachments cover the
|
|
121
|
+
thread and its replies, in reading order; reactions are counted by emoji
|
|
122
|
+
rather than listed one row per person.
|
|
123
|
+
- **List rows use the classifier's one-line summary** where there is one, with
|
|
124
|
+
`excerptSource` saying whether the line is a machine summary or the
|
|
125
|
+
reporter's own words. Rows used to be the first 140 characters of whatever
|
|
126
|
+
somebody typed.
|
|
127
|
+
- **The 2,000-item read ceiling states itself.** `capped` is set when it binds
|
|
128
|
+
and the narration calls the counts a floor rather than a total. The scan also
|
|
129
|
+
reads newest-first, so the items it keeps when it binds are the live ones.
|
|
130
|
+
|
|
131
|
+
### Fixed
|
|
132
|
+
|
|
133
|
+
- `set_status` returned a bare string where the server expected `{ text, data }`,
|
|
134
|
+
so a successful move answered with an empty content block and the model had
|
|
135
|
+
no way to tell it had worked.
|
|
136
|
+
- `initialize` reported `0.1.0`. Both transports carried their own stale copy
|
|
137
|
+
of that literal while the package shipped 0.3.0. There is one `VERSION`
|
|
138
|
+
constant now, and a test asserts it matches `package.json`.
|
|
139
|
+
- `status=deferred` was refused with a 400 by the API the stdio transport calls,
|
|
140
|
+
although every tool schema has offered `deferred` since it existed.
|
|
141
|
+
|
|
142
|
+
## 0.3.0 — 2026-09-17
|
|
143
|
+
|
|
144
|
+
### Added
|
|
145
|
+
|
|
146
|
+
- Grok in the installer's client list, and a README that lists it.
|
|
147
|
+
|
|
148
|
+
## 0.2.0 — 2026-09-09
|
|
149
|
+
|
|
150
|
+
### Added
|
|
151
|
+
|
|
152
|
+
- `npx @skyelight/mcp init` — finds the coding agent, registers the remote
|
|
153
|
+
server with it, and leaves sign-in to OAuth, so nothing is pasted and no key
|
|
154
|
+
is stored on disk.
|
|
155
|
+
- The `ui://` item card, for clients that can render an MCP Apps resource. The
|
|
156
|
+
text result is complete on its own, so the card is strictly additive.
|
|
157
|
+
|
|
158
|
+
## 0.1.4 — 2026-09-09
|
|
159
|
+
|
|
160
|
+
### Added
|
|
161
|
+
|
|
162
|
+
- The component that rendered the pinned element, where `@skyelight/build`
|
|
163
|
+
stamped it.
|
|
164
|
+
|
|
165
|
+
## 0.1.3 — 2026-09-09
|
|
166
|
+
|
|
167
|
+
### Added
|
|
168
|
+
|
|
169
|
+
- Projects sort by real activity rather than by when the project record last
|
|
170
|
+
changed, so "anything new here?" gets a true answer.
|
|
171
|
+
|
|
172
|
+
## 0.1.2 — 2026-09-08
|
|
173
|
+
|
|
174
|
+
### Added
|
|
175
|
+
|
|
176
|
+
- The source file and line behind a pin, and a repo permalink pinned to the
|
|
177
|
+
commit the page was built from.
|
|
178
|
+
|
|
179
|
+
## 0.1.1 — 2026-09-08
|
|
180
|
+
|
|
181
|
+
### Fixed
|
|
182
|
+
|
|
183
|
+
- The README npm was serving.
|
|
184
|
+
|
|
185
|
+
## 0.1.0 — 2026-09-08
|
|
186
|
+
|
|
187
|
+
First release. An MCP server over stdio that reads the feedback people left on
|
|
188
|
+
a running app — the thread, the page, the element they pointed at — and reports
|
|
189
|
+
back on it (SKY-273).
|
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
|
-
|
|
7
|
+
Two ways to connect, with the same seventeen tools either way:
|
|
8
8
|
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
22
|
-
sign-in to OAuth —
|
|
23
|
-
|
|
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.
|
|
26
|
-
`--client cursor`
|
|
27
|
-
`
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
|
@@ -58,9 +70,8 @@ claude mcp add skyelight \
|
|
|
58
70
|
-- npx -y @skyelight/mcp
|
|
59
71
|
```
|
|
60
72
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
the right one when you create the token.
|
|
73
|
+
`SKYELIGHT_API_URL` is your Skyelight deployment's `.convex.site` host — the
|
|
74
|
+
same host the MCP URL on the **Coding Agents** page uses, without `/mcp`.
|
|
64
75
|
|
|
65
76
|
### Credentials
|
|
66
77
|
|
|
@@ -72,32 +83,51 @@ Checked in order, so an existing setup keeps working:
|
|
|
72
83
|
|
|
73
84
|
### Binding a repo to a project
|
|
74
85
|
|
|
75
|
-
|
|
86
|
+
With the local server, if you can reach several projects, drop a
|
|
87
|
+
`.skyelight.json` at the repo root:
|
|
76
88
|
|
|
77
89
|
```json
|
|
78
90
|
{ "projectId": "j57abc...", "projectName": "Checkout rebuild" }
|
|
79
91
|
```
|
|
80
92
|
|
|
81
|
-
Tools then default to that project and nobody has to pass an id. Without it
|
|
82
|
-
|
|
93
|
+
Tools then default to that project and nobody has to pass an id. Without it
|
|
94
|
+
(and always on the remote server), `list_items` asks for a project and the
|
|
95
|
+
agent calls `list_projects` first rather than guess.
|
|
83
96
|
|
|
84
97
|
## Tools
|
|
85
98
|
|
|
86
|
-
| Tool | What it is for
|
|
87
|
-
| ----------------- |
|
|
88
|
-
| `list_workspaces` | Which workspaces this credential can reach.
|
|
89
|
-
| `list_projects` | The projects inside them, with the ids the other tools take.
|
|
90
|
-
| `list_items` | What is outstanding. Filter by page, type, status, assignee.
|
|
91
|
-
| `search_items` | Find items whose thread mentions some text, replies included.
|
|
92
|
-
| `get_item` | Everything needed to work one item: thread, page, anchor, code. |
|
|
93
|
-
| `post_update` | Report back on the thread the feedback came from.
|
|
94
|
-
| `create_item` | Raise a new item — an audit finding, something you noticed.
|
|
95
|
-
| `set_status` | Move an item to open, deferred or resolved.
|
|
99
|
+
| Tool | What it is for |
|
|
100
|
+
| ----------------- | ----------------------------------------------------------------------- |
|
|
101
|
+
| `list_workspaces` | Which workspaces this credential can reach, and who you are. |
|
|
102
|
+
| `list_projects` | The projects inside them, with the ids the other tools take. |
|
|
103
|
+
| `list_items` | What is outstanding. Filter by page, type, status, assignee. |
|
|
104
|
+
| `search_items` | Find items whose thread mentions some text, replies included. |
|
|
105
|
+
| `get_item` | Everything needed to work one item: thread, page, anchor, code, images. |
|
|
106
|
+
| `post_update` | Report back on the thread the feedback came from. |
|
|
107
|
+
| `create_item` | Raise a new item — an audit finding, something you noticed. |
|
|
108
|
+
| `set_status` | Move an item to open, deferred or resolved. |
|
|
109
|
+
| `list_members` | Who is in the workspace, so you can name an assignee or a mention. |
|
|
110
|
+
| `assign` | Hand an item to a person, or unassign it. |
|
|
111
|
+
| `whats_new` | What changed since you last looked, from your own bookmark. |
|
|
112
|
+
| `project_review` | Where a project landed, for a wrap-up or hand-off document. |
|
|
113
|
+
| `decision_log` | What the team decided in its threads, quoted, and its current rules. |
|
|
114
|
+
| `save_rule` | Keep an agreed rule in the project context (owners and admins). |
|
|
115
|
+
| `find_by_source` | Feedback on a file or component before you edit it, or the hot spots. |
|
|
116
|
+
| `find_similar` | Check for an existing report before creating one. |
|
|
117
|
+
| `merge_items` | Fold duplicate items into one. |
|
|
96
118
|
|
|
97
119
|
`list_items` leads with a summary — totals, breakdown by type and by page — so
|
|
98
120
|
an agent can tell you the shape of the work before pulling any of it. Rows are
|
|
99
121
|
stubs; `get_item` is where the thread and the anchor live.
|
|
100
122
|
|
|
123
|
+
**"What is assigned to me."** `list_workspaces` returns your own user id, and
|
|
124
|
+
`list_items` takes `assignee: "me"`, so the most ordinary question anyone asks
|
|
125
|
+
an agent needs no id looked up by hand.
|
|
126
|
+
|
|
127
|
+
**Merged duplicates do not appear twice.** When somebody merges five reports of
|
|
128
|
+
one problem in the web app, the duplicates leave the list and the item they were
|
|
129
|
+
merged into says `5 reports`. A list that shows all five reads as five bugs.
|
|
130
|
+
|
|
101
131
|
## What the agent sees
|
|
102
132
|
|
|
103
133
|
```
|
|
@@ -107,12 +137,40 @@ Busiest pages: /checkout (8), /settings (4).
|
|
|
107
137
|
|
|
108
138
|
2 matches:
|
|
109
139
|
- The pay button does nothing on the second click
|
|
110
|
-
bug · open · /checkout · unassigned · 2 replies — id i1
|
|
140
|
+
bug · open · /checkout · unassigned · 2 replies · 5 reports — id i1
|
|
111
141
|
```
|
|
112
142
|
|
|
113
143
|
Deliberately prose rather than JSON. A tool that returns a bare array invites a
|
|
114
144
|
model to read the array out; this one invites it to summarise.
|
|
115
145
|
|
|
146
|
+
A row's line is the one-sentence summary Skyelight's classifier wrote, where
|
|
147
|
+
there is one, rather than the first 140 characters of whatever somebody typed —
|
|
148
|
+
four truncated paragraphs are not something you can choose between.
|
|
149
|
+
|
|
150
|
+
One call reads the 2,000 most recent items in a project. Past that the result
|
|
151
|
+
says so, in words, rather than presenting a slice as the total.
|
|
152
|
+
|
|
153
|
+
### The pictures
|
|
154
|
+
|
|
155
|
+
`get_item` returns the screenshot taken when the pin was left, and any images
|
|
156
|
+
people attached to the thread, as **image content blocks** — things a model can
|
|
157
|
+
actually look at, not links it cannot open.
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
Screenshot of the page when this was pinned: attached below.
|
|
161
|
+
2 images attached to this thread: also below.
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Capped at four per call. Anything too large to inline comes back as its link
|
|
165
|
+
with the reason, so a picture never disappears silently.
|
|
166
|
+
|
|
167
|
+
### What somebody else already did
|
|
168
|
+
|
|
169
|
+
`get_item` also names the Linear issue a thread was handed to, and who it was
|
|
170
|
+
delegated to, so an agent does not start work a Linear-hosted agent is
|
|
171
|
+
finishing. Reactions come back counted by emoji — a thread with one comment and
|
|
172
|
+
nine thumbs up is not a thread with one comment.
|
|
173
|
+
|
|
116
174
|
### Where the code is
|
|
117
175
|
|
|
118
176
|
If the app was built with [`@skyelight/build`](https://www.npmjs.com/package/@skyelight/build),
|
|
@@ -128,26 +186,24 @@ deployment, which branch the code it wants is actually on.
|
|
|
128
186
|
|
|
129
187
|
## Who a write belongs to
|
|
130
188
|
|
|
131
|
-
Every write is **a person's**.
|
|
132
|
-
agent posts is yours
|
|
133
|
-
timestamp rather than as the author.
|
|
189
|
+
Every write is **a person's**. Your sign-in or token carries your access, so a
|
|
190
|
+
reply the agent posts is yours. Over the remote server, the editor it came
|
|
191
|
+
through is shown as a mark beside the timestamp rather than as the author.
|
|
134
192
|
|
|
135
|
-
There is no service-account mode
|
|
136
|
-
|
|
137
|
-
and a
|
|
138
|
-
|
|
139
|
-
Workspace API keys (`sk_live_...`) used to be a second way in, for scripts and
|
|
140
|
-
CI. They are gone — a credential that outlives whoever minted it is one nobody
|
|
141
|
-
is accountable for, and the write tools already refused them for exactly that
|
|
142
|
-
reason. A personal token is the only credential the API accepts.
|
|
193
|
+
There is no service-account mode, and workspace API keys (`sk_live_...`) no
|
|
194
|
+
longer work. The API accepts two credentials, both of which are you: an OAuth
|
|
195
|
+
sign-in and a personal token (`sky_...`).
|
|
143
196
|
|
|
144
197
|
## Permissions
|
|
145
198
|
|
|
146
|
-
The server enforces nothing; the API does.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
199
|
+
The server enforces nothing; the API does. The agent can do what your account
|
|
200
|
+
can do in that workspace, and nothing more:
|
|
201
|
+
|
|
202
|
+
- Agent tools need a **paid seat** (owner, admin or collaborator) in an
|
|
203
|
+
organization on **Pro or above**. A reviewer seat, or a Free plan, is
|
|
204
|
+
refused with the reason — the workspace is listed and marked rather than
|
|
205
|
+
hidden, so you are told which gate closed instead of being told it does not
|
|
206
|
+
exist.
|
|
207
|
+
- Owners, admins and collaborators read, reply, raise items and change any
|
|
208
|
+
thread's status.
|
|
209
|
+
- 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
|
-
"description": "MCP server for Skyelight
|
|
3
|
+
"version": "0.5.0",
|
|
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"
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"LICENSE",
|
|
12
12
|
"README.md",
|
|
13
|
+
"CHANGELOG.md",
|
|
13
14
|
"src"
|
|
14
15
|
],
|
|
15
16
|
"engines": {
|
|
@@ -25,15 +26,7 @@
|
|
|
25
26
|
"feedback"
|
|
26
27
|
],
|
|
27
28
|
"license": "MIT",
|
|
28
|
-
"
|
|
29
|
-
"type": "git",
|
|
30
|
-
"url": "git+https://github.com/plastrlab/skyelight.git",
|
|
31
|
-
"directory": "integrations/skyelight-mcp"
|
|
32
|
-
},
|
|
33
|
-
"homepage": "https://github.com/plastrlab/skyelight/tree/main/integrations/skyelight-mcp#readme",
|
|
34
|
-
"bugs": {
|
|
35
|
-
"url": "https://github.com/plastrlab/skyelight/issues"
|
|
36
|
-
},
|
|
29
|
+
"homepage": "https://skyelight.ai",
|
|
37
30
|
"publishConfig": {
|
|
38
31
|
"access": "public"
|
|
39
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
|
+
"iVBORw0KGgoAAAANSUhEUgAAAQIAAAECCAYAAAAVT9lQAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaWlDQ1BEaXNwbGF5IFAzAAB4nHWQvUvDUBTFT6tS0DqIDh0cMolD1NIKdnFoKxRFMFQFq1OafgltfCQpUnETVyn4H1jBWXCwiFRwcXAQRAcR3Zw6KbhoeN6XVNoi3sfl/Ticc7lcwBtQGSv2AijplpFMxKS11Lrke4OHnlOqZrKooiwK/v276/PR9d5PiFlNu3YQ2U9cl84ul3aeAlN//V3Vn8maGv3f1EGNGRbgkYmVbYsJ3iUeMWgp4qrgvMvHgtMunzuelWSc+JZY0gpqhrhJLKc79HwHl4plrbWD2N6f1VeXxRzqUcxhEyYYilBRgQQF4X/8044/ji1yV2BQLo8CLMpESRETssTz0KFhEjJxCEHqkLhz634PrfvJbW3vFZhtcM4v2tpCAzidoZPV29p4BBgaAG7qTDVUR+qh9uZywPsJMJgChu8os2HmwiF3e38M6Hvh/GMM8B0CdpXzryPO7RqFn4Er/QcXKWq8MSlPPgAAAA50RVh0U29mdHdhcmUARmlnbWGesZZjAAAOuElEQVR4Ae3dzY4c1RXA8dOGKFEkpNkniPETYF4gbj9AFHgCzDIr8DJSiMchrBmeAPsJIIusPayyC8MDJO4oO6JEA0QRC9vNvTN1YGbcH/Vx7q1z7/3/pFIPQjDlcde/zq3uqRYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAgCsWgqYcPVkf/FTk4KnI4aZ//7LI6nc3FytBUwhBxT58sr71TGQZvnx9LXJLLg7+g57/+Wl4cqzC4+fh8fT9m4sTQbUIQUXi2f6lcMCHg/7tsL0p/Q/6XsKT5SQ8PHoeHo+YGqpCCCrQnfnjwX9XjA/+bcIT52HYHjEp1IEQFOyDJ+tlOPjvry/G/7mswpPowR9uLh4KikUIChSWAIc3RD6ZOQDXrcI+3QsTwmeC4hCCgnTXAN4Na/T3JNMSYKi4ZAj794BrCGUhBIUIEbgV/rI+lS0v+znDcqEwhKAAH/xz/e7z53IshQlPruNuOjgTuEYInPvjk/VH64ulQKlWYf/vsFTwjRA4Fa8HhItvnzq7IDgWMXCOEDgUIxD+Yh7LxbsBaxFj8FaIwanAHULgTKURUGfdZEAMnCEEjlQeAUUMHCIETjQSAUUMnCEEDjQWAUUMHCEEM2s0AooYOEEIZtR4BBQxcIAQzIQIXEEMZkYIZkAENiIGMyIEmRGBnYjBTAhBRkSgF2IwA0KQCREYhBhkRggyIAKjEIOMCEFiRGASYpAJIUiICJggBhkQgkSIgClikNgNgbnlF0TA2PnPM963UZAEITAWIxDOXo+ffEcELH33XA7++o08Dj9ffq4JsDQwpBGQbhK4+bOLDdOECMjf/nfxGJyFJ+2dkzdYJlgiBEauR0ARg2muRUARA2OEwMC2CChiMM6WCChiYIgQTLQvAooYDLMnAooYGCEEE/SNgCIG/fSMgCIGBgjBSEMjoIjBbgMjoIjBRIRghLERUMRgs5ERUMRgAkIw0NQIKGJw1cQIKGIwEiEYwCoCihhcMIqAIgYjEIKerCOgWo+BcQQUMRiIEPSQKgKq1RgkioAiBgMQgj1SR0C1FoPEEVDEoCdCsEOuCKhWYpApAooY9EAItsgdAVV7DDJHQBGDPQjBBnNFQNUag5kioIjBDoTgmrkjoGqLwcwRUMRgC0JwiZcIqFpi4CQCihhsQAg63iKgSo+BswgoYnANIRC/EVClxsBpBBQxuKT5EHiPgCotBs4joIhBp+kQlBIBVUoMComAIgbScAhKi4DyHoPCIqCaj0GTISg1AsprDAqNgGo6Bs2FoPQIKG8xKDwCqtkYNBWCWiKgvMSgkgioJmPQTAhqi4CaOwaVRUA1F4MmQlBrBNRcMag0AqqpGFQfgtojoHLHoPIIqGZiUHUIWomAyhWDRiKgmohBtSFoLQIqdQwai4CqPgZVhqDVCKhUMWg0AqrqGFQXgtYjoKxj0HgEVLUxqCoEROAqqxgQgSuqjEE1ISACm02NARHYqLoYVBECIrDb2BgQgZ2qikHxISAC/QyNARHopZoYFB0CIjBM3xgQgUGqiEGxISAC4+yLAREYpfgYFBkCIjDNthgQgUmKjkFxISACNq7HgAiYKDYGRYWACNjSGBABU0XGoJgQEIE0Xv2JyL+fEQFjxcWgiBAQgUSehu0/Yft52F4R2CoqBu5DQAQS0Qg86/75FSEG9oqJgesQEIFErkdAEYMUioiB2xAQgUS2RUARgxTcx8BlCIhAIvsioIhBCq5j4C4ERCCRvhFQxCAFtzFwFQIikMjQCChikILLGLgJARFIZGwEFDFIwV0MXISACCQyNQKKGKTgKgazh4AIJGIVAUUMUnATg1lDQAQSsY6AIgYpuIjBbCEgAomkioAiBinMHoNZQkAEEkkdAUUMUpg1BtlDQAQSyRUBRQxSmC0GWUNABBLJHQFFDFKYJQbZQkAEEpkrAooYpJA9BllCQAQSmTsCihikEGPwRojBSjK4IRkQgQS8RCD6tttg6fzkGU6ih5JB8hD86ov1R0IEbHmKgCIGKRx2MTiQxJKGIETgfhhv3hPY8RgBRQxSiDH4RBJLdo0gjjThD/BEYMdzBC7jmoG5cKDeC9cLjiWRZBNBd10AVkqJQMRkYC4cT/dTXi9IEoK4JAgPhwIbJUVAEQNrBymXCOZLA5YExkqMwGUsE0ylWiLYTwQLuS+wUXoEIiYDU90SwfxVBNMQnE8Da7krmK6GCChiYClGwPyVONuJgGnARk0RUMTATJgK3rWeCsxCwDRgpMYIKGJgJUbgrhiymwiYBqarOQKKGJgIU8FvxJBZCMI0sBSM10IEFDGwsAxT+FKMmIQg7NCbwvsGxmspAooYWHhTjNhMBAvbMaUpLUZAEYNJwvLgbTFiEgKWBSO1HAFFDKY4CNO4yW/2Tg5BtyOHgmGIwI+IwRRLMWAxESwFwxCBFxGDsZZiwCIEtwX9EYHtiMFg4TrB62JgcgjWF29uQB9EYD9iMNShxbsMLSYCbkPWBxHojxgMdSgTTQpBVyImgn2IwHDEYIjJJ+OpE8GhYDciMB4x6Gv2pQHTwC5EYDpi0IeLawTYhAjYIQbJEYIUiIA9YrBVeOXuNZmIEFgjAukQg40WIl/LRITAEhFIjxhsciYTTQ3B5B2oBhHIhxiYIwQWiEB+xOCylUw0KQS5PrLZNSIwH2KgVjLR5GsEC4OdKBYRmB8xiFYykcXFws+lRUTAj7ZjcGYxmVuE4FRaQwT8aTQGC6PjjxAMRQT8ajMGX4oBqxC08eoBEfCvvRh8JgYmhyCsT2IE6p8KiEA52olBvD5wIgZM3lkY1il/lpoRgfK0EQOTaSCyeovxQ6l1eUAEylV5DCxPwCYhqHZ5QATKV28MVuG4czcRxDo9kJoQgXrUGYMTMWQWgu6ixYnUgAjUp7IYWJ94TX8NuYqpgAjUq54YPLT+PR/TEBQ/FRCB+lUQgxQnXPMbkxQ7FRCBdhQcg3h8pfitX/MQdFOB2dXMLIhAe8qMwSpsx5JAkluVhWrdk1LeV0AE2lVYDLppIMlxlSQEcXQpYolABFBODOIFwoeSSLKbl4adPg4x+Fi8IgJQ/mOw6qbsZFLfxfhIPL7jkAjgOr8xOAsRuJNqSaCShiDufPhDvCWebmdGBLCNwxiE4+edHPcGTf65Bt31gjvi4eIhEcA+jmIQlwOWv0+wS5YPOHERAyKAvhzEoHuFIMlLhVu+Xz7LL9a31iKPJfenKBMBjPFKt2XWReBIMsoagih7DIgApsgcgzki0H3f/LLFgAjAQqYYzBWB7nvPI3kMiAAsJY7BnBHovv98ksWACCCFRDGYOwLdPszLPAZEACkZx8BDBLr9mJ9ZDIgAcjCKgZcIRC5CEE2OARFAThNj4CkCkZsQRKNjQAQwh5Ex8BaByFUIosExIAKY08AYeIxA5C4EUe8YEAF40DMGXiMQuQxBtDcGRACe7ImB5whEbkMQbY0BEYBHW2LgPQKR6xBEL8SACMCzazEoIQKR+xBEP8TgaYgBEYB3XQxKiUCU5X4EU4Uf5un5/Qz+K2dEwNj/Bda+DRH4ppwIREWEIDqPwVMndzqqxVdh+zJs/xIYWjwPEbhdTgSiIpYGly3/MtPNTWoTI/D3S//8y7C9KpjoPAK/LisCUXEhiIjBRNcjoIjBJKVGICoyBBExGGlbBBQxGKXkCETFhiAiBgPti4AiBoOUHoGo6BBExKCnvhFQxKCXGiIQFR+CiBjsMTQCihjsVEsEoipCEBGDLcZGQBGDjWqKQFRNCCJicM3UCChicEVtEYiqCkFEDDpWEVDE4FyNEYiqC0HUfAysI6Aaj0GtEYiqDEHUbAxSRUA1GoOaIxBVG4KouRikjoBqLAa1RyCqOgRRMzHIFQHVSAxaiEBUfQii6mOQOwKq8hi0EoGoiRBE1cZgrgioSmPQUgSiZkIQVReDuSOgKotBaxGImgpBVE0MvERAVRKDFiMQNReCqPgYeIuAKjwGrUYgajIEUbEx8BoBVWgMWo5A1GwIouJi4D0CqrAYtB6BqOkQRMXEoJQIqEJiQAQuNB+CyH0MSouAch4DIvAjQtBxG4NSI6CcxoAIXEUILnEXg9IjoJzFgAi8iBBc4yYGtURAOYkBEdiMEGwwewxqi4CaOQZEYDtCsMVsMag1AmqmGBCB3QjBDtljUHsEVOYYEIH9CMEe2WLQSgRUphgQgX4IQQ/JY9BaBFTiGBCB/ghBT8li0GoEVKIYEIFhCMEA5jFoPQLKOAZEYDhCMJBZDIjAVUYxIALjEIIRJseACGw2MQZEYDxCMNLoGBCB3UbGgAhMQwgmGBwDItDPwBgQgekIwUS9Y0AEhukZAyJggxAY2BsDIjDOnhgQATuEwMjWGBCBabbEgAjYIgSGXogBEbBxLQZEwB4hMPZDDL4KMSACdroYEIE0CEECy09CDP4RYrBu7CPZE1v8IkTgt0QghRsCcyfvLE4XL8mdkNkzgYlwxiICCTERJLQ8CpPBMyaDqc4j8CcikBIhSIwYTEME8iAEGRCDcYhAPoQgE2IwDBHIixBkRAz6IQL5EYLMiMFuRGAehGAGxGAzIjAfQjATYnAVEZgXIZgRMbhABOZHCGbWegyIgA+EwIFWY0AE/CAETrQWAyLgCyFwpJUYEAF/CIEztceACPhECByqNQZEwC9C4FSIwWEXg0OpwGIt904+XBwLXCIEjlURg4WchQi8FSaBE4Fb3KHIsZOjxWrxkrwRav1ISrSQ8/0nAv4xERRi+fv10VrkvhQiPLE+lpflKMSM27UVgBAUpIilQpwC1vIOU0BZCEGBlu+v755PB56CcHEtIE4Bx0wB5SEEBTtfLizk7dmDsJCH4VrAg3hNQ1AkQlCBWSYEJoCqEIKKhAlhGR7uhinhdpIoxINf5LPw/34UAnBKAOpBCCoV350oz2QZvrwdpoVbo8JwcdY/DV99KTEAHPzVIgSNCGE4kKchCPEDWhchCvr25YW8Fr7+Onx1cYA/l5XcCNvLsmLNDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0K7vAU7PQZUgFNryAAAAAElFTkSuQmCC";
|
|
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
|
+
};
|