Skyelight MCP Server
Skyelight MCP exposes 18 tools that let a coding agent read, triage, discuss, and manage Skyelight feedback from a running app.
Discover workspaces, projects, members, roles, and your own user id.
List, filter, and search feedback by page, type, status, assignee, hand-off task, or thread text.
Open a feedback item’s full thread, page/anchor, screenshots/attachments, reactions, Linear handoff, and source file/line/commit context.
Reply on threads with findings, links, and mentions; create new items; set status; assign or unassign; merge duplicates.
Catch up on what changed, review project history, read decision logs, and save agreed project rules.
Find feedback by source file/component or find similar reports before creating or editing.
Publish review links for hosted HTML/React code or deployed apps, returning share links and script tags.
Accepts the address of an app already deployed on Vercel (e.g. *.vercel.app) and turns it into a review link: the URL is added to the project's Review Links, and the response returns a script tag to place in the app's plus a shareable link for reviewers.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Skyelight MCP Server show me the open feedback on the checkout page"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@skyelight/mcp

An MCP server that lets a coding agent read the feedback people left on your running app — the thread, the page, and the element they were pointing at — and report back on it when the work is done.
Full guide: skyelight.ai/docs/mcp. The REST API behind the local server is documented at skyelight.ai/docs/api.
Two ways to connect, with the same eighteen tools either way:
Remote, with OAuth — the default. Your agent talks to Skyelight over HTTP and you sign in once in the browser. Nothing is pasted and no key is stored on disk.
Local, with a token — this package runs as a stdio server on your machine and carries a personal token. For clients or machines where the browser sign-in is not an option.
Every plan includes every tool, Free included, for owners, admins and collaborators. On Free, your agent gets 25 agent threads a month; Pro and above have no limit. A reviewer reads and comments in the web app but does not get agent tools.
The short way
npx @skyelight/mcp initFinds your coding agents, registers Skyelight's remote server with them, and
leaves the sign-in to OAuth — the first time the agent connects it opens a
browser and you approve it there. It shows what it will change and waits;
--yes skips that once you have read it.
It knows Claude Code, Cursor, Grok, Codex, Gemini CLI and Windsurf. With several
installed it asks which; --client cursor or --client all answers in
advance. npx @skyelight/mcp remove takes the entry out again. Point at
another deployment with SKYELIGHT_URL=https://…; the deployment tells the
installer its own MCP URL and OAuth client over /mcp/install-config, so this
package holds no environment-specific constants.
The same setup, with a snippet per client, is in the Skyelight web app under account settings → Coding Agents.
Related MCP server: earmark
As a Claude Code plugin
/plugin marketplace add plastrlab/skyelight-mcp
/plugin install skyelight@skyelightThe plugin connects Claude Code to Skyelight's remote server (sign-in is
OAuth, as above) and adds a skill for working through feedback and two
commands: /skyelight:whats-new and /skyelight:fix-feedback. Its files are
.claude-plugin/marketplace.json and plugin/ in this repository.
As a Gemini CLI extension
gemini extensions install https://github.com/plastrlab/skyelight-mcpThen, in Gemini CLI, sign in once:
/mcp auth skyelightA browser opens on Skyelight; sign in and allow the connection. Gemini CLI
lists the tools before you sign in, so it won't ask by itself. The extension
connects Gemini CLI to Skyelight's remote server and adds the same skill and
the same two commands as the Claude Code plugin: /skyelight:whats-new and
/skyelight:fix-feedback. Its files are gemini-extension.json,
GEMINI.md, commands/ and skills/ at the root of this repository.
With a token
Get a personal access token. In the Skyelight web app, go to account settings → API Keys → create one. It is shown once, belongs to the organization you create it in, and can be given an expiry.
Then add the server to your client:
{
"mcpServers": {
"skyelight": {
"command": "npx",
"args": ["-y", "@skyelight/mcp"],
"env": {
"SKYELIGHT_API_URL": "https://app.skyelight.ai",
"SKYELIGHT_API_TOKEN": "sky_..."
}
}
}
}Claude Code users can skip the file:
claude mcp add skyelight \
--env SKYELIGHT_API_URL=https://app.skyelight.ai \
--env SKYELIGHT_API_TOKEN=sky_... \
-- npx -y @skyelight/mcpSKYELIGHT_API_URL is https://app.skyelight.ai, the same host as the MCP
URL on the Coding Agents page (https://app.skyelight.ai/mcp), without
/mcp. A deployment's .convex.site host also works.
Credentials
Checked in order, so an existing setup keeps working:
SKYELIGHT_API_TOKEN/SKYELIGHT_API_URLin the environment.env.local, then.env, in the working directory~/.skyelight/credentials—{"apiUrl": "...", "token": "sky_..."}
Binding a repo to a project
With the local server, if you can reach several projects, drop a
.skyelight.json at the repo root:
{ "projectId": "j57abc...", "projectName": "Checkout rebuild" }Tools then default to that project and nobody has to pass an id. Without it
(and always on the remote server), list_items asks for a project and the
agent calls list_projects first rather than guess.
Tools
Tool | What it is for |
| Which workspaces this credential can reach, and who you are. |
| The projects inside them, with the ids the other tools take. |
| What is outstanding. Filter by page, type, status, assignee, hand-off. |
| Find items whose thread mentions some text, replies included. |
| Everything needed to work one item: thread, page, anchor, code, images. |
| Report back on the thread the feedback came from. |
| Raise a new item — an audit finding, something you noticed. |
| Move an item to open, deferred or resolved. |
| Who is in the workspace, so you can name an assignee or a mention. |
| Hand an item to a person, or unassign it. |
| What changed since you last looked, from your own bookmark. |
| Where a project landed, for a wrap-up or hand-off document. |
| What the team decided in its threads, quoted, and its current rules. |
| Keep an agreed rule in the project context (owners and admins). |
| Feedback on a file or component before you edit it, or the hot spots. |
| Check for an existing report before creating one. |
| Fold duplicate items into one. |
| Share something for review: code for Skyelight to host, or a deployed app's address. |
Which tools change things. list_workspaces, list_projects,
list_items, search_items, get_item, list_members, project_review,
find_by_source, find_similar and decision_log only read. post_update,
create_item, set_status, assign, save_rule, merge_items,
publish_review_link and whats_new (which moves your "last looked"
bookmark) make changes. Every tool carries MCP annotations saying which it
is, with merge_items marked destructive, so your client can ask before a
write runs.
Publishing for review. publish_review_link takes one of two things:
code: one HTML page, or one React component with an export default (a Claude prototype, a v0 snippet). Skyelight hosts it at its own link onskyelight.pagewith the review badge on it, in a project you name or a new one. Publishing again makes a new version at the same link.url: an app already deployed, such as a Lovable, v0 or Bolt project on*.lovable.appor*.vercel.app. The address goes on the project's Review Links, and the answer carries a script tag for the app's<head>and the review link to share (the address with?skyelight=1).
Code that imports the rest of its app is not hosted; the answer says to send
the app's url instead. It answers to publish_prototype too, its name
before 0.7.0.
list_items leads with a summary — totals, breakdown by type and by page — so
an agent can tell you the shape of the work before pulling any of it. Rows are
stubs; get_item is where the thread and the anchor live.
"What is assigned to me." list_workspaces returns your own user id, and
list_items takes assignee: "me", so the most ordinary question anyone asks
an agent needs no id looked up by hand.
"What was I asked to fix." A person can hand a thread to an agent in the
app (Hand off: Investigate, Plan or Fix). list_items takes task with one of
those, or "none", and each row names its hand-off. With assignee: "me" it
is your own queue of fixes.
Merged duplicates do not appear twice. When somebody merges five reports of
one problem in the web app, the duplicates leave the list and the item they were
merged into says 5 reports. A list that shows all five reads as five bugs.
What the agent sees
Alpha: 21 items total — 15 open, 3 deferred, 3 resolved, 19 unassigned.
By type: bug (7), idea (4), feedback (10).
Busiest pages: /checkout (8), /settings (4).
2 matches:
- The pay button does nothing on the second click
bug · open · /checkout · unassigned · 2 replies · 5 reports — id i1Deliberately prose rather than JSON. A tool that returns a bare array invites a model to read the array out; this one invites it to summarise.
A row's line is the one-sentence summary Skyelight's classifier wrote, where there is one, rather than the first 140 characters of whatever somebody typed — four truncated paragraphs are not something you can choose between.
One call reads the 2,000 most recent items in a project. Past that the result says so, in words, rather than presenting a slice as the total.
The pictures
get_item returns the screenshot taken when the pin was left, and any images
people attached to the thread, as image content blocks — things a model can
actually look at, not links it cannot open.
Screenshot of the page when this was pinned: attached below.
2 images attached to this thread: also below.Capped at four per call. Anything too large to inline comes back as its link with the reason, so a picture never disappears silently.
What somebody else already did
get_item also names the Linear issue a thread was handed to, and who it was
delegated to, so an agent does not start work a Linear-hosted agent is
finishing. Reactions come back counted by emoji — a thread with one comment and
nine thumbs up is not a thread with one comment.
Where the code is
If the app was built with @skyelight/build,
get_item ends with the line that changes what an agent does next:
Written by components/Card.tsx, line 88, in build a1b2c3d on branch feat/checkout.The file saves a grep. The commit and branch are how an agent tells "still broken" from "already fixed, this pin is stale" — and, on a preview deployment, which branch the code it wants is actually on.
Who a write belongs to
Every write is a person's. Your sign-in or token carries your access, so a reply the agent posts is yours. Over the remote server, the editor it came through is shown as a mark beside the timestamp rather than as the author.
There is no service-account mode, and workspace API keys (sk_live_...) no
longer work. The API accepts two credentials, both of which are you: an OAuth
sign-in and a personal token (sky_...).
Permissions
The server enforces nothing; the API does. The agent can do what your account can do in that workspace, and nothing more:
Agent tools work on every plan, Free included, for owners, admins and collaborators. A reviewer is refused with the reason — the workspace is listed and marked rather than hidden, so you are told which gate closed instead of being told it does not exist.
On Free, your agent gets 25 agent threads a month. Two things count: each conversation, once, on its first call of any tool, listing included; and each thread the first time in the month
get_item,post_update,set_status,assignormerge_itemstouches it. So "what feedback do I have?" then "fix that one" is 2. Nothing counted is given back.list_workspacessays how many are left, and at the limit anything new is refused with the reset date. Free hosts one prototype.Adding a deployed app's address to Review Links is for owners and admins.
Owners, admins and collaborators read, reply, raise items and change any thread's status.
A token only reaches workspaces in the organization it was created in.
License
MIT, from 1.1.2. See LICENSE. The license covers this package and the plugins in this repository; using them needs a Skyelight account, under the Skyelight terms of service. The Skyelight name and logo are not covered by the license.
Available Tools
18 toolsassignAssignAIdempotentInspect
Hand an item to a person, who is notified the way an assignment in the app notifies them. Pass null as the assignee to unassign it. Only owners, admins and collaborators can assign; a resolved item has to be reopened first.
Inputs: itemId (required), assignee (required).
create_itemCreate feedbackAInspect
Open a new thread on a page, as the person whose connection you are using. Only available on a person's own connection — an agent reporting what it found or changed uses post_update on the thread it was working, so the answer lands where the question was asked.
Inputs: url (required), body (required), assignee, mentions, +3 more.
decision_logDecision logARead-onlyIdempotentInspect
The decisions a project made in its threads, quoted: every thread resolved or deferred after a discussion, with the conversation, plus types people corrected and where outcomes keep recurring. Also returns the project's existing rules, so you can tell what is new. Use it to write a decision log, or to find rules worth keeping with save_rule.
Inputs: limit, since, offset, projectId.
find_by_sourceFind feedback by source fileARead-onlyIdempotentInspect
Feedback by the code that rendered it, from the file and line the Skyelight build plugin stamps on each element. Pass a file (a path or just its name) or a component to see every thread about it before you edit it; pass neither to get the hot spots, every stamped file ranked by outstanding feedback.
Inputs: file, line, limit, status, +2 more.
find_similarFind similar feedbackARead-onlyIdempotentInspect
Has this already been reported? Pass the text you are about to report (and the page, if you know it) before create_item, or an itemId to find what an existing thread duplicates. Returns likely matches with why each matched: shared words, same page, same element, same source file. If two are the same problem, merge_items folds one into the other.
Inputs: page, text, limit, itemId, +3 more.
get_itemGet feedback itemARead-onlyIdempotentInspect
Everything needed to work one item: the whole thread in order, the page and URL it is on, the anchor identifying the element the person pointed at, and the pictures — what the page looked like when it was pinned, plus anything people attached — returned as images you can look at rather than links you cannot.
Inputs: itemId (required).
list_itemsList feedbackARead-onlyIdempotentInspect
List feedback items (bugs, ideas, comments) people left on a Skyelight project. Returns a summary of the project plus matching items. Start here to see what is outstanding. An item's hand-off (investigate, plan, fix) is set by the team and binding: on investigate or plan, reply on the thread and change no code.
Inputs: page, task, type, limit, +3 more.
list_membersList membersARead-onlyIdempotentInspect
The people in a workspace: name, email, role and id. Call it when you are asked to tell, ask or hand something to someone by name, then pass their name or id to assign, or in mentions on create_item or post_update.
Inputs: projectId, workspaceId.
list_projectsList projectsARead-onlyIdempotentInspect
Projects you can reach, newest activity first, across every workspace unless one is named. Start here when no project is bound — list_items needs a project id and this is where one comes from.
Inputs: workspaceId.
list_workspacesList workspacesARead-onlyIdempotentInspect
Workspaces you can reach, with the role you hold in each, and who you are. Use when you do not know what exists yet, to find which workspace a project belongs to, or to learn your own user id.
Inputs: no named parameters.
merge_itemsMerge duplicatesADestructiveInspect
Fold duplicate items into one, the way merging works in the app: the duplicates leave the list and count as extra reports on the item they were merged into. Use it only when find_similar and the threads themselves show they are the same problem. Owners, admins and collaborators can merge.
Inputs: itemId (required), duplicateIds (required).
post_updatePost an updateAInspect
Report back on an item: what you found, what you changed, a link to the PR. Posts as a reply on the thread the feedback was left on, so the person who reported it sees the answer where they asked. Use this when you finish work on an item, and when you get stuck.
Inputs: body (required), itemId (required), links, mentions.
project_reviewReview projectARead-onlyIdempotentInspect
Everything needed to write an accurate project review or hand-off document: the shape of the work, every resolved thread and how it ended, what was deferred and why, what is still open, and the longest conversations quoted in full, which is where decisions were made. Every entry carries its item id, so each claim in your document can be traced back to its thread. Quote; do not invent outcomes the threads do not state.
Inputs: offset, section, projectId.
publish_review_linkPublish a review linkAInspect
Share something with Skyelight for review, and get a link people can pin feedback on. Two ways:
code: one file Skyelight hosts at its own link with the review badge on it. A whole HTML page, or one React component with an export default (Tailwind classes and npm imports work; local imports such as @/components do not). For Claude prototypes, v0 snippets and single pages. Publishing again with the same prototypeId, or the same name in the same project, makes a new version at the same link.
url: an app already deployed (a Lovable, v0, Bolt or Vercel project: anything with more than one file). Adds its address to the project's Review Links and returns a script tag to add to the app's (index.html, or the root layout); add it and redeploy. Owners and admins. Returns the share link and the project link; give both to the person. A hosted link is public to anyone who has it.
Inputs: url, code, kind, name, +4 more.
save_ruleSave a ruleAIdempotentInspect
Keep a rule the team agreed on ("sentence case in every button", "the brand gray stays, do not raise contrast bugs on it") in the project's context, under Rules learned. The classifier reads that context, and every agent reads it through decision_log, so it shapes future threads. Cite the threads it came from. Workspace owners and admins only; confirm with the person before saving.
Inputs: rule (required), projectId, sourceItemIds.
search_itemsSearch feedbackBRead-onlyIdempotentInspect
Find items whose thread mentions some text. Searches replies as well as the original message, so an item someone already diagnosed in a reply still turns up.
Inputs: query (required), limit, status, projectId.
set_statusSet statusAIdempotentInspect
Move an item to open, deferred or resolved. Use it to close the loop after you have fixed something and said so — post_update first, so the person who reported it reads what changed, then set_status. "deferred" is for work that is real but not now.
Inputs: itemId (required), status (required).
whats_newWhat's newAInspect
What changed on a project since you last looked: new threads, new replies grouped by thread, what was resolved or deferred, and what was assigned to you or mentioned you. Use when the user asks what has changed on a project since they last checked. Without since it reads from their bookmark and moves it forward; with since it reads that window and leaves the bookmark alone.
Inputs: since, projectId.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 18 tools
Most tools target clearly distinct resources or workflow steps, and descriptions explicitly disambiguate similar-seeming operations like list_items vs whats_new vs project_review. A few overlaps remain, such as project_review and decision_log both surfacing resolved/deferred conversations, but they are differentiated enough for an agent to choose correctly.
Names are consistently snake_case and mostly follow a verb_noun or action-oriented pattern. Minor deviations such as whats_new, project_review, and decision_log break the verb_noun convention slightly, but remain readable and predictable overall.
The 18 tools are slightly above the ideal compact range but each covers a meaningful part of the feedback, review, and decision workflow. Given the domain complexity, the count is reasonable rather than excessive.
The surface covers discovery, item reading, searching, replying, assignment, status changes, duplicate detection and merging, review links, decision logs, and saved rules. Minor gaps exist, such as no explicit item edit/delete or list-review-links operation, but core workflows are well supported.
Maintenance
Related MCP Connectors
Read, reply to and resolve website feedback threads from your coding agent.
Read in-app bug reports, crashes, screenshots and tickets from mobile, web and TV apps.
Agent-ready feedback for AI-built apps — read and close UI feedback reports over MCP.
Read, reply to and resolve client feedback pinned on websites, PDFs, images and video.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to pull, triage, and resolve user feedback pinned directly on live web prototypes via MCP tools.37 npm3MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that lets coding agents receive UI feedback from a browser overlay—clicked elements, selectors, source paths, and computed styles—and manage it with watch, ask, acknowledge, resolve, and dismiss tools.MIT
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to pull structured UI feedback captured in the browser — including element selectors, bounding boxes, computed styles, screenshots, and annotations — and to mark issues as fixed.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to file review jobs that real human reviewers open, return pinned comments and verdicts on, and approve, so agents can iterate on built sites, videos, and other artifacts based on genuine human feedback.38 npmMIT