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.

Crank Protocol

REMOTE · MCP.CRANK.ING · SCANNED SEP 21

Non-custodial DeFi tools for AI agents on Solana: swaps, perps, lending, staking, equities.

Available components

0 this week 77 Trust /100
Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Endpoint Security63
Transport & Reachability100
Schema Quality & AI Usability72
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 38073 tokens (~202/item across 188 items; 188 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 Management92
  • Stability check failed: schema churn in the 30 days we've observed: 14 tool removals, 0 breaking changes, 0 auth/transport breaks, 18 additions. See how to fix → Fail
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety98
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 9 of 10 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "unpublish_journal_card" implies "withdraw" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 188 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 Crank Protocol MCP server?

Crank Protocol is a hosted endpoint at https://mcp.crank.ing/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.crank.ing

# add to Claude Code
claude mcp add --transport http ing-crank-crank 'https://mcp.crank.ing/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "ing-crank-crank": {
      "url": "https://mcp.crank.ing/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "ing-crank-crank": {
      "type": "http",
      "url": "https://mcp.crank.ing/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.ing-crank-crank]
url = "https://mcp.crank.ing/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ing-crank-crank": {
      "type": "remote",
      "url": "https://mcp.crank.ing/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ing-crank-crank --url 'https://mcp.crank.ing/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  ing-crank-crank:
    url: "https://mcp.crank.ing/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "ing-crank-crank": {
      "Transport": "http",
      "Url": "https://mcp.crank.ing/mcp"
    }
  }
}
# add to Vellum
assistant mcp add ing-crank-crank -t streamable-http -u 'https://mcp.crank.ing/mcp'
// mcp.json
{
  "mcpServers": {
    "ing-crank-crank": {
      "type": "http",
      "url": "https://mcp.crank.ing/mcp"
    }
  }
}

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

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 0
    • Tool “create_execution_intent” rewrote its description, which is the text the model reads security
    • Tool “get_quotes” rewrote its description, which is the text the model reads security
    • Tool “jupiter_swap” rewrote its description, which is the text the model reads security
  • 8 Sept 26 0
    • Tool “set_portfolio_charter” rewrote its description, which is the text the model reads security
    • “set_portfolio_charter” added an optional parameter “rotate_escalation_secret” cosmetic
  • 7 Sept 26 0
    • New tool “evm_swap”, which the server declares destructive security
    • Tool “register_integrator” rewrote its description, which is the text the model reads security
    • Tool “sidecar_health” rewrote its description, which is the text the model reads security
    • New tool “evm_balances” functional
    • New tool “evm_swap_quote” functional
    • New tool “evm_token_price” functional
  • 3 Sept 26 0
    • Tool “authorize_session_signer” rewrote its description, which is the text the model reads security
    • Tool “request_session_signer_authorization” rewrote its description, which is the text the model reads security
  • 30 Aug 26 0
    • Tool “bridge_out” rewrote its description, which is the text the model reads security
    • Tool “search_tools” rewrote its description, which is the text the model reads security
    • New tool “get_bridge_status” functional
    • “bridge_out” added an optional parameter “order_id” cosmetic
  • 29 Aug 26 0
    • Tool “get_collective_insights” rewrote its description, which is the text the model reads security
    • Tool “get_emerging_patterns” rewrote its description, which is the text the model reads security
    • Tool “get_my_contribution_score” rewrote its description, which is the text the model reads security
    • Tool “get_signal_effectiveness” rewrote its description, which is the text the model reads security
    • Tool “get_source_weights” rewrote its description, which is the text the model reads security
    • Tool “get_strategy_evolution_report” rewrote its description, which is the text the model reads security
    • Tool “get_strategy_leaderboard” rewrote its description, which is the text the model reads security
    • Tool “pledge_to_ilo” rewrote its description, which is the text the model reads security
    • Tool “propose_template_update” rewrote its description, which is the text the model reads security
    • Tool “share_journal_card” rewrote its description, which is the text the model reads security
    • Tool “strategy_dca_create” rewrote its description, which is the text the model reads security
    • Destructive annotations: 8 of 9 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "unpublish_journal_card" implies "withdraw" and declares readOnlyHint instead, contradicting what its own name says it does. functional
    • New tool “report_registry_install” functional
    • New tool “unpublish_journal_card” functional
    • “pledge_to_ilo” added an optional parameter “disclosures_acknowledged” cosmetic
    • “pledge_to_ilo” added an optional parameter “ip” cosmetic
    • “pledge_to_ilo” added an optional parameter “jurisdiction” cosmetic
  • 26 Aug 26 +2
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Aug 26 0
    • New tool “intelligence_suggestion_approve”, which the server declares destructive security
    • New tool “get_journal_card” functional
    • New tool “share_journal_card” functional
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 21 Sept 2026 · Probed https://mcp.crank.ing/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=mcp.crank.ing CN=YE2,O=Let's Encrypt,C=US 8 Aug 2026 6 Nov 2026 ECDSA 256 ECDSA-SHA384 6247a5e560270504cf8b0573a2963f401a8
SANs: mcp.crank.ing
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.crank.ing. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ing. present 27256 8 Verified
crank.ing. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=31536000; includeSubDomains; preload
x-content-type-options nosniff
x-frame-options DENY
referrer-policy no-referrer

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.crank.ing/mcp Verified 200
http (plaintext) http://mcp.crank.ing/mcp HTTPS enforced 301 https://mcp.crank.ing/mcp
MCP tools · 188 exposed · ~38,073 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
liquid_stake ~396

Stake SOL for a liquid-staking token (non-custodial). amount in lamports. protocol: marinade | jito | blaze. Returns an UNSIGNED base64 tx + the LST received + current APY. The technology service fee is charged on the staked-SOL notional past the daily free tier (x402 payment_header; set pay_in_crank for the $CRANK discount). Workflow: EXECUTE step (yield leg) -- stake the idle slice after comparing get_lst_yields. Non-custodial. Monitor via portfolio_snapshot. See get_trading_workflow. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-staking. Reuse the SAME key across the build call and its ``signed_transaction`` completion call -- the two legs dedupe independently, so this never raises IDEMPOTENCY_CONFLICT; a NEW key means a genuinely new stake. ``signed_transaction`` / ``verify`` (two-phase execution): re-call this tool with the SIGNED base64 tx and Crank broadcasts it, then awaits on-chain confirmation and re-reads the LST + SOL balances -- the response carries a real ``verification`` block ({confirmed, slot, post_state, expected_vs_actual}). Gate follow-on decisions on ``verification.confirmed``, never on tx_signature alone. verify=false skips only the confirmation wait.

NameTypeReqDescription
allow_unverifiedboolean
amountintegeryes
caller_idstring
idempotency_keystring
pay_in_crankboolean
payment_headerstring
protocolstringyes
signed_transaction
verifyboolean
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

list_alerts ~178

List a wallet's alerts -- what is currently armed. Free read. Covers both price/position alerts (set_alert) and health-factor liquidation alerts (set_liquidation_alert) -- one table, told apart by alert_type. Default shows only ARMED alerts (active, not yet triggered) -- exactly the set the Celery evaluators will act on. include_triggered=True adds already- tripped and deactivated alerts (recent history). limit caps at 200. Workflow: MONITOR step -- read before arming another alert so you do not duplicate a level that is already watched. Pairs with set_alert. See get_trading_workflow.

NameTypeReqDescription
caller_idstring
include_triggeredboolean
limitinteger
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

list_session_signers ~41

List all delegated session signers (active + revoked) for a wallet.

NameTypeReqDescription
caller_idstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

list_signal_catalog ~169

Catalog of every available signal stream (free read). One entry per signal source across all tiers -- on-chain collectors, free API sources, derived analyzers and external provider adapters -- with tier, cost-gate state (paid Tier-D gates are fail-closed and disabled by default), coverage window (earliest/latest persisted signal -- the honest backtest window), effectiveness stats (graded evaluation count + correct rate) and a gameability class (social streams rank high -- they carry anti-gaming caps). Descriptive historical data only. Not financial advice. Workflow: COMPOSE step -- enumerate streams before authoring a composite strategy definition; pair with get_signals to inspect a stream's feed.

NameTypeReqDescription
caller_idstring
include_inactiveboolean

Structured output declared, but exposes no named fields.

No examples provided.

list_webhooks ~40

List a wallet's webhook subscriptions (free read; secrets are never returned).

NameTypeReqDescription
caller_idstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

lst_swap ~321

Swap between two LSTs via the Sanctum router (non-custodial). from_lst/to_lst are mints; amount in base units. Returns an UNSIGNED base64 tx + output amount. The technology service fee is charged on the input-LST notional past the daily free tier (x402 payment_header). The acquired LST (to_lst) is authenticity-verified first; set allow_unverified=true to swap into an unverified LST at your own risk. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-swapping. Reuse the SAME key across the build call and its ``signed_transaction`` completion call -- see liquid_stake; the two legs dedupe independently, so this never raises IDEMPOTENCY_CONFLICT. ``signed_transaction`` / ``verify`` (two-phase execution): see liquid_stake -- re-call with the signed tx and Crank broadcasts it, confirms it on-chain, and re-reads both LST balances.

NameTypeReqDescription
allow_unverifiedboolean
amountintegeryes
caller_idstring
from_lststringyes
idempotency_keystring
pay_in_crankboolean
payment_headerstring
signed_transaction
to_lststringyes
verifyboolean
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

offramp_to_fiat ~190

Cash out crypto to fiat via MoonPay (non-custodial). token is the crypto to sell; amount is its quantity; destination is a MoonPay bank_account_id the fiat is paid to. Returns offramp_id, estimated_fiat, and status. Past the daily free tier an x402 payment_header is required. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result (same offramp_id) instead of creating a second MoonPay sell order.

NameTypeReqDescription
amountnumberyes
caller_idstring
destinationstringyes
idempotency_keystring
pay_in_crankboolean
payment_headerstring
tokenstringyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

perp_close ~258

Close a perp position, full or partial (non-custodial). close_pct in (0, 100]. Returns an UNSIGNED base64 tx to sign + broadcast, plus exit price + realized P&L estimate (incl funding). Past the daily free tier an x402 payment_header is required. ``jurisdiction``: closes are geo-gated too -- see perp_open_long. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-closing the position. ``signed_transaction`` / ``verify`` (two-phase execution): see perp_open_long -- re-call with the signed tx and Crank broadcasts it, confirms it on-chain, and re-reads the position.

NameTypeReqDescription
caller_idstring
close_pctnumber
idempotency_keystring
ipstring
jurisdiction
marketstringyes
pay_in_crankboolean
payment_headerstring
position_id
signed_transaction
verifyboolean
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

perp_funding_rates ~68

Current funding for a perp market (rate, period, last funding timestamp). market e.g. SOL-PERP. period is informational (1h/8h/24h).

NameTypeReqDescription
caller_idstring
marketstringyes
periodstring

Structured output declared, but exposes no named fields.

No examples provided.

perp_funding_rates_all ~42

Normalized funding/borrow rates across venues (venue=None aggregates).

NameTypeReqDescription
caller_idstring
market
venue

Structured output declared, but exposes no named fields.

No examples provided.

perp_markets ~32

Available Drift perp markets with price, open interest, funding, max leverage.

NameTypeReqDescription
caller_idstring

Structured output declared, but exposes no named fields.

No examples provided.

perp_markets_all ~97

Perp markets across venues (venue=None aggregates all routable venues). detail="concise" (default) trims each market to symbol/venue/price/ max_leverage (symbol is the ID to chain into place_perp_order); "full" adds base/quote/custody_tier/min_size/open_interest_usd.

NameTypeReqDescription
caller_idstring
detailstring
venue

Structured output declared, but exposes no named fields.

No examples provided.

perp_modify ~233

Modify an existing open Drift ORDER by order_id (non-custodial). Adjusts trigger price (TP/SL). new_leverage / add_collateral require a separate collateral deposit/withdraw and are recorded for tracking. Returns an UNSIGNED base64 tx to sign + broadcast. Past the daily free tier an x402 payment_header is required. ``jurisdiction``: modify (changes leverage/ exposure) is geo-gated too -- see perp_open_long. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-modifying the order.

NameTypeReqDescription
add_collateral
caller_idstring
idempotency_keystring
ipstring
jurisdiction
new_leverage
new_sl
new_tp
order_idintegeryes
pay_in_crankboolean
payment_headerstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

perp_open_long ~517

Open a leveraged LONG perp position on Drift (non-custodial). Returns an UNSIGNED base64 transaction for your wallet to sign + broadcast, plus entry/liquidation/margin estimates. market e.g. SOL-PERP. size_usd is notional USD; leverage up to the market max. TP/SL are informational in the build — place them as trigger orders after the position opens. The fee is charged on size_usd notional past the daily free tier (x402 payment_header). ``jurisdiction``: your ISO-3166-1 alpha-2 country code, self-declared -- perps are geo-gated (CFTC posture: no US persons, unknown jurisdiction DENIED). Pass it once here (or via ``declare_jurisdiction``/``trade_equity``) and it is remembered for 90 days; every perps/short/leverage call is denied until declared. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-opening the position. Reuse the SAME key across the build call and its ``signed_transaction`` completion call -- the two legs dedupe independently (the completion leg is namespaced under its own storage key, matching jupiter_swap's build/broadcast pattern), so this never raises IDEMPOTENCY_CONFLICT; a NEW key means a genuinely new order. ``signed_transaction`` / ``verify`` (two-phase execution): re-call this tool with the SIGNED base64 tx and Crank broadcasts it, then awaits on-chain confirmation and re-reads the perp position -- the response carries a real ``verification`` block ({confirmed, slot, post_state, expected_vs_actual}). Gate follow-on decisions on ``verification.confirmed``, never on tx_signature alone. verify=false skips only the confirmation wait.

NameTypeReqDescription
allow_unverifiedboolean
caller_idstring
idempotency_keystring
ipstring
jurisdiction
leveragenumberyes
marketstringyes
pay_in_crankboolean
payment_headerstring
signed_transaction
size_usdnumberyes
stop_loss_price
take_profit_price
verifyboolean
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

perp_open_short ~182

Open a leveraged SHORT perp position on Drift (non-custodial). Same envelope as perp_open_long, opposite direction. ``jurisdiction``, ``idempotency_key`` (optional) and ``signed_transaction``/``verify`` (two-phase execution): see perp_open_long.

NameTypeReqDescription
allow_unverifiedboolean
caller_idstring
idempotency_keystring
ipstring
jurisdiction
leveragenumberyes
marketstringyes
pay_in_crankboolean
payment_headerstring
signed_transaction
size_usdnumberyes
stop_loss_price
take_profit_price
verifyboolean
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

perp_positions ~64

List open perp positions for a wallet with live P&L. Each: market, side, size, entry/mark price, unrealized P&L (incl funding), liquidation price.

NameTypeReqDescription
caller_idstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

perp_positions_all ~123

Open perp positions for a wallet. venue=None aggregates across venues. Each position carries its venue + custody_tier. detail="concise" (default) trims each position to position_id/market/side/size/unrealized_pnl/venue (position_id is the ID to chain into close_perp_position); "full" adds entry_price/current_price/leverage/liquidation_price/custody_tier.

NameTypeReqDescription
caller_idstring
detailstring
venue
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

place_perp_order ~610

Open a leveraged perp position on the best/selected venue (non-custodial). side is "long" | "short". market e.g. SOL-PERP; size_usd is notional USD. venue optional -- defaults to the configured primary (Jupiter Perps), with health failover to the fallback for new orders. Returns an UNSIGNED tx (Tier A) or a signing payload (Tier B) for your wallet to sign + broadcast, plus venue_name / custody_tier / settlement_token. Tier B (venue-custodied) venues require acknowledge_tier_b=true after reviewing custody_disclosure. Fee charged on size_usd notional past the daily free tier (x402). ``jurisdiction``: your ISO-3166-1 alpha-2 country code, self-declared -- perps are geo-gated (no US persons, unknown jurisdiction DENIED). Declare once here (or via ``declare_jurisdiction``/``trade_equity``) and it is remembered 90 days. Workflow: EXECUTE step (leveraged directional leg) -- after get_venue_health / get_venue_risk_score clear the venue and get_risk_assessment caps the size. Monitor via perp_positions. See get_trading_workflow. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-opening the order. Reuse the SAME key across the build call and its ``signed_transaction`` completion call -- the two legs dedupe independently, so this never raises IDEMPOTENCY_CONFLICT; a NEW key means a genuinely new order. ``signed_transaction`` / ``verify`` (two-phase execution): re-call this tool with the SIGNED payload and Crank relays it by custody tier -- Tier A to Solana RPC, then awaits on-chain confirmation and re-reads the position on the executing venue; Tier B to the venue's own submit endpoint, which returns a venue order id (reported as venue-acknowledged, since it is not an on-chain signature). Gate follow-on decisions on ``verification.confirmed``, never on tx_signature alone.

NameTypeReqDescription
acknowledge_tier_bboolean
caller_idstring
idempotency_keystring
ipstring
jurisdiction
leveragenumberyes
limit_price
marketstringyes
order_typestring
pay_in_crankboolean
payment_headerstring
sidestringyes
signed_transaction
size_usdnumberyes
stop_loss_price
take_profit_price
venue
verifyboolean
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

pledge_to_ilo ~510

Pledge to a token launch. PLAN MODE BY DEFAULT (non-custodial). ``amount`` is in pledge-mint BASE UNITS (USDC is 6dp: 1_000_000 = 1 USDC). Default (``confirm=false``) returns ``action: "plan"`` -- a preview that evaluates every on-chain guard off-chain first (launch status, pledge window, remaining capacity, per-wallet cap) plus the anti-sybil screen and a pro-rata allocation projection. Nothing is built and nothing moves. ``confirm=true`` returns ``action: "sign_required"`` with an UNSIGNED base64 transaction you sign with your own wallet and broadcast yourself. Crank never holds your keys. A pledge is irreversible once broadcast: the on-chain refund path opens only if the raise fails its minimum. Utility token fair launch -- this commits funds to a non-custodial escrow. It is not a purchase of any expectation of profit and confers no claim on issuer revenue. The technology service fee applies past the daily free tier (x402 payment_header; set pay_in_crank for the $CRANK discount). ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of pledging twice. US persons are blocked (Reg S-flavoured geo-posture, I4): declare ``jurisdiction`` (ISO-3166-1 alpha-2) or rely on a stored attestation; unknown jurisdiction is DENIED. ``confirm=true`` additionally requires ``disclosures_acknowledged=true`` -- read the mandatory pre-pledge disclosure block (``get_ilo_details`` or a plan-mode preview) first (I2). Workflow: EXECUTE step -- get_ilo_details, then plan-mode preview, then confirm=true. Track it afterwards with get_my_pledge_status.

NameTypeReqDescription
amountintegeryes
caller_idstring
confirmboolean
disclosures_acknowledgedboolean
idempotency_keystring
ipstring
jurisdictionstring
launch_idintegeryes
pay_in_crankboolean
payment_headerstring
pledger_token_accountstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

poll_agent_wallet_enable ~108

Poll a Lane 2 enablement request; provisions the wallet ONLY once approved. On approval, applies the server-enforced conservative Lane 2 default policy (per-tx $50, daily $200, SOL+USDC only, 10% drawdown halt) and a 10-execution training-wheels counter, then returns the policy READ BACK from the server -- never the intended one.

NameTypeReqDescription
caller_idstring
device_codestringyes

Structured output declared, but exposes no named fields.

No examples provided.

poll_agnta_grant_clear ~97

Poll a grant-clear request; clears the AGNTA grant ONLY once approved. Returns {"status": "pending"} while waiting, {"status": "expired"} for an unknown/expired code (never fabricates approval), or on approval clears through the same rails clear_agnta_grant uses for a non-Lane-2 wallet.

NameTypeReqDescription
caller_idstring
device_codestringyes

Structured output declared, but exposes no named fields.

No examples provided.

poll_session_signer_authorization ~97

Poll a signer-authorization request; authorizes ONLY once approved. Returns {"status": "pending"} while waiting, {"status": "expired"} for an unknown/expired code (never fabricates approval), or on approval binds the signer through the same rails authorize_session_signer uses and returns the created session_signer row.

NameTypeReqDescription
caller_idstring
device_codestringyes

Structured output declared, but exposes no named fields.

No examples provided.

poll_wallet_policy_loosening ~60

Poll a policy-loosening request; applies it ONLY once approved. Returns the policy READ BACK from the server after the write -- never the requested one.

NameTypeReqDescription
caller_idstring
device_codestringyes

Structured output declared, but exposes no named fields.

No examples provided.

portfolio_snapshot ~156

Full portfolio summary: positions, total value, allocation %, 24h change. Persisted as a PortfolioSnapshot for historical tracking. detail="concise" (default) returns total_value_usd/change_24h_pct/snapshot_id + up to the top 10 positions (token/symbol/usd_value -- IDs for chaining); "full" returns every position with amount/price_usd and the complete allocation_pcts map, as before. Workflow: ORIENT step -- the denominator for position sizing. Call before intelligence/risk so sizes are net of current holdings. See get_trading_workflow.

NameTypeReqDescription
caller_idstring
detailstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

propose_allocation ~205

Ranked allocation plan: intent + balances + regime + yields + ML signals (free read). One call composes the read-only surfaces an agent would otherwise orchestrate by hand -- lending supply APYs, LST staking yields, the per-asset market regime, and the ML ensemble signal -- into a ranked, intent-shaped plan (conservative | balanced | aggressive). Each directional entry names the exact backtest_strategy args to validate it BEFORE deploying, plus the follow-up tool that would act on it. Descriptive analytics only -- never advice, never a promise of results; nothing is executed. Workflow: INTELLIGENCE/ANALYSIS step -- call after get_market_briefing and before backtest_strategy / get_risk_assessment / strategy_*_create.

NameTypeReqDescription
assets
caller_idstring
intentstring
timeframestring
wallet_addressstring

Structured output declared, but exposes no named fields.

No examples provided.

propose_template_update ~188

Propose a DRAFT strategy template from an emerging pattern. PROPOSE-AND-APPROVE ONLY. Creates a draft template that is NOT published, NOT verified and NOT eligible for cloning; an administrator must explicitly approve it before it can appear in the marketplace. This tool can never publish, verify, or modify an existing live template, and never auto-applies anything. pattern_id comes from get_emerging_patterns; only an active, released pattern may be proposed. Descriptive historical observation -- not a recommendation, not financial advice, and not a promise of future results. Workflow: PROPOSE step -- raise an observed emergent motif for human review; approval and any publication remain a human decision.

NameTypeReqDescription
caller_idstring
descriptionstring
namestring
pattern_idstringyes

Structured output declared, but exposes no named fields.

No examples provided.

publish_strategy ~165

Publish a cloneable strategy config to the marketplace (the flywheel). config_template is the parameter set others clone. anonymous=true omits the author. performance_summary is a factual metrics blob -- no return promises are stored or surfaced (hard rule 8). backtest_run_id attaches a verified backtest (on-chain attestation hash + leaderboard ranking). Equity (tokenized-security) strategies are excluded. Read/control-plane, free.

NameTypeReqDescription
anonymousboolean
author_wallet_addressstring
backtest_run_id
caller_idstring
config_templateobjectyes
descriptionstring
namestringyes
performance_summary
strategy_typestringyes

Structured output declared, but exposes no named fields.

No examples provided.

register_agent ~183

Register/refresh an agent's discovery profile in the Crank registry. capabilities is a subset of swap|perps|lending|staking|strategies|signals| equity|onramp; supported_protocols e.g. ["mcp","a2a","x402"]. Idempotent on wallet_address (a PUBLIC key -- non-custodial). This is how other agents find you via the A2A Agent Card + Solana Agent Registry.

NameTypeReqDescription
a2a_card_urlstring
caller_idstring
capabilities
contactstring
descriptionstring
display_namestring
mcp_endpointstring
supported_protocols
versionstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

register_counterparty_set ~316

Register/replace/clear the AGNTA counterparty allow-set for the caller's opted-in DelegationGrant (non-custodial control plane). Persists to Django so the set survives an MCP process restart and is visible to every process -- the follow-up to 's process-local ``InMemoryCounterpartySetResolver``. ``wallet_address`` must belong to an ``AgentWallet`` with a non-blank ``agnta_grant_pda`` already configured (opting in is a separate step, out of scope here); the target grant_pda is always resolved from that wallet, never caller-supplied. ``members`` is a list of base58 32-byte destination pubkeys the grant's ``counterparty_root`` should allow -- pass an EMPTY list to CLEAR the registered set, after which every transfer-class call naming an on-chain destination for this grant fails closed. ``expected_root`` (hex, optional but STRONGLY recommended): compare against the grant's live on-chain ``counterparty_root`` (hex-encoded) before calling this -- when given, a set that does not commit to it is refused (INVALID_PARAMS) rather than silently registered, which would otherwise surface later as a confusing AGNTA_GRANT_COUNTERPARTY_DENIED on an unrelated transfer.

NameTypeReqDescription
caller_idstring
expected_rootstring
membersarrayyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

register_integrator ~108

Register an agent integrator by its payout wallet -- lands PENDING. The Jupiter-integrator self-serve onboarding step. The profile earns NOTHING until an admin approves it and sets its fee-share (anti-gaming whitelist). Idempotent on ``wallet_address``. Returns the integrator stats.

NameTypeReqDescription
agent_idstring
caller_idstring
contact_emailstring
namestring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

register_referrer ~80

First-touch bind an onboarded agent wallet to an approved integrator. First-touch wins: a wallet already attributed to any integrator keeps that binding. Requires the integrator be approved; rejects a self-referral.

NameTypeReqDescription
caller_idstring
integrator_wallet_addressstringyes
referred_wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

register_webhook ~215

Register (or reactivate) a lifecycle-event webhook for a wallet (free control-plane write). event_types is a non-empty subset of: pre_trade (advisory only, never blocks a trade), post_trade, policy_violation, drawdown_warning, strategy_executed. url is your https(s) receiving endpoint. secret is YOUR OWN HMAC-SHA256 signing secret (8-128 chars) -- Crank never sends or stores platform key material here (hard rule 1); you use it to verify the `X-Crank-Signature` header on every delivered event (see docs/WEBHOOKS.md). Re-registering the same (wallet_address, url) pair updates its event_types/secret and reactivates it if it was auto-disabled after repeated delivery failures.

NameTypeReqDescription
caller_idstring
event_typesarrayyes
secretstringyes
urlstringyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

report_registry_install ~133

Self-report an MCP-registry install/discovery event. Producer for the ``registry_install`` inbound-artifact leg that ``growth_metrics.organic_integration_candidates`` already consumes: call this once, with your own stable ``caller_id``, after your server installs/discovers Crank via an MCP registry listing (Smithery, PulseMCP, the official MCP registry). Writes a synthetic marker row -- moves no funds, never fee-gated, and is idempotent per-process (a repeat call for the same caller_id is a documented no-op).

NameTypeReqDescription
caller_idstring

Structured output declared, but exposes no named fields.

No examples provided.

request_agnta_grant_clear ~115

Open the browser-confirmation handshake to clear a Lane 2 wallet's AGNTA grant cap. Call this when clear_agnta_grant refuses with BROWSER_CONFIRMATION_REQUIRED. Does NOT clear the grant -- returns a confirmation URL like request_wallet_policy_loosening; the wallet's OWNER must approve in their own browser (never in-chat). Poll with poll_agnta_grant_clear(device_code) once approved.

NameTypeReqDescription
caller_idstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

request_session_signer_authorization ~147

Open the browser-confirmation handshake to authorize a session signer. The ONLY way to mint a session signer -- authorize_session_signer always refuses with BROWSER_CONFIRMATION_REQUIRED for every wallet. Does NOT authorize the signer -- returns a confirmation URL like enable_agent_wallet; the wallet's OWNER must approve in their own browser (wallet-signature gated, never in-chat). Poll with poll_session_signer_authorization(device_code) once approved.

NameTypeReqDescription
caller_idstring
capabilities
expires_atstring
labelstring
signer_pubkeystringyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

request_wallet_policy_loosening ~101

Open the browser-confirmation handshake to loosen a Lane 2 wallet's policy. Call this when set_wallet_policy refuses a change with BROWSER_CONFIRMATION_REQUIRED. Does NOT apply the policy -- returns a confirmation URL like enable_agent_wallet. Poll with poll_wallet_policy_loosening(device_code) once the user approves.

NameTypeReqDescription
caller_idstring
policiesarrayyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

revoke_session_signer ~83

Instantly revoke a delegated session signer (non-custodial control plane). Single atomic DB UPDATE -- the gate resolves the row fresh on every call with no cache, so this is enforced on the very next call using signer_pubkey. No TTL/cache window.

NameTypeReqDescription
caller_idstring
signer_pubkeystringyes

Structured output declared, but exposes no named fields.

No examples provided.

search_tools ~271

Keyword search over the full Crank tool catalog (progressive disclosure). Read-only, free, never gated. Purpose-built for a discovering agent that does not want to load the full tool catalogue into context just to find the one it needs ( R1 -- the Solana Agent Kit V1 failure mode: 60+ tools in context caused tool-selection hallucinations). Pass a keyword or short phrase (e.g. "perp funding rate", "stake sol", "referral"); matches rank by keyword overlap against each tool's name + description. Returns up to ``limit`` (default 10, max 50) results, each ``{name, purpose, toolset}`` -- ``purpose`` is a one-line summary (call the tool itself, or get_trading_workflow, for the full picture), and ``toolset`` names which of the ten named toolsets (market_data, spot, perps, lending_staking, portfolio, strategies, intelligence, rewards_growth, wallet_admin, support) the tool belongs to. No tool is renamed or hidden by this search -- it is purely a discovery aid.

NameTypeReqDescription
caller_idstring
limitinteger
querystringyes

Structured output declared, but exposes no named fields.

No examples provided.

send_token_social ~301

Send tokens to an X handle via a claimable crank.ing link (non-custodial). Locks ``amount`` (base units) of ``token`` (mint) from ``sender_wallet`` into the on-chain claim escrow against a fresh claim code, and returns an UNSIGNED base64 transaction for the sender to sign + broadcast, plus the crank.ing/{code} claim link and the claim_code (the bearer secret to embed in the announcement tweet). Whoever presents the code claims the tokens and binds ``referral`` on their first claim. ``expiry_days`` (optional, default 7, range 1-90) sets the claim window; unclaimed tokens are returned to the sender after expiry. Anti-abuse gated: sender account age, verified wallet, per-sender daily limit. platform: x. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result (same claim_code/link) instead of locking a second escrow.

NameTypeReqDescription
allow_unverifiedboolean
amountintegeryes
caller_idstring
expiry_days
idempotency_keystring
platformstring
recipient_handlestringyes
referralstring
sender_walletstringyes
tokenstringyes

Structured output declared, but exposes no named fields.

No examples provided.

set_agnta_grant ~166

Opt a wallet into an AGNTA DelegationGrant spend/scope cap (non-custodial control plane). Validates grant_pda decodes as a base58 32-byte address, the on-chain account exists and decodes as a DelegationGrant, it is not revoked and not expired, and its delegate matches wallet_address -- every failure raises INVALID_PARAMS with a distinct message. Adds an ADDITIONAL cap enforced alongside (never replacing) WalletPolicy on every subsequent value-bearing call for this wallet -- always TIGHTENS enforcement, so it applies directly for every wallet, Lane 2 included.

NameTypeReqDescription
caller_idstring
grant_pdastringyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

set_alert ~156

Create a price/position alert checked every 60s by Celery beat. alert_type: price_above | price_below | position_change. token is a mint address. Optional webhook_url is POSTed when the alert fires. Free (no technology service fee) -- a control-plane write, moves no funds and has no transaction notional. Workflow: MONITOR step -- arm after executing so a tripped level loops you back to the risk/execute phase. See get_trading_workflow.

NameTypeReqDescription
alert_typestringyes
caller_idstring
thresholdnumberyes
tokenstringyes
wallet_addressstringyes
webhook_url

Structured output declared, but exposes no named fields.

No examples provided.

set_liquidation_alert ~183

Arm a liquidation alert: notify when a lending obligation's health factor falls to or below threshold. protocol: kamino | marginfi (marginfi_account required for marginfi). threshold is the HF level (e.g. 1.2 warns before the <1.0 liquidation point). Evaluated every 30s by Celery beat; webhook_url is POSTed on trip. Workflow: MONITOR step -- arm after opening a leveraged/borrow position so a deteriorating obligation loops you back to repay/de-risk. Pairs with get_health_factor. See get_trading_workflow.

NameTypeReqDescription
caller_idstring
marginfi_account
market
protocolstringyes
thresholdnumberyes
wallet_addressstringyes
webhook_url

Structured output declared, but exposes no named fields.

No examples provided.

set_ooda_consent ~303

Opt in/out of the wake-on-condition worker. Default OFF. When opted in, a triggered alert may run a metered background check (Haiku triage, escalating to Sonnet only if worth a closer look) and propose one action. daily_wake_budget (default 10, 1-500) hard-caps metered wakes per day. The worker never executes -- every proposal is approved in your own wallet. See get_ooda_status for wake history including skipped wakes. Usage-vs-fee-revenue kill threshold: wakes auto-suspend if inference spend over kill_window_days (default 30 days) exceeds kill_threshold_ratio (default "0.5") of attributed fee revenue. kill_threshold_enabled lets you disable the check for this wallet; kill_threshold_ratio is a decimal string. All three are optional -- omit to leave the existing/default value untouched. See get_ooda_status for whether/why a wallet was auto-killed (kill_switched_at, kill_reason). Workflow: consent step -- run once (or to change budget/kill config) before wakes can fire; check get_ooda_status afterward to confirm state.

NameTypeReqDescription
caller_idstring
daily_wake_budget
kill_threshold_enabled
kill_threshold_ratio
kill_window_days
opted_inbooleanyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

set_permission_mode ~173

Change an agent wallet's session permission mode (non-custodial control plane). Ports Claude Code's plan/acceptEdits/bypassPermissions ladder to a wallet with signing power. mode: observe (deny every mutating tool outright, PERMISSION_MODE_BLOCKED) | propose (mutating tools return a PROPOSAL envelope -- proposal_id + params + summary -- instead of executing; approve within the TTL via approve_proposal) | auto_within_policy (execute immediately, still capped by every configured WalletPolicy -- the pre-R9 default). Also settable inline via set_wallet_policy's permission_mode param. The transition is logged as an AgentTransaction audit row.

NameTypeReqDescription
caller_idstring
modestringyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

set_portfolio_charter ~431

Write a new version of the wallet's portfolio charter (free control-plane write). Creates a new active version -- the prior version stays in history, never deleted (versioned mandate, not an in-place overwrite). risk_band is one of conservative|balanced|aggressive. banned_tokens merge into AgentWallet.evaluate_trade as an ADDITIONAL deny source alongside WalletPolicy.banned_tokens -- an active WalletPolicy always wins when it is the stricter rule; a charter can never loosen an existing policy, and a conflict comes back in the response's `warnings` (logged server-side, never silently dropped). target_allocations is {token: percent}, must sum to <=100. objectives/cadence are free-form parameters -- never phrase them as return promises (hard rules 5-8). Setting an escalation_webhook mints a platform-generated escalation_webhook_secret used to HMAC-SHA256-sign every escalation POST (X-Crank-Signature over "{timestamp}.{body}"). The RAW secret is returned exactly once -- in this write's response -- so the receiver can be configured; every later read returns it masked. It is carried forward unchanged when the URL is unchanged, rotated automatically when the URL changes, and rotated on demand with rotate_escalation_secret=true. It is a receiver-authentication credential, never wallet key or seed material (hard rule 1). Workflow: ORIENT step 0 -- set once at the start of a relationship with an agent/wallet; strategies read it on every execute_strategy tick (see get_trading_workflow).

NameTypeReqDescription
banned_tokens
body_markdownstring
cadencestring
caller_idstring
escalation_webhookstring
max_position_pct
objectivesstring
risk_bandstring
rotate_escalation_secretboolean
target_allocations
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

set_wallet_policy ~214

Configure the caller's own trading limits and rules on an agent wallet. policies: a list of {policy_type, value, enabled?} objects. policy_type is one of max_trade_size {"usd"} | daily_limit {"usd"} | approved_tokens {"tokens"} | banned_tokens {"tokens"} | position_limit {"usd"} | kill_switch {"active"} | drawdown_limit {"max_pct"} | max_daily_loss {"usd"} | trade_velocity {"max_per_hour", "max_per_day"} | venue_allowlist {"venues"}. Upserts by policy_type; returns the full updated policy set. (Perp leverage cap is a separate follow-up, -- not a policy_type here.) On a Lane 2 wallet, a change that would LOOSEN a server-enforced default raises BROWSER_CONFIRMATION_REQUIRED -- call request_wallet_policy_loosening instead.

NameTypeReqDescription
caller_idstring
policiesarrayyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

share_journal_card ~250

Pre-filled post for a journal card, ready to publish (free read). Returns the same card as get_journal_card plus a platform-shaped share payload: post text within the platform's character limit, the public card URL, and a compose-intent URL. ``platform`` is x | farcaster | generic. The copy is about YOUR process -- what your agent decided, that the rationale was written down before the outcome, and that the record is checkable on-chain. It never states or implies a return. THIS CALL PUBLISHES THE DECISION. Your journal is private by default; calling this marks THIS decision publicly readable at its card URL so the link in the post resolves for anyone (and for answer engines). Nothing else is published -- not your other decisions, not amounts, not your journal body unless include_rationale=true. Reviewing with get_journal_card publishes nothing. Workflow: SHARE step -- get_journal_card to review, this to publish.

NameTypeReqDescription
caller_idstring
decision_idstringyes
include_rationaleboolean
platformstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

short_close ~198

Close a tracked short: buy token -> repay loan -> withdraw collateral. Returns an ORDERED STEP PLAN + exit price. short_id from short_open. Past the daily free tier an x402 payment_header is required. ``jurisdiction``: closes are geo-gated too -- see short_open. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-closing the short.

NameTypeReqDescription
buy_with_amount
caller_idstring
idempotency_keystring
ipstring
jurisdiction
marginfi_account
market
pay_in_crankboolean
payment_headerstring
short_idintegeryes
slippage_bpsinteger
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

short_open ~343

Open a lending-based short: deposit collateral -> borrow token -> sell. Returns an ORDERED STEP PLAN of UNSIGNED base64 txs to sign + broadcast in sequence, plus entry price + health factor + a short_id for tracking. All amounts in base units. The shorted token is authenticity-verified first; set allow_unverified=true to short an unverified mint at your own risk. Past the daily free tier an x402 payment_header is required. ``jurisdiction``: your ISO-3166-1 alpha-2 country code, self-declared -- synthetic shorting is geo-gated (no US persons, unknown jurisdiction DENIED). Declare once here (or via ``declare_jurisdiction``/``trade_equity``/perps tools) and it is remembered 90 days. ``idempotency_key`` (optional): a client-generated UUID. Retrying with the same key + same args replays the original result instead of re-opening the short.

NameTypeReqDescription
allow_unverifiedboolean
borrow_amountintegeryes
caller_idstring
collateral_amountintegeryes
collateral_tokenstringyes
idempotency_keystring
ipstring
jurisdiction
marginfi_account
market
pay_in_crankboolean
payment_headerstring
protocolstring
slippage_bpsinteger
token_to_shortstringyes
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

short_status ~37

List open shorts for a wallet with entry price + health factor.

NameTypeReqDescription
caller_idstring
wallet_addressstringyes

Structured output declared, but exposes no named fields.

No examples provided.

Common questions

What is the Crank Protocol MCP server?

Crank Protocol is an MCP server listed in the public MCP registry as ing.crank/crank. Non-custodial DeFi tools for AI agents on Solana: swaps, perps, lending, staking, equities. This page covers its hosted endpoint (https://mcp.crank.ing/mcp).

Is the Crank Protocol MCP server safe to use?

Crank Protocol scores 77 out of 100 on VerifyMCP. 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 Crank Protocol MCP server expose?

Crank Protocol exposes 188 tools: jupiter_swap, verify_transaction, get_quotes, get_balances, portfolio_snapshot, and 183 more. Their descriptions and schemas cost roughly 38,073 tokens of context every time the server is loaded.

Does the Crank Protocol MCP server require authentication?

No. We connected to Crank Protocol without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Crank Protocol MCP server still maintained?

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