Skip to main content
Glama
JooSeunghyeon

kookmin-stock

Kookmin MCP Stock Agent

国民大学課題 · 「Hermes + MCP自作サーバーでインパクトを引き上げる」

前回の課題で作成した国内株式推奨Hermesエージェントに自作MCPサーバーを接続し、 作業の質がどのように変化するかを3つの実験で証明する。

🎯 含まれているもの

成果物

パス

説明

MCPサーバー (正常)

src/mcp_stock/server.py

FastMCP stdio、ツール6種

MCPサーバー (壊したバージョン)

src/mcp_stock/server_broken.py

間違ったdescription / タイムアウト / 空の応答

30秒動作デモ

src/experiments/exp1_demo.py

録画用シーケンス出力

実験② 結果比較

src/experiments/exp2_quality.py

NO MCP / GOOD / BROKEN 比較

実験③ パターン比較

src/experiments/exp3_orchestration.py

Single / Planner+Executor / Parallel

発表資料(spec)

slides/slides.md

他のAIにそのまま貼り付けてPPT生成

結果成果物

results/exp2_*, results/exp3_*

自動生成された表・CSV・ログ

⚙️ インストール

Python 3.10+ (テスト環境 3.13)。

python -m venv .venv
source .venv/bin/activate
pip install -e .

▶️ 実行

# 1) MCP 서버 검증 (서버는 stdio라 호스트가 붙어야 의미 있음 — Ctrl+C로 종료)
python -m mcp_stock.server

# 2) 30초 동작 데모 (실제로 돌려서 녹화)
python -m experiments.exp1_demo
#  또는 ./demo/record_demo.sh

# 3) 실험 ② 성공/실패 비교 → results/exp2_* 자동 생성
python -m experiments.exp2_quality

# 4) 실험 ③ Orchestration 토큰 비교 → results/exp3_* 자동 생성
python -m experiments.exp3_orchestration

🎥 30秒デモ録画

demo/demo_script.mdにタイムコード別の行動がまとめられている。 最も単純なパス:

./demo/record_demo.sh         # QuickTime/Cmd+Shift+5 로 화면 녹화하면서 실행
./demo/record_demo.sh --asciinema   # 텍스트 캡처 (asciinema 필요)

🧪 実験① — MCPサーバー (ツール6種)

ツール

入力

出力

get_market_overview(date)

'today' / YYYY-MM-DD

{kospi:{close, changePct, tradingValueKrw}, kosdaq:{...}}

get_top_gainers(market, top_n)

KOSPI/KOSDAQ, 1..50

上位N銘柄

get_stock_quote(ticker)

コードまたは韓国語名

close / changePct / volume / per / pbr

get_recent_news(query, top_n)

キーワードまたは銘柄名

ヘッドライン + positivityScore

get_fundamentals(ticker)

コードまたは韓国語名

per / pbr / eps / bps / roe

recommend_buys(market, top_n, criteria)

KOSPI/KOSDAQ

scoreBreakdown + rationale

データ: Naver Finance クローリング 単一ソース (src/mcp_stock/sources/naver.py)。無料・キー不要。

  • 指数: polling.finance.naver.com/api/realtime/domestic/index/{KOSPI|KOSDAQ} JSON

  • 上昇率上位: finance.naver.com/sise/sise_rise.naver?sosok={0|1} HTML

  • 銘柄詳細 / PER・EPS・PBR・配当: finance.naver.com/item/main.naver?code=... (安定した id="_per" などのemphasisタグ)

  • 銘柄別ニュース: finance.naver.com/item/news_news.naver?code=...

  • 休場日 / Naverページ変更時に自動fallbackスナップショットで安全に動作。

🧪 実験② — Tool成功/失敗結果の品質比較

exp2_quality.pyが同じユーザーの質問を3つの環境で実行し、表・失敗ログを自動生成する。

  • (a) NO MCP — ツール0個。LLMが学習データのみで回答 → ハルシネーション・根拠欠如。

  • (b) GOOD MCP — 正常な自作サーバー。ツール12回呼び出し、4つの好材料キーワードを引用。

  • (c) BROKEN MCPserver_broken.pyの定義通り:

    • get_top_gainersのdescriptionを「下落率上位」と誤記 → モデルが誤選択

    • get_recent_newstime.sleep(5) 後に TimeoutError 発生

    • get_fundamentalsが空のdictを返却

結果:

  • results/exp2_quality_table.md — 比較表

  • results/exp2_failure_logs.md — 失敗呼び出しトレース + 回答本文

  • results/exp2_summary.json — 元の統計

🧪 実験③ — Orchestration 3パターン

パターン

説明

トークン特性

応答時間特性

Single

1ループ内でツール結果を蓄積

入力トークン ↑↑

最も遅い

Planner + Executor

plannerが呼び出しシーケンスのみ作成し、executorは結果要約のみ

入力トークン ↓

中間

Parallel sub-agents

KOSPI / KOSDAQ / NEWS sub-agentを同時実行

入力トークン ↓↓

最も速い

結果:

  • results/exp3_benchmark.csv — 棒グラフ作成用wide CSV

  • results/exp3_pattern_table.md — 表 + 回顧

  • results/exp3_summary.json — パターン別フルトレース

🤖 LLM連携 — Hermes / 他のホスト

このリポジトリは、LLM APIキーなしでも決定論的なシミュレーションでトークン・トレースが出るように作成した。 実際のHermes / Claude Desktop / Cursorに接続するには:

1) Hermesホストとして使用 (実験②③を実際のLLMで実行する)

src/experiments/runner/hermes_runner.py_callHermes() を埋めるだけでよい。

# TODO(user): replace this body with the real Hermes call.
import httpx
response = httpx.post(self.endpoint, headers=..., json=...)
return response.json()

環境変数 HERMES_ENDPOINT, HERMES_API_KEY を設定後、 AgentRunner インスタンスを HermesRunner() に置き換える。

2) Claude Desktop / Cursorでツールのみ使用

Claude Desktopの claude_desktop_config.json または Cursor MCP設定に追加:

{
  "mcpServers": {
    "kookmin-stock": {
      "command": "python",
      "args": ["-m", "mcp_stock.server"],
      "cwd": "/path/to/Kookmin-University-MCP",
      "env": { "PYTHONPATH": "/path/to/Kookmin-University-MCP/src" }
    }
  }
}

📑 PPT作成

slides/slides.mdを他のAIにそのまま貼り付ければよい。例示プロンプト:

次のmarkdownは5分発表用12枚のスライドspecです。 # Slide N ヘッダー単位でPowerPointスライドを作成してください。 ### Visual ブロックは可能な限りmermaidダイアグラムや表をそのまま表現し、 ### Speaker Notes はスライドノート領域に入れてください。

📤 提出フロー

  1. python -m experiments.exp2_quality && python -m experiments.exp3_orchestration で結果を更新

  2. ./demo/record_demo.sh で30秒デモ録画 → demo/demo.mov

  3. GitHub push (リポジトリURLをREADMEとslide 6に記録)

  4. メール kts123@kookmin.ac.kr へ GitHub URL + slides + demo動画を送信 (締切 5/14 23:59:59)

📁 ディレクトリツリー

.
├── README.md
├── pyproject.toml / requirements.txt
├── demo/
│   ├── demo_script.md
│   └── record_demo.sh
├── results/                 # 자동 생성
├── slides/slides.md
└── src/
    ├── mcp_stock/
    │   ├── server.py
    │   ├── server_broken.py
    │   ├── data/ticker_map.py
    │   ├── sources/naver.py        # 네이버 금융 크롤러 (단일 데이터 소스)
    │   └── tools/{market, quote, news, fundamentals, recommend}.py
    ├── experiments/
    │   ├── exp1_demo.py
    │   ├── exp2_quality.py
    │   ├── exp3_orchestration.py
    │   └── runner/{agent_base, mock_runner, hermes_runner}.py
    └── utils/{logger, token_counter}.py

🛟 トラブルシューティング

症状

原因

対応

naver detail fetch failed for XXXXXX

Naverページに該当銘柄がないか構造変更

自動fallbackスナップショットを使用 — 正常動作

httpx.ConnectError

ネットワークオフライン

全てのツールがfallbackスナップショットで安全に動作

韓国語が文字化け

ターミナルフォント

D2 Coding / Pretendard / SF Mono を推奨

休場日/週末の呼び出し

営業日ではない

ポーリングAPIは最終終値をそのまま返却

Install Server
F
license - not found
A
quality
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JooSeunghyeon/Kookmin-University-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server