{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_3b22bv7zadup","handle":"fictura","url":"https://wellknown.network/agents/fictura","links":{"self":"https://wellknown.network/agents/fictura/record.json","html":"https://wellknown.network/agents/fictura","markdown":"https://wellknown.network/agents/fictura/record.md","api":"https://wellknown.network/api/v1/agents/fictura","status":"https://wellknown.network/api/v1/agents/fictura/status","claim":"https://wellknown.network/agents/fictura/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/fictura/claim.json","badge":"https://wellknown.network/agents/fictura/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/fictura/history","tools":"https://wellknown.network/api/v1/agents/fictura/tools"},"ard":{"identifier":"urn:air:mcp.fictura.co:server:fictura","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Fictura","summary":"Paywalls, onboarding, subscription analytics, A/B tests, attribution and errors for mobile apps.","description":"Paywalls, onboarding, subscription analytics, A/B tests, attribution and errors for mobile apps.","publisher":{"name":"co.fictura","url":null},"homepage":"https://docs.fictura.co/connections/outgoing/mcp-server","repository":"https://github.com/Apex-Byte-Technologies/fictura-mcp","version":"0.1.2","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://mcp.fictura.co/mcp","type":"mcp_streamable_http","auth":null,"probeable":true},{"url":"npm:@fictura/mcp","type":"package_npm","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-10-29T17:25:08.711684Z","publishedAt":"2026-10-29T17:25:08.711684Z","registryName":"co.fictura/mcp"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"dev.package-management","name":"Packages & Dependencies","confidence":1,"provenance":"derived"},{"slug":"dev.docs-lookup","name":"Documentation Lookup","confidence":1,"provenance":"derived"},{"slug":"commerce.ecommerce","name":"E-commerce Operations","confidence":1,"provenance":"derived"},{"slug":"analytics.reporting","name":"Reporting & Dashboards","confidence":1,"provenance":"derived"},{"slug":"communication.notifications","name":"Notifications","confidence":0.977,"provenance":"derived"},{"slug":"code.documentation","name":"Code Documentation","confidence":0.583,"provenance":"derived"},{"slug":"code.debugging","name":"Debugging","confidence":0.569,"provenance":"derived"},{"slug":"documents.conversion","name":"Document Conversion","confidence":0.554,"provenance":"derived"}],"categories":["analytics","code","commerce","communication","dev","documents"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 2h ago.","lastOkAt":"2026-11-04T18:24:41.496Z","lastProbedAt":"2026-11-04T18:24:41.496Z","statusComputedAt":"2026-11-04T18:27:37.191Z","reliability30d":{"probes":12,"successRate":1,"p50Ms":107,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":12,"ok":12,"authBoundaryOk":0,"serviceOk":12,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-11-04T18:24:41.496Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":131,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-04T09:28:33.100Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":124,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-04T00:29:54.592Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":109,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-03T16:30:48.967Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":101,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-03T08:34:26.860Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":104,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-03T00:32:50.356Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-02T16:29:02.083Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-02T08:25:25.738Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-01T23:21:39.388Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-01T15:27:34.423Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":125,"error":null,"detail":{"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"toolCount":44,"toolsHash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","serverName":"fictura","capabilities":["tools","prompts"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"search_docs","description":"Full-text search across the Fictura docs, grouped by page. Use this before answering any 'how do I…' question about the SDK, API, paywalls, entitlements, links "},{"name":"list_docs","description":"The full documentation index — every page path, grouped by section, with a one-line description. Use it to find the right page when a search term is hard to gue"},{"name":"read_doc","description":"The complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works"},{"name":"get_app_setup","description":"The real values needed to wire the Fictura SDK into a codebase: the API base URL, this app's publishable SDK key (gk_…), and the RevenueCat webhook URL. ALWAYS "},{"name":"get_setup_status","description":"What is actually configured for this app: the setup checklist, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, Re"},{"name":"get_analytics","description":"This app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the"},{"name":"get_attribution_report","description":"Where installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same"},{"name":"list_users","description":"The app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expi"},{"name":"get_user","description":"One user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or "},{"name":"check_entitlement","description":"The authoritative paid/not-paid verdict for one user, unified across Stripe, RevenueCat, App Store and Play — the same answer GET /api/v1/entitlements/{user_id}"},{"name":"get_tracking_plan","description":"Every event this app has ever sent, with volume, last-seen, and whether capture is switched off. Use it before adding instrumentation so you reuse the existing "},{"name":"list_surfaces","description":"Every paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT:"},{"name":"get_surface","description":"The full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render tim"},{"name":"list_templates","description":"The one-click starter templates available for paywalls or onboarding flows, with the template key and what each looks like. Use this when asked to add a paywall"},{"name":"list_experiments","description":"Every experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best."},{"name":"get_experiment","description":"One experiment with its variants and full Bayesian results."},{"name":"get_acquisition_report","description":"`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — "},{"name":"get_store_analytics","description":"Store-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchase"},{"name":"list_campaigns","description":"Campaigns read live from a connected ad platform: status, daily budget and ad sets. Returns a not_connected result rather than failing when the provider is not "},{"name":"list_creators","description":"Creator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each."},{"name":"get_link_infrastructure","description":"How links reach the app. `app_links` is the most important for integration work: it returns the iOS team id, bundle id, Android package and SHA-256 fingerprints"},{"name":"get_push_config","description":"Whether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Re"},{"name":"list_store_products","description":"This app's auto-renewable subscriptions in App Store Connect: product id, billing period and Apple review state. Use it to check that a paywall references a pro"},{"name":"list_error_issues","description":"The error feed: grouped issues with level, status, event and user counts, a 14-day sparkline, plus the app's uptime summary. Defaults to unresolved issues only."},{"name":"get_error_issue","description":"One issue in full: the group, its 50 most recent occurrences with stack traces, release and environment, and 30 days of daily counts. This is the tool to reach "},{"name":"search_error_issues","description":"Find issues by text in the title or culprit, platform, or release (first or last seen in). Returns the same rows as list_error_issues, filtered."},{"name":"get_error_issue_brief","description":"One issue condensed for fixing it: latest stack (resolved when source maps exist), in-app frames, breadcrumbs before it, facets (release, OS, device, screen), c"},{"name":"update_error_issue","description":"Resolve, ignore or reopen an issue, assign it, set its priority, or add a note. Only works when the app allows MCP writes (Issues settings → Let MCP keys change"},{"name":"get_trace","description":"Every span of one trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linke"},{"name":"get_paywall_doc","description":"The JSON document a Studio (visual editor) paywall is made of, with its status and version, plus the reference to the document model. Read this before save_payw"},{"name":"validate_paywall_doc","description":"Runs a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_paywall_doc","description":"Replaces a draft paywall's document with the one given, as a new version (History in the dashboard shows it as `mcp: <note>` and can roll it back). Refused for "},{"name":"create_paywall_draft","description":"Creates a draft paywall from a Studio template (template_key, from list_templates — the webview ones) or from a document you wrote. It is never made live: going"},{"name":"pair_editor","description":"Connects to the paywall editor a person has open, using the 6-character code shown under “Pair an agent” in the Studio. Returns a pairing_id for the editor_* to"},{"name":"editor_get_doc","description":"The document exactly as it is on the person's screen (unsaved changes included), which paywall it is, the screen they are on and the node they have selected, pl"},{"name":"editor_set_doc","description":"Replaces the document in the person's open editor with the one given. It is NOT saved: the person sees the change, can undo it, and saves it themselves. The doc"},{"name":"unpair_editor","description":"Stops this pairing. The editor shows that the agent left."},{"name":"get_onboarding_doc","description":"The JSON document a builder-made onboarding flow is made of, with its status and version, plus the reference to the document model. Read this before save_onboar"},{"name":"validate_onboarding_doc","description":"Runs a document through the same parser, step-key check and renderer a save uses and reports what is wrong, if anything. Changes nothing."},{"name":"save_onboarding_doc","description":"Replaces a draft flow's document with the one given, as a new version (the dashboard's history shows it as `mcp: <note>` and can roll it back). Refused for a li"},{"name":"create_onboarding_draft","description":"Creates a draft onboarding flow from a document you wrote (see get_onboarding_doc's reference). It is never made live: going live is done in the dashboard. Need"},{"name":"start_appsflyer_import","description":"Import everything AppsFlyer holds for this app: installs and the channel, campaign, adset and ad behind each one, in-app events and purchases, uninstalls, reins"},{"name":"get_appsflyer_import_status","description":"Whether AppsFlyer is connected, the latest import run (status, progress, rows imported, duplicates skipped, people created, date range covered, error if it stop"},{"name":"get_appsflyer_attribution_summary","description":"What the AppsFlyer import brought in about where people came from: people with an imported attribution, split by media source (organic included) and acquisition"}],"package":null,"toolSurface":{"id":"ts_6tg3asupwnmv","endpointId":"ep_86j32eu2dts4","hash":"00dc48df34c7a7e96fdf6b842d4717fc6871c7ef99bd4a266e64ac90b1e495bf","toolCount":44,"serverName":"fictura","serverVersion":"1.0.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-31T23:27:17.310Z","lastSeenAt":"2026-11-04T18:24:41.488Z","observations":12,"toolNames":["search_docs","list_docs","read_doc","get_app_setup","get_setup_status","get_analytics","get_attribution_report","list_users","get_user","check_entitlement","get_tracking_plan","list_surfaces","get_surface","list_templates","list_experiments","get_experiment","get_acquisition_report","get_store_analytics","list_campaigns","list_creators","get_link_infrastructure","get_push_config","list_store_products","list_error_issues","get_error_issue","search_error_issues","get_error_issue_brief","update_error_issue","get_trace","get_paywall_doc","validate_paywall_doc","save_paywall_doc","create_paywall_draft","pair_editor","editor_get_doc","editor_set_doc","unpair_editor","get_onboarding_doc","validate_onboarding_doc","save_onboarding_doc","create_onboarding_draft","start_appsflyer_import","get_appsflyer_import_status","get_appsflyer_attribution_summary"],"distinctSurfaces":1},"endpointFacts":[{"id":"ep_86j32eu2dts4","url":"https://mcp.fictura.co/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-11-01T23:21:39.403Z","auth":{"observedAt":"2026-11-01T23:21:39.935Z","authRequired":false,"scheme":null,"resourceMetadata":{"url":"https://mcp.fictura.co/.well-known/oauth-protected-resource/mcp","resource":"https://mcp.fictura.co/mcp","authorizationServers":["https://dxdgawdmjnuwvbjdwelb.supabase.co/auth/v1"],"scopesSupported":["email"]},"authorizationServer":{"url":"https://dxdgawdmjnuwvbjdwelb.supabase.co/.well-known/oauth-authorization-server/auth/v1","issuer":"https://dxdgawdmjnuwvbjdwelb.supabase.co/auth/v1","grantTypesSupported":["authorization_code","refresh_token"],"codeChallengeMethodsSupported":["S256","plain"],"tokenEndpointAuthMethodsSupported":["client_secret_basic","client_secret_post","none"],"dynamicClientRegistration":true,"dpopSigningAlgValuesSupported":[],"clientIdMetadataDocumentSupported":null},"conformance":{"dpop":false,"rfc8414":true,"rfc9728":true,"pkceS256":true,"clientIdMetadataDocument":false,"dynamicClientRegistration":true}},"tls":{"observedAt":"2026-11-01T23:21:39.952Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"mcp.fictura.co","issuer":{"commonName":"YE2","organization":"Let's Encrypt"},"validFrom":"2026-10-29T08:13:57.000Z","validTo":"2027-01-27T08:13:56.000Z","daysToExpiry":83,"sanCount":1,"fingerprint256":"F3:66:EF:39:CF:4E:5B:AA:6F:21:90:3B:82:BD:A6:8B:E8:42:71:EA:4B:3E:45:7D:28:DD:DC:BF:30:7C:62:CB"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"co.fictura/mcp","url":"https://registry.modelcontextprotocol.io/v0/servers/co.fictura%2Fmcp","firstSeenAt":"2026-10-31T21:18:40.231Z","fetchedAt":"2026-11-04T15:22:35.063Z","normalizedAt":"2026-11-04T15:22:35.063Z"}]},"firstSeenAt":"2026-10-31T21:18:40.231Z","updatedAt":"2026-11-04T18:28:45.449Z"}