Skyelight MCP Server
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 Servershow 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 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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Item id from list_items. | |
| assignee | Yes | A name, email or id from list_members, "me", or null to unassign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (idempotent, non-destructive, non-read-only), and the description adds the details annotations cannot express: the human is notified, permission roles required, and the resolved-state precondition. That is exactly the calibration example's 'credit for adding context' standard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each with a distinct payload: the action, the unassign escape hatch, then the preconditions. Front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers the side effect, permissions, and the failure precondition, which is what an agent needs to call it safely. It omits only what the response or failure looks like, a minor gap given the annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so itemId's source (list_items) and assignee's accepted forms (name/email/id/'me'/null) are already documented. The description's 'pass null to unassign' duplicates the schema; only the notification consequence tied to assignee adds marginal meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('hand an item to a person') plus the defining consequence (the assignee is notified). No sibling tool in the list performs assignment, so this is unambiguously distinguishable from set_status, create_item, or post_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating conditions: null assignee to unassign, only owners/admins/collaborators may assign, and resolved items must be reopened first. It stops short of naming an alternative tool or an explicit 'do not use when' case, but the preconditions are strong enough that an agent knows when the call will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full URL of the page this is about. | |
| body | Yes | What you want to say. | |
| assignee | No | Who should take it: a name, email or id from list_members, or "me". | |
| mentions | No | People to notify, by name, email or id from list_members ("me" is you). Write @Name in the body where you mention them. | |
| selector | No | CSS selector for the element, if there is one. | |
| pageTitle | No | ||
| projectId | No | Optional if a project is bound. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. The description adds genuinely non-obvious context the annotations cannot express: the call executes under the connection owner's identity and is unavailable outside a personal connection. It stops short of saying whether the thread notifies anyone or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded, with no filler. The second sentence is slightly indirect ('so the answer lands where the question was asked'), though that rationale does justify the alternative-tool rule rather than being decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation with strong schema coverage and no output schema, the description covers the critical unknowns: identity of the actor and the availability constraint. Minor gaps remain — whether creating a thread notifies mentioned people, and what the call returns — but nothing blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the schema already documents nearly every parameter, including the 'me' convention for assignee and mentions. The description only reinforces the identity framing ('as the person whose connection you are using'), which subtly explains what 'me' resolves to but adds little else beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource — 'Open a new thread on a page' — and immediately pins down the acting identity ('as the person whose connection you are using'). It explicitly separates itself from the sibling post_update, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit availability constraint ('Only available on a person's own connection') and names the alternative tool with the condition that selects it ('an agent reporting what it found or changed uses post_update on the thread it was working'). That is a complete when-this/when-that routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Decisions per page (default 15, at most 30). | |
| since | No | Optional. Only decisions after this date ("2026-09-01"). | |
| offset | No | Where to start, from the previous result's 'more' line. | |
| projectId | No | Optional if a project is bound. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: results are quoted with their conversation, and the response includes the project's existing rules so the agent can distinguish new decisions from known ones. Pagination behavior is left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and reasonably short, but the middle clause ('plus types people corrected and where outcomes keep recurring') is convoluted and hard to parse on first read. One sentence carries too many bundled ideas, costing clarity for little concision gain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the job of describing return content, and it does so at a high level (quoted decisions with conversation, plus existing rules). The vaguer clause about 'types people corrected and where outcomes keep recurring' leaves the exact shape of that portion underspecified, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit, since, offset and projectId are all documented in the schema, including the 'more' line convention for offset. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (resolved/deferred decisions from a project's threads, with quoted conversation) and adds that it also returns existing rules. It's clearly a read/aggregation tool distinguishable from list_items or search_items, though the naming of the verb is implicit ('The decisions a project made') rather than an explicit 'returns X'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives two concrete use cases ('to write a decision log', 'to find rules worth keeping') and names the downstream sibling save_rule, so the agent knows the follow-up action. It stops short of exclusions — nothing says when to use search_items or project_review instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | A source path or file name, e.g. "src/components/PricingTable.tsx" or "PricingTable.tsx". | |
| line | No | Optional. Threads nearest this line come first. | |
| limit | No | ||
| status | No | ||
| component | No | A component name, e.g. "PricingTable". | |
| projectId | No | Optional if a project is bound. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world behavior. The description adds real context beyond that: results are ordered by line proximity, the no-arg mode ranks all stamped files by outstanding feedback, and data comes from build-plugin stamping. It does not discuss result shape or pagination, which is a modest gap for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no waste, front-loading the data source and then the two operating modes. Every clause earns its place, and the no-arg behavior is stated immediately after the primary mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, zero-required query tool with no output schema, the description covers the main selection axes and ordering semantics well. The remaining gap is that limit and status filters are left entirely to the schema, which partially documents the other parameters but not these two.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is a moderate 67%, so the schema carries much of the burden. The description usefully explains the file/component alternatives and the meaning of passing neither, but it says nothing about the limit or status parameters, which are undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pins down a specific resource (feedback threads tied to the source file/line stamped by the Skyelight build plugin) and clearly separates the file/component lookup mode from the no-argument hot-spot mode, which differentiates it from generic siblings like search_items. It lacks an explicit verb, opening with a noun phrase, but the intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage conditions: pass a file or component to review threads 'before you edit it', and pass neither to get the hot spots. It does not name alternatives or exclusions (e.g., when to prefer search_items or find_similar instead), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Optional. A page path or URL, e.g. "/checkout". | |
| text | No | What someone is about to report. | |
| limit | No | Max matches (default 5). | |
| itemId | No | Instead of text: find duplicates of this item. | |
| selector | No | Optional. CSS selector of the element. | |
| projectId | No | Optional if a project is bound or itemId is given. | |
| includeResolved | No | Default true: a resolved match may mean it came back. false to skip them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds value beyond that by describing the result shape and rationale — matches are returned with 'why each matched: shared words, same page, same element, same source file' — which tells the agent how to interpret and justify the results. It stops short of covering cost, latency, or ordering of matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each doing distinct work: the question, the two call modes, the return semantics, and the follow-up tool. The primary use case (pre-create duplicate check) is front-loaded in the first clause, and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description still explains what comes back and why, and annotations carry the safety profile for a read-only, idempotent lookup. For a 7-param optional-arg search tool with full schema coverage, an agent has everything needed to call it and act on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real intent beyond the schema: text is 'what you are about to report', page is optional context, and itemId is the mutually exclusive mode for locating duplicates of an existing thread. The limit, includeResolved, selector and projectId parameters are left entirely to the schema, which caps this below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the question the tool answers ('Has this already been reported?') and then states a concrete verb+resource: find likely matches for a report text or an existing item. It explicitly separates itself from create_item (call before) and merge_items (call after), so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when: before create_item, and with the text you are about to report, optionally with the page. It also names the alternative mode (pass an itemId to see what a thread duplicates) and the downstream action (merge_items folds one into the other), so the full decision path is spelled out with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Item id from list_items. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful context that the thread is ordered and pictures are returned as viewable images rather than links, though it omits limits, permissions, and error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and packs return details into a single sentence with little filler. The em-dash-heavy structure and editorial 'links you cannot' phrasing slightly reduce scanability, but the information mostly earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return shape, and it covers the thread, page URL, anchor, pinned screenshot, and attachments. It does not describe failure behavior or any limits, but it is adequate for a simple read-only get.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole itemId parameter is fully documented in the schema, including its source from list_items. The description adds no additional syntax or format meaning beyond the schema, so the high-coverage baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource and scope ('one item') and enumerates the returned contents: thread, page URL, anchor, and images. It is distinguishable from list_items through the one-item focus and the itemId source, but it never uses an explicit retrieval verb or directly differentiates from search/find siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides only an implied usage cue: itemId comes from list_items, and 'work one item' suggests fetching full detail. It does not explicitly say when to use this tool versus search_items or find_similar, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Only items on one page, e.g. "/checkout". | |
| task | No | Only items a person handed to an agent with this task (Hand off in the app), or "none" for items with no hand-off. Combine with assignee to find your own. Investigate and plan mean reply on the thread with no code changes; fix means make the change. | |
| type | No | Item type, e.g. "bug", "idea", "feedback". | |
| limit | No | Max items (default 50). | |
| status | No | Defaults to everything. "deferred" is work someone put off until later — outstanding, but deliberately not now. | |
| assignee | No | A user id, "me" for whoever this connection belongs to, or "none" for unassigned items. | |
| projectId | No | Project to read. Optional when a project is bound or the workspace has only one; otherwise the error lists the projects and their ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description adds genuinely new context: it returns a project summary alongside items, and it discloses a binding workflow rule (on investigate/plan, reply on thread and change no code) that no structured field carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose then return shape then routing advice, with no filler. The final hand-off sentence is somewhat tangential to a listing call but earns its place by preventing downstream misuse of the returned data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a seven-parameter, all-optional listing tool with no output schema, the description covers purpose, return contents, and an entry-point recommendation, while annotations cover safety. Ordering of results and pagination behavior beyond the limit parameter are the only notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including enum semantics for task and status and the 'me'/'none' assignee convention, so the schema does the heavy lifting. The description adds nothing parameter-specific beyond implying filtering, which lands at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List feedback items (bugs, ideas, comments)') plus the scope ('on a Skyelight project') and the return shape ('summary of the project plus matching items'). It does not name or contrast with the sibling search_items, so an agent must infer when this differs from searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Start here to see what is outstanding' gives a clear entry-point cue for the tool's primary use. It stops short of explicit exclusions or naming alternatives such as search_items or get_item for a single item.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Optional if a project is bound. | |
| workspaceId | No | Instead of a project, from list_workspaces. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description usefully adds the shape of the returned records (name, email, role, id), which matters since there is no output schema, but says nothing about scoping behavior when neither projectId nor workspaceId is supplied, or about result size/limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the returned-field summary front-loaded, followed by a usage clause with concrete downstream consumers. The second sentence is a run-on chain of clauses ('tell, ask or hand... then pass... or in mentions on...') that could be tighter, but it carries no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-parameter read tool with no output schema and full annotation coverage, the definition supplies the missing return shape and the chaining guidance an agent needs to act on results. The main residual gap is what happens when neither scope parameter is provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both optional parameters documented in the schema, including the 'Optional if a project is bound' fallback logic for projectId. The description adds only the general workspace framing and no extra syntax or precedence detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('The people in a workspace') and enumerates the returned fields (name, email, role, id), which makes the tool's job concrete even though the verb 'list' itself is implied rather than stated. It is distinguishable from siblings like list_projects or list_workspaces by the workspace-members framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('when you are asked to tell, ask or hand something to someone by name') and routes the agent downstream to assign, create_item mentions, and post_update mentions, naming actual siblings. It omits any when-not guidance (e.g., use search_items for finding items instead of people), which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Narrow to one workspace. Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely new behavior: result ordering by newest activity and the default of spanning all workspaces when no workspace is named. It does not mention pagination or result size limits, which is the only meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. Scope and ordering come first, then the routing rationale for why to pick this tool over jumping into list_items.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description conveys enough about the result set (project entities, ordered by newest activity, spanning workspaces) for an agent to use the output correctly. Missing only volume/pagination characteristics and what identifying field the returned project id is named.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already self-documenting, so the baseline is 3. The description adds real semantic value by stating the default behavior when the parameter is omitted ('across every workspace unless one is named'), which the schema only weakly implies with 'Optional.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (projects), the scope (everything you can reach, across every workspace), and the ordering (newest activity first) in a single front-loaded clause. It also implicitly distinguishes itself from list_items by noting that list_items needs a project id that this tool supplies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the triggering condition ('Start here when no project is bound') and names the concrete downstream dependency ('list_items needs a project id and this is where one comes from'). An agent knows both when to call it and why, without consulting siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is settled. The description earns credit for disclosing the shape of the result (per-workspace role and the caller's identity), which the annotations cannot convey, especially since there is no output schema. Pagination or scale behavior is unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what is returned before the when-to-use clause. The trailing 'and who you are' is slightly awkward phrasing but carries real information about the returned identity field.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of explaining the return value, and it does describe the key fields. It stops short of a 5 because the exact keys, ordering, or result size are not hinted at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate; baseline 4 applies. The description correctly signals that no input is needed by framing it as a discovery call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (workspaces) and states the content returned: the role held in each plus the caller's own identity. That goes beyond a restatement of the title. It does not explicitly distinguish itself from siblings, though none of the named siblings are workspace-listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete situations to reach for it: when you don't know what exists, when you need to map a project to a workspace, and when you need your own user id. No exclusions or named alternatives are given, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | The item to keep. The others fold into it. | |
| duplicateIds | Yes | Items that report the same problem. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this tool as destructive and non-idempotent, but the description adds concrete semantics: duplicates leave the list, count as extra reports on the kept item, and lists the permitted roles. This is meaningful behavioral context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the effect, then the usage condition, then permissions. Every sentence earns its place, and the app analogy is compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two fully documented parameters, rich annotations, and no output schema, the description gives enough to call the tool correctly: prerequisite, effect, and authorization are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already explains that itemId is the item to keep and duplicateIds are items reporting the same problem. The description restates the fold-into relationship but adds no syntax, constraints, or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fold duplicate items into one') plus the concrete outcome of the merge. It clearly separates this action from the discovery sibling find_similar, which is framed as a prerequisite rather than the same operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly constrains use to cases where find_similar and the threads show the items are the same problem, and states who can merge. It does not spell out an alternative action for non-duplicates, so usage is clear but not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | What you found or changed, in plain language for the person who reported it. | |
| links | No | Optional links — a PR, a commit, a deploy. | |
| itemId | Yes | Item id from list_items. | |
| mentions | No | People to notify, by name, email or id from list_members ("me" is you). Write @Name in the body where you mention them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, non-destructive mutation. The description adds the key behavioral fact beyond that: the post appears as a reply on the original feedback thread, so the reporter is the audience. It omits retry/duplication behavior, which matters for a non-idempotent write, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, followed by effect and timing. The audience rationale is stated twice (description plus schema), a minor redundancy that doesn't meaningfully bloat it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple write tool with full schema coverage and no output schema, this covers what an agent needs: what to write, where it lands, and when to invoke it. The remaining gap is idempotency/duplicate-post risk, which an agent should know before retrying.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented including 'itemId from list_items' and the mentions formatting convention. The description only echoes the body content already in the schema, adding no syntax or constraint detail beyond it, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('report back on an item') and enumerates the content types it accepts (findings, changes, PR link). It implicitly distinguishes itself from siblings like set_status or create_item by framing itself as a report/reply rather than a state change, though it never names those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when you finish work on an item, and when you get stuck' gives clear triggering conditions, including a non-obvious one (blocked state). It does not state exclusions, e.g., whether status changes belong here or in set_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | With section: where to start, from the previous result's 'more' line. | |
| section | No | Omit for the overview (all counts, first rows of each section). Name one to read it in full, a page at a time. | |
| projectId | No | Project to review. Optional if a project is bound. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context: each entry carries an item id for traceability, and it warns 'Quote; do not invent outcomes the threads do not state.' It also briefly describes the return shape. These additions go beyond the annotations and aid correct use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense but well-structured paragraph, front-loading the overall purpose and then detailing content and a caution. Every sentence contributes: purpose, content delineation, traceability, and usage guidance. It could be slightly more concise, but it avoids fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description does a thorough job explaining what is returned: the shape of work, resolved threads with outcomes, deferred items with reasons, open items, and quoted conversations. It also mentions traceability and a quoting rule. Minor gaps (e.g., pagination behavior) are covered by the input schema's offset parameter, making this nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter meanings are fully defined there. The description reinforces the section-based content (resolved, deferred, open, discussions) but does not add syntax or format details beyond what the schema already provides. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides a complete package for writing a project review or hand-off, enumerating the included sections. It names the resource (project review) and the value (accurate, traceable). However, it does not explicitly differentiate from siblings like decision_log or get_item, leaving a small gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Everything needed to write an accurate project review or hand-off document,' but there is no explicit guidance on when to choose this tool over alternatives or any exclusions. The schema's section enum provides some direction on how to use parameters, but the description itself is vague about when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Where the app is deployed, e.g. https://my-app.lovable.app. Or give code. | |
| code | No | For Skyelight to host: the complete file, never a summary or an excerpt. Or give url. | |
| kind | No | With code; worked out from it when left out. | |
| name | No | What it is, in a few words. Names the hosted link and, when no project is given, a new project. | |
| source | No | With code: where it was made, shown as its logo in Skyelight: "claude", "claude-code", "openai" (ChatGPT), "cursor", "windsurf", "v0", "lovable" or "other". Name yourself. | |
| projectId | No | Optional: the project to put it in. Left out, a new project is made for it. | |
| prototypeId | No | With code: to publish a new version of a prototype published before. | |
| workspaceId | No | When you are in more than one workspace and give no project, from list_workspaces. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that republishing with the same prototypeId or name creates a new version at the same link (clarifying the idempotentHint=false semantics), that a hosted link is public to anyone holding it, that permissions are owner/admin, and that the url mode mutates the project's Review Links. It also defines the return values ('the share link and the project link') that no output schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome, then cleanly organized into the two bulleted modes; nearly every clause carries real decision-relevant information. The code bullet is dense with parenthetical caveats (Tailwind, npm imports, local imports fail) that are necessary but make it heavier than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, zero-required, write-scoped tool with no output schema, the description covers all the gaps an agent would otherwise hit: which param combination to pick, what comes back, what to do with the result, permission level, and visibility of the artifact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns more by explaining cross-parameter behavior the schema can't: code and url are alternatives, prototypeId republishes a prior prototype under the same link, and an omitted projectId creates a new project (with workspaceId only relevant in the multi-workspace, no-project case).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: share a file or deployed app with Skyelight for review and get a feedback link. It immediately splits into the two distinct modes (code vs url) so an agent knows exactly what artifact it produces, and nothing among the siblings (assign, create_item, project_review, post_update) overlaps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use routing: use 'code' for Claude prototypes, v0 snippets and single pages; use 'url' for anything with more than one file already deployed (Lovable, v0, Bolt, Vercel). It also states the prerequisite ('Owners and admins') and the post-call step for the url mode (add the script tag to <head> and redeploy).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rule | Yes | The rule, in one plain sentence. | |
| projectId | No | Optional if a project is bound. | |
| sourceItemIds | No | Items the rule came from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by explaining the effect of the write: the rule lands in project context under 'Rules learned', the classifier reads it, and agents see it via decision_log, shaping future threads. It also discloses the permission requirement and the human-confirmation expectation, which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and storage location, then layers in downstream effects and the permission/confirmation caveat. Each sentence carries information, though the density of clauses makes it slightly heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety/idempotency, a fully documented 3-parameter schema, and no output schema, the description supplies everything an agent needs: persistence target, who can call it, downstream impact, and the pre-save confirmation norm.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description's 'cite the threads it came from' loosely reinforces sourceItemIds and the 'project's context' phrase hints at projectId, but neither adds format or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Keep a rule ... in the project's context, under Rules learned") and grounds it with two example rules, so an agent can distinguish it from reads like decision_log and from item-creation tools. The storage location and downstream consumers are named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: cite the source threads, restrict to workspace owners/admins, and confirm with the person before saving. It implies the alternative (decision_log is the read path) but does not explicitly say when *not* to save a rule versus other options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Text to look for. | |
| status | No | ||
| projectId | No | Project to search. Optional when a project is bound or the workspace has only one; otherwise the error lists the projects and their ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so safety needs no restating. The description does add one genuinely useful behavioral fact: matching spans replies as well as the original message, widening recall beyond the top-level body. It says nothing about result ordering, whether matches are ranked or truncated, or how the limit is applied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and followed by the one behavioral nuance that matters. The 'already diagnosed in a reply' clause earns its place by concretely illustrating the recall behavior rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry all expectations about results, and it does not say what a match returns, whether ordering is by relevance or recency, or how limit and status shape the page. Adequate for the matching semantics, thin for anything an agent needs to interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: query and projectId are documented in the schema, while limit and status carry no description anywhere. The description does not mention any parameter, so the two undocumented ones (including the status enum's effect on results) get no compensating explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Find') and resource ('items') plus the matching scope: text appearing anywhere in the item's thread, including replies. That is enough to separate it from list_items or get_item, though it never names a sibling to sharpen the distinction from find_similar or find_by_source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'whose thread mentions some text' implies keyword search, which lets an agent infer it is not the tool for a known item id (get_item) or an exact source lookup (find_by_source). But there is no explicit when-to-use statement, no exclusion, and no guidance on when find_similar is the better choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Item id from list_items. | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent, non-destructive, non-read-only, so the safety profile is covered; the description adds workflow-level behavior such as the required ordering with post_update. It does not say what happens when the item is already in that state (tap on the idempotentHint) or whether the reporter is notified, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the allowed statuses, then the workflow rule, then the edge-case semantic. The trailing quoted-'deferred' clause is slightly clipped and reads as an afterthought, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 2-parameter mutation tool with no output schema and annotations covering reversibility/isolation; the description covers ordering and status semantics well. Remaining gaps (no-op behavior on repeat calls, any side effects on the reporter) are modest but not trivial for a status-changing operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents itemId (from list_items) but leaves the status enum bare; the description supplies the meaning of 'deferred' and implicitly frames 'resolved' as closing the loop. That adds real semantic value over the bare enum, though 'open' is left uninterpreted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb + resource ('Move an item to...') and enumerates the exact target states, so the agent knows this mutates status and which values are possible. The intended moment of use (after a fix has been communicated) further separates it from siblings like post_update or assign.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance — post_update first, then set_status — with the rationale (the reporter reads what changed), and clarifies that 'deferred' means real-but-not-now rather than dropping work. That is when-to-use and how-to-order guidance an agent cannot derive from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. Call it at the start of a session. Without since it reads from your bookmark and moves it forward; with since it reads that window and leaves the bookmark alone.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Optional. A date or time ("2026-09-01", an ISO time) to read from instead of your bookmark. | |
| projectId | No | Optional if a project is bound. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=false, which is counterintuitive for a "what's new" read; the description resolves this by disclosing that a call without `since` mutates the bookmark and advances it, while `since` leaves it untouched. That is a state-changing side effect made visible, not restated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler: what it returns, when to call it, then the since/bookmark fork. Front-loaded with the payoff and the branch condition comes before the agent needs it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does enumerate the result categories. Gaps are minor: no ordering, pagination, or volume expectations for what could be a large diff.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the param definitions already carry their own weight; the description adds the interaction semantics — bookmark read-and-advance versus fixed window — that no single field description conveys. It adds modest extra value on `projectId` binding beyond the schema's 'optional if a project is bound'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource-level question ('what changed on a project since you last looked') and enumerates the payload: new threads, replies grouped by thread, resolutions/defers, assignments and mentions. No sibling tool overlaps this diff-style read, so it's trivially distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call it at the start of a session" gives an explicit trigger condition, and the second sentence draws the since-vs-bookmark decision boundary with the consequence of each choice. That is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v1.0.0- First observed
assign - First observed
create_item - First observed
decision_log - First observed
find_by_source - First observed
find_similar - First observed
get_item - First observed
list_items - First observed
list_members - First observed
list_projects - First observed
list_workspaces - First observed
merge_items - First observed
post_update - First observed
project_review - First observed
publish_review_link - First observed
save_rule - First observed
search_items - First observed
set_status - First observed
whats_new
TDQS
Scored across 18 tools
Most tools map to a distinct stage of the feedback lifecycle (discover, read, reply, assign, close, dedupe, review, learn), so selection is usually obvious. The only real overlap is at the edges: find_similar vs search_items (duplicate check vs full-text search) and project_review vs decision_log (full review vs decisions only), but the descriptions draw those lines clearly.
The core of the surface follows verb_noun (list_items, create_item, merge_items, post_update, save_rule), which is readable. But several tools break the pattern: noun-style query tools (project_review, decision_log, whats_new) and bare verbs (assign, set_status), giving a mixed convention overall.
18 tools is on the heavy side, but this server spans several distinct sub-domains — workspaces, projects, members, threads, duplicate detection, reviews, and rules — and each tool maps to a real workflow step rather than a redundant wrapper. Slightly over-scoped but reasonable.
The surface covers the full agent loop: discover projects/workspaces, read an item with its thread and images, reply, assign, change status, dedupe, produce reviews and decision logs, and persist rules. Gaps are minor — no tool to edit or delete an item's original message, and no project/workspace creation — but merging covers the main 'remove' need.
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 gradedqualityCmaintenanceEnables AI coding agents to pull, triage, and resolve user feedback pinned directly on live web prototypes via MCP tools.26 npm3MIT
- AlicenseNot gradedqualityBmaintenanceMCP 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 gradedqualityAmaintenanceEnables 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