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

  1. 介绍 MCP 服务端提供的服务类型(Resource、Prompt、Tool)及其适用场景。

  2. 一个服务端的编码开发示例:通过 Resource 访问数据库数据;通过 Prompt 生成代码调试提示模板;通过 Tool 实现数学运算功能。

  3. 使用 MCP Inspector,高效地对开发的 MCP 服务端功能进行测试验证。

服务端提供的服务类型

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

图片

Resources

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

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

特点

  • 只读操作

  • 类似 REST API 的 GET 请求

  • 使用 URI 风格的路径

  • 适合缓存

典型场景

  • 读取文件内容

  • 获取配置信息

  • 查询数据库数据

  • 获取系统状态 

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

Prompts

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

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

  • 提供结构化的提示模板

  • 可以包含参数

  • 指导 LLM 的输出

  • 可重用的交互模式

典型场景

  • 生成文本模板

  • 定义对话流程

  • 标准化 LLM 输出

  • 创建特定任务的指令

Tools

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

Tools 的关键特性有:

  • Discovery (发现):Clients 可以通过 tools/list endpoint 列出可用的 tools

  • Invocation (调用):Tools 使用 tools/call endpoint 调用,其中 servers 执行请求的操作并返回结果

  • Flexibility (灵活性):Tools 的范围可以从简单的计算到复杂的 API 交互

用途:执行操作和计算

特点

  • 可以影响或修改外部系统的状态

  • 类似 REST API 的 POST/PUT/DELETE

  • 执行具体的功能

典型场景

  • 数学计算

  • 数据处理

  • API 调用

  • 文件操作

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

三类服务功能比较

特性

Resource

Tool

Prompt

主要功能

提供数据

执行操作

定义模板

操作类型

只读

读写

模板定义

状态修改

缓存支持

典型用途

数据获取

功能执行

交互指导

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

项目创建

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_learning
uv init mcp_learning
cd 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。

在 https://nodejs.org/zh-cn/download,选择 v18.20.8 版本进行下载并安装:

图片

创建服务端实例
  • FastMCP 为 MCP 服务端的主要实现类。创建服务端名称为 "MCP Test Server" 的实例

  • 启用了调试模式,产生更详细的日志输出,方便调试。

  • 服务器配置为监听 0.0.0.0(所有网络接口),接受来自本地和远程的连接

  • 端口设置为 8002,这是客户端连接服务器的端口

注意: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 数据库数据为例。

1. 数据库连接

定义连接 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[0] for row in cur.fetchall()]
            return json.dumps(tables)

4. 表数据查询

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

  • table_name: 要查询的表名

  • limit: 限制返回的最大行数,默认值为 100

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

# 定义资源:获取表数据
@mcp.resource("db://tables/{table_name}/data/{limit}")
def get_table_data(table_name: str, limit: int = 100) -> 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 如何回答特定类型的查询。

1. 中国省份介绍

  • 使用 @mcp.prompt() 装饰器注册为 MCP 服务器的提示模板

  • 接受一个参数 province,表示要介绍的中国省份名称

  • 返回一个字符串提示模板,引导 LLM 按照特定结构介绍指定省份

  • 提示模板要求 LLM 从四个方面介绍省份:历史沿革、人文地理和风俗习惯、经济发展状况、旅游建议

# 中国省份介绍
@mcp.prompt()
def introduce_china_province(province: str) -> str:
    """介绍中国省份

    参数:
    province: 省份名称
    """
    return f"""
    请介绍这个省份:{province}

    要求介绍以下内容:
    1. 历史沿革
    2. 人文地理、风俗习惯
    3. 经济发展状况
    4. 旅游建议
    """

2. 代码调试提示模板

提示模板的功能:

  • 使用 @mcp.prompt() 装饰器注册

  • 接受两个参数:code(需要调试的代码)和 error_message(错误信息)

  • 与第一个模板不同,这个模板返回的是 list[base.Message] 类型,表示一个多轮对话的消息列表

对话包含五条消息:

  1. 系统消息:定义助手的角色和任务

  2. 用户消息:请求帮助修复代码

  3. 用户消息:包含代码内容(使用代码块格式)

  4. 用户消息:包含错误信息

  5. 助手消息:初始回应,表明将分析问题

使用场景:当用户遇到代码错误需要帮助调试时,通过预设对话历史,引导 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 服务端的编程开发与功能验证。

 如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近70次后,终于把整个AI大模型的学习门槛,降到了最低!

在这个版本当中:

第一您不需要具备任何算法和数学的基础
第二不要求准备高配置的电脑
第三不必懂Python等任何编程语言

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套LLM大模型报告合集

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

五、AI产品经理大模型教程

在这里插入图片描述

LLM大模型学习路线 

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。

  • 内容

    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。

  • 内容

    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐