Search DevTools

Jump to any tool or page

Trusty Squire

Unexplored

Trusty Squire signs up / in to websites for you so you don’t have to.

Trusty-Squire3 stars1 forksBrowser & Web
View source

Install

Terminal

$npx -y @trusty-squire/mcp server

mcp_config.json

{
  "mcpServers": {
    "ai-trustysquire-trusty-squire": {
      "args": [
        "-y",
        "@trusty-squire/mcp",
        "server"
      ],
      "command": "npx"
    }
  }
}

Documentation

Trusty Squire

Empower agents with auth and payments. MCP tools to automate auth and pay — your keys and card never leave the vault.

Trusty Squire is an MCP server that lets Claude Code, Codex, Cursor, OpenCode, Goose, and other coding agents sign up, provision, and purchase on your behalf. It opens a real browser, works through signup, sign-in, setup, and checkout flows one step at a time, clears the bot-detection and email-verification steps that make operator tools stall, and hands the job back to a person only when one is actually required. That covers wiring up OAuth and API keys for the app you're building as much as it covers paying a checkout, sending a gift, or booking something — the same operator primitives drive all of it.

Provider secrets and payment cards are write-only: the agent's credential tools return references and authenticated results, never stored plaintext. The raw secret never needs to enter the agent's context, so it can't be pasted into a commit, leaked in a log, or read back out over chat. When a task genuinely needs the plaintext somewhere the agent controls, fetch_credential releases it — for one credential, once, and only after you sign that exact request with your passkey. Backend access is a host-scoped, rate-limited, independently revocable grant, so a leaked token is killed without rotating the provider key — and you connect Google or GitHub yourself in a real browser, so the agent never types your password. Full threat model below.

One prompt

Add Google OAuth to this app in one prompt: create the OAuth client, save the client secret, and wire it in without putting the raw key in chat, code, or .env.

Your coding agent plans the job. Trusty Squire operates the website, stores the generated key, and can issue your backend a scoped grant. The backend calls the provider through Trusty Squire, which injects the provider key on the server side.

Other useful asks:

  • “Set up Stripe payments for this app and keep the API key out of this conversation.”
  • “Create a Render API key for deployment automation and keep it out of this conversation.”
  • “Pay this checkout with my saved work card and ask me to approve it on my phone.”
  • “Send a gift to my friend without sharing their address with me.”
  • “Book this dinner reservation for me.”
  • “That app grant leaked. Revoke it without rotating the provider key.”

For supported card checkouts, save a card in the Vault from a passkey-capable device or let your first operate_pay approval link collect one just in time. When no card is specified, Trusty Squire uses the only saved card, starts the add-card ceremony if none exists, or asks you to choose when several exist. The new card is encrypted in your browser with a passkey-derived key and bound to that purchase before approval; if you add it but do not approve in time, it remains saved for a faster retry.

Recognized Visa, Mastercard, Amex, Discover, Diners Club, and JCB cards show their network mark in the Vault while keeping the full bank/network label. Open a card row to see its masked number; reveal runs the passkey ceremony in your browser before showing the number, name, expiry, and billing address. The CVV is never shown, even after reveal. The Activity page also records card additions and removals, payments, and app-grant changes without storing a PAN or CVV.

operate_pay requires a non-empty item and reason (calls that omit either receive a validation error). On a single-page checkout it prefers a machine-read checkout total, sends you a short-lived approval link, and submits only after you approve the purchase. A clean visible labeled total wins; when none is readable, strict schema.org Order/Invoice.totalPaymentDue structured data can supply the amount and currency. If neither source exposes a total, caller-supplied amount_cents and currency become the authoritative approval amount; an omitted merchant name falls back to the checkout URL's hostname. Product and offer prices never qualify as machine-read checkout totals. An unambiguous ISO currency on the page remains authoritative. A notation that cannot identify one ISO currency by itself, such as a shared currency symbol or an FX-preview selector, falls through to the currency already selected or approved for the purchase instead of refusing the checkout. Any live amount or currency drift still fails closed; the authoritative binding contract lives in the security model. Approval, 3-D Secure, Activity, and notification amounts use the currency's minor-unit precision (for example, whole yen for JPY and two decimals for USD). After you sign in, the owner-only approval page shows the merchant, checkout origin, amount and currency, item, and reason directly from the short-lived server record before one passkey ceremony authorizes those canonical payment values. You also see the requesting MCP client (for example, Hermes) and the bound card's label plus last four digits (or its label alone for a legacy card) before clicking Approve payment to relay the operator-sealed final authorization. Before submitting that authorization, you can instead choose Deny payment; a denial closes that approval attempt and prevents any later operator confirmation. When the pre-submission checkout can be machine-read, the payment is refused if its merchant, origin, amount, or currency has changed since approval. If that resume read cannot recover a total, Trusty Squire reuses the original mandate-bound checkout values. Card entry requires the PAN, expiry, and CVV fields; cardholder name and other explicitly labeled billing fields are filled best-effort, so a missing name field does not abort the payment. Sealing and cleanup touch only those selected payment controls; merchant shipping address and country controls remain untouched. If the checkout has a selected merchant-saved card alongside the newly filled card, Trusty Squire selects the sole unambiguous new-card radio and verifies both that choice and the filled fields again immediately before submission; ambiguous choices, selected saved-card options, and failed verification are refused with payment_card_selection_ambiguous. A charge is treated as dispatched only after the browser observes a concrete charge/order request, a terminal merchant outcome, or genuine 3-D Secure evidence; native form validation alone does not claim a dispatch. A submit is reported as payment_submitted only after the checkout reaches a new merchant order-confirmation URL with a substantive order or receipt identity. The browser completes 3-D Secure natively, including out-of-band bank-app challenges — Trusty Squire never manipulates or intercepts the challenge; it uses read-only checks while polling for that same order-confirmation signal. At that last observable boundary, a mismatch between the released card and issuer, network, or last-four evidence rendered by the 3-D Secure issuer/app is returned as a structured warning with kind: "payment_instrument_mismatch" and expected-versus-observed evidence. The warning persists through resumable operate_payment_status calls; it neither changes the payment status nor cancels, approves, or modifies the challenge, so the cardholder retains the decision whether to continue. A dispatched attempt with no confirmed merchant outcome and no genuine 3-D Secure evidence remains payment_outcome_unknown, including across resumable status checks; Trusty Squire never relabels that uncertainty as 3-D Secure. A detected challenge that remains unresolved on timeout stays payment_3ds_required with needs_user.wall: "3ds", handing control back for user completion. Neither status is success or permits blind resubmission: manually check the merchant's order state before any retry.

operate_pay surfaces the approval link before its bounded server-side wait. It may wait up to one minute for approval, denial, or expiry; if it returns approval_pending first, call operate_pay again with the same arguments. That call resumes the same approval and one-passkey boundary instead of creating a new link. operate_payment_status is a non-charging alternative for inspecting the pre-charge approval and is the continuation tool for an already-submitted unknown or 3-D Secure outcome. Its wait_seconds accepts 0-60 (default 0) to bound-wait instead of taking an instant peek. Denial or expiry is terminal for that session's attempt: repeated calls return the same result and never mint a replacement approval. Close the session and start a fresh one before making a genuinely new payment attempt.

Every payment response includes its session_id. Pass that same ID to every follow-up payment call. Omitting session_id remains compatible only while this MCP process has exactly one session; it never selects a newest or arbitrary checkout.

Some split checkouts collect the card before the final order-confirmation step. On the card-entry page, operate_pay { phase: "fill_card" } first reads the live total. A subtotal qualifies as that payable amount only when the same order summary says shipping is free; recommendation and related-product prices are excluded. If that page exposes no total, caller-supplied amount_cents and currency take precedence as the approval amount. If they are omitted, Trusty Squire may use the most recent real total observed earlier in the same browser session, such as the cart subtotal, only when the checkout origin still matches. One phone approval binds that amount and releases the card; Trusty Squire fills the card without submitting and its role in the purchase ends there. It fills only the merchant's own HTTPS frames or recognized payment-provider frames. The card stays in the page as filled fields while the agent advances to the review step and places the order; those fields are ordinary page content in operate_observe and operate_screenshot, not masked. Verify the live final total against the approved amount_cents/currency yourself before placing the order; Trusty Squire no longer re-reads the total or submits anything. For operate_click, a control whose label looks like pay/place-order may fire only once for that approval. A second recognized attempt is refused and requires a fresh operate_pay approval in a new session. Non-charge-labeled clicks, key presses, and OAuth controls remain ungated. After a recognized click dispatches, Trusty Squire best-effort records a secret-free payment_place_order_attempted Activity event bound to the approval, optional mandate, approved amount/currency, merchant, and opaque card reference. This records an attempt, not a verified charge outcome.

operate_pay { phase: "confirm" } just releases the session's pending-fill lock and reports the approved terms back — it makes no browser or provider call, records no audit event itself, and never charges. It can be called any time after the fill — it does not need to happen before you place the order, and it never reads a total or verifies an amount. If a payment gets stuck or a card is declined, recover with operate_finish and start a fresh session; operate_pay does not support refilling a different card mid-session.

Before an initial single-page or fill_card call, Trusty Squire follows the actual visible card-number field and hands the checkout back when that field is hosted by PayPal or Braintree. A separate PayPal express button does not block fillable merchant or Shopify PCI card fields. Trusty Squire does not sign in to PayPal or use vaulted PayPal credentials. After any submit that has not yet reached a confirmed order, Trusty Squire waits 180 seconds by default for native completion, including out-of-band bank-app approval. A linked Telegram chat receives a challenge-specific nudge only after 3-D Secure is detected. Standard cross-processor 3-D Secure signals and recognized CardinalCommerce or Stripe challenge frames classify the first case only when the containing frame is visibly rendered. Hidden 3-D Secure Method pre-authentication and captcha-hosted frames never count as 3-D Secure, and an ordinary Shopify PCI card-field host alone does not either. It reports a visible decline and hands an unresolved outcome back on timeout, noting whether the Telegram nudge actually went out. three_ds_wait_seconds accepts whole seconds from 0 to 600; set it to 0 on operate_pay to skip the notification and waiting and receive the handoff immediately.

Connect Telegram under Vault Settings to receive secret-free alerts for credential, card, payment, and app-grant lifecycle changes. Routine credential retrieval and proxy access stay in Activity instead of sending a push for every request.

Install

npx @trusty-squire/mcp connect

connect signs you in with Google or GitHub, detects your coding agent, and merges the squire MCP server into its existing configuration. On a machine with a user-visible desktop, sign-in opens a local Chrome window. On a headless Linux server, including an SSH/TTY session with an inherited virtual display, interactive login starts a login-scoped Xvfb and noVNC stack and prints a URL you can open on another device. The default quick tunnel and every local helper are torn down when that login completes, times out, fails, or is interrupted. Operators may instead set both TS_LOGIN_PUBLIC_HOSTNAME and TS_LOGIN_LOCAL_PORT to reuse an externally managed named tunnel; Trusty Squire still tears down its per-login display and local listener, but never creates or stops that external tunnel. If that tunnel's fixed local port is busy, login reports it and uses a one-off quick tunnel for that sign-in instead. Restart the agent and ask for the finished website outcome. Trusty Squire is free to start.

connect is also the only way to sign in again: --force-relogin switches the bound account and --force-relogin=google or --force-relogin=github refreshes one provider session. It reports success only after re-checking the browser profile and finding that Google session live, so a run that binds the machine but leaves no usable session fails loudly with the command to retry rather than reporting a working install.

Local state is kept separately for each connected account, and connect pins that account in the agent's MCP configuration; connecting another account does not replace the first account's state. To remove just one account, run npx @trusty-squire/mcp logout --account=<id>; without --account, logout removes the most recently connected account. --account requires a nonempty account ID.

To choose a target explicitly:

npx @trusty-squire/mcp connect --target=codex

Supported targets: claude-code, cursor, codex, opencode, goose, cline, continue, and hermes.

The isolated operate_* browser runtime currently requires Linux and a local Chrome connection; remote CDP, macOS, and Windows operator sessions are not supported in this migration stage.

What happens

  1. Your coding agent names the website and the outcome it needs: an account, authenticated setup, app publishing, a purchase, a gift, or a booking.
  2. Trusty Squire works through the service flow one step at a time. Every task opens its own fresh browser profile and restores the snapshot's non-Google signed-in state, so independent sessions can run concurrently without opening the canonical login profile. Google state is restored inside the serialized operate_login boundary; sanctioned Gmail verification uses a separate temporary identity browser.
  3. If the flow produces an API key or client secret, Trusty Squire captures it into the vault without returning the raw value through its credential tools.
  4. The agent can make an authenticated request, create a host-scoped app grant, or use a saved card for a supported checkout after you approve the purchase.
  5. Eligible successful flows can become signed registry skills, so later runs can replay verified steps instead of rediscovering every click.

If a site requires phone verification, a hard CAPTCHA, an unresolved 3-D Secure challenge, an unsupported payment method, or another human decision, the run hands control back and tells you. It does not guess or pretend the task completed.

Supported services

Discovery pages are generated only for services with an active skill in the Trusty Squire registry. The first five detailed pages cover Braintrust, Cerebras, Clerk, DeepInfra, and Zilliz Cloud. Each sample has explicit signup evidence in its active registry record and a provider request checked against official API documentation. The service hub also lists every active registry entry; the remaining detail pages stay unpublished until their workflow and unique content pass review.

Browse the active service catalog. Maintainers can detect registry drift before merging with:

pnpm seo:verify-services

The registry controls which service pages exist. An external list is never used to claim support.

Keep provider keys out of agent context

Ask the agent to create a scoped backend grant:

Grant this backend access to Clerk through Trusty Squire with a limit of 100 requests per hour.

Before minting the grant, make api.clerk.com the credential's primary allowed host in the Vault. The egress proxy refuses every other upstream host. This explicit policy step is required when the signup host and provider API host differ.

The agent calls the real MCP tool with the service and requested limit:

grant_app_access({
  service: "clerk",
  rate_limit_per_hour: 100
})

Rate limits are opt-in. Omitting rate_limit_per_hour creates an unlimited grant; host scoping, auditing, and revocation still apply. When a grant reaches an explicit hourly limit, the proxy returns 429 rate_limited with scope: "grant", Retry-After, and window/reset metadata.

The result contains a host-scoped egress base_url and a token, not the Clerk secret key. The token is returned once through the MCP result and remains valid until revoked. That means the scoped grant token can enter agent context; it is not the provider key. Move it directly into backend-only deployment secret storage, never browser code, logs, or source control. If you need zero grant-token exposure to the model, use use_credential for agent-initiated requests instead. Trusty Squire removes the grant authorization at the boundary and injects the vaulted provider credential into the upstream request.

Security and threat model

  • Provider credentials are encrypted in the vault and are write-only to agent credential tools. T

Sourced from the repository README.

More in Browser & Web