A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
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
A Claude Code skill by Hao (駱君昊) that learns your Facebook voice and auto-posts to FB / IG / Threads / X with a 14-day c
Claude Code skill for YouTube creators — channel audits, video SEO, retention scripts, thumbnails, content strategy, Sho
Design enforcement with memory — keeps your UI consistent across a project