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.
| Agent | How to add the server |
|---|---|
| Claude Code | claude mcp add --transport http voidhash https://api.voidhash.com/api/mcp |
| Cursor | The Add to Cursor button under Connect an agent in Studio, or .cursor/mcp.json |
| Codex | codex mcp add voidhash --url https://api.voidhash.com/api/mcp |
| VS Code | The Add to VS Code button under Connect an agent in Studio |
| Claude Desktop | Settings → Connectors → Add custom connector, with the server URL |
To set up every agent on your computer at once, run:
npx voidhash-cli mcp installIt 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 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.
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/mcpIt 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:
| Tool | Asks first when |
|---|---|
erase_person | Always: erasure cannot be undone. |
update_product | It changes the slug, which apps name the product by. |
delete_product | Always. |
set_product_perks | It takes a perk away: everyone who bought the product loses it. |
map_store_product, unmap_store_product | It moves a mapped store product to another product, or removes an active mapping. |
update_payment_source | It disables a source, disconnects its endpoint or rotates its signing secret. |
delete_payment_source, refund_payment_source_transaction, cancel_payment_source_subscription | Always: money goes back, or a subscriber loses access. |
record_payment_source_transaction, record_payment_source_subscription | It records a refund, or a subscription that is canceled or expired, which ends access. |
deploy_paywall | End users see the paywall: the report names the locations and experiments that show it. |
show_at_location, clear_location | It replaces or ends what end users see at a location. |
delete_paywall, archive_paywall_location | Always. |
update_flag | It turns a flag off, lowers its rollout, removes a variant or changes its key. |
set_flag_targets | It starts, shrinks or empties the allow list, which changes who else can get the flag. |
archive_flag | The flag is on. |
start_experiment, conclude_experiment | Always: end users see the arms, or the winner, from then on. |
update_experiment | It changes the arms of an experiment that has started. |
set_event_ingest | It stops storing an event: events that arrive meanwhile are lost. |
disconnect_ad_account | Always: the account's synced campaigns and spend are deleted. |
update_webhook | It turns a webhook off: events that happen meanwhile are never sent to it. |
delete_webhook, rotate_webhook_secret | Always: deliveries stop, or fail until your backend has the new secret. |
send_push_notification | Always: it reaches real people. The confirmed call never sends twice. |
change_member_role, remove_member | It takes administration away, or removes someone. |
update_project_settings | It changes what production apps get: sharing restored purchases, or store sandbox purchases in production. |
remove_tracking_domain | Always: web apps sending through it lose their events. |
reset_sandbox | Always. |
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_keysonly 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.
| Tool | What it does | Permission |
|---|---|---|
list_projects | The projects you can use, with their organizations, and which one tools use by default. | None |
get_project_status | What 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.
| Tool | What it does | Permission |
|---|---|---|
find_persons | Finds persons by exact email, distinct ID or ID, or lists the newest. | project:persons:read |
get_person | One person's profile, current perks and what grants each, subscriptions, purchases, flag overrides and recent events. | project:persons:read |
explain_person_access | Why 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_person | Changes a person's email, name or attributes; setOnce writes an attribute only when it is unset. | project:persons:write |
create_person | Adds a person by the distinct ID your app will identify them by, before the app has seen them. | project:persons:write |
erase_person | Erases a person's personal data for good. Purchases and access stay, anonymized. Asks first. | project:persons:delete |
get_person_erasure | The 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.
| Tool | What it does | Permission |
|---|---|---|
list_products | Each 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_product | Adds a subscription with its billing period, a one-time purchase or a consumable. | project:products:write |
update_product | Renames a product or changes its slug. Changing the slug asks first. | project:products:write |
delete_product | Deletes a product no store product is mapped to. Asks first. | project:products:write |
list_perks | Each perk with the products that grant it. | project:entitlements:read |
create_perk | Adds a perk, such as premium. | project:entitlements:write |
set_product_perks | Makes 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.
| Tool | What it does | Permission |
|---|---|---|
list_payment_providers | Every 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_provider | Reads an App Store or Google Play catalog again, or calls a payment source's endpoint and lists what it implements. Changes nothing. | project:providers:read |
list_store_products | The store products each provider sells, the product each is mapped to, its offers, and purchases waiting for it. | project:providers:read |
map_store_product | Makes buying a store product grant a product, and sets its offers. Moving it to another product asks first. | project:providers:write |
unmap_store_product | Removes a mapping made by mistake. Removing an active one asks first. | project:providers:write |
import_purchase_history | Imports 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_import | Stops a running import; what it recorded stays. | project:providers:write |
create_payment_source | Adds a payment source; with an endpoint, returns its signing secret once. | project:providers:write |
update_payment_source | Renames, enables or disables a source, or connects, changes or disconnects its endpoint and rotates its secret. | project:providers:write |
delete_payment_source | Deletes a payment source without mappings. Asks first. | project:providers:write |
record_payment_source_transaction | Records a charge or refund a source took, for one-off corrections. An ID is recorded once. | project:purchases:write |
record_payment_source_subscription | Records a subscription's latest state at a source. | project:purchases:write |
refund_payment_source_transaction | Refunds a charge at the source through its endpoint, in full or in part. Asks first. | project:purchases:write |
cancel_payment_source_subscription | Cancels a subscription at the source through its endpoint, at the period's end or now. Asks first. | project:purchases:write |
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.
| Tool | What it does | Permission |
|---|---|---|
list_paywalls | Each paywall with its deployed build, a newer build that failed or is building, and where it is shown. | project:paywalls:read |
list_paywall_builds | A paywall's recent builds, and why a failed one failed. | project:paywalls:read |
create_paywall | Adds an empty paywall or onboarding flow. | project:paywalls:write |
update_paywall | Renames, archives or restores a paywall. Locations keep showing an archived paywall. | project:paywalls:write |
deploy_paywall | Builds the current design, waits for the build and deploys it; build deploys an existing build, such as to roll back. | project:paywalls:publish |
delete_paywall | Deletes a paywall nothing shows. Asks first. | project:paywalls:write |
list_paywall_locations | Each location with what it shows now: a paywall, an experiment or nothing. | project:paywalls:read |
get_paywall_location | One location with what it showed before, and when. | project:paywalls:read |
create_paywall_location | Adds a location, optionally showing a deployed paywall right away. | project:paywalls:write |
update_paywall_location | Renames a location or changes its description. Its slug cannot change. | project:paywalls:write |
show_at_location | Shows a deployed paywall at a location. Replacing what is shown there asks first. | project:paywalls:publish |
clear_location | Stops showing anything at a location. Asks first. | project:paywalls:publish |
archive_paywall_location | Retires 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.
| Tool | What it does | Permission |
|---|---|---|
bash | Runs a read-only shell over the project's paywall workspace: the authoring guides, paywall designs and products. | project:paywalls:read |
list_fonts | The fonts uploaded for the project's paywalls. | project:paywalls:read |
list_components | The components a paywall can use, with their props, events and what they support. | project:paywalls:read |
read_component | One component's definition, build status, versions and, for the project's own, its source. | project:paywalls:read |
get_component_build | The build status of a component version. | project:paywalls:read |
begin_paywall_edit | Opens an edit session for one paywall, and records the design to revert to. | project:paywalls:write |
get_paywall | The paywall's design, with the IDs edits address. | project:paywalls:write |
get_paywall_changes | What the session has changed so far. | project:paywalls:write |
edit_paywall | Applies a batch of edits, all or nothing. | project:paywalls:write |
duplicate_subtree | Copies part of the design. | project:paywalls:write |
insert_component | Places a component with its props and actions. | project:paywalls:write |
update_component_instances | Moves placed components onto a newer version. | project:paywalls:write |
write_component | Creates or updates a code component from Rust source, and builds it. | project:paywalls:write |
get_paywall_preview | Renders the design as an image, with a summary and the problems it finds. | project:paywalls:write |
finish_paywall_edit | Ends the session, and lists anything that still blocks a release. | project:paywalls:write |
revert_paywall_edit | Returns 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.
| Tool | What it does | Permission |
|---|---|---|
list_flags | Each flag with its state, rollout, variants and the size of its allow and deny lists. | project:flags:read |
get_flag | One flag in full: variants, overrides, allow and deny lists. | project:flags:read |
create_flag | Adds a flag; it starts off unless you turn it on. | project:flags:write |
update_flag | Turns a flag on or off, or changes its rollout, description, key or variants. | project:flags:write |
set_flag_override | Fixes 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_targets | Sets exactly who is on the allow or deny list. | project:flags:write |
evaluate_flags | What one end user gets from each flag, and why. | project:flags:read |
archive_flag | Stops serving a flag; apps get their fallback value. | project:flags:write |
restore_flag | Brings 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.
| Tool | What it does | Permission |
|---|---|---|
list_experiments | Each experiment with its status, arms and the paywall each shows where. | project:experiments:read |
get_experiment | One experiment in depth, with what can be done next. | project:experiments:read |
create_experiment | Sets up an experiment as a draft, optionally with its arms. | project:experiments:write |
update_experiment | Changes its name, hypothesis, metrics (draft only) or arms (not while running). | project:experiments:write |
start_experiment | Starts or resumes it at its locations. Asks first. | project:experiments:write |
pause_experiment | Shows everyone the control until it resumes. | project:experiments:write |
conclude_experiment | Ends it with a winner, which its locations then show to everyone. Asks first. | project:experiments:write |
get_experiment_results | Each arm's conversions and revenue against the control, with a verdict that says when it is too early to tell. | project:experiments:read |
archive_experiment | Tidies away a draft or concluded experiment. | project:experiments:write |
restore_experiment | Brings 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.
| Tool | What it does | Permission |
|---|---|---|
list_insights | The built-in metrics, such as revenue, MRR, churn, trials and persons, and what each measures. | project:analytics:read |
run_insight | One or more metrics over a period, by day, week or month, optionally against the previous period. | project:analytics:read |
acquisition_report | The people each network, campaign, ad set, ad or surface brought in by first touch, and what they paid. | project:analytics:read |
acquisition_cohorts_report | How quickly people from each first touch pay, by week of acquisition. | project:analytics:read |
get_tracking_health | Whether your website and apps send events, which SDK versions, and how many app users were first seen on the web. | project:analytics:read |
list_events | Recent stored events, by event name or person. | project:events:read |
get_ingest_policy | Which built-in events are stored, and which custom events are blocked. | project:events:read |
set_event_ingest | Stores 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.
| Tool | What it does | Permission |
|---|---|---|
list_ad_accounts | Connected ad accounts with their sync health, and the landing pages that count as web-to-app. | project:ads:read |
disconnect_ad_account | Disconnects an account and deletes its synced campaigns and spend. Asks first. | project:ads:manage |
set_web_to_app_prefixes | Sets the landing URL prefixes that mark website ads as web-to-app. | project:ads:manage |
list_ad_campaigns | Campaigns with their delivery and its reason, objective, destination and budget. | project:ads:read |
get_ad_campaign | One campaign with its ad groups and ads, including ads whose links lack tracking parameters. | project:ads:read |
ads_performance_report | Spend 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_report | Creatives by spend, with CTR, hook rate, ROAS, cost per payer and signs of fatigue. | project:ads:read |
ads_cohorts_report | When paid acquisition pays back, by weekly or monthly cohort. | project:ads:read |
ads_changes_report | What changed hour by hour: budget, status and bid strategy decisions, delivery between syncs, and Meta's late revisions. | project:ads:read |
find_ads_issues | What 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.
| Tool | What it does | Permission |
|---|---|---|
list_webhooks | Each webhook with its URL, events and health: healthy, failing, stopped by Voidhash after failures, or off. | project:webhooks:read |
get_webhook | One webhook and its latest deliveries, with how your backend answered. | project:webhooks:read |
create_webhook | Adds a webhook for the events you choose, and returns its signing secret once. | project:webhooks:write |
update_webhook | Changes 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_webhook | Deletes a webhook and its delivery history. Asks first. | project:webhooks:write |
rotate_webhook_secret | Replaces a signing secret that leaked or was lost. The old one stops working at once. Asks first. | project:webhooks:write |
test_webhook | Sends a signed test.ping event and reports how your backend answered. | project:webhooks:write |
list_webhook_failures | Failed deliveries, newest first, with how your backend answered and whether Voidhash retries them. | project:webhooks:read |
get_webhook_delivery | One delivery in full: every attempt and the event body sent. | project:webhooks:read |
retry_webhook_delivery | Sends 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.
| Tool | What it does | Permission |
|---|---|---|
send_push_notification | Sends 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_notifications | Recent push notifications and how their deliveries went, with which push services are enabled. | project:notifications:read |
list_push_deliveries | How 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.
| Tool | What it does | Permission |
|---|---|---|
list_members | The people in an organization and their roles. | organization:members:read |
invite_member | Adds someone who has a Voidhash account, as a member or administrator. | organization:members:add |
change_member_role | Makes a member an administrator, or an administrator a member. Taking administration away asks first. | organization:members:roles:update |
remove_member | Removes someone from the organization and all its projects. Asks first. | organization:members:remove |
create_project | Creates a project in an organization. | organization:projects:create |
get_project_settings | The project and every setting, explained. | project:read |
update_project_settings | Renames the project or changes a setting, including sandbox purchasing. | project:update |
list_tracking_domains | Your subdomains the web SDK sends events through, and the DNS records each still needs. | project:read |
add_tracking_domain | Claims a subdomain and returns the DNS records to create. | project:update |
verify_tracking_domain | Checks a domain's DNS and certificate now, and says what is missing. | project:update |
remove_tracking_domain | Stops serving a tracking domain. Asks first. | project:update |
list_api_keys | The publishable key your apps ship with, and secret keys by their ends, with their scopes and last use. | project:keys:read |
list_audit_log | Who changed what in the project, newest first. | project:update |
list_notices | The notices your organization sent you, such as a usage limit reached. | organization:read |
send_feedback | Sends 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.
| Tool | What it does | Permission |
|---|---|---|
get_sandbox_purchases | A person's sandbox subscriptions and purchases, and the access they grant now. | project:development:read |
simulate_sandbox_event | Renews, expires, starts the grace period of, refunds or revokes a sandbox purchase; webhooks follow. | project:development:write |
reset_sandbox | Deletes 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.