Algorand
About
A comprehensive MCP server for tooling interactions(40+) and resource accessibility(60+) plus many useful prompts to interact with Algorand Blockchain.
Details
- Author
- goplausible
- GitHub stars
- 44
- Downloads
- 370
- Categories
- Developer Tools, Community, Other
Jump to
- Agent wallet with mnemonic storage in local SQLite
- Transaction building, signing, and atomic groups
- Full Algod and Indexer API access
- DEX integration with Tinyman and Haystack Router
- Per-tool-call network selection and pagination
- NFDomains and x402 micropayments support
Setting up with Highlight
This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:
- Download and install Highlight from highlightai.com/download
- Navigate to the plugins tab and select "Add Custom Plugin"
-
Configure the plugin with the settings below
Plugin Name
AlgorandCommand (node, npx, python, etc.)Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.
- Enable "Start Automatically" if you want the plugin to start when Highlight launches
From the repository
Install globally with npm install -g @goplausible/algorand-mcp or run via npx @goplausible/algorand-mcp. Configure it as an MCP server in any compatible client using stdio transport with the command npx @goplausible/algorand-mcp. No environment variables are required; network selection (mainnet, testnet, localnet) and pagination are handled per tool call.
Claude Desktop / Cursor
Paste into your MCP client config file to install this server.
{
"mcpServers": {
"algorand": {
"algorand-mcp": {
"command": "npx",
"args": [
"@goplausible/algorand-mcp"
]
}
}
}
}
McpServers
{
"algorand-mcp": {
"command": "npx",
"args": [
"@goplausible/algorand-mcp"
]
}
}
A comprehensiveModel Context Protocol (MCP)server that gives AI agents and LLMs full access to the Algorand blockchain. Built byGoPlausible.
Algorand is a carbon-negative, pure proof-of-stake Layer 1 blockchain with instant finality, low fees, and built-in support for smart contracts (AVM), standard assets (ASAs), and atomic transactions.
- Agent wallet — mnemonics stored in a local SQLite database, used by the MCP server to sign on the agent's behalf (mnemonics never returned in tool responses)
- Wallet accounts with human-readable nicknames
- Account creation, key management, and rekeying
- Transaction building, signing, and submission (payments, assets, applications, key registration)
- Atomic transaction groups
- TEAL compilation and disassembly
- Full Algod and Indexer API access
- NFDomains (NFD) name service integration
- x402 HTTP micropayments — automatic discovery and one-call paid requests using the active wallet (USDC/ALGO)
- AP2 tooling for Algorand
- Tinyman AMM integration (pools, swaps, liquidity)
- Haystack Router DEX aggregation (best-price swaps across Tinyman, Pact, Folks)
- Alpha Arcade prediction market trading (browse markets, orderbooks, limit/market orders, positions, claims)
- ARC-26 URI and QR code generation
- Algorand knowledge base with full developer documentation taxonomy
- Per-tool-call network selection (mainnet, testnet, localnet) and pagination
npm install -g @goplausible/algorand-mcp
git clone https://github.com/GoPlausible/algorand-mcp.git cd algorand-mcp npm install npm run build
The server runs overstdio. There are three ways to invoke it — pick whichever suits your setup:
No environment variables are requiredfor standard use. Network selection, pagination, and node URLs are all handled dynamically per tool call.
No manual configuration needed — install the@goplausible/openclaw-algorand-pluginnpm package and the Algorand MCP server is configured automatically:
npm install -g @goplausible/openclaw-algorand-plugin
Edit~/Library/Application Support/Claude/claude_desktop_config.json(macOS) or%APPDATA%\Claude\claude_desktop_config.json(Windows):
{ "mcpServers": { "algorand-mcp": { "command": "npx", "args": ["@goplausible/algorand-mcp"] } } }
{ "mcpServers": { "algorand-mcp": { "command": "algorand-mcp" } } }
{ "mcpServers": { "algorand-mcp": { "command": "node", "args": ["/absolute/path/to/algorand-mcp/dist/index.js"] } } }
Create.mcp.jsonin your project root (project scope) or~/.claude.json(user scope):
{ "mcpServers": { "algorand-mcp": { "type": "stdio", "command": "npx", "args": ["@goplausible/algorand-mcp"] } } }
claude mcp add algorand-mcp -- npx @goplausible/algorand-mcp
Add viaSettings > MCP Servers, or edit.cursor/mcp.jsonin your project root:
{ "mcpServers": { "algorand-mcp": { "command": "npx", "args": ["@goplausible/algorand-mcp"] } } }
Add viaSettings > MCP, or edit~/.codeium/windsurf/mcp_config.json:
{ "mcpServers": { "algorand-mcp": { "command": "npx", "args": ["@goplausible/algorand-mcp"] } } }
Edit.vscode/mcp.jsonin your workspace root, or openSettings > MCP Servers:
{ "servers": { "algorand-mcp": { "type": "stdio", "command": "npx", "args": ["@goplausible/algorand-mcp"] } } }
Add via theMCP Serverspanel in the Cline sidebar, or edit~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json(macOS):
{ "mcpServers": { "algorand-mcp": { "command": "npx", "args": ["@goplausible/algorand-mcp"], "disabled": false } } }
Create.codex/mcp.jsonin your project root or~/.codex/mcp.jsonfor global scope:
{ "mcpServers": { "algorand-mcp": { "command": "npx", "args": ["@goplausible/algorand-mcp"] } } }
{ "mcp": { "algorand-mcp": { "type": "stdio", "command": "npx", "args": ["@goplausible/algorand-mcp"] } } }
The server speaks the standard MCP stdio protocol. For any client not listed above, configure it with:
- Command:npx(oralgorand-mcpif globally installed, ornode /path/to/dist/index.js)
- Args:["@goplausible/algorand-mcp"](for npx)
- Transport:stdio
Every tool accepts an optionalnetworkparameter:"mainnet"(default),"testnet", or"localnet". Algod and Indexer URLs are built-in for mainnet and testnet viaAlgoNode.
{ "name": "api_algod_get_account_info", "arguments": { "address": "ABC...", "network": "testnet" } }
If nonetworkis provided, tools default tomainnet.
API responses are automatically paginated. Every tool accepts an optionalitemsPerPageparameter (default: 10). Pass thepageTokenfrom a previous response to fetch the next page.
The agent wallet is a local SQLite database that the MCP server controls on the agent's behalf. The server holds the mnemonics and signs transactions for the agent — the agent never sees the mnemonics in any tool response.
Threat model.The wallet.db file is the secret. Anyone with read access to it can recover every mnemonic stored in the wallet. The mitigations are filesystem permissions (0600, owner-only), keeping the data directory off shared/world-readable volumes, and treating the data directory like any other secret store (snapshot it carefully, restrict backups, encrypt the host disk for at-rest protection). For Docker deployments, mount~/.algorand-mcpas a named volume and restrict access to it like you would any secret material.
- Account creation(wallet_add_account) — Generates a keypair and inserts a row containing the mnemonic intoaccounts. Returns address, public key, nickname, and index. The mnemonic is never returned.
- Active account— One account is active at a time.wallet_switch_accountchanges it by nickname or index. All signing and query tools operate on the active account.
- Transaction signing(wallet_sign_transaction) — Reads the mnemonic from the DB, signs in memory, returns only the signed blob.
- Data signing(wallet_sign_data) — Signs arbitrary hex data using raw Ed25519 via the@noble/curveslibrary (no Algorand SDK prefix). Useful for off-chain authentication.
- Asset opt-in(wallet_optin_asset) — Creates, signs, and submits an opt-in transaction for the active account in one step.
Backward compatibility (silent migration from OS keychain)
Older installs of this MCP stored mnemonics in the OS keychain (@napi-rs/keyring). On first startup after upgrading, the server runs a one-shot, silent migration:
- For everyaccountsrow whosemnemoniccolumn isNULLor empty, it attempts to read the mnemonic from the OS keychain under the service namealgorand-mcpkeyed by the address.
- If found, the mnemonic is copied into the DB column.
- The original keychain entry is left in place as a redundant backup; nothing is deleted.
After this completes, the DB is the sole source of truth. The keychain is consulted only as a fallback if the DB still has aNULLmnemonic for an address (e.g., the keychain was unavailable during startup and became available later). All new accounts created after the upgrade are written directly to the DB and never touch the keychain.
Orphan handling (archive, not delete).If anaccountsrow exists but its mnemonic isn't in the keychainandisn't already in the DB (e.g., the user copiedwallet.dbto a new machine without also moving the keychain entries, restored from a partial backup, or installed in Docker where the keychain never existed), that row is unusable for signing. Rather than delete it, the server marks the row asarchived(UPDATE accounts SET archived = 1 WHERE mnemonic IS NULL OR mnemonic = ''). Archived rows:
- arehidden from the defaultwallet_list_accountsresponse
- never become the active account(the active-account index is clamped to the end of the remaining active list, or reset to0if no active accounts remain)
- keep theiroriginal nickname(a partial unique indexidx_active_nicknameenforces nickname uniqueness only among active rows, so a newwallet_add_accountcan reuse the same nickname for a fresh keypair)
- aresurfaced viawallet_list_accounts { archived: true }for forensics or future recovery
Archiving is silent at the MCP tool layer. The only diagnostic is a one-line stderr log per failed keychain read ([algorand-mcp] keychain read failed for <addr>…: <msg>), so if a user investigates a false archive they can see whether the keychain threw "no entry" vs "access denied" vs "no DBus" etc.
No user action is required for any of this. No prompts, no env vars, no migration tools.
The DB schema evolves additively via an idempotent migration that runs at startup:
The v2→v3 step recreates theaccountstable (SQLite cannot drop a column-level UNIQUE constraint via ALTER) and copies data forward witharchived = 0. Existing wallets keep working unchanged.
This MCP implements the Algorand flavor of x402, where payments are USDC (or native ALGO) transfers on Algorand. It exposes two tools that collapse the seven-step manual flow (probe → parse → opt-in check → build fee payer → build payment → group → sign → encode → header → retry) into a single tool call.
Agent (LLM) algorand-mcp Endpoint Facilitator ────────── ──────────── ──────── ─────────── │ │ │ │ │ make_http_request_ │ │ │ │ with_x402 { url, ... } │ │ │ │ ────────────────────────► │ HTTP request │ │ │ │ ─────────────────────────► │ │ │ │ 402 PaymentRequired │ │ │ │ ◄───────────────────────── │ │ │ │ pick accepts[i] for │ │ │ │ Algorand network │ │ │ │ build fee-payer + payment │ │ │ │ (atomic group of 2) │ │ │ │ sign payment leg │ │ │ │ via agent wallet DB │ │ │ │ encode unsigned fee-payer │ │ │ │ base64 PAYMENT-SIGNATURE │ │ │ │ ─────────────────────────► │ │ │ │ HTTP request + │ forward + settle │ │ │ PAYMENT-SIGNATURE │ ───────────────────────► │ │ │ │ sign fee-payer, │ │ │ │ submit atomic group │ │ │ 200 + resource │ ◄─────────────────────── │ │ │ ◄───────────────────────── │ │ │ ◄─ { result, paid: {...}}│ │ │ │ │ │ │
What's different from the Coinbase/EVM version
- Header name isPAYMENT-SIGNATURE, notX-PAYMENT. The header body is base64-encoded JSON withx402Version,scheme,network(a CAIP-2 identifier likealgorand:wGHE2Pw…for mainnet), apayload, and a verbatim copy of theaccepts[]entry the client chose.
- Payment is an atomic 2-transaction group.Index 0 is a fee-payer transaction (sender = facilitator, amount = 0, fee = 2000 µAlgo for the whole group); index 1 is the actual USDC ASA transfer (sender = wallet, fee = 0). The wallet signs only index 1 — the facilitator signs index 0 server-side at settlement. The user's wallet pays only the USDC, not even network fees.
- Network strings are Algorand CAIP-2.This MCP recognizes mainnet (wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=) and testnet (SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=). Endpoints that only accept Base, Solana, or other non-Algorand networks are not satisfiable here and the tool returns a clear error.
Coinbase Wallet MCP compatibility (x402 surface)
The x402 tools —make_http_request_with_x402andx402_discover_payment_requirements— are intentionally name- and shape-compatible with the Coinbase Wallet MCP's x402 tools. The input parameters (baseURL,path,method,queryParams,body,headers,correlationId,maxAmountPerRequest,paymentRequirements,preferredNetwork,extensions) are the same. The output envelope (result,_atomicUnitsNote) is the same.
- Drop-in for Algorand x402.Agents and MCP apps written against the Coinbase Wallet MCP's x402 tools work against this server without any prompt changes — they just hit Algorand x402 endpoints instead of Base/Solana ones.
- Same agent reflexes.Models trained on tool-call traces from the Coinbase ecosystem use these tools correctly on first call. Nothing to relearn.
- Compatibility is scoped to the x402 surface only.The wallet, account, transaction-building, and DEX tools in this MCP are Algorand-specific and do not mirror Coinbase's wallet API. Onlymake_http_request_with_x402andx402_discover_payment_requirementsare drop-in compatible.
The one parameter that necessarily differs:preferredNetworkacceptsmainnet | testnet | localnetonly (Algorand networks), because the wallet only signs Algorand transactions. Coinbase's enum listsbase | base-sepolia | solana | solana-devnet. Agents that pass one of those values get a clear error indicating no Algorand-payable accepts entry exists.
# Step 1 (optional): peek at the cost x402_discover_payment_requirements { "baseURL": "https://example.x402.goplausible.xyz", "path": "/weather", "method": "GET" } # returns: { result: { accepts: [{ scheme: "exact", network: "algorand:SGO1...", # maxAmountRequired: "100", asset: "10458941", # payTo: "AAAA...", extra: { feePayer: "BBBB..." } }] } } # Step 2: pay and fetch in one call make_http_request_with_x402 { "baseURL": "https://example.x402.goplausible.xyz", "path": "/weather", "method": "GET", "maxAmountPerRequest": 10000, "preferredNetwork": "testnet" } # returns: { result: <weather payload>, paid: { network: "testnet", # asset: "10458941", # amount: "100", payTo: "AAAA..." }, # paymentResponse: <decoded X-PAYMENT-RESPONSE> }
The active wallet account must be opted into the target ASA (e.g. USDC) and hold enough balance to covermaxAmountRequired. If it isn't opted in, the payment fails at settlement — opt in first withwallet_optin_asset.
- An active wallet account exists (wallet_get_infoto verify)
- That account is opted into the payment asset (USDC mainnet ASA31566704, testnet ASA10458941)
- The account has enough of the payment asset formaxAmountRequired
- The endpoint'saccepts[]includes at least one entry with an Algorand network the MCP recognizes
Environment variables are only needed for special setups. Pass them via theenvblock in your MCP config.
{ "mcpServers": { "algorand-mcp": { "command": "node", "args": ["/path/to/algorand-mcp/dist/index.js"], "env": { "ALGORAND_LOCALNET_URL": "http://localhost:4001", "ALGORAND_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } } } }
Then use"network": "localnet"in your tool calls.
SeeSecure Walletfor full architecture details.
Seex402 HTTP Paymentsfor the full protocol explanation.
Live, current-state reads against an Algod node.Default choice for account/application/asset lookups— the matching indexer endpoints were intentionally disabled to keep the tool surface lean (see.notes/redundant-tools-report.md). Use the indexer family below only when you need historical or filtered queries that algod cannot serve.
Historical / filtered queries against an Algorand Indexer instance. Use these for time-range scans, paginated searches, log retrieval, and creator/holder discovery — anything algod's current-state endpoints cannot answer.
Seven indexer endpoints that duplicated algod equivalents (account-by-id, account assets, account app local states, application by id, application box, application boxes, asset by id) were intentionally disabled. They live commented-out insrc/tools/apiManager/indexer/and can be re-enabled in one place if needed.
Pera Wallet tools aremainnet only— the Pera public API does not support testnet or localnet.
Trade on-chain prediction markets (YES/NO outcomes) denominated in USDC. All prices and quantities use microunits (1,000,000 = $1.00 or 1 share). Read-only tools work without a wallet; trading tools require an active wallet account.
Optional env var:ALPHA_API_KEY— needed for reward market data.ALPHA_API_BASE_URL— custom API endpoint (default:https://platform.alphaarcade.com/api).
The server exposes MCP resources for direct data access. Wallet resources are described in theSecure Walletsection above.
algorand-mcp/ ├── src/ # TypeScript source │ ├── index.ts # Server entry point │ ├── networkConfig.ts # Hardcoded network URLs and client factories │ ├── algorand-client.ts # Re-exports from networkConfig │ ├── env.ts # Legacy env shim (unused) │ ├── types.ts # Shared types (Zod schemas) │ ├── resources/ # MCP Resources │ │ ├── knowledge/ # Documentation taxonomy │ │ └── wallet/ # Wallet resources │ ├── tools/ # MCP Tools │ │ ├── commonParams.ts # Network + pagination schema fragments │ │ ├── walletManager.ts # Agent wallet (SQLite-backed) │ │ ├── accountManager.ts # Account operations │ │ ├── utilityManager.ts # Utility functions │ │ ├── algodManager.ts # TEAL compile, simulate, submit │ │ ├── arc26Manager.ts # ARC-26 URI generation │ │ ├── knowledgeManager.ts # Knowledge document access │ │ ├── transactionManager/ # Transaction building │ │ │ ├── accountTransactions.ts │ │ │ ├── assetTransactions.ts │ │ │ ├── appTransactions/ │ │ │ └── generalTransaction.ts │ │ └── apiManager/ # API integrations │ │ ├── algod/ # Algod API │ │ ├── indexer/ # Indexer API │ │ ├── nfd/ # NFDomains │ │ ├── tinyman/ # Tinyman AMM │ │ ├── hayrouter/ # Haystack Router DEX aggregator │ │ ├── pera/ # Pera Wallet verified assets │ │ └── alpha/ # Alpha Arcade prediction markets │ └── utils/ │ └── responseProcessor.ts # Pagination and formatting ├── tests/ # Test suite │ ├── helpers/ # Shared test utilities │ │ ├── mockFactories.ts # Mock algod/indexer/keychain factories │ │ ├── testConfig.ts # Category enable/disable logic │ │ ├── e2eSetup.ts # E2E account provisioning + invokeTool() │ │ └── testConstants.ts # Well-known testnet addresses and asset IDs │ ├── unit/ # 11 unit test suites (mocked, fast) │ ├── e2e/ # 11 E2E test suites (live testnet) │ │ ├── globalSetup.ts # Account provisioning + fund-check │ │ └── globalTeardown.ts # Cleanup │ └── jest.config.e2e.js # E2E-specific Jest config ├── dist/ # Compiled output ├── jest.config.js # Unit test Jest config ├── tsconfig.json # Production TypeScript config ├── tsconfig.test.json # Test TypeScript config └── package.json
All tool responses follow the MCP content format. API responses include automatic pagination when datasets exceeditemsPerPage(default 10):
{ "data": { ... }, "metadata": { "totalItems": 100, "itemsPerPage": 10, "currentPage": 1, "totalPages": 10, "hasNextPage": true, "pageToken": "eyJ..." } }
PasspageTokenfrom a previous response to fetch the next page. SetitemsPerPageon any tool call to control page size.
# Install dependencies npm install # Type-check npm run typecheck # Build npm run build # Clean build output npm run clean
The project has a comprehensive dual-layer test suite: fastunit tests(mocked, no network) and realE2E tests(live testnet). Both useJest 29withts-jestand ESM support.
npm test # Unit tests (fast, no network) npm run test:e2e # E2E tests (testnet, generates account + fund link) npm run test:all # Both
Unit tests cover all 11 tool categories with fully mocked network dependencies. They run in parallel and finish in ~5 seconds. No environment variables or funded accounts are needed.
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





