Paywalls, onboarding, subscription analytics, A/B tests, attribution and errors for mobile apps.
Connect Remote server
claude mcp add --transport http mcp https://mcp.fictura.co/mcp --header "X-API-Key: <X_API_KEY>"
{
"mcpServers": {
"mcp": {
"url": "https://mcp.fictura.co/mcp",
"headers": {
"X-API-Key": "<X_API_KEY>"
}
}
}
}
{
"servers": {
"mcp": {
"type": "http",
"url": "https://mcp.fictura.co/mcp",
"headers": {
"X-API-Key": "<X_API_KEY>"
}
}
}
}
Settings > Connectors > Add custom connector
URL: https://mcp.fictura.co/mcp
Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.
Tools 80 found in our last check
search_docsFull-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 or webhooks — the docs are the source of truth and are regenerated on every code change. Returns page paths; pass one t…
list_docsThe 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 guess. No API key required.
read_docThe complete markdown of one documentation page. Accepts a site-relative path such as '/implementation/welcome/sdk-quickstart' (a full docs.fictura.co URL works too). If the path is wrong, the closest real paths come back as suggestions. No API key required.
get_app_setupThe 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 call this before generating integration code — never leave a placeholder API key in what you write. The SDK key is publ…
get_setup_stepWhat to do for one of Fictura's six setup steps, ready to follow: the instructions, this app's real values (so there is nothing to fill in), the full text of that step's docs pages, and how to check it worked. Call this when a person pastes a setup prompt, and follow what it ret…
get_setup_statusWhere this app has got to: the six setup steps and which are really done, worked out from data that has arrived, then the billing state, every Fictura feature toggle and whether it is on, and which third-party integrations (Stripe, RevenueCat, Slack, App Store Connect, …) are co…
update_app_identitySaves what the app IS to Apple, Google and the web: the iOS bundle ID and Apple Team ID (which build the Universal Links file), the Android package and signing fingerprints (which build the App Links file), both store addresses and the website. Send only the fields you know. Eve…
create_tracking_linkCreates a tracking link and returns its shareable URL. A tap is logged as a click, then redirected to destination_url with the click's id, which is how an install is credited to the link. A tap from a computer goes to desktop_url instead, or to the app's website when destination…
get_analyticsThis app's real numbers. `overview` gives headline metrics (users, trials, trial→paid rate, events by name, cancel reasons, 14-day activity). `funnel` gives the ordered conversion funnel with per-step drop-off. `cohorts` compares behaviour across billing outcomes — what converte…
get_attribution_reportWhere installs and revenue actually came from. `summary` is the headline attribution picture (installs, organic vs non-organic, revenue). `kpis` breaks the same window down by source, campaign, link or day. `installs` lists individual installs with their attribution. Defaults to…
list_usersThe app's users, most recently active first — each with an identity label, event count, last seen, and derived churn state (in_trial, converted, cancelled, expired, billing_issue, grace_period, paused, refunded, none). Capped so a large app does not flood the context; `total` re…
get_userOne user's identity (every stitched device / account / RevenueCat id), event breakdown, churn state and recent activity. Accepts the Fictura master user id, or any identifier the app knows them by — a device id, account id or RevenueCat id.
check_entitlementThe 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} returns to a server. Note: `environment` is SANDBOX when the verdict rests on test purchases, so always check it befor…
get_tracking_planEvery 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 event name instead of introducing a near-duplicate — the name chosen here is the same string an experiment later names…
list_surfacesEvery paywall and onboarding flow, what is actually being served at each placement (running experiment > live > none), and the valid placement names. IMPORTANT: read `placements` before writing a placement string into code. The list is configured ∪ observed, so a name that appea…
get_surfaceThe full configuration of one paywall or onboarding flow, plus its version history. Note that configs never contain price strings — prices resolve at render time from the PurchasesAdapter's packages, so never copy a price literal out of (or into) a config.
list_templatesThe 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 so you pick a real template key rather than inventing one.
list_experimentsEvery experiment with status and, for running or finished ones, full Bayesian results — exposures, conversions, and the probability each variant is best.
get_experimentOne experiment with its variants and full Bayesian results.
create_experimentCreate an A/B test as a DRAFT: nobody sees it until start_experiment. 2 to 4 arms, each pointing at a paywall or onboarding flow of this app on the experiment's surface (ids from list_surfaces); one arm may be a holdout with no target (it keeps the live config). Exactly one cont…
start_experimentStart a draft: from now on its arms are served to the users who pass its targeting. Refused when another test is running or paused on the same surface and placement. Only works when the app allows MCP writes.
pause_experimentPause a running test: nobody new enrolls, and users already in it keep their arm. resume_experiment picks it up again. Only works when the app allows MCP writes.
resume_experimentResume a paused test so new users enroll again. Refused when another test now holds its surface and placement. Only works when the app allows MCP writes.
stop_experimentStop a running or paused test for good without rolling anything out: everyone gets the live config again. It can't be restarted. Rolling out a winner is done by a person in the dashboard. Only works when the app allows MCP writes.
get_acquisition_report`roas` gives per-campaign spend, attributed installs/trials/paying users, revenue, CPI, CAC and ROAS, plus blended totals and explicitly-unattributed revenue — always keep attributed and blended figures apart when reporting these. `spend` gives raw daily ad-spend rows. `links` l…
get_store_analyticsStore-reported numbers synced from Appfigures: downloads, re-downloads, updates, uninstalls, store revenue after the store's cut (subscriptions, in-app purchases, ads), top countries, the ratings snapshot, recent reviews with text, and category chart positions. Money is in micro…
list_campaignsCampaigns 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 set up. This calls the provider's API, so prefer get_acquisition_report for historical numbers.
list_creatorsCreator records with a 28-day funnel per creator (clicks, installs, trials, paying users) and the tracking links tagged to each.
get_link_infrastructureHow 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 that Fictura serves in the Universal Links / App Links association files, plus ios_ready and android_ready. Get these…
get_push_configWhether push is set up and who could receive it: registered-device counts per billing cohort (all / paid / trial / free) and whether OneSignal is configured. Returns counts and configuration only — never device tokens or individual recipients.
list_store_productsThis 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 product that actually exists. Pass subscription_id to also fetch Apple's price ladder for that one product (Apple scopes p…
list_error_issuesStart here to see what is broken: grouped issues from the backend and the app together, each with its source, level, status, event and user counts. Newest activity first, unresolved only. Console lines from the app are hidden unless include_console is true. Pass next_cursor to r…
search_error_issuesFind an issue by text in its title or culprit, across every issue the app has. Use it when you know the error message, exception type or function. Same filters and rows as list_error_issues.
search_error_eventsSingle occurrences across issues, newest first, or counts with group_by. Use it to answer which release or route an error hits, whether a person hit it, or what failed in one trace. Open one with get_error_event.
get_error_eventOne occurrence: frames with source lines and variables, request, tags, contexts, breadcrumbs, causes and trace id. Pass issue_id for its latest event, or event_id. Use it to see why one error happened. Long events give up variables, then library frames, then breadcrumbs, and `tr…
get_error_issueOne issue with its status, history, 30 days of daily counts and recent occurrences. The newest occurrence has its stack and frames, the older ones are one-line summaries. Use it to see how an issue behaves over time. For a fix, get_error_issue_brief is shorter; for source lines…
get_error_issue_briefUse this first when asked to fix an error. One issue condensed: in-app frames with their source lines, the request, tags, breadcrumbs before it, log lines from the same trace, facets (release, OS, device, route), cause chain, and a ready-to-use fix prompt.
get_issue_tag_valuesHow often each value of one tag or facet appears on one issue in the last 30 days. Use it to see where an issue concentrates: which release, route, device, logger or person. Leave out key to list the keys there are.
get_issue_activityWhat people and Fictura did to one issue, newest first: status changes, assignments, priority, notes with their text, tickets, regressions. Use it before changing an issue, to see who already looked at it.
search_logsApplication log lines from the backend SDK, newest first, or counts with group_by. Use it to see what happened around an error: pass trace_id for one request's lines, or q and level to search. Lines are kept 14 days, and the default range is the last 24 hours.
search_tracesWith no filters: every route and screen with its count, error rate, p50, p95 and slowest dependency. With any filter: matching spans from the backend and the app, or count, avg, p50, p95 and errors with group_by. Use it to find what is slow or failing, then open one with get_tra…
get_traceOne trace (app → backend → dependencies) as a tree: names, services, start offsets, durations, HTTP status and errors, plus the error events linked to it. Take the trace_id from an event or from search_traces. Use it to see where the time went or what failed first. Long traces p…
list_error_alertsEvery error alert Fictura fired, newest first: when, which trigger, the issue and its source, the channels, and whether it was delivered. Use it to check an alert went out, or what paged someone.
list_alert_rulesThis app's alert rules with their triggers, conditions, channels and throttles. defaults_active means no rule is enabled, so the built-in defaults listed there apply. Use it to see what will and won't alert.
list_releasesReleases from the app and the backend, newest first. App rows have crash-free sessions and users and adoption; backend rows have crash-free and error-free requests. Each row states its source. Use it to tell whether a release made things worse.
update_error_issueResolve, 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 issues).
update_error_issuesThe same change on up to 100 issues: resolve, ignore or reopen them, assign them, set their priority, or add a note to each. Answers per issue, with counts. Only works when the app allows MCP writes (Issues settings → Let MCP keys change issues).
list_inbound_filtersThis app's inbound filters: rules that drop a matching error at ingest, counted but never stored or alerted on. exc_type and release match exactly, message is a glob (* = anything, any case), environment is exact and `simulator` also drops simulator events. discarded_7d counts d…
create_inbound_filterDrop matching errors at ingest from now on (within 30 seconds): counted, never stored, grouped or alerted on. Use it for noise nobody will fix. Kinds as in list_inbound_filters; environment `simulator` drops events from simulators and emulators. Refuses an exact duplicate. Only…
delete_inbound_filterStop dropping what one inbound filter matches; new events land again within 30 seconds. Events it already dropped are not recovered. Take the id from list_inbound_filters. Only works when the app allows MCP writes.
get_uptime_monitorThe URL Fictura pings every minute for this app, whether it is up or down, the last check, consecutive failures, when the current downtime started, and availability over 24 hours and 7 days. monitor is null when none is set.
set_uptime_monitorSet or replace the URL Fictura pings every minute (three failures in a row mark it down and alert). A new URL starts over as unknown. enabled false pauses it. Only works when the app allows MCP writes.
get_error_settingsThis app's error settings (auto-resolve days, built-in noise rules, crash-free threshold, digest, code links, retention, whether MCP may write) and tracing settings (sample rate, hosts that get trace headers). connection_can_write says whether this connection's write tools will…
update_tracing_settingsSet the share of traces the SDKs keep, and the hosts the app's SDK sends trace headers to (replacing the list). A field you leave out keeps its value. SDKs read it from their config within a minute. Only works when the app allows MCP writes.
get_performance_overviewHow fast the app is right now, backend and frontend: backend requests per minute, p95 and error rate against the window before; screen and page load times; then the routes that take the most total time, the slowest screens and pages, and the slowest dependencies (HTTP hosts, dat…
get_endpoint_summaryEverything about one row of the Performance page, to answer 'why is this slow?': count, error rate, p50 to p99 and the change against the window before; where the time goes inside each request (database, HTTP and model calls, and the backend routes a screen waited on); what the…
list_dependenciesThe HTTP hosts and database tables the app's services call, by total time spent: calls, calls per minute, error rate, p50 to p99, 4xx and 5xx. kind http, db or all (default). Open one with get_endpoint_summary (op http.client or db).
get_spanOne span in full: name, op, service, timing, status, every attribute, the errors that happened in it, and the log lines written while it ran. Take the trace_id and span_id from get_trace.
get_ai_usageModel calls by model (gen_ai spans): calls, per minute, error rate, p50 to p99, total time, input and output tokens; and MCP tool calls by tool (mcp.server spans). Prompt and completion text is never stored, so it is never here.
get_jobsWork done outside requests: background tasks, queue publish and process, and cron runs, with counts, failures and timings; each cron with its last run, its usual gap, and late: true when it has not run for twice that gap.
compare_releasesEvery route, screen and page seen in both releases, with count, p50, p95 and error rate in each, sorted by the extra time per minute release b spends against a: what got slower or faster. Also what appears in only one of them. Take release names from list_releases or get_tracing…
get_web_vitalsThe web app's Core Web Vitals from real browsers: a 0 to 100 performance score (LCP 30%, INP 30%, CLS 15%, FCP 15%, TTFB 10%, Google's thresholds), each vital's p75 with its good / needs improvement / poor counts, and pages ranked by opportunity (how much the score would rise if…
get_mobile_vitalsThe mobile app's vitals from real devices: cold (and warm) app start, time to initial display (ttid) and full display (ttfd), slow and frozen frame percentages, and JS stall time; overall, per screen (busiest first) and per release. Each with p50, p75, p95 and the sample count.…
list_monitorsEvery performance monitor: what it watches (metric, ops, route), its threshold and window, and its state (ok, firing, no_data) with the last value read. A firing monitor has an open issue: issue_id opens with get_error_issue.
get_tracing_healthWho is sending traces in the last 24 hours: each service with its SDK and version, frontend or backend, last span, span count, average sample rate and environments; how many of the app's traces reached a backend (joined traces: zero means the app is not sending traceparent to th…
create_ticketCreate a ticket for an error issue in GitHub Issues, Linear or Jira (connected on the Tools tab). The body is short and redacted. One GitHub issue per error issue. Only works when the app allows MCP writes.
link_pull_requestTie an existing GitHub PR (by URL) to an issue. When it merges, Fictura resolves the issue in the release that ships it. Only works when the app allows MCP writes.
create_fix_prOpen your fix for an issue as a draft PR in the app's repo, with `Fixes <short id>` so the issue resolves when it ships. Send patches (git diff) per file. No build, CI or .github changes. Needs "Let MCP keys open pull requests".
create_pull_requestOpen any change as a draft PR on a new branch in one of the repos connected to Fictura. Optionally tie it to an issue. Nothing under .github/. Needs "Let MCP keys open pull requests".
get_pull_request_statusThe PRs tied to an issue (opened by Fictura or linked), with state, draft, CI checks, merge and the release that shipped it.
start_fix_runStart a hosted fix run: Fictura's AI finds the root cause and, if allowed, opens a draft PR. It spends the app's own Anthropic money, capped per run and per day. Poll get_fix_run. Needs MCP writes and AI fixes on.
get_fix_runA fix run's status, root cause, plan, files, tests, cost so far, and its pull request.
get_paywall_docThe 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_paywall_doc, and edit the document you got rather than writing one from scratch — keep node ids, change only what was asked…
validate_paywall_docRuns a document through the same parser and renderer a save uses and reports what is wrong, if anything. Changes nothing.
save_paywall_docReplaces 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 a live paywall — copy it in the dashboard first. Needs an MCP key that can edit. Products, translations and other setti…
create_paywall_draftCreates 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 live is done in the dashboard. Needs an MCP key that can edit.
pair_editorConnects 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_* tools. The code works once and for 10 minutes; a pairing lasts 24 hours or until either side stops it.
editor_get_docThe 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, plus the document model reference. Read this before editor_set_doc and edit what you got — keep node ids, change only wha…
editor_set_docReplaces 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 document is validated first and refused with the problems if it does not parse. Needs an MCP key that can edit.
unpair_editorStops this pairing. The editor shows that the agent left.
Headers
| Name | Description |
|---|---|
X-API-KeyOptional, secret | Optional Fictura MCP key (fk_mcp_...) from Dashboard > Setup > Coding agents (MCP). Leave it out to sign in with your Fictura account (OAuth) instead. |
Details
| Endpoint | https://mcp.fictura.co/mcp (Streamable HTTP) |
| Package | @fictura/[email protected] (NPM, stdio) |
| First published | 29 Oct 2026 |
| Last updated | 29 Oct 2026 |
| Registry name | co.fictura/mcp |
More developer tools servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
