掘金 人工智能 05月28日
MCP 系列三:编程实战,手把手教你服务端的开发与功能验证
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了MCP服务端的编码开发与功能验证。主要涵盖了服务端提供的Resource、Prompt、Tool三种服务类型及其适用场景,并通过一个实际的编码示例,展示了如何通过Resource访问数据库数据,利用Prompt生成代码调试提示模板,以及使用Tool实现数学运算功能。此外,文章还介绍了如何使用MCP Inspector这一高效工具,对开发的MCP服务端功能进行全面的测试和验证,为开发者提供了一套完整的开发实践指南。

📦MCP服务端提供Resources、Prompts和Tools三种服务类型。Resources用于提供数据和上下文信息,类似于只读的REST API,适用于读取文件内容、查询数据库等场景。Prompts用于定义可复用的提示模板,标准化LLM的交互,适用于生成文本模板、定义对话流程等场景。Tools则用于执行操作和计算,可以影响外部系统状态,适用于数学计算、API调用等场景。

🛠️文章详细介绍了如何使用uv这个快速的Python包管理工具创建项目,安装依赖包,以及如何创建FastMCP服务端实例。通过配置数据库连接,定义资源端点,实现了查询数据库表名、表数据和表结构的功能,并提供了测试资源验证服务器状态。

💡文章还展示了Prompts的实现,包括中国省份介绍和代码调试提示模板。中国省份介绍模板引导LLM从历史、人文、经济和旅游四个方面介绍省份。代码调试提示模板则通过预设对话历史,引导LLM进入特定的思考模式,帮助用户调试代码。

➕文章最后介绍了Tools的实现,定义了加法、减法、乘法和除法四个基本的数学运算工具,并通过@mcp.tool()装饰器将这些函数注册为MCP服务端的工具,可供客户端直接调用。同时,文章还介绍了如何使用MCP Inspector来测试验证服务端功能,提供了一个直观的界面,方便开发者快速验证服务端的响应和状态。

本文为 MCP 系列的第三篇,本文从开发实践的角度出发,介绍 MCP 服务端的编码开发及其功能验证步骤,主要内容有:

    介绍 MCP 服务端提供的服务类型(Resource、Prompt、Tool)及其适用场景。一个服务端的编码开发示例:通过 Resource 访问数据库数据;通过 Prompt 生成代码调试提示模板;通过 Tool 实现数学运算功能。使用 MCP Inspector,高效地对开发的 MCP 服务端功能进行测试验证。

关注我,后台回复 MCP,可获取本文的代码、示例数据。

服务端提供的服务类型

MCP 服务端(servers)可以为客户端(clients)提供 Resources、tools 和 prompts 三类服务。

Resources

Resources 是 MCP 中的一个核心原语,它允许 servers 暴露可以被 clients 读取并用作与 LLM 交互的上下文数据和内容。

用途:提供数据和上下文信息

特点

典型场景

每个 resource 都由一个唯一的 URI 标识,并且可以包含文本或二进制数据。

Prompts

Prompts 允许 servers 定义可复用的提示模板和工作流,clients 可以轻松地将它们呈现给用户和 LLMs。Prompts 提供了一种强大的方式来标准化和共享常见的 LLM 交互。

用途:定义与 LLM 交互的模板特点

典型场景

Tools

Tools 使 servers 能够向 clients 暴露可执行功能。通过 tools,LLMs 可以与外部系统交互、执行计算并在现实世界中采取行动。

Tools 的关键特性有:

用途:执行操作和计算

特点

典型场景

与 resources 一样,tools 通过唯一的名称进行标识,并且可以包含描述以指导其使用。但是,与 resources 不同的是,tools 代表可以修改状态或与外部系统交互的动态操作。

三类服务功能比较

特性ResourceToolPrompt
主要功能提供数据执行操作定义模板
操作类型只读读写模板定义
状态修改
缓存支持
典型用途数据获取功能执行交互指导

一个服务端的编程实现示例

项目创建

1. 安装 uv

本文使用 uv 作为包管理工具(也可以使用  pip、poetry、conda 其他包管理工具)。uv 是 Astral 公司推出的一款基于 Rust 编写的 Python 包管理工具,提供了快速、可靠且易用的包管理体验,在性能、兼容性和功能上都有出色表现。

安装 uv 工具命令(以 windows 为例):

# On Windows.powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"# With pip.pip install uv

uv 的相关命令介绍

An extremely fast Python package manager.Usage: uv [OPTIONS] <COMMAND>Commands:  run                        Run a command or script  init                       Create a new project  add                        Add dependencies to the project  remove                     Remove dependencies from the project  sync                       Update the project's environment  lock                       Update the project's lockfile  export                     Export the project's lockfile to an alternate format  tree                       Display the project's dependency tree  tool                       Run and install commands provided by Python packages  python                     Manage Python versions and installations  pip                        Manage Python packages with a pip-compatible interface  venv                       Create a virtual environment  build                      Build Python packages into source distributions and wheels  publish                    Upload distributions to an index  cache                      Manage uv's cache  self                       Manage the uv executable  version                    Display uv's version  generate-shell-completion  Generate shell completion  help                       Display documentation for a command

2. 创建 python 项目

使用 uv 命令,创建项目

# 创建 python 项目,项目名称为 mcp_learninguv init mcp_learningcd mcp_learning# 激活虚拟环境uv venv.venv\Scripts\activate

3. 安装 python 依赖包

# 安装相关依赖包uv add mcp[cli] httpx# 连接 pg 数据库的 python 包uv add psycopg2

4. 安装 node.js

本文会用到 MCP Inspector 来测试验证服务端的功能(MCP Inspector 是一个用于测试和调试 MCP 服务端的交互式开发者工具)。MCP Inspector 运行,需要依赖 npx,因此需要安装 node.js。

nodejs.org/zh-cn/downl… v18.20.8 版本进行下载并安装:

创建服务端实例

注意:host="0.0.0.0" 设置使服务器可以接受来自任何 IP 地址的连接,这在开发环境中很方便,但在生产环境中可能需要更严格的访问控制。

# 导入必要的模块from mcp.server.fastmcp import FastMCP  # 导入 MCP 服务器的主类import psycopg2  # PostgreSQL 数据库连接库import json  # JSON 处理库from psycopg2.extras import RealDictCursor  # 使查询结果以字典形式返回的游标from mcp.server.fastmcp.prompts import base  # MCP 提示模板的基础类# 创建 MCP 服务器mcp = FastMCP("MCP Test Server",  # 服务器名称              debug=True,  # 启用调试模式,会输出详细日志              host="0.0.0.0",  # 监听所有网络接口,允许远程连接              port=8002)  # 服务器监听的端口号

Resources 实现

mcp 服务端可以为 mcp 客户端定义访问数据库数据的资源端点,允许客户端查询数据库的元数据、数据表数据。下面以访问 pg 数据库数据为例。

    数据库连接

定义连接 PostgreSQL 数据库的配置,定义创建数据库连接的函数。

# 数据库连接配置DB_CONFIG = {    "dbname""xx",    "user""xx",    "password""xx123456",    "host""10.1.1.27",    "port""11003"}def get_db_connection():    """创建数据库连接"""    return psycopg2.connect(**DB_CONFIG)

2. 资源定义测试示例

简单的测试资源,用于验证服务器是否正常工作。当客户端请求 test://hello 资源时,将返回 "Hello, World!" 字符串。

@mcp.resource("test://hello")def hello() -> str:    """简单的测试资源"""    return "Hello, World!"

3. 表名列表查询

查询数据库中 public 模式下的全部表名,返回一个表名列表的 JSON 字符串。

# 定义资源:获取所有表名@mcp.resource("db://tables")def list_tables() -> str:    """获取所有表名列表"""    with get_db_connection() as conn:        with conn.cursor() as cur:            cur.execute("""                SELECT table_name                FROM information_schema.tables                WHERE table_schema = 'public'            """)            tables = [row[0for row in cur.fetchall()]            return json.dumps(tables)

4. 表数据查询

定义数据表查询的资源,允许查询指定表的数据,支持参数:

使用了 RealDictCursor 使结果以字典形式返回,使用了参数化查询来防止 SQL 注入攻击,并设置 ensure_ascii=False 以保留中文字符。

# 定义资源:获取表数据@mcp.resource("db://tables/{table_name}/data/{limit}")def get_table_data(table_name: str, limit: int100) -> str:    """获取指定表的数据    参数:    table_name: 表名    """    try:        with get_db_connection() as conn:            with conn.cursor(cursor_factory=RealDictCursor) as cur:                # 使用参数化查询防止 SQL 注入                cur.execute(f"SELECT * FROM %s LIMIT %s",                            (psycopg2.extensions.AsIs(table_name), limit))                rows = cur.fetchall()                # return json.dumps(list(rows), default=str)                return json.dumps(list(rows), default=str, ensure_ascii=False)    except Exception as e:        return json.dumps({            "status""error",            "message": str(e)        })

5. 表结构查询

定义表结构查询的资源,允许查询指定表的结构信息,包括列名、数据类型、最大长度和列注释。(不同类型的数据库,查询表元数据的 sql 会有所不同)。

# 定义资源:获取表结构@mcp.resource("db://tables/{table_name}/schema")def get_table_schema(table_name: str) -> str:    """获取表结构信息    参数:    table_name: 表名    """    with get_db_connection() as conn:        with conn.cursor() as cur:            cur.execute("""                select c.column_name,                        c.data_type,                        c.character_maximum_length,                       pgd.description as column_comment                from information_schema.columns c                left join pg_catalog.pg_statio_all_tables st                 on c.table_schema = st.schemaname and c.table_name = st.relname                left join pg_catalog.pg_description pgd                 on pgd.objoid = st.relid                    and pgd.objsubid = c.ordinal_position                where c.table_name = %s                order by c.ordinal_position            """, (table_name,))            columns = [{"name": row[0], "type": row[1], "max_length": row[2], "comment": row[3]}                       for row in cur.fetchall()]            return json.dumps(columns, ensure_ascii=False)

Prompts 实现

定义了 MCP prompt(提示模板),用于指导 LLM 如何回答特定类型的查询。

    中国省份介绍
# 中国省份介绍@mcp.prompt()def introduce_china_province(province: str) -> str:    """介绍中国省份    参数:    province: 省份名称    """    return f"""    请介绍这个省份:{province}    要求介绍以下内容:    1. 历史沿革    2. 人文地理、风俗习惯    3. 经济发展状况    4. 旅游建议    """

2. 代码调试提示模板

提示模板的功能:

对话包含五条消息:

    系统消息:定义助手的角色和任务用户消息:请求帮助修复代码用户消息:包含代码内容(使用代码块格式)用户消息:包含错误信息助手消息:初始回应,表明将分析问题

使用场景:当用户遇到代码错误需要帮助调试时,通过预设对话历史,引导 LLM 进入特定的思考模式,提供结构化的上下文,使 LLM 能够更有效地分析和解决代码问题。

# 调试代码提示@mcp.prompt()def debug_code(code: str, error_message: str) -> list[base.Message]:    """调试代码的对话式提示模板    参数:    code: 需要调试的代码    error_message: 错误信息    """    return [        base.SystemMessage("你是一位专业的代码调试助手。请仔细分析用户提供的代码和错误信息,找出问题所在并提供修复方案。"),        base.UserMessage("我的代码有问题,请帮我修复:"),        base.UserMessage(f"```\n{code}\n```"),        base.UserMessage(f"错误信息:\n{error_message}"),        base.AssistantMessage("我会帮你分析这段代码和错误信息。首先让我理解问题所在..."),    ]

Tools 实现

定义了四个基本的数学运算工具,通过 @mcp.tool() 装饰器,将这些函数注册为 MCP 服务端的工具(可以被客户端直接调用)

@mcp.tool()def add(a: float, b: float) -> float:    """加法运算    参数:    a: 第一个数字    b: 第二个数字    返回:    两数之和    """    return a + b@mcp.tool()def subtract(a: float, b: float) -> float:    """减法运算    参数:    a: 第一个数字    b: 第二个数字    返回:    两数之差 (a - b)    """    return a - b@mcp.tool()def multiply(a: float, b: float) -> float:    """乘法运算    参数:    a: 第一个数字    b: 第二个数字    返回:    两数之积    """    return a * b@mcp.tool()def divide(a: float, b: float) -> float:    """除法运算    参数:    a: 被除数    b: 除数    返回:    两数之商 (a / b)    异常:    ValueError: 当除数为零时    """    if b == 0:        raise ValueError("除数不能为零")    return a / b

main 函数

mcp 服务端提供 stdio 和 sse 两种传输协议运行方式。默认是使用 stdio 协议(适用于本地调试)。sse 协议适用于生产环境。

if __name__ == "__main__":    mcp.run('sse')

使用 MCP Inspector 验证服务端功能

MCP Inspector 是专为 MCP 服务端设计的交互式调试工具,提供了一个直观的界面,使得开发者能够快速地验证服务端的响应和状态。使用 MCP Inspector 来测试验证上述开发的服务端功能。

运行 MCP Inspector

在终端运行 mcp --help,可以查看 mcp 命令的用法(由下面的返回结果可知,可以通过 mcp dev 命令运行 mcp inspector):

>mcp --help Usage: mcp [OPTIONS] COMMAND [ARGS]... MCP development tools╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ --help          Show this message and exit.                                                                          │╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ version   Show the MCP version.                                                                                      ││ dev       Run a MCP server with the MCP Inspector.                                                                   ││ run       Run a MCP server.                                                                                          ││ install   Install a MCP server in the Claude desktop app.                                                            │╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

mcp dev 命令语法:

>mcp dev --help Usage: mcp dev [OPTIONS] FILE_SPEC Run a MCP server with the MCP Inspector.╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ *    file_spec      TEXT  Python file to run, optionally with :object suffix [default: None] [required]              │╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ --with-editable  -e      DIRECTORY  Directory containing pyproject.toml to install in editable mode [default: None]  ││ --with                   TEXT       Additional packages to install                                                   ││ --help                              Show this message and exit.                                                      │╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

运行命令:mvp dev server_see_test.py( mcp dev 命令默认使用 stdio 通信方式来启动 mcp 服务端),对上面开发的 mcp 服务端功能进行测试。点击输出的链接,即可打开浏览器,进入 mcp inspector 用户界面:

打开 mcp inspector 的页面,点击左侧的 connect 按钮,连接到 mcp 服务端:

连接到 mcp 客户端后,左侧的页面顶部显示 Resources、Prompts、Tools 三个按钮,可以分别对服务端暴露的 Resources、Prompts、Tools 功能进行测试验证。

Resources 功能验证

点击 Resources,然后点击下方的 List Resources、List Templates,可以查看资源 list。

查看数据库的数据表清单,点击资源 URI db://tables 后,右侧可以查看到 mcp 服务端返回的内容,目前数据库有两张数据表,分别是 chinese_provinces、chinese_movie_ratings 两张表:

查看具体某张数据表的数据内容。点击 get_table_data 资源,输入表名参数和 limit 参数,点击 Read Resource,可以查看 mcp 服务端返回的数据表数据:

Prompts 功能验证

点击 Prompts 下的 List Prompts,列出全部 Prompts:

选择其中一个 Prompt,输入参数 (如,广东省),点击 Get Prompt,即可按照预先设定的 prompt 模板,生成 prompt:

Tools 功能验证

点击 Tools 下的 List Tools,列出全部工具,选择其中一个,输入参数,点击 Run Tools,即可调用工具,获取返回的运行结果:

通过 mcp inspector,可以快捷高效地测试验证我们开发的 mcp 服务端功能。

以上是 mcp 服务端的编程开发与功能验证。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MCP服务端 Resource Prompt Tool MCP Inspector
相关文章