Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Trusty Squire

NPM · @TRUSTY-SQUIRE/MCP · SCANNED SEP 20

Provision, ship, and pay from your coding agent — keys and cards never leave the vault.

Available components

−5 this week 78 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security81
  • No malware found by supply-chain analysis.Pass
  • CVE check failed: a known high-severity CVE affects sharp 0.34.5, a direct dependency. A fixed version is available. View diagnostics → Fail
  • No install/post-install scripts declared.Pass
  • 101 of 282 dependencies flagged as unhealthy (5 deprecated). View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to Trusty-Squire/trusty-squire). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability57
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 9637 tokens (~332/item across 29 items; 29 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management52
  • Stability check failed: the tool surface changed between 1.1.9 and 1.1.16-rc.3: 5 tool removals, 0 breaking changes, 18 additions. See how to fix → Fail
Tool Coverage73
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 4% of tool parameters carry a description.Partial
  • Structured output schemas are declared (24% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 30 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Trusty Squire MCP server?

Trusty Squire runs locally as an npm package, launched with npx -y @trusty-squire/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @trusty-squire/mcp

# add to Claude Code
claude mcp add ai-trustysquire-trusty-squire -- npx -y @trusty-squire/mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "ai-trustysquire-trusty-squire": {
      "command": "npx",
      "args": [
        "-y",
        "@trusty-squire/mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "ai-trustysquire-trusty-squire": {
      "command": "npx",
      "args": [
        "-y",
        "@trusty-squire/mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add ai-trustysquire-trusty-squire -- npx -y @trusty-squire/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-trustysquire-trusty-squire": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@trusty-squire/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ai-trustysquire-trusty-squire --command npx --arg -y --arg @trusty-squire/mcp
# ~/.hermes/config.yaml
mcp_servers:
  ai-trustysquire-trusty-squire:
    command: "npx"
    args: ["-y", "@trusty-squire/mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "ai-trustysquire-trusty-squire": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@trusty-squire/mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add ai-trustysquire-trusty-squire -t stdio -c npx -a -y @trusty-squire/mcp
// mcp.json
{
  "mcpServers": {
    "ai-trustysquire-trusty-squire": {
      "command": "npx",
      "args": [
        "-y",
        "@trusty-squire/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 49 to 52.

  • 19 Sept 26 0
    • Stability: fail → unverified security
    • Tool safety: pass → unverified security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • Package version: 1.1.16-rc.2 → 1.1.16-rc.3 functional
  • 18 Sept 26 +12
    • Stability: fail → unverified security
    • Tool safety: pass → unverified security
    • Malware scan: unverified → pass security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • Package version: 1.1.15 → 1.1.16-rc.2 functional
    • Package version: 1.1.15 → 1.1.16-rc.1 functional
    • Package version: 1.1.8 → 1.1.16-rc.1 functional
  • 17 Sept 26 −15
    • Malware scan: pass → unverified security
    • Stability: fail → unverified security
    • Tool safety: pass → unverified security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • Package version: 1.1.14-rc.34 → 1.1.15 functional
    • Package version: 1.1.14-rc.34 → 1.1.15-rc.2 functional
    • Package version: 1.1.14-rc.34 → 1.1.15-rc.1 functional
    • Package version: 1.1.14-rc.34 → 1.1.14 functional
  • 16 Sept 26 +15
    • Stability: fail → unverified security
    • Tool safety: pass → unverified security
    • Malware scan: unverified → pass security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • Package version: 1.1.14-rc.31 → 1.1.14-rc.34 functional
    • Package version: 1.1.14-rc.31 → 1.1.14-rc.33 functional
  • 15 Sept 26 −24
    • GHSA-rgj7-g3m4-5g8c affects this package: high security
    • GHSA-f88m-g3jw-g9cj affects this package: high security
    • Malware scan: pass → unverified security
    • Stability: pass → unverified security
    • Tool safety: pass → unverified security
    • Stability: pass → fail security
    • Known CVEs: pass → fail security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • Schema quality: 419 → 332 functional
    • Schema quality: 419 → 310 functional
    • First check of Tool coverage: 26 functional
    • Schema quality: excellent → good functional
    • Package version: 1.1.9 → 1.1.14-rc.31 functional
    • Package version: 1.1.9 → 1.1.14-rc.30 functional
    • Package version: 1.1.9 → 1.1.14-rc.29 functional
    • Package version: 1.1.9 → 1.1.14-rc.28 functional
    • Package version: 1.1.8 → 1.1.14-rc.27 functional
  • 14 Sept 26 +6
    • Stability: fail → pass security
  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 52 to 55.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/@trusty-squire/mcp@1.1.16-rc.3

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo Trusty-Squire/trusty-squire
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/Trusty-Squire/trusty-squire/.github/workflows/release.yml@refs/heads/main
Rekor log index 2893177524
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:2c9f2dd134443d517209e6122a3fa54c65235cc85c202386aece9cf06676766af59b74c7b1db85d440829f9d74c556a49791ce1a596e49ae4e2862c33

Background: How many MCP packages publish verified provenance →

Vulnerabilities 2 findings
ID CVE Severity Vector Fix available
GHSA-f88m-g3jw-g9cj high yes
GHSA-rgj7-g3m4-5g8c high yes

Background: What a vulnerability scan can and cannot prove →

Dependencies 282 packages
Packages resolved 282
Deprecated 5
Stale 97
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 29 exposed · ~9,184 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
audit_log ~384

Read the vault audit ledger — "show me everything that touched my keys." Account-scoped, newest-first, NO secret values ever. By default (`view:"ledger"`) the response is SHAPED so it is readable: - `events` — the security ledger: credential stored / rotated / deleted / edited, grants minted / revoked, payments, plus every ANOMALY (`anomaly:true` with an `anomaly_reason` — non-2xx, 429, proxy error, rejected call). Routine successful egress is NOT listed here. - `egress.rollups` — routine proxied calls collapsed per credential x target host x burst: count, status breakdown, total bytes, first/last timestamp, and the grants covering that window. Pass a rollup's `id` back as `expand` to see its individual calls. - `grant_totals` — per egress grant: cumulative calls, bytes, last used. - `summary` — one human-readable line per rollup / headline. Escape hatches and filters: `view:"raw"` returns the flat unaggregated page (the original shape). `type` (an event kind), `reference` (a single credential), `limit` (rows, default 50, max 200), `before` (keyset cursor from `next_before`), `scan` (raw events read before shaping, default 500, max 2000) and `window_minutes` (burst gap, default 60) all still apply.

NameTypeReqDescription
beforestring
expandstring
limitnumber
referencestring
scannumber
typestring
viewstring
window_minutesnumber

No output schema declared.

No examples provided.

delete_credential ~113

Soft-delete a vaulted credential only after the user approves the exact destructive action from the Telegram/passkey vouch link. Pass an exact vault reference, service, or saved credential name (combine service+name to disambiguate). The first call returns approval_pending and an approval_id. After the user approves, call delete_credential again with ONLY that approval_id. Retrying an approved approval_id is idempotent. No unsigned, expired, mismatched, ambiguous, or unknown request deletes anything.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

edit_credential ~148

Edit only non-secret metadata on a credential after the user approves the exact before→after change from the Telegram/passkey vouch link. Use allowed_hosts or login_hosts with mode add/remove/replace; label renames are also supported. Pass an exact vault reference, a service, or a saved credential name (combine service+name to disambiguate). The first call returns approval_pending and an approval_id. After the user approves, call edit_credential again with ONLY that approval_id. Unknown and immutable fields are rejected. This tool can never read or alter the stored secret value; rotate a secret only by calling store_credential with the new value.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

edit_payment_card ~149

Request an edit of a saved PAYMENT CARD (label, number, expiry, name, billing) behind the user's passkey approval. Identify the card by its exact id from list_payment_cards, or by its exact label. The first call returns approval_pending and an approval_id; the user opens the approval link and edits the card fields directly in the browser, where the card is decrypted and re-encrypted locally — the server stores only the new sealed blob and the agent never sees or chooses any card value. After the user finishes, call edit_payment_card again with ONLY that approval_id to confirm the result (idempotent). This tool can never read card data.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

fetch_credential ~368

Return a vaulted credential's RAW value to you, in clear, after an explicit human passkey approval. Use it ONLY when unavoidable: the value lands in your context and therefore in the conversation transcript and any logs of it, which no later step can undo. Prefer `use_credential` whenever the task is "call an API with this key" — the server injects the secret into the HTTP request and returns only the upstream response, so the key never reaches you at all. Prefer an egress grant (`grant_app_access`) when a deployed app needs standing access. Reach for `fetch_credential` only when the raw key must physically land somewhere YOU control and no server-side injection path exists — writing it into a GitHub Actions secret, a .env file, or a config file. If you can accomplish the task without the plaintext, do that instead. Every fetch requires an explicit human passkey approval; there is no way to skip it. The first call resolves the credential and returns approval_pending with an approval_url — NO value. The user opens that link and signs with their passkey. Then call fetch_credential again with ONLY that approval_id to receive the value. Delivery is single-use: the same approval_id will not return the value twice, so store it where it needs to go on first receipt. A denied or expired approval returns a refusal and no value. Pass `field` to name one field of a multi-field credential (required when the credential has more than one — call list_credentials for its field names). Pass optional `reason` (short, in your own words) saying what you will do with the value so the owner can see who is asking and why.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

grant_app_access ~348

Mint an egress grant: a revocable token + base URL so an app you DEPLOYED can call a provider using a vaulted credential, WITHOUT ever holding the raw key. Squire injects the real secret server-side at the boundary and enforces the credential's allowed_hosts. Point the app's SDK base URL at the returned `base_url` and authenticate with the returned `token` — the SDK's requests are forwarded to the provider with the real key swapped in. Pass `service` or `reference` to pick which vaulted credential to leash. Limits are OPT-IN and UNLIMITED by default: pass `rate_limit_per_hour` and/or `spend_cap_usd` ONLY if the caller wants a cap. Omit them for no rate/spend limit (the grant is still revocable + host-scoped + audited). SECURITY: the token is returned once through this MCP result, so it is visible to the host/model even though the raw provider key is not. Move it directly into BACKEND-ONLY deployment secret storage; never put it in client/browser code, logs, or source control. It is strictly safer than the raw key (scoped to one credential's hosts, rate-limitable, instantly revocable, audited), but it is still a bearer secret. Use use_credential instead when zero grant-token exposure to the model is required. Revoke any time; revocation is instant and needs no key rotation.

NameTypeReqDescription
rate_limit_per_hournumber
referencestring
servicestring
spend_cap_usdnumber

No output schema declared.

No examples provided.

inject_card ~441

Release one saved card under the existing single human purchase approval and fill only the supplied observation refs. Supply session_id and refs for pan/cvv from operate_observe; each may target the main document or any reachable frame. Expiry, cardholder name, and billing are NOT inject targets and are not secret: after approval the result carries exp_month, exp_year, name, and any stored billing alongside last4, and you type those with operate_type/operate_select like any other field. After approval the session also exposes the card as opaque per-digit masked tokens you can place into ANY field ref yourself with operate_type: {{pan}} and {{cvv}} type the whole value, {{pan:N}} and {{cvv:N}} type one digit (1-based, N up to the returned pan_length/cvv_length); the broker substitutes the real digit at the keystroke boundary and the digits are never shown to you or masked out of every observation, screenshot, and error. Use the refs for the ordinary path and the tokens for arbitrary layouts, single-digit boxes, remounts, re-validation, or post-error re-arm. Avoid provider helper/autofill/focus inputs and choose the actual card control. This tool never searches for payment providers, chooses a card UI, reads or validates the total, clicks submit, clears fields, or diagnoses the checkout. Partial results are ordinary browser outcomes; retry changed refs with the same approval_id. Before placing the order, re-observe and confirm no competing saved-card control is selected. The operator detects a rendered 3-D Secure challenge on observation or action results and notifies the cardholder once; do not solve or wait on the challenge yourself — keep observing until the checkout resolves. The released PAN/CVV are masked from all normal operator output before the first write.

NameTypeReqDescription
amount_centsintegeryes
approval_idstring
card_refstringyes
currencystringyes
fieldsobjectyes
itemstringyes
merchantstringyes
reasonstringyes
session_idstringyes

No output schema declared.

No examples provided.

list_app_access ~85

List the egress grants minted for this account — grant_id, which vaulted credential each leashes, rate limit, spend cap, created/revoked timestamps. The backend token itself is never returned (it is shown ONCE at mint time). Use this to find the grant_id to hand to revoke_app_access, or to audit what standing app access exists.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_credentials ~366

List the credentials already stored in the user's vault for this account. WHEN TO CALL THIS TOOL: - BEFORE provisioning a service — check whether the account already has a usable key for it, so you reuse the existing key instead of signing up for a duplicate - At the start of a task, to see what API keys are already available - Whenever you need a service's key and aren't sure it exists yet BEHAVIOR: - Returns metadata only — service, key name, type, age, and a vault `reference` — never the secret values themselves - The raw secret is never returned to you; to *use* a key, call use_credential with its `reference` (the server injects it) - Scoped to the user's account; only this account's credentials list FILTERS (all optional — with no filter the full metadata list is returned): - `service`: case-insensitive exact match on the service field; pass a string for one service or an array to match any of several - `fields: "summary"`: return only a compact projection per credential — reference, service, label, field_names, allowed_hosts, created_at, stale — instead of the full metadata object When checking whether a key exists for a specific service (e.g. before provisioning), pass `service` (and `fields: "summary"`) so the answer stays small instead of pulling the whole vault inventory into context.

NameTypeReqDescription
fieldsstring"summary" returns a compact projection: reference, service, label, field_names, allowed_hosts, created_at, stale
serviceFilter by service (case-insensitive exact match); string or array of strings

No output schema declared.

No examples provided.

list_payment_cards ~30

List saved payment cards by opaque ID and user-visible label only. Never returns encrypted blobs or card data.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

operate_click ~577

The action response is the compact `browser-use-control-query` control map by default: after a compact map on the same document, `delta:true` carries changed/new controls in `safe_table` and departed refs in `removed`, never the verbatim DOM. The acted control's own current row is always included, marked `w=acted`, so a write is confirmable from its own result. Pass `format:"full"` to receive the `browser-use-dom` tree instead. After inject_card releases a card, its PAN (complete ordinary spellings and prefixes of at least eight digits) and security code are replaced in every normal observation; all other emitted content stays verbatim. Prefer a current observation ref or unique @label. If a screenshot-visible control has no usable ref, pass screenshot:{screenshot_id,x,y} from operate_screenshot.click_binding, in original image pixels. Provide exactly one of ref or screenshot. target_unresolved means the label was never issued in this document; stale_ref means its reference or alias expired. stale_screenshot requires a new image. Each image binding permits one DISPATCHED attempt; invalid_screenshot_point (a point outside the image or one that resolves no node) does not consume the binding, so a corrected point may retry the same image. After an uncertain click, observe before deciding any new action. Dispatch does not guarantee challenge clearance. Use inject_card for saved-card field entry. A pointer-interception failure may use guarded DOM dispatch internally only when the executor proves no click was dispatched. Optional capture:{store,source:{role,name?,container?}|{selector,container?}} vaults exactly one revealed source and returns metadata only; the source is resolved against the document AFTER the action's mutation settles, and a stored result names the resolved element in resolved_source. Use a value-free CSS selector for a plain-text copy field without a textbox/code role. Resolution pierces open shadow roots: a bare selector, a role, or a cross-shadow [c…

NameTypeReqDescription
captureobject
formatstring
refstring
screenshotobject
session_idstringyes
NameTypeReqDescription
action_resultobject
candidate_countinteger
cleanup
closedboolean
execution
foundarray
mutation
operation_idstring
resolved_sourceobjectNames the element the vaulted value was resolved from (role/name or selector).
retry
screenshot_clickobject
session_idstring
storage
storedboolean
stored_credentialobject
write_idstring

No examples provided.

operate_extract ~426

Reveal masked keys and extract credentials from the current page: returns {credentials, candidate_count}. credentials may include `api_key` (or `api_key_truncated` if only a masked display was reachable) plus named fields for multi-credential services. Pass `store` to immediately save the extracted credential into the Trusty Squire vault with the session's observed hosts as allowed_hosts seed; when `store` is used, the response omits credential values and returns only vault metadata. Call when you have navigated to the keys page. With `into_slot`, a value that still looks masked is ranked behind a fully revealed sibling but never refused; pass `secret_label` (e.g. "client secret") to pick the right one when the page shows several credentials. Optional capture:{store,source:{role,name?,container?}|{selector,container?}} vaults exactly one revealed source and returns metadata only; the source is resolved against the document AFTER the action's mutation settles, and a stored result names the resolved element in resolved_source. Use a value-free CSS selector for a plain-text copy field without a textbox/code role. Resolution pierces open shadow roots: a bare selector, a role, or a cross-shadow [container] descendant selector all reach shadow-hosted fields (e.g. Groq's id-less created-key <input> inside an open shadow root); when the role is textbox, an id-less text input whose value looks secret-shaped also matches if it is the only textbox in the container/document. A source matching nothing returns error capture_unresolved with candidate_count 0 and a found list of the roles/names that DID render (never values) — use it to pick the next source; capture_ambiguous is reserved for more than one match. If storage is unresolved, retry operate_extract with capture.write_id. An unresolved capture does not block unrelated actions.

NameTypeReqDescription
captureobject
into_slotstring
secret_labelstring
session_idstringyes
storeobject
NameTypeReqDescription
action_resultobject
candidate_countinteger
cleanup
closedboolean
execution
foundarray
mutation
operation_idstring
resolved_sourceobjectNames the element the vaulted value was resolved from (role/name or selector).
retry
session_idstring
storage
storedboolean
stored_credentialobject
write_idstring

No examples provided.

operate_fill_credential ~150

For a sign-in page, retrieve a username/password credential only if the current browser host is allowed for login, then seal requested fields into session slots. Raw values are never returned; use operate_type with slot with the returned slot names to fill the page.

NameTypeReqDescription
fieldsarrayExact field_names from list_credentials for the selected reference. Defaults to ["login","password"] for logins saved by operate_login; use ["username","password"] when those are the stored names. Us…
referencestring
servicestring
session_idstringyes
slot_prefixstring

No output schema declared.

No examples provided.

operate_finish ~100

Finish the task and close its session. outcome='none' closes without a reported outcome; 'credentials' extracts and vault-stores using store; 'result' reports summary or data — the reported outcome is recorded as-is. Successful completion saves eligible login state through the existing teardown.

NameTypeReqDescription
dataobject
outcomestring
session_idstringyes
storeobject
summarystring
NameTypeReqDescription
cleanupstringyes
closedbooleanyes
dataobject
executionstringyes
mutationstringyes
operation_idstringyes
session_idstringyes

No examples provided.

operate_login ~134

Log in with provider + ref using the atomic OAuth flow; awaiting-human state is returned in this call. After a dispatched timeout or error, completion may be unknown: retain session_id and call operate_observe before another action; do not repeat OAuth blindly. Drive the sealed username/password login lifecycle without exposing raw values. action='prepare_signup' seals the user's captured email and a generated password; 'store_signup' vaults those prepared slots with the same login-host safeguards; 'load_saved' fetches an allowed saved login through encrypted browser-fill and seals its fields into session slots. Use operate_type with slot to fill returned slots.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

operate_navigate ~41

Navigate to a URL without session host restrictions. Squire control-plane destinations remain refused.

NameTypeReqDescription
session_idstringyes
urlstringyes

No output schema declared.

No examples provided.

operate_network ~116

Read raw browser evidence collected since session start: requests, responses, pending/completed/failed state, HTTP status, loading failures, CORS/blocked reasons, console messages, exceptions, and screenshot events. Pass the returned cursor as since for an incremental read, or request_id for one request. This surface does not diagnose payment stages. Released card PAN/CVV copies are masked; status bodies and all unrelated values remain visible.

NameTypeReqDescription
request_idstring
session_idstringyes
sinceinteger

No output schema declared.

No examples provided.

operate_observe ~920

Re-read the current page of an operate session. The default `format:"compact"` response is `browser-use-control-query`. It contains every actionable control (button, link, textbox, select, checkbox, radio, tab, menuitem, and file), including off-viewport controls; non-control markup and arbitrary page text are absent by construction, not redacted. Query or role filters this same map. Its `safe_table` is a paged control map: each row is `[ref,role,facts?]`; role is b=button, l=link, t=textbox, s=select, c=checkbox, r=radio, tb=tab, m=menuitem, or f=file; other roles are literal (e.g. slider or generic for a listener container). facts is a `|`-joined `@label` alias followed by present s=state (c=checked, u=unchecked, d=disabled, r=required), v=offscreen when outside the viewport, a=action, f=field, q=choice-position/total, and x=s same-origin or x=x cross-origin frame; absent x means main frame. nf=1 marks a listener container that carries a field name but is not itself fillable — its fillable field is emitted separately; fill that one. Query matches include m=n (exact name), m=r (exact role), m=t (local text), or m=c (explicit form/fieldset/dialog context), ranked in that order. semantic.blocked=true and semantic.blockers report what blocks the task independently of stage; stage=browse does not mean unblocked. Blocker kind is challenge (verification instructions), validation (a structurally identified field error), dialog (an open modal), or error_page (a CDN/gateway block wall named from the title/headings, so a blocked body is not read as a normal page). A dialog blocker also carries options — a bounded list of its rendered controls in DOM order, including the close path that keeps what was entered whenever the dialog renders one; when more controls exist than fit, that dismiss path and the controls that resolve the dialog are kept ahead of anchors, so query the control map for the rest. ref names the dialog's exit, matched on a control's whole label, or is absent…

NameTypeReqDescription
cursorstring
formatstring
querystring
raw_attributesboolean
rolestring
session_idstringyes
subtree_refstring

No output schema declared.

No examples provided.

operate_press ~417

The action response is the compact `browser-use-control-query` control map by default: after a compact map on the same document, `delta:true` carries changed/new controls in `safe_table` and departed refs in `removed`, never the verbatim DOM. The acted control's own current row is always included, marked `w=acted`, so a write is confirmable from its own result. Pass `format:"full"` to receive the `browser-use-dom` tree instead. After inject_card releases a card, its PAN (complete ordinary spellings and prefixes of at least eight digits) and security code are replaced in every normal observation; all other emitted content stays verbatim. Press a keyboard key in the current session, such as Enter, Tab, or Escape. Optional capture:{store,source:{role,name?,container?}|{selector,container?}} vaults exactly one revealed source and returns metadata only; the source is resolved against the document AFTER the action's mutation settles, and a stored result names the resolved element in resolved_source. Use a value-free CSS selector for a plain-text copy field without a textbox/code role. Resolution pierces open shadow roots: a bare selector, a role, or a cross-shadow [container] descendant selector all reach shadow-hosted fields (e.g. Groq's id-less created-key <input> inside an open shadow root); when the role is textbox, an id-less text input whose value looks secret-shaped also matches if it is the only textbox in the container/document. A source matching nothing returns error capture_unresolved with candidate_count 0 and a found list of the roles/names that DID render (never values) — use it to pick the next source; capture_ambiguous is reserved for more than one match. If storage is unresolved, retry operate_extract with capture.write_id. An unresolved capture does not block unrelated actions.

NameTypeReqDescription
captureobject
formatstring
keystringyes
session_idstringyes
NameTypeReqDescription
action_resultobject
candidate_countinteger
cleanup
closedboolean
execution
foundarray
mutation
operation_idstring
resolved_sourceobjectNames the element the vaulted value was resolved from (role/name or selector).
retry
session_idstring
storage
storedboolean
stored_credentialobject
write_idstring

No examples provided.

operate_read_inbox ~280

Read the session's signed-in Gmail inbox for a verification email and return {code, link, source_from} WITHOUT touching the live page: the read runs in a dedicated tab that is closed when done, so a signup form or dialog waiting for the code stays exactly as it is. NEVER navigate the session to the mailbox for a code or link — navigating away and back resets the form and closes the waiting dialog. `sender` narrows the search — matched against the From address, its display name, AND the subject (e.g. "proton.me"); the newest matching mail is the one read, cross-checked across the search listing AND the real-time All Mail listing (Gmail's search index can lag fresh mail by minutes — found:false means the mail is not in the mailbox, not that the search was stale). `into_slot` seals a found OTP into a session slot so it is typed with operate_type slot and never crosses the MCP boundary; `grant_inbox_consent` overrides the session's inbox-read consent for this call. Returns needs_user when nothing is found yet — retry after a few seconds or ask the user (the session stays live).

NameTypeReqDescription
grant_inbox_consentboolean
into_slotstring
senderstring
session_idstringyes

No output schema declared.

No examples provided.

operate_screenshot ~399

WARNING: EXPENSIVE — a screenshot is a full image and costs far more context than any observation. Reach for it ONLY when the DOM tree or control search (operate_observe with query/cursor) is NOT sufficient to determine the page state; if the observation already tells you what the page is doing, do not take one. Debugging tool: capture a screenshot of what the operate session's browser actually RENDERS — the whole page (default: viewport; full_page:true for the whole scrollable page) or ONE specific frame in isolation via frame_index or frame_url_contains, so a cross-origin challenge iframe (a 3-D Secure ACS frame, a captcha) can be captured on its own even when it won't show clearly inside a full-page shot. Use this when the DOM tree from an explicitly selected full observation isn't enough to tell what state a stuck page is actually in — a challenge that never advances, an unexpected layout, a captcha you need to SEE. Read-only: never navigates, clicks, types, submits, or steals focus; it only reads pixels. After inject_card releases a card, pixels containing that card's PAN (complete ordinary spellings or prefixes of at least eight digits) or security code in injected controls and identified ordinary displayed copies are covered in the returned image; surrounding borders, labels, and errors remain visible. An active mask is never bypassed: if the mask cannot scan or composite the capture, the screenshot call fails rather than returning the unmasked image. When click_binding is present, its screenshot_id and original image width/height authorize one operate_click screenshot point for 60 seconds. Navigation, viewport/scroll or frame geometry changes invalidate it. An absent binding means this image is read-only; capture again for a coordinate click.

NameTypeReqDescription
frame_indexnumber
frame_url_containsstring
full_pageboolean
session_idstringyes
NameTypeReqDescription
click_bindingobject

No examples provided.

operate_scroll ~192

The action response is the compact `browser-use-control-query` control map by default: after a compact map on the same document, `delta:true` carries changed/new controls in `safe_table` and departed refs in `removed`, never the verbatim DOM. The acted control's own current row is always included, marked `w=acted`, so a write is confirmable from its own result. Pass `format:"full"` to receive the `browser-use-dom` tree instead. After inject_card releases a card, its PAN (complete ordinary spellings and prefixes of at least eight digits) and security code are replaced in every normal observation; all other emitted content stays verbatim. Scroll the page viewport down, up, to the bottom, or to the top. Observe again to discover newly visible controls.

NameTypeReqDescription
directionstring
formatstring
session_idstringyes

No output schema declared.

No examples provided.

operate_select ~465

The action response is the compact `browser-use-control-query` control map by default: after a compact map on the same document, `delta:true` carries changed/new controls in `safe_table` and departed refs in `removed`, never the verbatim DOM. The acted control's own current row is always included, marked `w=acted`, so a write is confirmable from its own result. Pass `format:"full"` to receive the `browser-use-dom` tree instead. After inject_card releases a card, its PAN (complete ordinary spellings and prefixes of at least eight digits) and security code are replaced in every normal observation; all other emitted content stays verbatim. Choose an option by visible text with ref + values (one value per control). For several controls, supply an ordered selections map of ref to option; partial results are retained. country selects the phone field's native country dropdown. Optional capture:{store,source:{role,name?,container?}|{selector,container?}} vaults exactly one revealed source and returns metadata only; the source is resolved against the document AFTER the action's mutation settles, and a stored result names the resolved element in resolved_source. Use a value-free CSS selector for a plain-text copy field without a textbox/code role. Resolution pierces open shadow roots: a bare selector, a role, or a cross-shadow [container] descendant selector all reach shadow-hosted fields (e.g. Groq's id-less created-key <input> inside an open shadow root); when the role is textbox, an id-less text input whose value looks secret-shaped also matches if it is the only textbox in the container/document. A source matching nothing returns error capture_unresolved with candidate_count 0 and a found list of the roles/names that DID render (never values) — use it to pick the next source; capture_ambiguous is reserved for more than one match. If storage is unresolved, retry operate_extract with capture.write_id. An unresolved capture does not block unrelated actions.

NameTypeReqDescription
captureobject
countrystring
formatstring
refstring
selectionsobject
session_idstringyes
valuesarray
NameTypeReqDescription
action_resultobject
candidate_countinteger
cleanup
closedboolean
execution
foundarray
mutation
operation_idstring
resolved_sourceobjectNames the element the vaulted value was resolved from (role/name or selector).
retry
session_idstring
storage
storedboolean
stored_credentialobject
write_idstring

No examples provided.

operate_start ~1,032

Begin an interactive website task: opens a browser on the user's machine at service_url and returns the initial page observation. The default `format:"compact"` response is `browser-use-control-query`. It contains every actionable control (button, link, textbox, select, checkbox, radio, tab, menuitem, and file), including off-viewport controls; non-control markup and arbitrary page text are absent by construction, not redacted. Query or role filters this same map. Its `safe_table` is a paged control map: each row is `[ref,role,facts?]`; role is b=button, l=link, t=textbox, s=select, c=checkbox, r=radio, tb=tab, m=menuitem, or f=file; other roles are literal (e.g. slider or generic for a listener container). facts is a `|`-joined `@label` alias followed by present s=state (c=checked, u=unchecked, d=disabled, r=required), v=offscreen when outside the viewport, a=action, f=field, q=choice-position/total, and x=s same-origin or x=x cross-origin frame; absent x means main frame. nf=1 marks a listener container that carries a field name but is not itself fillable — its fillable field is emitted separately; fill that one. Query matches include m=n (exact name), m=r (exact role), m=t (local text), or m=c (explicit form/fieldset/dialog context), ranked in that order. semantic.blocked=true and semantic.blockers report what blocks the task independently of stage; stage=browse does not mean unblocked. Blocker kind is challenge (verification instructions), validation (a structurally identified field error), dialog (an open modal), or error_page (a CDN/gateway block wall named from the title/headings, so a blocked body is not read as a normal page). A dialog blocker also carries options — a bounded list of its rendered controls in DOM order, including the close path that keeps what was entered whenever the dialog renders one; when more controls exist than fit, that dismiss path and the controls that resolve the dialog are kept ahead of anchors, so query the control map for the r…

NameTypeReqDescription
formatstring
proxystringOptional per-session HTTP/HTTPS proxy URL with or without credentials, or unauthenticated SOCKS5 URL. HTTP/HTTPS passwords require a non-empty username; authenticated SOCKS5 is unsupported by the bro…
service_urlstringyes

No output schema declared.

No examples provided.

operate_type ~460

The action response is the compact `browser-use-control-query` control map by default: after a compact map on the same document, `delta:true` carries changed/new controls in `safe_table` and departed refs in `removed`, never the verbatim DOM. The acted control's own current row is always included, marked `w=acted`, so a write is confirmable from its own result. Pass `format:"full"` to receive the `browser-use-dom` tree instead. After inject_card releases a card, its PAN (complete ordinary spellings and prefixes of at least eight digits) and security code are replaced in every normal observation; all other emitted content stays verbatim. Fill a control with text, or a session slot returned by operate_login, operate_fill_credential, or operate_extract. Provide exactly one of text or slot. submit presses Enter after a successful fill. Optional capture:{store,source:{role,name?,container?}|{selector,container?}} vaults exactly one revealed source and returns metadata only; the source is resolved against the document AFTER the action's mutation settles, and a stored result names the resolved element in resolved_source. Use a value-free CSS selector for a plain-text copy field without a textbox/code role. Resolution pierces open shadow roots: a bare selector, a role, or a cross-shadow [container] descendant selector all reach shadow-hosted fields (e.g. Groq's id-less created-key <input> inside an open shadow root); when the role is textbox, an id-less text input whose value looks secret-shaped also matches if it is the only textbox in the container/document. A source matching nothing returns error capture_unresolved with candidate_count 0 and a found list of the roles/names that DID render (never values) — use it to pick the next source; capture_ambiguous is reserved for more than one match. If storage is unresolved, retry operate_extract with capture.write_id. An unresolved capture does not block unrelated actions.

NameTypeReqDescription
captureobject
formatstring
refstringyes
session_idstringyes
slotstring
submitboolean
textstring
NameTypeReqDescription
action_resultobject
candidate_countinteger
cleanup
closedboolean
execution
foundarray
mutation
operation_idstring
resolved_sourceobjectNames the element the vaulted value was resolved from (role/name or selector).
retry
session_idstring
storage
storedboolean
stored_credentialobject
write_idstring

No examples provided.

operate_wait ~202

The action response is the compact `browser-use-control-query` control map by default: after a compact map on the same document, `delta:true` carries changed/new controls in `safe_table` and departed refs in `removed`, never the verbatim DOM. The acted control's own current row is always included, marked `w=acted`, so a write is confirmable from its own result. Pass `format:"full"` to receive the `browser-use-dom` tree instead. After inject_card releases a card, its PAN (complete ordinary spellings and prefixes of at least eight digits) and security code are replaced in every normal observation; all other emitted content stays verbatim. Wait briefly for the live page to change, then return a fresh observation. Use this for spinners, late-mounted fields, and pending requests without assigning them a payment stage.

NameTypeReqDescription
formatstring
millisecondsinteger
session_idstringyes

No output schema declared.

No examples provided.

revoke_app_access ~111

Revoke an egress grant on the spot — "something leaked, kill that token now." Pass the `grant_id` returned by grant_app_access (or list_app_access). Revocation is INSTANT and global: the next request through that grant's proxy is rejected (403), no key rotation required. The vaulted credential itself is untouched and any other grants on it keep working. Use this the moment a backend egress token is suspected leaked.

NameTypeReqDescription
grant_idstringyes

No output schema declared.

No examples provided.

store_credential ~418

Save a secret the user just shared into the encrypted vault. CALL THIS AUTOMATICALLY whenever the user pastes a secret-shaped value (sk-, ghp_, AKIA, eyJ; password/token/connection-string patterns) — don't ask first. One entry per (service, label) — re-storing the same service rotates only its secret fields and preserves existing metadata. Use edit_credential for metadata changes. For multi-part credentials (AWS access key + secret, DB user+password) pass `fields` (e.g. {access_key_id, secret_access_key}); for a lone key pass `value`. Optional `label` (default "default") keeps prod/dev keys for the same service apart. Optional `auth_shape` records how the provider expects the key so an EGRESS GRANT (grant_app_access) auto-injects it correctly: "bearer" (default) | "header:<name>" (e.g. "header:x-api-key") | "query:<param>". Set it for non-bearer providers; bearer needs nothing. Optional `observed_hosts` carries hosts seen during signup/extraction and is unioned into the credential's allowed_hosts with the service defaults. For username/password credentials, pass `auth_strategy: "username_password"` and explicit `login_hosts`; those credentials cannot be spent through `use_credential` and can only be sealed into browser-fill slots on allowed signin hosts. Returns the reference, field names, and allowed_hosts. The value is never readable back to you afterwards.

NameTypeReqDescription
auth_shapestring
auth_strategystring
env_var_suggestionstring
fieldsobject
labelstring
login_hostsarray
observed_hostsarray
servicestringyes
signin_urlstring
typestring
valuestring

No output schema declared.

No examples provided.

use_credential ~312

Execute an authenticated HTTP request against an external API using a vaulted credential. The secret value NEVER crosses to this agent — the server injects it and returns only the upstream response. In your headers/body use ${SECRET} for a single-field credential, or ${SECRET.<field>} for a multi-field one (e.g. ${SECRET.access_key_id}, ${SECRET.secret_access_key}); ${SECRET_JSON[.field]} JSON-escapes. Call list_credentials to see a credential's field names. Pass `service` or `reference` plus the HTTP fields (method, url, headers, body). Prefer this over fetch_credential for every "call an API with the key" task: the value never enters your context, and no human approval is needed. For APIs that authenticate via a query-string key (e.g. FRED's `api_key`), put the secret in `query` — `query: { api_key: "${SECRET}" }` — NOT in the url (a ${SECRET} in the url is rejected; the server injects query params after the host check so the key never lands in a log). The target host must be on the credential's allowed_hosts (editable with edit_credential after a signed vouch, or in the web vault) or the call is rejected.

NameTypeReqDescription
httpobjectyes
namestring
referencestring
servicestring

No output schema declared.

No examples provided.

Common questions

What is the Trusty Squire MCP server?

Trusty Squire is an MCP server listed in the public MCP registry as ai.trustysquire/trusty-squire. Provision, ship, and pay from your coding agent, keys and cards never leave the vault. This page covers its npm package (@trusty-squire/mcp).

Is the Trusty Squire MCP server safe to use?

Trusty Squire scores 78 out of 100 on VerifyMCP. We recorded 2 known advisories against it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Trusty Squire MCP server expose?

Trusty Squire exposes 29 tools: list_credentials, store_credential, edit_credential, delete_credential, use_credential, and 24 more. Their descriptions and schemas cost roughly 9,184 tokens of context every time the server is loaded.

Is the Trusty Squire MCP server still maintained?

Trusty Squire is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Trusty Squire MCP server under?

Trusty Squire declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.