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
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
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (jupiter_swap). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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
claude mcp add --transport http ing-crank-crank 'https://mcp.crank.ing/mcp'
{
"mcpServers": {
"ing-crank-crank": {
"url": "https://mcp.crank.ing/mcp"
}
}
} {
"servers": {
"ing-crank-crank": {
"type": "http",
"url": "https://mcp.crank.ing/mcp"
}
}
} [mcp_servers.ing-crank-crank] url = "https://mcp.crank.ing/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ing-crank-crank": {
"type": "remote",
"url": "https://mcp.crank.ing/mcp",
"enabled": true
}
}
} openclaw mcp add ing-crank-crank --url 'https://mcp.crank.ing/mcp' --transport streamable-http
mcp_servers:
ing-crank-crank:
url: "https://mcp.crank.ing/mcp" {
"McpServers": {
"ing-crank-crank": {
"Transport": "http",
"Url": "https://mcp.crank.ing/mcp"
}
}
} assistant mcp add ing-crank-crank -t streamable-http -u 'https://mcp.crank.ing/mcp'
{
"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.
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
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 |
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 →
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_unverified | boolean | – | – |
| amount | integer | yes | – |
| caller_id | string | – | – |
| idempotency_key | string | – | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| protocol | string | yes | – |
| signed_transaction | – | – | – |
| verify | boolean | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| include_triggered | boolean | – | – |
| limit | integer | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| include_inactive | boolean | – | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_unverified | boolean | – | – |
| amount | integer | yes | – |
| caller_id | string | – | – |
| from_lst | string | yes | – |
| idempotency_key | string | – | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| signed_transaction | – | – | – |
| to_lst | string | yes | – |
| verify | boolean | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | – |
| caller_id | string | – | – |
| destination | string | yes | – |
| idempotency_key | string | – | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| token | string | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| close_pct | number | – | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | – | – | – |
| market | string | yes | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| position_id | – | – | – |
| signed_transaction | – | – | – |
| verify | boolean | – | – |
| wallet_address | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| market | string | yes | – |
| period | string | – | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| detail | string | – | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| add_collateral | – | – | – |
| caller_id | string | – | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | – | – | – |
| new_leverage | – | – | – |
| new_sl | – | – | – |
| new_tp | – | – | – |
| order_id | integer | yes | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_unverified | boolean | – | – |
| caller_id | string | – | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | – | – | – |
| leverage | number | yes | – |
| market | string | yes | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| signed_transaction | – | – | – |
| size_usd | number | yes | – |
| stop_loss_price | – | – | – |
| take_profit_price | – | – | – |
| verify | boolean | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_unverified | boolean | – | – |
| caller_id | string | – | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | – | – | – |
| leverage | number | yes | – |
| market | string | yes | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| signed_transaction | – | – | – |
| size_usd | number | yes | – |
| stop_loss_price | – | – | – |
| take_profit_price | – | – | – |
| verify | boolean | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| detail | string | – | – |
| venue | – | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| acknowledge_tier_b | boolean | – | – |
| caller_id | string | – | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | – | – | – |
| leverage | number | yes | – |
| limit_price | – | – | – |
| market | string | yes | – |
| order_type | string | – | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| side | string | yes | – |
| signed_transaction | – | – | – |
| size_usd | number | yes | – |
| stop_loss_price | – | – | – |
| take_profit_price | – | – | – |
| venue | – | – | – |
| verify | boolean | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | integer | yes | – |
| caller_id | string | – | – |
| confirm | boolean | – | – |
| disclosures_acknowledged | boolean | – | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | string | – | – |
| launch_id | integer | yes | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| pledger_token_account | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| device_code | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| device_code | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| device_code | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| device_code | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| detail | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| assets | – | – | – |
| caller_id | string | – | – |
| intent | string | – | – |
| timeframe | string | – | – |
| wallet_address | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| description | string | – | – |
| name | string | – | – |
| pattern_id | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| anonymous | boolean | – | – |
| author_wallet_address | string | – | – |
| backtest_run_id | – | – | – |
| caller_id | string | – | – |
| config_template | object | yes | – |
| description | string | – | – |
| name | string | yes | – |
| performance_summary | – | – | – |
| strategy_type | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| a2a_card_url | string | – | – |
| caller_id | string | – | – |
| capabilities | – | – | – |
| contact | string | – | – |
| description | string | – | – |
| display_name | string | – | – |
| mcp_endpoint | string | – | – |
| supported_protocols | – | – | – |
| version | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| expected_root | string | – | – |
| members | array | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | string | – | – |
| caller_id | string | – | – |
| contact_email | string | – | – |
| name | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| integrator_wallet_address | string | yes | – |
| referred_wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| event_types | array | yes | – |
| secret | string | yes | – |
| url | string | yes | – |
| wallet_address | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| capabilities | – | – | – |
| expires_at | string | – | – |
| label | string | – | – |
| signer_pubkey | string | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| policies | array | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| signer_pubkey | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| limit | integer | – | – |
| query | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_unverified | boolean | – | – |
| amount | integer | yes | – |
| caller_id | string | – | – |
| expiry_days | – | – | – |
| idempotency_key | string | – | – |
| platform | string | – | – |
| recipient_handle | string | yes | – |
| referral | string | – | – |
| sender_wallet | string | yes | – |
| token | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| grant_pda | string | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_type | string | yes | – |
| caller_id | string | – | – |
| threshold | number | yes | – |
| token | string | yes | – |
| wallet_address | string | yes | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| marginfi_account | – | – | – |
| market | – | – | – |
| protocol | string | yes | – |
| threshold | number | yes | – |
| wallet_address | string | yes | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| daily_wake_budget | – | – | – |
| kill_threshold_enabled | – | – | – |
| kill_threshold_ratio | – | – | – |
| kill_window_days | – | – | – |
| opted_in | boolean | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| mode | string | yes | – |
| wallet_address | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| banned_tokens | – | – | – |
| body_markdown | string | – | – |
| cadence | string | – | – |
| caller_id | string | – | – |
| escalation_webhook | string | – | – |
| max_position_pct | – | – | – |
| objectives | string | – | – |
| risk_band | string | – | – |
| rotate_escalation_secret | boolean | – | – |
| target_allocations | – | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| policies | array | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| decision_id | string | yes | – |
| include_rationale | boolean | – | – |
| platform | string | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| buy_with_amount | – | – | – |
| caller_id | string | – | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | – | – | – |
| marginfi_account | – | – | – |
| market | – | – | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| short_id | integer | yes | – |
| slippage_bps | integer | – | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_unverified | boolean | – | – |
| borrow_amount | integer | yes | – |
| caller_id | string | – | – |
| collateral_amount | integer | yes | – |
| collateral_token | string | yes | – |
| idempotency_key | string | – | – |
| ip | string | – | – |
| jurisdiction | – | – | – |
| marginfi_account | – | – | – |
| market | – | – | – |
| pay_in_crank | boolean | – | – |
| payment_header | string | – | – |
| protocol | string | – | – |
| slippage_bps | integer | – | – |
| token_to_short | string | yes | – |
| wallet_address | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| caller_id | string | – | – |
| wallet_address | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
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.