ðŽ Gulltoppr
ãªã¢ãŒãðŽ Gulltoppr ã«ã€ããŠ
Gulltopprã¯ããšãŒãžã§ã³ããéçºè åãã®EVMã³ã³ãã©ã¯ãæäœãšã³ãžã³ã§ããæªæ€èšŒã³ã³ãã©ã¯ããå«ãABIã解決ããèªã¿åããã·ãã¥ã¬ãŒã·ã§ã³ãæªçœ²åãã©ã³ã¶ã¯ã·ã§ã³ã®æºåãè¡ããŸããMCPã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãã»ã¬ã¯ã¿ãŒæ€çŽ¢ãšåºæã«åºã¥ãå®å šæ å ±ãæ±ããŸãã
äž»ãªæ©èœ
- 01æ€èšŒæžã¿ã»æªæ€èšŒã³ã³ãã©ã¯ãã®ABI解決
- 02ã³ã³ãã©ã¯ãåŒã³åºãã®èªã¿åããšãšã³ã³ãŒã
- 03åŒãæž¡ãåã®ãã©ã³ã¶ã¯ã·ã§ã³ã·ãã¥ã¬ãŒã·ã§ã³
- 04ãã©ã³ã¶ã¯ã·ã§ã³ã®ãã³ãŒããšåå解決
- 05ã»ã¬ã¯ã¿ãŒæ€çŽ¢ãšåºææ å ±ã®ç¢ºèª
掻çšã·ãŒã³
- 01äžæãªEVMã³ã³ãã©ã¯ãã®èª¿æ»
- 02ã³ã³ãã©ã¯ãèªã¿åããååŒã·ãã¥ã¬ãŒã·ã§ã³ã®ç¢ºèª
- 03æªçœ²åã®ãŠã©ã¬ããåŒãæž¡ããªã¯ãšã¹ãã®æºå
MCP 察å¿
ABI解決ãã³ã³ãã©ã¯ãèªã¿åããåŒã³åºãã®ãšã³ã³ãŒããã·ãã¥ã¬ãŒã·ã§ã³ãæªçœ²åãã©ã³ã¶ã¯ã·ã§ã³æºåããã³ãŒããåå解決ã®ããŒã«ãæäŸãããã§ãŒã³ãšã»ã¬ã¯ã¿ãŒã®ãŠãŒãã£ãªãã£ãåããŸããstdioãŸãã¯Streamable HTTPã§å©çšã§ããŸãã
èšå®
ãªã¢ãŒããµãŒããŒã¯ã€ã³ã¹ããŒã«äžèŠã§ããã¯ã©ã€ã¢ã³ããéžãã§èšå®ãã³ããŒããããã¯ã³ã¯ãªãã¯ã§å°å ¥ã§ããŸãã
https://mcp.gulltoppr.dev/mcpclaude mcp add --transport http portdeveloper-gulltoppr https://mcp.gulltoppr.dev/mcp{"mcpServers":{"portdeveloper-gulltoppr":{"type":"http","url":"https://mcp.gulltoppr.dev/mcp"}}}Cursor ã§éã{"servers":{"portdeveloper-gulltoppr":{"type":"http","url":"https://mcp.gulltoppr.dev/mcp"}}}VS Code ã§éã{"mcpServers":{"portdeveloper-gulltoppr":{"type":"http","url":"https://mcp.gulltoppr.dev/mcp"}}}{"mcpServers":{"portdeveloper-gulltoppr":{"serverUrl":"https://mcp.gulltoppr.dev/mcp"}}}ã³ãã³ãã¯ã¿ãŒããã«ã§å®è¡ããJSON ã¯åã¯ã©ã€ã¢ã³ãã® MCP èšå®ã«è²Œãä»ããŠåèµ·åããŸããèªå¯ãå¿ èŠãªãµãŒããŒã¯ååæ¥ç¶æã«ãã°ã€ã³ãæ±ããŸãã
ããŒã«
12| ãã©ã¡ãŒã¿ãŒ | å | å¿ é | 説æ |
|---|---|---|---|
| q | string | ããã | ãã§ãŒã³ IDãååããšã€ãªã¢ã¹ããŸãã¯ãã€ãã£ãã·ã³ãã«ã§æ€çŽ¢ããŸããè€æ°èªã®ã¯ãšãªã¯ååèªã§ãã空çœãé€ãã圢ã§ãç §åãããŸãã |
| testnets | boolean | ããã | true ã®å Žåã¯ãã¹ããããã®ã¿ãfalse ã®å Žåã¯ã¡ã€ã³ãããã®ã¿ã察象ã«ããŸãã |
| has_default_rpc | boolean | ããã | true ã®å Žåãgulltoppr ã rpc_url ãªãã§ç §äŒã§ãããã§ãŒã³ã®ã¿ã察象ã«ããŸãã |
詳现
ðŽ gulltoppr

å®éã®ã»ãã·ã§ã³ïŒæ°ç§åã«ååŒããŠããæªæ€èšŒã® MEV ãããïŒãœãŒã¹ãªããABI ãã©ãã«ããªãïŒãã2 åã® MCP ããŒã«åŒã³åºãã§å®å šãªã€ã³ã¿ãŒãã§ãŒã¹ã«è§£æ±ºãããŸããã
gulltoppr ã® REST ãšã³ãžã³ã§ããAI ãšãŒãžã§ã³ãã (chain, address) ãããæ£ãããã·ãã¥ã¬ãŒã·ã§ã³æžã¿ã§ãå®å
šãªã³ã³ãã©ã¯ãæäœãžé²ããããã«ãã解決ã©ããŒãšåè©ãµãŒãã§ã¹ãæäŸããŸãããã㯠4 ã€ã®åœ¢æ
ïŒREST â MCP â SDK â SkillïŒã®ããšã³ãžã³ãã§ããå®å
šãªã³ã³ãã©ã¯ãã«ã€ããŠã¯ ../SPEC.md ããæŠç¥ã«ã€ããŠã¯ ../IDEATION.md ãåç
§ããŠãã ããã
TypeScript + viem + Honoãheimdall ã®éã³ã³ãã€ã«æ®µã¯ãHTTP çµç±ã§ gulltoppr ã«å§è²ãããŸãïŒèšèšäžãå¥ããã»ã¹ãšããŠåäœããŸãïŒã
å®è¡
npm install
npm run dev # REST engine: tsx watch on http://localhost:8787
npm run mcp # MCP server: stdio tools for agent clients
npm run mcp:http # MCP server: Streamable HTTP (remote agents)
npm run typecheck # tsc --noEmit
npm test # vitest unit tests (cache, chains, ladder helpers, args, errors)
npm run verify # root typecheck/test/audit + SDK build/test/audit
npm run docker:build # build the REST engine deployment image
npm run docker:build:mcp # build the Streamable HTTP MCP deployment image
npm run docker:smoke # start both deployment images and check health/discovery/registry metadata
npm run test:live # opt-in live contract smoke tests (RPC/decompiler/network)
ããŒã«ã«ã®ã€ã³ããã»ã¹ãµãŒããŒã®ä»£ããã«ãããã€æžã¿ãšã³ãžã³ãã¹ã¢ãŒã¯ãã¹ãããã«ã¯ãnpm run test:live ãšãšãã« LIVE_ENGINE_BASE_URL=https://api.gulltoppr.dev ãèšå®ããŸããã¹ã±ãžã¥ãŒã«å®è¡ããã GitHub Action ã¯ããŒã«ã«ã®çµè·¯ãå®è¡ããŸããæåå®è¡ã§ã¯ãåããããã€æžã¿ URL ãèšå®ã§ããŸãã
ç°å¢å€æ°
| 倿° | ããã©ã«ã | åè |
|---|---|---|
PORT | 8787 | |
HEIMDALL_API_URL | http://heimdall-api.flycast | heimdall éã³ã³ãã€ã«ãµãŒãã¹ïŒã©ããŒæ®µ 4ïŒã2026-07-27 以éãFly çµç¹å ããã®ã¿ã¢ã¯ã»ã¹ã§ããŸããçµç¹å€ã§å®è¡ããå Žåã¯ç¬èªã®ã€ã³ã¹ã¿ã³ã¹ãæå®ããŠãã ãããæå®ããªãå Žåãæ®µ 4 㯠4byte ã䜿ã£ãã»ã¬ã¯ã¿ãŒã®ã¿ã®åŠçã«ãã©ãŒã«ããã¯ããŸã |
HEIMDALL_CONCURRENCY | 2 | ããã»ã¹ããšã®ãå€åãã®éã³ã³ãã€ã«ïŒãã³ãŒããªã¯ãšã¹ãã®äžéã0 ã§ç¡å¹ã«ãªããŸã |
HEIMDALL_QUEUE_TIMEOUT_MS | 5000 | gulltoppr ãªã¯ãšã¹ããå€åããªã¯ãšã¹ãçšã®åæå®è¡æ ãåŸ ãŠãæå€§æé |
ENS_RPC_URL | https://ethereum-rpc.publicnode.com | ENSïŒBasenames Universal Resolver åŒã³åºãçšã®ã¡ã€ã³ããã RPCãæ¬çªç°å¢ã§ã¯ãã©ã€ããŒã RPC ã䜿çšããŠãã ãã |
ETHERSCAN_API_KEY | (empty) | ãã«ããã§ãŒã³ v2 ã㌠1 ã€ã空ã®å Žåãæ®µ 1 ã¯ç¡å¹ã«ãªããŸã |
ETHERSCAN_RATE_LIMIT | 4 | å
±æ Etherscan ããŒã®ããã»ã¹ããšã®åºå®ãŠã£ã³ããŠäºç®ã0 ã§ç¡å¹ã«ãªããŸã |
ETHERSCAN_RATE_WINDOW_SEC | 1 | Etherscan äºç®ã®ãŠã£ã³ããŠé· |
SIGNING_BASE_URL | https://abi.ninja | prepare_tx ã®åŒãç¶ãçšãã£ãŒããªã³ã¯ã®ããŒã¹ URL |
RATE_LIMIT | 120 | IP ããšã®ãŠã£ã³ããŠãããã®ãªã¯ãšã¹ãæ°ïŒåºå®ãŠã£ã³ããŠïŒã0 ã§ç¡å¹ã«ãªããŸã |
RATE_LIMIT_WINDOW_SEC | 60 | ã¬ãŒãå¶éã®ãŠã£ã³ããŠé· |
RATE_LIMIT_ALLOW | (empty) | ã«ã³ãåºåãã® IP èš±å¯ãªã¹ãïŒå¶é察象å€ïŒããã©ã€ããŒã 6PN IP ã¯åžžã«å¶é察象å€ã§ã |
ANTHROPIC_API_KEY | (empty) | ã¬ãžã¹ããªã§ãéã³ã³ãã€ã«çµæã«å¯Ÿãã LLM ã®ææ¡ã»æ€èšŒåŠçãæå¹ã«ããŸãã空ã®å Žåã¯ç¡å¹ã«ãªããŸã |
REGISTRY_LLM_MODEL | claude-opus-4-8 | ææ¡ã»æ€èšŒã«äœ¿ãã¢ãã« |
ãšã³ããã€ã³ãïŒSPEC §4ïŒ
| verb | route |
|---|---|
| discovery | GET / · REST/MCP ãªã³ã¯ãåè©ããŠãŒãã£ãªãã£ããŒã«ãprepare_tx ã®å®å
šã²ãŒããå«ãã«ãŒããã£ã¹ã«ããªãŒããã¥ã¡ã³ã |
| OpenAPI | GET /openapi.json · ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãããã³ã€ã³ãã°ã¬ãŒã·ã§ã³åãã®æ©æ¢°å¯èªãª REST ã³ã³ãã©ã¯ã |
| agent guide | GET /llms.txt · LLMïŒã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãåãã®ç°¡æœãªã¬ã€ããhttps://gulltoppr.dev/llms.txt ã§ãå
¬éãããŠããŸã |
resolve_abi | GET /v1/{chain}/{address}/abi?include_abi=&method_q=&method_kind=&method_limit= · çã® ABI ãå«ãããç°¡æœãªãããã§ã¹ãïŒæ¥æŽæ
å ±ãååŸããã«ã¯ include_abi=false ãèšå®ããŸã |
read_contract | POST /v1/{chain}/{address}/read · æ¬æ {function, args} |
encode_call | POST /v1/{chain}/{address}/encode · æ¬æ {function, args, value?} |
simulate | POST /v1/{chain}/simulate · æ¬æ {from,to,data,value?} ãŸã㯠{from,address,function,args,value?}ãäž¡æ¹ã®åœ¢åŒãæ··åšãããªãã§ãã ãã |
prepare_tx | POST /v1/{chain}/{address}/prepare · æ¬æ {function, args, from, value?} |
decode_tx | GET /v1/{chain}/tx/{hash} |
resolve_name | GET /v1/{chain}/name/{name} · GET /v1/{chain}/name/by-address/{address} |
| ãã§ãŒã³ã«ã¿ãã° | GET /v1/chains?q=&testnets=&has_default_rpc= · UI ã¯ã©ã€ã¢ã³ãåãã®ãtestnetïŒhas_default_rpc ãã©ã°ä»ã viem ããŒã¹ã®ãšã€ãªã¢ã¹ |
| ã¬ãžã¹ããªæ€çŽ¢ | GET /v1/lookup/{selector} · 4 ãã€ãïŒé¢æ°ïŒãšã©ãŒïŒãŸã㯠32 ãã€ãïŒã€ãã³ã topic0ïŒããã§ãŒã³ã«äŸåããŸãã |
| ã¬ãžã¹ããªçµ±èš | GET /v1/registry/stats |
| ã¬ãžã¹ããªãšã¯ã¹ããŒã | GET /v1/registry/export · CC0 NDJSON ã»ã¬ã¯ã¿ãŒã³ã¢ã³ãºïŒX-License: CC0-1.0ïŒ |
| ã©ã³ã¿ã€ã ã¡ããªã¯ã¹ | GET /v1/metrics · ããã»ã¹å
ã®æ®µéïŒRPC ã®è©Šè¡åæ°ãã¬ã€ãã³ã·ãŒãæªæ€åºæ°ã倱æç |
GET ã«ãŒãã«ã¯æç€ºç㪠Cache-Control ãèšå®ãããŸããæ€èšŒæžã¿ ABI ã®ã¬ã¹ãã³ã¹ã¯æãé·ããã£ãã·ã¥ããããããã· ABI ã®ã¬ã¹ãã³ã¹ã¯çæéãã£ãã·ã¥ããããã©ã³ã¶ã¯ã·ã§ã³ã®ãã³ãŒãçµæã¯äžå€ã§ãOpenAPI ã³ã³ãã©ã¯ãã¯ãã£ãã·ã¥å¯èœã§ãããŸãã/health ã /v1/metrics ãªã©ã®éçšãšã³ããã€ã³ã㯠no-store ã§ããã¬ãŒãå¶é察象ã®ã«ãŒãã§ã¯ã429 ã¬ã¹ãã³ã¹ã« RateLimit-LimitãRateLimit-RemainingãRateLimit-ResetãRetry-After ãå«ãŸããŸããABI ã®è§£æ±ºã§ã¯ãX-SourceãX-ConfidenceãX-CacheãX-Elapsed-MsãX-ABI-Included ãè¿ãããŸãã
ã¬ãžã¹ããªïŒã»ã¬ã¯ã¿ãŒã®å ±æåºç€ïŒ
ãšã³ãžã³ã¯è§£æ±ºåŠçã®å¯ç£ç©ãšããŠããªãŒãã³ãªã»ã¬ã¯ã¿ãŒâã·ã°ããã£ã¬ãžã¹ããªãæ§ç¯ããŸãã
- æ€èšŒæžã¿ã®è§£æ±ºïŒEtherscan/SourcifyïŒããšã«ã颿°ãã€ãã³ãïŒå®å
šãª32ãã€ãã®topic0ãè¡çªãªãïŒããšã©ãŒã®ã°ã©ãŠã³ããã¥ã«ãŒã¹ãšãªã
selector â signatureãã¢ãåéããŸãã蚌æã°ã¬ãŒãïŒverified-sourceã - è§£æ±ºçµæã¯ã¹ã±ã«ãã³ããã·ã¥ïŒsolc ã®ã¡ã¿ããŒã¿ãã¬ãŒã©ãŒãé€å»ããã©ã³ã¿ã€ã ãã€ãã³ãŒãïŒã§ãã€ã³ããã¯ã¹åãããããããã€ãã³ãŒããå®å
šã«åäžã®ã¯ããŒã³ã¯ãè§£æ±ºã®æ®µéãåå®è¡ãããæ°ãã«è¿œå ããã
bytecode-matchã®æ®µéã§è§£æ±ºãããŸããã¯ããŒã³ã«ã€ããŠã¯ãæ€èšŒæžã¿ã®äž»åŒµã¯partialã«å¶éãããŸãïŒãã®ã¢ãã¬ã¹ã®ãœãŒã¹ã¯æ€èšŒãããŠããªãããïŒããŸããprovenance.bytecode_matchã¯ãåå©çšããã ABI ã®æäŸå ã§ããå ã®ãã§ãŒã³ïŒã¢ãã¬ã¹ïŒãœãŒã¹ïŒä¿¡é ŒåºŠã瀺ããŸãã - éã³ã³ãã€ã«ããã ABI ã§ã¯ãå®èšŒæžã¿ã®ã¬ãžã¹ããªãšã³ããªã䜿ã£ãŠ
Unresolved_<selector>ãšããååã眮ãæããŸãããŸããANTHROPIC_API_KEYãèšå®ãããŠããå Žåãå¿çãåŸ ããã«å®è¡ãããææ¡ãšæ€èšŒã®åŠçã§ Claude ã«ã·ã°ããã£åè£ãå°ããkeccak256(sig)[:4]ãã»ã¬ã¯ã¿ãŒãšäžèŽãããã®ã ããæ¡çšããŸãã蚌æã°ã¬ãŒãïŒkeccak-provenïŒã·ã°ããã£ã¯å®èšŒæžã¿ã§ãããæå³ã¯æšå®ã§ãïŒã - å ¬éãããŠãã4byteã®ãã©ãŒã«ããã¯ã©ãã«ãã䜿çšåã«ããŒã«ã«ã§ã»ã¬ã¯ã¿ãŒãšç §åãããŸãããå®èšŒãããŠããªãã©ãã«ã®ãŸãŸã§ããã蚌æãšããŠå ±æåºç€ã«ç»é²ãããããšã¯ãããŸããã
ã¬ãžã¹ããªã«æžã蟌ããã®ã¯ãšã³ãžã³ç¬èªã®ãã€ãã©ã€ã³ã ãã§ããäžè¬ããã®ç»é²ã¯åãä»ããŸããïŒããã4byteã§è¡çªã«ããæ±æãèµ·ããçç±ã§ãïŒã
èç©ãããããŒã¿ã¯CC0ããŒã¿ã»ãããšããŠå
¬éãããŠããŸãïŒ
evm-abi-commons
ïŒGET /v1/registry/export ãããã€ã§ãåçæã§ããŸããã¬ã¹ãã³ã¹ã¯ NDJSON ã§ãX-License: CC0-1.0 ãšã©ã€ã»ã³ã¹ã瀺ã Link ããããŒãå«ãŸããŸãïŒãæ€çŽ¢ïŒãšã¯ã¹ããŒãã®ãšã³ããªã«ã¯èšŒæã°ã¬ãŒããå«ãŸããŸãããŸãã倿ããŠããå Žåãåéããã verified-source ãšã³ããªã«ã¯ãœãŒã¹ã® chain ãš address ãå«ãŸããŸããSDK ã®ãŠãŒã¶ãŒã¯ lookupSelectorãregistryStatsãexportRegistry ãçŽæ¥åŒã³åºããŸãã
{chain} ã«ã¯ãGET /v1/chains ãè¿ãä»»æã®ãšã€ãªã¢ã¹ïŒviem/chains ã«åºã¥ãïŒãŸãã¯æ°å€ ID ãæå®ã§ããŸãããã§ãŒã³ãšã³ããªã«ã¯ testnet ãš has_default_rpc ãå«ãŸããããããšãŒãžã§ã³ã㯠rpc_url ã®æå®ãæ±ããã¹ããã©ããã倿ã§ããŸããq 㯠IDãååããšã€ãªã¢ã¹ããã€ãã£ãããŒã¯ã³ã®ã·ã³ãã«ã«äžèŽããbnb chain ã®ãããªè€æ°èªã®æ€çŽ¢ã«ã察å¿ããŸãã?rpc_url= ãæž¡ããš RPC ãäžæžãã§ããŸãïŒããã©ã«ãããªããã§ãŒã³ãããšãã° localïŒ31337 ã§ã¯å¿
é ã§ããçµã¿èŸŒã¿ã®ãšã€ãªã¢ã¹ãçšæãããåã® EVM ãã§ãŒã³ã§ã¯ãããã䜿ã£ãŠåäœãããŸãïŒã
ãšãŒãžã§ã³ãã®ã³ã³ããã¹ãã§ã¯ãçã® JSON ABI ãå¿
èŠã§ãªãéããresolve_abi ã§ã¯ include_abi=false ãåªå
ããŠãã ãããã³ã³ãã¯ããªã¬ã¹ãã³ã¹ã§ã¯ interfaceãprovenanceãproxyãtokenãabi_for ãä¿æãããabi_omitted: true ãèšå®ãããŸããå€§èŠæš¡ãªã³ã³ãã©ã¯ãã§ã¯ãmethod_qãmethod_kind=read|write|allãmethod_limit ã远å ãããšããŠãŒã¶ãŒã®æå³ã«é¢ä¿ãããããã§ã¹ãã®ã¡ãœããã ããè¿ãããŸãã
curl localhost:8787/v1/ethereum/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/abi
curl -X POST localhost:8787/v1/ethereum/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/prepare \
-H 'content-type: application/json' \
-d '{"function":"approve","args":["0x1111111254EEB25477B68fb85Ed929f73A960582","1000000000000000000"],"from":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}'
prepare_tx.safety.signing_recommended ãåŒãæž¡ãã®å¯åŠãå¶åŸ¡ããŸããã·ãã¥ã¬ãŒã·ã§ã³ã«å€±æããå Žåãrisk_level 㯠blocked ãšãªããdeeplink ã¯ç©ºã«ãªããwallet_request ã¯çç¥ãããŸãã眲åãæšå¥šãããå Žåãwallet_request ã¯ããŠã©ã¬ããïŒãããã¯ãšã¯ã¹ãããŒã©ãŒïŒã¢ããªãšã®çµ±ååãã«ã16鲿°ã® JSON-RPC æ°éãå«ã EIP-1193 圢åŒã® eth_sendTransaction ãã€ããŒãã§ããéã³ã³ãã€ã«ãããæžã蟌ã¿ããŸãã¯ã»ã¬ã¯ã¿ãŒã®ã¿ã®æžã蟌ã¿ã¯ãªã¹ã¯ã high ã§ãããã»ã¬ã¯ã¿ãŒãšæå³ããŠãŒã¶ãŒãæç€ºçã«ç¢ºèªããå¿
èŠããããŸããæ£ã®ããŒã¯ã³ïŒNFT æ¯åºè
æ¿èªã¯ãspending_approval ã䌎ããªã¹ã¯ medium ã§ãããã¬ãŒã¹ããå°åºããããã®ã§ããæšæºçãªããŒã¯ã³ïŒNFT 転éããæšå®ããããã®ã§ãã転éå
ããã®ããŒã¯ã³ïŒNFT ã®æµåºã¯ãasset_outflow ã䌎ããªã¹ã¯ medium ã§ããã¯ã©ã€ã¢ã³ãã¯åŒãæž¡ãåã«äž¡æ¹ã衚瀺ããŠãã ããã
ãŠã©ã¬ããããããã¯ãšã¯ã¹ãããŒã©ãŒãã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããMCP ã¯ã©ã€ã¢ã³ãåãã®çµ±åã¬ã·ãã¯ãdocs/integrations.md ã§å
¬éãããŠããŸãã
MCP ãµãŒããŒïŒSPEC §5ïŒ
npm run mcp ãå®è¡ãããšã7 ã€ã®ã³ã¢åè©ãšããã§ãŒã³ãã»ã¬ã¯ã¿ãŒã®å
±éæ
å ±ãã©ã³ã¿ã€ã ã¡ããªã¯ã¹çšã®èªã¿åãå°çšãŠãŒãã£ãªãã£ããŒã«ãå
¬éãã stdio MCP ãµãŒããŒãèµ·åããŸããããŒã«ã¯ãããã€æžã¿ã® REST ãšã³ãžã³ïŒENGINE_URLïŒãèãã©ãããããããMCP ã¯ãšã³ãžã³ã®æ°žç¶ãã£ãã·ã¥ãš Etherscan ããŒãå
±æãã解決åŠçãã·ãŒã¯ã¬ãããéè€ããããšã¯ãããŸãããããŒã«ã®èª¬æã«ã¯ãã«ã¹ããã£ã䌎ããªãåŒãæž¡ãã¢ãã«ïŒprepare_tx ã¯çœ²åããŸããïŒãæèšãããŠããŸãããŸããéšåç㪠ABIããããã·ããã€ãã³ãŒãç
§åãéã³ã³ãã€ã«æžã¿ ABI ã®çµæã«ã€ããŠã¯ãç±æ¥ã«é¢ããèŠåãå
ã«æç€ºãã眲åçšãã£ãŒããªã³ã¯ãŸãã¯ãŠã©ã¬ãããªã¯ãšã¹ãããŠãŒã¶ãŒã«æž¡ãåã« prepare_tx.safety.signing_recommended ã確èªããããæ±ããŸããJSON MCP ããŒã«ã¯åºåã¹ããŒããš structuredContent ãå
¬éãããããã¯ã©ã€ã¢ã³ãã¯ããã¹ããè§£æããã«ãprovenanceããã³ãŒãæžã¿ã®åŒã³åºããã·ãã¥ã¬ãŒã·ã§ã³ãã»ã¬ã¯ã¿ãŒã®çµæãã¡ããªã¯ã¹ãsafety ã«åºã¥ããŠåŠçãåå²ã§ããŸãã
MCP ã¯ã©ã€ã¢ã³ãïŒClaude Desktop / Claude Code ã® mcp èšå®ïŒã«æ¥ç¶ããŸãã
{
"mcpServers": {
"gulltoppr": {
"command": "npm",
"args": ["run", "--silent", "mcp"],
"cwd": "/home/ubuntu/repos/abi-agent",
"env": { "ETHERSCAN_API_KEY": "" }
}
}
}
ã³ã¢ããŒã«ïŒresolve_abiãread_contractãencode_callãsimulateãprepare_txãdecode_txãresolve_nameããŠãŒãã£ãªãã£ããŒã«ïŒlist_chainsãlookup_selectorãregistry_statsãexport_registryãruntime_metricsãprepare_tx ãé€ãããã¹ãŠèªã¿åãå°çšã®æ³šéãä»ããŠããŸãïŒéç Žå£çã§ã眲åãªãã®åŒãæž¡ãæ
å ±ãè¿ãã眲åã¯è¡ããŸããïŒã
ãªã¢ãŒãïŒStreamable HTTPïŒ
ããŒã«ã«ã® stdio ãµãŒããŒãå®è¡ã§ããªããšãŒãžã§ã³ãåãã«ãåã MCP ã HTTP çµç±ã§ https://mcp.gulltoppr.dev/mcp ã§ãã¹ãããŠããŸãïŒããŒã«ã«ã§ã¯ npm run mcp:httpãã¹ããŒãã¬ã¹ïŒãHTTP 察å¿ã® MCP ã¯ã©ã€ã¢ã³ãããã® URL ã«æ¥ç¶ããŸãã
{ "mcpServers": { "gulltoppr": { "url": "https://mcp.gulltoppr.dev/mcp" } } }
ããŒã«ã®ç»é²ã¯ãstdio ãšã³ããªïŒmcp.tsïŒãš HTTP ãšã³ããªïŒmcp-http.tsïŒã§ src/mcp-server.ts ãå
±æããDockerfile.mcp / fly.mcp.toml ã䜿ã£ãŠãããã€ããŠããŸããMCP ãã£ã¬ã¯ããªã®ã¡ã¿ããŒã¿ã¯ server.json ã«ãããåããªã¢ãŒã URLããªããžããªãããŒã ããŒãžãã¢ã€ã³ã³ãå
¬éããŸãããªã¢ãŒã MCP ãµãŒãã¹ã¯ãåãã¡ã¿ããŒã¿ã https://mcp.gulltoppr.dev/server.json ãš https://mcp.gulltoppr.dev/.well-known/mcp-server.json ã§ãæäŸããŸãã
npm SDK
ãã® REST ã€ã³ã¿ãŒãã§ãŒã¹çšã®åä»ãã¯ã©ã€ã¢ã³ã㯠sdk/ïŒgulltopprïŒã«ãããŸããnew Gulltoppr({ baseUrl }).resolveAbi(...) / .read(...) / .prepareTx(...) ã«å ããŠãcontract() ãã«ããŒãå©çšã§ããŸããREST ãš MCP ã«ç¶ã 3 ã€ç®ã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ããããŠã©ã¬ããããšã¯ã¹ãããŒã©ãŒãã¢ããªãšã®é£æºã®åºç€ã§ããsdk/README.md ãåç
§ããŠãã ããã
ãããã€
https://api.gulltoppr.dev ã§çšŒåäžã§ãïŒFly.io ã¢ã㪠gulltopprããªãŒãžã§ã³ cdgãã©ããŒã®ç¬¬ 4 段éã®ã¬ã€ãã³ã·ãŒãæå°éã«ãããããgulltoppr ãšåãå Žæã«é
眮ãããŠããŸãïŒãDockerfileïŒNode 22ãtsx ã§å®è¡ãã€ã¡ãŒãžãµã€ãºçŽ 82 MBïŒã䜿ã£ãŠã³ã³ããåããfly.toml ã§èšå®ããŠããŸãã
flyctl deploy --remote-only --ha=false
# optional: set an Etherscan v2 key to enable ladder rung 1
flyctl secrets set ETHERSCAN_API_KEY=... -a gulltoppr
HEIMDALL_API_URL / SIGNING_BASE_URL / PORT 㯠fly.toml [env] ã§èšå®ãããŠããŸãã
ã¢ã€ãã«æã¯ãã·ã³ãèªå忢ãããªã¯ãšã¹ãã«å¿ããŠèªåèµ·åããŸãã
Claude Skill
4 ã€ç®ã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ Claude SkillïŒskill/gulltoppr/ïŒã§ãããšãŒãžã§ã³ãã«ã¯ãŒã¯ãããŒïŒè§£æ±º â ç±æ¥ãç¢ºèª â èªã¿åããŸãã¯æºå â ã·ãã¥ã¬ãŒã·ã§ã³ â åŒãæž¡ãïŒãšãã«ã¹ããã£ã䌎ããªãå®å
šæ§ã®ã«ãŒã«ãæããŸããcp -r skill/gulltoppr ~/.claude/skills/gulltoppr ã§ã€ã³ã¹ããŒã«ã§ããŸããskill/README.md ãåç
§ããŠãã ããã
æ§æ
src/
server.ts REST routes (Hono), BigInt-safe JSON, error mapping
index.ts REST entry / boot
mcp.ts MCP server (stdio): core verbs plus read-only utility tools
config.ts env + defaults
metrics.ts in-process rung/RPC latency and failure counters
chains.ts alias/id â {id, viem chain, rpc} (SPEC §6)
clients.ts cached viem PublicClients
types.ts the SPEC §2 data types
errors.ts typed ApiError â HTTP status (SPEC §7)
resolve/
index.ts resolve_abi: the ladder orchestrator (the spine)
etherscan.ts rung 1 · sourcify.ts rung 2 · proxy.ts rung 3
heimdall.ts rung 4 (gulltoppr) · fourbyte.ts rung 5
interface.ts capability manifest builder ("the buttons", SPEC §2.4a)
selectFunction.ts name/signature â AbiFunction
verbs/
read.ts encode.ts simulate.ts prepare.ts decodeTx.ts resolveName.ts
args.ts JSON-arg â viem-typed coercion
ç¶æ³
ãšã³ãããŒãšã³ãã§åäœç¢ºèªæžã¿ïŒçšŒåäžã®ã¡ã€ã³ãããã§æ€èšŒæžã¿ïŒã§ããå®å
šãªã©ããŒãæ©èœãããã§ã¹ããread_contractãencode_callãprepare_txïŒeth_call ã·ãã¥ã¬ãŒã·ã§ã³ + ãã£ãŒããªã³ã¯ïŒãŠã©ã¬ãããžã®åŒãæž¡ã + ç±æ¥ã«é¢ããèŠåä»ãïŒãdecode_txïŒgulltoppr çµç±ãããã³ä»»æã®è§£æ±ºæžã¿ ABI ã«ãã calldata ã®æ¡å
ïŒããã§ãŒã³ãèæ
®ãã ENS/Basenames resolve_name ããREST ã€ã³ã¿ãŒãã§ãŒã¹ãš MCP ãµãŒã㌠ã®äž¡æ¹ã§å
¬éããŠããŸãïŒstdio ãã³ãã·ã§ã€ã¯ + ã³ã¢ããŒã«ïŒãŠãŒãã£ãªã㣠+ ã©ã€ãããŒã«åŒã³åºããæ€èšŒæžã¿ïŒãã©ã€ãã¹ã¢ãŒã¯ãã¹ãã¹ã€ãŒãã§ã¯ããããã·ãæªæ€èšŒã®éã³ã³ãã€ã«ãä»»æã® rpc_url ãã§ãŒã³ãMonadãMonad ãã¹ãããããprepare_tx ã察象ãšããŠããŸãã
ãã¹ããšãã©ãŒãã«é¢ããæ³šæç¹ïŒ
simulateã®ãã¬ãŒã¹ïŒstate_diffã¯debug_traceCallïŒprestateTracerã® diff ã¢ãŒãïŒããååŸããasset_changes/logs㯠RPC ããããã®ãããã° API ã«å¯Ÿå¿ããŠããå Žåã«callTracerããååŸããŸãããããªã㯠RPC ã§ã¯ç©ºã®é åãè¿ãããããšããããããŸãã
ã³ã¡ã³ã
MCP ã¯åããŠã§ããïŒ
ãããã³ã«ã®æŠèŠããæåã®ãµãŒããŒã®å°å ¥ãŸã§ãããããçåã«ãŸãšããŠçããŸãã
AI ã¢ããªã±ãŒã·ã§ã³ãå€éšã®ããŒã«ãããŒã¿ãœãŒã¹ã«çµ±äžçãªæ¹æ³ã§æ¥ç¶ããããã®ãªãŒãã³ãªãããã³ã«ã§ããã¯ã©ã€ã¢ã³ãã¯ã¢ãã«ãšã®å¯Ÿè©±ãæ ããMCP ãµãŒããŒã¯ããŒã«ã»ãªãœãŒã¹ã»ããã³ãããã³ãã¬ãŒããæäŸããŸããæšæºã¡ãã»ãŒãžã§ããåãããããã1 ã€ã®ãµãŒããŒãè€æ°ã®ã¯ã©ã€ã¢ã³ãã§åå©çšã§ããŸãã