shotops-mcp 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -25
- package/dist/local.js +9247 -2875
- package/harness-dist/assets/index-DdK1IK1N.js +1 -0
- package/harness-dist/index.html +1 -1
- package/package.json +1 -1
- package/widget-dist/bundle.js +1 -1
- package/harness-dist/assets/index-Wb7M1qGz.js +0 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ spine the Studio web app and the `mockup-mcp` CLI use, driving headless Chromium
|
|
|
14
14
|
Ships as **two doors, one engine**: an `npx shotops-mcp` **local stdio server** that renders on
|
|
15
15
|
your own machine, no account needed to preview (see [Local](#local--npx-shotops-mcp) below), and a
|
|
16
16
|
**hosted** server on Vercel with an account, saved looks, and share links (see [Hosted](#hosted)
|
|
17
|
-
below, or the public [
|
|
17
|
+
below, or the public [MCP docs](https://shotops.dev/docs/mcp)).
|
|
18
18
|
|
|
19
19
|
## Preview free, export store-ready with Pro
|
|
20
20
|
|
|
@@ -28,16 +28,17 @@ The two limits are independent and neither substitutes for the other:
|
|
|
28
28
|
|
|
29
29
|
- **Entitlement** is permission to create store-ready files. One server-owned decision answers it
|
|
30
30
|
for Studio, hosted and local alike, so no door can be talked into a different answer. Free and
|
|
31
|
-
anonymous callers are refused before a credit is reserved, a screenshot is read or a file is
|
|
31
|
+
anonymous callers are refused before a cloud credit is reserved, a screenshot is read or a file is
|
|
32
32
|
written — a refused call costs nothing and leaves nothing behind.
|
|
33
|
-
- **
|
|
33
|
+
- **Cloud credits** price compute ShotOps supplies: 1 per hosted preview panel, 4 per hosted
|
|
34
34
|
full-resolution panel, plus AI. Rendering on your own machine spends none, on any plan. More
|
|
35
|
-
credits never unlock store-ready output on Free.
|
|
35
|
+
cloud credits never unlock store-ready output on Free.
|
|
36
36
|
|
|
37
|
-
Free accounts get
|
|
38
|
-
Pro trial; after that Pro is €9/month or €90/year. Without any account, the hosted server
|
|
39
|
-
preview strips per rolling 30 days, at most 5 panels each. Call `account_status` to see
|
|
40
|
-
where this connection stands — it spends no credits and none of that anonymous
|
|
37
|
+
Free accounts get 80 cloud credits a month and 2 synced projects. Every new account starts with a
|
|
38
|
+
7-day Pro trial; after that Pro is €9/month or €90/year. Without any account, the hosted server
|
|
39
|
+
allows 3 preview strips per rolling 30 days, at most 5 panels each. Call `account_status` to see
|
|
40
|
+
exactly where this connection stands — it spends no cloud credits and none of that anonymous
|
|
41
|
+
allowance.
|
|
41
42
|
|
|
42
43
|
## Zero-custody
|
|
43
44
|
|
|
@@ -66,7 +67,7 @@ The key is never copied, printed, or sent to ShotOps, and no release tool is ins
|
|
|
66
67
|
| `describe_look` | Five named design presets, three named layout templates, the user-intake script, and the full styling field catalog + defaults | *(none)* |
|
|
67
68
|
| `request_screenshot_upload` | Mint signed upload slots for real screenshots; every returned slot carries its semantic screenshot `variant` | `count` (1–10), `names?`, `family?`, `locale?` |
|
|
68
69
|
| `import_screenshot` | Get screenshots INTO ShotOps — several per call, each from one named source (`{ url }`, `{ file }`, or local-stdio `{ path }`), returning a render-ready ref per entry in input order | `screenshots` (1–10 source entries), `file?` (the ChatGPT top-level attachment), `name?`, `locale?` |
|
|
69
|
-
| `account_status` | What THIS connection may do, for free: signed-in account, plan, trial, remaining ShotOps credits, what a preview costs here, and whether store-ready output (full-resolution renders, any `emit_bundle`) is allowed — with a machine-readable `nextStep`. Spends no credits, uses none of the free anonymous preview allowance, uploads and writes nothing | *(none)* |
|
|
70
|
+
| `account_status` | What THIS connection may do, for free: signed-in account, plan, trial, remaining ShotOps cloud credits, what a preview costs here, and whether store-ready output (full-resolution renders, any `emit_bundle`) is allowed — with a machine-readable `nextStep`. Spends no cloud credits, uses none of the free anonymous preview allowance, uploads and writes nothing | *(none)* |
|
|
70
71
|
| `production_operation` | Reconnect to one durable paid Hosted render or rendering bundle, report persisted progress, request cooperative cancellation, or mint fresh result download grants without rerendering or charging again | `action` (`get`, `cancel`, or `result`), `operationId` |
|
|
71
72
|
| `delete_assets` | Permanently delete private uploaded screenshots, rendered panels, or generated bundles owned by the signed-in account | `refs` (1–50 ShotOps refs) |
|
|
72
73
|
|
|
@@ -329,7 +330,7 @@ claude mcp add --transport http shotops http://localhost:8788/mcp \
|
|
|
329
330
|
```
|
|
330
331
|
|
|
331
332
|
Then ask the agent to, e.g., *"render these two screenshots into a 6.9″ App Store strip and
|
|
332
|
-
emit a
|
|
333
|
+
emit a screenshot bundle for com.acme.app."* Every request must carry the
|
|
333
334
|
`Authorization: Bearer shotops_…` header; a missing, unknown, or revoked token gets a `401`
|
|
334
335
|
before any tool runs.
|
|
335
336
|
|
|
@@ -364,10 +365,9 @@ claude mcp add --transport http shotops https://mcp.shotops.dev/mcp \
|
|
|
364
365
|
--header "Authorization: Bearer shotops_…"
|
|
365
366
|
```
|
|
366
367
|
|
|
367
|
-
The public [
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
since this repo is private.
|
|
368
|
+
The public [MCP docs](https://shotops.dev/docs/mcp) have the same
|
|
369
|
+
instructions for Cursor/CI, plus where to create a token — they're the one place an external
|
|
370
|
+
agent user (not a repo collaborator) can find the connect story, since this repo is private.
|
|
371
371
|
|
|
372
372
|
### Ops (this repo's maintainer only)
|
|
373
373
|
|
|
@@ -376,8 +376,8 @@ since this repo is private.
|
|
|
376
376
|
— the notes here are only what is specific to this package.
|
|
377
377
|
|
|
378
378
|
- **Deploy:** run the repo's deploy script from the repo root; deploys run locally, and a push to
|
|
379
|
-
`main` is a production deploy. Do not hand-run a bare `vercel deploy`.
|
|
380
|
-
|
|
379
|
+
`main` is a production deploy. Do not hand-run a bare `vercel deploy`. Vercel is the only hosted
|
|
380
|
+
target — the Fly app was destroyed in #68.
|
|
381
381
|
- **Runtime env** lives on the `shotops-mcp` **Vercel project**, not in this repo:
|
|
382
382
|
`SUPABASE_URL`, `SUPABASE_SERVICE_ROLE_KEY`, and `MCP_PUBLIC_URL` (pins the public hostname as
|
|
383
383
|
the OAuth issuer), plus `OPENAI_APPS_CHALLENGE_TOKEN` while verifying the MCP domain for public
|
|
@@ -439,7 +439,7 @@ reading an arbitrary server-side path there would be a local-file-inclusion hole
|
|
|
439
439
|
**`emit_bundle` reads local panels off disk too** — an unsigned local server has no account, so it
|
|
440
440
|
can't produce `output: "urls"` refs. Once you are signed in on a trial or Pro, pass the on-disk PNGs
|
|
441
441
|
straight to `emit_bundle` (same local-only `{ path }` door as screenshots) to package a
|
|
442
|
-
`fastlane deliver` zip with no upload and no credits:
|
|
442
|
+
`fastlane deliver` zip with no upload and no cloud credits:
|
|
443
443
|
|
|
444
444
|
```json
|
|
445
445
|
{ "bundleId": "com.acme.app", "panels": [{ "path": "/abs/panel-01.png" }, { "path": "/abs/panel-02.png" }] }
|
|
@@ -447,7 +447,7 @@ straight to `emit_bundle` (same local-only `{ path }` door as screenshots) to pa
|
|
|
447
447
|
|
|
448
448
|
`emit_bundle` and full-resolution renders are the store-ready half of the offer, so they need that
|
|
449
449
|
trial or Pro even here, where the compute is yours. Preview renders need neither an account nor
|
|
450
|
-
credits. `account_status` reports which side of the line this process is on.
|
|
450
|
+
cloud credits. `account_status` reports which side of the line this process is on.
|
|
451
451
|
|
|
452
452
|
**Saving without a token:** a new `save_project` made from local `{ path }` PNGs creates a private
|
|
453
453
|
**pending claim**. It uploads only that saved project's byte-free record and raw source PNGs,
|
|
@@ -464,9 +464,9 @@ manifest through the Studio control plane, downloads only the resolved cells, an
|
|
|
464
464
|
|
|
465
465
|
| | Local (`npx shotops-mcp`) | Hosted (`shotops_…` token) |
|
|
466
466
|
|---|---|---|
|
|
467
|
-
| Render compute | **your machine** ($0, no timeout, no credits on any plan) | our servers — spends your ShotOps credits:
|
|
467
|
+
| Render compute | **your machine** ($0, no timeout, no cloud credits on any plan) | our servers — spends your ShotOps cloud credits: 1 per preview panel, 4 per full-resolution panel |
|
|
468
468
|
| Preview render | free, no account | free on an account; 3 per 30 days, ≤5 panels, without one |
|
|
469
|
-
| Full-resolution render, any `emit_bundle` | trial or Pro (costs no credits) | trial or Pro, and spends credits |
|
|
469
|
+
| Full-resolution render, any `emit_bundle` | trial or Pro (costs no cloud credits) | trial or Pro, and spends cloud credits |
|
|
470
470
|
| Auth | none to preview; a token for account state and store-ready output | account + API token |
|
|
471
471
|
| Saved looks / editable projects / project read+re-render / share links | new project: pending claim; existing/account state: token (below); share links: hosted | ✅ |
|
|
472
472
|
| Screenshot input | local `{ path }` off disk | `request_screenshot_upload` → `{ ref }` |
|
|
@@ -474,7 +474,8 @@ manifest through the Studio control plane, downloads only the resolved cells, an
|
|
|
474
474
|
### Optional: bridge a local render into your hosted account
|
|
475
475
|
|
|
476
476
|
Connect your account and `save_project` / `read_look` / `save_look` / `read_project` /
|
|
477
|
-
`render_project` start working too — **rendering still happens locally and spends no
|
|
477
|
+
`render_project` start working too — **rendering still happens locally and spends no cloud
|
|
478
|
+
credits**, and
|
|
478
479
|
a trial or Pro account unlocks full-resolution output and `emit_bundle` on this machine. A
|
|
479
480
|
deliberate save also uploads its local source PNGs privately so the project reopens with
|
|
480
481
|
screenshots on another device; normal renders and exports never upload.
|
|
@@ -584,7 +585,7 @@ it sends, the postcondition it must reach, and a redacted summary — plus a por
|
|
|
584
585
|
|
|
585
586
|
The plan hash-binds the project revision, desired bytes, normalized Fastlane inputs, Apple setup
|
|
586
587
|
identity and policy version, so later approval cannot drift onto different state. Its **approval
|
|
587
|
-
window is
|
|
588
|
+
window is one hour**; the plan itself stays readable for as long as its sealed workspace exists.
|
|
588
589
|
Concurrency is per resource rather than one hash of the whole app: an unrelated App Store edit is
|
|
589
590
|
reported without invalidating the plan, while a change to a resource the plan writes — or to the
|
|
590
591
|
app, version or App Store state it targets — blocks before any write.
|
|
@@ -648,7 +649,7 @@ shotops-mcp/
|
|
|
648
649
|
shareEmit.ts emit_bundle's server-side share-link creation (reuses Phase-2 modules)
|
|
649
650
|
uploads.ts Phase 10 — upload slots, ref ownership check, output:'urls' storage
|
|
650
651
|
screenshotInput.ts Phase 10 — resolves screenshots[] (inline/ref/url/path) to base64
|
|
651
|
-
env.ts loads ../.env.local; MCP_PORT / STUDIO_ORIGIN / MCP_PUBLIC_URL
|
|
652
|
+
env.ts loads ../.env.local; MCP_PORT / STUDIO_ORIGIN / SHOTOPS_AUTH_ORIGIN / MCP_PUBLIC_URL
|
|
652
653
|
local.ts the LOCAL npx entry point — stdio transport, no auth required to preview
|
|
653
654
|
localDeps.ts the local ToolDeps fork — static-serve renderer, no-op/bridged persistence
|
|
654
655
|
hostedBridge.ts local→hosted bridge (a real MCP client using your shotops_ token)
|
|
@@ -657,8 +658,6 @@ shotops-mcp/
|
|
|
657
658
|
vite.harness.config.mjs the STATIC harness build (local mode's publish prerequisite) → harness-dist/
|
|
658
659
|
build.mjs esbuild bundle of src/local.ts (+ @engine/@api inlined) → dist/local.js
|
|
659
660
|
Dockerfile hosted image — Playwright's Chromium base + this repo's 3 npm installs
|
|
660
|
-
fly.toml Fly app config — RETIRED (#68), kept only for the cold-deploy recipe;
|
|
661
|
-
the running fly.dev machine is NOT a rollback
|
|
662
661
|
verify-mcp.mjs post-deploy smoke test — real MCP round-trip against a hosted URL
|
|
663
662
|
verify-mcp-local.ts local stdio smoke test (tsx src/local.ts, in-repo)
|
|
664
663
|
static-parity.ts pixel-diffs the static-serve render against the Vite-dev render (must be 0)
|