不動産に興味があり、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接続には以下のフローがあるということです。
- Initialization (Lifecycle Management)
- Tool Discovery (Primitives)
- 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接続を有効化したLLM (Claude CodeやCopilotなど)からMCPサーバーに送られます。
Architecture overview – Model Context Protocol
MCP requests format:
他のリクエスト形式もほぼに同じで、methodパラメータの値がキーになっています。3つのフローは以下のメソッド名でリクエストされるようです。
Method types
- initialize: Initialization (Lifecycle Management)
- tools/list: Tool Discovery
- tools/call: Tool Execution
- params
- name :MCP toolsの名前(今回はforecast)
- arguments:MCP toolsの入力値(今回はwardとyears)
- params
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 DiscoveryとTool Executionをどちらも実装できます。大分見やすくなりました。

今回もWebアプリからHTTPリクエストをする際にはCORSを有効化する必要があります。
X-Session-IDのヘッダーの設定も必須でした。(今回のPOSTでのリクエストの前にOPTIONリクエストが送信されるので、そのSession IDのヘッダーをexposeし今回作成したPOSTのAPIリクエストを受け付けられるようにします。)

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


コメント