SnapVisor build discussion
Summarize who said what on a build and act on the threads for the user. Comments exist on builds, on tests and on media items; each has its own set of operations.
Connecting and calling the tools
Every operation in this skill comes from the snapvisor MCP server, the SnapVisor connector. The server defaults to Code Mode, so the operations below are written as the external_* functions you call inside snapvisor:execute_typescript. On a server set to the per-tool surface, the same operation is listed as snapvisor:<name> without the external_ prefix, for example snapvisor:listBuilds.
- Only
snapvisor:search_toolsandsnapvisor:execute_typescriptlisted (Code Mode, the default): callsnapvisor:search_toolsfirst, then call each tool insidesnapvisor:execute_typescriptasexternal_<tool>(for exampleexternal_listBuilds); the program mustreturnits result. Scopes, confirmations and gates are identical on both surfaces. - Operations listed by name: call them directly, for example
snapvisor:listBuilds. - "Tool not found": switch to the Code Mode route instead of retrying the direct call. If
snapvisor:search_toolsdoes not return the tool either, its OAuth scope was not granted; the user reconnects SnapVisor and approves that scope. - No
snapvisortools at all: SnapVisor is not connected yet. Install the SnapVisor power, which adds the server; it signs in with OAuth on first use.
Tools you will use
The snapvisor MCP server has two tools: snapvisor:search_tools (call it first, for example with comment, to get the exact operation names and inputs) and snapvisor:execute_typescript (run a short program calling the declared external_* functions; the program must return its result).
If the connection lists the operations by name instead (the per-tool surface), call them directly without the external_ prefix.
Operations this skill uses for builds (tests and media have matching Test and Media variants, such as external_listTestComments):
external_listBuildComments: all comments and threads on a build.external_createBuildComment: post a comment; setthreadIdto reply, orscreenshotDiffIdto attach it to one screenshot.external_updateBuildCommentandexternal_deleteBuildComment: edit or delete the user's own comment.external_addBuildCommentReactionandexternal_removeBuildCommentReaction: reactions.external_resolveBuildCommentThreadandexternal_unresolveBuildCommentThread: close or reopen a thread.external_subscribeBuildandexternal_unsubscribeBuild: follow or unfollow a build.external_getBuild: the build's status, to open the summary.
Workflow
- Identify the build (the
reviewing-visual-buildsskill shows how to find it). Fetchexternal_getBuildandexternal_listBuildCommentstogether in one program withawait Promise.all. - Summarize: build status first, then open threads (author, the point made, the screenshot it is anchored to), then resolved threads in one line each.
- To post or reply, draft the text, show it, and post it with
external_createBuildCommentafter the user agrees. UsethreadIdfor replies. - To resolve or reopen, name the thread by its first line, confirm, then call the resolve or unresolve operation.
- Report what changed and the comment or thread id.
Code Mode pattern
try {
const [build, comments] = await Promise.all([
external_getBuild({ owner, project, buildNumber }),
external_listBuildComments({ owner, project, buildNumber }),
]);
return { status: build.status, comments };
} catch (e) {
return { error: String(e) }; // "<CODE>: <details>"
}
Rules
- Post comments in the user's words or in a draft they approved. Never post on their behalf without showing the text first.
- Edit or delete only comments the user wrote, and only after a confirmation.
- Remove a reaction or unfollow a build only after the user confirms; the server marks both operations as destructive.
- Do not approve or reject the build from this skill; that is
reviewing-visual-builds.
