MCP Servers

A collection of Model Context Protocol servers, templates, tools and more.

๐Ÿค– ํ† ์Šค์ฆ๊ถŒ ๊ณต์‹ open api ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” mcp ์„œ๋ฒ„

Created 6/18/2026
Updated about 4 hours ago
Repository documentation and setup instructions

TossInvest MCP

English

ํ† ์Šค์ฆ๊ถŒ ๊ณต์‹ Open API๋ฅผ Hermes Agent ๊ฐ™์€ MCP ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

๊ตญ๋‚ดยท๋ฏธ๊ตญ ์ฃผ์‹์˜ ์ข…๋ชฉ ์ •๋ณด์™€ ์‹œ์„ธ, ๊ณ„์ขŒ ์ž์‚ฐ, ์ฃผ๋ฌธ ๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋ฌธ ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์œผ๋ฉฐ, ๋ณ„๋„๋กœ ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ์—๋„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์™€ MCP ์ฑ„๋„ ๋ฐ–์˜ ์‚ฌ๋žŒ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ์ฃผ๋ฌธ ์ƒ์„ฑยท์ •์ •ยท์ทจ์†Œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋Š” ํ† ์Šค์ฆ๊ถŒ์˜ ๊ณต์‹ ์ œํ’ˆ์ด ์•„๋‹Œ ๋…๋ฆฝ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ํˆฌ์ž ์กฐ์–ธ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•œ ์ฃผ๋ฌธ๊ณผ ๊ทธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ฑ…์ž„์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

์ฃผ์š” ํŠน์ง•

  • ํ† ์Šค์ฆ๊ถŒ Open API v1.1.1์˜ ๋ชจ๋“  ์กฐํšŒ operation ์ง€์›
  • OAuth 2.0 Client Credentials ํ† ํฐ ์ž๋™ ๋ฐœ๊ธ‰ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ
  • ํ† ํฐ ๋งŒ๋ฃŒ 60์ดˆ ์ „ ์„ ์ œ ๊ฐฑ์‹ ๊ณผ ๋™์‹œ ๊ฐฑ์‹  ๋ฐฉ์ง€
  • ๊ณต์‹ API ๊ทธ๋ฃน๋ณ„ ๋กœ์ปฌ rate limit ์ ์šฉ
  • ์กฐํšŒ ์š”์ฒญ์˜ 429 Too Many Requests๋งŒ ์ œํ•œ์ ์œผ๋กœ ์žฌ์‹œ๋„
  • ์ฃผ๋ฌธ ์ƒ์„ฑยท์ •์ •ยท์ทจ์†Œ ์š”์ฒญ์€ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์Œ
  • ๊ณ„์ขŒ๋ฒˆํ˜ธ์™€ account sequence๋ฅผ MCP ์‘๋‹ต์—์„œ ์ œ๊ฑฐ
  • ๊ธฐ๋ณธ ์กฐํšŒ ์ „์šฉ ๋ชจ๋“œ
  • ์ฃผ๋ฌธ ์ƒ์„ฑยท์ •์ •ยท์ทจ์†Œ์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ†’ ๋ณ„๋„ ์‚ฌ๋žŒ ์Šน์ธ โ†’ ์‹คํ–‰ ํ๋ฆ„
  • ์—์ด์ „ํŠธ token๊ณผ ๋ถ„๋ฆฌ๋œ ์‚ฌ๋žŒ ์ „์šฉ ์Šน์ธ token
  • 2๋ถ„ ํ›„ ๋งŒ๋ฃŒ๋˜๋Š” ์ผํšŒ์šฉ ์ฃผ๋ฌธ ์Šน์ธ ์ƒํƒœ
  • ์›ํ™”ยท๋‹ฌ๋Ÿฌ ์ฃผ๋ฌธ ํ•œ๋„์™€ 1์–ต์› ์ด์ƒ ์ฃผ๋ฌธ์˜ ๊ฐ•์ œ ์ฐจ๋‹จ
  • ๊ตญ๋‚ด ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ์„ ํ˜„์žฌ๊ฐ€๊ฐ€ ์•„๋‹Œ ๊ณต์‹ ์ƒํ•œ๊ฐ€ ๊ธฐ์ค€์œผ๋กœ ๋ณด์ˆ˜์ ์œผ๋กœ ๊ฒ€์‚ฌ
  • ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก๊ณผ ํŒ๋งค ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰์„ ์ฃผ๋ฌธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋‹จ๊ณ„์—์„œ ๊ฒ€์ฆ
  • Bearer ์ธ์ฆ๊ณผ Origin ๊ฒ€์‚ฌ๊ฐ€ ์ ์šฉ๋œ Streamable HTTP MCP
  • ์กฐํšŒยท๋ฏธ๋ฆฌ๋ณด๊ธฐยท์‹คํ–‰ ์œ„ํ—˜๋„๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” MCP Tool annotation๊ณผ ๊ตฌ์กฐํ™”๋œ ์‘๋‹ต schema
  • non-root, read-only filesystem, capability ์ œ๊ฑฐ๊ฐ€ ์ ์šฉ๋œ Docker ๊ตฌ์„ฑ
  • ์กฐํšŒ ์ „์šฉ๊ณผ ๊ฑฐ๋ž˜ ์ ˆ์ฐจ๋ฅผ ๋ถ„๋ฆฌํ•œ Hermes Agent Skill ์ œ๊ณต

๋™์ž‘ ๊ตฌ์กฐ

flowchart LR
    U["์‚ฌ์šฉ์ž"] --> H["Hermes Agent"]
    H -->|"MCP Streamable HTTP<br/>Bearer ์ธ์ฆ"| M["TossInvest MCP"]
    U -->|"๋ณ„๋„ ์Šน์ธ ํŽ˜์ด์ง€<br/>์‚ฌ๋žŒ ์ „์šฉ token"| M
    M --> A["OAuth ํ† ํฐ ์บ์‹œ"]
    M --> R["Rate Limiter"]
    M --> S["์ฃผ๋ฌธ ์•ˆ์ „์žฅ์น˜"]
    A --> T["ํ† ์Šค์ฆ๊ถŒ Open API"]
    R --> T
    S --> T

TossInvest MCP๋Š” ํ† ์Šค์ฆ๊ถŒ ์ธ์ฆ ์ •๋ณด๋ฅผ Hermes์— ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ OAuth ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ , Hermes์—๋Š” ํ•„์š”ํ•œ MCP ๋„๊ตฌ์™€ ์ •์ œ๋œ ๊ฒฐ๊ณผ๋งŒ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‹คํ–‰ ์ฃผ์†Œ:

| ์šฉ๋„ | ์ฃผ์†Œ | | --- | --- | | MCP endpoint | http://127.0.0.1:8000/mcp | | ํ”„๋กœ์„ธ์Šค ์ƒํƒœ | http://127.0.0.1:8000/healthz | | ํ† ์Šค API ์ธ์ฆ ์ค€๋น„ ์ƒํƒœ | http://127.0.0.1:8000/readyz |

๋น ๋ฅธ ์‹œ์ž‘

์ค€๋น„๋ฌผ

  • ํ† ์Šค์ฆ๊ถŒ Open API client_id, client_secret
  • Docker ๋ฐ Docker Compose
  • Hermes Agent
  • ์„ค์ • ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ํ„ฐ๋ฏธ๋„ ํ™˜๊ฒฝ

1. ์ €์žฅ์†Œ ๋ฐ›๊ธฐ

git clone https://github.com/cha2hyun/tossinvest-mcp.git
cd tossinvest-mcp

2. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

cp .env.example .env
openssl rand -hex 32

์ถœ๋ ฅ๋œ ์ž„์˜ ๋ฌธ์ž์—ด์€ .env์˜ MCP_AUTH_TOKEN์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ TOSSINVEST_CLIENT_SECRET๊ณผ ๋ฐ˜๋“œ์‹œ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œ ์„ค์ • ์˜ˆ์‹œ:

TOSSINVEST_CLIENT_ID=๋ฐœ๊ธ‰๋ฐ›์€_client_id
TOSSINVEST_CLIENT_SECRET=๋ฐœ๊ธ‰๋ฐ›์€_client_secret
TOSSINVEST_ACCOUNT_SEQ=1

MCP_AUTH_TOKEN=openssl๋กœ_์ƒ์„ฑํ•œ_์ถฉ๋ถ„ํžˆ_๊ธด_์ž„์˜_๋ฌธ์ž์—ด
MCP_PUBLISHED_PORT=8000
LOG_LEVEL=INFO

TOSSINVEST_ACCOUNT_SEQ์˜ ์‹ค์ œ ๊ฐ’์€ ๊ณ„์ขŒ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธ ๋ฐฉ๋ฒ•์€ ๊ณ„์ขŒ sequence ํ™•์ธ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

3. ์„œ๋ฒ„ ์‹คํ–‰

docker compose up -d --build

4. ์ƒํƒœ ํ™•์ธ

curl http://127.0.0.1:8000/healthz
curl http://127.0.0.1:8000/readyz
docker compose ps
docker compose logs -f tossinvest-mcp

์ •์ƒ ์ƒํƒœ ์˜ˆ์‹œ:

{"status":"ok","service":"tossinvest-mcp"}

readyz๋Š” ํ† ์Šค์ฆ๊ถŒ OAuth ํ† ํฐ ๋ฐœ๊ธ‰๊นŒ์ง€ ํ™•์ธํ•˜๋ฏ€๋กœ ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ 503์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ† ์Šค์ฆ๊ถŒ API ์ธ์ฆ ์ •๋ณด ์ค€๋น„

  1. ํ† ์Šค์ฆ๊ถŒ WTS์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์„ค์ •์˜ Open API ๋ฉ”๋‰ด์—์„œ API ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฐœ๊ธ‰๋œ client_id์™€ client_secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‘ ๊ฐ’์€ TossInvest MCP ์„œ๋ฒ„์˜ .env์—๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

client_secret์€ Git ์ €์žฅ์†Œ, Hermes ์„ค์ •, ํ”„๋กฌํ”„ํŠธ, ์ฑ„ํŒ…, ๋กœ๊ทธ์— ๋„ฃ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ณ„์ขŒ sequence ํ™•์ธ

๊ณ„์ขŒยท์ž์‚ฐยท์ฃผ๋ฌธ API๋Š” X-Tossinvest-Account ํ—ค๋”์— accountSeq๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ๊ณ„์ขŒ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํ† ์Šค์ฆ๊ถŒ์˜ ๊ณ„์ขŒ ๋ชฉ๋ก API์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

jq๊ฐ€ ์„ค์น˜๋œ ๋กœ์ปฌ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

set -a
source .env
set +a

ACCESS_TOKEN="$(
  curl -fsS -X POST 'https://openapi.tossinvest.com/oauth2/token' \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode "client_id=${TOSSINVEST_CLIENT_ID}" \
    --data-urlencode "client_secret=${TOSSINVEST_CLIENT_SECRET}" |
  jq -r '.access_token'
)"

curl -fsS 'https://openapi.tossinvest.com/api/v1/accounts' \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" |
jq '.result[] | {accountSeq, accountType}'

unset ACCESS_TOKEN

์ถœ๋ ฅ๋œ accountSeq๋ฅผ .env์˜ TOSSINVEST_ACCOUNT_SEQ์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๋ช…๋ น์€ ๊ณ„์ขŒ ์‹๋ณ„ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋ฏ€๋กœ ์ถœ๋ ฅ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์ €์žฅ์†Œ์— ๋‚จ๊ธฐ์ง€ ๋งˆ์„ธ์š”.

MCP์˜ list_accounts ๋„๊ตฌ๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ์›๋ณธ ๊ณ„์ขŒ๋ฒˆํ˜ธ์™€ accountSeq๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ„์ขŒ ์œ ํ˜•๊ณผ ํ˜„์žฌ ์„œ๋ฒ„์— ์„ค์ •๋œ ๊ณ„์ขŒ์ธ์ง€ ์—ฌ๋ถ€๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

| ๋ณ€์ˆ˜ | ํ•„์ˆ˜ ์กฐ๊ฑด | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… | | --- | --- | --- | --- | | TOSSINVEST_CLIENT_ID | ํ•ญ์ƒ | ์—†์Œ | ํ† ์Šค์ฆ๊ถŒ Open API ํด๋ผ์ด์–ธํŠธ ID | | TOSSINVEST_CLIENT_SECRET | ํ•ญ์ƒ | ์—†์Œ | ํ† ์Šค์ฆ๊ถŒ Open API ํด๋ผ์ด์–ธํŠธ secret | | TOSSINVEST_ACCOUNT_SEQ | ๊ณ„์ขŒยท์ฃผ๋ฌธ ๋„๊ตฌ | ์—†์Œ | ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•  ๊ณ ์ • ๊ณ„์ขŒ sequence | | TOSSINVEST_MAX_ORDER_KRW | ์ฃผ๋ฌธ ํ™œ์„ฑํ™” | ์—†์Œ | ๋‹จ์ผ ์›ํ™” ์ฃผ๋ฌธ ์ตœ๋Œ€ ๊ธˆ์•ก | | TOSSINVEST_MAX_ORDER_USD | ์ฃผ๋ฌธ ํ™œ์„ฑํ™” | ์—†์Œ | ๋‹จ์ผ ๋‹ฌ๋Ÿฌ ์ฃผ๋ฌธ ์ตœ๋Œ€ ๊ธˆ์•ก | | TOSSINVEST_APPROVAL_TOKEN_SHA256 | ์ฃผ๋ฌธ ํ™œ์„ฑํ™” | ์—†์Œ | ์‚ฌ๋žŒ ์ „์šฉ ์Šน์ธ token์˜ SHA-256 hex digest | | TOSSINVEST_APPROVAL_BASE_URL | ์„ ํƒ | http://127.0.0.1:8000 | ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ํ‘œ์‹œํ•  ์Šน์ธ ํŽ˜์ด์ง€ ์ฃผ์†Œ | | TOSSINVEST_BASE_URL | ์„ ํƒ | ๊ณต์‹ API ์ฃผ์†Œ | ํ…Œ์ŠคํŠธ ๋˜๋Š” ํ˜ธํ™˜ ํ”„๋ก์‹œ์šฉ API ์ฃผ์†Œ | | TOSSINVEST_REQUEST_TIMEOUT | ์„ ํƒ | 15 | ํ† ์Šค API ์š”์ฒญ timeout(์ดˆ) | | MCP_AUTH_TOKEN | ํ•ญ์ƒ | ์—†์Œ | MCP ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•˜๋Š” Bearer token, ์ตœ์†Œ 16์ž | | MCP_ALLOWED_ORIGINS | ์„ ํƒ | ๋นˆ ๊ฐ’ | ํ—ˆ์šฉํ•  ๋ธŒ๋ผ์šฐ์ € Origin์˜ ์‰ผํ‘œ ๊ตฌ๋ถ„ ๋ชฉ๋ก | | MCP_HOST | ์ง์ ‘ ์‹คํ–‰ | 0.0.0.0 | Compose ์™ธ ์ง์ ‘ ์‹คํ–‰ ์‹œ listen ์ฃผ์†Œ | | MCP_PORT | ์ง์ ‘ ์‹คํ–‰ | 8000 | Compose ์™ธ ์ง์ ‘ ์‹คํ–‰ ์‹œ listen ํฌํŠธ | | MCP_PUBLISHED_PORT | Docker Compose | 8000 | ํ˜ธ์ŠคํŠธ์— ๊ณต๊ฐœํ•  ํฌํŠธ | | LOG_LEVEL | ์„ ํƒ | INFO | ์„œ๋ฒ„ ๋กœ๊ทธ ๋ ˆ๋ฒจ |

์ฃผ์˜์‚ฌํ•ญ:

  • .env๋Š” .gitignore์— ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ๋ณ„๋„๋กœ ๋ฐฑ์—…ยท๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • MCP_AUTH_TOKEN์€ ํ† ์Šค์ฆ๊ถŒ client_secret๊ณผ ๋‹ค๋ฅธ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ ์ „์šฉ ์Šน์ธ token์€ MCP token๊ณผ ํ† ์Šค์ฆ๊ถŒ secret ๋ชจ๋‘์™€ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋ฌธ ๊ธฐ๋Šฅ์„ ์ผœ๋ฉด ๊ณ„์ขŒ sequence, ๋‘ ํ†ตํ™”์˜ ์ฃผ๋ฌธ ํ•œ๋„, ์Šน์ธ token์ด ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์›๋ฌธ ์Šน์ธ token์€ ์„œ๋ฒ„ .env, Hermes ํ™˜๊ฒฝ๋ณ€์ˆ˜, Hermes ์„ค์ •์— ๋„ฃ์ง€ ๋งˆ์„ธ์š”. ์„œ๋ฒ„์—๋Š” TOSSINVEST_APPROVAL_TOKEN_SHA256๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • Hermes์— ์„œ๋ฒ„ .env๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” filesystem/shell ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ฉด ์Šน์ธ ๊ฒฝ๊ณ„๊ฐ€ ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค.
  • ๋นˆ ์ฃผ๋ฌธ ํ•œ๋„๋Š” ๋ฌด์ œํ•œ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๋ฌธ ํ™œ์„ฑํ™” ์‹œ ์„œ๋ฒ„ ์‹œ์ž‘ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

Docker๋กœ ์‹คํ–‰

๋นŒ๋“œ์™€ ์‹œ์ž‘

docker compose up -d --build

๋กœ๊ทธ ํ™•์ธ

docker compose logs -f tossinvest-mcp

์žฌ์‹œ์ž‘

docker compose restart tossinvest-mcp

์ข…๋ฃŒ

docker compose down

๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ ํฌํŠธ ์‚ฌ์šฉ

.env:

MCP_PUBLISHED_PORT=18000

์ด ๊ฒฝ์šฐ MCP ์ฃผ์†Œ๋Š” http://127.0.0.1:18000/mcp๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Hermes ์„ค์ •์˜ URL๋„ ๊ฐ™์€ ํฌํŠธ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์Šน์ธ URL๋„ ๊ฐ™์€ ํฌํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

TOSSINVEST_APPROVAL_BASE_URL=http://127.0.0.1:18000

Compose๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํŠธ๋ฅผ 127.0.0.1์—๋งŒ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” Hermes๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์ด๋ฉฐ, ํŠน๋ณ„ํ•œ ์ด์œ  ์—†์ด 0.0.0.0์œผ๋กœ ๊ณต๊ฐœํ•˜์ง€ ๋งˆ์„ธ์š”.

๊ณต๊ฐœ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ

๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ๊ฐ€ ๋ฐœํ–‰๋œ ์ดํ›„์—๋Š” GHCR ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker pull ghcr.io/cha2hyun/tossinvest-mcp:latest
docker compose up -d

ํŠน์ • ๋ฒ„์ „์„ ์šด์˜ ํ™˜๊ฒฝ์— ๊ณ ์ •ํ•˜๋ ค๋ฉด latest ๋Œ€์‹  SemVer ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Hermes Agent ์—ฐ๊ฒฐ

1. Hermes์šฉ ํ† ํฐ ์ €์žฅ

~/.hermes/.env:

TOSSINVEST_MCP_AUTH_TOKEN=.env์˜_MCP_AUTH_TOKEN๊ณผ_๋™์ผํ•œ_๊ฐ’

Bearer ์ ‘๋‘์‚ฌ๋Š” ์ด ํŒŒ์ผ์— ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. MCP ์„œ๋ฒ„ ์„ค์ • ์ถ”๊ฐ€

~/.hermes/config.yaml์˜ ์ตœ์ƒ์œ„ mcp_servers ์•„๋ž˜์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

mcp_servers:
  tossinvest:
    url: "http://127.0.0.1:8000/mcp"
    headers:
      Authorization: "Bearer ${TOSSINVEST_MCP_AUTH_TOKEN}"
    enabled: true
    timeout: 120
    connect_timeout: 30
    supports_parallel_tool_calls: false
    tools:
      include:
        - get_stock_info
        - get_stock_warnings
        - get_prices
        - get_orderbook
        - get_recent_trades
        - get_price_limits
        - get_candles
        - get_exchange_rate
        - get_market_calendar
        - list_accounts
        - get_holdings
        - list_orders
        - get_order
        - get_buying_power
        - get_sellable_quantity
        - get_commissions
      resources: false
      prompts: false

๋™์ผํ•œ ์˜ˆ์ œ๋Š” examples/hermes-config.yaml์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์—ฐ๊ฒฐ ํ™•์ธ

hermes mcp test tossinvest

์กฐํšŒ ์ „์šฉ ๊ธฐ๋ณธ ๋ชจ๋“œ์—์„œ๋Š” 16๊ฐœ ๋„๊ตฌ๊ฐ€ ๋ณด์—ฌ์•ผ ํ•˜๋ฉฐ, place_order, modify_order, cancel_order ๊ฐ™์€ ์ฃผ๋ฌธ ์‹คํ–‰ ๋„๊ตฌ๋Š” ๋ณด์ด๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

Hermes Skill ์„ค์น˜

MCP ๋„๊ตฌ๋Š” โ€œ๋ฌด์—‡์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€โ€๋ฅผ ์ œ๊ณตํ•˜๊ณ , Skill์€ Hermes์— โ€œ์–ด๋–ค ์ˆœ์„œ์™€ ์•ˆ์ „ ๊ทœ์น™์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€โ€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

mkdir -p ~/.hermes/skills
cp -R skills/tossinvest ~/.hermes/skills/
cp -R skills/tossinvest-trading ~/.hermes/skills/
hermes skills list | grep tossinvest

์„ค์น˜ ํ›„ ์ƒˆ Hermes ์„ธ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. tossinvest๋Š” ์กฐํšŒ ์ ˆ์ฐจ๋งŒ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. tossinvest-trading์€ ๊ฑฐ๋ž˜ ๋„๊ตฌ๊ฐ€ ์‹ค์ œ๋กœ ๋“ฑ๋ก๋œ ๊ฒฝ์šฐ์—๋งŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ ๋‹ค์Œ ํ๋ฆ„์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

  1. ์ข…๋ชฉ๊ณผ ์‹œ์žฅ ํ™•์ธ
  2. ์žฅ ์šด์˜ ์‹œ๊ฐ„ ํ™•์ธ
  3. ์ข…๋ชฉ ๊ฒฝ๊ณ  ์กฐํšŒ
  4. ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก ๋˜๋Š” ํŒ๋งค ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰ ํ™•์ธ
  5. ์ฃผ๋ฌธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์™€ ์Šน์ธ URL ์ œ์‹œ
  6. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„ ์Šน์ธ ํŽ˜์ด์ง€์—์„œ ์ฃผ๋ฌธ ๋‚ด์šฉ ํ™•์ธ
  7. ์‚ฌ๋žŒ ์ „์šฉ token์œผ๋กœ ์Šน์ธํ•œ ๋’ค ํ•œ ๋ฒˆ๋งŒ ์ฃผ๋ฌธ ์‹คํ–‰
  8. ์ฃผ๋ฌธ ์ƒ์„ธ ์žฌ์กฐํšŒ
  9. ์ƒํƒœ๊ฐ€ ๋ถˆ๋ช…ํ™•ํ•˜๋ฉด ์žฌ์ฃผ๋ฌธํ•˜์ง€ ์•Š๊ณ  ์ฃผ๋ฌธ ๋‚ด์—ญ ํ™•์ธ

Skill์€ ํ–‰๋™ ์ง€์นจ์ด๋ฉฐ ๋ณด์•ˆ ๊ฒฝ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜ ์ œํ•œ๊ณผ ํ™•์ธ ์ ˆ์ฐจ๋Š” MCP ์„œ๋ฒ„๋„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ณต ๋„๊ตฌ

Hermes์—์„œ๋Š” ์„œ๋ฒ„ ์ด๋ฆ„์ด ๋„๊ตฌ๋ช… ์•ž์— ๋ถ™์–ด mcp_tossinvest_get_prices์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” MCP ์„œ๋ฒ„ ๋‚ด๋ถ€ ๋„๊ตฌ๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ข…๋ชฉยท์‹œ์„ธ

| ๋„๊ตฌ | ์„ค๋ช… | ์ฃผ์š” ์ž…๋ ฅ | | --- | --- | --- | | get_stock_info | ์ข…๋ชฉ๋ช…, ์‹œ์žฅ, ํ†ตํ™”, ์ƒ์žฅ ์ƒํƒœ ๋“ฑ ์ข…๋ชฉ ๊ธฐ๋ณธ ์ •๋ณด | symbols | | get_stock_warnings | ํˆฌ์ž๊ฒฝ๊ณ , ์œ„ํ—˜, ๊ณผ์—ด, VI ๋“ฑ ๋งค์ˆ˜ ์œ ์˜์‚ฌํ•ญ | symbol | | get_prices | ์ตœ๋Œ€ 200๊ฐœ ์ข…๋ชฉ์˜ ํ˜„์žฌ๊ฐ€ | symbols | | get_orderbook | ๋งค์ˆ˜ยท๋งค๋„ ํ˜ธ๊ฐ€ | symbol | | get_recent_trades | ์ตœ๊ทผ ์ฒด๊ฒฐ ๋‚ด์—ญ, ์ตœ๋Œ€ 50๊ฑด | symbol, count | | get_price_limits | ๊ตญ๋‚ด ์ข…๋ชฉ ์ƒํ•œ๊ฐ€ยทํ•˜ํ•œ๊ฐ€ | symbol | | get_candles | 1๋ถ„๋ด‰ ๋˜๋Š” ์ผ๋ด‰ OHLCV | symbol, interval, count |

์—ฌ๋Ÿฌ ์ข…๋ชฉ์„ ๋ฐ›๋Š” symbols ์ž…๋ ฅ์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

005930,000660,AAPL

์‹œ์žฅ ์ •๋ณด

| ๋„๊ตฌ | ์„ค๋ช… | ์ฃผ์š” ์ž…๋ ฅ | | --- | --- | --- | | get_exchange_rate | KRW/USD ํ™˜์œจ | base_currency, quote_currency | | get_market_calendar | ํ•œ๊ตญ ๋˜๋Š” ๋ฏธ๊ตญ ์žฅ ์šด์˜ ์‹œ๊ฐ„ | market, date |

๊ณ„์ขŒยท์ž์‚ฐ

| ๋„๊ตฌ | ์„ค๋ช… | ์ฃผ์š” ์ž…๋ ฅ | | --- | --- | --- | | list_accounts | ์‹๋ณ„ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•œ ๊ณ„์ขŒ ์œ ํ˜•๊ณผ ์„ ํƒ ์ƒํƒœ | ์—†์Œ | | get_holdings | ๋ณด์œ  ์ฃผ์‹๊ณผ ํ‰๊ฐ€ยท์†์ต ์ •๋ณด | ์„ ํƒ์  symbol | | get_buying_power | ํ˜„๊ธˆ ๊ธฐ๋ฐ˜ ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก | currency | | get_sellable_quantity | ํ˜„์žฌ ํŒ๋งค ๊ฐ€๋Šฅํ•œ ์ˆ˜๋Ÿ‰ | symbol | | get_commissions | ๊ตญ๋‚ดยท๋ฏธ๊ตญ ์‹œ์žฅ๋ณ„ ์ˆ˜์ˆ˜๋ฃŒ | ์—†์Œ |

์ฃผ๋ฌธ ์กฐํšŒ

| ๋„๊ตฌ | ์„ค๋ช… | ์ฃผ์š” ์ž…๋ ฅ | | --- | --- | --- | | list_orders | ์ง„ํ–‰ ์ค‘ ๋˜๋Š” ์ข…๋ฃŒ ์ฃผ๋ฌธ ๋ชฉ๋ก | status, ๋‚ ์งœ, cursor | | get_order | ์ฃผ๋ฌธ ํ•œ ๊ฑด์˜ ์ƒํƒœ์™€ ์ฒด๊ฒฐ ๊ฒฐ๊ณผ | order_id |

์ฃผ๋ฌธ ์‹คํ–‰

๋‹ค์Œ ๋„๊ตฌ๋Š” ์„œ๋ฒ„๋ฅผ --dangerously-enable-trading ์ธ์ž๋กœ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ๋งŒ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

| ๋‹จ๊ณ„ | ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋„๊ตฌ | ์‹คํ–‰ ๋„๊ตฌ | | --- | --- | --- | | ์ฃผ๋ฌธ ์ƒ์„ฑ | preview_order | place_order | | ์ฃผ๋ฌธ ์ •์ • | preview_order_modification | modify_order | | ์ฃผ๋ฌธ ์ทจ์†Œ | preview_order_cancellation | cancel_order |

์ฃผ๋ฌธ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”

๋จผ์ € ์ถฉ๋ถ„ํžˆ ๋‚ฎ์€ ์ฃผ๋ฌธ ํ•œ๋„๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”.

์‚ฌ๋žŒ ์ „์šฉ ์Šน์ธ token์„ 32-byte ๋‚œ์ˆ˜๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ด€๋ฆฌ์ž ๋“ฑ ์„œ๋ฒ„ยทHermes ๋ฐ–์˜ ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์›๋ฌธ token์€ .env์— ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

openssl rand -hex 32

์ €์žฅํ•œ token์„ ํ™”๋ฉด์— ๋‹ค์‹œ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  SHA-256 digest๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

read -rsp "Approval token: " APPROVAL_TOKEN
echo
printf '%s' "$APPROVAL_TOKEN" | openssl dgst -sha256 -r | awk '{print $1}'
unset APPROVAL_TOKEN

์ถœ๋ ฅ๋œ 64์ž๋ฆฌ digest๋งŒ .env์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

TOSSINVEST_ACCOUNT_SEQ=1
TOSSINVEST_MAX_ORDER_KRW=1000000
TOSSINVEST_MAX_ORDER_USD=500
TOSSINVEST_APPROVAL_TOKEN_SHA256=์Šน์ธ_token์˜_64์ž๋ฆฌ_sha256_digest
TOSSINVEST_APPROVAL_BASE_URL=http://127.0.0.1:8000

ํ™˜๊ฒฝ๋ณ€์ˆ˜๋งŒ์œผ๋กœ๋Š” ์ฃผ๋ฌธ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ compose.yaml์— ๊ฑฐ๋ž˜ ์ „์šฉ override ํŒŒ์ผ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ์„œ๋ฒ„ ์‹œ์ž‘ ๋ช…๋ น์— ์œ„ํ—˜ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

docker compose \
  -f compose.yaml \
  -f compose.trading.yaml \
  up -d --build --force-recreate

์ง์ ‘ ์‹คํ–‰ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

uv run tossinvest-mcp --dangerously-enable-trading

TOSSINVEST_ENABLE_TRADING=true ๊ฐ™์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” ์ฃผ๋ฌธ ๊ธฐ๋Šฅ์„ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ --dangerously-enable-trading ์ธ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Hermes allowlist์—๋„ ์ฃผ๋ฌธ ๋„๊ตฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์˜ˆ์‹œ๋Š” examples/hermes-trading-config.yaml์— ์žˆ์Šต๋‹ˆ๋‹ค.

tools:
  include:
    # ๊ธฐ์กด ์กฐํšŒ ๋„๊ตฌ
    - preview_order
    - place_order
    - preview_order_modification
    - modify_order
    - preview_order_cancellation
    - cancel_order

๊ฑฐ๋ž˜ ํ™œ์„ฑํ™” ๋ชจ๋“œ์—์„œ๋Š” ์ด 22๊ฐœ ๋„๊ตฌ๊ฐ€ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

์ฃผ๋ฌธ ์•ˆ์ „์žฅ์น˜

1. ๊ฑฐ๋ž˜ ๋„๊ตฌ ๊ธฐ๋ณธ ๋น„๋…ธ์ถœ

๊ธฐ๋ณธ tossinvest-mcp ๋ช…๋ น๊ณผ ๊ธฐ๋ณธ compose.yaml์€ ์ฃผ๋ฌธ ๋„๊ตฌ๋ฅผ MCP ๋„๊ตฌ ๋ชฉ๋ก ์ž์ฒด์— ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๋ฌธ ๋„๊ตฌ๋ฅผ ์—ด๋ ค๋ฉด ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ --dangerously-enable-trading์„ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. MCP ์ฑ„๋„๊ณผ ๋ถ„๋ฆฌ๋œ ์‚ฌ๋žŒ ์Šน์ธ

์ฃผ๋ฌธ์„ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ๋‹ค์Œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • preview_id
  • ์‚ฌ๋žŒ์ด ์—ด์–ด์•ผ ํ•˜๋Š” approval_url
  • ์ข…๋ชฉ, ๋ฐฉํ–ฅ, ๊ฐ€๊ฒฉ, ์ˆ˜๋Ÿ‰ ๋˜๋Š” ๊ธˆ์•ก
  • ํ˜„์žฌ๊ฐ€์™€ ์˜ˆ์ƒ ์ฃผ๋ฌธ ๊ธˆ์•ก
  • ์›ํ™” ํ™˜์‚ฐ ์˜ˆ์ƒ ๊ธˆ์•ก
  • ์ข…๋ชฉ ๊ฒฝ๊ณ ์™€ ์žฅ ์šด์˜ ์ •๋ณด
  • ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก ๋˜๋Š” ํŒ๋งค ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰

๋ฏธ๋ฆฌ๋ณด๊ธฐ ์‘๋‹ต์—๋Š” ์ฃผ๋ฌธ์„ ์Šน์ธํ•  ์ˆ˜ ์žˆ๋Š” secret์ด๋‚˜ ํ™•์ธ ๋ฌธ๊ตฌ๊ฐ€ ๋“ค์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ place_order, modify_order, cancel_order๋ฅผ ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์„œ๋ฒ„๋Š” approval-required๋กœ ๊ฑฐ๋ถ€ํ•˜๋ฉฐ ํ† ์Šค์ฆ๊ถŒ ์ฃผ๋ฌธ API๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ์€ approval_url์„ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด์–ด ์ •ํ™•ํ•œ ์ฃผ๋ฌธ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ , ๋ณ„๋„๋กœ ๋ณด๊ด€ํ•œ ์›๋ฌธ ์Šน์ธ token์„ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ž…๋ ฅ๊ฐ’์˜ SHA-256 digest๋งŒ ๋น„๊ตํ•˜๋ฉฐ ์›๋ฌธ token์„ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด token์€ Hermes์— ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” ๋ณ„๋„ credential์ž…๋‹ˆ๋‹ค. ์Šน์ธ ์ƒํƒœ๋Š” ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ํ๊ธฐ๋˜๋ฉฐ, 2๋ถ„์ด ์ง€๋‚˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ์ƒˆ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Origin์ด ์—†๊ฑฐ๋‚˜ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์Šน์ธ ์š”์ฒญ์€ ๊ฑฐ๋ถ€ํ•˜๋ฉฐ ๋ฐ˜๋ณต ์š”์ฒญ๊ณผ preview๋ณ„ ์‹คํŒจ ํšŸ์ˆ˜๋„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

Hermes MCP token โ”€โ”€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ/์‹คํ–‰ ์š”์ฒญ
์‚ฌ๋žŒ ์Šน์ธ token  โ”€โ”€ ๋ณ„๋„ ์›น ์Šน์ธ
๋‘ ์กฐ๊ฑด ๋ชจ๋‘ ์ถฉ์กฑ โ”€โ”€ ํ† ์Šค์ฆ๊ถŒ ์ฃผ๋ฌธ POST

3. ์ฃผ๋ฌธ ๊ธˆ์•ก ์ œํ•œ

  • TOSSINVEST_MAX_ORDER_KRW
  • TOSSINVEST_MAX_ORDER_USD
  • ์›ํ™” ํ™˜์‚ฐ 1์–ต์› ์ด์ƒ ์ฃผ๋ฌธ์˜ ๊ฐ•์ œ ์ฐจ๋‹จ

๋ฏธ๊ตญ ์ฃผ๋ฌธ์€ ๊ณต์‹ ํ™˜์œจ๋กœ ์›ํ™” ๊ฐ€์น˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ 1์–ต์› ์ œํ•œ๋„ ํ•จ๊ป˜ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

4. ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ์˜ ๋ณด์ˆ˜์  ๊ฒ€์‚ฌ

๊ตญ๋‚ด ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ์€ ํ˜„์žฌ๊ฐ€๊ฐ€ ์•„๋‹Œ ๊ณต์‹ ์ƒํ•œ๊ฐ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ˆ์ƒ ๊ธˆ์•ก๊ณผ ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ฃผ๋ฌธ ์‹œ์ ์˜ ๊ฐ€๊ฒฉ ๋ณ€๋™์œผ๋กœ ์„ค์ • ํ•œ๋„๋ฅผ ๋„˜์–ด๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.

๊ณต์‹ ์ƒํ•œ๊ฐ€๋กœ ์ ˆ๋Œ€ ํ•œ๋„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๋Š” ๋ฏธ๊ตญ ์ˆ˜๋Ÿ‰ ๊ธฐ๋ฐ˜ ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ์€ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๊ตญ ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ์€ ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ ๊ณ ์ • order_amount๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฏธ๊ตญ ์‹œ์žฅ๊ฐ€ ์ •์ •๋„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

5. ์‹คํ–‰ ์ง์ „ ์žฌ๊ฒ€์ฆ

์‚ฌ๋žŒ ์Šน์ธ ํ›„ ์‹คํ–‰ ๋„๊ตฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์„œ๋ฒ„๋Š” ๊ฐ€๊ฒฉ, ํ™˜์œจ, ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก ๋˜๋Š” ํŒ๋งค ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰, ์ฃผ๋ฌธ ์ƒํƒœ์™€ ์„ค์ • ํ•œ๋„๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์กŒ๊ฑฐ๋‚˜ ํ•œ๋„๋ฅผ ๋„˜์œผ๋ฉด ํ•ด๋‹น preview๋ฅผ ํ๊ธฐํ•˜๊ณ  preview-state-changed๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋กœ ์ƒˆ preview์™€ ์ƒˆ ์Šน์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

6. ์ฃผ๋ฌธ ์ž๋™ ์žฌ์‹œ๋„ ๊ธˆ์ง€

์ฃผ๋ฌธ ์ƒ์„ฑยท์ •์ •ยท์ทจ์†Œ๋Š” ํ† ํฐ ๋งŒ๋ฃŒ ์‘๋‹ต, rate limit, timeout, ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ž๋™์œผ๋กœ ์žฌ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „์†ก ์ดํ›„ ์—ฐ๊ฒฐ์ด ๋Š๊ฒจ ์ฃผ๋ฌธ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

order-state-unknown

์ด ๊ฒฝ์šฐ ๊ฐ™์€ ์ฃผ๋ฌธ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์ง€ ๋ง๊ณ  list_orders์™€ get_order๋กœ ์ƒํƒœ๋ถ€ํ„ฐ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

7. ๋ฉฑ๋“ฑ์„ฑ

์ฃผ๋ฌธ ์ƒ์„ฑ ์‹œ ์„œ๋ฒ„๊ฐ€ clientOrderId๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ† ์Šค์ฆ๊ถŒ์€ ์ด ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ 10๋ถ„๊ฐ„ ๋ฉฑ๋“ฑ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด ๊ธฐ๋Šฅ์„ ๋ฏฟ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฃผ๋ฌธ์„ ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์‘๋‹ต๊ณผ ์˜ค๋ฅ˜ ํ˜•์‹

์ •์ƒ์ ์ธ Toss API ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ ํ˜•ํƒœ๋กœ ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค.

{
  "data": {},
  "meta": {
    "request_id": "ํ† ์Šค์ฆ๊ถŒ ์š”์ฒญ ์‹๋ณ„์ž",
    "retrieved_at": "2026-06-18T04:00:00+00:00",
    "rate_limit": {
      "limit": "10",
      "remaining": "9",
      "reset": "0.1"
    }
  }
}

request_id๋Š” ํ† ์Šค์ฆ๊ถŒ ๋ฌธ์˜๋‚˜ ์žฅ์•  ์ถ”์  ์‹œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๋Š” MCP ToolError ์•ˆ์— ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

{
  "error": {
    "status_code": 429,
    "code": "rate-limit-exceeded",
    "message": "์š”์ฒญ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.",
    "request_id": "request-id",
    "data": null
  }
}

ํ† ์Šค์ฆ๊ถŒ Authorization header, OAuth access token, client secret, account sequence์™€ ์Šน์ธ token digest๋Š” MCP ๋„๊ตฌ schema, ๊ฒฐ๊ณผ, resource, prompt์— ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šด์˜๊ณผ ๋ณด์•ˆ

๊ธฐ๋ณธ Compose ๋ณด์•ˆ ์„ค์ •:

  • ํ˜ธ์ŠคํŠธ์˜ 127.0.0.1์—๋งŒ ํฌํŠธ ๊ณต๊ฐœ
  • ์ปจํ…Œ์ด๋„ˆ non-root ์‚ฌ์šฉ์ž ์‹คํ–‰
  • read-only root filesystem
  • Linux capability ์ „์ฒด ์ œ๊ฑฐ
  • no-new-privileges
  • /tmp๋งŒ ์ œํ•œ๋œ ์ž„์‹œ filesystem์œผ๋กœ ์ œ๊ณต
  • healthcheck์™€ ์ž๋™ ์žฌ์‹œ์ž‘
  • Uvicorn ๋‹จ์ผ worker

์™ธ๋ถ€ ์„œ๋ฒ„์— ๋ฐฐํฌํ•  ๋•Œ

์ด ์ €์žฅ์†Œ์˜ Compose ํฌํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ์ธํ„ฐ๋„ท์— ๊ณต๊ฐœํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

  • HTTPS reverse proxy ์‚ฌ์šฉ
  • MCP streaming ์‘๋‹ต์„ bufferingํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •
  • ๋ฐฉํ™”๋ฒฝ ๋˜๋Š” ์‚ฌ์„ค๋ง์œผ๋กœ ์ ‘๊ทผ ์ œํ•œ
  • ์ถฉ๋ถ„ํžˆ ๊ธด MCP_AUTH_TOKEN ์‚ฌ์šฉ
  • secret manager ์‚ฌ์šฉ
  • /healthz, /readyz์˜ ์™ธ๋ถ€ ์ ‘๊ทผ ์ œํ•œ
  • Hermes allowlist ์ตœ์†Œํ™”
  • ์ฃผ๋ฌธ ํ•œ๋„๋ฅผ ๋‚ฎ๊ฒŒ ์‹œ์ž‘

์ž์„ธํ•œ ๋‚ด์šฉ์€ SECURITY.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋กœ์ปฌ ๊ฐœ๋ฐœ

Python 3.12์™€ uv๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

uv sync --all-extras

์„œ๋ฒ„ ์ง์ ‘ ์‹คํ–‰:

cp .env.example .env
uv run tossinvest-mcp

๊ฒ€์ฆ:

uv run pytest
uv run ruff check .
uv run ruff format --check .
uv run mypy src
uv run pip-audit --strict
uv run python scripts/update_openapi.py --check
docker build .

๊ณต์‹ OpenAPI ๊ฒ€์‚ฌ๊ธฐ๋Š” ๋‹ค์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • API ๋ฒ„์ „
  • ์ „์ฒด OpenAPI ๋ฌธ์„œ์˜ SHA-256 fingerprint
  • ๋ชจ๋“  HTTP operation
  • ๊ณต์‹ operationId์™€ MCP ๊ตฌํ˜„์˜ ๋งคํ•‘

๊ณต์‹ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๊ฒ€ํ† ํ•œ ๋’ค manifest๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด:

uv run python scripts/update_openapi.py --update

๋ฌธ์ œ ํ•ด๊ฒฐ

401 Unauthorized

MCP ์š”์ฒญ์˜ Authorization header๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Authorization: Bearer <MCP_AUTH_TOKEN>

Hermes์˜ TOSSINVEST_MCP_AUTH_TOKEN์—๋Š” Bearer ์—†์ด ํ† ํฐ ๊ฐ’๋งŒ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

/readyz๊ฐ€ 503์„ ๋ฐ˜ํ™˜ํ•จ

  • TOSSINVEST_CLIENT_ID ํ™•์ธ
  • TOSSINVEST_CLIENT_SECRET ํ™•์ธ
  • ์ปจํ…Œ์ด๋„ˆ์˜ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ™•์ธ
  • ํ† ์Šค์ฆ๊ถŒ Open API ์ ๊ฒ€ ์—ฌ๋ถ€ ํ™•์ธ
docker compose logs tossinvest-mcp

account-not-configured

.env์— ์˜ฌ๋ฐ”๋ฅธ TOSSINVEST_ACCOUNT_SEQ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์ˆ˜์ •ํ•œ ๋’ค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜์„ธ์š”.

docker compose up -d --force-recreate

๊ฑฐ๋ž˜ ๋„๊ตฌ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Œ

๋‹ค์Œ์„ ๋ชจ๋‘ ํ™•์ธํ•˜์„ธ์š”.

  1. Docker ์‹คํ–‰ ์‹œ compose.trading.yaml์„ ํ•จ๊ป˜ ์ง€์ •ํ–ˆ๋Š”์ง€ ํ™•์ธ
  2. ์ง์ ‘ ์‹คํ–‰ ์‹œ --dangerously-enable-trading์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํ™•์ธ
  3. ์›ํ™”ยท๋‹ฌ๋Ÿฌ ์ฃผ๋ฌธ ํ•œ๋„์™€ ์‚ฌ๋žŒ ์Šน์ธ token์ด ๋ชจ๋‘ ์„ค์ •๋๋Š”์ง€ ํ™•์ธ
  4. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ค์ • ๋ณ€๊ฒฝ ํ›„ ๋‹ค์‹œ ์ƒ์„ฑ๋๋Š”์ง€ ํ™•์ธ
  5. Hermes tools.include์— ๊ฑฐ๋ž˜ ๋„๊ตฌ๊ฐ€ ์ถ”๊ฐ€๋๋Š”์ง€ ํ™•์ธ

approval-required

๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ฒฐ๊ณผ์˜ approval_url์„ ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๊ณ  ์ฃผ๋ฌธ ๋‚ด์šฉ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ํŽ˜์ด์ง€์—์„œ ์„œ๋ฒ„ ๋ฐ–์— ๋ณ„๋„๋กœ ๋ณด๊ด€ํ•œ ์›๋ฌธ ์Šน์ธ token์„ ์ž…๋ ฅํ•œ ๋’ค ์‹คํ–‰ ๋„๊ตฌ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์„ธ์š”. .env์—๋Š” ์›๋ฌธ์ด ์•„๋‹ˆ๋ผ TOSSINVEST_APPROVAL_TOKEN_SHA256๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šน์ธ token์„ Hermes ์ฑ„ํŒ…, Hermes ํ™˜๊ฒฝ๋ณ€์ˆ˜, Skill, MCP ์ž…๋ ฅ์— ๋ณต์‚ฌํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

preview-state-changed

์Šน์ธ ํ›„ ์‹คํ–‰ ์ง์ „ ์žฌ๊ฒ€์ฆ์—์„œ ๊ฐ€๊ฒฉ, ํ™˜์œจ, ์ž”๊ณ , ํŒ๋งค ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰ ๋˜๋Š” ์ฃผ๋ฌธ ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด preview๋Š” ํ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ์ƒˆ preview๋ถ€ํ„ฐ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜์„ธ์š”.

unbounded-market-order

์„ค์ • ํ•œ๋„๋ฅผ ๋ณด์ˆ˜์ ์œผ๋กœ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋Š” ์‹œ์žฅ๊ฐ€ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ๋ฏธ๊ตญ ์‹œ์žฅ๊ฐ€ ์‹ ๊ทœ ์ฃผ๋ฌธ์€ ๊ณ ์ • order_amount๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์‹œ์žฅ๊ฐ€ ์ •์ •์€ ์ง€์ •๊ฐ€ ์ •์ •์œผ๋กœ ๋ฐ”๊พธ์–ด ์ƒˆ preview๋ฅผ ๋งŒ๋“œ์„ธ์š”.

origin-not-allowed

๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ MCP ํด๋ผ์ด์–ธํŠธ๊ฐ€ Origin header๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

MCP_ALLOWED_ORIGINS=https://agent.example.com,https://another.example.com

Origin์„ ๋ณด๋‚ด์ง€ ์•Š๋Š” ์ผ๋ฐ˜ ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ์™€ Hermes ๋กœ์ปฌ ์—ฐ๊ฒฐ์€ ์ด ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์–ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

order-state-unknown

์ฃผ๋ฌธ ์š”์ฒญ์ด ์ „์†ก๋œ ๋’ค ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ๊ฐ™์€ ์‹คํ–‰ ๋„๊ตฌ๋ฅผ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”.

  1. list_orders(status="OPEN") ์กฐํšŒ
  2. ์ข…๋ฃŒ ์ฃผ๋ฌธ๋„ ํ•„์š”ํ•˜๋ฉด list_orders(status="CLOSED") ์กฐํšŒ
  3. ๋ฐœ๊ฒฌ๋œ ์ฃผ๋ฌธ ID๋ฅผ get_order๋กœ ํ™•์ธ
  4. ์ฃผ๋ฌธ ์กด์žฌ ์—ฌ๋ถ€๊ฐ€ ํ™•์ •๋˜๊ธฐ ์ „๊นŒ์ง€ ์ƒˆ ์ฃผ๋ฌธ ๊ธˆ์ง€

rate-limit-exceeded

์กฐํšŒ ์š”์ฒญ์€ ์„œ๋ฒ„๊ฐ€ Retry-After๋ฅผ ๋”ฐ๋ผ ์ œํ•œ์ ์œผ๋กœ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์† ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ ๋นˆ๋„๋ฅผ ์ค„์ด์„ธ์š”. ์ฃผ๋ฌธ ์š”์ฒญ์€ rate limit ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ œํ•œ์‚ฌํ•ญ

  • ํ† ์Šค์ฆ๊ถŒ Open API๊ฐ€ ์ œ๊ณตํ•˜๋Š” REST API๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • WebSocket ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‹œ์„ธ ๊ฐฑ์‹ ์ด ํ•„์š”ํ•œ ์—์ด์ „ํŠธ๋Š” ์กฐํšŒ API๋ฅผ pollingํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • OAuth token๊ณผ ์ฃผ๋ฌธ preview๋Š” ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์‹œ ๊ธฐ์กด preview์™€ ์Šน์ธ ์ƒํƒœ๋Š” ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•œ ์ผํšŒ์šฉ preview๋ฅผ ์œ„ํ•ด ๋‹จ์ผ worker๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๊ตฌ์„ฑ์€ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „์ œ๋กœ ํ•˜๋ฉฐ ์ˆ˜ํ‰ ํ™•์žฅ์šฉ ๊ณต์œ  ์ƒํƒœ ์ €์žฅ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ณต์‹ ๋ชจ์˜ํˆฌ์ž ๋˜๋Š” sandbox๊ฐ€ ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‹ค๊ณ„์ขŒ ์ฃผ๋ฌธ ํ…Œ์ŠคํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CI๋Š” ์‹ค์ œ ํ† ์Šค์ฆ๊ถŒ ๊ณ„์ •์— ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ์‹ค์ฃผ๋ฌธ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ์—ฌ

๋ฒ„๊ทธ ์ˆ˜์ •, ๋ฌธ์„œ ๊ฐœ์„ , ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— CONTRIBUTING.md์™€ CODE_OF_CONDUCT.md๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ณด์•ˆ ์ทจ์•ฝ์ ์€ ๊ณต๊ฐœ Issue ๋Œ€์‹  SECURITY.md์˜ ๋น„๊ณต๊ฐœ ์‹ ๊ณ  ์ ˆ์ฐจ๋ฅผ ์ด์šฉํ•˜์„ธ์š”.

๋ผ์ด์„ ์Šค

MIT License

Copyright (c) 2026 cha2hyun

Quick Setup
Installation guide for this server

Install Package (if required)

uvx tossinvest-mcp

Cursor configuration (mcp.json)

{ "mcpServers": { "cha2hyun-tossinvest-mcp": { "command": "uvx", "args": [ "tossinvest-mcp" ] } } }