1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DatabricksでカスタムMCPサーバーを動かしてみる

Posted at

こちらのガイドに従って実際にカスタムMCPサーバーをDatabricksで動かしてみます。

自分で動作確認したバージョンはこちらです。構成をシンプルにしたり、東京証券取引所のデータを取得するように変更しています。

MCPサーバーの実装

main.py
import uvicorn


def main():
    uvicorn.run(
        "app:app",
        host="0.0.0.0",
        port=8000,
        reload=True,
    )


if __name__ == "__main__":
    main()
app.py
import yfinance as yf
import requests
import pandas as pd
from io import StringIO
import databricks.sql
import os
from databricks.sdk.core import Config
from mcp.server.fastmcp import FastMCP
from fastapi import FastAPI

# MCPサーバーを作成
mcp = FastMCP("Databricks Apps上のカスタムMCPサーバー")

# ツール 1
@mcp.tool()
def get_stock_info(symbol: str) -> str | None:
    """指定されたシンボルの株式情報を取得します。TSE(東京証券取引所)株式の時価総額、現在価格、52週レンジを取得します。"""
    try:
        info = yf.Ticker(f"{symbol}.T").fast_info
        return (
            f"\n{symbol}.Tの詳細:\n"
            f"時価総額 = {info['marketCap']}\n"
            f"現在価格 = {info['last_price']}\n"
            f"年間最低価格 = {info['year_low']}\n"
            f"年間最高価格 = {info['year_high']}\n"
        )
    except Exception as e:
        print(f"{symbol}の取得エラー: {e}")
        return None

# ツール 2
@mcp.tool()
def run_query_on_databricks(sql_query: str):
    """SQLクエリを受け取り、Databricks SQLウェアハウスでクエリを実行します。結果をpandas DataFrameとして返します。"""
    cfg = Config()
    warehouse_id = os.getenv("WAREHOUSE_ID")
    host = cfg.host
    http_path = f"/sql/1.0/warehouses/{warehouse_id}"
    if not all([host, http_path]):
        raise ValueError("必要なDatabricks接続環境変数が不足しています。")

    with databricks.sql.connect(server_hostname=host, http_path=http_path, credentials_provider=lambda: cfg.authenticate) as conn, conn.cursor() as cur:
        cur.execute(sql_query)
        rows = cur.fetchall()
        df = pd.DataFrame(rows, columns=[c[0] for c in cur.description])
        # DataFrameを文字列形式で返す
        return df.to_string()

# MCPアプリをHTTPストリーミングアプリに変換
mcp_app = mcp.streamable_http_app()

# FastAPIアプリを作成
app = FastAPI(
    lifespan=lambda _: mcp.session_manager.run(),
)

# ルートエンドポイント(オプショナル)
@app.get("/health", include_in_schema=False)
async def health():
    return {
        "status": "healthy",
        "name": "Databricks Apps上のカスタムMCPサーバー",
        "version": "1.0.0",
        "tools": [
            "get_stock_info - 指定されたシンボルの株式情報を取得",
            "run_query_on_databricks - Databricks SQLウェアハウスでクエリを実行"
        ]
    }

# MCPアプリをルートパスにマウント
app.mount("/", mcp_app)
app.yaml
command: ["python", "main.py"]
env:
  - name: 'WAREHOUSE_ID'
    value: '<SQLウェアハウスのID>'
databricks:yml
bundle:
  name: custom-mcp-server

sync:
  include:
    - .build

artifacts:
  default:
    type: whl
    path: .
    build: uv build --wheel

resources:
  apps:
    custom-mcp-server:
      name: "mcp-custom-server-bundles"
      description: "Custom MCP Server on Databricks Apps"
      source_code_path: ./.build

targets:
  dev:
    mode: development
    default: true
requirements.txt
fastmcp
fastapi
uvicorn
yfinance
pandas
databricks-sql-connector
databricks-sdk
python-dotenv

Databricks Appとしてデプロイ

ローカルで以下を実行していきます。認証を行います。

databricks configure

ローカルのコードをワークスペースに同期します。

DATABRICKS_USERNAME=$(databricks current-user me | jq -r .userName)
databricks sync . "/Users/$DATABRICKS_USERNAME/mcp-custom-server"

アプリを作成します。

databricks apps create mcp-taka

アプリにコードをデプロイします。

databricks apps deploy mcp-taka --source-code-path "/Workspace/Users/$DATABRICKS_USERNAME/mcp-custom-server/custom-server"

アプリの画面で動作していることを確認します。
Screenshot 2025-11-06 at 11.39.37.png

https://mcp-taka-xxxx.aws.databricksapps.com/healthというURLでMCPサーバーの情報を確認できます。
Screenshot 2025-11-06 at 11.40.43.png

テーブルに書き込みを行うので、書き込みを行うスキーマにアプリのサービスプリンシパルに権限を付与しておきます。
Screenshot 2025-11-06 at 11.43.08.png

Screenshot 2025-11-06 at 10.57.18.png

AI Playgroundで動作確認

AI Playgroundにアクセスします。モデルはClaude Sonnet 4を選択します。
Screenshot 2025-11-06 at 11.45.02.png

ツールをクリックし、MCP Serversタブを開いてDatabricksアプリのMCPサーバーで上で動かしたアプリを選択します。
Screenshot 2025-11-06 at 11.00.01.png

システムプロンプトを指定します。

あなたは株式市場分析をサポートするAIエージェントです。MCPサーバーを通じて様々なツールを利用できます。状況に応じて適切なツールを選択し、必要に応じてあなた自身の知識も活用してください。回答は簡潔で分かりやすくまとめてください。

Screenshot 2025-11-06 at 10.59.21.png

エージェントに指示を行います。

TSE(東京証券取引所)に上場している時価総額上位5社の株式情報を教えてください。

最初はテーブルからデータを取り出そうとしますが、その後はget_stock_infoを使用して情報を取得しています。
Screenshot 2025-11-06 at 11.48.55.png

結果を得ることができました。
Screenshot 2025-11-06 at 11.50.23.png

次にテーブル作成と組み合わせます。

TSE(東京証券取引所)に上場している時価総額上位5社の株式情報を格納するため、まずDeltaテーブルの構造を作成してください。カタログ'takaakiyayoi_catalog'、スキーマ'agents'内に、株式データに必要なカラムを持つテーブルを作成してください。その後で、市場情報から上位5社の情報を取得し、作成したテーブルにデータをインサートしてください。

試行錯誤しながらもテーブルを作成してデータをインサートしてくれています。
Screenshot 2025-11-06 at 11.52.17.png

テーブルに企業情報がインサートされました。
Screenshot 2025-11-06 at 11.53.13.png

Screenshot 2025-11-06 at 11.54.06.png

なお、アプリのサービスプリンシパルが作成したテーブルにはアクセス権がない場合がありますので、その場合には権限を付与ください。
Screenshot 2025-11-06 at 11.55.25.png

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?