A Model Context Protocol (MCP) server that provides tools and resources for AI agents to interact with the Algorand blockchain. Built on Cloudflare Workers with HashiCorp Vault-based wallet management and multi-provider OAuth authentication.
Algorand Remote MCP bridges AI agents and the Algorand blockchain ecosystem through a standardized MCP interface. It enables AI systems to manage wallets, create and submit transactions, swap tokens via DEX aggregators, and access blockchain data — all without requiring deep blockchain expertise.
This is a remote MCP implementation running on Cloudflare Workers with:
- HashiCorp Vault for secure Ed25519 key storage and transaction signing
- Multi-provider OAuth (Google, GitHub, Twitter, LinkedIn) for user authentication
- algosdk v3.5.2 for Algorand SDK operations
- Haystack Router for best-price DEX aggregation across Tinyman, Pact, Folks, and LST protocols
- Tinyman SDK for direct DEX swap operations
- Alpha Arcade SDK for prediction market trading (orderbooks, limit/market orders, positions)
Prerequisites: Node.js v16+, an OAuth account (Google, GitHub, Twitter, or LinkedIn)
Add to your MCP client configuration:
{
"mcpServers": {
"algorand-remote-mcp": {
"command": "npx",
"args": [
"mcp-remote",
"https://algorandmcp.goplausible.xyz/sse"
]
}
}
}
Restart your LLM agent and prompt:
Read Algorand MCP skill.
┌─────────────────────────────────────────────────────────────────────────────┐
│ AI Agents / LLM Clients │
│ (Claude, GPT, Cursor, Windsurf, etc.) │
└─────────────────────────────┬───────────────────────────────────────────────┘
│ MCP Protocol (SSE / Streamable HTTP)
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Cloudflare Workers — Edge Runtime │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ OAuthProvider Layer │ │
│ │ Google · GitHub · Twitter · LinkedIn (Multi-provider) │ │
│ └───────────────────────────┬───────────────────────────────────────────┘ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ AlgorandRemoteMCP (McpAgent / McpServer) │ │
│ │ │ │
│ │ ┌─────────────── Tool Managers ───────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ walletManager ─── accountManager ─── utilityManager │ │ │
│ │ │ transactionManager/ │ │ │
│ │ │ ├── generalTransaction (pay, sign, submit, keyreg) │ │ │
│ │ │ ├── assetTransactions (ASA create, optin, transfer) │ │ │
│ │ │ ├── appTransactions (create, update, delete, call) │ │ │
│ │ │ └── groupTransactions (atomic groups) │ │ │
│ │ │ algodManager ─── knowledgeManager │ │ │
│ │ │ arc26Manager ─── receiptManager ─── ap2Manager │ │ │
│ │ │ tinymanManager ─── alphaArcadeManager │ │ │
│ │ │ apiManager/ │ │ │
│ │ │ ├── algod/ (account, application, asset, txn queries) │ │ │
│ │ │ ├── indexer/ (search & lookup across all data types) │ │ │
│ │ │ ├── hayrouter/ (DEX aggregator — quote, swap, optin) │ │ │
│ │ │ └── nfd/ (Algorand Name Service lookups) │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────── Resources ───────────────────────────────────────┐ │ │
│ │ │ algorand://remote-mcp-skill (Skill definition) │ │ │
│ │ │ algorand://knowledge/taxonomy (Knowledge base) │ │ │
│ │ │ algorand://knowledge/taxonomy/{cat} (Category docs) │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────── Utils ───────────────────────────────────────────┐ │ │
│ │ │ ResponseProcessor (pagination, BigInt-safe JSON) │ │ │
│ │ │ vaultManager (Vault API client) │ │ │
│ │ │ Skill.js (skill content) │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────── Cloudflare Bindings ────────────────────────────────────┐ │
│ │ Durable Objects (session state) · KV (OAuth tokens, client reg) │ │
│ │ R2 Bucket (knowledge documents) · Service Bindings (Vault worker) │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
└──────────┬──────────────────┬──────────────────┬──────────────────┬─────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌──────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐
│ HashiCorp Vault │ │ Algorand Node │ │ DEX & Markets │ │ External APIs│
│ (CF Worker) │ │ (Algod + │ │ │ │ │
│ │ │ Indexer) │ │ Haystack │ │ NFD API │
│ Ed25519 keypair │ │ │ │ Router │ │ Pera API │
│ generation │ │ Nodely.io / │ │ ┌──────────┐ │ │ Alpha Arcade │
│ Transit engine │ │ AlgoNode │ │ │ Tinyman │ │ │ API │
│ signing │ │ │ │ │ Pact │ │ │ │
│ No private key │ │ MainNet / │ │ │ Folks │ │ │ │
│ exposure │ │ TestNet │ │ │ LST │ │ │ │
│ │ │ │ │ └──────────┘ │ │ │
└──────────────────┘ └────────────────┘ │ │ └───────────────┘
│ Tinyman SDK │
│ Alpha Arcade │
│ SDK │
└────────────────┘
- AlgorandRemoteMCP: Main MCP agent extending McpAgent on Cloudflare Workers
- OAuthProvider: Multi-provider authentication layer (Google, GitHub, Twitter, LinkedIn)
- Tool Managers: 15 specialized managers covering accounts, wallets, transactions, assets, applications, APIs, DEX operations, prediction markets, ARC-26 URIs, receipts, AP2 protocol, and knowledge
- Resource Providers: URI-based access to skill definition and knowledge base via R2
- ResponseProcessor: Standardized response formatting with pagination and BigInt-safe serialization
- HashiCorp Vault: Ed25519 keypair generation and secure signing via Transit engine — no private key exposure
- Cloudflare Bindings: Durable Objects for session state, KV for OAuth, R2 for knowledge docs, Service Bindings for Vault worker
| Tool | Description |
|---|
sdk_create_algorand_keypair | Create a new Algorand keypair (not wallet-linked) |
sdk_mnemonic_to_address_and_secretkey | Get address and secret key from a mnemonic |
sdk_address_to_public_key | Get the public key for an Algorand address |
sdk_check_account_balance | Check account balance in ALGO |
| Tool | Description |
|---|
wallet_get_info | Get account information including address, publicKey, balance, and assets (replaces wallet_get_address and wallet_get_publickey) |
wallet_get_role | Get the role UUID for the configured wallet to be used to login into Hashicorp Vault with OIDC |
wallet_get_assets | Get assets held by the wallet |
wallet_reset_account | Reset wallet and generate new keys (destructive) |
wallet_logout | Logout from OAuth provider |
| Tool | Description |
|---|
sdk_txn_payment_transaction | Create a payment transaction |
wallet_sign_transaction | Sign a transaction using vault keys |
sdk_sign_transaction | Sign a transaction using a mnemonic |
sdk_submit_transaction | Submit a signed transaction to the network |
sdk_txn_key_registration_transaction | Create a key registration transaction |
sdk_assign_group_id | Assign group ID for atomic execution |
sdk_create_atomic_group | Create an atomic transaction group (pay, axfer, acfg, appl, afrz, keyreg) |
wallet_sign_atomic_group | Sign an atomic group using vault keys |
sdk_sign_atomic_group | Sign an atomic group using a mnemonic |
sdk_submit_atomic_group | Submit a signed atomic group |
sdk_send_raw_transaction | Submit raw signed transactions |
| Tool | Description |
|---|
sdk_txn_create_asset | Create a new Algorand Standard Asset (ASA) |
sdk_txn_asset_optin | Opt-in to an ASA |
wallet_usdc_optin | Opt-in agent wallet to USDC (vault-signed) |
sdk_txn_transfer_asset | Transfer an ASA |
| Tool | Description |
|---|
sdk_txn_create_application | Create a new smart contract |
sdk_txn_update_application | Update an existing smart contract |
sdk_txn_delete_application | Delete a smart contract |
sdk_txn_closeout_application | Close out from an application |
sdk_txn_clear_application | Clear application state |
sdk_txn_call_application | Call a smart contract (noop, optin, closeout, clear, delete) |
sdk_optin_application | Opt-in to an application |
| Tool | Description |
|---|
haystack_get_swap_quote | Get best-price swap quote across multiple DEXes and LST protocols |
haystack_execute_swap | Execute an optimized swap: quote, vault-sign, submit, confirm |
haystack_needs_optin | Check if an address needs to opt-in to an asset before swapping |
| Tool | Description |
|---|
tinyman_fixed_input_swap | Execute a swap with a fixed input amount |
tinyman_fixed_output_swap | Execute a swap with a fixed output amount |
| Tool | Description |
|---|
algod_get_account_info | Get account balance, assets, and auth address |
algod_get_account_application_info | Get account-specific application info |
algod_get_account_asset_info | Get account-specific asset info |
algod_get_application_info | Get application details |
algod_get_application_box_value | Get application box contents |
algod_get_application_boxes | List application boxes |
algod_get_application_state | Get application global state |
algod_get_asset_info | Get asset details |
algod_get_asset_holding | Get asset holding for an account |
algod_get_pending_txn_info | Get pending transaction details |
algod_get_pending_transactions | Get pending transactions from mempool |
| Tool | Description |
|---|
pera_asset_verification_status | Get verification status of an asset |
pera_verified_asset_details | Get detailed asset information from Pera |
pera_verified_asset_search | Search verified assets by name, unit name, or creator |
| Tool | Description |
|---|
indexer_lookup_account_assets | Get account assets |
indexer_lookup_account_app_local_states | Get account app local states |
indexer_lookup_account_created_apps | Get applications created by an account |
indexer_lookup_account_transactions | Get transactions for an account |
indexer_search_for_accounts | Search accounts with filters |
indexer_lookup_application_logs | Get application log messages |
indexer_search_for_applications | Search applications |
indexer_lookup_asset_balances | Get holders of a specific asset |
indexer_search_for_assets | Search assets |
indexer_lookup_transaction_by_id | Get transaction details |
indexer_search_for_transactions | Search transactions |
| Tool | Description |
|---|
api_nfd_get_nfd | Get NFD domain information by name |
api_nfd_get_nfds_for_address | Get all NFD domains owned by an address |
| Tool | Description |
|---|
sdk_compile_teal | Compile TEAL source code |
sdk_disassemble_teal | Disassemble TEAL bytecode |
| Tool | Description |
|---|
sdk_validate_address | Check if an Algorand address is valid |
sdk_encode_address | Encode a public key to an address |
sdk_decode_address | Decode an address to a public key |
sdk_app_address_by_id | Get the address for an application ID |
sdk_verify_bytes | Verify a signature against bytes |
sdk_sign_bytes | Sign bytes with a secret key |
algorand_mcp_skill | Access comprehensive Algorand MCP skill |
| Tool | Description |
|---|
generate_algorand_uri | Generate an ARC-26 compliant URI |
generate_algorand_qrcode | Generate a QR code for an Algorand URI |
generate_algorand_receipt | Generate a transaction receipt |
| Tool | Description |
|---|
generate_ap2_mandate | Create an AP2 intent, cart, or payment mandate with verifiable credentials |
| Tool | Description |
|---|
alpha_get_live_markets | Fetch all live prediction markets (title, prices, volume, multi-choice options) |
alpha_get_reward_markets | Fetch markets with liquidity rewards |
alpha_get_market | Get full details for a single market (on-chain + API) |
alpha_get_orderbook | Unified YES-perspective orderbook with spread calculation |
alpha_get_open_orders | Fetch open orders for a wallet on a specific market |
alpha_get_positions | Fetch all YES/NO token positions across markets |
alpha_create_limit_order | Place a limit order (price & quantity in microunits) |
alpha_create_market_order | Place a market order with auto-matching and slippage |
alpha_cancel_order | Cancel an open order and refund collateral |
alpha_amend_order | Edit an existing unfilled order in-place |
alpha_propose_match | Propose a match between a maker order and your wallet |
alpha_split_shares | Split USDC into equal YES + NO outcome tokens |
alpha_merge_shares | Merge YES + NO tokens back into USDC |
alpha_claim | Claim USDC from a resolved market by redeeming outcome tokens |
| Tool | Description |
|---|
get_knowledge_doc | Get markdown content for knowledge documents |
list_knowledge_docs | List available knowledge documents by category |
| URI | Description |
|---|
algorand://knowledge/taxonomy | Full taxonomy of knowledge resources |
algorand://knowledge/taxonomy/{category} | Category-specific resources (arcs, sdks, algokit, puya, etc.) |
| URI | Description |
|---|
algorand://remote-mcp-skill | Comprehensive Algorand MCP skill |
- Node.js v16+
- Cloudflare Workers account
- Algorand node access (e.g., Nodely.io / AlgoNode)
- OAuth credentials (Google, GitHub, Twitter, and/or LinkedIn)
- HashiCorp Vault worker for secure key management
ALGORAND_NETWORK=mainnet
ALGORAND_ALGOD=https://your-algod-node.com
ALGORAND_INDEXER=https://your-indexer-node.com
ALGORAND_TOKEN=your-api-token
NFD_API_URL=https://api.nf.domains
HAYSTACK_API_KEY=your-haystack-api-key
ALPHA_API_KEY=your-alpha-arcade-api-key # Optional, enables richer market data
ALPHA_API_BASE_URL=https://platform.alphaarcade.com/api # Optional, default shown
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
HCV_WORKER_URL=https://your-hashicorp-vault-worker.workers.dev
npm run dev # Start local development server
npm run type-check # Run TypeScript type checking
npm run deploy # Deploy to Cloudflare Workers
npm run format # Format code with Biome
npm run lint:fix # Lint and auto-fix with Biome
- Clone the repository
- Install dependencies:
npm install
- Configure environment variables in
wrangler.toml
- Deploy:
npm run deploy
- User authenticates via OAuth (Google, GitHub, Twitter, or LinkedIn)
- Server creates or retrieves wallet credentials from HashiCorp Vault
- User accesses tools and resources through the MCP interface
- User can logout using
wallet_logout
- Create transaction (e.g.,
sdk_txn_payment_transaction)
- Sign with vault (
wallet_sign_transaction) or mnemonic (sdk_sign_transaction)
- Submit to network (
sdk_submit_transaction)
- Create group (
sdk_create_atomic_group)
- Sign group (
wallet_sign_atomic_group or sdk_sign_atomic_group)
- Submit group (
sdk_submit_atomic_group)
- Get best-price quote (
haystack_get_swap_quote)
- Execute swap — quotes, vault-signs, submits, and confirms in one call (
haystack_execute_swap)
- Execute fixed-input or fixed-output swap (
tinyman_fixed_input_swap / tinyman_fixed_output_swap)
- Browse markets (
alpha_get_live_markets)
- Check orderbook (
alpha_get_orderbook)
- Place order (
alpha_create_limit_order or alpha_create_market_order)
- Monitor positions (
alpha_get_positions) and open orders (alpha_get_open_orders)
- Manage orders — amend (
alpha_amend_order) or cancel (alpha_cancel_order)
- Claim winnings from resolved markets (
alpha_claim)
src/
├── index.ts # Main entry point
├── types.ts # Type definitions
├── oauth-handler.ts # OAuth authentication handler
├── workers-oauth-utils.ts # OAuth utilities
├── resources/
│ ├── skill/ # Skill resource
│ └── knowledge/ # Knowledge base resources
├── tools/
│ ├── accountManager.ts # Account management
│ ├── algodManager.ts # Algorand node tools
│ ├── ap2Manager.ts # AP2 protocol tools
│ ├── arc26Manager.ts # ARC-26 URI and QR tools
│ ├── knowledgeManager.ts # Knowledge base tools
│ ├── receiptManager.ts # Transaction receipt tools
│ ├── tinymanManager.ts # Tinyman DEX tools
│ ├── alphaArcadeManager.ts # Alpha Arcade prediction market tools
│ ├── utilityManager.ts # Utility tools
│ ├── walletManager.ts # Wallet management tools
│ ├── apiManager/
│ │ ├── algod/ # Algod API tools (account, application, asset, transaction)
│ │ ├── hayrouter/ # Haystack Router DEX aggregator tools
│ │ ├── indexer/ # Indexer API tools (account, application, asset, transaction)
│ │ └── nfd/ # NFD name service tools
│ └── transactionManager/
│ ├── generalTransaction.ts # Payment, signing, submission, key registration
│ ├── appTransactions.ts # Application (smart contract) transactions
│ ├── assetTransactions.ts # Asset create, optin, transfer
│ └── groupTransactions.ts # Atomic transaction groups
└── utils/
├── Skill.js # Skill content
├── vaultManager.ts # HashiCorp Vault integration
└── responseProcessor.ts # Response formatting and pagination
| Package | Version | Purpose |
|---|
algosdk | ^3.5.2 | Algorand JavaScript SDK |
@txnlab/haystack-router | ^2.0.5 | DEX aggregator for best-price swaps |
@tinymanorg/tinyman-js-sdk | ^5.1.2 | Tinyman DEX SDK |
@alpha-arcade/sdk | latest | Prediction market trading SDK |
@modelcontextprotocol/sdk | ^1.12.1 | MCP protocol SDK |
agents | ^0.0.95 | Cloudflare Agents SDK |
algo-msgpack-with-bigint | ^2.1.1 | MessagePack with BigInt support |
- Fork the repository
- Create your feature branch:
git checkout -b feature/my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin feature/my-new-feature
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.