不動産価格予想のMCPを作成してみた【Claude Code使用】

AI

不動産に興味があり、ARIMAモデルを用いた東京都23区を対象にした不動産価格予想のMCPサーバーを作成しました。MCPサーバーはWebアプリとLLMから呼び出すことができるので、両者対応した実装をしました。

  • LLM (Claude Code)から呼び出したパターン
  • Webアプリから呼び出したパターン

両者とも20年後には新宿区の一平米あたりの土地の値段が351万円という結果が出ていますね。

今回データベースには国土交通省が提供している不動産情報ライブラリを使用しましたが、2021から2025年までしか取得できなかったので、予想値の精度は気にしないことにします(笑)

MCPとは

MCPとはModel Context Protocolの略で、Anthropicが開発したLLMがAPIに接続できるように設計したプロトコルのことです。以下に公式のドキュメントがあります。

Anthropic: Introducing the Model Context Protocol \ Anthropic
MCP docs: What is the Model Context Protocol (MCP)? – Model Context Protocol

今回は不動産価格予想をするためのAPIをMCPサーバーに実装しました。以下が実装内容です。

  • HTTPで接続可能なMCPサーバーを作成し、toolsを一つ作成
  • Claude Code からHTTPでMCPサーバーと接続
  • WebアプリからHTTPでMCPサーバーと接続
  • MCPサーバーはFastAPIで最初に作成した後に、FastMCPに移行

今回学んだのはMCP接続には以下のフローがあるということです。

  1. Initialization (Lifecycle Management)
  2. Tool Discovery (Primitives)
  3. Tool Execution (Primitives)

各フローについて、接続の確認から実装の仕方を説明していきます。

MCP接続

MCP接続の設定

terminalでclaudeを起動するディレクトリ上に.mcp.jsonを以下のように設定します。

terminalでclaudeと入力すると以下のように聞かれるので、1を選択します。

すると、ディレクトリに以下のような.claude/settings.local.jsonが自動生成されます。

ちなみにMCPのTransport layerには以下2つ接続形式があります。

  • Stdio
  • Streamable http (今回はこちらを使用)

MCPサーバー接続確認

Initialization (Lifecycle Management)

Arima-forecastというMCPサーバーが接続可能であることがわかります。私が今回作成したものです。

Tool Discovery

View Toolsを選択すると、以下のようにToolsには今回作成したforecastという名前のToolが存在し、wardとyearsのパラメータでリクエスト可能であることがわかります。

Tool Execution

MCPサーバー実装

ここからはどのように実装するのか、解説していきます。

公式ドキュメントから分かるように、以下のようなリクエストがまず最初にMCP接続を有効化したLLMClaude CodeCopilotなど)からMCPサーバーに送られます。

Architecture overview – Model Context Protocol

MCP requests format:

他のリクエスト形式もほぼに同じで、methodパラメータの値がキーになっています。3つのフローは以下のメソッド名でリクエストされるようです。

Method types

  1. initialize: Initialization (Lifecycle Management)
  2. tools/list: Tool Discovery
  3. tools/call: Tool Execution
    • params
      1. name :MCP toolsの名前(今回はforecast)
      1. arguments:MCP toolsの入力値(今回はwardとyears)

FastAPIでの実装

まずはプレーンな状態で実装することで理解を深めたいと思い、FastAPIを使用して実装をしました。

initialize: Initialization

以下のように受け取ったjsonリクエストからmethodパラメータを基に分岐させて、処理をさせます。MCPサーバーの情報を以下のようなレスポンス形式でreturnしてあげます。

公式ドキュメントに全て必要な項目が書いてあるのでそれを参考にするとよいです。

tools/list: Tool Discovery

以下は、どのようなAPI(LLMではtoolとよく言う)が接続可能かの情報をレスポンスします。LLMにAPIドキュメントを公開しているようなイメージですね。

tools/call: Tool Execution

こちらはLLMから実際にAPIリクエストされたときに処理が走ります。例えば、ユーザーがLLMに対して「新宿不動産の10年後の価格を予想して」とリクエストした際ですね。

MCPツールのname(toolの名前)とarguments(toolを呼ぶ際の引数)をparamsから取得します。

(省略)

ここで補足だが、LLMではなくWebアプリなどから直接MCPサーバーにリクエストすることも可能です。もし、WebアプリからHTTPリクエストをする際にはCORSを以下のように有効化する必要があります。

FastAPI ⇒ FastMCPへの移行

FastAPIを使いましたが、今度はFastMCPを使用して同じ処理を実装します。FastMCPを使用すると以上のコードが綺麗にすっきりかけるので、勉強目的以外の場合はFastMCPや他のフレームワークを使うことをお勧めします。

FastMCP doc: Tools – FastMCP

initialize: Initialization

この一行だけで実装できます。

tools/list: Tool Discovery + tools/call: Tool Execution

以下のコードだけでTool DiscoveryTool Executionをどちらも実装できます。大分見やすくなりました。

今回もWebアプリからHTTPリクエストをする際にはCORSを有効化する必要があります。

X-Session-IDのヘッダーの設定も必須でした。(今回のPOSTでのリクエストの前にOPTIONリクエストが送信されるので、そのSession IDのヘッダーをexposeし今回作成したPOSTのAPIリクエストを受け付けられるようにします。)

最後に

今回は、今はやりのMCPについて勉強しました。プレーンな状態で実装することでより深く理解できました。今後はMemoryやSessionマネージメントなど、レベルを上げていこうと思います。

コメント

タイトルとURLをコピーしました