Algorand MCP服务器
](https://www.npmjs.com/package/@goplausible/algorand-mcp) ](https://www.npmjs.com/package/@goplausible/algorand-mcp) 
全面 模型上下文协议(MCP) 服务器,使AI代理和LLM能够完全访问Algorand区块链。建造于 很可能.
Algorand是一个碳负、纯权益证明的第1层区块链,具有即时终结性、低费用,并内置了对智能合约(AVM)、标准资产(ASA)和原子交易的支持。
什么是MCP?
模型上下文协议 是一个开放标准,允许人工智能应用程序连接到外部工具和数据源。该服务器将Algorand区块链操作作为MCP工具公开,任何兼容的AI客户端都可以使用这些工具——Claude Desktop、Claude Code、Cursor、Windsurf等。
特性
- 通过操作系统钥匙链进行安全的钱包管理——私钥永远不会暴露给代理或LLM
- 钱包账户昵称、津贴和每日限额,用于安全支出控制
- 帐户创建、密钥管理和密钥更新
- 交易构建、签署和提交(支付、资产、应用程序、密钥注册)
- 原子事务组
- TEAL编译和拆卸
- 完整的Algod和Indexer API访问
- NFDomains(NFD)名称服务集成
- Algorand的x402和AP2插件
- Tinyman AMM集成(池、掉期、流动性)
- Haystack Router DEX聚合(Tinyman、Pact、Folks之间的最佳价格互换)
- Alpha Arcade预测市场交易(浏览市场、订单簿、限价/市价单、头寸、索赔)
- ARC-26 URI和二维码生成
- Algorand知识库,具有完整的开发人员文档分类
- 按工具调用网络选择(主网、测试网、本地网)和分页
需求
- Node.js v20或更高版本
- npm、pnpm或yarn
安装
来自npm
npm install -g @goplausible/algorand-mcp来源
git clone https://github.com/GoPlausible/algorand-mcp.git
cd algorand-mcp
npm install
npm run buildMCP配置
服务器运行超时 标准。有三种方法可以调用它——选择适合您设置的方法:
| 方法 | 命令 | 何时使用 |
|---|---|---|
| npx (推荐) | npx @goplausible/algorand-mcp | 无需安装,始终为最新版本 |
| 全局安装 | algorand-mcp | 之后 npm install -g @goplausible/algorand-mcp |
| 绝对路径 | node /path/to/dist/index.js | 从源代码或本地克隆构建 |
不需要环境变量 用于标准使用。每次工具调用都会动态处理网络选择、分页和节点URL。
______________________________________________________________________
龙虾
无需手动配置--安装 @goplausible/openclaw-algorand-plugin npm包和Algorand MCP服务器自动配置:
npm install -g @goplausible/openclaw-algorand-plugin______________________________________________________________________
克劳德桌面版
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):
使用npx:
{
"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"]
}
}
}______________________________________________________________________
克劳德代码
创建 .mcp.json 在项目根目录(项目范围)中,或 ~/.claude.json (用户范围):
{
"mcpServers": {
"algorand-mcp": {
"type": "stdio",
"command": "npx",
"args": ["@goplausible/algorand-mcp"]
}
}
}或者以交互方式添加:
claude mcp add algorand-mcp -- npx @goplausible/algorand-mcp______________________________________________________________________
光标
通过添加 设置>MCP服务器,或编辑 .cursor/mcp.json 在项目根目录中:
{
"mcpServers": {
"algorand-mcp": {
"command": "npx",
"args": ["@goplausible/algorand-mcp"]
}
}
}______________________________________________________________________
帆板运动
通过添加 设置>MCP,或编辑 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"algorand-mcp": {
"command": "npx",
"args": ["@goplausible/algorand-mcp"]
}
}
}______________________________________________________________________
VS代码/GitHub副本
编辑 .vscode/mcp.json 在您的工作区根目录中,或打开 设置>MCP服务器:
{
"servers": {
"algorand-mcp": {
"type": "stdio",
"command": "npx",
"args": ["@goplausible/algorand-mcp"]
}
}
}______________________________________________________________________
克莱恩
通过添加 MCP服务器 Cline侧边栏中的面板,或编辑 ~/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命令行界面
创建 .codex/mcp.json 在您的项目根目录中或 ~/.codex/mcp.json 对于全球范围:
{
"mcpServers": {
"algorand-mcp": {
"command": "npx",
"args": ["@goplausible/algorand-mcp"]
}
}
}______________________________________________________________________
打开代码
编辑 ~/.config/opencode/config.json:
{
"mcp": {
"algorand-mcp": {
"type": "stdio",
"command": "npx",
"args": ["@goplausible/algorand-mcp"]
}
}
}______________________________________________________________________
任何兼容MCP的客户端
服务器使用标准MCP stdio协议。对于上面未列出的任何客户端,请使用以下配置:
- 命令:
npx(或algorand-mcp如果全局安装,或node /path/to/dist/index.js) - Args:
["@goplausible/algorand-mcp"](适用于npx) - 运输:
stdio
网络选择
每个工具都接受一个可选 network 参数: "mainnet" (默认), "testnet",或 "localnet"。Algod和Indexer URL是通过以下方式为主网和测试网内置的 .
示例工具调用:
{ "name": "api_algod_get_account_info", "arguments": { "address": "ABC...", "network": "testnet" } }如果不 network 提供,工具默认为 主网.
分页
API响应自动分页。每个工具都接受一个可选 itemsPerPage 参数(默认值:10)。通过 pageToken 从之前的响应中提取下一页。
安全钱包
建筑
钱包系统有两层存储,每层都有不同的安全作用:
| 层 | 它存储什么 | 在哪里 | 加密 |
|---|---|---|---|
| OS钥匙扣 | 助记词(密钥) | macOS Keychain/Linux libsecret/Windows凭据管理器 | 操作系统管理,硬件支持(如果可用) |
| 嵌入式SQLite | 账户元数据(昵称、津贴、支出跟踪) | ~/.algorand-mcp/wallet.db | 明文(无秘密) |
私钥材料从未出现在工具响应、MCP配置文件、环境变量或日志中。 代理只看到地址、公钥和已签名的事务blob。
运作原理
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) │
│ │ │- 帐户创建 (
wallet_add_account)--生成一个密钥对,将助记符存储在操作系统密钥链中,并将元数据(昵称、支出限制)存储在SQLite中。退货 仅 地址和公钥。 - 活动帐户 --一次只有一个帐户处于活动状态。
wallet_switch_account通过昵称或索引进行更改。所有签名和查询工具都在活动帐户上运行。 - 交易签名 (
wallet_sign_transaction)--检查每笔交易和每日支出限制,从密钥链中检索密钥,在内存中签名,丢弃密钥。仅返回已签名的blob。 - 数据签名 (
wallet_sign_data)--使用原始Ed25519通过以下方式对任意十六进制数据进行签名@noble/curves库(无Algorand SDK前缀)。可用于链下身份验证。 - 资产选择加入 (
wallet_optin_asset)--一步创建、签署和提交活动帐户的选择加入交易。
支出限额
每个帐户都有两个可配置的限制(在microAlgos中,0=无限制):
allowance--每笔交易的最大金额。拒绝任何超过此值的交易。dailyAllowance--所有交易中每个日历日的最大总支出。午夜自动重置。在SQLite中跟踪。
平台钥匙链支持
钥匙链后端由提供 @napi-rs/keyring (基于Rust的预构建二进制文件):
| 平台 | 后端 |
|---|---|
| macOS | 钥匙链服务(系统钥匙链应用程序) |
| Linux | libsecret(GNOME密钥环)或KWallet |
| Windows | Windows凭据管理器 |
所有凭据都存储在服务名称下 algorand-mcp。您可以使用操作系统钥匙链应用程序(例如macOS上的钥匙链访问)检查它们。
可选环境变量
只有特殊设置才需要环境变量。通过 env MCP配置中的块。
| 变量 | 描述 | 默认值 | 需要时 |
|---|---|---|---|
ALGORAND_TOKEN | 用于私有/已验证节点的API令牌 | "" | 连接到私有Algod/Indexer节点 |
ALGORAND_LOCALNET_URL | 本地网基本URL | "" | 使用 network: "localnet" (例如。 http://localhost:4001) |
ALPHA_API_KEY | Alpha Arcade API密钥 | "" | 访问奖励市场数据 |
示例:本地网(AlgoKit)
{
"mcpServers": {
"algorand-mcp": {
"command": "node",
"args": ["/path/to/algorand-mcp/dist/index.js"],
"env": {
"ALGORAND_LOCALNET_URL": "http://localhost:4001",
"ALGORAND_TOKEN": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
}
}
}然后使用 "network": "localnet" 在您的工具调用中。
可用工具
钱包工具(10个工具)
看 安全钱包 了解完整的架构细节。
| 工具 | 说明 |
|---|---|
wallet_add_account | 创建一个带有昵称和支出限制的新Algorand帐户(仅返回地址+公钥) |
wallet_remove_account | 通过昵称或索引从钱包中删除帐户 |
wallet_list_accounts | 列出所有带有昵称、地址和限制的帐户 |
wallet_switch_account | 按昵称或索引切换活动帐户 |
wallet_get_info | 获取信息 此MCP服务器拥有的活动帐户 (钥匙链支持):地址、公钥、余额、已选择计数,加上仅钱包字段(津贴、每日津贴、每日支出)。用于任意链上帐户 api_algod_get_account_info. |
wallet_get_assets | 获取ASA持有的所有资产 此MCP服务器拥有的活动帐户.对于任意链上帐户使用 api_algod_get_account_info 或 api_algod_get_account_asset_info. |
wallet_sign_transaction | 使用活动账户签署单笔交易(强制执行支出限制) |
wallet_sign_transaction_group | 使用活动帐户对一组交易进行签名(自动分配组ID) |
wallet_sign_data | 使用原始Ed25519(贵族,无SDK前缀)对任意十六进制数据进行签名 |
wallet_optin_asset | 将活动帐户选择为资产(创建、签名和提交) |
账户管理(8个工具)
| 工具 | 说明 |
|---|---|
create_account | 创建一个新的Algorand帐户(返回地址+明文助记符) |
rekey_account | 将帐户重新键入新地址 |
mnemonic_to_mdk | 将助记符转换为主派生密钥 |
mdk_to_mnemonic | 将主派生密钥转换为助记符 |
secret_key_to_mnemonic | 将密钥转换为助记符 |
mnemonic_to_secret_key | 将助记符转换为密钥 |
seed_from_mnemonic | 从助记符生成种子 |
mnemonic_from_seed | 从种子生成助记符 |
实用工具(13个工具)
| 工具 | 说明 |
|---|---|
ping | 服务器连接检查和信息 |
validate_address | 检查Algorand地址是否有效 |
encode_address | 将公钥编码为Algorand地址 |
decode_address | 将Algorand地址解码为公钥 |
get_application_address | 获取给定应用程序ID的地址 |
bytes_to_bigint | 将字节转换为BigInt |
bigint_to_bytes | 将BigInt转换为字节 |
encode_uint64 | 将uint64编码为字节 |
decode_uint64 | 将字节解码为uint64 |
verify_bytes | 根据字节验证签名 |
sign_bytes | 用密钥对字节进行签名 |
encode_obj | 将对象编码为msgpack |
decode_obj | 将msgpack解码为对象 |
交易工具(18个工具)
| 工具 | 说明 |
|---|---|
make_payment_txn | 创建付款交易 |
make_keyreg_txn | 创建密钥注册事务 |
make_asset_create_txn | 创建资产创建交易 |
make_asset_config_txn | 创建资产配置事务 |
make_asset_destroy_txn | 创建资产销毁交易 |
make_asset_freeze_txn | 创建资产冻结交易 |
make_asset_transfer_txn | 创建资产转移交易 |
make_app_create_txn | 创建应用程序创建事务 |
make_app_update_txn | 创建应用程序更新事务 |
make_app_delete_txn | 创建应用程序删除事务 |
make_app_optin_txn | 创建应用程序选择加入交易 |
make_app_closeout_txn | 创建应用程序关闭事务 |
make_app_clear_txn | 创建应用程序清除状态事务 |
make_app_call_txn | 创建应用程序调用事务 |
assign_group_id | 为原子事务分配组ID |
sign_transaction | 使用密钥签署交易 |
encode_unsigned_transaction | 将未签名的事务编码为base64 msgpack字节 |
decode_signed_transaction | 将已签名的事务blob解码回带有签名详细信息的JSON |
算法工具(5个工具)
| 工具 | 说明 |
|---|---|
compile_teal | 编译TEAL源代码 |
disassemble_teal | 将TEAL字节码反汇编到源代码 |
send_raw_transaction | 将已签名的交易提交到网络 |
simulate_raw_transactions | 模拟已编码的事务(base64字节)。仅通过/失败+记录/成本——无跟踪,无额外预算。 |
simulate_transactions | 使用完整的模拟解码事务组 SimulateRequest config(跟踪、额外的操作码预算、未命名的资源处理、未签名的txns)。 |
Algod API工具(13个工具)
实时、当前状态读取Algod节点。 帐户/应用程序/资产查找的默认选择 --有意禁用匹配的索引器端点以保持刀具表面倾斜(请参见 .notes/redunda-tools-report.md).仅当您需要algod无法提供的历史查询或筛选查询时,才使用下面的索引器系列。
| 工具 | 说明 |
|---|---|
api_algod_get_account_info | 获取账户余额、资产和身份验证地址 |
api_algod_get_account_application_info | 获取特定帐户的应用程序信息 |
api_algod_get_account_asset_info | 获取账户特定资产信息 |
api_algod_get_application_by_id | 获取应用程序信息 |
api_algod_get_application_box | 按名称获取应用程序框 |
api_algod_get_application_boxes | 获取所有应用程序框 |
api_algod_get_asset_by_id | 获取资产信息 |
api_algod_get_pending_transaction | 获取待处理交易信息 |
api_algod_get_pending_transactions_by_address | 获取某个地址的待处理交易 |
api_algod_get_pending_transactions | 获取所有待处理交易 |
api_algod_get_transaction_params | 获取建议的交易参数 |
api_algod_get_node_status | 获取当前节点状态 |
api_algod_get_node_status_after_block | 获取特定轮次后的节点状态 |
索引器API工具(10个工具)
对Algorand Indexer实例的历史/过滤查询。将这些用于时间范围扫描、分页搜索、日志检索和创建者/持有者发现——任何algod当前状态端点都无法回答的问题。
故意禁用了七个重复算法等效项的索引器端点(逐个id的帐户、帐户资产、帐户应用程序本地状态、逐个id的应用程序、应用程序框、应用程序盒、逐个id资产)。他们在现场发表了评论 src/tools/apiManager/indexer/ 如果需要,可以在一个地方重新启用。
| 工具 | 说明 |
|---|---|
api_indexer_lookup_account_created_applications | 获取按帐户创建的应用程序 |
api_indexer_search_for_accounts | 使用过滤器搜索账户(资产/应用持有量、余额范围) |
api_indexer_lookup_application_logs | 获取一轮范围内的应用程序日志消息 |
api_indexer_search_for_applications | 按创建者搜索应用程序 |
api_indexer_lookup_asset_balances | 获取持有资产的所有账户及其余额 |
api_indexer_lookup_asset_transactions | 获取涉及资产的交易(时间/轮次/地址角色筛选器) |
api_indexer_search_for_assets | 按创建者、名称或单位搜索资产 |
api_indexer_lookup_transaction_by_id | 通过ID获取已确认的交易 |
api_indexer_lookup_account_transactions | 获取账户的交易历史记录(时间/轮次/类型/资产过滤器) |
api_indexer_search_for_transactions | 使用过滤器搜索整个链中的交易 |
NFDomains工具(6个工具)
| 工具 | 说明 |
|---|---|
api_nfd_get_nfd | 按名称或应用程序ID获取NFD |
api_nfd_get_nfds_for_addresses | 获取特定地址的NFD |
api_nfd_get_nfd_activity | 获取NFD的活动/更改 |
api_nfd_get_nfd_analytics | 获取NFD分析数据 |
api_nfd_browse_nfds | 使用过滤器浏览NFD |
api_nfd_search_nfds | 搜索NFD |
Tinyman AMM工具(9个工具)
| 工具 | 说明 |
|---|---|
api_tinyman_get_pool | 按资产对获取池信息 |
api_tinyman_get_pool_analytics | 获取池分析 |
api_tinyman_get_pool_creation_quote | 获取创建池的报价 |
api_tinyman_get_liquidity_quote | 获取增加流动性的报价 |
api_tinyman_get_remove_liquidity_quote | 获取取消流动性的报价 |
api_tinyman_get_swap_quote | 获取交换资产的报价 |
api_tinyman_get_asset_optin_quote | 获取资产选择加入报价 |
api_tinyman_get_validator_optin_quote | 获取验证器选择加入的报价 |
api_tinyman_get_validator_optout_quote | 获取验证器退出报价 |
Haystack路由器工具(3个工具)
| 工具 | 说明 |
|---|---|
api_haystack_get_swap_quote | 通过Tinyman V2、Pact、Folks和LST协议的路由获得优化的交换报价 |
api_haystack_execute_swap | 多功能互换:报价→ 签名(通过钱包)→ 提交→ 确认 |
api_haystack_needs_optin | 在交换之前检查地址是否需要资产选择加入 |
Pera钱包工具(3个工具)
| 工具 | 说明 |
|---|---|
api_pera_asset_verification_status | 获取主网资产的验证状态(已验证、可信、可疑、未知) |
api_pera_verified_asset_details | 从Pera获取详细的资产信息(名称、单位、徽标、小数、验证) |
api_pera_verified_asset_search | 按名称、单位名称或关键字搜索Pera验证的资产 |
Pera钱包工具 仅限主网 -Pera公共API不支持testnet或localnet。
阿尔法街机工具(14个工具)
以美元计价的连锁预测市场交易(是/否结果)。所有价格和数量均使用微单位(1000000=1.00美元或1股)。只读工具无需钱包即可使用;交易工具需要一个活跃的钱包账户。
| 工具 | 说明 |
|---|---|
alpha_get_live_markets | 获取所有包含价格、交易量和类别的实时预测市场 |
alpha_get_reward_markets | 获取具有流动性奖励的市场(需要 ALPHA_API_KEY ) 。 |
alpha_get_market | 按应用程序ID获取单个市场的完整详细信息 |
alpha_get_orderbook | 具有点差计算的统一YES透视订单簿 |
alpha_get_open_orders | 在特定市场上打开钱包订单 |
alpha_get_positions | 是/否所有市场的代币头寸 |
alpha_create_limit_order | 以特定价格下达限价订单(锁定~0.957 ALGO抵押品) |
alpha_create_market_order | 下达具有自动匹配和滑差容忍度的市价订单 |
alpha_cancel_order | 取消未结订单(退还USDC/代币和ALGO抵押品) |
alpha_amend_order | 编辑现有的未完成订单(价格、数量、滑点) |
alpha_propose_match | 在现有的制造商订单和您的钱包之间进行匹配 |
alpha_split_shares | 将USDC拆分为相等的YES+NO结果代币 |
alpha_merge_shares | 将相等的YES+NO代币合并回USDC |
alpha_claim | 通过兑换中奖代币从已解决的市场中领取USDC |
可选环境变量:ALPHA_API_KEY--需要奖励市场数据。ALPHA_API_BASE_URL-自定义API端点(默认值:https://platform.alphaarcade.com/api).
ARC-26 URI工具(1个工具)
| 工具 | 说明 |
|---|---|
generate_algorand_qrcode | 根据ARC-26规范生成Algorand URI和QR码 |
知识工具(1个工具)
| 工具 | 说明 |
|---|---|
get_knowledge_doc | 获取Algorand知识文档的降价内容 |
资源
服务器公开MCP资源以进行直接数据访问。钱包资源在 安全钱包 上面的部分。
知识资源
| URI | 描述 |
|---|---|
algorand://knowledge/taxonomy | 完整的Algorand知识分类 |
algorand://knowledge/taxonomy/arcs | Algorand征求意见 |
algorand://knowledge/taxonomy/sdks | SDK文档 |
algorand://knowledge/taxonomy/algokit | AlgoKit文档 |
algorand://knowledge/taxonomy/algokit-utils | AlgoKit Utils文档 |
algorand://knowledge/taxonomy/tealscript | TEALScript文档 |
algorand://knowledge/taxonomy/puya | Puya文件 |
algorand://knowledge/taxonomy/liquid-auth | Liquid Auth文件 |
algorand://knowledge/taxonomy/python | Python SDK文档 |
algorand://knowledge/taxonomy/developers | 开发人员文档 |
algorand://knowledge/taxonomy/clis | CLI工具文档 |
algorand://knowledge/taxonomy/nodes | 节点管理文档 |
algorand://knowledge/taxonomy/details | 技术细节文件 |
项目结构
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
│ │ └── 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响应格式
所有工具响应均遵循MCP内容格式。当数据集超过时,API响应包括自动分页 itemsPerPage (默认值10):
{
"data": { ... },
"metadata": {
"totalItems": 100,
"itemsPerPage": 10,
"currentPage": 1,
"totalPages": 10,
"hasNextPage": true,
"pageToken": "eyJ..."
}
}通过 pageToken 从之前的响应中提取下一页。集 itemsPerPage 在任何工具调用中控制页面大小。
发展
# Install dependencies
npm install
# Type-check
npm run typecheck
# Build
npm run build
# Clean build output
npm run clean测试
快速开始
npm test # Unit tests (fast, no network)
npm run test:e2e # E2E tests (testnet, generates account + fund link)
npm run test:all # Both单元测试
单元测试涵盖了所有11个具有完全模拟网络依赖关系的工具类别。他们平行奔跑,约5秒后结束。不需要环境变量或资金账户。
npm test新闻报道: 11个套件,75+个测试,涵盖每个工具类别的成功路径、错误处理和边缘情况。
| 套件 | 测试内容 |
|---|---|
accountManager | 帐户创建、助记符往返、密钥参数验证 |
utilityManager | Ping、地址验证、编码/解码、对字节进行签名/验证、对对象进行编码/解码 |
walletManager | 完整生命周期:添加→ list → 开关→ 获取信息→ 符号数据→ 移除(模拟钥匙链+SQLite) |
transactionManager | 支付、资产、应用交易建设;签名交易;assign_group_id |
algodManager | TEAL编译/反汇编、发送原始数据、模拟 |
apiAlgod | 具有正确模拟路由的所有13个算法API工具 |
apiIndexer | 所有10个活动索引器API工具,带有流畅的生成器模型 |
apiNfd | NFD使用模拟抓取进行获取/搜索/浏览 |
apiTinyman | Tinyman池/带错误处理的交换 |
arc26Manager | ARC-26 URI生成和二维码SVG输出 |
knowledgeManager | 知识文档检索和缺失文档错误处理 |
嘲讽是如何运作的
单元测试使用 jest.unstable_mockModule() (ESM兼容)在加载之前拦截导入。共享 tests/helpers/mockFactory.ts 提供:
setupNetworkMocks()--替换algorand-client.ts使用模拟algod/indexer客户端,无需任何网络调用即可返回确定性响应。createKeychainMock()--替换@napi-rs/keyring在记忆中Map,因此钱包测试在没有操作系统钥匙链的情况下工作。- Fluent代理模拟 --Algorand的Indexer SDK使用构建器模式(
.searchForAssets().limit(5).do()).模拟工厂使用ESProxy为任何链式方法返回自身并在以下情况下解析的对象.do()被称为。
E2E测试
E2E测试直接调用工具处理程序 Algorand测试网 (通过 公共节点)。它们连续运行以避免速率限制。
npm run test:e2e首次运行时(未提供助记符),测试设置:
- 生成新的Algorand帐户
- 打印地址和助记符
- 打印基金链接:https://lora.algokit.io/testnet/fund
- 运行所有测试(无资金支持的测试仍然通过)
要使用资金账户运行:
E2E_MNEMONIC="word1 word2 ... word25" npm run test:e2e新闻报道: 11个套件,35+个测试,涵盖真实的网络交互。
| 套件 | 测试内容 |
|---|---|
account | 账户创建,助记键到密钥往返链 |
utility | Ping、地址验证、编码/解码、对字节进行签名/验证、对对象进行编码/解码 |
wallet | 完整钱包生命周期:添加→ list → 开关→ 获取信息→ 获取资产→ 符号数据→ 删除 |
transaction | 构建付款→ sign → 验证txID;构建资产选择加入;使用assign_group_id构建组 |
algod | 编译+拆卸TEAL往返 |
algodApi | 账户信息、建议参数、节点状态、通过算法获取的资产信息 |
indexerApi | 通过索引器进行账户查找、资产/交易/账户搜索 |
nfd | 查找“algo.algo”,搜索NFD,浏览NFD |
tinyman | 获取ALGO/USDC池 |
arc26 | 生成arc-26型,验证格式+QR SVG |
knowledge | 检索已知知识文档内容 |
类别激活
E2E测试可以通过环境变量按类别或单个工具选择性启用。 默认情况下,所有类别都已启用。
启用特定类别
E2E_WALLET=1 npm run test:e2e # Only wallet tests
E2E_ALGOD=1 E2E_UTILITY=1 npm run test:e2e # Algod + utility tests可用类别标志
| 环境变量 | 类别 |
|---|---|
E2E_ALL=1 | 所有类别(明确) |
E2E_WALLET=1 | 钱包工具 |
E2E_ACCOUNT=1 | 账户工具 |
E2E_UTILITY=1 | 实用工具 |
E2E_TRANSACTION=1 | 交易工具 |
E2E_ALGOD=1 | Algod工具 |
E2E_ALGOD_API=1 | Algod API工具 |
E2E_INDEXER_API=1 | 索引器API工具 |
E2E_NFD=1 | NFDomains工具 |
E2E_TINYMAN=1 | Tinyman工具 |
E2E_ARC26=1 | ARC-26工具 |
E2E_KNOWLEDGE=1 | 知识工具 |
重要提示: 设置任何单个标志(例如。 E2E_WALLET=1)禁用所有其他类别,除非 E2E_ALL=1 也设置了。
启用特定工具
E2E_TOOLS=ping,validate_address npm run test:e2e这 E2E_TOOLS 变量接受逗号分隔的工具名称列表。只有这些特定工具的测试才会运行。
测试文件结构
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 configJest配置
| 配置 | 目的 | 关键设置 |
|---|---|---|
jest.config.js (根) | 单元测试 | testTimeout: 10s、平行工作者, testMatch: tests/unit/** |
tests/jest.config.e2e.js | E2E测试 | testTimeout: 60s, maxWorkers: 1 (串行), globalSetup/globalTeardown |
tsconfig.test.json | 用于测试的TypeScript | rootDir: ".",包括两者 src/ 和 tests/ |
编写新测试
单元测试模板:
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测试模板:
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();
});
});依赖项
- algosdk v3——Algorand JavaScript SDK
- @模型上下文协议/sdk --MCP TypeScript SDK
- @napi rs/钥匙圈 --本机操作系统密钥链访问(macOS密钥链、Linux libsecret、Windows凭据管理器)
- sql.js --用于钱包元数据持久化的嵌入式SQLite(WASM)
- @贵族/曲线 --纯JS Ed25519用于原始数据签名(
wallet_sign_data) - @tinymanorg/tinymanjs-sdk --Tinyman AMM SDK
- @阿尔法街机/sdk --阿尔法街机预测市场SDK
- 黄道带 --运行时类型验证
- 二维码 --ARC-26二维码生成
许可证
麻省理工学院
