Stock Market Data
by pdpd22
README.md
# Stock Market Data MCP
Pythonを書かず、ChatGPTから自然文でYahoo Financeの市場データを取得するRemote MCPサーバーです。
公式MCP Python SDK **2.1.1**、yfinance **1.7.0**、Streamable HTTP、エンドポイント `/mcp`。
最初の3ツールに加え、yfinanceの主要なデータ取得機能を14ツールにまとめています。
**状態:Render FreeへのHTTPSデプロイ、14ツールの外部実データ検証、ChatGPT Plusでの接続とget_quote呼び出しを確認済み。詳細は `docs/STATUS.md`。**
- GitHub: https://github.com/pdpd22/chatgpt-stock-mcp
- MCP endpoint: https://chatgpt-stock-mcp.onrender.com/mcp
- この所有者のChatGPTには `Stock Market Data` として接続済みです。新しい会話で「+」から選択し、日本語で依頼できます。
- 公開ディレクトリへの申請は未実施。個人用MVPで、第三者向けのデータ再配信許諾は未確定です。
- Freeインスタンスは15分無通信で休止し、復帰に約1分かかる場合があります。既存のFreeサービスと月750時間枠を共有します。
## 必要環境
- Python 3.12(開発環境は3.12.13)
- Git(GitHubから取得する場合)
- インターネット接続。Yahoo FinanceへのHTTP/WebSocket通信が必要です。
- ChatGPTへの接続にはWeb版の対応アカウントと外部HTTPS URL、または公式Secure MCP Tunnel。
- このサーバーはOpenAI APIを呼びません。OpenAI APIキー・API課金は不要です。
- Dockerは任意です。
## セットアップ:macOS / Linux
GitHubから取得するかZIPを展開して実行します。
```bash
git clone https://github.com/pdpd22/chatgpt-stock-mcp.git
```
```bash
cd chatgpt-stock-mcp
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-dev.txt
cp .env.example .env
python server.py
```
## セットアップ:Windows PowerShell
```powershell
cd chatgpt-stock-mcp
py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements-dev.txt
Copy-Item .env.example .env
python server.py
```
PowerShellの実行ポリシーで有効化できない場合は設定変更せず、直接実行できます。
```powershell
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
.\.venv\Scripts\python.exe server.py
```
ローカルURLは `http://127.0.0.1:8000/mcp`。Webブラウザで開くだけでは正しく検証できません。
ルート `/` と `/docs` は意図的に404です。MCP以外の公開HTTP機能はありません。
## テスト
外部サービスに依存しないテスト:
```bash
python -m pytest -q
ruff check .
```
サーバーを起動し、別のターミナル(同じ仮想環境)から実データを検証:
```bash
python scripts/smoke_test.py
python scripts/smoke_test.py --extended
```
サーバーの起動・停止も自動化する場合:
```bash
python scripts/smoke_test.py --local --extended
```
`--local` はポート18000で子プロセスを起動し、終了時に停止します。
handshake → tools/list → tools/call を実行し、`reports/live-smoke.json` に結果を保存します。
正常系のエラーは終了コード1です。存在しない銘柄などの意図した異常系だけを成功判定します。
HTTP成功、データ取得成功、ChatGPTによるツール選択成功はそれぞれ別に確認してください。
## Tools
| ツール | 用途 |
|---|---|
| `get_quote` | 最新価格、価格日時、直近日足OHLCV |
| `get_history` | 日・週・月足、最大300行 |
| `get_company_info` | 会社名、取引所、通貨、業種、時価総額、URL |
| `get_ticker_data` | 35種の詳細データ。財務諸表、配当、決算、予想、保有者、ニュース等 |
| `get_price_history` | 分足、期間指定、調整株価、時間外、複数銘柄 |
| `get_options` | 満期一覧、コール・プットのオプションチェーン |
| `search_market_data` | Search / Lookup、銘柄・関連ニュース検索 |
| `get_screen_fields` | 株式・ETF・投資信託スクリーナーの条件一覧 |
| `screen_market` | プリセットまたは最大10条件のAND/ORスクリーニング |
| `get_fund_data` | ETF・投資信託の組入銘柄、資産配分、債券等 |
| `get_market_overview` | 市場概要、開閉状況 |
| `get_sector_industry` | セクター・業種概要、関連企業、業種一覧 |
| `get_events_calendar` | 決算・経済指標・IPO・分割予定 |
| `sample_live_prices` | Yahoo WebSocketの短時間サンプル、最大10秒 |
自然文の例:
- 「AAPLの現在の株価を取得して」
- 「NVDAの過去1年間の株価を取得して」
- 「7203.Tの最近1か月の値動きを取得して」
- 「Appleの四半期キャッシュフローを見せて」
- 「SPYの上位組入銘柄は?」
- 「AAPLのオプション満期を調べてから、一番近い満期のコールを取得して」
- 「米国株の出来高ランキングを取得して」
データ種類、制約、除外した管理APIの対応表は `docs/COVERAGE.md`、実際に検出したJSON Schemaは `docs/tool-catalog.json`。
## 価格の意味
- `get_quote.price` は日時が取得できた通常取引の価格。`price_as_of` を必ず表示します。
- 取得できない場合、`price_kind=latest_daily_bar` として日足の `close` にフォールバックします。リアルタイム価格とは呼びません。
- `date/open/high/low/close/volume` は直近の日足です。取引時間中は未確定の場合があります。
- `fetched_at` はサーバーの取得時刻で、相場の発生時刻とは異なります。
- 通貨はYahooのメタデータを使用し、取得不能ならnull。USDやJPYを推測しません。
- 欠損・NaN・Infinityはnull。データがないことはゼロを意味しません。
- `get_history` は日付昇順で最新N行を返します。5年分は週足または月足を使うと全期間を収めやすくなります。
- `auto_adjust=False` でもYahooが過去値に分割調整を適用することがあります。調整方法を結果に記載します。
## 制限・セキュリティ
- symbolは24文字以内。`.T`、`^GSPC`、`JPY=X`、`BTC-USD` などのYahoo記号に対応。URL、パス、コードは拒否。
- get_historyは最大300行。詳細系は1ページ100件、offset最大5000、列数40、指定fields最大30。
- 複数銘柄は5銘柄、1銘柄100行、合計300行。取得中に時間制限を超える場合は銘柄数を減らしてください。
- JSON構造化データは120,000バイト以内。MCP contentにも表示用JSONが入るため、ワイヤー全体は最大およそその2倍+メタデータです。
- 入力HTTP bodyは16KiB以内。プロセス全体で30ツール呼び出し/分、同時取得4件、応答待ち25秒。
- キャッシュは30秒、128エントリ。ライブサンプルはキャッシュしません。単一プロセスMVP向けです。
- タイムアウトしても処理中のワーカー枠を直ちに開放せず、無制限に上流処理が増えないようにしています。
- ログはリクエストID、ツール名、状態、所要時間。認証ヘッダー・価格本文・会話本文は記録しません。
- 公開ホストを明示許可しDNS rebindingを防止。ChatGPTはサーバー間通信のためCORSは設定していません。
- ツールはすべてreadOnly。注文、ファイルアクセス、任意URL、任意コード実行、シェル実行は提供しません。
- MVPはNo Authentication。URLを知る第三者からの利用を防げないため、個人用検証に限定します。
OAuth追加用に `create_server(token_verifier=..., auth_settings=...)` を用意しています。
標準SDKの認証ディスカバリーに接続できる構造ですが、実際の認証プロバイダー設定・認可・トークン検証はまだ配備していません。
本番ではscope/audience/有効期限検証、OAuth discovery、共有レート制限、WAF、利用者別上限が必要です。
## Provider差し替え
`providers/base.py` の3メソッドを実装した `MarketDataProvider` を `create_server(provider=...)` に渡します。
詳細機能も対応する場合は `ExtendedMarketDataProvider.query(operation, params)` を実装します。
コアモデルは `models.py`。yfinance固有処理は `providers/` にまとまっています。
新APIのデータがない機能は明示的なunsupportedエラーにし、データを捏造しません。
API候補比較・利用条件は `docs/RESEARCH.md`。
## GitHub
リポジトリ名は `chatgpt-stock-mcp` を使用します。秘密を含まないソースのみをコミットします。
`.env`、トークン、証明書、ログ、実相場テスト出力は除外しています。
GitHub上の新規repository作成とpushが済んだかは `docs/STATUS.md` を確認してください。
## Renderデプロイ
個人検証用にRenderのFree Web Serviceを選択。`render.yaml` は `plan: free` を明示しています。
GitHub接続後、Blueprintとして読み込むか、Python Web Serviceで以下を指定します。
| 設定 | 値 |
|---|---|
| Runtime | Python 3.12.13 |
| Build | `pip install -r requirements.txt` |
| Start | `python server.py` |
| Instance | Free |
| Environment | `HOST=0.0.0.0`、`REQUESTS_PER_MINUTE=30` |
| MCP path | `/mcp` |
Renderの `PORT` と `RENDER_EXTERNAL_HOSTNAME` を自動利用します。カスタムドメインは `ALLOWED_HOSTS` に追加します。
Render側でHTTPSを終端します。ドメイン変更後はHost許可設定とChatGPT接続URLも更新します。
Freeは15分無通信で停止し、再起動に約1分かかる場合があります。ChatGPT接続がタイムアウトしたらサービス起動を待って再試行してください。
月750時間の枠はworkspaceで共有。帯域・ビルド枠超過は支払方法があると追加課金の可能性があります。
課金承認前に有料プラン・カード登録・超過課金を有効にしないでください。本番の常時稼働は別途承認が必要です。
公開URL取得後に実行:
```bash
python scripts/smoke_test.py --url https://YOUR-ACTUAL-HOST/mcp --extended
```
これはURL形式の例です。実デプロイURLではありません。実際のURLはSTATUSに記録します。
## ChatGPT接続(公式情報確認日:2026-09-07)
現行公式資料はApps SDKの一部を **Plugins** に統合しています。旧2023年Plugins、Custom GPT Actionsとは別のMCP接続です。
1. Web版ChatGPTでSettings → Security and login → Developer modeを有効化。
2. Pluginsの+から開発用MCP接続を追加。
3. 名前:Stock Market Data。説明:米国株・日本株の価格、履歴、企業情報と市場データを取得。
4. Connectionに実際のHTTPS `/mcp` URLを入力。個人MVPはNo Authentication。
5. 検出された14ツールを確認し作成。会話のDeveloper modeメニューでこの接続を選択。
6. 前述の自然文を実行し、実際のツール名・引数・戻り値とサーバーログを照合。
コード変更後は接続のRefreshでメタデータを再読込します。Web検索だけの回答は成功と判定しません。
公式上の対象はPlus / Pro / Business / Enterprise / EducationのWeb版。Freeは対象一覧にありません。
workspace管理者の制限は別です。ユーザー個別の可否はログインした画面で確認する必要があります。
対応プランに変更してもこのサーバー構成を作り直す必要はありません。
代替の公式Secure MCP Tunnelは開発用です。第三者公開には安定した公開HTTPSサーバーが必要です。
## 利用条件と公開準備
yfinanceのOSSライセンスとYahooデータの利用権は別です。
yfinance公式は研究・教育用途、Yahoo Finance APIの個人利用を案内しています。
個人MVPで検証できますが、第三者提供・商用再配布の許可を意味しません。
公開前に正式なデータ利用契約、認証、運用対策、運営者情報、公開ポリシーと審査を整えます。
`docs/PUBLICATION.md`、`docs/privacy-policy.draft.md`、`docs/terms.draft.md`、`chatgpt-app-submission.json` を用意しました。
ドラフトを公開済みの規約として扱わないでください。法的同意・申請送信・課金契約は未実施です。
## 公式資料
- [OpenAI:MCPサーバー](https://developers.openai.com/plugins/build/mcp-server)
- [OpenAI:Developer Mode](https://developers.openai.com/api/docs/guides/developer-mode)
- [OpenAI:接続とテスト](https://developers.openai.com/plugins/deploy/connect-chatgpt)
- [OpenAI:公開申請](https://developers.openai.com/plugins/deploy/submission)
- [MCP Python SDK v2](https://py.sdk.modelcontextprotocol.io/)
- [MCP HTTP仕様](https://modelcontextprotocol.io/specification/2025-11-25/basic/transports)
- [yfinance API](https://ranaroussi.github.io/yfinance/reference/index.html)
- [Render Free](https://render.com/docs/free)
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues