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 create forms, place them in an iOS app, connect Slack, build and launch the host app, leave a Debug-only test form open for immediate verification, and read raw feedback. Paydirt supports native StoreKit, RevenueCat, Superwall, app-owned billing, and apps without subscriptions.
A generic installation first confirms cancellation feedback and Suggest a Feature, then creates the selected forms after Google sign-in. The agent builds and shows the form on a simulator or connected iPhone before asking whether completed feedback should go to Slack and coding agents (recommended), Slack only, or coding agents only.
Install in Codex
codex mcp add paydirt -- npx -y paydirt-mcp@latest
Restart Codex after adding the server. Then ask:
Add Paydirt and show me it working.
To remove the server later:
codex mcp remove paydirt
Install in Claude Code
claude mcp add paydirt -- npx -y paydirt-mcp@latest
The public Paydirt Claude plugin marketplace is also included in this repository. After the public repository is available:
/plugin marketplace add Paydirt-AI/paydirt-mcp
/plugin install paydirt@paydirt-plugins
The plugin bundles both the Paydirt installation workflow and the pinned MCP server configuration.
Other MCP hosts can launch the same stdio command:
{
"mcpServers": {
"paydirt": {
"command": "npx",
"args": ["-y", "paydirt-mcp@latest"]
}
}
}
Requires Node.js 18 or newer.
Hosted transport candidate
The same tools now have a Streamable HTTP entry point for the planned
https://mcp.paydirt.ai/mcp service. It is implemented but is not advertised
as live until the endpoint is deployed and externally verified:
npm run build
npm run start:hosted
This serves /mcp plus /healthz, publishes standards-based OAuth 2.1 and
RFC 9728 discovery metadata, requires PKCE S256 and resource-bound tokens,
validates Host and Origin, enforces MCP content negotiation, and rate-limits
clients and session creation. OAuth grants survive reconnects and service
restarts; the existing stdio package and its installation commands are unchanged.
See HOSTED.md for deployment configuration, security boundaries,
the single-replica launch constraint, and the remote publication gate.
Authentication
The local stdio package uses an explicit, headless-safe two-step flow:
- The agent inspects the app and calls
paydirt_begin_setup without confirmation to receive the recommended form plan, then asks the developer to approve Add both, Cancellation only, or Customize.
- After confirmation, the agent calls
paydirt_begin_setup with form_plan_confirmed: true. It immediately receives an authorization_url, session_id, and exact finish_arguments. The MCP process never launches a browser, sleeps, or polls.
- Open
authorization_url in any browser and sign in to Paydirt with Google. Paydirt creates the app and selected forms without requiring Slack.
- The agent calls
paydirt_finish_setup, installs Paydirt, builds and launches the app, and leaves the form visibly open.
- Only then does the agent ask for Slack and coding agents (recommended), Slack only, or coding agents only. Slack OAuth begins only when selected.
paydirt_setup remains as a compatibility alias: call it without session_id to begin and with session_id to finish.
The stdio server saves credentials locally at ~/.paydirt/credentials.json
with owner-only permissions. For ephemeral stdio environments, set
PAYDIRT_AUTH_TOKEN instead.
The hosted endpoint uses MCP OAuth 2.1 discovery and Dynamic Client
Registration. Its authorization page runs the same Google + Slack flow once,
then returns short-lived resource-bound access tokens and rotated refresh
tokens. Only token hashes are stored; MCP bearer tokens are never passed to the
Paydirt API. After OAuth, paydirt_begin_setup immediately returns the complete
installation contract without starting a second browser flow.
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
paydirt_begin_setup | Start non-blocking browser authorization |
paydirt_finish_setup | Check authorization once and return the installation contract |
paydirt_setup | Backward-compatible begin/finish alias |
paydirt_add_feedback_form | Create/reuse a named form and return its host-app placement contract |
paydirt_list_apps, paydirt_create_app, paydirt_get_app, paydirt_update_app | Manage apps |
paydirt_list_forms, paydirt_create_form, paydirt_get_form, paydirt_update_form, paydirt_toggle_form, paydirt_delete_form | Manage forms |
paydirt_get_responses | Read raw conversations using a stable cursor |
paydirt_get_summary, paydirt_ask | Read optional AI analysis |
paydirt_connect_slack, paydirt_slack_status, paydirt_list_slack_channels, paydirt_set_form_channel | Connect and configure Slack delivery |
paydirt_health_check | Verify API connectivity and credentials |
Development
npm ci
npm test
npm pack --dry-run
The public package contains the stdio entry point and the hosted Streamable HTTP
entry point. Paydirt's API, dashboard, secrets, and operational configuration
remain outside the published package.
Official MCP Registry metadata lives at .mcp/server.json. It describes the current npm stdio package; Paydirt does not claim a remote MCP transport until a public HTTPS endpoint is deployed and verified.
See SUPPORT.md for support, SECURITY.md before reporting a vulnerability, and CONTRIBUTING.md before opening a pull request.
License
MIT