MCP server that relays result screenshots (test-rendered PNGs or live window captures) to Slack, so a user can review a coding agent's output without opening the app
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 7 tools have clear verb-noun naming (send_to_slack, capture_window, wait_for_review, etc.) and detailed parameter documentation. Input schemas are complete with types and descriptions for all parameters. However, output schemas are documented only in prose, not as formal JSON Schema structures. Error handling guidance is present but could be more specific about recovery paths. Tool composition is excellent, tools chain naturally (send_to_slack → wait_for_review → ask_review → wait_for_reply). No security issues detected (no secrets in params). Descriptions average ~180 chars, within the 10-1024 baseline.
Post a question into a review thread and ping the reviewer. Returns an ask_id; poll it with wait_for_reply to get their typed answer. Use this when you need to ASK the reviewer something (e.g. why they rejected, or to choose between options) — do NOT ask in the terminal, because the reviewer is watching Slack, not your console.
Capture a screenshot WITHOUT posting, and return it for inspection. Compose with send_to_slack: look at the image, then post the returned path if it's the right frame. No Slack call, so no token/scopes are needed.
Screenshot the running app window (X11/KDE) and post it to Slack as a review. Use only when no offscreen render exists; otherwise prefer send_to_slack with a repro-rendered PNG.
Poll (without blocking) for a human's reaction or reply to a review. Returns the same verdict dict as wait_for_review, but returns immediately with status 'still_awaiting' if no reaction/reply has arrived yet. Use this to check in on a review without blocking the agent.
Post one or more existing image files to Slack as a review. Posts a root anchor message (a Block Kit task card when title/status/checks/links are given) and threads the image(s) beneath it. Returns a JSON status including `review_id` (poll it with `wait_for_review`) and the Slack permalink(s). This is the primary tool: pair it with a repro/test that renders the result to a PNG.
Output schemas documented in prose only, not as formal JSON Schema. LLMs cannot parse unstructured descriptions to understand response structure for downstream chaining.
Error handling returns JSON envelope with {code, message, hint} but error codes are not enumerated or documented. LLMs cannot reliably classify errors as retryable vs user-fixable.
Timeout parameters (timeout_seconds, poll_seconds) lack min/max constraints in schema. Unbounded integers could allow LLMs to pass absurd values (e.g. 999999 seconds).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
Block until the reviewer replies to a question posted by ask_review. Returns a JSON verdict with status 'answered' / 'still_awaiting' and the reply text. Pair with ask_review: post a question, then wait_for_reply(review_id, ask_id) to block until they type an answer.
Block until the human reacts (👍/👎/👀/✏️) or replies in the review thread, or until timeout. Returns a JSON verdict: status is approved / rejected / changes / still_awaiting; reactions lists the emoji(s) the reviewer tapped; reply is their typed message (if any). Pair with send_to_slack: post a review, then wait_for_review(review_id) to block until they react or reply.
capture_window 'window' parameter accepts free-form strings ('active', 'full', 'root', or substring). Should be enum or clarify validation rules to prevent LLM hallucination.
No dry-run or confirmation step for destructive operations (send_to_slack posts immediately). Agents cannot preview before committing.