# FortFi Treasury MCP (remote · fortfiapp.com)

Policy-gated MCP treasury for AI agents — x402 subscribe, 50+ tools, multi-chain.

- Trust score: 63/100 (medium)
- Change this week: +47
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `fortfiapp.com`: 63/100 (this document), [markdown](https://verifymcp.io/servers/rebelartists-fortfi-treasury-mcp/api-mcp.md), [page](https://verifymcp.io/servers/rebelartists-fortfi-treasury-mcp/api-mcp)

## Channel facts

- Endpoint: `https://fortfiapp.com/api/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 59 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 5132 tokens (~86/item across 59 items; 59 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 20/100
  - Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 81% of tool parameters carry a description.
- **Capabilities**: 20/100
  - Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http rebelartists-fortfi-treasury-mcp https://fortfiapp.com/api/mcp
```

### Codex

```toml
[mcp_servers.rebelartists-fortfi-treasury-mcp]
url = "https://fortfiapp.com/api/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "rebelartists-fortfi-treasury-mcp": {
      "type": "remote",
      "url": "https://fortfiapp.com/api/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add rebelartists-fortfi-treasury-mcp --url https://fortfiapp.com/api/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  rebelartists-fortfi-treasury-mcp:
    url: "https://fortfiapp.com/api/mcp"
```

### Other

```json
{
  "mcpServers": {
    "rebelartists-fortfi-treasury-mcp": {
      "type": "http",
      "url": "https://fortfiapp.com/api/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 62, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 61, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 60, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 59, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-07-28 (score 59, +43)

- [security improvement] Transport: fail → pass
- [security] Authorization: Authorisation not fully verified: no authorisation is required to call this server, and 59 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
- [functional regression] MCP protocol: unverified → fail
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: pass
- [functional] First check of Tool coverage: 81
- [functional] First check of Schema quality: good

### 2026-07-27 (score 16, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 16)

First indexed and scored.

## MCP tools (59)

### `get_mcp_guide` (~65 tokens)

FortFi MCP capability guide: onboarding paths, pricing, limits, workflows, and full tool catalog. Call first when unsure which tool to use (e.g. market research → discover_tokens, not the Explore UI REST route).

Input parameters:

- `topic` (string): Default overview

### `list_wallets` (~77 tokens)

List FortFi wallets for this account: chain, address, nickname, metadata tags, and default flag. Optional metadataKey/metadataValue filter (exact match).

Input parameters:

- `metadataKey` (string): Filter wallets that include this metadata key (optional)
- `metadataValue` (string): When set with metadataKey, require an exact value match

### `list_recipients` (~39 tokens)

List all allowlisted recipients. Includes cooldown status: `cooldownActive: true` means the recipient cannot yet receive funds (24-hour gate).

### `list_audit_log` (~40 tokens)

Recent account activity: transfers, swaps, security events.

Input parameters:

- `limit` (number): Max entries to return (default 20, max 100)

### `get_policy_limits` (~51 tokens)

Current policy limits: per-tx/daily/monthly caps (USDC smallest units). Agent accounts include billingPlan (personal|startup), billingPlanName, maxWallets, tier, and subscription expiry.

### `resend_claim_link` (~52 tokens)

Resend the dashboard claim email to contactEmail (MCP agent API key only; keys:manage scope). Use when the original link expired (72h) or was lost. Rate limit: 3/hour.

### `list_funding_wallet_agents` (~47 tokens)

List all FortFi agent accounts funded by the same payment wallet as this agent. Use to discover agentLabel / userId when renewing or spawning siblings (treasury multi-agent setups).

### `list_cosigner_memberships` (~19 tokens)

Active co-signers on this account.

### `get_cosigner_rules` (~37 tokens)

Amount-banded cosigner quorum rules for sends and swaps. Below-band amounts auto-execute; matching bands require N cosigner votes.

### `update_cosigner_rules` (~138 tokens)

Set cosigner quorum rules (send + swap USD bands). Tightening rules works with the agent key alone. WEAKENING them (lower required cosigners / raise the amount floor) is a GOVERN action: sign a challenge with your funding wallet (challengeId + walletSignature); applies immediately once signed (same as passkey in the UI). Amounts use USDC micro-units (1 USDC = 1000000).

Input parameters:

- `challengeId` (string): Governance challengeId (only needed when weakening rules)
- `rules` (array, required)
- `walletSignature` (string): Funding-wallet signature over the challenge message

### `list_pending_cosigner_approvals` (~51 tokens)

Pending actions that require this account's co-signer approval. Use when this agent is a co-signer on another account.

Input parameters:

- `limit` (number): Max entries (default 10)

### `add_recipient` (~150 tokens)

Add a payout address to the allowlist. Human developer key (frtfi_hu_* + DA): added with 24h cooldown (no Assist passkey). Agent key (frtfi_ag_*): GOVERN — funding-wallet signature required; then approved immediately.

Input parameters:

- `address` (string, required): Wallet address (0x… or Solana base58)
- `chainId` (string, required): FortFi chain id, e.g. base-mainnet, ethereum-mainnet, solana-mainnet
- `challengeId` (string): Agent GOVERN: challengeId from the first call
- `nickname` (string): Optional display name
- `walletSignature` (string): Agent GOVERN: funding-wallet signature

### `remove_recipient` (~67 tokens)

Remove a recipient from the FortFi allowlist (tightening policy — no funding-wallet GOVERN). Human developer key, session, or agent treasury key. Re-sync Turnkey policies in the app so the enclave matches.

Input parameters:

- `recipientId` (string, required): Recipient id from list_recipients

### `approve_recipient` (~102 tokens)

Approve a recipient still in cooldown (early release). A distinct active cosigner may approve directly; owner self-approval via an agent key is a GOVERN action requiring a funding-wallet signature (challengeId + walletSignature).

Input parameters:

- `challengeId` (string): Governance challengeId from the first call
- `recipientId` (string, required): Recipient id from list_recipients or add_recipient
- `walletSignature` (string): Funding-wallet signature over the challenge message

### `propose_transfer` (~130 tokens)

Transfer USDC to an allowlisted recipient. The recipient must be approved (no active cooldown). Rejected with POLICY_LIMIT_EXCEEDED if above tier limits. Rejected with RECIPIENT_NOT_APPROVED if in cooldown.

Input parameters:

- `amountUsdc` (string, required): Amount in USDC as a decimal string, e.g. '5.00' for $5 USDC
- `fromWalletId` (string, required): Source wallet id from list_wallets
- `memo` (string): Optional transfer note (max 256 chars)
- `recipientId` (string, required): Recipient id from list_recipients

### `invite_agent_cosigner` (~150 tokens)

Invite a co-signer. Agents: pass cosignerUserId (GOVERN / funding-wallet sign when using an agent API key). Humans: pass email — opens instructions for Security UI passkey provision (Turnkey dual-control with MCP DA).

Input parameters:

- `challengeId` (string): Governance challengeId from the first call
- `cosignerUserId` (string): Agent path: FortFi userId of the agent to invite as co-signer
- `email` (string): Human path: invitee email for Security UI co-signer provision
- `nickname` (string): Optional nickname for this co-signer
- `walletSignature` (string): Funding-wallet signature over the challenge message

### `invite_cosigner` (~70 tokens)

Alias of invite_agent_cosigner. Humans: email → Security UI. Agents: cosignerUserId.

Input parameters:

- `challengeId` (string)
- `cosignerUserId` (string)
- `email` (string)
- `nickname` (string)
- `walletSignature` (string)

### `approve_cosigner_action` (~39 tokens)

Approve a pending action as co-signer. Use with list_pending_cosigner_approvals.

Input parameters:

- `pendingApprovalId` (string, required)

### `reject_cosigner_action` (~38 tokens)

Reject a pending action as co-signer.

Input parameters:

- `pendingApprovalId` (string, required)
- `reason` (string): Optional rejection reason

### `get_portfolio` (~32 tokens)

Full portfolio summary across all wallets: token balances with USD values, 24h change, and total net worth.

### `get_account_holdings` (~40 tokens)

Token holdings for a specific wallet, with USD values and 24h change.

Input parameters:

- `walletId` (string, required): Wallet id from list_wallets

### `discover_tokens` (~189 tokens)

Market-wide token discovery on a FortFi chain (USD). Use for trending/gainers/volume/mcap — NOT the browser Explore REST route. Sorts: gainers_1d, gainers_30d, gainers_90d, market_cap, volume_1d. Returns contract addresses for propose_swap / propose_bridge.

Input parameters:

- `chainId` (string, required): FortFi chain id, e.g. base-mainnet, ethereum-mainnet
- `limit` (number): Max results (default 10, max 25)
- `query` (string): Optional name/symbol filter, e.g. 'USDC' or 'wrapped'
- `sort` (string): Explore sort: gainers_1d, gainers_30d, gainers_90d, market_cap, volume_1d (default market_cap)
- `verifiedOnly` (boolean): Only verified tokens

### `get_swap_routing_guide` (~59 tokens)

Returns which swap/bridge tool to use for a given from→to chain pair, with notes on protocols supported.

Input parameters:

- `fromChainId` (string, required): Source chain id
- `toChainId` (string, required): Destination chain id

### `list_token_spender_grants` (~41 tokens)

List active ERC-20 token approvals (spender grants) on this account. Useful before proposing a swap to confirm the CoW vault is approved.

### `list_incoming_cosigner_invites` (~45 tokens)

List pending co-signer invites sent TO this account (where this account is the invitee). Use to discover accounts you can become a co-signer for.

### `accept_cosigner_invite` (~54 tokens)

Accept a pending co-signer invite. After accepting, you will be able to approve/reject pending actions for that account.

Input parameters:

- `inviteId` (string, required): Invite id from list_incoming_cosigner_invites

### `remove_cosigner` (~100 tokens)

Remove an active co-signer from this account. GOVERN action (it shrinks the approver set): via an agent key, sign a challenge with your funding wallet (challengeId + walletSignature); applies immediately once signed.

Input parameters:

- `challengeId` (string): Governance challengeId from the first call
- `membershipId` (string, required): Membership id from list_cosigner_memberships
- `walletSignature` (string): Funding-wallet signature over the challenge message

### `register_backup_governance_wallet` (~121 tokens)

Register (or replace) a single backup governance wallet — the agentic equivalent of a backup passkey. Either the funding wallet or this backup can authorize future governance. GOVERN action: sign the challenge with your CURRENT funding wallet (challengeId + walletSignature); applies immediately once signed. Max one backup.

Input parameters:

- `challengeId` (string): Governance challengeId from the first call
- `walletAddress` (string, required): The backup wallet address (0x…) to register
- `walletSignature` (string): CURRENT funding-wallet signature over the challenge message

### `remove_backup_governance_wallet` (~80 tokens)

Remove the registered backup governance wallet. GOVERN action: sign with your funding wallet (challengeId + walletSignature); applies immediately once signed. After removal, only the funding wallet may authorize governance.

Input parameters:

- `challengeId` (string): Governance challengeId from the first call
- `walletSignature` (string): Funding-wallet signature over the challenge message

### `list_governance_requests` (~39 tokens)

List open governance requests on this account: pending (awaiting signature) and legacy scheduled rows. Use to monitor for unexpected loosening attempts.

### `cancel_governance_change` (~75 tokens)

Veto/cancel a pending governance challenge before it is signed and applied. Cancelling TIGHTENS security, so it needs only the agent key (no signature). Also cancels legacy scheduled rows from before immediate-apply parity.

Input parameters:

- `challengeId` (string, required): The governance request id from list_governance_requests

### `revoke_cosigner_invite` (~40 tokens)

Revoke a pending outbound co-signer invite before it is accepted.

Input parameters:

- `inviteId` (string, required): Invite id from the invite you sent

### `cancel_pending_action` (~47 tokens)

Cancel a pending approval that you (the account owner) initiated.

Input parameters:

- `pendingApprovalId` (string, required): Pending approval id from list_pending_cosigner_approvals or list_audit_log

### `propose_rename_account` (~60 tokens)

Rename a wallet (account nickname). Confirm via POST /api/mcp/confirm with the returned proposalId.

Input parameters:

- `accountId` (string, required): Wallet id from list_wallets
- `nickname` (string, required): New nickname (2–64 characters)

### `propose_create_account` (~124 tokens)

Create a new wallet on a supported chain. Optional metadata tags (e.g. customer_id). Confirm via POST /api/mcp/confirm. Agent accounts execute server-side when no cosigners are configured.

Input parameters:

- `chainId` (string, required): FortFi chain id, e.g. base-mainnet, solana-mainnet
- `metadata` (object): Optional flat string tags (max 20 keys), e.g. { "customer_id": "cust_123" }
- `walletName` (string, required): Display name for the new wallet (2–64 chars)

### `update_wallet_metadata` (~79 tokens)

Set metadata tags on a wallet (flat string key/value pairs; replaces existing tags). Not a money-moving action.

Input parameters:

- `accountId` (string, required): Wallet id from list_wallets
- `metadata` (object, required): Full metadata object, e.g. { "customer_id": "cust_123", "agent_id": "ag_1" }

### `preview_swap_quote` (~212 tokens)

Optional advanced step: fetch a same-chain swap quote (CoW on EVM, Jupiter on Solana) and return previewQuoteId. Omit previewQuoteId on propose_* to bundle quote+proposal in one call. Does not execute or move funds.

Input parameters:

- `amountUsd` (string, required): Approximate sell amount in USD
- `buyMint` (string): Solana buy mint — omit for EVM
- `buySymbol` (string, required)
- `buyTokenAddress` (string): EVM buy token (0x…) — omit for Solana
- `fromWalletId` (string, required): Source wallet id
- `sellMint` (string): Solana sell mint — omit for EVM
- `sellSymbol` (string, required)
- `sellTokenAddress` (string): EVM sell token (0x…) — omit for Solana
- `slippagePercent` (number): Optional Jupiter slippage 0–50
- `toWalletId` (string): Optional Solana receive wallet

### `preview_bridge_quote` (~91 tokens)

Optional advanced step: fetch a cross-chain bridge quote (Fusion+ or deBridge) and return previewQuoteId. Omit previewQuoteId on propose_bridge to bundle quote+proposal in one call.

Input parameters:

- `amountUsd` (string, required)
- `buySymbol` (string, required)
- `fromWalletId` (string, required)
- `sellSymbol` (string, required)
- `toWalletId` (string, required)

### `check_trade_allowance` (~129 tokens)

Check ERC-20 allowance for an upcoming CoW swap (cow_swap) or Fusion bridge (fusion_bridge). Call before propose_swap / propose_bridge; if insufficient, use propose_token_approve then confirm.

Input parameters:

- `flow` (string, required): cow_swap = CoW VaultRelayer; fusion_bridge = 1inch Limit Order
- `fromWalletId` (string, required): Source EVM wallet id
- `requiredAmountSmallest` (string, required): Required allowance in token smallest units (e.g. USDC 6 decimals)
- `tokenAddress` (string, required): Sell token contract (0x…)

### `propose_token_approve` (~78 tokens)

Propose max ERC-20 approval for CoW or Fusion spenders. Returns proposalId — confirm via POST /api/mcp/confirm before swap/bridge.

Input parameters:

- `flow` (string, required)
- `fromWalletId` (string, required): EVM wallet id
- `tokenAddress` (string, required): Token to approve (0x…)

### `propose_swap` (~224 tokens)

Propose an EVM CoW swap. Autonomous agents: fetches and binds a quote inline (default), or pass previewQuoteId from preview_swap_quote for a two-step review. confirm always signs the bound quote — same principle as FortFi Assist. Human session MCP: confirm requires passkey in the app.

Input parameters:

- `amountUsd` (string, required): Sell amount in USD
- `buySymbol` (string, required): Human-readable symbol of buy token, e.g. ETH
- `buyTokenAddress` (string, required): Token contract address to buy (0x…)
- `fromWalletId` (string, required): Source wallet id (must be EVM, CoW-supported chain)
- `previewQuoteId` (string): Optional — from preview_swap_quote for explicit quote review before propose
- `sellSymbol` (string, required): Human-readable symbol of sell token, e.g. USDC
- `sellTokenAddress` (string, required): Token contract address to sell (0x…)
- `slippagePercent` (number): Optional slippage tolerance 0–50 (default 0.5)

### `propose_solana_swap` (~188 tokens)

Propose a Solana Jupiter swap. Autonomous agents: inline quote by default, or previewQuoteId for two-step review. confirm signs the bound quote.

Input parameters:

- `amountUsd` (string, required): Sell amount in USD
- `buyMint` (string, required): Mint address of token to buy
- `buySymbol` (string, required): Human-readable buy symbol
- `fromWalletId` (string, required): Solana wallet id to sell from
- `previewQuoteId` (string): Optional — from preview_swap_quote for explicit quote review before propose
- `sellMint` (string, required): Mint address of token to sell
- `sellSymbol` (string, required): Human-readable sell symbol
- `slippagePercent` (number): Optional slippage tolerance 0–50 (default 0.5)
- `toWalletId` (string, required): Solana wallet id to receive (can be same as fromWalletId)

### `propose_bridge` (~160 tokens)

Propose a Fusion+ or deBridge transfer. Autonomous agents: inline quote by default, or previewQuoteId from preview_bridge_quote for two-step review.

Input parameters:

- `amountUsd` (string, required): Bridge amount in USD
- `buySymbol` (string, required): Buy token symbol
- `buyTokenAddress` (string, required): Token to receive (0x…, use same asset if bridging stable)
- `fromWalletId` (string, required): Source wallet id
- `previewQuoteId` (string): Optional — from preview_bridge_quote for explicit quote review before propose
- `sellSymbol` (string, required): Sell token symbol
- `sellTokenAddress` (string, required): Token to bridge out (0x…)
- `toWalletId` (string, required): Destination wallet id (different chain)

### `list_yield_markets` (~175 tokens)

Open Morpho yield discovery by chain — APY, TVL (not limited to curated allowlist). Default: sort by net APY, min TVL $1M. Pass verifiedOnly:true for curated-only. Use before propose_yield_deposit.

Input parameters:

- `asset` (string): Asset symbol filter, default USDC
- `chainId` (string): FortFi chain id or omit for all yield chains
- `limit` (number): Max vaults (default 15, max 25)
- `minTvlUsd` (number): Minimum vault TVL in USD (default 1000000)
- `sortBy` (string): net_apy (default) or tvl
- `verifiedOnly` (boolean): If true, only FortFi curated vaults; default false = open discovery

### `list_yield_positions` (~21 tokens)

User's Morpho yield positions from FortFi history.

### `propose_yield_deposit` (~127 tokens)

Propose Morpho vault deposit. Confirm via POST /api/mcp/confirm — with Delegated Access / agent key this executes server-side (no Assist passkey). Use list_yield_markets for vaultAddress.

Input parameters:

- `amountUsd` (string, required): USDC amount e.g. 100.00
- `assetSymbol` (string)
- `fromAccountQuery` (string): Wallet nickname (alternative to fromWalletId)
- `fromWalletId` (string): FortFi wallet id
- `vaultAddress` (string, required): Morpho vault contract (0x…)

### `propose_yield_withdraw` (~100 tokens)

Propose Morpho vault withdraw. Confirm via POST /api/mcp/confirm — with Delegated Access executes server-side (no Assist passkey). Use list_yield_positions for vaultAddress.

Input parameters:

- `amountDisplay` (string, required)
- `assetSymbol` (string)
- `fromAccountQuery` (string)
- `fromWalletId` (string)
- `vaultAddress` (string, required)
- `vaultName` (string)

### `create_payment_request` (~134 tokens)

Create a shareable payment request for a vault. Returns pid, paymentUrl, and qrPayload for humans or agents.

Input parameters:

- `amountSmallestUnit` (string): USDC amount in smallest units (alternative to amountUsd)
- `amountUsd` (number): Invoice amount in USD (1 USD = 1 USDC)
- `description` (string): Optional invoice note
- `expiryDays` (number): Days until expiry (default 30)
- `externalReference` (string): Optional external invoice id
- `metadata` (object): Optional metadata object
- `walletMappingId` (string, required): Target collection vault id

### `get_payment_request` (~38 tokens)

Get a payment request by internal id or public pid, including settlement attempts.

Input parameters:

- `idOrPid` (string, required): Internal id or public pid

### `list_payment_requests` (~36 tokens)

List payment requests for the authenticated account.

Input parameters:

- `status` (string)
- `walletMappingId` (string): Optional vault filter

### `cancel_payment_request` (~28 tokens)

Cancel an open payment request with no verified settlement.

Input parameters:

- `idOrPid` (string, required)

### `extend_payment_request` (~48 tokens)

Extend an open payment request expiry (default extension window in days).

Input parameters:

- `expiryDays` (number, required): New expiry horizon from now (1-365)
- `idOrPid` (string, required)

### `search_vaults` (~175 tokens)

Parent-treasury vault inventory search (treasury credential + keys:manage + wallets:read). Matches nicknames, wallet IDs, addresses, external customer IDs, credential names, and prefixes. Never returns raw bearer keys.

Input parameters:

- `chainId` (string): Exact chain filter
- `credentialAccess` (string): Filter by linked credential access mode
- `credentialStatus` (string): Filter by linked credential status
- `cursor` (string): Pagination cursor from prior response
- `externalCustomerId` (string): Exact external customer id
- `limit` (number): Page size (default 50, max 100)
- `metadataKey` (string): Exact metadata key (requires metadataValue)
- `metadataValue` (string): Exact metadata value (requires metadataKey)
- `query` (string): Free-text search

### `search_credentials` (~156 tokens)

Parent-treasury key-centric credential search (treasury credential + keys:manage + wallets:read). Complements search_vaults. Never returns raw bearer keys.

Input parameters:

- `access` (string)
- `credentialKind` (string)
- `cursor` (string): Pagination cursor
- `externalCustomerId` (string): Exact external customer id
- `limit` (number): Page size (default 50, max 100)
- `metadataKey` (string): Exact metadata key (requires metadataValue)
- `metadataValue` (string): Exact metadata value (requires metadataKey)
- `query` (string): Free-text search
- `status` (string)
- `walletId` (string): Filter by vault wallet id

### `create_vault_credential` (~132 tokens)

Mint a vault-scoped credential for an existing wallet (treasury + keys:manage). Returns bearerKey once when agentPublicKey is omitted. Requires FORTFI_VAULT_CREDENTIALS_ENABLED.

Input parameters:

- `access` (string, required)
- `agentPublicKey` (string): Optional uncompressed P-256 public key (04… hex) for ECDSA auth
- `expiresAt` (string): ISO-8601 expiry (optional)
- `name` (string, required): Credential label (2–100 chars)
- `vaultGrants` (array, required): Explicit wallet grants with optional USD micro caps

### `update_vault_credential` (~94 tokens)

Atomically replace a vault credential's name, access mode, grants, and expiry (treasury + keys:manage). Revoked credentials cannot be updated.

Input parameters:

- `access` (string, required)
- `credentialId` (string, required): Vault credential id
- `expiresAt` (string): ISO-8601 expiry, or null to clear
- `name` (string, required)
- `vaultGrants` (array, required)

### `revoke_vault_credential` (~44 tokens)

Revoke a vault-scoped credential (treasury + keys:manage). Idempotent if already revoked.

Input parameters:

- `credentialId` (string, required): Vault credential id

### `create_provisioning_job` (~101 tokens)

Bulk-provision up to 20 customer vaults per job (treasury + keys:manage + wallets:write). Requires idempotencyKey in args. Poll get_provisioning_job until terminal; bearer secrets reveal once on first terminal GET.

Input parameters:

- `idempotencyKey` (string, required): Unique key (8–200 chars) — same key + body replays the job
- `items` (array, required): Up to 20 provisioning items

### `get_provisioning_job` (~54 tokens)

Poll a bulk provisioning job (treasury + keys:manage + wallets:read). bearerKey appears once when secretsDelivery is revealed.

Input parameters:

- `jobId` (string, required): Job id from create_provisioning_job

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/rebelartists-fortfi-treasury-mcp/api-mcp#diagnostics

## Score history

- 2026-08-03: 63
- 2026-08-02: 62
- 2026-08-01: 62
- 2026-07-31: 61
- 2026-07-30: 60
- 2026-07-29: 59
- 2026-07-28: 59
- 2026-07-27: 16
- 2026-07-26: 16

## Links

- Remote endpoint: https://fortfiapp.com/api/mcp
- Authorisation metadata: https://fortfiapp.com/.well-known/oauth-protected-resource/api/mcp
- Repository: https://github.com/rebelArtists/fortfi
- Website: https://fortfiapp.com/agents
- Changelog RSS feed: https://verifymcp.io/servers/rebelartists-fortfi-treasury-mcp/api-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/rebelartists-fortfi-treasury-mcp/api-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/rebelartists-fortfi-treasury-mcp/api-mcp
