Token导航 LogoToken导航

MCP Server · 数据服务

Ohio Bmv SQL MCP

一个基于Azure Functions和Azure SQL的MCP服务器,用于处理俄亥俄州机动车管理局驾照地址变更请求,通过自然语言交互实现数据收集、验证和存储。

stdio官方级别未说明来源级核验工具 1
Bicep自然语言处理CursorVS Code

快速开始

作者 / 组织
john-carroll-sw
提供方
john-carroll-sw

工具数量

1

来源目录标注

资源数量

0

来源目录标注

提示词数量

0

来源目录标注

GitHub Star

0

仓库热度

收录来源

1 个

MCP World

选型结论

Ohio Bmv SQL MCP 属于数据服务类 MCP Server,公开资料标注 1 个工具,通过stdio 本地进程接入,适配 Cursor、VS Code,有可以直接复制的安装命令;接入前要先准备 OAuth 授权。

分类

数据服务

传输方式

stdio

认证方式

OAuth 授权

部署方式

公开资料未说明

安装与配置

安装命令

pip install -r requirements.txt

公开命令不是通用的启动方式,拼不出可靠配置示例;请在客户端 MCP 配置里按官方文档填写 command 和 args。

上手步骤

  1. 1

    准备运行环境

    stdio 服务在本地起进程,需要先装好 对应的运行时,再按安装命令拉取依赖。

  2. 2

    安装服务

    复制下面的安装命令执行;命令里带占位符的位置换成自己的密钥或路径。

  3. 3

    写入客户端配置

    在客户端的 MCP 配置里填启动命令和参数,保存后完全退出客户端再打开,让新配置生效。

  4. 4

    验证是否可用

    连接成功后客户端会列出 1 个工具,随便调一个只读工具确认能返回结果。

接入前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

详细介绍

俄亥俄州BMV许可证地址更改-MCP服务器

这是一个MCP(模型上下文协议)服务器,使AI助手能够捕获和处理俄亥俄州驾照地址更改请求。它使用Azure Functions(Python)和Azure SQL数据库构建,演示了会话式AI如何与结构化数据库系统交互以处理政府服务请求。

业务背景

这种概念验证使AI助手(ChatGPT、GitHub Copilot或自定义代理)能够:

  • 通过自然对话收集所需信息
  • 验证地址更改数据
  • 将请求直接持久化到Azure SQL数据库
  • 向用户提供确认

用例: 一位市民告诉人工智能助手他们已经搬家了,助手通过调用此MCP工具将信息存储在BMV的系统中,指导他们更新驾照地址。

以下是使用Azure Functions的远程MCP服务器的架构图:

先决条件

- Visual Studio Code - Azure功能扩展

SQL数据库集成的其他先决条件

此项目使用ODBC连接到Azure SQL数据库。您需要安装SQL Server的Microsoft ODBC驱动程序:

macOS:

brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql18 unixodbc

Linux(Ubuntu/Debian):

curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev

窗户:

从下载并安装 SQL Server的Microsoft ODBC驱动程序

准备好当地环境

与基础模板不同,此项目 不需要Azurite (Azure存储模拟器),因为它只使用Azure SQL数据库进行数据持久化。

从终端本地运行MCP服务器

  1. 在新的终端窗口中切换到src文件夹:
   cd src
  1. 安装Python依赖项:
   pip install -r requirements.txt
备注 在执行以下操作之前创建虚拟环境是一种最佳做法 pip install 以避免依赖关系问题/冲突,或者如果您在CodeSpaces中运行。看 VS代码中的Python环境 了解更多信息。
  1. 在本地启动Functions主机:
   func start
备注 默认情况下,这将使用webhooks路由: /runtime/webhooks/mcp/sse稍后,我们将在Azure中使用它来设置客户端/主机调用的密钥: /runtime/webhooks/mcp/sse?code=

连接到 *本地* 来自客户端/主机的MCP服务器

VS代码-副驾驶代理模式

  1. 添加MCP服务器 从命令面板中,将URL添加到正在运行的Function应用程序的SSE端点:
   http://0.0.0.0:7071/runtime/webhooks/mcp/sse
  1. 列出MCP服务器 从命令面板启动服务器
  1. 在Copilot聊天代理模式下,输入提示以触发工具:
   I moved from 123 Old Street, Columbus, OH 43215 to 456 New Avenue, Dayton, OH 45402. 
   Please update my Ohio driver's license address. My license number is OH12345678 and 
   my date of birth is June 15, 1985.
  1. 当系统提示运行该工具时,点击同意 继续
  1. 完成后,在终端窗口中按Ctrl+C停止Functions主机进程。

MCP检查员

  1. 在一个 新终端窗口,安装并运行MCP检查器
   npx @modelcontextprotocol/inspector
  1. 从显示的URL打开MCP Inspector web应用程序(例如。, )
  1. 将运输类型设置为 SSE
  1. 将URL设置为正在运行的Function应用程序的SSE端点,然后 连接:
   http://0.0.0.0:7071/runtime/webhooks/mcp/sse

> 备注 此步骤在CodeSpaces中不起作用。请继续部署到远程MCP。

  1. 列出工具.点击 create_license_address_change_request 和 运行工具 与测试数据。

在Azure SQL中验证数据

成功运行该工具后,您可以验证地址更改请求是否已存储:

  1. 登录Azure门户()
  1. 导航到Azure SQL数据库(俄亥俄州bmv演示数据库)
  1. 首选 查询编辑器 (或使用SQL Server Management Studio)
  1. 运行以下查询:
   SELECT TOP 10 * FROM dbo.LicenseAddressChangeRequests ORDER BY CreatedAt DESC;
  1. 验证您的测试数据是否出现在结果中

部署到Azure以实现远程MCP

运行这个 雅匝德 命令为功能应用程序配置任何所需的Azure资源,并部署您的代码:

azd up

您可以选择加入示例中使用的ExpressRoute。为此,请先执行此操作 azd up

azd env set VNET_ENABLED true

此外,API管理\]可用于改善MCP服务器的安全性和策略,以及 App Service内置身份验证 可用于设置您最喜欢的OAuth提供程序,包括Entra。

连接到您的 *远程* 来自客户端的MCP服务器功能应用程序

您的客户端将需要一个密钥来调用新的托管SSE端点,其格式为 https://.azurewebsites.net/runtime/webhooks/mcp/sse默认情况下,托管功能需要一个系统密钥,可以从 门户 或CLI(az functionapp keys list --resource-group --name ).获取名为的系统密钥 mcp_extension.

在MCP Inspector中连接到远程MCP服务器

对于MCP检查器,您可以在URL中包含密钥:

https://.azurewebsites.net/runtime/webhooks/mcp/sse?code=

在VS Code中连接到远程MCP服务器-GitHub Copilot

对于VS Code中的GitHub Copilot,您应该将密钥设置为 x-functions-key 标题在 mcp.json,你只需使用 https://.azurewebsites.net/runtime/webhooks/mcp/sse 以下示例使用输入,并在从VS Code启动服务器时提示您提供密钥。备注 mcp.json 已包含在此仓库中,并将由VS Code获取。单击服务器上的“开始”,系统将提示输入以下值 functionapp-name (在您的/.alue/\*/env文件中)和 functions-mcp-extension-system-key 可以从上面的CLI命令或Function App门户中的API密钥中获取。

{
    "inputs": [
        {
            "type": "promptString",
            "id": "functions-mcp-extension-system-key",
            "description": "Azure Functions MCP Extension System Key",
            "password": true
        },
        {
            "type": "promptString",
            "id": "functionapp-name",
            "description": "Azure Functions App Name"
        }
    ],
    "servers": {
        "remote-mcp-function": {
            "type": "sse",
            "url": "https://${input:functionapp-name}.azurewebsites.net/runtime/webhooks/mcp/sse",
            "headers": {
                "x-functions-key": "${input:functions-mcp-extension-system-key}"
            }
        },
        "local-mcp-function": {
            "type": "sse",
            "url": "http://0.0.0.0:7071/runtime/webhooks/mcp/sse"
        }
    }
}

对于MCP检查器,您可以在URL中包含密钥: https://.azurewebsites.net/runtime/webhooks/mcp/sse?code=.

对于VS Code中的GitHub Copilot,您应该将密钥设置为 x-functions-key 标题在 mcp.json,你只需使用 https://.azurewebsites.net/runtime/webhooks/mcp/sse 以下示例使用输入,当您从VS Code启动服务器时,将提示您提供密钥:

{
    "inputs": [
        {
            "type": "promptString",
            "id": "functions-mcp-extension-system-key",
            "description": "Azure Functions MCP Extension System Key",
            "password": true
        }
    ],
    "servers": {
        "my-mcp-server": {
            "type": "sse",
            "url": ".azurewebsites.net/runtime/webhooks/mcp/sse",
            "headers": {
                "x-functions-key": "${input:functions-mcp-extension-system-key}"
            }
        }
    }
}

重新部署代码

你可以运行 azd up 根据需要多次执行命令,以配置Azure资源并将代码更新部署到功能应用程序。

\[!注意\] 部署的代码文件总是被最新的部署包覆盖。

清理资源

使用完功能应用程序和相关资源后,您可以使用此命令从Azure中删除功能应用程序及其相关资源,从而避免产生任何进一步的成本:

azd down

有用的Azure命令

部署应用程序后,您可以使用以下命令来管理和监视应用程序:

# Get your function app name from the environment file
FUNCTION_APP_NAME=$(cat .azure/$(cat .azure/config.json | jq -r '.defaultEnvironment')/env.json | jq -r '.FUNCTION_APP_NAME')
echo $FUNCTION_APP_NAME

# Get resource group 
RESOURCE_GROUP=$(cat .azure/$(cat .azure/config.json | jq -r '.defaultEnvironment')/env.json | jq -r '.AZURE_RESOURCE_GROUP')
echo $RESOURCE_GROUP

# View function app logs
az webapp log tail --name $FUNCTION_APP_NAME --resource-group $RESOURCE_GROUP

# Redeploy the application without provisioning new resources
azd deploy

源代码

许可证地址更改端点的功能代码在中定义 src/function_app.pyMCP函数注释将此函数公开为可由AI代理对话调用的MCP服务器工具。

下面是function_app.py的主要函数:

@app.generic_trigger(
    arg_name="context",
    type="mcpToolTrigger",
    toolName="create_license_address_change_request",
    description="Create an Ohio BMV driver's license address-change request record in SQL.",
    toolProperties=tool_properties_create_license_json
)
def create_license_address_change_request(context) -> str:
    """
    Creates an address change request for an Ohio driver's license in Azure SQL.
    
    Args:
        context: The trigger context containing all address change parameters.
        
    Returns:
        str: A success message with the driver license number or an error message.
    """
    try:
        # Parse the context to extract address change parameters
        dln = context.get("driverLicenseNumber")
        dob = context.get("dateOfBirth")
        first = context.get("firstName")
        middle = context.get("middleName")
        last = context.get("lastName")
        
        old_addr1 = context.get("oldAddressLine1")
        old_addr2 = context.get("oldAddressLine2")
        old_city = context.get("oldCity")
        old_state = context.get("oldState")
        old_zip = context.get("oldZip")
        
        new_addr1 = context.get("newAddressLine1")
        new_addr2 = context.get("newAddressLine2")
        new_city = context.get("newCity")
        new_state = context.get("newState")
        new_zip = context.get("newZip")
        
        phone = context.get("phone")
        email = context.get("email")
        preferred_contact = context.get("preferredContactMethod")
        conversation_summary = context.get("conversationSummary")
        
        # Validate required fields
        if not all([dln, dob, first, last, old_addr1, old_city, old_state, 
                   old_zip, new_addr1, new_city, new_state, new_zip]):
            return "Error: Missing required fields for address change request."
        
        # Get database connection string
        connection_string = os.environ["SQL_CONNECTION_STRING"]
        
        # Connect and insert
        conn = pyodbc.connect(connection_string)
        cursor = conn.cursor()
        
        insert_sql = """
        INSERT INTO dbo.LicenseAddressChangeRequests 
        (DriverLicenseNumber, DateOfBirth, FirstName, MiddleName, LastName,
         OldAddressLine1, OldAddressLine2, OldCity, OldState, OldZip,
         NewAddressLine1, NewAddressLine2, NewCity, NewState, NewZip,
         Phone, Email, PreferredContactMethod, ConversationSummary)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
        SELECT SCOPE_IDENTITY();
        """
        
        cursor.execute(insert_sql, (
            dln, dob, first, middle, last,
            old_addr1, old_addr2, old_city, old_state, old_zip,
            new_addr1, new_addr2, new_city, new_state, new_zip,
            phone, email, preferred_contact, conversation_summary
        ))
        
        result = cursor.fetchone()
        request_id = result[0] if result and result[0] else None
        
        conn.commit()
        cursor.close()
        conn.close()
        
        if request_id:
            return f"Successfully created address-change request (ID: {request_id}) for license {dln}."
        else:
            return f"Successfully created address-change request for license {dln}."
            
    except Exception as e:
        logging.error(f"Error creating address change request: {str(e)}")
        return f"Error: {str(e)}"

请注意 host.json 文件还包括对实验包的引用,这是使用此功能的应用程序所必需的:

"extensionBundle": {
  "id": "Microsoft.Azure.Functions.ExtensionBundle.Experimental",
  "version": "[4.*, 5.0.0)"
}

后续步骤

工具与能力

工具数量

1

资源数量

0

提示词数量

0

能力标签

Bicep本地部署政府服务自动化自然语言处理AzureFunctionsSQL数据库集成AI辅助工具

支持客户端

CursorVS Code

数量来自来源目录的标注,具体工具清单以官方文档为准。

典型使用场景

用自然语言查库

不用手写 SQL,直接问数据,让模型组织查询语句。

数据巡检

定期拉指标、做对比,把异常项整理成一段说明。

打通业务数据

把数据库、数仓和接口接进同一个上下文,减少导出再上传。

选择建议

值得选的地方

  • 只提供 1 个工具,职责集中,接入后不容易误操作。
  • 有现成的安装命令,不用自己找入口,照着跑就能起服务。
  • 已经适配 Cursor、VS Code,换客户端不用重新研究配置。

先想清楚的地方

  • stdio 方式要求本地装好 运行环境,换机器要重新装一遍。
  • 需要自备OAuth 授权,没有凭据没法直接试。
  • 第三方目录整理,版本更新和行为细节以官方仓库为准。

更适合

  • 需要在数据服务场景里让模型直接调用外部能力的人。
  • 已经在用 Cursor 的用户,接入路径最短。
  • 想先快速试一下、能接受在本地跑服务的人。

不太适合

  • 完全不想在本地装环境的人。
  • 暂时拿不到OAuth 授权的人。
  • 需要厂商级 SLA 和技术支持的生产环境。

同类对比

5 个同类
MCP Server工具数传输方式安装命令收录来源最后核验
Ohio Bmv SQL MCP

MCP World · 本页

1stdio有1 个2026-05-17
Memory 9d25f64e

MCP World

9未说明未标注1 个2026-05-17
Prisma MCP Server

MCP World

0stdio有3 个2026-05-17
Astr Bot

MCP World

0stdio有1 个2026-05-17
Getzep MCP

MCP World

9stdio有1 个2026-05-17

按同分类和工具数量挑出最接近的几条,字段以各自详情页为准。

常见问题

5 条

Ohio Bmv SQL MCP 怎么安装?

公开资料给出的安装命令是 pip install -r requirements.txt,运行环境为 未标注。装完后按客户端要求写进 MCP 配置,重启客户端生效。

Ohio Bmv SQL MCP 怎么在 Claude Desktop、Cursor 里配置?

它是stdio 本地进程,客户端配置里要写启动命令和参数,运行环境是 未标注;保存后完全退出客户端再打开,配置才会生效。

Ohio Bmv SQL MCP 收费吗?

本站只整理公开资料,不代收费用,也没有标注具体价格。是否收费取决于服务本身和背后的接口额度,正式使用前按官方说明确认。

Ohio Bmv SQL MCP 需要 API Key 吗?

公开资料标注的认证方式是OAuth 授权,也就是要先拿到凭据才能连上;凭据只填在自己本地的配置里,不要写进公开仓库。

Ohio Bmv SQL MCP 支持哪些客户端?

公开资料标注支持 Cursor、VS Code;其他客户端只要能配置 MCP Server,也能用同样的命令或地址接入。

来源信息

继续浏览同类 MCP