ํ”„๋กœํ† ํƒ€์ž… ยท ๋ฏธ๋ฆฌ ๋ณด๊ธฐ: ๊ณต์‹ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์„œ๋ฒ„๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ 30๋ถ„๋งˆ๋‹ค ๋™๊ธฐํ™”ํ•ด์š”. ๋ฆฌ๋ทฐ์™€ ๊ณ„์ • ๊ธฐ๋Šฅ์€ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์—ด๋ ค์š”.
PopNx MCPAI๋ฅผ ์“ฐ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ MCP ์„œ๋ฒ„ ยท ์‰ฌ์šด ๋ง๋กœ ์„ค๋ช…ํ•ด์š”

๐Ÿด Gulltoppr

์ œ์ž‘์ž: portdeveloper๋ฒ„์ „ 0.1.2iโ˜… โ€“iํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰
๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ด๋ฆ„io.github.portdeveloper/gulltoppr

์„ค์น˜

๊ฐœ์š”

์ œ์ž‘์ž๊ฐ€ ์“ด ์„ค๋ช…(์˜์–ด ์›๋ฌธ)

Resolve any EVM contract ABI (even unverified, via decompilation), read, simulate, prepare txs.

PopNx MCP์˜ ์„ธ ๊ธฐ๋‘ฅ

์ด ์„ธ ๊ฐ€์ง€๋Š” ์ ˆ๋Œ€ ํ•˜๋‚˜์˜ ์ ์ˆ˜๋กœ ํ•ฉ์น˜์ง€ ์•Š์•„์š”. ์˜๊ฒฌ, ์ธก์ •, ์ธ๊ธฐ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ˆ๊นŒ์š”.

ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ

์ด ์„œ๋ฒ„๋Š” ์•„์ง ์‰ฌ์šด ๋ง๋กœ ๋œ ์š”์•ฝ์„ ์“ฐ์ง€ ๋ชปํ–ˆ์–ด์š”. ์•„๋ž˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ฝ์–ด ์˜จ ์‚ฌ์‹ค์ด์—์š”.

  • ์—ฐ๊ฒฐ ๋ฐฉ์‹: ํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰
  • ์ „์†ก ๋ฐฉ์‹: Streamable HTTP
  • ์นดํ…Œ๊ณ ๋ฆฌ: ๊ธฐํƒ€

์„ค์น˜

์“ฐ๊ณ  ์žˆ๋Š” AI ์•ฑ์„ ๊ณ ๋ฅธ ๋‹ค์Œ ์„ค์ •์„ ๋ณต์‚ฌํ•˜์„ธ์š”.

์„ค์น˜ํ•˜๊ธฐ ์ „์—

  • ๊ธฐ๋ณธ ์ ๊ฒ€: 1๊ฐœ ์ค‘ 1๊ฐœ ํ†ต๊ณผ
  • ์ œ์ž‘์ž์˜ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋ผ์š”. ๋‚ด๊ฐ€ ์š”์ฒญํ•œ ๋‚ด์šฉ์€ ์ œ์ž‘์ž์˜ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ์š”.
  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ž…๋ ฅํ•ด์•ผ ํ•  ํ‚ค๊ฐ€ ๋‚˜์™€ ์žˆ์ง€ ์•Š์•„์š”.

ํ•„์š”ํ•œ ๊ฒƒ

์–ด๋–ค ์•ฑ์„ ์“ฐ์„ธ์š”?

์œ„์—์„œ ์•ฑ์„ ๊ณ ๋ฅด์„ธ์š”. ๊ธฐ์–ตํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋ฒ„ํŠผ์— โ€œโ€ฆ์— ์„ค์น˜โ€๋ผ๊ณ  ํ‘œ์‹œํ•ด์š”.

์›น, ๋ฐ์Šคํฌํ†ฑ, ๋ชจ๋ฐ”์ผ์˜ Claude์—์„œ ์“ธ ์ˆ˜ ์žˆ์–ด์š”:

  1. Settings โ†’ Connectors ์—ด๊ธฐ
  2. Add custom connector ๋ˆ„๋ฅด๊ธฐ
  3. ์•„๋ž˜ ์ฃผ์†Œ๋ฅผ ๋ถ™์—ฌ ๋„ฃ๊ณ  Add ๋ˆ„๋ฅด๊ธฐ
  4. ๋กœ๊ทธ์ธํ•˜๋ผ๊ณ  ํ•˜๋ฉด ์ œ์ž‘์ž์˜ ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธํ•˜๊ธฐ
SettingsConnectors1+ Add2https://โ€ฆ3
https://mcp.gulltoppr.dev/mcp

ํ„ฐ๋ฏธ๋„์—์„œ ์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”

claude mcp add --transport http gulltoppr https://mcp.gulltoppr.dev/mcp

Cursor์—์„œ ์—ด๊ธฐ

๋˜๋Š” ์„ค์ •์„ ์ง์ ‘ ๋ณต์‚ฌํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ์˜ .cursor/mcp.json ๋˜๋Š” ~/.cursor/mcp.json์— ๋ถ™์—ฌ ๋„ฃ์œผ์„ธ์š”

{
  "mcpServers": {
    "gulltoppr": {
      "url": "https://mcp.gulltoppr.dev/mcp"
    }
  }
}

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•ฑ์„ ์—ด์ง€ ๋ฌผ์–ด๋ณธ ๋‹ค์Œ, ์•ฑ์ด ์„ค์ •์„ ๋ณด์—ฌ ์ฃผ๊ณ  ํ™•์ธ์„ ์š”์ฒญํ•ด์š”. ํ‚ค ๊ฐ’์€ ๋น„์›Œ ๋‘๋‹ˆ ์ง์ ‘ ์ž…๋ ฅํ•˜์„ธ์š”.

VS Code์—์„œ ์—ด๊ธฐ

๋˜๋Š” ์„ค์ •์„ ์ง์ ‘ ๋ณต์‚ฌํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ์˜ .vscode/mcp.json์— ๋ถ™์—ฌ ๋„ฃ์œผ์„ธ์š”

{
  "servers": {
    "gulltoppr": {
      "type": "http",
      "url": "https://mcp.gulltoppr.dev/mcp"
    }
  }
}

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•ฑ์„ ์—ด์ง€ ๋ฌผ์–ด๋ณธ ๋‹ค์Œ, ์•ฑ์ด ์„ค์ •์„ ๋ณด์—ฌ ์ฃผ๊ณ  ํ™•์ธ์„ ์š”์ฒญํ•ด์š”. ํ‚ค ๊ฐ’์€ ๋น„์›Œ ๋‘๋‹ˆ ์ง์ ‘ ์ž…๋ ฅํ•˜์„ธ์š”.

ChatGPT๋Š” ์ธํ„ฐ๋„ท์— ์žˆ๋Š” ์„œ๋ฒ„์—๋งŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์š”:

  1. ์›น์—์„œ ChatGPT ์—ด๊ธฐ โ†’ Settings โ†’ Connectors (Apps)
  2. Create ๋˜๋Š” Add ๋ˆ„๋ฅด๊ธฐ(์ผ๋ถ€ ์š”๊ธˆ์ œ๋Š” ๋จผ์ € Advanced์—์„œ Developer mode๋ฅผ ์ผœ์•ผ ํ•ด์š”)
  3. ์•„๋ž˜ ์ฃผ์†Œ๋ฅผ ๋ถ™์—ฌ ๋„ฃ๊ณ  ์ด๋ฆ„์„ ์ •ํ•œ ๋’ค ์ €์žฅํ•˜๊ธฐ
  4. ๋กœ๊ทธ์ธํ•˜๋ผ๊ณ  ํ•˜๋ฉด ์ œ์ž‘์ž์˜ ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธํ•˜๊ธฐ
SettingsConnectors1+ Create2https://โ€ฆ3
https://mcp.gulltoppr.dev/mcp

๋ฉ”๋‰ด ์ด๋ฆ„์€ ์š”๊ธˆ์ œ๋‚˜ ์‹œ๊ธฐ์— ๋”ฐ๋ผ ์กฐ๊ธˆ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด์š”.

์„ ํƒํ•œ ์•ฑ์€ ์ด ๊ธฐ๊ธฐ์˜ ์ฟ ํ‚ค์—๋งŒ ์ €์žฅ๋ผ์š”. ๊ณ„์ •์€ ํ•„์š” ์—†์–ด์š”.

์ด ์„ค์ •์€ ์ œ์ž‘์ž์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ •๋ณด๋กœ ๋งŒ๋“ค์—ˆ์–ด์š”. README์™€ ๋‹ค๋ฅด๋ฉด README๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ

์•„์ง ์ด ์„œ๋ฒ„์˜ ๋„๊ตฌ ๋ชฉ๋ก์„ ์ฝ์ง€ ์•Š์•˜์–ด์š”. ์—”๋“œํฌ์ธํŠธ๋Š” ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ ๊ฒ€ํ•ด์š”.

๊ธฐ๋ณธ ์ ๊ฒ€i

๋ˆ„๊ตฌ๋‚˜ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ ๊ฒ€ํ–ˆ๊ณ , ์ฝ”๋“œ๋Š” ์ฝ์ง€ ์•Š์•˜์–ด์š”. ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์€ ๊ฐœ์ˆ˜์—์„œ ๋บ์–ด์š”. ยท 2026๋…„ 11์›” 6์ผ ์ ๊ฒ€

  • โœ“ ํ†ต๊ณผ

    ์ œ์ž‘์ž์™€ ์ €์žฅ์†Œ ์ผ์น˜

    ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ด๋ฆ„์ด GitHub ๊ณ„์ • portdeveloper ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ๋˜์—ˆ๊ณ , ์ด ๊ณ„์ •์ด ์ €์žฅ์†Œ๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์–ด์š”

  • โ€ฆ ์•„์ง ์ ๊ฒ€ ์•ˆ ํ•จ

    ๊ณ„์† ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์Œ

    ์•„์ง GitHub์—์„œ ์ด ์ €์žฅ์†Œ๋ฅผ ์ฝ์–ด ์˜ค์ง€ ์•Š์•˜์–ด์š”

  • โ€ฆ ์•„์ง ์ ๊ฒ€ ์•ˆ ํ•จ

    ๋ผ์ด์„ ์Šค ์žˆ์Œ

    ์•„์ง GitHub์—์„œ ์ด ์ €์žฅ์†Œ๋ฅผ ์ฝ์–ด ์˜ค์ง€ ์•Š์•˜์–ด์š”

  • โ€ฆ ์•„์ง ์ ๊ฒ€ ์•ˆ ํ•จ

    ์—”๋“œํฌ์ธํŠธ ์‘๋‹ต

    ์•„์ง ์ ๊ฒ€ํ•˜์ง€ ์•Š์•˜์–ด์š”. ์—”๋“œํฌ์ธํŠธ๋Š” ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ ๊ฒ€ํ•ด์š”

  • โ€ฆ ์•„์ง ์ ๊ฒ€ ์•ˆ ํ•จ

    OAuth๋กœ ๋กœ๊ทธ์ธ

    ์•„์ง ์ ๊ฒ€ํ•˜์ง€ ์•Š์•˜์–ด์š”. ์—”๋“œํฌ์ธํŠธ๋Š” ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ ๊ฒ€ํ•ด์š”

  • โ€ฆ ์•„์ง ์ ๊ฒ€ ์•ˆ ํ•จ

    ๋„๊ตฌ ์„ค๋ช…์— ์ˆจ๊ฒจ์ง„ ์ง€์‹œ ์—†์Œ

    ์•„์ง ์ ๊ฒ€ํ•˜์ง€ ์•Š์•˜์–ด์š”. ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ ๊ฒ€ํ•  ๋•Œ ๋„๊ตฌ ๋ชฉ๋ก์„ ์ฝ์–ด์š”

๊ธฐํƒ€ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„์™€ ๋น„๊ตi

  • ์ด ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„ 32435๊ฐœ ์ค‘ 0%๋ณด๋‹ค ์Šคํƒ€๊ฐ€ ๋งŽ์•„์š”
  • ์ด ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„ 32435๊ฐœ ์ค‘ 12%๋ณด๋‹ค ์ตœ๊ทผ์— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ณต๊ฐœ๋์–ด์š”
  • ๊ธฐ๋ณธ ์ ๊ฒ€ ๊ฒฐ๊ณผ๊ฐ€ ์ด ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ์„œ๋ฒ„ 32435๊ฐœ ์ค‘ 100%์™€ ๊ฐ™๊ฑฐ๋‚˜ ๋” ์ข‹์•„์š”

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด ์นดํ…Œ๊ณ ๋ฆฌ์˜ ํ™œ์„ฑ ์„œ๋ฒ„ ์ „์ฒด์™€ ๋น„๊ตํ–ˆ์–ด์š”. ์Šคํƒ€๋Š” ๊ฒŒ์‹œ์ž๊ฐ€ ์ €์žฅ์†Œ๋ฅผ ์†Œ์œ ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์„ธ์š”.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

๐Ÿด Gulltoppr, ์•ˆ์ „ํ•œ๊ฐ€์š”?

ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋ณธ ์ ๊ฒ€ 1๊ฐœ ์ค‘ 1๊ฐœ๋ฅผ ํ†ต๊ณผํ–ˆ์–ด์š”. ์ฝ”๋“œ๋Š” ์ฝ์ง€ ์•Š์•˜์–ด์š”. ํ‚ค๋‚˜ ํ† ํฐ์„ ๋„ฃ๊ธฐ ์ „์— ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ๊ถŒํ•œ์„ ์š”๊ตฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ผญ ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ์žˆ๋Š” ํ‚ค๋ฅผ ์“ฐ์„ธ์š”.

์–ด๋–ค ํ‚ค๋‚˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?

๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ•„์ˆ˜ ํ‚ค๊ฐ€ ๋‚˜์™€ ์žˆ์ง€ ์•Š์•„์š”. ๋‹ค๋งŒ ์ฒ˜์Œ ์“ธ ๋•Œ ๋กœ๊ทธ์ธ์„ ์š”๊ตฌํ•˜๋Š” ์„œ๋ฒ„๋„ ์žˆ์–ด์š”.

๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜๋‚˜์š”, ํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰๋˜๋‚˜์š”?

์ œ์ž‘์ž์˜ ํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰๋ผ์š”. ์„ค์น˜ ์—†์ด ์ธํ„ฐ๋„ท์œผ๋กœ ์—ฐ๊ฒฐํ•˜์ง€๋งŒ, ๋ณด๋‚ด๋Š” ๋‚ด์šฉ์€ ์ œ์ž‘์ž์˜ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ์š”.

์•„์ง ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‚˜์š”?

GitHub ์ €์žฅ์†Œ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ โ€“ ๋ณ€๊ฒฝ๋๊ณ , ์ตœ์‹  ๋ฒ„์ „(0.1.2)์€ 5๊ฐœ์›” ์ „ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ผ์™”์–ด์š”.

์–ด๋–ค ์•ฑ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋‚˜์š”?

Claude Desktop, Claude Code, Cursor, VS Code์ฒ˜๋Ÿผ MCP๋ฅผ ์ง€์›ํ•˜๋Š” ์•ฑ์—์„œ ์“ธ ์ˆ˜ ์žˆ์–ด์š”. URL๋กœ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์›๊ฒฉ MCP ์„œ๋ฒ„๋ฅผ ์ง€์›ํ•˜๋Š” ์•ฑ(์˜ˆ: ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์˜ ChatGPT)์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ์–ด์š”.

๋Œ€์‹  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฑด ๋ญ๊ฐ€ ์žˆ๋‚˜์š”?

๊ฐ™์€ ์นดํ…Œ๊ณ ๋ฆฌ์—๋Š”: Spec Driven Development, Remote Desktop Commander, Apify MCP Server

๋Œ€์•ˆ

๊ฐ™์€ ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ ๋‹ค๋ฅธ ์ œ์ž‘์ž๊ฐ€ ๋งŒ๋“  ์„œ๋ฒ„์˜ˆ์š”. ์Šคํƒ€ ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ์–ด์š”.

์นด๋“œ ๋ณด๋Š” ๋ฒ•:โ˜… GitHub ์Šคํƒ€i์„ธ ๊ธฐ๋‘ฅ: ๋ฆฌ๋ทฐ ยท ์ ๊ฒ€ ยท ์‚ฌ์šฉ ์ •๋„i์—…๋ฐ์ดํŠธ = ์ตœ์‹  ๋ฒ„์ „์„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ณต๊ฐœํ•œ ๋‚ i

Spec Driven Development

์ œ์ž‘์ž: formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰โ˜… 440MIT14๊ฐœ์›” ์ „ ์—…๋ฐ์ดํŠธ
์„ค์น˜

Remote Desktop Commander

์ œ์ž‘์ž: desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

ํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰โ˜… 211์–ด์ œ ์—…๋ฐ์ดํŠธ
์„ค์น˜

Apify MCP Server

์ œ์ž‘์ž: apify

Extract data from any website with thousands of scrapers, crawlers, and automations on Apify Store โšก

ํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰์˜ค๋Š˜ ์—…๋ฐ์ดํŠธ
์„ค์น˜

์ œ์ž‘์ž์˜ README

README ์—ด๊ธฐ

์ œ์ž‘์ž์˜ ์ €์žฅ์†Œ์—์„œ ์“ฐ์ธ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™”์–ด์š”. PopNx MCP๊ฐ€ ๊ฒ€ํ† ํ•˜๊ฑฐ๋‚˜ ๋ณด์ฆํ•œ ๋‚ด์šฉ์ด ์•„๋‹ˆ์—์š”. HTML, ์ด๋ฏธ์ง€, ์Šคํฌ๋ฆฝํŠธ๋Š” ์ œ๊ฑฐํ–ˆ์–ด์š”. ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ด ์‚ฌ์ดํŠธ๋ฅผ ๋ฒ—์–ด๋‚˜์š”.

๐Ÿด gulltoppr

*A real session: an unverified MEV bot that traded seconds earlier (no source, no ABI anywhere) resolved to a full interface in two MCP tool calls.*

The REST engine for gulltoppr: the resolution ladder + verb surface that lets an AI agent go from (chain, address) to a correct, simulated, safe contract interaction. This is "the engine" of the four faces (REST โ†’ MCP โ†’ SDK โ†’ Skill); see ../SPEC.md for the full contract and ../IDEATION.md for the strategy.

TypeScript + viem + Hono. The heimdall decompile rung is delegated over HTTP to gulltoppr (kept out-of-process by design).

Run

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)

Set LIVE_ENGINE_BASE_URL=https://api.gulltoppr.dev with npm run test:live to smoke a deployed engine instead of the local in-process server. The scheduled live GitHub Action runs the local path; manual dispatch can set the same deployed URL.

Env
vardefaultnotes
PORT8787
HEIMDALL_API_URLhttp://heimdall-api.flycastheimdall decompile service (ladder rung 4). Private to the Fly org since 2026-07-27 โ€” point this at your own instance when running outside it, or rung 4 falls back to selector-only via 4byte
HEIMDALL_CONCURRENCY2per-process cap on outbound decompile/decode requests; 0 disables
HEIMDALL_QUEUE_TIMEOUT_MS5000max time a gulltoppr request can wait for an outbound concurrency slot
ENS_RPC_URLhttps://ethereum-rpc.publicnode.commainnet RPC for ENS/Basenames Universal Resolver calls; use a private RPC in production
ETHERSCAN_API_KEY_(empty)_one multichain v2 key; empty disables rung 1
ETHERSCAN_RATE_LIMIT4per-process fixed-window budget for the shared Etherscan key; 0 disables
ETHERSCAN_RATE_WINDOW_SEC1Etherscan budget window length
SIGNING_BASE_URLhttps://abi.ninjabase for prepare_tx hand-off deeplinks
RATE_LIMIT120per-IP requests per window (fixed window); 0 disables
RATE_LIMIT_WINDOW_SEC60rate-limit window length
RATE_LIMIT_ALLOW_(empty)_comma-separated IP allowlist (exempt); private 6PN IPs are always exempt
ANTHROPIC_API_KEY_(empty)_enables the registry's LLM propose-and-verify pass on decompiles; empty disables
REGISTRY_LLM_MODELclaude-opus-4-8model for propose-and-verify

Endpoints (SPEC ยง4)

verbroute
discoveryGET / ยท root discovery document with REST/MCP links, verbs, utility tools, and the prepare_tx safety gate
OpenAPIGET /openapi.json ยท machine-readable REST contract for coding agents and integrations
agent guideGET /llms.txt ยท compact LLM/coding-agent guide; also published at https://gulltoppr.dev/llms.txt
resolve_abiGET /v1/{chain}/{address}/abi?include_abi=&method_q=&method_kind=&method_limit= ยท set include_abi=false for compact manifest/provenance without raw ABI
read_contractPOST /v1/{chain}/{address}/read ยท body {function, args}
encode_callPOST /v1/{chain}/{address}/encode ยท body {function, args, value?}
simulatePOST /v1/{chain}/simulate ยท body {from,to,data,value?} or {from,address,function,args,value?}; never mix both forms
prepare_txPOST /v1/{chain}/{address}/prepare ยท body {function, args, from, value?}
decode_txGET /v1/{chain}/tx/{hash}
resolve_nameGET /v1/{chain}/name/{name} ยท GET /v1/{chain}/name/by-address/{address}
chain catalogGET /v1/chains?q=&testnets=&has_default_rpc= ยท viem-backed aliases with testnet/has_default_rpc flags for UI clients
registry lookupGET /v1/lookup/{selector} ยท 4-byte (function/error) or 32-byte (event topic0), chain-independent
registry statsGET /v1/registry/stats
registry exportGET /v1/registry/export ยท CC0 NDJSON selector commons (X-License: CC0-1.0)
runtime metricsGET /v1/metrics ยท in-process rung/RPC attempts, latency, misses, and failure rates

GET routes set explicit Cache-Control: verified ABI responses cache longest, proxy ABI responses are short-lived, transaction decodes are immutable, the OpenAPI contract is cacheable, and operational endpoints such as /health and /v1/metrics are no-store. Rate-limited routes expose RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, and Retry-After on 429 responses. ABI resolves also return X-Source, X-Confidence, X-Cache, X-Elapsed-Ms, and X-ABI-Included.

The registry (selector commons)

The engine seeds an open selectorโ†’signature registry as a byproduct of resolution:

  • Every verified resolution (Etherscan/Sourcify) harvests ground-truth selector โ†’ signature pairs for functions, events (full 32-byte topic0, collision-free), and errors. Proof grade: verified-source.
  • Resolutions are also indexed by skeleton hash (runtime bytecode with the solc metadata trailer stripped), so byte-identical clones resolve via a new bytecode-match rung without re-running the ladder. Verified claims are capped to partial for clones (this address's source was never verified), and provenance.bytecode_match points at the original chain/address/source/confidence that supplied the reused ABI.
  • Decompiled ABIs get Unresolved_ names replaced from proven registry entries, and (when ANTHROPIC_API_KEY is set) a fire-and-forget propose-and-verify pass asks Claude for candidate signatures and accepts only those where keccak256(sig)[:4] reproduces the selector: proof grade keccak-proven (signature proven; semantics still inferred).
  • Public 4byte fallback labels are also selector-matched locally before use, but remain unproven labels and never enter the commons as proof.

Only the engine's own pipeline writes to the registry; no open submissions (that's how 4byte got collision-poisoned).

The accumulated data is published as a CC0 dataset: evm-abi-commons (regenerate any time from GET /v1/registry/export; the response is NDJSON and includes X-License: CC0-1.0 plus a license Link header). Lookup/export entries include proof grade and, for harvested verified-source entries when known, the source chain and address. SDK users can call lookupSelector, registryStats, and exportRegistry directly.

{chain} is any alias from GET /v1/chains (backed by viem/chains) or a numeric id. Chain entries include testnet and has_default_rpc so agents can decide when to ask for rpc_url; q matches ids, names, aliases, native symbols, and multi-word searches such as bnb chain. Pass ?rpc_url= to override the RPC (required for chains with no default, e.g. local/31337; this is how any EVM chain works before it has a built-in alias).

For agent contexts, prefer include_abi=false on resolve_abi unless you need the raw JSON ABI. The compact response preserves interface, provenance, proxy, token, and abi_for, and marks abi_omitted: true. For large contracts, add method_q, method_kind=read|write|all, and method_limit to return only the manifest methods relevant to the user's intent.

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 gates the hand-off. If simulation fails, risk_level is blocked, deeplink is empty, and wallet_request is omitted. When signing is recommended, wallet_request is an EIP-1193-shaped eth_sendTransaction payload with hex JSON-RPC quantities for wallet/explorer/app integrations. Decompiled or selector-only writes are high risk and require explicit user confirmation of selector + intent. Positive token/NFT spender approvals are medium risk with spending_approval. Token/NFT outflows from the transfer source, whether trace-derived or inferred from a standard token/NFT transfer, are medium risk with asset_outflow. Clients should show both before hand-off.

Integration recipes for wallets, block explorers, coding agents, and MCP clients are published at docs/integrations.md.

MCP server (SPEC ยง5)

npm run mcp starts a stdio MCP server exposing the seven core verbs plus read-only utility tools for chains, selector commons, and runtime metrics. The tools are a thin adapter over the deployed REST engine (ENGINE_URL), so the MCP shares the engine's persistent cache and Etherscan key; no duplicated resolution or secrets. Tool descriptions bake in the non-custodial hand-off model (prepare_tx never signs), lead with provenance warnings for partial/proxy/bytecode-match/decompiled ABI results, and require prepare_tx.safety.signing_recommended before a signing deeplink or wallet request is handed to the user. JSON MCP tools expose output schemas and structuredContent; clients can branch on provenance, decoded calls, simulations, selector results, metrics, and safety without scraping text.

Wire it into an MCP client (Claude Desktop / Claude Code mcp config):

{

"mcpServers": { "gulltoppr": { "command": "npm", "args": ["run", "--silent", "mcp"], "cwd": "/home/ubuntu/repos/abi-agent", "env": { "ETHERSCAN_API_KEY": "" } } } }

Core tools: resolve_abi, read_contract, encode_call, simulate, prepare_tx, decode_tx, resolve_name. Utility tools: list_chains, lookup_selector, registry_stats, export_registry, runtime_metrics. All are read-only-annotated except prepare_tx (non-destructive: returns an unsigned hand-off, signs nothing).

Remote (Streamable HTTP)

For agents that can't run a local stdio server, the same MCP is hosted over HTTP at https://mcp.gulltoppr.dev/mcp (npm run mcp:http locally; stateless). Point an HTTP-capable MCP client at that URL:

{ "mcpServers": { "gulltoppr": { "url": "https://mcp.gulltoppr.dev/mcp" } } }

Tool registration is shared (src/mcp-server.ts) between the stdio entry (mcp.ts) and the HTTP entry (mcp-http.ts), deployed via Dockerfile.mcp / fly.mcp.toml. MCP directory metadata lives in server.json and advertises the same remote URL, repository, homepage, and icon. The remote MCP service also serves the same metadata at https://mcp.gulltoppr.dev/server.json and https://mcp.gulltoppr.dev/.well-known/mcp-server.json.

npm SDK

A typed client over this REST surface lives in sdk/ (gulltoppr): new Gulltoppr({ baseUrl }).resolveAbi(...) / .read(...) / .prepareTx(...), plus a contract() helper. It's the third face (after REST and MCP) and the basis for wallet, explorer, and app integrations. See sdk/README.md.

Depl

์•ž๋ถ€๋ถ„๋งŒ ๋ณด์—ฌ ๋“œ๋ ค์š”. ๋‚˜๋จธ์ง€๋Š” ์ €์žฅ์†Œ์—์„œ ์ฝ์–ด ๋ณด์„ธ์š”

PopNx์—๊ฒŒ ๋ฌป๊ธฐ