Are you the author? Sign in to claim
eForest skill for symbol, token, and NFT marketplace operations on aelf with MCP, CLI, SDK, and OpenClaw.
AI Agent Kit for aelf + eForest capabilities, exposed via CLI, MCP Server, and SDK.
Workflow:
aelf-forest-create-collectionaelf-forest-create-itemaelf-forest-batch-create-itemsaelf-forest-list-itemaelf-forest-buy-nowaelf-forest-make-offeraelf-forest-deal-offeraelf-forest-cancel-offeraelf-forest-cancel-listingaelf-forest-transfer-itemaelf-forest-get-price-quoteMethod (Contract):
aelf-forest-contract-marketaelf-forest-contract-multitokenaelf-forest-contract-token-adapteraelf-forest-contract-proxyMethod (API):
aelf-forest-api-marketaelf-forest-api-nftaelf-forest-api-collectionaelf-forest-api-syncaelf-forest-api-seed-auctionWorkflow:
aelf-forest-issue-itemaelf-forest-place-bidaelf-forest-claim-dropaelf-forest-query-dropaelf-forest-whitelist-readaelf-forest-whitelist-manageMethod (Contract):
aelf-forest-contract-auctionaelf-forest-contract-dropaelf-forest-contract-whitelistMethod (API):
aelf-forest-api-dropaelf-forest-api-whitelistWorkflow:
aelf-forest-ai-generateaelf-forest-ai-retryaelf-forest-create-platform-nftaelf-forest-miniapp-actionaelf-forest-update-profileaelf-forest-query-collectionsaelf-forest-watch-market-signalsMethod (Contract):
aelf-forest-contract-miniappMethod (API):
aelf-forest-api-aiaelf-forest-api-platformaelf-forest-api-miniappaelf-forest-api-useraelf-forest-api-systemaelf-forest-api-realtimegit clone https://github.com/eforest-finance/eforest-agent-skills.git
cd eforest-agent-skills
bun install
cp .env.example .env
# Edit .env and set network + signer fallback credentials
# Check SEED price (dry-run)
bun run cli buy-seed --symbol MYTOKEN --issuer <your-address> --dry-run
# Buy SEED (max 2 ELF)
bun run cli buy-seed --symbol MYTOKEN --issuer <your-address> --force 2
# Create token on tDVV side chain
bun run cli create-token \
--symbol MYTOKEN --token-name "My Token" \
--seed-symbol SEED-321 \
--total-supply 100000000 --decimals 8 \
--issue-chain tDVV
# Issue tokens
bun run cli issue-token \
--symbol MYTOKEN --amount 10000000000000000 \
--to <recipient-address> --chain tDVV
One-command setup:
# Claude Desktop
bun run setup claude
# Cursor IDE (project-level)
bun run setup cursor
# Cursor IDE (global)
bun run setup cursor --global
# IronClaw (install trusted skill + stdio MCP server)
bun run setup ironclaw
# Check status
bun run setup list
# Remove IronClaw integration
bun run setup uninstall ironclaw
The MCP server auto-registers both legacy tools and all aelf-forest-* tools from the skill registry.
# Install trusted skill + stdio MCP server
bun run setup ironclaw
# Remove IronClaw integration
bun run setup uninstall ironclaw
The IronClaw setup does two things by default:
~/.ironclaw/mcp-servers.jsonSKILL.md to ~/.ironclaw/skills/eforest-agent-skills/SKILL.mdImportant trust model note:
~/.ironclaw/installed_skills/ for this package if you need on-chain or marketplace write actions.This MCP server emits both standard MCP camelCase annotations and IronClaw-compatible snake_case annotations so the current IronClaw source can honor read/write hints.
Remote activation contract:
bunx -p @eforest-finance/agent-skills eforest-setup ironclawbunx -p @eforest-finance/agent-skills eforest-setup openclawEOA mode:
{
"mcpServers": {
"eforest-token": {
"command": "bun",
"args": ["run", "/path/to/eforest-agent-skills/src/mcp/server.ts"],
"env": {
"AELF_PRIVATE_KEY": "your_private_key",
"EFOREST_NETWORK": "mainnet"
}
}
}
}
CA mode:
{
"mcpServers": {
"eforest-token": {
"command": "bun",
"args": ["run", "/path/to/eforest-agent-skills/src/mcp/server.ts"],
"env": {
"PORTKEY_PRIVATE_KEY": "your_manager_private_key",
"PORTKEY_CA_HASH": "your_ca_hash",
"PORTKEY_CA_ADDRESS": "your_ca_address",
"EFOREST_NETWORK": "mainnet"
}
}
}
}
Write operations can resolve signer from shared wallet context first. Resolution order:
privateKey or CA tuple)~/.portkey/skill-wallet/context.v1.json)AELF_PRIVATE_KEY or PORTKEY_*)When context points to encrypted wallet/keystore, pass password in tool input or use:
PORTKEY_WALLET_PASSWORD for EOA wallet filesPORTKEY_CA_KEYSTORE_PASSWORD for CA keystore filesMethod API skills use route mapping from environment variables by default:
EFOREST_FOREST_API_ACTION_MAP_JSON (preferred)FOREST_API_ACTION_MAP_JSON (fallback)Example:
{
"aelf-forest-api-market": {
"fetchTokens": {
"method": "GET",
"path": "/app/market/tokens",
"auth": true
}
},
"aelf-forest-api-system": {
"fetchMyToken": {
"method": "GET",
"url": "https://www.eforest.finance/symbolmarket/api/app/token/my-token",
"auth": false,
"queryArrayFormat": "repeat"
}
},
"aelf-forest-api-sync": {
"fetchSyncCollection": {
"method": "POST",
"path": "/app/nft/sync",
"auth": true
}
}
}
fetchMyToken ships with a built-in default route to
https://www.eforest.finance/symbolmarket/api/app/token/my-token.
Environment route maps still override built-in defaults.
For endpoints like fetchMyToken that expect repeated query keys such as
AddressList=a&AddressList=b, set "queryArrayFormat": "repeat" in the route map.
import {
getNetworkConfig,
dispatchForestSkill,
listForestSkills,
} from '@eforest-finance/agent-skills';
const config = await getNetworkConfig({ env: 'mainnet' });
console.log('registered forest skills:', listForestSkills().length);
const quote = await dispatchForestSkill(
'aelf-forest-get-price-quote',
{
env: 'mainnet',
payload: {
symbol: 'MY-NFT',
include: ['tokenData', 'txFee'],
},
},
{ config },
);
if (!quote.success) {
console.error(quote.code, quote.message);
} else {
console.log(quote.data);
}
Successful response shape:
{
"success": true,
"code": "OK",
"data": {},
"warnings": [],
"traceId": "..."
}
Failure response shape:
{
"success": false,
"code": "SERVICE_DISABLED",
"message": "...",
"maintenance": true,
"retryable": false,
"traceId": "...",
"details": {}
}
EFOREST_ENABLED_SERVICESEFOREST_DISABLED_SERVICESEFOREST_MAINTENANCE_SERVICESEFOREST_DISABLE_ALL_SERVICESEFOREST_SERVICE_<SERVICE_KEY_IN_UPPERCASE>Examples:
# Disable AI and miniapp domains
export EFOREST_DISABLED_SERVICES="forest.ai.*,forest.miniapp.*"
# Put market skills into maintenance mode
export EFOREST_MAINTENANCE_SERVICES="forest.market.*"
# Disable a specific service key
export EFOREST_SERVICE_FOREST_MARKET_WORKFLOW=false
# 1) Regenerate catalog from Forest registry (3 legacy + 45 Forest skills)
bun run generate:openclaw
# 2) Generate standalone OpenClaw config
bun run setup openclaw
# 3) Or merge into an existing OpenClaw config
bun run setup openclaw --config-path /path/to/openclaw.json
structured mode (12 high-frequency NFT skills): use direct parameters (symbol/price/chain/etc.).inputJson mode (33 long-tail Forest skills): pass one JSON object string for full input.Structured example (aelf-forest-list-item):
{
"symbol": "NFT-1",
"quantity": 1,
"priceSymbol": "ELF",
"priceAmount": 1.2,
"durationJson": "{\"hours\":24}",
"chain": "AELF",
"env": "mainnet"
}
inputJson example (aelf-forest-api-market):
{
"inputJson": "{\"action\":\"fetchTokens\",\"params\":{\"chainId\":\"AELF\",\"page\":1}}",
"env": "mainnet"
}
INVALID_PARAMS: input mismatch with skill schema (missing fields/invalid enum/type).SERVICE_DISABLED: service key is disabled by environment switches.MAINTENANCE: service is under maintenance or route/config is unavailable.Quick checks:
inputJson shapeEFOREST_DISABLED_SERVICES / EFOREST_MAINTENANCE_SERVICESEFOREST_FOREST_API_ACTION_MAP_JSON for method-api routesCore forest dispatcher is modularized under src/core/forest/ (with src/core/forest.ts kept as a compatibility facade).
eforest-agent-skills/
├── lib/
│ ├── types.ts
│ ├── config.ts
│ ├── aelf-client.ts
│ ├── api-client.ts
│ ├── forest-envelope.ts
│ ├── forest-service.ts
│ ├── forest-skill-registry.ts
│ ├── forest-schemas.ts
│ └── forest-validator.ts
├── src/
│ ├── cli/
│ │ └── forest_skill.ts
│ ├── core/
│ │ ├── seed.ts
│ │ ├── token.ts
│ │ ├── issue.ts
│ │ ├── forest.ts
│ │ └── forest/
│ │ ├── index.ts
│ │ ├── dispatcher.ts
│ │ ├── executors/
│ │ └── workflow/
│ └── mcp/
│ └── server.ts
├── bin/
│ ├── setup.ts
│ ├── generate-openclaw.ts
│ └── platforms/
├── create_token_skill.ts
├── index.ts
├── openclaw.json
└── __tests__/
Settings are resolved in this order (highest priority first):
--env, --rpc-url)EFOREST_* / AELF_* environment variables.env fileENV_PRESETS)bun test # All tests
bun test:unit # Unit tests only
bun test:integration # Integration tests only
bun test:e2e:smoke # Dry-run smoke e2e (PR gate)
bun test:e2e:full # Full dry-run e2e
bun test:e2e # Alias to test:e2e:full
Notes:
bun run setup ironclawget a price quote for this eForest NFT listingcreate a new eForest NFT collectionlist this NFT on eForest| Git Event | Branch/Ref | Suite | Gate Level |
|---|---|---|---|
pull_request | main | unit + integration + e2e:smoke | Required |
push | main | unit + integration + e2e:full | Required |
push | v* tag | publish.yml (includes bun test) | Release Gate |
| Variable | Description | Default |
|---|---|---|
AELF_PRIVATE_KEY | aelf wallet private key (EOA mode) | — |
PORTKEY_PRIVATE_KEY | Portkey Manager private key (CA mode) | — |
PORTKEY_CA_HASH | Portkey CA hash (CA mode) | — |
PORTKEY_CA_ADDRESS | Portkey CA address (CA mode) | — |
PORTKEY_WALLET_PASSWORD | Optional password cache for EOA wallet context decryption | — |
PORTKEY_CA_KEYSTORE_PASSWORD | Optional password cache for CA keystore context decryption | — |
PORTKEY_SKILL_WALLET_CONTEXT_PATH | Override active wallet context path | ~/.portkey/skill-wallet/context.v1.json |
EFOREST_NETWORK / AELF_ENV | mainnet or testnet | mainnet |
EFOREST_API_URL / AELF_API_URL | Backend API URL | auto |
EFOREST_RPC_URL / AELF_RPC_URL | AELF MainChain RPC | auto |
EFOREST_RPC_URL_TDVV | tDVV RPC URL | auto |
EFOREST_RPC_URL_TDVW | tDVW RPC URL | auto |
EFOREST_ENABLED_SERVICES | Comma-separated service whitelist patterns | empty (allow all) |
EFOREST_DISABLED_SERVICES | Comma-separated service disable patterns | empty |
EFOREST_MAINTENANCE_SERVICES | Comma-separated maintenance patterns | empty |
EFOREST_DISABLE_ALL_SERVICES | Disable all forest services (true/false) | false |
EFOREST_FOREST_API_ACTION_MAP_JSON | Method-API action to route mapping JSON | empty |
1000+ skills curated from Anthropic, Vercel, Stripe, and other engineering teams
Agent harness performance optimization with skills, instincts, memory, and security
Design enforcement with memory — keeps your UI consistent across a project
Detects 37 AI writing patterns and rewrites text with human rhythm across 5 voice profiles