VoidhashDocs
DocumentationAPI reference
Dashboard
Get started
Introduction
Quickstart
Setup
Setup overview
Create a project
Products and perks
Paywall locations
CLI
Paywall components
Components
Develop a component
Editor panels
Component definition
Publishing
Installing and capabilities
SDKs
Swift
Kotlin
React Native
Web
Store setup
Connect the App Store
Connect Google Play
Connect Stripe
Record payments from other sources
API libraries
Node.js
PHP
Rust
Go
Resources
MCP server
Ad measurement
Meta ads
Migrate in observer mode
Delete a person's data

MCP server

Connect an AI agent to Voidhash. It signs in as you, with no key to copy.

The Voidhash MCP server connects an AI agent to Voidhash. A compatible agent can answer support questions about your end users, manage products, perks and store mappings, design, deploy and A/B test paywalls, run feature flags, read revenue, acquisition and ad performance, debug webhooks, and manage your team and settings. Changes that cannot be undone wait for your agreement, and a few things, such as store credentials and API keys, stay with you. This page shows how to add the server to your agent, how it signs in, which tools it offers, and how to confirm that it works.

Connect your agent

Add the server to your agent. It signs in through your browser the first time it uses Voidhash, so there is no key to copy or store.

AgentHow to add the server
Claude Codeclaude mcp add --transport http voidhash https://api.voidhash.com/api/mcp
CursorThe Add to Cursor button under Connect an agent in Studio, or .cursor/mcp.json
Codexcodex mcp add voidhash --url https://api.voidhash.com/api/mcp
VS CodeThe Add to VS Code button under Connect an agent in Studio
Claude DesktopSettings → Connectors → Add custom connector, with the server URL

To set up every agent on your computer at once, run:

npx voidhash-cli mcp install

It finds Claude Code, Cursor, Codex, VS Code and Claude Desktop and adds the server to each one you choose. It writes no keys.

Other agents need a remote MCP server that uses streamable HTTP and supports MCP sign-in (OAuth). Clients that use JSON configuration commonly accept this shape:

{
  "mcpServers": {
    "voidhash": {
      "type": "http",
      "url": "https://api.voidhash.com/api/mcp"
    }
  }
}

Your agent acts as you

When the agent first calls the server, your browser opens and you sign in to Voidhash. From then on the agent acts as you: it can do what your role allows in each project of each organization you belong to, and nothing more. When your role changes, or you leave an organization, the agent's access changes on its next request.

Agents you sign in are listed under Settings → Connected apps in Studio, with the CLI. From there you can:

  • make an agent read-only, so it can read but every change is refused;
  • disconnect an agent, which then needs to sign in again.

A newly connected agent can do everything your role allows; make it read-only from Connected apps right after it first appears there. Each agent keeps its setting when it signs in again, and an agent that goes unused for 90 days is signed out. An agent can never change its own setting, disconnect other apps, or create keys; only you can, signed in to Studio.

Agents connected before agents could reach every project

Agents used to be approved for one organization. Because an approval now covers every organization you belong to, agents approved before that change are asked to sign in again, so you approve the new access.

Every change an agent makes is recorded in the audit log as yours, with the agent named beside you.

Unattended agents use a secret key

An agent that runs on a server or on a schedule, with nobody there to sign in, uses a project secret key instead. Create one with only the access it needs; see Limit what a secret key can do. Send it as a bearer token: Authorization: Bearer vh_sk_....

Server

The server runs at one URL:

https://api.voidhash.com/api/mcp

It uses streamable HTTP as its transport. It implements the stateless MCP protocol, version 2026-07-28. Each request stands on its own, with no initialization handshake or session to keep alive. Clients that support only the earlier session-based versions cannot connect.

Tools

The server groups its tools into toolsets, one for each part of Voidhash. Each tool does one task and combines the reads it needs: get_person, for example, returns a person's profile, access, subscriptions, purchases and recent events in one call.

A request lists, and can call, only the tools you (or the secret key) have permission for, so the same server serves a read-only reporting agent and a paywall designer. A read-only agent sees only the tools that read. Tools that read carry MCP's read-only annotation, so clients can run them without asking you; tools that delete or overwrite something are marked destructive.

Choosing a project

Every project tool takes an optional project argument, a project ID or slug. list_projects lists the projects you can use, with their organizations. You can leave project out when you have only one project, when the agent uses a secret key (which belongs to one project), or when the client sends a default project in the X-Voidhash-Project header. Otherwise the tool asks for one.

Team tools (list_members, invite_member, change_member_role, remove_member, create_project, list_notices and send_feedback) take an optional organization instead: its ID, slug or name. They default to the organization of your default project.

Names instead of IDs

Tools take things the way people name them: a product, perk, paywall or location by its ID, slug or exact name; an end user by email, distinct ID or person ID; a webhook by its ID, name or URL; a flag by its key. When a name fits several things, the tool lists them with their IDs instead of guessing.

Results start with a short summary in words, with money and dates written as people read them and the IDs a follow-up call needs, followed by the same result as structured data. Long lists come a page at a time. When a call fails, the error says what was wrong and which tool or argument fixes it.

Changes that ask first

A change that cannot be undone, or that reaches many end users at once, does not happen on the first call. The tool reports what would change and who it affects, changes nothing, and returns the exact arguments that make the change, with confirm: true. Your agent should show you the report and call again only once you agree. The confirmed call acts on the IDs you were shown, so a name that starts to mean something else in between cannot redirect it.

These tools ask first, always or in the cases listed:

ToolAsks first when
erase_personAlways: erasure cannot be undone.
update_productIt changes the slug, which apps name the product by.
delete_productAlways.
set_product_perksIt takes a perk away: everyone who bought the product loses it.
map_store_product, unmap_store_productIt moves a mapped store product to another product, or removes an active mapping.
update_payment_sourceIt disables a source, disconnects an endpoint or rotates a signing secret.
delete_payment_source, refund_payment_source_transaction, cancel_payment_source_subscriptionAlways: money goes back, or a subscriber loses access.
record_payment_source_transaction, record_payment_source_subscriptionIt records a refund, or a subscription that is canceled or expired, which ends access.
deploy_paywallEnd users see the paywall: the report names the locations and experiments that show it.
show_at_location, clear_locationIt replaces or ends what end users see at a location.
delete_paywall, archive_paywall_locationAlways.
update_flagIt turns a flag off, lowers its rollout, removes a variant or changes its key.
set_flag_targetsIt starts, shrinks or empties the allow list, which changes who else can get the flag.
archive_flagThe flag is on.
start_experiment, conclude_experimentAlways: end users see the arms, or the winner, from then on.
update_experimentIt changes the arms of an experiment that has started.
set_event_ingestIt stops storing an event: events that arrive meanwhile are lost.
disconnect_ad_accountAlways: the account's synced campaigns and spend are deleted.
update_webhookIt turns a webhook off: events that happen meanwhile are never sent to it.
delete_webhook, rotate_webhook_secretAlways: deliveries stop, or fail until your backend has the new secret.
send_push_notificationAlways: it reaches real people. The confirmed call never sends twice.
change_member_role, remove_memberIt takes administration away, or removes someone.
update_project_settingsIt changes what production apps get: sharing restored purchases, or store sandbox purchases in production.
remove_tracking_domainAlways: web apps sending through it lose their events.
reset_sandboxAlways.

What stays with you

Some things an agent cannot do, whatever your role. You do them yourself, signed in to Studio or with the CLI:

  • Store credentials. Connecting the App Store, Google Play or Stripe, changing their keys and removing a store. Agents see whether each store works and map its products.
  • Push credentials. Setting up APNs and FCM. Agents send push notifications through them.
  • Ad accounts. Connecting a Meta ad account, which needs its access token. Agents read the synced campaigns and can disconnect an account.
  • API keys. Creating, rotating, rescoping and deleting keys. list_api_keys only reads them.
  • Connected apps. Making an agent read-only or disconnecting it, including the agent itself.
  • Accepting the Terms, and installing registry components and uploading fonts for paywalls.

Signing secrets are the exception that passes through an agent: create_webhook, rotate_webhook_secret, create_payment_source and update_payment_source return a new secret once. Your agent should hand it straight to your backend's secret configuration, not to a chat or a file in your repository.

Toolsets

The toolsets below are listed in the order agents see them. The permission column names what a role or secret key needs for each tool.

Orientation

Where an agent starts in a project.

ToolWhat it doesPermission
list_projectsThe projects you can use, with their organizations, and which one tools use by default.None
get_project_statusWhat the project still needs: a connected store, products sold through store products and granting perks, SDK events arriving, webhooks delivering.project:read

Each finding of get_project_status says what to do and which tool does it, or that you have to.

Persons

The end users of your app: what they bought, what they can use, and data erasure requests. Persons are found by exact email, distinct ID or person ID; names and parts of an email cannot be searched.

ToolWhat it doesPermission
find_personsFinds persons by exact email, distinct ID or ID, or lists the newest.project:persons:read
get_personOne person's profile, current perks and what grants each, subscriptions, purchases, flag overrides and recent events.project:persons:read
explain_person_accessWhy a person has or lacks a perk, traced through the products that grant it, their store products and the person's purchases, with where it breaks and the fix.project:entitlements:read
update_personChanges a person's email, name or attributes; setOnce writes an attribute only when it is unset.project:persons:write
create_personAdds a person by the distinct ID your app will identify them by, before the app has seen them.project:persons:write
erase_personErases a person's personal data for good. Purchases and access stay, anonymized. Asks first.project:persons:delete
get_person_erasureThe progress of an erasure.project:persons:read

Subscriptions, purchases and access are shown for production store purchases. See Data deletion for what erasure removes and keeps.

Catalog

What end users buy and what it unlocks: a product grants perks, and your app checks access by perk slug. See Products and perks.

ToolWhat it doesPermission
list_productsEach product with how it sells, the perks it grants, its store products and offers, and whether it can be bought yet.project:products:read
create_productAdds a subscription with its billing period, a one-time purchase or a consumable.project:products:write
update_productRenames a product or changes its slug. Changing the slug asks first.project:products:write
delete_productDeletes a product no store product is mapped to. Asks first.project:products:write
list_perksEach perk with the products that grant it.project:entitlements:read
create_perkAdds a perk, such as premium.project:entitlements:write
set_product_perksMakes a product grant exactly the perks listed. Taking one away asks first.project:entitlements:write

A new product grants nothing until it has perks, and cannot be bought until it is mapped to a store product (map_store_product).

Payment providers

Where your project takes payments: the App Store, Google Play, Stripe, and payment sources that report their own purchases. Providers are named by store (app_store, google_play, stripe), by bundle ID, package name, Stripe account or payment source slug, or by name. Stripe store products are prices, written prod_…:price_…; Google Play base plans productId:basePlanId.

ToolWhat it doesPermission
list_payment_providersEvery provider with its health: enabled, store products read and not yet mapped, purchases waiting for a mapping, the latest history import.project:providers:read
test_payment_providerReads an App Store or Google Play catalog again, or calls each of a payment source's endpoints and lists what each implements. Changes nothing.project:providers:read
list_store_productsThe store products each provider sells, the product each is mapped to, its offers, and purchases waiting for it.project:providers:read
map_store_productMakes buying a store product grant a product, and sets its offers. Moving it to another product asks first.project:providers:write
unmap_store_productRemoves a mapping made by mistake. Removing an active one asks first.project:providers:write
import_purchase_historyImports Stripe's or a payment source's earlier purchases in the background. Running it again skips what is recorded.project:providers:write
cancel_purchase_history_importStops a running import; what it recorded stays.project:providers:write
create_payment_sourceAdds a payment source; with an endpoint, and a test endpoint for staging, returns each one's signing secret once.project:providers:write
update_payment_sourceRenames, enables or disables a source, or connects, changes or disconnects its endpoint or test endpoint and rotates their secrets.project:providers:write
delete_payment_sourceDeletes a payment source without mappings. Asks first.project:providers:write
record_payment_source_transactionRecords a charge or refund a source took, for one-off corrections. An ID is recorded once.project:purchases:write
record_payment_source_subscriptionRecords a subscription's latest state at a source.project:purchases:write
refund_payment_source_transactionRefunds a charge at the source through its endpoint, in full or in part. Asks first.project:purchases:write
cancel_payment_source_subscriptionCancels a subscription at the source through its endpoint, at the period's end or now. Asks first.project:purchases:write

Imports and recorded payments take an environment, production or test: test reads Stripe's test mode or a payment source's test payments, which stay out of production revenue. A source's test endpoint answers its test requests; without one they go to its endpoint.

Paywalls

What end users see where. A paywall's deployed build is shown at the paywall locations that show it, which your app asks for by slug. See Paywall locations.

ToolWhat it doesPermission
list_paywallsEach paywall with its deployed build, a newer build that failed or is building, and where it is shown.project:paywalls:read
list_paywall_buildsA paywall's recent builds, and why a failed one failed.project:paywalls:read
create_paywallAdds an empty paywall or onboarding flow.project:paywalls:write
update_paywallRenames, archives or restores a paywall. Locations keep showing an archived paywall.project:paywalls:write
deploy_paywallBuilds the current design, waits for the build and deploys it; build deploys an existing build, such as to roll back.project:paywalls:publish
delete_paywallDeletes a paywall nothing shows. Asks first.project:paywalls:write
list_paywall_locationsEach location with what it shows now: a paywall, an experiment or nothing.project:paywalls:read
get_paywall_locationOne location with what it showed before, and when.project:paywalls:read
create_paywall_locationAdds a location, optionally showing a deployed paywall right away.project:paywalls:write
update_paywall_locationRenames a location or changes its description. Its slug cannot change.project:paywalls:write
show_at_locationShows a deployed paywall at a location. Replacing what is shown there asks first.project:paywalls:publish
clear_locationStops showing anything at a location. Asks first.project:paywalls:publish
archive_paywall_locationRetires a location your apps no longer ask for. It cannot be undone. Asks first.project:paywalls:write

Only a person can start a build. An agent with a secret key can deploy a build that already exists.

Paywall design

Designing paywalls and writing code components. Design changes are made in an edit session, which you and others see live in the paywall editor; end users see them only once deploy_paywall deploys the design.

ToolWhat it doesPermission
bashRuns a read-only shell over the project's paywall workspace: the authoring guides, paywall designs and products.project:paywalls:read
list_fontsThe fonts uploaded for the project's paywalls.project:paywalls:read
list_componentsThe components a paywall can use, with their props, events and what they support.project:paywalls:read
read_componentOne component's definition, build status, versions and, for the project's own, its source.project:paywalls:read
get_component_buildThe build status of a component version.project:paywalls:read
begin_paywall_editOpens an edit session for one paywall, and records the design to revert to.project:paywalls:write
get_paywallThe paywall's design, with the IDs edits address.project:paywalls:write
get_paywall_changesWhat the session has changed so far.project:paywalls:write
edit_paywallApplies a batch of edits, all or nothing.project:paywalls:write
duplicate_subtreeCopies part of the design.project:paywalls:write
insert_componentPlaces a component with its props and actions.project:paywalls:write
update_component_instancesMoves placed components onto a newer version.project:paywalls:write
write_componentCreates or updates a code component from Rust source, and builds it.project:paywalls:write
get_paywall_previewRenders the design as an image, with a summary and the problems it finds.project:paywalls:write
finish_paywall_editEnds the session, and lists anything that still blocks a release.project:paywalls:write
revert_paywall_editReturns the paywall to the design the session began with; refused when that would overwrite someone else's edits.project:paywalls:write

The toolset also serves the authoring guides as resources, voidhash://skills/paywall-authoring and voidhash://skills/code-component-authoring, and a design_paywall prompt that starts a design workflow for one paywall.

Feature flags

Whether a feature is on for each end user, and which variant they get. A flag that is off is off for everyone. When it is on, an override fixes it for one end user, the deny and allow lists limit who can get it, and the rollout percentage decides the rest.

ToolWhat it doesPermission
list_flagsEach flag with its state, rollout, variants and the size of its allow and deny lists.project:flags:read
get_flagOne flag in full: variants, overrides, allow and deny lists.project:flags:read
create_flagAdds a flag; it starts off unless you turn it on.project:flags:write
update_flagTurns a flag on or off, or changes its rollout, description, key or variants.project:flags:write
set_flag_overrideFixes a flag for one end user (on, off or a variant), or puts a tester in an experiment's arm.project:flags:write
set_flag_targetsSets exactly who is on the allow or deny list.project:flags:write
evaluate_flagsWhat one end user gets from each flag, and why.project:flags:read
archive_flagStops serving a flag; apps get their fallback value.project:flags:write
restore_flagBrings an archived flag back as it was.project:flags:write

Experiments

A/B tests of paywalls: each arm shows a paywall at one or more paywall locations. What counts as a conversion is fixed once an experiment starts, and its arms cannot change while it runs.

ToolWhat it doesPermission
list_experimentsEach experiment with its status, arms and the paywall each shows where.project:experiments:read
get_experimentOne experiment in depth, with what can be done next.project:experiments:read
create_experimentSets up an experiment as a draft, optionally with its arms.project:experiments:write
update_experimentChanges its name, hypothesis, metrics (draft only) or arms (not while running).project:experiments:write
start_experimentStarts or resumes it at its locations. Asks first.project:experiments:write
pause_experimentShows everyone the control until it resumes.project:experiments:write
conclude_experimentEnds it with a winner, which its locations then show to everyone. Asks first.project:experiments:write
get_experiment_resultsEach arm's conversions and revenue against the control, with a verdict that says when it is too early to tell.project:experiments:read
archive_experimentTidies away a draft or concluded experiment.project:experiments:write
restore_experimentBrings an archived experiment back.project:experiments:write

Analytics

Revenue and subscription metrics, acquisition by first touch, and the events your apps send. Periods are said in words: "last 30 days" (the 30 complete days before today), "this month", "last month", "ytd", "2026-09" or "2026-09-01..2026-09-30". See Ad measurement for how first touches are counted.

ToolWhat it doesPermission
list_insightsThe built-in metrics, such as revenue, MRR, churn, trials and persons, and what each measures.project:analytics:read
run_insightOne or more metrics over a period, by day, week or month, optionally against the previous period.project:analytics:read
acquisition_reportThe people each network, campaign, ad set, ad or surface brought in by first touch, and what they paid.project:analytics:read
acquisition_cohorts_reportHow quickly people from each first touch pay, by week of acquisition.project:analytics:read
get_tracking_healthWhether your website and apps send events, which SDK versions, and how many app users were first seen on the web.project:analytics:read
list_eventsRecent stored events, by event name or person.project:events:read
get_ingest_policyWhich built-in events are stored, and which custom events are blocked.project:events:read
set_event_ingestStores or stops storing an event. Stopping asks first.project:events:write

run_insight reports production purchases unless you ask for another environment, and takes insights by the names people use ("MRR", "churn rate").

Ads

Paid acquisition from your connected Meta ad accounts: what each campaign spent beside the signups, payers and revenue Voidhash measured. The platform's numbers and Voidhash's are reported apart and never added together. Voidhash reads ads and never changes them.

ToolWhat it doesPermission
list_ad_accountsConnected ad accounts with their sync health, and the landing pages that count as web-to-app.project:ads:read
disconnect_ad_accountDisconnects an account and deletes its synced campaigns and spend. Asks first.project:ads:manage
set_web_to_app_prefixesSets the landing URL prefixes that mark website ads as web-to-app.project:ads:manage
list_ad_campaignsCampaigns with their delivery and its reason, objective, destination and budget.project:ads:read
get_ad_campaignOne campaign with its ad groups and ads, including ads whose links lack tracking parameters.project:ads:read
ads_performance_reportSpend and the platform's results beside Voidhash's signups, payers, revenue and true ROAS, per campaign, ad group or ad.project:ads:read
ads_creatives_reportCreatives by spend, with CTR, hook rate, ROAS, cost per payer and signs of fatigue.project:ads:read
ads_cohorts_reportWhen paid acquisition pays back, by weekly or monthly cohort.project:ads:read
ads_changes_reportWhat changed hour by hour: budget, status and bid strategy decisions, delivery between syncs, and Meta's late revisions.project:ads:read
find_ads_issuesWhat needs attention: failed syncs, rejected or non-delivering ads, learning-limited ad groups, missing tracking.project:ads:read

Voidhash's numbers in the ads reports also need project:analytics:read. Connecting an ad account stays with you; see What stays with you.

Webhooks

Your project's purchase, subscription and person events, sent to your backend, and why it misses some.

ToolWhat it doesPermission
list_webhooksEach webhook with its URL, events and health: healthy, failing, stopped by Voidhash after failures, or off.project:webhooks:read
get_webhookOne webhook and its latest deliveries, with how your backend answered.project:webhooks:read
create_webhookAdds a webhook for the events you choose, and returns its signing secret once.project:webhooks:write
update_webhookChanges a webhook's name, description, URL or events, or turns it on or off. Turning it on resumes a stopped one.project:webhooks:write
delete_webhookDeletes a webhook and its delivery history. Asks first.project:webhooks:write
rotate_webhook_secretReplaces a signing secret that leaked or was lost. The old one stops working at once. Asks first.project:webhooks:write
test_webhookSends a signed test.ping event and reports how your backend answered.project:webhooks:write
list_webhook_failuresFailed deliveries, newest first, with how your backend answered and whether Voidhash retries them.project:webhooks:read
get_webhook_deliveryOne delivery in full: every attempt and the event body sent.project:webhooks:read
retry_webhook_deliverySends failed deliveries again now, and reports each outcome.project:webhooks:write

Your backend receives a retried event again, so it should handle an event it already processed.

Messaging

Push notifications to your end users' devices, through the APNs and FCM credentials you set up in Studio under Settings → Notifications.

ToolWhat it doesPermission
send_push_notificationSends a push notification to up to 100 persons named by ID, distinct ID or email. Reports who it reaches and asks first.project:notifications:send
list_push_notificationsRecent push notifications and how their deliveries went, with which push services are enabled.project:notifications:read
list_push_deliveriesHow one push notification reached each device, with the push service's errors.project:notifications:read

Team and settings

Who belongs to an organization, new projects, a project's settings explained, tracking domains, keys and the audit log.

ToolWhat it doesPermission
list_membersThe people in an organization and their roles.organization:members:read
invite_memberAdds someone who has a Voidhash account, as a member or administrator.organization:members:add
change_member_roleMakes a member an administrator, or an administrator a member. Taking administration away asks first.organization:members:roles:update
remove_memberRemoves someone from the organization and all its projects. Asks first.organization:members:remove
create_projectCreates a project in an organization.organization:projects:create
get_project_settingsThe project and every setting, explained.project:read
update_project_settingsRenames the project or changes a setting, including sandbox purchasing.project:update
list_tracking_domainsYour subdomains the web SDK sends events through, and the DNS records each still needs.project:read
add_tracking_domainClaims a subdomain and returns the DNS records to create.project:update
verify_tracking_domainChecks a domain's DNS and certificate now, and says what is missing.project:update
remove_tracking_domainStops serving a tracking domain. Asks first.project:update
list_api_keysThe publishable key your apps ship with, and secret keys by their ends, with their scopes and last use.project:keys:read
list_audit_logWho changed what in the project, newest first.project:update
list_noticesThe notices your organization sent you, such as a usage limit reached.organization:read
send_feedbackSends feedback to the Voidhash team, in your words, when you ask it to.organization:read

Sandbox

Testing your app's purchase flow without a real store. A debug build of your app buys through the Voidhash sandbox; these tools show those purchases and play the store's later events.

ToolWhat it doesPermission
get_sandbox_purchasesA person's sandbox subscriptions and purchases, and the access they grant now.project:development:read
simulate_sandbox_eventRenews, expires, starts the grace period of, refunds or revokes a sandbox purchase; webhooks follow.project:development:write
reset_sandboxDeletes every sandbox purchase in the project, to start over. Asks first.project:development:write

Production purchases and store sandbox purchases, such as TestFlight and Play test tracks, are never changed. Turn sandbox purchasing on or off with update_project_settings.

Example prompts

Agents combine the tools on their own. A few requests and the tools they lead to:

Someone says they paid for Pro but have no access. Their email is ada@example.com.

find_persons finds the person and explain_person_access traces their access to the perk. If a store product is not mapped, list_store_products and map_store_product fix it, after you confirm moving a mapping.

Add a yearly plan that grants premium and show it in the onboarding paywall.

create_product adds the product and set_product_perks grants premium. Once you have mapped it to its store products, begin_paywall_edit, edit_paywall and get_paywall_preview add it to the design, finish_paywall_edit ends the session, and deploy_paywall makes it live after you agree.

Test whether showing the annual plan first raises trial starts at onboarding-end.

create_experiment sets up the arms, start_experiment reports the locations and split and starts once you agree, and later get_experiment_results and conclude_experiment pick the winner.

Our backend missed purchase events last night. Find out why and resend them once it is fixed.

list_webhook_failures shows how your endpoint answered, test_webhook checks it after the fix, and retry_webhook_delivery sends what gave up.

Which Meta campaigns paid back last month, and is anything broken?

list_ad_accounts checks that syncs are current, ads_performance_report compares spend with the revenue Voidhash measured, and find_ads_issues lists what needs attention.

Verify the connection

Ask the agent a question that needs the server:

Which Voidhash projects can you see?

The agent should call list_projects. Then ask about one of them, such as "What was my revenue over the last 30 days in my-project?", and the agent should call run_insight.

If the agent reports that it is not signed in, start its sign-in again; in Codex, run codex mcp login voidhash. If a tool you expect is missing, your role does not allow it in that project, or the agent is read-only.

PreviousCustom payment providersNextAd measurement

On this page

Connect your agentYour agent acts as youServerToolsChoosing a projectNames instead of IDsChanges that ask firstWhat stays with youToolsetsOrientationPersonsCatalogPayment providersPaywallsPaywall designFeature flagsExperimentsAnalyticsAdsWebhooksMessagingTeam and settingsSandboxExample promptsVerify the connection