Paydirt MCP
OfficialPaydirt MCP is the agent-native installer and control plane for Paydirt — it adds voice-based feature-request and cancellation feedback forms to iOS apps, wires the SDK into the project, routes responses to Slack and the coding agent, and reads feedback back.
Set up the integration —
paydirt_begin_setup/paydirt_finish_setup(plus the compatiblepaydirt_setup) run non-blocking Google browser authorization and return an installation contract covering which forms to install, the subscription provider (StoreKit, RevenueCat, Superwall, custom, none), and product IDs.Manage apps —
paydirt_list_apps,paydirt_create_app,paydirt_get_app,paydirt_update_appcreate, inspect, and edit apps, bundle IDs, descriptions, and AI context, returning the SDK key.Manage forms — create, list, get, update, enable/disable, or delete forms, or use
paydirt_add_feedback_formto place a named form at a screen, button, lifecycle moment, or in-app action with exact Swift presentation code and dedupe/reuse.Route delivery — connect Slack, check Slack status, list channels, map channels to cancellations or feature ideas, assign individual forms to channels, and choose Slack, the coding agent, or both.
Read feedback —
paydirt_get_responsesreturns raw Q/A conversations with a stable incremental cursor,paydirt_get_summaryandpaydirt_askgive optional AI analysis, andpaydirt_get_feedback_digestproduces a read-only daily/periodic brief with counts and period-over-period change.Verify live capture —
paydirt_wait_for_responseblocks up to 90 seconds for the first test response, andpaydirt_health_checkconfirms API reachability and credential validity.Guardrails — analysis and digest tools are read-only; feedback is never turned into code changes or tasks automatically, and existing host-app forms, purchase flows, and side effects are preserved.
Integrates with Slack to deliver feedback messages and summaries, including configuring Slack channels for form delivery and connecting Slack workspace.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Paydirt MCP Install Paydirt in this iOS app for feedback and cancellation."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Paydirt MCP
MCP Registry name: io.github.Paydirt-AI/paydirt-mcp
The agent-native installer and control plane for Paydirt, an iOS SDK for Suggest a Feature, trial cancellation, and subscription cancellation.
Paydirt MCP lets a coding agent add Paydirt to an iOS app from chat: propose the forms, create them, write the SDK key into the project, build and launch the app with a Debug setup check open, route responses to Slack and the agent, and read raw feedback. Paydirt supports native StoreKit, RevenueCat, Superwall, app-owned billing, and apps without subscriptions.
Install
Pick one. The hosted server is the golden path: sign in with Google once and never paste a key.
Claude Code plugin (bundles the install skill):
/plugin marketplace add Paydirt-AI/paydirt-mcp
/plugin install paydirt@paydirt-pluginsClaude Code, hosted server:
claude mcp add --transport http paydirt https://mcp.paydirt.ai/mcpCodex, hosted server:
codex mcp add paydirt --url https://mcp.paydirt.ai/mcpFallback, local stdio (any MCP host; Node.js 18 or newer):
npx -y paydirt-mcp{
"mcpServers": {
"paydirt": {
"command": "npx",
"args": ["-y", "paydirt-mcp"]
}
}
}Current Codex desktop builds may need a restart before a newly added MCP server appears. That is a one-time tool-discovery refresh, not a Paydirt requirement.
Related MCP server: asc-mcp
First run
Say:
Add Paydirt to this app. Set up cancellation feedback and Suggest a Feature.
Connect. The agent host opens a browser tab: Continue with Google, then Allow. The tab says to return to your agent. No keys.
One proposal. The agent inspects the project and sends one message: Subscription Cancellation, Trial Cancellation, and Suggest a Feature, citing the file where your real cancel flow lives, with responses going to Slack and here in the agent. Reply "yes", or choose Slack only, here only, or drop a form. Without subscriptions, it says cancellation feedback has nothing to trigger it yet and recommends Suggest a Feature only. Nothing is created until you confirm.
Live demo. The agent creates the app and forms, saves your destination, and, if you chose Slack, shares a Slack link while it keeps working. It adds the SDK, writes the key into your project, adds a Debug setup check that opens on first launch, and builds and launches the app.
Slack routing. After Slack's Allow screen, the agent lists your channels and proposes routing in chat, for example cancellations to one channel and feature ideas to another. It saves the routing after you confirm.
First response. Submit one test answer by voice or text. The agent is already waiting with
paydirt_wait_for_responseand announces it when it lands.
Existing feedback screens and purchase flows are preserved. A daily read-only brief is offered when responses come to the coding agent.
With the local stdio server, paydirt_begin_setup returns an authorization_url that only signs you in, and paydirt_finish_setup returns the same installation contract. The MCP process never opens a browser, sleeps, or polls; the only bounded wait is paydirt_wait_for_response (max 90 seconds). paydirt_setup remains as a compatibility alias.
Local credentials are saved at ~/.paydirt/credentials.json with owner-only permissions. They are not written to an app repository or sent anywhere except api.paydirt.ai. For ephemeral environments, set PAYDIRT_AUTH_TOKEN instead.
Daily feedback brief
paydirt_get_feedback_digest returns a read-only period summary designed for scheduled tasks: total completed responses, Suggest a Feature, Trial Cancellation, Subscription Cancellation, other feedback, the change from the preceding equal period, and concise highlights. A quiet day explicitly reports zero. Digests never create coding tasks or modify an app automatically.
Natural agent workflows
Add a form at an in-app action
Ask:
Add a feedback form titled “Export Feedback” after a successful export and send it to #product-feedback.
The agent should use paydirt_add_feedback_form. It reuses an existing custom form with the same normalized title, preserves the requested placement, resolves Slack when possible, and returns the exact Swift presentation call. A remote form is not considered installed until the agent edits and builds the host app.
Supported triggers are user taps, successful in-app actions, screen appearance, and app-owned custom conditions.
Install cancellation feedback
The agent inspects the app before setup and selects the existing subscription source of truth:
Native StoreKit uses Paydirt's built-in StoreKit integration.
RevenueCat uses installer-managed compatibility source and the familiar
Paydirt.enableRevenueCatIntegration(...)call, avoiding duplicate package dependencies.Native StoreKit covers ordinary App Store subscriptions, including apps where Superwall is only the paywall.
App-owned billing emits Paydirt's provider-independent cancellation event.
Apps without subscriptions can install manual feedback alone.
The agent must preserve all existing host-app feedback forms, buttons, screens, handlers, destinations, and side effects. It may only add or change regular feedback when the user explicitly requests that exact placement. If a requested cancellation bridge is blocked, the agent reports the narrow provider blocker, preserves the existing app behavior, and completes every unaffected requested form.
An older RevenueCat version is not a blocker. The agent keeps the installed version and adapts the installer-managed integration source to the customer-info or purchaser-info API already compiling in the app. Newer optional metadata may be omitted, or Paydirt can be called from the app's existing confirmed RevenueCat cancellation path.
Deliver to Slack and coding agents
Slack receives one message after a conversation finishes, containing the exact raw questions and answers. An optional AI summary may follow the raw conversation. Coding-agent tools expose responses read-only; Paydirt does not automatically take action on feedback.
Tools
Tool | Purpose |
| Start non-blocking browser authorization |
| Check authorization once and return the installation contract |
| Backward-compatible begin/finish alias |
| Create/reuse a named form and return its host-app placement contract |
| Manage apps |
| Manage forms |
| Read raw conversations using a stable cursor |
| Read optional AI analysis |
| Save where responses go: Slack, the coding agent, or both |
| Connect Slack and route cancellations and feature ideas |
| Route one custom form to its own channel |
| Wait up to 90 seconds for the first test response |
| Verify API connectivity and credentials |
Development
npm ci
npm test
npm pack --dry-runThe repository intentionally contains only the public MCP client. Paydirt's API, dashboard, infrastructure, and operational configuration remain private.
Official MCP Registry metadata lives at .mcp/server.json. It lists the npm stdio package and the hosted Streamable HTTP endpoint at https://mcp.paydirt.ai/mcp.
See SUPPORT.md for support, SECURITY.md before reporting a vulnerability, and CONTRIBUTING.md before opening a pull request.
License
Hosted transport
The same package also includes the authenticated Streamable HTTP server at
https://mcp.paydirt.ai/mcp. See HOSTED.md for deployment,
OAuth configuration, session isolation, and release verification. Discovery metadata
is at https://mcp.paydirt.ai/.well-known/oauth-protected-resource/mcp.
A reachable health or metadata endpoint alone does not verify authenticated tool use.
Available Tools
23 toolspaydirt_add_feedback_formADestructiveIdempotent
Use this when the user asks for a named feedback form at a screen, button, lifecycle moment, or in-app action. Creates or reuses a normalized-title match, preserves the placement verbatim, optionally resolves Slack, and returns exact Swift plus mandatory edit/build/test actions. Remote form creation alone is not completion.
Inputs: title (required), app_id (required), trigger (required), placement (required), +3 more. Returns: ios, form, slack, success, +4 more
paydirt_askARead-onlyIdempotent
Use this when the user asks a natural-language analytical question about their Paydirt feedback, such as pricing themes or feature requests. Reads actual responses and returns analysis without taking action.
Inputs: app_id (required), question (required), days, form_id. Returns: days, answer, response_count
paydirt_begin_setupA
Use this when installing voice cancellation feedback or Suggest a Feature for an iOS app with RevenueCat or StoreKit, and connect Slack during browser authorization. For website-started setup, pass its app_id to reuse the prepared app and delivery settings. Inspect the host first. Without form_plan_confirmed, returns the concise cancellation/Suggest a Feature confirmation and does not start authorization. After confirmation, pass the selected use_cases and placement to receive authorization_url and finish_arguments immediately.
Inputs: app_id, app_name, bundle_id, use_cases, +6 more. Returns: status, message, success
paydirt_connect_slackARead-onlyIdempotent
Use this when the user asks to connect Slack or repair Slack delivery after onboarding. Returns the Slack OAuth URL for the app owner’s workspace. Browser onboarding lets the owner select channels; preserve those choices and verify every requested form assignment. Only completed Q&A is sent.
Inputs: app_id (required). Returns: auth_url
paydirt_create_appA
Use this when the user explicitly needs a separate Paydirt app and setup cannot reuse or create it. Creates a new app; list existing apps first when duplication is possible.
Inputs: name (required), bundle_id, app_description. Returns: id, name, api_key, bundle_id
paydirt_create_formA
Use this when creating a low-level remote form without a host-app placement request. First confirm a matching form does not exist. Map subscription cancellation to cancellation, trial cancellation to trial_expiration, and regular feedback to custom; then wire the returned ID into iOS and assign Slack. Prefer paydirt_add_feedback_form for named screen or action placement.
Inputs: name (required), type (required), app_id (required), prompt (required), +1 more. Returns: id, name, type, app_id, +3 more
paydirt_delete_formADestructiveIdempotent
Use this when the user explicitly asks to permanently delete a specific Paydirt form. This is destructive and should only be called after inspecting the form when its identity is uncertain.
Inputs: form_id (required). Returns: success
paydirt_finish_setupAIdempotent
Use this when the user has opened the authorization URL returned by paydirt_begin_setup. Checks one setup session and returns immediately. If pending, do not loop or sleep. When ready, securely saves credentials and returns the host-app build, visible verification, and post-verification delivery-choice contract.
Inputs: session_id (required), app_id, app_name, bundle_id, +7 more. Returns: status, message, success
paydirt_get_appARead-onlyIdempotent
Use this when the agent needs the current identity, bundle ID, SDK key, or configuration for one known Paydirt app. Does not modify the app.
Inputs: app_id (required). Returns: id, name, api_key, bundle_id
paydirt_get_feedback_digestARead-onlyIdempotent
Use this when the user or a scheduled task needs a read-only daily or periodic Paydirt brief. Returns completed-response totals by feedback type, comparison with the previous equal period, and concise highlights. Never turn feedback into code changes or tasks automatically.
Inputs: app_id (required), hours. Returns: items, app_id, counts, period, +3 more
paydirt_get_formARead-onlyIdempotent
Use this when the agent needs the current prompt, type, enabled state, or Slack assignment for one known form. Does not modify the form.
Inputs: form_id (required). Returns: form
paydirt_get_responsesARead-onlyIdempotent
Use this when the user or coding agent needs raw feedback conversations, exact Q/A turns, input type, subscription metadata, or a read-only inbox cursor. Defaults to completed conversations. Use since plus the newest updated_at for incremental reads; never take action from responses automatically.
Inputs: app_id (required), limit, since, status, +1 more.
paydirt_get_summaryARead-onlyIdempotent
Use this when the user asks for an aggregate AI summary of recent Paydirt responses. Raw questions and answers remain the source of truth; this read-only summary is supplementary.
Inputs: app_id (required), days, form_id. Returns: period, summary, top_reasons, response_count
paydirt_health_checkARead-onlyIdempotent
Use this when diagnosing whether the Paydirt API is reachable and stored authentication is valid. Performs a read-only connectivity check.
Inputs: no named parameters. Returns: status, authenticated
paydirt_list_appsARead-onlyIdempotent
Use this when the user asks which Paydirt apps exist or when an agent must resolve an app ID after setup. Lists all apps for the authenticated Paydirt account without changing them.
Inputs: no named parameters.
paydirt_list_formsARead-onlyIdempotent
Use this when the user asks which forms exist or the agent needs to resolve or deduplicate forms for a Paydirt app. Does not modify forms.
Inputs: app_id (required).
paydirt_list_slack_channelsARead-onlyIdempotent
Use this when Slack is connected and the agent must resolve a requested channel name to its channel ID. Lists available channels without changing assignments.
Inputs: app_id (required). Returns: channels, team_name
paydirt_set_form_channelADestructiveIdempotent
Use this when a form must deliver completed conversations to a specific Slack channel ID. Replaces that form’s current channel assignment and should be verified afterward.
Inputs: app_id (required), form_id (required), channel_id (required). Returns: form
paydirt_setupA
Use this when an older client expects the single setup tool. Without session_id it starts setup and immediately returns authorization_url plus finish arguments; with session_id it checks once and returns pending, expired, or the complete installation contract. It never opens a browser or blocks. New agents should prefer paydirt_begin_setup and paydirt_finish_setup.
Inputs: app_id, app_name, bundle_id, use_cases, +7 more. Returns: status, message, success
paydirt_slack_statusARead-onlyIdempotent
Use this when the developer selected Slack or combined delivery and completed authorization. Reports the Paydirt feedback channel and whether every installed form is assigned. Do not call it for agent-only delivery.
Inputs: app_id (required). Returns: connected, team_name
paydirt_toggle_formADestructiveIdempotent
Use this when the user asks to enable or disable an existing form remotely. Disabled forms are not shown by the SDK; calling again with the opposite value reverses the change.
Inputs: enabled (required), form_id (required). Returns: form
paydirt_update_appADestructiveIdempotent
Use this when the user asks to change an existing Paydirt app’s identity, bundle ID, description, or AI context. Only supplied fields are updated.
Inputs: app_id (required), name, bundle_id, system_prompt, +2 more. Returns: id, name, api_key, bundle_id
paydirt_update_formADestructiveIdempotent
Use this when the user asks to change an existing form’s name, initial question, or AI follow-up guidance. Only supplied fields are updated.
Inputs: form_id (required), name, prompt, custom_system_prompt. Returns: form
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 23 tools
Most tools have clear roles, but there is meaningful overlap among setup/legacy setup, create_form/add_feedback_form, and the several read/analytics tools (get_responses, get_feedback_digest, ask, get_summary). Agents may need to read descriptions carefully to pick the right one.
Tool names follow a mostly consistent paydirt_verb_noun pattern and all use snake_case. Minor exceptions like paydirt_ask and paydirt_slack_status break the strict verb-noun pattern but do not create significant confusion.
23 tools is on the higher end but still reasonable for a domain covering apps, forms, responses, Slack integration, setup, and analytics. A few redundant legacy compatibility tools inflate the count slightly.
The tool set covers app and form CRUD, response retrieval, Slack channel management, setup flow, and summary/analytics. Missing operations like app deletion are not explicitly present, but the provided surface is fairly complete for the described use cases.
Maintenance
Related MCP Connectors
Set up and inspect app paywalls, subscriptions, offerings and analytics from your AI agent.
App Store Connect operator for AI agents: icons, TestFlight builds, listings, IAP, rejection fixes.
Ship a new iOS app from chat. AI runs App Store Connect, builds, release, and submission through Ap…
Cloud iPhones and Macs with Xcode for AI agents: build, run and test iOS apps, use the screen.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI assistants to build, test, run, and manage Apple platform projects (iOS, macOS, tvOS, watchOS, visionOS) directly through Xcode. Provides comprehensive control over Xcode projects, Swift packages, simulators, and development workflows without leaving your editor.54 npm2MIT
- AlicenseNot gradedqualityFmaintenanceEnables AI agents to manage App Store Connect apps, including registering bundle IDs, uploading metadata and screenshots, setting age ratings, managing TestFlight groups and testers, and submitting apps for review.MIT
- AlicenseAqualityBmaintenanceEnables AI coding agents to review Swift code, scaffold new iOS apps, and build, test, and preview them in the Xcode Simulator using local Apple guides and source references.3640MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI coding agents to add stablecoin checkout, payment links, payment status checks, webhook verification, and webhook-based entitlement logic to applications. It also provides tools for workspace registration, settlement and webhook configuration, paylink creation, and crypto payment status checks.-