JUHE API Marketplace
GoPlausible avatar
MCP Server

Algorand MCP

A comprehensive MCP server for tooling interactions(100+) and resource accessibility(Algorand Knowledge, embedded wallets,...) on the Algorand blockchain, plus many useful prompts.

40
GitHub Stars
3/10/2026
Last Updated
MCP Server Configuration
1{
2 "name": "algorand-mcp",
3 "command": "npx",
4 "args": [
5 "@goplausible/algorand-mcp"
6 ]
7}
JSON7 lines
  1. Home
  2. MCP Servers
  3. algorand-mcp

README Documentation

Algorand MCP Server

A comprehensive Model Context Protocol (MCP) server that gives AI agents and LLMs full access to the Algorand blockchain. Built by GoPlausible.

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.

What is MCP?

Model Context Protocol is an open standard that lets AI applications connect to external tools and data sources. This server exposes Algorand blockchain operations as MCP tools that any compatible AI client can use — Claude Desktop, Claude Code, Cursor, Windsurf, and others.

Features

  • Secure wallet management via OS keychain — private keys never exposed to agents or LLMs
  • Wallet accounts nicknames, allowances, and daily limits for safe spending control
  • 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 and AP2 toolins for Algorand
  • Tinyman AMM integration (pools, swaps, liquidity)
  • 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

Requirements

  • Node.js v20 or later
  • npm, pnpm, or yarn

Installation

From npm

npm install -g @goplausible/algorand-mcp

From source

git clone https://github.com/GoPlausible/algorand-mcp.git
cd algorand-mcp
npm install
npm run build

MCP Configuration

The server runs over stdio. There are three ways to invoke it — pick whichever suits your setup:

MethodCommandWhen to use
npx (recommended)npx @goplausible/algorand-mcpNo install needed, always latest version
Global installalgorand-mcpAfter npm install -g @goplausible/algorand-mcp
Absolute pathnode /path/to/dist/index.jsBuilt from source or local clone

No environment variables are required for standard use. Network selection, pagination, and node URLs are all handled dynamically per tool call.


OpenClaw

No manual configuration needed — install the @goplausible/openclaw-algorand-plugin npm package and the Algorand MCP server is configured automatically:

npm install -g @goplausible/openclaw-algorand-plugin

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

Using npx:

{
  "mcpServers": {
    "algorand-mcp": {
      "command": "npx",
      "args": ["@goplausible/algorand-mcp"]
    }
  }
}

Using global install:

{
  "mcpServers": {
    "algorand-mcp": {
      "command": "algorand-mcp"
    }
  }
}

Using absolute path:

{
  "mcpServers": {
    "algorand-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/algorand-mcp/dist/index.js"]
    }
  }
}

Claude Code

Create .mcp.json in your project root (project scope) or ~/.claude.json (user scope):

{
  "mcpServers": {
    "algorand-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": ["@goplausible/algorand-mcp"]
    }
  }
}

Or add interactively:

claude mcp add algorand-mcp -- npx @goplausible/algorand-mcp

Cursor

Add via Settings > MCP Servers, or edit .cursor/mcp.json in your project root:

{
  "mcpServers": {
    "algorand-mcp": {
      "command": "npx",
      "args": ["@goplausible/algorand-mcp"]
    }
  }
}

Windsurf

Add via Settings > MCP, or edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "algorand-mcp": {
      "command": "npx",
      "args": ["@goplausible/algorand-mcp"]
    }
  }
}

VS Code / GitHub Copilot

Edit .vscode/mcp.json in your workspace root, or open Settings > MCP Servers:

{
  "servers": {
    "algorand-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": ["@goplausible/algorand-mcp"]
    }
  }
}

Cline

Add via the MCP Servers panel 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
    }
  }
}

OpenAI Codex CLI

Create .codex/mcp.json in your project root or ~/.codex/mcp.json for global scope:

{
  "mcpServers": {
    "algorand-mcp": {
      "command": "npx",
      "args": ["@goplausible/algorand-mcp"]
    }
  }
}

Open Code

Edit ~/.config/opencode/config.json:

{
  "mcp": {
    "algorand-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": ["@goplausible/algorand-mcp"]
    }
  }
}

Any MCP-compatible client

The server speaks the standard MCP stdio protocol. For any client not listed above, configure it with:

  • Command: npx (or algorand-mcp if globally installed, or node /path/to/dist/index.js)
  • Args: ["@goplausible/algorand-mcp"] (for npx)
  • Transport: stdio

Network Selection

Every tool accepts an optional network parameter: "mainnet" (default), "testnet", or "localnet". Algod and Indexer URLs are built-in for mainnet and testnet via AlgoNode.

Example tool call:

{ "name": "api_algod_get_account_info", "arguments": { "address": "ABC...", "network": "testnet" } }

If no network is provided, tools default to mainnet.

Pagination

API responses are automatically paginated. Every tool accepts an optional itemsPerPage parameter (default: 10). Pass the pageToken from a previous response to fetch the next page.

Secure Wallet

Architecture

The wallet system has two layers of storage, each with a distinct security role:

LayerWhat it storesWhereEncryption
OS KeychainMnemonics (secret keys)macOS Keychain / Linux libsecret / Windows Credential ManagerOS-managed, hardware-backed where available
Embedded SQLiteAccount metadata (nicknames, allowances, spend tracking)~/.algorand-mcp/wallet.dbPlaintext (no secrets)

Private key material never appears in tool responses, MCP config files, environment variables, or logs. The agent only sees addresses, public keys, and signed transaction blobs.

How it works

  Agent (LLM)                    MCP Server                     Storage
  ──────────                     ──────────                     ───────
       │                              │                              │
       │  wallet_add_account          │                              │
       │  { nickname: "main" }        │                              │
       │ ──────────────────────────►  │  generate keypair            │
       │                              │  store mnemonic ──────────►  │  OS Keychain (encrypted)
       │                              │  store metadata ──────────►  │  SQLite (nickname, limits)
       │  ◄─ { address, publicKey }   │                              │
       │                              │                              │
       │  wallet_sign_transaction     │                              │
       │  { transaction: {...} }      │                              │
       │ ──────────────────────────►  │  check spending limits       │
       │                              │  retrieve mnemonic ◄──────  │  OS Keychain
       │                              │  sign in memory              │
       │  ◄─ { txID, blob }          │  (key discarded)             │
       │                              │                              │
  1. Account creation (wallet_add_account) — Generates a keypair (or imports a mnemonic), stores the mnemonic in the OS keychain, and stores metadata (nickname, spending limits) in SQLite. Returns only address and public key.
  2. Active account — One account is active at a time. wallet_switch_account changes it by nickname or index. All signing and query tools operate on the active account.
  3. Transaction signing (wallet_sign_transaction) — Checks per-transaction and daily spending limits, retrieves the key from the keychain, signs in memory, discards the key. Returns only the signed blob.
  4. Data signing (wallet_sign_data) — Signs arbitrary hex data using raw Ed25519 via the @noble/curves library (no Algorand SDK prefix). Useful for off-chain authentication.
  5. Asset opt-in (wallet_optin_asset) — Creates, signs, and submits an opt-in transaction for the active account in one step.

Spending limits

Each account has two configurable limits (in microAlgos, 0 = unlimited):

  • allowance — Maximum amount per single transaction. Rejects any transaction exceeding this.
  • dailyAllowance — Maximum total spend per calendar day across all transactions. Automatically resets at midnight. Tracked in SQLite.

Platform keychain support

The keychain backend is provided by @napi-rs/keyring (Rust-based, prebuilt binaries):

PlatformBackend
macOSKeychain Services (the system Keychain app)
Linuxlibsecret (GNOME Keyring) or KWallet
WindowsWindows Credential Manager

All credentials are stored under the service name algorand-mcp. You can inspect them with your OS keychain app (e.g. Keychain Access on macOS).

Optional Environment Variables

Environment variables are only needed for special setups. Pass them via the env block in your MCP config.

VariableDescriptionDefaultWhen needed
ALGORAND_TOKENAPI token for private/authenticated nodes""Connecting to a private Algod/Indexer node
ALGORAND_LOCALNET_URLLocalnet base URL""Using network: "localnet" (e.g. http://localhost:4001)

Example: localnet (AlgoKit)

{
  "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.

Available Tools

Wallet Tools (10 tools)

See Secure Wallet for full architecture details.

ToolDescription
wallet_add_accountCreate a new Algorand account with nickname and spending limits (returns address + public key only)
wallet_remove_accountRemove an account from the wallet by nickname or index
wallet_list_accountsList all accounts with nicknames, addresses, and limits
wallet_switch_accountSwitch the active account by nickname or index
wallet_get_infoGet active account info: address, public key, balance, and spending limits
wallet_get_assetsGet all asset holdings for the active account
wallet_sign_transactionSign a single transaction with the active account (enforces spending limits)
wallet_sign_transaction_groupSign a group of transactions with the active account (auto-assigns group ID)
wallet_sign_dataSign arbitrary hex data with raw Ed25519 (noble, no SDK prefix)
wallet_optin_assetOpt the active account into an asset (creates, signs, and submits)

Account Management (8 tools)

ToolDescription
create_accountCreate a new Algorand account (returns address + mnemonic in the clear)
rekey_accountRekey an account to a new address
mnemonic_to_mdkConvert mnemonic to master derivation key
mdk_to_mnemonicConvert master derivation key to mnemonic
secret_key_to_mnemonicConvert secret key to mnemonic
mnemonic_to_secret_keyConvert mnemonic to secret key
seed_from_mnemonicGenerate seed from mnemonic
mnemonic_from_seedGenerate mnemonic from seed

Utility Tools (13 tools)

ToolDescription
pingServer connectivity check and info
validate_addressCheck if an Algorand address is valid
encode_addressEncode a public key to an Algorand address
decode_addressDecode an Algorand address to a public key
get_application_addressGet address for a given application ID
bytes_to_bigintConvert bytes to BigInt
bigint_to_bytesConvert BigInt to bytes
encode_uint64Encode uint64 to bytes
decode_uint64Decode bytes to uint64
verify_bytesVerify signature against bytes
sign_bytesSign bytes with a secret key
encode_objEncode object to msgpack
decode_objDecode msgpack to object

Transaction Tools (18 tools)

ToolDescription
make_payment_txnCreate a payment transaction
make_keyreg_txnCreate a key registration transaction
make_asset_create_txnCreate an asset creation transaction
make_asset_config_txnCreate an asset configuration transaction
make_asset_destroy_txnCreate an asset destroy transaction
make_asset_freeze_txnCreate an asset freeze transaction
make_asset_transfer_txnCreate an asset transfer transaction
make_app_create_txnCreate an application creation transaction
make_app_update_txnCreate an application update transaction
make_app_delete_txnCreate an application delete transaction
make_app_optin_txnCreate an application opt-in transaction
make_app_closeout_txnCreate an application close-out transaction
make_app_clear_txnCreate an application clear state transaction
make_app_call_txnCreate an application call transaction
assign_group_idAssign group ID for atomic transactions
sign_transactionSign a transaction with a secret key
encode_unsigned_transactionEncode an unsigned transaction to base64 msgpack bytes
decode_signed_transactionDecode a signed transaction blob back to JSON with signature details

Algod Tools (5 tools)

ToolDescription
compile_tealCompile TEAL source code
disassemble_tealDisassemble TEAL bytecode to source
send_raw_transactionSubmit signed transactions to the network
simulate_raw_transactionsSimulate raw transactions
simulate_transactionsSimulate transactions with detailed config

Algod API Tools (13 tools)

ToolDescription
api_algod_get_account_infoGet account balance, assets, and auth address
api_algod_get_account_application_infoGet account-specific application info
api_algod_get_account_asset_infoGet account-specific asset info
api_algod_get_application_by_idGet application information
api_algod_get_application_boxGet application box by name
api_algod_get_application_boxesGet all application boxes
api_algod_get_asset_by_idGet asset information
api_algod_get_pending_transactionGet pending transaction info
api_algod_get_pending_transactions_by_addressGet pending transactions for an address
api_algod_get_pending_transactionsGet all pending transactions
api_algod_get_transaction_paramsGet suggested transaction parameters
api_algod_get_node_statusGet current node status
api_algod_get_node_status_after_blockGet node status after a specific round

Indexer API Tools (17 tools)

ToolDescription
api_indexer_lookup_account_by_idGet account information
api_indexer_lookup_account_assetsGet account assets
api_indexer_lookup_account_app_local_statesGet account app local states
api_indexer_lookup_account_created_applicationsGet apps created by account
api_indexer_search_for_accountsSearch accounts with filters
api_indexer_lookup_applicationsGet application information
api_indexer_lookup_application_logsGet application log messages
api_indexer_search_for_applicationsSearch applications
api_indexer_lookup_application_boxGet application box by name
api_indexer_lookup_application_boxesGet all application boxes
api_indexer_lookup_asset_by_idGet asset info and configuration
api_indexer_lookup_asset_balancesGet asset holders and balances
api_indexer_lookup_asset_transactionsGet transactions for an asset
api_indexer_search_for_assetsSearch assets
api_indexer_lookup_transaction_by_idGet transaction by ID
api_indexer_lookup_account_transactionsGet account transaction history
api_indexer_search_for_transactionsSearch transactions

NFDomains Tools (6 tools)

ToolDescription
api_nfd_get_nfdGet NFD by name or application ID
api_nfd_get_nfds_for_addressesGet NFDs for specific addresses
api_nfd_get_nfd_activityGet activity/changes for NFDs
api_nfd_get_nfd_analyticsGet NFD analytics data
api_nfd_browse_nfdsBrowse NFDs with filters
api_nfd_search_nfdsSearch NFDs

Tinyman AMM Tools (9 tools)

ToolDescription
api_tinyman_get_poolGet pool info by asset pair
api_tinyman_get_pool_analyticsGet pool analytics
api_tinyman_get_pool_creation_quoteGet quote for creating a pool
api_tinyman_get_liquidity_quoteGet quote for adding liquidity
api_tinyman_get_remove_liquidity_quoteGet quote for removing liquidity
api_tinyman_get_swap_quoteGet quote for swapping assets
api_tinyman_get_asset_optin_quoteGet quote for asset opt-in
api_tinyman_get_validator_optin_quoteGet quote for validator opt-in
api_tinyman_get_validator_optout_quoteGet quote for validator opt-out

Haystack Router Tools (3 tools)

ToolDescription
api_haystack_get_swap_quoteGet optimized swap quote with routing across Tinyman V2, Pact, Folks, and LST protocols
api_haystack_execute_swapAll-in-one swap: quote → sign (via wallet) → submit → confirm
api_haystack_needs_optinCheck if address needs asset opt-in before swapping

Pera Wallet Tools (3 tools)

ToolDescription
api_pera_asset_verification_statusGet verification status of a mainnet asset (verified, trusted, suspicious, unknown)
api_pera_verified_asset_detailsGet detailed asset info from Pera (name, unit, logo, decimals, verification)
api_pera_verified_asset_searchSearch Pera verified assets by name, unit name, or keyword

Pera Wallet tools are mainnet only — the Pera public API does not support testnet or localnet.

ARC-26 URI Tools (1 tool)

ToolDescription
generate_algorand_uriGenerate Algorand URI and QR code per ARC-26 spec

Knowledge Tools (1 tool)

ToolDescription
get_knowledge_docGet markdown content for Algorand knowledge documents

Resources

The server exposes MCP resources for direct data access. Wallet resources are described in the Secure Wallet section above.

Knowledge Resources

URIDescription
algorand://knowledge/taxonomyFull Algorand knowledge taxonomy
algorand://knowledge/taxonomy/arcsAlgorand Request for Comments
algorand://knowledge/taxonomy/sdksSDK documentation
algorand://knowledge/taxonomy/algokitAlgoKit documentation
algorand://knowledge/taxonomy/algokit-utilsAlgoKit Utils documentation
algorand://knowledge/taxonomy/tealscriptTEALScript documentation
algorand://knowledge/taxonomy/puyaPuya documentation
algorand://knowledge/taxonomy/liquid-authLiquid Auth documentation
algorand://knowledge/taxonomy/pythonPython SDK documentation
algorand://knowledge/taxonomy/developersDeveloper documentation
algorand://knowledge/taxonomy/clisCLI tools documentation
algorand://knowledge/taxonomy/nodesNode management documentation
algorand://knowledge/taxonomy/detailsTechnical details documentation

Project Structure

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     # Secure wallet (keychain + SQLite)
│   │   ├── 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
│   └── 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

Response Format

All tool responses follow the MCP content format. API responses include automatic pagination when datasets exceed itemsPerPage (default 10):

{
  "data": { ... },
  "metadata": {
    "totalItems": 100,
    "itemsPerPage": 10,
    "currentPage": 1,
    "totalPages": 10,
    "hasNextPage": true,
    "pageToken": "eyJ..."
  }
}

Pass pageToken from a previous response to fetch the next page. Set itemsPerPage on any tool call to control page size.

Development

# Install dependencies
npm install

# Type-check
npm run typecheck

# Build
npm run build

# Clean build output
npm run clean

Testing

The project has a comprehensive dual-layer test suite: fast unit tests (mocked, no network) and real E2E tests (live testnet). Both use Jest 29 with ts-jest and ESM support.

Quick start

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

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.

npm test

Coverage: 11 suites, 75+ tests covering success paths, error handling, and edge cases for every tool category.

SuiteWhat it tests
accountManagerAccount creation, mnemonic round-trips, rekey parameter validation
utilityManagerPing, address validation, encode/decode, sign/verify bytes, encode/decode objects
walletManagerFull lifecycle: add → list → switch → get info → sign data → remove (mocked keychain + SQLite)
transactionManagerPayment, asset, app transaction building; sign_transaction; assign_group_id
algodManagerTEAL compile/disassemble, send raw, simulate
apiAlgodAll 13 algod API tools with correct mock routing
apiIndexerAll 17 indexer API tools with fluent builder mocks
apiNfdNFD get/search/browse with mocked fetch
apiTinymanTinyman pool/swap with error handling
arc26ManagerARC-26 URI generation and QR code SVG output
knowledgeManagerKnowledge document retrieval and missing-doc error handling
How mocking works

Unit tests use jest.unstable_mockModule() (ESM-compatible) to intercept imports before they load. The shared tests/helpers/mockFactories.ts provides:

  • setupNetworkMocks() — Replaces algorand-client.ts with mock algod/indexer clients that return deterministic responses without any network calls.
  • createKeychainMock() — Replaces @napi-rs/keyring with an in-memory Map, so wallet tests work without an OS keychain.
  • Fluent Proxy mocks — Algorand's Indexer SDK uses a builder pattern (.searchForAssets().limit(5).do()). The mock factory uses ES Proxy objects that return themselves for any chained method and resolve when .do() is called.

E2E tests

E2E tests call tool handlers directly against Algorand testnet (via AlgoNode public nodes). They run serially to avoid rate-limiting.

npm run test:e2e

On first run (no mnemonic provided), the test setup:

  1. Generates a new Algorand account
  2. Prints the address and mnemonic
  3. Prints a fund link: https://lora.algokit.io/testnet/fund
  4. Runs all tests (unfunded tests still pass)

To run with a funded account:

E2E_MNEMONIC="word1 word2 ... word25" npm run test:e2e

Coverage: 11 suites, 35+ tests covering real network interactions.

SuiteWhat it tests
accountAccount creation, mnemonic-to-key round-trip chain
utilityPing, address validation, encode/decode, sign/verify bytes, encode/decode objects
walletFull wallet lifecycle: add → list → switch → get info → get assets → sign data → remove
transactionBuild payment → sign → verify txID; build asset opt-in; build group with assign_group_id
algodCompile + disassemble TEAL round-trip
algodApiAccount info, suggested params, node status, asset info via algod
indexerApiAccount lookup, asset/transaction/account search via indexer
nfdLook up "algo.algo", search NFDs, browse NFDs
tinymanGet ALGO/USDC pool
arc26Generate ARC-26 URI, verify format + QR SVG
knowledgeRetrieve known knowledge doc content

Category activation

E2E tests can be selectively enabled by category or individual tool via environment variables. By default all categories are enabled.

Enable specific categories
E2E_WALLET=1 npm run test:e2e            # Only wallet tests
E2E_ALGOD=1 E2E_UTILITY=1 npm run test:e2e  # Algod + utility tests
Available category flags
Env varCategory
E2E_ALL=1All categories (explicit)
E2E_WALLET=1Wallet tools
E2E_ACCOUNT=1Account tools
E2E_UTILITY=1Utility tools
E2E_TRANSACTION=1Transaction tools
E2E_ALGOD=1Algod tools
E2E_ALGOD_API=1Algod API tools
E2E_INDEXER_API=1Indexer API tools
E2E_NFD=1NFDomains tools
E2E_TINYMAN=1Tinyman tools
E2E_ARC26=1ARC-26 tools
E2E_KNOWLEDGE=1Knowledge tools

Important: Setting any individual flag (e.g. E2E_WALLET=1) disables all other categories unless E2E_ALL=1 is also set.

Enable specific tools
E2E_TOOLS=ping,validate_address npm run test:e2e

The E2E_TOOLS variable accepts a comma-separated list of tool names. Only tests for those specific tools will run.

Test file structure

tests/
├── helpers/
│   ├── 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 files (*.test.ts)
│   ├── accountManager.test.ts
│   ├── utilityManager.test.ts
│   ├── walletManager.test.ts
│   ├── transactionManager.test.ts
│   ├── algodManager.test.ts
│   ├── apiAlgod.test.ts
│   ├── apiIndexer.test.ts
│   ├── apiNfd.test.ts
│   ├── apiTinyman.test.ts
│   ├── arc26Manager.test.ts
│   └── knowledgeManager.test.ts
├── e2e/                       # 11 E2E test files (*.e2e.test.ts)
│   ├── globalSetup.ts         # Account provisioning + fund-check
│   ├── globalTeardown.ts      # Cleanup
│   ├── account.e2e.test.ts
│   ├── utility.e2e.test.ts
│   ├── wallet.e2e.test.ts
│   ├── transaction.e2e.test.ts
│   ├── algod.e2e.test.ts
│   ├── algodApi.e2e.test.ts
│   ├── indexerApi.e2e.test.ts
│   ├── nfd.e2e.test.ts
│   ├── tinyman.e2e.test.ts
│   ├── arc26.e2e.test.ts
│   └── knowledge.e2e.test.ts
└── jest.config.e2e.js         # E2E-specific Jest config

Jest configuration

ConfigPurposeKey settings
jest.config.js (root)Unit teststestTimeout: 10s, parallel workers, testMatch: tests/unit/**
tests/jest.config.e2e.jsE2E teststestTimeout: 60s, maxWorkers: 1 (serial), globalSetup/globalTeardown
tsconfig.test.jsonTypeScript for testsrootDir: ".", includes both src/ and tests/

Writing new tests

Unit test template:

import { jest } from '@jest/globals';
import { setupNetworkMocks } from '../helpers/mockFactories.js';

jest.unstable_mockModule('../../src/algorand-client.js', () => setupNetworkMocks());

const { YourManager } = await import('../../src/tools/yourManager.js');

describe('YourManager', () => {
  it('does something', async () => {
    const result = await YourManager.handleTool('tool_name', { arg: 'value' });
    const data = JSON.parse(result.content[0].text);
    expect(data.field).toBeDefined();
  });
});

E2E test template:

import { describeIf, testConfig } from '../helpers/testConfig.js';
import { invokeTool, parseToolResponse } from '../helpers/e2eSetup.js';

describeIf(testConfig.isCategoryEnabled('your-category'))('Your Tools (E2E)', () => {
  it('does something on testnet', async () => {
    const data = parseToolResponse(
      await invokeTool('tool_name', { arg: 'value', network: 'testnet' }),
    );
    expect(data.field).toBeDefined();
  });
});

Dependencies

  • algosdk v3 — Algorand JavaScript SDK
  • @modelcontextprotocol/sdk — MCP TypeScript SDK
  • @napi-rs/keyring — Native OS keychain access (macOS Keychain, Linux libsecret, Windows Credential Manager)
  • sql.js — Embedded SQLite (WASM) for wallet metadata persistence
  • @noble/curves — Pure JS Ed25519 for raw data signing (wallet_sign_data)
  • @tinymanorg/tinyman-js-sdk — Tinyman AMM SDK
  • zod — Runtime type validation
  • qrcode — QR code generation for ARC-26

License

MIT

Quick Install

Quick Actions

View on GitHubView All Servers

Key Features

Model Context Protocol
Secure Communication
Real-time Updates
Open Source

Boost your projects with Wisdom Gate LLM API

Supporting GPT-5, Claude-4, DeepSeek v3, Gemini and more.

Enjoy a free trial and save 20%+ compared to official pricing.

Learn More
JUHE API Marketplace

Accelerate development, innovate faster, and transform your business with our comprehensive API ecosystem.

JUHE API VS

  • vs. RapidAPI
  • vs. API Layer
  • API Platforms 2025
  • API Marketplaces 2025
  • Best Alternatives to RapidAPI

For Developers

  • Console
  • Collections
  • Documentation
  • MCP Servers
  • Free APIs
  • Temp Mail Demo

Product

  • Browse APIs
  • Suggest an API
  • Wisdom Gate LLM
  • Global SMS Messaging
  • Temp Mail API

Company

  • What's New
  • Welcome
  • About Us
  • Contact Support
  • Terms of Service
  • Privacy Policy
Featured on Startup FameFeatured on Twelve ToolsFazier badgeJuheAPI Marketplace - Connect smarter, beyond APIs | Product Huntai tools code.marketDang.aiFeatured on ShowMeBestAI
Copyright © 2026 JUHEDATA HK LIMITED - All rights reserved