Prepare Screenly MCP for Claude Desktop marketplace listing [T10708] - #304
Conversation
Add tool annotations, an MCPB bundle manifest, release packaging for desktop platforms, and route logger output to stderr so the MCP stdio JSON-RPC stream stays clean.
Fork pull_request runs do not receive repository secrets, so SCREENLY_API_TOKEN is empty and `screen list` fails auth. The job also uses screenly/cli@master, so it never exercises the PR's own code.
|
Love it! |
|
@renatgalimov, could you please request a review from Copilot? |
OverviewThis prepares the Screenly MCP server for Claude Desktop marketplace listing: MCP tool annotations on all 33 tools, an The core direction is right and the stdout fix is a genuine bug fix. Several things I verified directly:
High — should block marketplace submission1. The privacy policy in
2. No macOS code signing or notarization anywhere in Medium — annotation semantics3. 4. 5. Link/unlink idempotency is asymmetric. Medium — maintainability & packaging6. The 33-tool list now exists in four places ( 7. 8. No 9. 10. Conflicting token instructions in the same PR. Minor
VerdictThe stderr fix and the annotation pass are solid work. I'd hold merge on #1 (the privacy policy misstates both the API host and the Sentry telemetry) and #2 (unsigned macOS binary, untested through the actual download path) — both are submission blockers rather than code-quality nits. #3 and #4 are quick annotation corrections worth folding in at the same time. |
The listing text claimed api.screenly.io and no third-party telemetry; production uses api.screenlyapp.com and the CLI always initializes Sentry.
Prefer Settings → Extensions over GitHub sideloads, and guide macOS Gatekeeper blocks via Privacy & Security → Open Anyway instead of xattr.
Mark asset_create as open-world, treat updates as destructive, and mark link/share tools idempotent so hints match MCP spec meaning.
Keeps the duplicated 33-tool name/description catalog from drifting between mcpb/manifest.json and the #[tool] handlers.
Windows bundles ship screenly.exe; bake matching entry_point/command into each single-platform manifest instead of relying on a stale override.
The >=0.10.0 bound had no Screenly-specific source and could silently block installs; keep platform compatibility only.
Use the workspace screenlyapp.com Settings → Security → API tokens path in both places so install docs no longer conflict.
Gives Claude Desktop and the marketplace listing a proper brand mark; the release pack step and local build docs now include icon.png.
Pin @anthropic-ai/mcpb to 2.1.2 for reproducible releases, and publish screenly-macos-arm64/x64 and screenly-windows-x64 aliases alongside the rustc-target filenames.
|
Thanks for the detailed review, @sergey-borovkov , really helpful. I’ve addressed the High / Medium / Minor items in the latest pushes: High
Medium
Minor
Full Apple codesign / notarization for the binary is still an org-level follow-up (same as CLI releases today). Happy to adjust anything else you spot. |
|
@sergey-borovkov Please check. I’ve addressed the comments. Thanks |
sergey-borovkov
left a comment
There was a problem hiding this comment.
Re-reviewed at f352a1e — all ten findings from the previous pass are addressed, and addressed properly.
Verified by running it:
cargo test test_mcpb_manifest_tools_match_serverpasses; the other 200 tests are unaffected.- Simulated the win32
jqtransform and packed the bundle with@anthropic-ai/mcpb@2.1.2: manifest schema validation passes, icon accepted, internal zip paths correct (server/screenly.exe), output filename honored. mcpb/icon.pngis 512x512.- Destructive count re-counted: 8 deletes/unlinks + 5 updates = 13, matching the docs.
Two non-blocking notes for a follow-up:
-
The Gatekeeper section in
mcpb/README.mdsays "prefer the Desktop Extensions install once it is available", which reads as though the listing path sidesteps the block. It ships the same unsigned Mach-O, so unless Claude Desktop strips the quarantine attribute on extension install, the same block applies. Worth softening the wording or confirming before the listing goes live. -
The drift test could ask
ScreenlyMcpServer::tool_router().list_all()instead of regexingserver.rs. Less code, immune to attribute formatting changes, and it would cover the annotations too — which is the part that just changed and is currently untested. Theassert_eq!(len, 33)does prevent silent degradation today, so this is a nice-to-have, not a defect.
Approving.



Summary
Unblocks Anthropic Claude Desktop marketplace submission by finishing the remaining MCP listing prerequisites, and fixes a stdio bug that would have failed review on first launch.
title,readOnlyHint,destructiveHint,idempotentHint,openWorldHint) so clients can distinguish read-only vs destructive actionsmcpb/manifest.json+mcpb/README.mdwith privacy policy, 512×512 icon) and a release workflow step that builds.mcpbfor macOS and Windows (rustc-target names plus friendlier aliases likescreenly-macos-arm64.mcpb), injecting the version from the git tag and pinning@anthropic-ai/mcpb@2.1.2simple_logger'sstderrfeature — log lines were previously interleaved with JSON-RPC on stdout and caused Claude Desktop to fail withUnexpected non-whitespace character after JSON at position 4Review follow-ups
Addressed @sergey-borovkov's review on this PR:
High
api.screenlyapp.com, and disclosed unconditional Sentry initMedium
asset_createopenWorldHint, updates marked destructive, link/share tools idempotent (13 destructive)server.rsentry_point/commandin the release pack step (incl. win32)mcpb/icon.pngcompatibility.claude_desktopversion floor*.screenlyapp.com→ Settings → Security → API tokensMinor
@anthropic-ai/mcpb@2.1.2(latest under@2, as noted in review)screenly-macos-arm64,screenly-macos-x64,screenly-windows-x64Changes
src/mcp/server.rs— all 33 toolsmcpb/manifest.json,mcpb/README.md,mcpb/icon.png.github/workflows/release.yml.github/workflows/actions.yml— skipList screenson fork PRssrc/mcp/tests.rs— manifest tools match serverCargo.toml(simple_logger+stderr)README.md,.gitignore(*.mcpb)Test plan
cargo check --all-targetscargo fmt --checkcargo test(including MCPB manifest drift test).mcpbpack with@anthropic-ai/mcpb— manifest schema validation passed; executable bit preservedtools/listreturns annotations for all 33 tools (12 read-only, 13 destructive).mcpbin Claude Desktop locally — connects successfully with API token; tools work.mcpbartifacts (target names + aliases) attach to the GitHub release