使用 Databricks 应用托管自定义 MCP 服务器

Important

此功能在 Beta 版中。

将自己的自定义或第三方 MCP 服务器作为 Databricks 应用托管。 如果已有要部署的 MCP 服务器,或者想要将第三方 MCP 服务器作为工具源运行,则自定义 MCP 服务器非常有用。

Requirements

  • 作为 Databricks 应用托管的 MCP 服务器必须实现与 HTTP 兼容的传输,例如 可流式传输

将 MCP 服务器作为 Databricks 应用托管

有关编写自己的 MCP 服务器并将其部署为 Databricks 应用的示例,请参阅 自定义 MCP 服务器存储库

若要将现有 Python MCP 服务器托管为 Databricks 应用,请执行以下步骤:

配置你的环境

在部署 MCP 服务器之前,请使用 OAuth 向工作区进行身份验证。

  1. 在本地终端中运行以下命令:

    databricks auth login --host https://<your-workspace-hostname>
    

设置 MCP 服务器

  1. 将 a requirements.txt 添加到 MCP 服务器的根目录,并为服务器指定 Python 依赖项。

    如果服务器使用 uv 进行包管理,请将 uv 添加到 requirements.txt 文件中,它将自动处理安装其他依赖项。

  2. 添加一个 app.yaml 来指定运行 MCP 服务器的 CLI 命令。

    默认情况下,Databricks 应用程序在端口 8000 上侦听。 如果服务器侦听其他端口,请使用文件中的app.yaml设置它。

    示例 app.yaml

    command: [
        'uv',
        'run',
        'your-server-name',
        ..., # optionally include additional parameters here
      ]
    

将 MCP 服务器部署为 Databricks 应用

  1. 创建 Databricks 应用以托管 MCP 服务器:

    databricks apps create mcp-my-custom-server
    
  2. 通过从包含 app.yaml 文件的目录运行以下命令,将源代码上传到 Databricks 并部署应用:

    DATABRICKS_USERNAME=$(databricks current-user me | jq -r .userName)
    databricks sync . "/Users/$DATABRICKS_USERNAME/mcp-my-custom-server"
    databricks apps deploy mcp-my-custom-server --source-code-path "/Workspace/Users/$DATABRICKS_USERNAME/mcp-my-custom-server"
    

连接到自定义 MCP 服务器

单击选项卡以查看如何从各种环境连接到 MCP 服务器。

本地环境

使用 OAuth 向工作区进行身份验证,如 “设置环境”中所述。

以下示例演示如何连接到自定义 MCP 服务器并列出可用工具:

from databricks_mcp import DatabricksOAuthClientProvider
from databricks.sdk import WorkspaceClient
from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamablehttp_client

databricks_cli_profile = "DEFAULT"
workspace_client = WorkspaceClient(profile=databricks_cli_profile)

# Replace with your actual custom MCP server URL
mcp_server_url = "https://<workspace-hostname>/serving-endpoints/mcp-my-custom-server/invocations"

async def test_connection_to_server():
   async with streamablehttp_client(
      f"{mcp_server_url}", auth=DatabricksOAuthClientProvider(workspace_client)
   ) as (read_stream, write_stream, _), ClientSession(
      read_stream, write_stream
   ) as session:
      # List available tools
      tools = await session.list_tools()
      print(f"Available tools: {[tool.name for tool in tools.tools]}")

笔记本(服务主体)

使用服务主体访问 Databricks 笔记本中的托管 Databricks 应用。

import json
from databricks.sdk import WorkspaceClient
from databricks_mcp import DatabricksOAuthClientProvider
from databricks.sdk.credentials_provider import ModelServingUserCredentials
from mcp.client.streamable_http import streamablehttp_client as connect
from mcp import ClientSession

async def main():
    app_url = "https://mcp-server.databricksapps.com/mcp"
    client = WorkspaceClient(
      host="https://workspace_url",
      client_id="client_id",
      client_secret="client_secret"
    )

    async with connect(app_url, auth=DatabricksOAuthClientProvider(client)) as (
        read_stream,
        write_stream,
        _,
    ):
        async with ClientSession(read_stream, write_stream) as session:
            await session.initialize()
            tools = await session.list_tools()
            print(f"Available tools: {[tool.name for tool in tools.tools]}")

await main()

代理代码(代表用户)

设置代用户授权机制。 请参阅 代表用户身份验证

以下示例演示如何通过代理使用ModelServingUserCredentials来访问托管的Databricks应用以启用代表用户访问:

import json
from databricks.sdk import WorkspaceClient
from databricks_mcp import DatabricksOAuthClientProvider
from databricks.sdk.credentials_provider import ModelServingUserCredentials
from mcp.client.streamable_http import streamablehttp_client as connect
from mcp import ClientSession

async def main():
    app_url = "https://mcp-server.databricksapps.com/mcp"
    client = WorkspaceClient(credentials_strategy = ModelServingUserCredentials())

    async with connect(app_url, auth=DatabricksOAuthClientProvider(client)) as (
        read_stream,
        write_stream,
        _,
    ):
        async with ClientSession(read_stream, write_stream) as session:
            await session.initialize()
            tools = await session.list_tools()
            print(f"Available tools: {[tool.name for tool in tools.tools]}")

await main()

使用 apps.apps 范围记录代理模型。 请参阅 代表用户身份验证

代理代码(服务主体)

使用服务主体启用系统身份验证,以便从代理访问托管的 Databricks 应用:

import json
from databricks.sdk import WorkspaceClient
from databricks_mcp import DatabricksOAuthClientProvider
from mcp.client.streamable_http import streamablehttp_client as connect
from mcp import ClientSession

async def main():
    app_url = "https://mcp-server.databricksapps.com/mcp"
    client = WorkspaceClient()

    async with connect(app_url, auth=DatabricksOAuthClientProvider(client)) as (
        read_stream,
        write_stream,
        _,
    ):
        async with ClientSession(read_stream, write_stream) as session:
            await session.initialize()
            tools = await session.list_tools()
            print(f"Available tools: {[tool.name for tool in tools.tools]}")

await main()

使用 DatabricksApps 资源记录代理模型。 请参阅自动身份验证直通

示例笔记本:使用 Databricks MCP 服务器生成代理

以下笔记本演示如何创作 LangGraph 和 OpenAI 代理,这些代理使用 Databricks 应用上托管的自定义 MCP 服务器调用 MCP 工具。

LangGraph MCP 工具调用代理

获取笔记本

OpenAI MCP 工具调用代理

获取笔记本

其他资源

应用指南提供了端到端代码示例,用于将 MCP 服务器与不同的框架集成:

有关完整的源代码和其他示例,请参阅 Databricks Apps Cookbook 存储库