Databricks自定义MCP服务器

在Databricks Apps上构建和部署自定义MCP服务器,提供股票信息查询和Databricks SQL查询执行功能。

  • by taka-yayoi
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 taka-yayoi/custom_mcp

使用说明

Databricks Apps上面的自定义MCP服务器

此项目包括:Databricks Apps在上面自定义MCP (Model Context Protocol) 用于构建和部署服务器的示例实现。LLM(Claude、Cursor等),模板名称将采用不同的格式。

提供的工具

  1. get_stock_info: TSE(东京证券取引所)の株式情报を取得
  2. 运行查询数据块: 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以上
  • copula命令行界面
  • Databricks工作区访问权限

设置本地开发环境

  1. 创建和启用虚拟环境
python3 -m venv .venv
source .venv/bin/activate  # Windowsの場合: .venv\Scripts\activate
  1. 安装相关性
pip install -r requirements.txt
  1. 在本地启动服务器
python main.py

服务器是 http://localhost:8000 中所述修改相应参数的值。

  1. 健康检查
curl http://localhost:8000/health

Databricks Apps部署到

前提条件

  • Databricks CLI已安装
  • Databricks已验证工作区
  • SQL已创建仓库

部署过程

  1. app.yaml配置

app.yaml的,之WAREHOUSE_ID用于环境变量SQL仓库的ID中所述修改相应参数的值。

command: ["python", "main.py"]
env:
  - name: 'WAREHOUSE_ID'
    value: 'your-warehouse-id-here'
  1. Databricks Apps部署到
databricks apps deploy
  1. 检查部署
databricks apps list

被部署的应用程序的URL中所述修改相应参数的值。

LLM客户端使用

Claude Desktop / Cursor 设置示例

MCP服务器配置文件(claude_desktop_config.json或cursor_config.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而不是/装入)

解决方法:

# ❌ 間違った方法
@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创建应用程序:

# ✅ 正しい方法
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直接返回错误

解决方法:转换为字符串并返回

@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在模式下,应用程序对象必须由字符串指定:

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

开发提示

如何添加工具

单击功能区上@mcp.tool()使用解码器:

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

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

如何添加资源

单击功能区上的@mcp.resource()使用解码器:

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

检查日志

Databricks Apps的日志Databricks CLI或腹板UI查看项目中可用的所有族:

databricks apps logs <app-name>

安全注意事项

  1. 认证: Databricks Apps自动的Bearer提供令牌认证
  2. 环境变数:机密信息app.yaml的,之env请在节中设置,不要对代码进行硬编码
  3. SQL注入: SQL执行查询的工具应根据需要实现输入验证

参考链接

许可证

这个项目是示例实现。请自由改变、利用。

支持

如果出现问题,请检查:

  1. Databricks Apps日志
  2. 本地环境测试结果
  3. MCP客户端设置

作成日: 2025-11-06 版本: 1.0.0