@apex-inc/mcp-server 0.48.8 → 0.48.10

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apex-inc/mcp-server",
3
- "version": "0.48.8",
3
+ "version": "0.48.10",
4
4
  "description": "MCP server for Apex. Your coding agent talks to the same Apex the dashboard uses.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -66,7 +66,8 @@ Interactive flows: MCP prompts `new-experiment` and `experiment-review` orchestr
66
66
 
67
67
  ## Screenshots, exposure & the wiring gate
68
68
 
69
- - **Screenshots are first-class.** Code experiments from Cursor author the variant in local code. Apex does **not** auto-capture a public URL on create — that page does not have the unpublished variant, and a guessed host (a sibling workspace's brand domain) shows the wrong site on both arms. Capture both arms on localhost with `?_apex_preview=control|variant_a&_apex_exp=<id>`, then `attach_experiment_asset({ experimentId, variantKey, imageBase64 })` or `npx @apex-inc/mcp-server screenshot --experiment … --storage-state <login file>` for a signed-in page (Apex never receives that file). After deploy, `recapture_experiment_screenshots` refreshes the live host. Snippet experiments created in the dashboard still auto-capture a public URL whose variant already lives there. Code experiments with no pictures are captured once, the first time a live visitor on the target site sees them; if both arms come out the same picture, Apex keeps neither and tells the owner on the experiment page and in a Pictures Match letter that the variant may not be showing. `recapture_experiment_screenshots` also refuses to save a matching or partial pair; the owner can add their own picture of each arm on the experiment page. That is a fallback, not a reason to skip the localhost pair: the owner needs pictures before launch, and a matching pair is how you catch a variant that isn't rendering.
69
+ - **Screenshots are first-class.** Code experiments from Cursor author the variant in local code. Apex does **not** auto-capture a public URL on create — that page does not have the unpublished variant, and a guessed host (a sibling workspace's brand domain) shows the wrong site on both arms. Capture both arms on localhost with `?_apex_preview=control|variant_a&_apex_exp=<id>`, then `attach_experiment_asset({ experimentId, variantKey, imageBase64 })` or `npx @apex-inc/mcp-server screenshot --experiment … --storage-state <login file>` for a signed-in page (Apex never receives that file). After deploy, `recapture_experiment_screenshots` refreshes the live host. Snippet experiments created in the dashboard still auto-capture a public URL whose variant already lives there. Code experiments with no pictures are captured once, the first time a live visitor on the target site sees them; if both arms come out the same picture, Apex keeps neither and tells the owner on the experiment page and in a Pictures Match letter that the variant may not be showing. `recapture_experiment_screenshots` also refuses to save a matching or partial pair; the owner can add their own picture of each arm on the experiment page. That is a fallback, not a reason to skip the localhost pair: the owner needs pictures before launch, and a matching pair is how you catch a variant that isn't rendering. Letter (Adaptive Journey) tests have no page to visit: `recapture_experiment_screenshots` redraws each arm's letter as it sends, in the workspace's look. Apex also retakes them on its own when the workspace's logo or colors change.
70
+ - **The daily recap on demand.** Every evening Apex emails owners and admins a recap of each running experiment, with a picture of each arm. `send_daily_recap_to_me` sends today's recap now, only to the signed-in person. Use it when the user wants to see the recap or check how it looks after a change.
70
71
  - **Target URL is this workspace.** `target_url` must be a host named on the **active** workspace (`list_workspace_environments` + the workspace site). If the merchant already named a workspace, switch to it — do not ask which workspace again. If they have multiple hosts on that workspace, ask which URL. Never guess `apex.inc` or any other workspace's domain.
71
72
  - **Mobile/Capacitor experiments capture on-device.** When the experiment runs on an authed in-app screen (servers can't reach it), tell the dev to call `Apex.captureVariantScreenshot({ experimentId, variantKey })` on the variant's screen, keyed to the resolved variant in a `useEffect`, in a debug build (`Apex.initialize({ ..., debug: true })`). It no-ops in production and lands the shot on the dashboard card + gallery like web/agent captures.
72
73
  - **Exposure auto-fires.** When a variant resolves via `useApexVariant` (web) or `Apex.getVariant()` (mobile), the SDK fires the canonical `experiment_exposure` event — the denominator for results. You don't fire it manually.
@@ -341,7 +341,7 @@ The full flow lives in the `apex-setup` skill and the `/setup-apex` prompt: sign
341
341
 
342
342
  If get_setup_state shows first-run incomplete, name the merchant before inventing events.
343
343
 
344
- After ads are connected, make a paid Apex Link before inventing UTMs. Do not stamp conversion ack. `create_apex_link` writes the paid medium by default; pass `placement: "social-post"` (or `social-bio`, `other`) for a free post so it never lands in paid reporting. `other` needs `source` naming the site, show, or community (e.g. `indie-hackers`) so signups credit it by name. A link shows its landing page's card when pasted into Slack, iMessage, LinkedIn, or X; pass `preview_title`, `preview_description`, or `preview_image_url` only when that link should look different. `set_ad_measurement_events` chooses which sales to forward and returns a URL if the legal sentence is still open. `set_conversion_source_of_truth` picks who owns the sale. The rail finishes when those things exist — there is no mark-complete tool.
344
+ After ads are connected, make a paid Apex Link before inventing UTMs. Do not stamp conversion ack. `create_apex_link` writes the paid medium by default; pass `placement: "social-post"` (or `social-bio`, `other`) for a free post so it never lands in paid reporting. `other` needs `source` naming the site, show, or community (e.g. `indie-hackers`) so signups credit it by name. A link shows its landing page's card when pasted into Slack, iMessage, LinkedIn, or X; pass `preview_title`, `preview_description`, or `preview_image_url` only when that link should look different. `set_ad_measurement_events` chooses which sales to forward and returns a URL if the legal sentence is still open. `set_conversion_source_of_truth` records whether another tool already sends the sale; Apex holds everything for Meta and Google until it is answered. The rail finishes when those things exist — there is no mark-complete tool.
345
345
 
346
346
  ## Recipe: Apex Links for app installs (Mobile Measurement)
347
347
 
@@ -34,7 +34,7 @@ Ask the owner which event is the sale, signup, or lead that matters. Save it wit
34
34
  Call get_setup_state after every write and work the next step with the tool it names. When the owner says a step or area is not for them, record it with skip_setup_step or decline_setup_area, in their words. Never record one to make progress look finished. No tool marks a step done; steps finish when the real thing happens.
35
35
 
36
36
  ## 7. Browser steps
37
- When the next step needs a person (payment, an ad or app store console, DNS, legal acknowledgements), give the link and the reason from the checklist and wait. Use start_integration_install for GitHub, Stripe, ad platforms, and Google Analytics; it polls until connected. After ads are connected, make a paid Apex Link before inventing UTMs.
37
+ When the next step needs a person (payment, an ad or app store console, DNS, legal acknowledgements), give the link and the reason from the checklist and wait. Use start_integration_install for GitHub, Stripe, ad platforms, and Google Analytics; it polls until connected. After ads are connected, make a paid Apex Link before inventing UTMs. Apex sends nothing to an ad platform until someone says whether another tool already sends there: check the repo for AppsFlyer, Adjust, Branch or Singular, ask about Shopify's app or a pixel, and record the answer with set_conversion_source_of_truth. If the app already uses AppsFlyer, record AppsFlyer as the sender for its networks before wiring ad sends, then follow get_mmp_migration: keep AppsFlyer in the app until its remove step, and use the event names and SKAN report address it gives.
38
38
 
39
39
  ## 8. First value
40
40
  Once events are live, show the owner what arrived with apex_recent_events, and give them the live stream link it returns so they can watch their own site talk to Apex. Then propose exactly one first step from what you learned about the organization: one experiment with plan_experiment, or one message with recommend_communications. Say why it fits this workspace in a sentence. Create nothing live without the owner's yes; a draft they can open is fine.