Skip to main content
Glama
taka-yayoi

Databricks Custom MCP Server

by taka-yayoi
README.md
# Databricks Apps上のカスタムMCPサーバー

このプロジェクトは、Databricks Apps上でカスタムMCP (Model Context Protocol) サーバーを構築・デプロイするためのサンプル実装です。LLM(Claude、Cursor等)から呼び出し可能な2つのツールを提供します。

## 提供するツール

1. **get_stock_info**: TSE(東京証券取引所)の株式情報を取得
2. **run_query_on_databricks**: Databricks SQLウェアハウスでSQLクエリを実行

## プロジェクト構成

```
custom_mcp/
├── app.py              # MCPサーバーのメインアプリケーション
├── main.py             # Uvicornサーバーのエントリーポイント
├── app.yaml            # Databricks Apps設定ファイル
├── databricks.yml      # Databricksバンドル設定
├── requirements.txt    # Python依存関係
└── README.md           # このファイル
```

## セットアップ

### 必要な環境

- Python 3.11以上
- Databricks CLI
- Databricksワークスペースへのアクセス権限

### ローカル開発環境のセットアップ

1. **仮想環境の作成と有効化**

```bash
python3 -m venv .venv
source .venv/bin/activate  # Windowsの場合: .venv\Scripts\activate
```

2. **依存関係のインストール**

```bash
pip install -r requirements.txt
```

3. **ローカルでサーバーを起動**

```bash
python main.py
```

サーバーは `http://localhost:8000` で起動します。

4. **ヘルスチェック**

```bash
curl http://localhost:8000/health
```

## Databricks Appsへのデプロイ

### 前提条件

- Databricks CLIがインストールされていること
- Databricksワークスペースに認証済みであること
- SQLウェアハウスが作成されていること

### デプロイ手順

1. **app.yamlの設定**

`app.yaml`の`WAREHOUSE_ID`環境変数に、使用するSQLウェアハウスのIDを設定します。

```yaml
command: ["python", "main.py"]
env:
  - name: 'WAREHOUSE_ID'
    value: 'your-warehouse-id-here'
```

2. **Databricks Appsにデプロイ**

```bash
databricks apps deploy
```

3. **デプロイの確認**

```bash
databricks apps list
```

デプロイされたアプリのURLを確認します。

## LLMクライアントからの利用

### Claude Desktop / Cursor の設定例

MCPサーバーの設定ファイル(`claude_desktop_config.json`または`cursor_config.json`)に以下を追加します:

```json
{
  "mcpServers": {
    "databricks-custom-mcp": {
      "url": "https://your-databricks-app-url.com",
      "transport": "http"
    }
  }
}
```

### 使用例

LLMに以下のように指示することで、ツールを呼び出せます:

```
トヨタ自動車(7203)の株価情報を教えてください
```

```
SQLクエリ "SELECT * FROM catalog.schema.table LIMIT 10" を実行してください
```

## トラブルシューティング

### よくある問題と解決方法

#### 1. ツールが呼び出されない

**問題**: LLMがMCPサーバーを認識するが、ツールが表示されない

**原因**:
- `@mcp.tool()`デコレーターで`name`パラメータを指定していた
- MCPアプリのマウントパスが間違っていた(`/mcp`ではなく`/`にマウント)

**解決方法**:
```python
# ❌ 間違った方法
@mcp.tool(name="tool_name", description="...")
def my_tool():
    pass

app.mount("/mcp", mcp_app)  # ❌ サブパスにマウント

# ✅ 正しい方法
@mcp.tool()
def my_tool():
    """ツールの説明をdocstringに記載"""
    pass

app.mount("/", mcp_app)  # ✅ ルートパスにマウント
```

#### 2. `FastMCP object has no attribute 'app'` エラー

**問題**: `app = mcp.app`や`app = mcp.http_app()`でエラーが発生

**解決方法**: FastMCPでは以下の方法でASGIアプリを作成します:

```python
# ✅ 正しい方法
mcp_app = mcp.streamable_http_app()
app = FastAPI(lifespan=lambda _: mcp.session_manager.run())
app.mount("/", mcp_app)
```

#### 3. `ModuleNotFoundError: No module named 'custom_server'`

**問題**: モジュールが見つからないエラー

**原因**: ディレクトリ構造が複雑すぎた(`src/custom_server`のような入れ子構造)

**解決方法**: フラットなディレクトリ構造にして、`main.py`と`app.py`を同じディレクトリに配置

#### 4. DataFrameが返せない

**問題**: `run_query_on_databricks`でpandas DataFrameを直接返すとエラー

**解決方法**: 文字列に変換してから返す

```python
@mcp.tool()
def run_query_on_databricks(sql_query: str):
    # ... クエリ実行 ...
    df = pd.DataFrame(rows, columns=[...])
    return df.to_string()  # ✅ 文字列に変換
```

#### 5. Uvicornのreloadモードで起動しない

**問題**: `uvicorn.run(reload=True)`が動作しない

**解決方法**: reloadモードでは、アプリオブジェクトを文字列で指定する必要があります:

```python
# ✅ 正しい方法
uvicorn.run(
    "app:app",  # インポートパスを文字列で指定
    host="0.0.0.0",
    port=8000,
    reload=True,
)
```

## 開発のヒント

### ツールの追加方法

新しいツールを追加する場合は、`@mcp.tool()`デコレーターを使用します:

```python
@mcp.tool()
def my_custom_tool(param1: str, param2: int) -> str:
    """このツールの説明をここに記載します。

    LLMがツールを選択する際に、この説明を参考にします。
    """
    # ツールの実装
    result = some_operation(param1, param2)
    return str(result)  # 文字列で返すことを推奨
```

### リソースの追加方法

動的なリソースを公開する場合は、`@mcp.resource()`デコレーターを使用します:

```python
@mcp.resource("data://{resource_id}")
def get_resource(resource_id: str) -> str:
    """動的リソースを取得"""
    return f"Resource content for {resource_id}"
```

### ログの確認

Databricks Appsのログは、Databricks CLIまたはウェブUIから確認できます:

```bash
databricks apps logs <app-name>
```

## セキュリティに関する注意事項

1. **認証**: Databricks Appsは自動的にBearerトークン認証を提供します
2. **環境変数**: 機密情報は`app.yaml`の`env`セクションで設定し、コードにハードコーディングしないでください
3. **SQLインジェクション**: SQLクエリを実行するツールでは、必要に応じて入力検証を実装してください

## 参考リンク

- [FastMCP Documentation](https://gofastmcp.com/)
- [Databricks Apps Documentation](https://docs.databricks.com/apps/index.html)
- [Model Context Protocol Specification](https://modelcontextprotocol.io/)
- [参考実装例](https://github.com/databrickslabs/mcp/tree/master/examples/custom-server)

## ライセンス

このプロジェクトはサンプル実装です。自由に改変・利用してください。

## サポート

問題が発生した場合は、以下を確認してください:

1. Databricks Appsのログ
2. ローカル環境でのテスト結果
3. MCPクライアント側の設定

---

**作成日**: 2025-11-06
**バージョン**: 1.0.0