Gemcook Tech Blog
🎉

5ステップで実装!株価をリアルタイムで取得するMCPサーバーの作り方

に公開

はじめに

「AI に株価情報を質問したい」と思ったことはありませんか。最近注目を集めている MCP(Model Context Protocol)を使えば、Claude などの大規模言語モデル(LLM)と外部データソースを連携させることができます。

本記事では、MCP サーバーを構築して株価情報をリアルタイムで取得できるシステムを作る方法を解説します。プログラミング経験がある中級者を対象に、MCP の基礎から実際に動作するサーバーの実装までをステップバイステップで紹介します。

この記事を読むことで、以下の内容を学ぶことができます。

  • MCP の基本概念と仕組み
  • Node.js と TypeScript を使った MCP サーバーの構築方法
  • 外部 API を活用した株価データの取得と提供方法
  • Claude などの AI ツールとの連携方法

それでは、MCP を活用した株価取得サーバーの世界へ Let's go!

MCP とは何か。

MCP(Model Context Protocol)の基本概念

MCP(Model Context Protocol)は、AI モデルと外部データソースやツールを連携させるためのプロトコルです。このプロトコルのおかげで AI モデルは閉じた環境から外に出てリアルタイムの情報を取得したり、特定のツールを利用したりすることができるようになります。

MCP は主に以下 3 つの要素で構成されています。

  1. MCP サーバー:外部データやツールへのアクセスを提供するサーバー
  2. MCP クライアント:LLM に組み込まれたモジュールで、サーバーとの通信を担当
  3. MCP ホスト:ユーザーが利用する AI アプリケーション(Claude Desktop や Cline など)

MCP のメリット

MCP を利用する主なメリットは以下の通りです。

  • 最新情報の取得:学習データの期限を超えた最新情報を取得できる
  • 専門データへのアクセス:特定分野の専門的なデータを活用できる
  • 個人データの利用:ユーザー固有のデータを安全に利用できる
  • 機能拡張:AI モデルに新たな機能を追加できる

株価情報のような常に変動するデータは、MCP の活用が特に有効な分野の一つだと考えています。

開発環境の準備

必要なツールとライブラリ

MCP サーバーを開発するために、以下のツールとライブラリを準備します。

  • Node.js:v18.0.0 以上
  • TypeScript:型安全な開発のため
  • @modelcontextprotocol/sdk:MCP サーバー構築用 SDK
  • yahoo-finance2:株価取得用ライブラリ
  • zod:入出力のバリデーション用

プロジェクトの作成

まずは、新しいプロジェクトを作成し、必要なパッケージをインストールします。

# プロジェクトフォルダを作成
mkdir stock-mcp-server
cd stock-mcp-server

# npmプロジェクトを初期化
npm init -y

# 必要なパッケージをインストール
npm install @modelcontextprotocol/sdk zod yahoo-finance2 typescript
npm install --save-dev @types/node  tsx

# TypeScriptの設定ファイルを生成
npx tsc --init

package.jsonに以下のスクリプトを追加します。

 "type": "module",
 "scripts": {
  "start": "tsx src/index.ts",
  "build": "tsc",
  "dev": "tsx src/index.ts"
}

tsconfig.jsonファイルに以下の設定を追加します。

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

次に、ソースコードを格納するディレクトリを作成します。

mkdir -p src
touch src/index.ts

これで開発環境の準備は完了です。

MCP サーバーの基本構造

ディレクトリ構成

今回は開発のために、以下のようなディレクトリ構成を採用します。

stock-mcp-server/
├── src/
│   ├── services/
│   │   └── stockService.ts    # 株価取得サービス
│   ├── types/
│   │   └── schema.ts          # スキーマと型定義
│   └── index.ts               # エントリーポイント
├── package.json
└── tsconfig.json

株価取得サービスの実装

型定義ファイル

まず、src/types/schema.tsで入力データの型とスキーマを定義します。

import { z } from "zod";

export const StockPriceSchemaShape = {
  symbol: z.string(),
};

export const StockPriceSchema = z.object(StockPriceSchemaShape);

export type StockPriceInput = z.infer<typeof StockPriceSchema>;

この型定義により、API への入力パラメータの形式を明確に定義し、型安全性を確保します。

外部 API 連携サービス

次に、src/services/stockService.tsに株価取得のロジックを実装します。

import yahooFinance from "yahoo-finance2";
import type { StockPriceInput } from "../types/schema.js";

/**
 * 株価情報を取得する関数
 * @param params 入力パラメータ
 * @param extra 追加情報
 * @returns 株価情報
 */
export const getStockPrice = async (params: StockPriceInput) => {
  const result = await yahooFinance.quote(params.symbol);
  return {
    content: [
      {
        type: "text" as const,
        text: JSON.stringify(result, null, 2),
      },
    ],
  };
};

このサービスでは、yahoo-finance2 ライブラリを使用して実際の株価データを取得し、MCP 形式のレスポンスに変換しています。

サーバーの基本設定

最後に、src/index.tsでサーバーの基本設定とツールの登録を行います。

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { StockPriceSchemaShape } from "./types/schema.js";
import { getStockPrice } from "./services/stockService.js";

// サーバーインスタンスの作成
export const server = new McpServer({
  name: "StockPriceServer",
  version: "0.1.0",
});

// ツールの登録と実装
server.tool(
  "StockPriceServer", // ツールの名前
  "株価を取得します。", // ツールの説明
  StockPriceSchemaShape,
  getStockPrice
);

export const main = async () => {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  // 標準出力をするとサーバーのレスポンスとして解釈されてしまうので、標準エラー出力に出力する
  console.error("MCP Server running on stdio");
};

main().catch((error) => {
  console.error("Fatal error in main():", error);
  process.exit(1);
});

このコードでは先に定義した型とサービスを使って、MCP サーバーの設定と起動方法を定義しています。ツールの実装は別ファイルに分離し、コードの管理をしやすくしています。

動作確認

プロジェクトルートで以下のコマンドを実行して、MCP サーバーを起動します。

npm run dev

以下のように表示されていれば成功です!

開発サーバー立ち上げ

MCP クライアント側の設定手順

  1. Claude Desktop アプリを起動します。
  2. 画面左上の「設定」をクリックし「開発者」→「構成を編集」を選択します。

設定画面

  1. claude_desktop_config.jsonファイルが開いたら、以下のコードをコピー&ペーストします。
   "mcp-server": {
    "stock-prie-ask": {
      "command": "node",
      "args": [
        "/Users/{YOUR_USERNAME}/stock-mcp-server/build/index.js" // ここにはビルドしたファイルのパスを指定してください。
      ]
    }
  }
  1. {YOUR_USERNAME}の部分を実際のユーザー名に置き換えてください。
  • Mac の場合
    /Users/hogehoge/stock-mcp-server/build/index.js
  • Windows の場合
    C:\\Users\\hogehoge\\stock-mcp-server\\build\\index.js
  1. ファイルを保存し、Claude Desktop を再起動します。

これで株価取得サーバーと Claude が連携し、「Apple の株価を教えて」のような質問に回答できるようになります。

株価取得の結果

MCP サーバーを通じて取得した株価情報の例を見ていきましょう。
今回は明日決算(本日 2025 年 4 月 14 日時点)のバンクオブアメリカの株価を取得してみたいと思います。

銘柄: Bank of America Corporation (BAC)
現在の株価: 35.95 USD
変動: +0.10 (+0.28%)
取得時刻: 2025/4/11 16:00:00

株価表示のスクリーンショット

このように、MCP サーバーを通じて最新の株価情報をリアルタイムで取得できることが確認できました。

AI との対話例

AI ツールと MCP サーバーが連携された環境では、以下のような対話が可能になります。

ユーザー

Apple、Google、Amazonの株価も比較して教えて

Claude

Apple、Google、Amazon の株価を比較するために、それぞれの情報を取得してみましょう。
Apple、Google、Amazon の株価を比較した結果です:
現在の株価(最新の取引日:2025 年 4 月 11 日)

Apple (AAPL): $198.15(前日比 +4.06%)
Google (GOOGL): $157.14(前日比 +2.83%)
Amazon (AMZN): $184.87(前日比 +2.01%)

時価総額

Apple: 約 2 兆 9766 億ドル
Google: 約 1 兆 9280 億ドル
Amazon: 約 1 兆 9619 億ドル

PER(株価収益率)

Apple: 31.45 倍
Google: 19.52 倍
Amazon: 33.43 倍

配当利回り

Apple: 0.5%
Google: 0.51%
Amazon: 配当なし

52 週レンジ(過去 1 年の株価範囲)

Apple: $164.08 〜 $260.10
Google: $140.53 〜 $207.05
Amazon: $151.61 〜 $242.52

現時点では、Apple が最も高い株価と時価総額を持っていますが、3 社とも直近の取引では上昇傾向にあります。Google は 3 社の中で最も PER が低く、投資効率の面では優れているかもしれません。

ユーザー

GoogleのPERが他の巨大テックと明らかに低くなっていますが、この理由はなんだと思いますか。
検索広告に依存しているリスクプレミアムが過剰に織り込まれている可能性はどれくらいあると思う。

Claude

Google の低い PER に関する分析ですね。確かに Google の PER が 19.52 倍と、Apple(31.45 倍)や Amazon(33.43 倍)と比較して明らかに低いのは興味深い現象です。
Google の低 PER の主な理由

AI 競争と投資不安:

Google は膨大な AI 投資を行っていますが、これらの投資からの短期的なリターンが不透明であるという見方があります。
Microsoft/OpenAI の台頭により、Google の検索市場における優位性が将来的に脅かされる可能性が懸念されています。

収益源の集中リスク:

ご指摘の通り、Google の収益は検索広告に大きく依存しています(全収益の約 50〜60%)。
この一極集中は確かにリスクプレミアムとして株価に織り込まれている可能性が高いです。

規制リスク:

世界中で反トラスト訴訟や規制強化の圧力に直面しており、これが将来の成長見通しに影響しています。
特に検索エンジン市場での独占的な地位が規制当局から標的にされています。

検索広告依存のリスクプレミアムについて
検索広告依存のリスクプレミアムが過剰に織り込まれている可能性はかなり高いと考えられます。その理由は:

代替収益源の見過ごし:

YouTube、Google Cloud、Android、Google Play など、成長している他の収益源の価値が市場で十分に評価されていない可能性があります。
特に Google Cloud は急速に成長しており、AWS(Amazon)や Azure(Microsoft)との競争でも健闘しています。

AI 変革への過度な懸念:

生成 AI の台頭により検索ビジネスが崩壊するという懸念は短期的には過大評価されている可能性があります。
Google は自社の AI 技術(Gemini 等)を検索に統合し、検索体験を進化させることで対応しています。

歴史的に強固なモデル:

Google の検索広告モデルは数十年にわたり極めて効果的で、代替が難しいことが証明されています。
ユーザーの慣性と膨大なデータ優位性は簡単には崩れない競争障壁です。

市場の低評価(低 PER)は、長期投資家にとっては実際にはチャンスを提供している可能性があります。Google(Alphabet)は豊富な現金を持ち、様々な成長分野に投資しており、広告依存度を徐々に下げる戦略を進めています。
短期的には検索広告依存のリスクプレミアムが過剰に織り込まれているように見えますが、長期的には AI 時代への Google の適応能力が鍵となるでしょう。

まとめ

本記事では、MCP サーバーを活用して株価情報をリアルタイムで取得する方法について解説しました。主なポイントは以下の通りです。

  1. MCP の基本概念:AI モデルと外部データソースを連携させるプロトコル
  2. 開発環境の構築:Node.js と TypeScript を活用した MCP サーバーの実装
  3. 株価取得機能:yahoo-finance2 ライブラリを使用した株価データの取得と提供
  4. AI ツールとの連携:標準入出力を使用した連携方法

今回は非常にシンプルな実装でしたが、これをベースにしてより機能的で使いやすい MCP サーバーを開発することができます。

MCP を活用することで AI モデルに最新のデータを提供し、より実践的で価値のある対話を実現することができます。
いい感じに株の分析にも役立ちそうで嬉しいです ☺️

皆さんも是非、MCP を活用して自分ようにカスタマイズした AI 拡張機能を作ってみてください。質問やフィードバックがありましたら、コメント欄でお待ちしています。

参考リンク

Gemcook Tech Blog
Gemcook Tech Blog

Discussion