前言

2026 年,可以说是真正属于 AI Agent 的一年。

如果说 2025 年大家讨论最多的是:

  • Function Calling
  • Tool Calling
  • RAG
  • LangChain

那么 2026 年,几乎所有 AI Agent 平台讨论最多的都是:

MCP(Model Context Protocol)

7 月 28 日最新版 MCP 官方规范发布之后,整个协议已经逐渐稳定。

目前已经有:

  • Claude Desktop
  • Cursor
  • Windsurf
  • VSCode AI
  • Continue
  • OpenHands
  • Roo Code
  • Cline
  • Gemini CLI
  • OpenAI Agent SDK
  • Koog
  • LangGraph

大量产品开始全面支持 MCP。

一句话:

未来 Agent 的工具接口,大概率都会统一成 MCP。


一、什么是 MCP?

很多人第一次看到 MCP,会认为:

它是不是一种 API?

其实不是。

它更像:

USB Type-C。

以前:

每个 AI 都有自己的工具协议。

例如:


OpenAI
↓

Function Calling

Claude
↓

Tool Use

Gemini
↓

Extensions

LangChain
↓

Tool

AutoGen
↓

Skill

CrewAI
↓

Tool

Semantic Kernel
↓

Plugin

全部都不一样。

开发者需要:


写五遍工具

维护五套接口

重复开发

非常痛苦。

MCP 的目标就是:

统一工具协议。

任何 AI,只要支持 MCP:


AI
↓

MCP

↓

你的工具

全部通用。


MCP 架构图


┌─────────────────────────────┐
│         AI Client           │
│ Claude Cursor VSCode        │
└────────────┬────────────────┘
             │
             │ JSON-RPC
             │
┌────────────▼────────────────┐
│         MCP Server          │
│                             │
│ Tool                        │
│ Resource                    │
│ Prompt                      │
│ Sampling                    │
└────────────┬────────────────┘
             │
─────────────┼────────────────────
             │
      数据库
      Redis
      HTTP API
      企业系统
      HarmonyOS
      GitHub

MCP Server 就像:

AI 世界里的 Spring Boot。


二、为什么 MCP 会成为标准?

原因只有一句:

AI 不想再学习各种 Tool API。

例如:

今天:


Claude

↓

tool A

明天:


OpenAI

↓

tool B

后天:


Gemini

↓

tool C

开发者需要不停适配。

而 MCP:


AI

↓

MCP

↓

你的工具

永远不用改。


三、MCP 核心组成

MCP 官方定义了几个对象:


Tool

Resource

Prompt

Sampling

Notification

Transport

下面逐个讲解。


1、Tool(工具)

这是 MCP 最重要的能力。

例如:

天气查询:


getWeather(city)

股票:


getStock(code)

地图:


searchPOI(keyword)

数据库:


query(sql)

Git:


commit()

AI 调用:


↓

Tool

↓

返回 JSON

例如:


{
  "temperature": 32,
  "humidity": 68
}

AI 自动理解。


Tool 生命周期


初始化

↓

注册

↓

模型发现

↓

模型调用

↓

执行

↓

返回结果

全部标准化。


Tool Schema

MCP 使用 JSON Schema。

例如:


{
  "name": "getWeather",
  "description": "查询天气",
  "inputSchema": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string"
      }
    }
  }
}

AI 自动生成参数。

无需 Prompt。


四、Resource(资源)

Resource 是:

AI 可读取的数据。

例如:


README.md

数据库

配置文件

日志

Markdown

PDF

网页

AI:


读取

↓

分析

↓

回答

而不是 Tool。

二者区别:

Tool:


执行动作

Resource:


读取内容

五、Prompt

Prompt 也可以注册。

例如:


代码评审

PR分析

日报生成

周报生成

AI:


发现 Prompt

↓

调用 Prompt

↓

生成上下文

非常方便。


六、Sampling

Sampling 是 MCP 最新的重要能力。

以前:


Client

↓

LLM

现在:


Server

↓

请求 Client

↓

再次调用 LLM

即:

Server 可以要求:

"请帮我继续推理。"

这是 Agent 能力的重要组成部分。


七、Transport(传输层)

MCP 支持多种通信方式:


stdio

HTTP

SSE

WebSocket(扩展实现)

Streamable HTTP

其中:

开发工具:


stdio

企业部署:


HTTP

云端:


Streamable HTTP

已经成为主流。


八、为什么新版 MCP 强调无状态(Stateless)

早期 MCP Server:


Client

↓

Session

↓

Server

服务器维护:


Context

Memory

Conversation

问题:


扩容困难

负载均衡困难

状态同步复杂

新版规范建议:


所有状态

↓

Client 保存

Server:


收到请求

↓

执行

↓

返回

↓

结束

完全 Stateless。

优势:

  • 更容易水平扩容
  • 支持 Serverless 部署
  • 降低内存占用
  • 更适合 Kubernetes 与容器化
  • 更容易实现高可用和弹性伸缩

九、开发第一个 MCP Server

下面将进入实战部分,我们会从零开始搭建一个完整的 MCP Server。

项目目标:

  • 搭建 MCP Server
  • 注册 Tool
  • 注册 Resource
  • 注册 Prompt
  • 对接第三方 HTTP API
  • 接入数据库
  • 支持 Claude Desktop、Cursor 等客户端
  • 实现日志、认证、权限控制
  • 最终完成一个企业级 AI Agent 工具链。

第1章 MCP 基础架构与协议解析(上)

——彻底搞懂 MCP 为什么会成为 AI Agent 的基础设施


1.1 MCP 到底解决了什么问题?

在 MCP 出现之前,几乎每一个 AI 平台都有自己的 Tool Calling 规范。

例如:


OpenAI
↓

Function Calling

Claude
↓

Tool Use

Gemini
↓

Extensions

LangChain
↓

Tool

CrewAI
↓

Skill

Semantic Kernel
↓

Plugin

如果你开发一个工具:

例如:


查询天气

你需要写:


OpenAI版本

Claude版本

Gemini版本

LangChain版本

AutoGen版本

接口全部不同。

企业项目通常都会出现这种情况:


天气服务

↓

SpringBoot API

↓

OpenAI

↓

Claude

↓

Cursor

↓

内部Agent

同一个能力,需要包装五六层。

维护成本极高。


MCP 的目标

MCP 官方希望做到:


任何模型

↓

统一协议

↓

统一工具

↓

统一资源

以后:


AI

↓

MCP

↓

你的系统

模型不用适配。

工具不用重复开发。


MCP 不只是 Tool

很多文章介绍 MCP 时,只介绍 Tool。

实际上:

MCP 官方定义的是:


Model Context Protocol

注意:

不是:


Tool Protocol

为什么叫 Context?

因为 AI 真正需要的是:


上下文(Context)

工具只是 Context 的一种。


真正提供给 AI 的内容包括:


Tool

Resource

Prompt

Sampling

Logging

Notification

所以:

MCP 管理的是:

AI 能获取的一切上下文。


1.2 MCP 整体架构

完整架构如下:


                +----------------------+
                |      AI Client       |
                | Claude / Cursor      |
                +----------+-----------+
                           |
                 JSON-RPC 2.0
                           |
        +------------------+------------------+
        |                                     |
+-------v-------+                     +-------v-------+
|  MCP Server A |                     |  MCP Server B |
| Weather       |                     | GitHub        |
+-------+-------+                     +-------+-------+
        |                                     |
        |                                     |
+-------v-------+                     +-------v-------+
| Weather API   |                     | GitHub API    |
+---------------+                     +---------------+

一个 AI 可以连接:


天气服务器

Git服务器

数据库服务器

文件服务器

搜索服务器

全部通过 MCP。

这就是:

AI Tool Chain(工具链)


为什么要拆成多个 Server?

很多人第一次开发 MCP 都喜欢:


一个Server

里面放100个Tool

实际上并不推荐。

企业一般这样拆:


Finance MCP

CRM MCP

OA MCP

Git MCP

Wiki MCP

DevOps MCP

HR MCP

原因:

权限不同。

生命周期不同。

部署不同。

维护团队不同。

所以:

MCP 天然支持:


多个 Server

↓

一个 Client

1.3 MCP 通信流程

AI 调用一次 Tool,

到底发生了什么?

例如:

用户说:


今天北京天气怎么样?

整个流程:


用户

↓

AI

↓

判断需要天气

↓

查询Tool列表

↓

找到getWeather

↓

调用Tool

↓

返回JSON

↓

AI组织自然语言

↓

回答用户

注意:

AI 并不知道:


getWeather()

如何实现。

AI 只知道:


名字

描述

参数

返回结果

因此:

Tool 永远都是:


黑盒。

Tool Discovery(工具发现)

AI 第一次连接 Server:

首先发送:


initialize

Server 返回:


我支持:

Tool

Prompt

Resource

Sampling

然后:

AI 会请求:


tools/list

Server 返回:


Tool A

Tool B

Tool C

AI:

全部缓存。

所以:

用户第一次提问:

AI 已经知道:


有哪些工具

整个时序图:


Client

↓

initialize

↓

Server

↓

返回Capability

↓

Client

↓

tools/list

↓

Server

↓

返回Tool列表

↓

Client缓存

以后:

无需再次获取。

除非:


Tool更新

1.4 JSON-RPC 通信协议

MCP 底层采用:


JSON-RPC 2.0

很多后端同学都很熟悉。

例如:

请求:


{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list"
}

Server:


{
  "jsonrpc":"2.0",
  "id":1,
  "result":{
      ...
  }
}

调用 Tool:


{
  "jsonrpc":"2.0",
  "id":2,
  "method":"tools/call",
  "params":{
      "name":"getWeather",
      "arguments":{
          "city":"北京"
      }
  }
}

Server:


{
  "jsonrpc":"2.0",
  "id":2,
  "result":{
      "content":[
          {
              "type":"text",
              "text":"32℃"
          }
      ]
  }
}

是不是很简单?

实际上:

整个 MCP 通信,

都是:


JSON

+

JSON-RPC

没有任何神秘的地方。


1.5 initialize 生命周期

所有 MCP Server,

第一步都是:


initialize

流程:


Client

↓

initialize

↓

Server

↓

返回:

协议版本

Server名称

Capability

↓

Client

↓

initialized

例如:


Client

↓

initialize

↓

{
 protocolVersion

 capabilities

 clientInfo
}

Server:


{
protocolVersion

serverInfo

capabilities
}

其中:

ServerInfo:


{
name

version
}

例如:


HarmonyOS MCP

v1.0.0

Capability(能力协商)

这是 MCP 最大特点。

Client:

不会假设:


Server支持全部功能

而是:

询问:


你支持什么?

例如:


Server:

支持:

Tool

Prompt

Resource

Sampling

另一个:


Server:

只有Tool

AI:

自动适配。

所以:

MCP:

非常灵活。


Capability 示例:


{
  "capabilities": {
    "tools": {},
    "resources": {},
    "prompts": {},
    "sampling": {}
  }
}

AI:

看到:


sampling

就知道:

这个 Server:

可以请求模型继续推理。


1.6 Tool 为什么不用 Prompt?

很多人第一次看到:


description

会疑惑:

为什么:

没有 Prompt?

实际上:

AI 自动理解:

例如:


{
"name":"getWeather",
"description":"获取指定城市天气"
}

LLM 会理解:


天气

↓

城市

↓

调用

如果:

用户:


杭州今天多少度?

AI:

自动:


city=杭州

无需:

Prompt。


再例如:


Git Commit

描述:


提交Git代码

用户:


帮我提交代码

AI:

自动调用。

这就是:

Schema 驱动。

而不是:

Prompt 驱动。


1.7 为什么 Tool 一定要有 Schema?

如果:

没有 Schema:

AI:

不知道:


需要几个参数?

参数叫什么?

参数类型?

哪些必填?

例如:

Tool:


createUser

Schema:


{
"type":"object",
"properties":{
"name":{
"type":"string"
},
"age":{
"type":"integer"
}
},
"required":[
"name"
]
}

AI:

立即知道:


需要:

name

可选:

age

甚至:

还能自动:


追问用户:

请告诉我姓名。

这就是 Schema 的价值。

第1章 MCP 基础架构与协议解析(下)

1.8 MCP 消息格式与 JSON-RPC 全流程解析


1.8 为什么 MCP 选择 JSON-RPC?

很多人都会问:

为什么不用 REST?

为什么不用 GraphQL?

为什么不用 gRPC?

官方最终选择了:


JSON-RPC 2.0

主要原因有五个。

原因一:天然支持 Request / Response

REST:


GET

POST

PUT

DELETE

而 AI Tool 调用其实只有一种:


调用一个方法

JSON-RPC 天然就是:


method

↓

params

↓

result

十分契合。


原因二:支持双向通信

REST:

一般都是:


Client

↓

Server

而 MCP:


Client

↓

Server

↓

Client

↓

Server

例如 Sampling:


Server

↓

请 Client 再调用一次 LLM

↓

Client 返回结果

REST 很难表达这种模式。


原因三:天然支持通知(Notification)

例如:


日志

进度

事件

JSON-RPC:

可以没有 id。

例如:


{
    "jsonrpc":"2.0",
    "method":"notifications/message",
    "params":{
        "level":"info",
        "message":"开始分析仓库..."
    }
}

Client:

收到即可。

无需回复。


原因四:跨语言成本极低

任何语言都有:


JSON

Socket

stdin/stdout

因此:

Java

Python

Node

Go

Rust

Kotlin

全部可以实现。


原因五:协议十分轻量

整个 MCP:

实际上只有:


JSON

+

JSON-RPC

+

Schema

没有:


HTTP框架

Session

Cookie

数据库

因此:

学习成本极低。


1.9 一次完整 MCP 会话

下面模拟一次真实通信。

假设:

Cursor 连接 Weather MCP。


第一步

建立连接。

如果是 stdio:


Cursor

↓

启动:

weather-server.exe

如果:

HTTP:


POST

/mcp

如果:

Streamable HTTP:


建立长连接

第二步

initialize

Client:


{
    "jsonrpc":"2.0",
    "id":1,
    "method":"initialize",
    "params":{
        "protocolVersion":"2026-07-28",
        "capabilities":{
            "sampling":{}
        },
        "clientInfo":{
            "name":"Cursor",
            "version":"1.2"
        }
    }
}

这里:

包含:


协议版本

客户端信息

客户端能力

Server:


{
    "jsonrpc":"2.0",
    "id":1,
    "result":{
        "protocolVersion":"2026-07-28",
        "serverInfo":{
            "name":"Weather MCP",
            "version":"1.0"
        },
        "capabilities":{
            "tools":{},
            "resources":{},
            "prompts":{}
        }
    }
}

至此:

双方知道:


彼此支持什么能力。

这就是:

Capability Negotiation(能力协商)。


第三步

Client:

发送:


initialized

注意:

很多新人容易忽略这一条。

例如:


{
    "jsonrpc":"2.0",
    "method":"notifications/initialized"
}

为什么需要?

因为:

initialize

只是:


能力协商

initialized

表示:


可以正式开始工作。

很多 SDK 都会自动发送。


第四步

获取 Tool。

Client:


{
    "jsonrpc":"2.0",
    "id":2,
    "method":"tools/list"
}

Server:

返回:


{
    "jsonrpc":"2.0",
    "id":2,
    "result":{
        "tools":[
            {
                "name":"getWeather",
                "description":"查询天气",
                "inputSchema":{
                    ...
                }
            },
            {
                "name":"getAQI",
                "description":"空气质量"
            }
        ]
    }
}

Cursor:

缓存。

Claude:

缓存。

VS Code:

缓存。

后面:

不用重复请求。


第五步

用户:


杭州今天多少度?

LLM:

推理:


需要:

getWeather

于是:

Client:

发送:


{
    "jsonrpc":"2.0",
    "id":3,
    "method":"tools/call",
    "params":{
        "name":"getWeather",
        "arguments":{
            "city":"杭州"
        }
    }
}

Server:

执行:


HTTP API

↓

天气平台

返回:


{
    "jsonrpc":"2.0",
    "id":3,
    "result":{
        "content":[
            {
                "type":"text",
                "text":"杭州今天32℃,晴。"
            }
        ]
    }
}

随后:

LLM:

组织自然语言:


今天杭州天气晴,
最高32℃,
适合出行。

整个调用结束。


1.10 Tool Call 生命周期

完整流程:


User

↓

LLM 推理

↓

选择 Tool

↓

参数补全

↓

Client

↓

tools/call

↓

Server

↓

执行业务

↓

返回 JSON

↓

LLM 生成回答

↓

User

整个过程:

AI:

并不会:


直接访问数据库。

所有能力:

都来自:

MCP。


1.11 Resource 生命周期

Tool:

执行动作。

而:

Resource:

读取内容。

例如:


README

PDF

Markdown

日志

数据库

Client:

请求:


{
    "jsonrpc":"2.0",
    "id":5,
    "method":"resources/list"
}

Server:

返回:


README

API文档

用户手册

数据库

随后:

Client:

读取:


{
    "method":"resources/read",
    "params":{
        "uri":"docs://readme"
    }
}

Server:

返回:


Markdown

AI:

分析。


1.12 Prompt 生命周期

Prompt:

也是一种资源。

例如:


Code Review

日报

SQL优化

周报

Client:


prompts/list

Server:

返回:


日报模板

↓

PR模板

↓

代码Review模板

随后:

AI:


prompts/get

Server:

返回:


Prompt内容

AI:

直接拼接上下文。


1.13 Sampling 生命周期

Sampling:

新版 MCP 最有意思的能力。

例如:

AI:

调用:


Git Tool

Server:

发现:


需要总结:

Git Diff

但是:

Server:

没有:

LLM。

怎么办?

Server:

发送:


sampling/createMessage

Client:

收到:


请调用模型:

总结以下Diff...

LLM:

完成。

结果:

再返回:

Server。

整个过程:


Server

↓

Client

↓

LLM

↓

Client

↓

Server

这就是:

Server 借用 Client 模型能力。


1.14 Notification(通知)

除了:

Request。

还有:

Notification。

例如:

日志。

Server:


开始读取Git仓库...

发送:


{
    "jsonrpc":"2.0",
    "method":"notifications/message",
    "params":{
        "level":"info",
        "message":"开始扫描..."
    }
}

没有:

id。

因为:


无需回复。

同理:

还有:


Progress

Warning

Error

Log

全部属于:

Notification。


1.15 Progress(进度)

假设:

工具:


扫描:

10000

个文件

如果:

一分钟:

没有任何输出。

用户:

会认为:


卡死。

因此:

Server:

可以发送:


{
    "jsonrpc":"2.0",
    "method":"notifications/progress",
    "params":{
        "progress":45,
        "total":100
    }
}

Cursor:

显示:


45%

用户体验:

大幅提升。


1.16 Error(错误)

JSON-RPC:

统一错误格式。

例如:


{
    "jsonrpc":"2.0",
    "id":3,
    "error":{
        "code":-32602,
        "message":"Invalid params"
    }
}

常见错误:

错误码 含义
-32700 JSON 解析失败
-32600 非法请求
-32601 方法不存在
-32602 参数错误
-32603 内部错误

建议:

业务错误:

不要:

直接:


throw Exception

而应该:

包装:


错误码

错误描述

可恢复建议

例如:


Git仓库不存在

↓

建议:

请确认仓库路径。

AI:

还能:

自动解释给用户。


1.17 MCP 为什么强调无状态?

这是最新版规范最大的变化之一。

以前:

很多 MCP Server:

都会保存:


Conversation

Memory

Session

后来发现:

扩容困难。

因此:

新版:

推荐:


所有状态:

Client 保存。

Server:

每一次:


收到请求

↓

执行

↓

返回

↓

释放资源

因此:

Server:

可以:


无限水平扩容。

这也是为什么:

MCP 非常适合:


Docker

Kubernetes

Serverless

云原生

部署。


1.18 一张图理解整个协议


                User
                  │
                  ▼
        +------------------+
        |      Client      |
        | Claude / Cursor  |
        +------------------+
                  │
        initialize / tools/list
                  │
                  ▼
        +------------------+
        |    MCP Server    |
        +------------------+
          │      │       │
          │      │       │
        Tool  Resource Prompt
          │
          ▼
    HTTP API / DB / Git / 企业系统

可以看到,MCP Server 更像是 AI 与企业系统之间的一层标准化适配层。它屏蔽了底层业务实现细节,对外只暴露统一的协议接口,让任何支持 MCP 的 AI Client 都能够安全、规范地调用企业能力。

第2章 开发环境搭建(2026最新版)

——30分钟搭建属于自己的第一个 MCP Server


2.1 MCP 官方 SDK 介绍

很多人第一次开发 MCP 时都会问:

是不是必须自己实现 JSON-RPC?

答案:

完全不用。

官方已经提供了多种语言 SDK。

目前主流包括:

SDK 推荐指数 企业使用
Node.js SDK ⭐⭐⭐⭐⭐ 非常多
Python SDK ⭐⭐⭐⭐⭐ AI项目最多
Kotlin SDK(Koog) ⭐⭐⭐⭐☆ 增长很快
Java SDK ⭐⭐⭐⭐☆ 企业后台
Go SDK ⭐⭐⭐⭐☆ 云原生
Rust SDK ⭐⭐⭐☆☆ 高性能

为什么推荐 SDK?

如果自己实现:

你需要处理:


JSON-RPC

initialize

Capability

Tool

Prompt

Resource

Sampling

Error

Notification

Progress

工作量非常大。

SDK 已经帮你完成:


协议解析

Tool注册

Schema生成

生命周期

Transport

开发者:

只需要:


写业务代码。

2.2 一个 MCP Server 到底有多简单?

很多人以为:

MCP Server:

至少几百行代码。

实际上:

真正的 Server:

通常只有几十行。

例如:


创建Server

↓

注册Tool

↓

启动Server

结束。

是不是很像:

Spring Boot:


@SpringBootApplication
public class Application{

    public static void main(String[] args){

    }

}

MCP:

也是如此。


2.3 推荐目录结构

企业项目:

推荐如下:


weather-mcp/

│
├── src/
│
├── tools/
│      weatherTool
│      searchTool
│      gitTool
│
├── resources/
│      readme
│      docs
│
├── prompts/
│      review
│      summary
│
├── services/
│      weatherService
│      httpService
│
├── config/
│
├── utils/
│
└── main

为什么不要:


main.js

weather.js

tool.js

util.js

因为:

后期:

Tool:

可能:


几十个

甚至几百个。

2.4 Tool 如何划分?

很多新人喜欢:


一个Tool:

什么都做。

例如:


GitTool

里面:


commit()

push()

pull()

clone()

branch()

merge()

tag()

checkout()

几千行。

实际上:

推荐:

一个 Tool:

只做:

一件事情。

例如:


GitCommitTool

GitPushTool

GitPullTool

GitCloneTool

优势:

  • 更容易维护
  • AI 更容易选择
  • Schema 更简单
  • 参数更少

2.5 Tool Description 编写原则

AI:

选择 Tool:

主要依赖:


name

description

因此:

Description:

非常重要。

例如:

错误:


天气

AI:

不知道:

什么意思。

正确:


查询指定城市实时天气

再例如:

错误:


Git

正确:


提交当前工作区修改到Git仓库

越具体:

AI:

越容易:

调用正确。


2.6 Tool Name 命名规范

推荐:

使用:


camelCase

例如:


getWeather

searchHotel

createIssue

queryDatabase

sendEmail

不要:


weather

tool1

aaa

test

AI:

无法理解。


2.7 Schema 编写规范

一个优秀 Schema:

应该做到:


参数明确

类型明确

必填明确

描述明确

例如:


{
    "type":"object",
    "properties":{
        "city":{
            "type":"string",
            "description":"需要查询天气的城市"
        }
    },
    "required":[
        "city"
    ]
}

AI:

看到:


城市

即可:

自动:

提取:


杭州

北京

上海

无需:

Prompt。


2.8 一个好的 Tool 应该满足什么?

官方推荐:

一个 Tool:

最好:

满足:

第一:

职责单一。

不要:


查询天气

↓

顺便查空气

↓

顺便查酒店

↓

顺便订酒店

拆开。


第二:

返回结构稳定。

例如:

始终:


{
    "temperature":32,
    "humidity":68
}

不要:

今天:


字符串

明天:


HTML

后天:


Markdown

AI:

会困惑。


第三:

返回机器可理解数据。

错误:


今天天气不错。

正确:


{
"temperature":32,
"condition":"Sunny"
}

自然语言:

留给:

LLM。


2.9 Resource 如何组织?

很多人:

第一次开发:

把:

所有文件:

都注册:

Resource。

实际上:

推荐:


产品文档

API文档

README

FAQ

帮助中心

知识库

不要:


node_modules

build

cache

tmp

否则:

AI:

上下文:

污染。


2.10 Prompt 如何组织?

企业项目:

Prompt:

推荐:

分类。

例如:


prompts/

code/

report/

qa/

translate/

sql/

不要:

几十个 Prompt:

放一起。


2.11 企业级项目目录

真正的大型 MCP:

通常:

如下:


src

├── controller

├── tool

│     git

│     weather

│     email

│     db

│

├── prompt

├── resource

├── service

├── repository

├── dto

├── model

├── config

├── middleware

├── auth

├── cache

├── logger

├── metrics

└── transport

是不是:

已经:

很像:

Spring Boot?

实际上:

企业 MCP:

就是:

一个:

轻量级:

微服务。


2.12 Transport 如何选择?

很多新人:

容易纠结:

到底:

选择:

stdio?

还是:

HTTP?

还是:

SSE?

建议:

场景 推荐
Claude Desktop stdio
Cursor stdio
VS Code stdio
本地开发 stdio
企业网关 HTTP
云端服务 Streamable HTTP
Kubernetes HTTP

一句话:

开发:

stdio。

部署:

HTTP。


2.13 日志系统

建议:

不要:


console.log()

推荐:

统一:


Logger

↓

INFO

WARN

ERROR

DEBUG

例如:


INFO:

开始调用天气接口

↓

INFO:

返回成功

↓

ERROR:

超时

方便:

Cursor:

显示:

Notification。


2.14 配置管理

不要:

写死:


API Key

URL

Token

推荐:


.env

config

yaml

例如:


WEATHER_API_KEY=

DB_URL=

REDIS_URL=

这样:

部署:

更加方便。

第3章 编写第一个 MCP Server(上)

——从零实现一个可以被 Cursor / Claude Desktop 调用的 AI Agent 工具

前面两章,我们已经学习了:

  • MCP 的协议原理
  • JSON-RPC 通信流程
  • Tool / Resource / Prompt 模型
  • Stateless 无状态架构
  • 企业级项目结构

现在开始真正写代码。

本章目标:

我们实现一个:

天气查询 MCP Server

最终效果:

用户:


查询一下北京今天的天气

AI:

自动发现:


getWeather

调用:


MCP Server

↓

天气接口

↓

返回结果

最终:

AI 输出:


北京今天晴天,
温度 32℃,
湿度 45%

3.1 技术选型

本章使用:

方案一:Node.js

原因:

目前 MCP 生态最成熟。

适合:

  • Cursor
  • Claude Desktop
  • VS Code Extension
  • 快速原型开发

技术:


Node.js

+

TypeScript

+

MCP SDK

项目:


weather-mcp-server

3.2 环境准备

安装 Node.js

推荐:

Node.js 22+

检查:


node -v

输出:

例如:


v22.12.0

npm:


npm -v

例如:


10.x

3.3 创建项目

创建目录:


mkdir weather-mcp-server

cd weather-mcp-server

初始化:


npm init -y

生成:


package.json

安装 TypeScript:


npm install typescript ts-node @types/node --save-dev

初始化:


npx tsc --init

生成:


tsconfig.json

3.4 安装 MCP SDK

安装:


npm install @modelcontextprotocol/sdk

安装完成:

package.json:


{
 "dependencies":{
   "@modelcontextprotocol/sdk":"latest"
 }
}

3.5 创建项目结构

最终:


weather-mcp-server

├── src

│   ├── index.ts

│   ├── tools

│   │     └── weather.ts

│   │

│   └── services

│         └── weatherService.ts


├── package.json

└── tsconfig.json

为什么拆?

因为:

MCP Server:

不要:

全部写:

index.ts。


推荐:


index

↓

tool

↓

service

↓

API

类似:

Spring Boot:


Controller

↓

Service

↓

Repository

3.6 创建 MCP Server

创建:


src/index.ts

代码:


import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import {
    StdioServerTransport
} from "@modelcontextprotocol/sdk/server/stdio.js";


const server = new Server(
    {
        name:"weather-mcp",
        version:"1.0.0"
    },
    {
        capabilities:{
            tools:{}
        }
    }
);


const transport =
    new StdioServerTransport();


await server.connect(
    transport
);

运行:


node index.js

现在:

你的 MCP Server:

已经启动。


但是:

还没有 Tool。

AI:

连接以后:

发现:


tools=[]

没有任何能力。


3.7 添加第一个 Tool

创建:


src/tools/weather.ts

代码:


export const weatherTool = {

name:"getWeather",

description:
"查询指定城市当前天气信息",

inputSchema:{
    type:"object",
    properties:{
        city:{
            type:"string",
            description:
            "城市名称"
        }
    },

    required:[
        "city"
    ]
}

};

这里:

最重要:

三个字段:


name

工具名字:


getWeather

AI:

看到:

知道:

调用它。


description

工具描述:

例如:


查询天气

不推荐。

推荐:


查询指定城市当前天气信息

更加准确。


inputSchema

告诉 AI:

参数。

例如:

用户:


上海天气

AI:

生成:


{
"city":"上海"
}

3.8 注册 Tool

修改:


index.ts

增加:


import {
weatherTool
}
from "./tools/weather.js";

注册:


server.setRequestHandler(
"tools/list",

async()=>{

return {

tools:[
 weatherTool
]

};

}
);

现在:

Client 请求:


tools/list

返回:


{
"tools":[
{
"name":"getWeather"
}
]
}

AI:

发现:

有工具。


3.9 实现 Tool 调用

继续:

添加:


server.setRequestHandler(
"tools/call",

async(request)=>{

const name =
request.params.name;


if(name==="getWeather"){

const city =
request.params.arguments.city;


return {

content:[
{
type:"text",
text:
`${city}今天晴天,32℃`
}
]

};

}


throw new Error(
"Tool不存在"
);

}
);

现在:

完整流程:


用户

↓

AI

↓

getWeather

↓

city=北京

↓

MCP Server

↓

返回天气

3.10 完整 index.ts

最终:


import { Server }
from "@modelcontextprotocol/sdk/server/index.js";

import {
StdioServerTransport
}
from "@modelcontextprotocol/sdk/server/stdio.js";


const server =
new Server(

{
name:"weather-mcp",
version:"1.0.0"
},

{
capabilities:{
tools:{}
}

});


server.setRequestHandler(

"tools/list",

async()=>{

return {

tools:[

{

name:"getWeather",

description:
"查询指定城市当前天气",

inputSchema:{

type:"object",

properties:{

city:{
type:"string"
}

},

required:[
"city"
]

}

}

]

};

}

);



server.setRequestHandler(

"tools/call",

async(request)=>{


if(
request.params.name
==="getWeather"
){

const city =
request.params.arguments.city;


return {

content:[

{

type:"text",

text:
`${city}今天晴天,32℃`

}

]

};

}


throw new Error(
"Unknown Tool"
);


}

);



const transport =
new StdioServerTransport();


await server.connect(
transport
);

3.11 启动测试

修改:

package.json:

增加:


{
"scripts":{

"start":
"node src/index.ts"

}
}

运行:


npm start

如果没有错误:

说明:

MCP Server:

启动成功。


3.12 使用 MCP Inspector 调试

官方提供:

MCP Inspector。

安装:


npm install -g @modelcontextprotocol/inspector

启动:


mcp-inspector

连接:

你的 Server。


可以看到:


Tools

↓

getWeather

点击:

测试:

输入:


{
"city":"北京"
}

返回:


北京今天晴天,32℃

3.13 接入 Cursor

Cursor:

打开:

Settings

MCP

Add Server

配置:


{
"mcpServers":{

"weather":{

"command":

"node",

"args":[

"/path/weather-mcp-server/src/index.ts"

]

}

}

}

重新启动 Cursor。

输入:


北京天气

Cursor:

显示:


Calling getWeather

然后:

返回:


北京今天晴天,32℃

3.14 到这里完成了什么?

我们已经实现:

✅ MCP Server

✅ initialize

✅ Capability

✅ tools/list

✅ tools/call

✅ Tool Schema

✅ stdio Transport

✅ AI Client 调用

这已经是一个完整 MCP Server。


但是:

现在还有几个问题:

问题1

天气数据是假数据。

需要:

接入真实 API。


问题2

Tool 全部写在:

index.ts

后期无法维护。


问题3

没有:

  • 日志
  • 异常处理
  • 超时
  • 重试
  • 权限控制

企业项目:

必须完善。

第3章 编写第一个 MCP Server(下)

——从 Demo 升级到企业级 MCP Agent 服务

上一节,我们已经完成了一个最简单的 MCP Server:


AI Client

↓

MCP Server

↓

getWeather Tool

↓

返回天气

但是,这个版本距离生产环境还有很大距离。

真实企业项目中,一个 MCP Server 通常需要:

  • 调用外部 API
  • 访问数据库
  • 权限校验
  • 日志追踪
  • 异常恢复
  • 超时控制
  • 缓存
  • 监控
  • Docker 部署

这一节,我们开始进行工程化改造。


3.15 为什么不能把业务全部写在 MCP Server?

上一节:


tools/call

{

  if(name==="getWeather"){

      调天气接口

  }

}

这种方式:

Demo 可以。

生产不行。

原因:

假设未来增加:


getWeather

getAirQuality

getWeatherHistory

getWeatherWarning

getCityInfo

最后:

index.ts:

变成:


2000行代码

维护灾难。


正确架构:


                MCP Client

                    |

                    |

              MCP Server

                    |

        +-----------+------------+

        |                        |

      Tool层                  Resource层

        |

        |

     Service层

        |

        |

    外部系统

 API / DB / Redis

类似 Spring Boot:


Controller

↓

Service

↓

Repository

3.16 重构项目结构

调整:


weather-mcp-server

src

├── index.ts

├── server

│     └── mcpServer.ts


├── tools

│     └── weatherTool.ts


├── services

│     └── weatherService.ts


├── clients

│     └── httpClient.ts


├── models

│     └── weather.ts


├── utils

│     └── logger.ts


└── config

      └── env.ts

职责:

模块 作用
server MCP生命周期
tools AI工具定义
services 业务逻辑
clients 外部接口
models 数据模型
utils 公共能力
config 配置

3.17 创建 Service 层

创建:


services/weatherService.ts

代码:


export class WeatherService {


async getWeather(city:string){


    // 模拟调用接口

    return {

        city,

        temperature:32,

        condition:"Sunny",

        humidity:45

    };


}


}

注意:

这里不关心:

MCP。

它只是普通业务代码。

未来:

可以:


Web调用

App调用

Agent调用

MCP调用

全部复用。


3.18 创建 Tool 层

创建:


tools/weatherTool.ts

代码:


import {
WeatherService
}
from "../services/weatherService.js";


const service =
new WeatherService();



export const weatherTool = {


name:"getWeather",


description:
"查询指定城市实时天气信息",



inputSchema:{


type:"object",


properties:{


city:{

type:"string",

description:
"城市名称"

}


},


required:[

"city"

]


}



};



export async function executeWeatherTool(
args:any
){


const result =
await service.getWeather(
args.city
);



return {


content:[


{

type:"text",

text:

JSON.stringify(
result
)

}

]


};



}

现在:

Tool:

只负责:


AI输入

↓

参数转换

↓

调用Service

业务:

全部:

在Service。


3.19 创建 MCP Server 管理类

创建:


server/mcpServer.ts

代码:


import {
Server
}
from "@modelcontextprotocol/sdk/server/index.js";


import {

weatherTool,

executeWeatherTool

}

from "../tools/weatherTool.js";



export function createServer(){


const server =
new Server(

{

name:"weather-mcp",

version:"1.0.0"

},


{

capabilities:{

tools:{}

}

}

);



server.setRequestHandler(

"tools/list",

async()=>{


return {


tools:[

weatherTool

]


};


}

);



server.setRequestHandler(

"tools/call",

async(request)=>{


if(

request.params.name
==="getWeather"

){


return await executeWeatherTool(

request.params.arguments

);


}



throw new Error(
"Unknown tool"
);


}

);



return server;


}

优势:

以后增加 Tool:

只需要:


tools/

weatherTool

gitTool

emailTool

dbTool

3.20 入口文件简化

现在:

index.ts:

只剩:


import {
createServer
}

from "./server/mcpServer.js";


import {

StdioServerTransport

}

from "@modelcontextprotocol/sdk/server/stdio.js";



const server =
createServer();



const transport =
new StdioServerTransport();



await server.connect(
transport
);

是不是很像:

Spring Boot:

main:

只负责启动。


3.21 接入真实天气 API

生产:

不能:


return {

temperature:32

}

需要:

调用:

例如:


天气平台

↓

HTTP API

↓

JSON

创建:


clients/httpClient.ts

封装:


export async function get(
url:string
){


const response =
await fetch(url);



if(!response.ok){

throw new Error(
"HTTP Error"
);

}



return response.json();


}

以后:

所有 HTTP:

统一管理。


3.22 Weather Client

创建:


clients/weatherClient.ts

代码:


import {
get
}
from "./httpClient.js";


export async function queryWeather(
city:string
){


const url =

`https://api.weather.com/${city}`;



return await get(url);


}

Service:

修改:


import {

queryWeather

}

from "../clients/weatherClient.js";



export class WeatherService{


async getWeather(city:string){


return await queryWeather(city);


}


}

现在:

结构:

变成:


Tool

↓

Service

↓

Client

↓

HTTP API

3.23 参数校验

AI 生成参数:

虽然很智能。

但是:

不能完全相信。

例如:

AI:

可能传:


{
"city":123
}

或者:


{}

所以:

必须校验。


安装:


npm install zod

定义:


import {
z
}
from "zod";


export const WeatherSchema =
z.object({

city:
z.string()
.min(1)

});

调用:


const data =
WeatherSchema.parse(args);

错误:

自动:

抛出。


3.24 错误处理

不要:

直接:


throw Error()

推荐:

统一:


class MCPError extends Error{


code:string;


constructor(
code:string,
message:string
){

super(message);

this.code=code;

}

}

例如:


throw new MCPError(

"CITY_NOT_FOUND",

"城市不存在"

);

AI:

可以理解:


城市不存在

↓

请重新输入城市

3.25 日志系统

生产必须:

记录:


用户请求

Tool调用

参数

耗时

异常

创建:


utils/logger.ts

代码:


export const logger={


info(
message:string
){

console.error(
"[INFO]",
message
);


},


error(
message:string
){

console.error(
"[ERROR]",
message
);

}


};

为什么:

console.error?

因为:

MCP stdio 模式:

stdout:

用于协议通信。

如果:

console.log:

会污染:

JSON-RPC。

这是很多新人踩坑。


3.26 MCP Notification 日志

MCP 支持:

主动通知 Client。

例如:

工具执行:


开始查询天气

↓

调用API

↓

完成

发送:


{
"method":
"notifications/message",

"params":{

"level":"info",

"message":
"正在查询天气"

}

}

Cursor:

可以展示。


3.27 超时控制

外部 API:

可能:

10秒。

30秒。

甚至:

一直等待。

必须:

限制。

例如:


const controller =
new AbortController();


setTimeout(()=>{

controller.abort();

},5000);

超过:

5秒:

取消。


3.28 重试机制

网络:

偶尔失败。

例如:

第一次:


503

第二次:

成功。

推荐:

指数退避:


第一次

1秒


第二次

2秒


第三次

4秒

公式:


delay = 2^retry

3.29 Docker 部署 MCP Server

Dockerfile:


FROM node:22


WORKDIR /app


COPY package*.json ./


RUN npm install


COPY . .


CMD [

"node",

"src/index.ts"

]

构建:


docker build -t weather-mcp .

运行:


docker run weather-mcp

企业环境:

通常:


Kubernetes

↓

Service

↓

MCP Server Pod

3.30 本章完成效果

现在我们的 MCP Server:

已经具备:

✅ 标准 MCP 协议

✅ Tool 注册

✅ Service 分层

✅ HTTP 调用

✅ 参数校验

✅ 错误处理

✅ 日志系统

✅ 超时控制

✅ Docker部署能力

已经接近:

生产级 MCP 服务。

第4章 MCP Tool 开发实战(上)

——从简单函数到企业级 AI Agent 工具设计

前面三章,我们已经完成:

  • MCP 协议理解
  • MCP Server 搭建
  • 第一个 Tool 实现
  • 企业级项目结构改造

但是很多开发者真正开始做 Agent 时,会遇到一个核心问题:

为什么我的 Tool 明明注册成功了,AI 却不会调用?

或者:

为什么 AI 经常选择错误的 Tool?

原因:

大部分问题不是 MCP 协议问题。

而是:

Tool 设计问题。


4.1 什么是 MCP Tool?

简单理解:

MCP Tool:

就是:

暴露给 AI 调用的函数。

传统开发:

函数:


function getWeather(city){

}

调用者:


程序员

决定:

什么时候调用。


AI Agent:

不同。

调用者:


LLM

它需要:

自己判断:

什么时候调用。

例如:

用户:


上海今天温度多少?

AI:

思考:


我需要天气工具

然后:

调用:


getWeather

所以:

普通函数:

关注:


怎么执行

AI Tool:

还必须关注:


AI什么时候调用

4.2 MCP Tool 四大组成

一个标准 Tool:

包含:


name

description

inputSchema

handler

例如:


{
"name":"searchUser",

"description":"根据用户ID查询用户信息",

"inputSchema":{

"type":"object",

"properties":{

"userId":{

"type":"string"

}

}

}

}

然后:

handler:

执行:


async function handler(args){

}

4.3 Tool Name 设计

很多人:

随便命名。

例如:


tool1

search

query

data

这是错误的。

因为:

LLM 看到:

名字。

它需要理解含义。


推荐规则

格式:


动词 + 名词

例如:

查询:


getUser

创建:


createOrder

搜索:


searchProduct

删除:


deleteFile

更新:


updateProfile

不要:


user

因为:

它不知道:

这是:

查询?

创建?

删除?


4.4 Tool Description 是最重要字段

很多 MCP 项目失败:

原因:

description 写得太差。


错误:


{
"name":"weather",
"description":"天气"
}

AI:

不知道:

什么时候使用。


正确:


{
"name":"getWeather",

"description":

"查询指定城市当前天气情况,包括温度、湿度、天气状态"
}

为什么?

因为:

LLM 判断 Tool:

主要依靠:


name

description

schema

4.5 Description 编写公式

推荐:

使用:

动作 + 对象 + 范围

公式:


[做什么]

+

[针对什么]

+

[返回什么]

例如:

数据库:

不好:


数据库查询

好:


执行只读SQL查询,返回指定表的数据记录

Git:

不好:


Git工具

好:


获取Git仓库当前状态,包括修改文件、分支信息和提交状态

文件:

不好:


读取文件

好:


读取指定路径文本文件内容,用于代码分析和文档理解

4.6 Input Schema 设计

Schema:

决定:

AI 如何生成参数。


例如:

查询订单:

错误:


{
"param":"订单"
}

正确:


{
"type":"object",

"properties":{

"orderId":{

"type":"string",

"description":

"订单唯一编号"

}

},

"required":[

"orderId"

]

}

AI:

知道:

需要:


orderId

4.7 必填参数设计

原则:

能少不要多。


错误:


{
"country":"",
"province":"",
"city":"",
"district":"",
"street":"",
"number":""
}

用户:

说:


北京天气

AI:

无法补全。


优化:


{
"city":"北京"
}

让:

LLM:

发挥优势。


4.8 参数默认值

很多 Tool:

需要:

默认值。

例如:

查询列表:


limit
page
sort

不要:

全部要求。


例如:


{
"page":{

"type":"number",

"default":1

},

"limit":{

"type":"number",

"default":20

}

}

AI:

自动:

填充。


4.9 返回结果设计

这是非常关键。

很多人:

Tool 返回:

一句话:


查询成功

这是错误。


AI Tool:

应该返回:

结构化数据。

例如:

天气:

错误:


今天32度

正确:


{
"city":"北京",

"temperature":32,

"condition":"晴",

"humidity":40
}

为什么?

因为:

后面可能:

继续:


根据天气推荐穿衣

AI:

需要字段。


4.10 Tool 返回格式

MCP 推荐:

Content:

例如:


{
"content":[

{

"type":"text",

"text":"天气信息"

}

]

}

除了 text:

还可以:


{
"type":"image"
}

或者:


{
"type":"resource"
}

例如:

图片分析:

返回:


{
"type":"image",

"data":"base64"
}

AI:

直接理解。


4.11 Tool 错误设计

错误:


throw Error(
"失败"
)

AI:

不知道:

怎么办。


正确:


{
"error":{

"code":

"USER_NOT_FOUND",

"message":

"用户不存在"

}
}

AI:

可以:

告诉用户:


没有找到该用户,请确认ID。

4.12 Tool 粒度设计

这是 Agent 设计核心。

问题:

一个 Tool:

到底做多少事情?


过细

例如:


getUserName

getUserAge

getUserPhone

问题:

Tool数量爆炸。


过粗

例如:


manageUser

里面:


查询

新增

修改

删除

AI:

容易误调用。


推荐:

中等粒度。

例如:


getUserInfo

createUser

updateUser

deleteUser

4.13 一个企业 CRM MCP 示例

假设:

CRM系统。

不要:

一个:


crmTool

拆:


CRM MCP Server


Tools:

getCustomer

searchCustomer

createCustomer

updateCustomer

getOrder

createOrder

AI:

看到:

用户:


查询张三客户资料

选择:


searchCustomer

用户:


新增一个客户

选择:


createCustomer

4.14 多 Tool 冲突问题

企业经常遇到:

两个 Tool:

功能相似。

例如:


searchUser

findUser

AI:

不知道:

选哪个。


解决:

方法1

合并。


方法2

明确描述。

例如:

searchUser:


通过关键词模糊搜索用户

findUser:


通过唯一ID精确查询用户

4.15 Tool 分类

大型 MCP:

推荐:

分类。

例如:


tools

├── user

│    getUser

│    createUser


├── order

│    getOrder

│    createOrder


├── payment

│    refund


├── system

│    healthCheck

虽然 MCP:

没有强制 Namespace。

但是:

工程上:

必须管理。


4.16 Tool 权限设计

企业环境:

不能:

所有 AI:

访问所有 Tool。

例如:

普通员工:

不能:


deleteUser

财务:

不能:


approvePayment

因此:

需要:


用户

↓

Agent

↓

MCP

↓

权限系统

↓

Tool

例如:

调用:


{
"name":"deleteUser"
}

Server:

检查:


role != admin

拒绝

4.17 Tool 安全原则

永远不要:

相信 AI 参数。

例如:

SQL Tool:

收到:


DROP TABLE user

怎么办?

必须:

限制。


数据库 Tool:

推荐:

只读:


SELECT

禁止:


UPDATE

DELETE

DROP

文件 Tool:

限制:

目录:

例如:

允许:


/workspace

禁止:


/etc

第4章 MCP Tool 开发实战(下)

——高级 Tool 架构:从单工具到企业级 AI Agent 工具链

上一节我们学习了:

  • Tool 命名设计
  • Description 编写
  • Schema 设计
  • 返回值设计
  • 权限控制

但是企业级 Agent 面临的问题更加复杂:

例如:

一个代码开发 Agent:

用户:

帮我修复订单模块 Bug,并提交代码。

AI 需要:


读取代码

↓

分析问题

↓

修改文件

↓

执行测试

↓

生成提交信息

↓

Git Commit

这不是一个 Tool 可以完成的。

而是:

多个 Tool 协同形成 Tool Chain。

本章进入高级阶段。


4.19 Tool 自动注册机制

前面:

我们手动:


server.setRequestHandler()

注册。

例如:


tools:[
 weatherTool,
 gitTool
]

问题:

几十个 Tool:

怎么办?


企业项目:

通常:

自动扫描。

结构:


tools/

weather/

 index.ts


git/

 index.ts


database/

 index.ts

启动时:

自动加载:


扫描目录

↓

发现Tool

↓

注册MCP

Tool Registry(工具注册中心)

设计:


class ToolRegistry{


private tools=[];



register(tool){

this.tools.push(tool);

}



list(){

return this.tools;

}


}

使用:


registry.register(
weatherTool
);


registry.register(
gitTool
);

MCP:

统一:


tools:list

↓

registry.list()

优势:

新增 Tool:

只增加文件。

不用修改:

Server。


4.20 Tool Factory 工厂模式

大型系统:

不要:

直接创建 Tool。

例如:


new WeatherTool()

推荐:

Factory。


结构:


ToolFactory

↓

根据配置

↓

创建Tool

例如:

配置:


{
"tools":[

"weather",

"github",

"database"

]
}

启动:


读取配置

↓

加载对应Tool

↓

注册

优势:

动态启停。

例如:

生产环境:

开启:


Git

Database

测试环境:

开启:


MockWeather

4.21 动态 Tool 加载

MCP 最大优势:

Server 可以:

动态暴露能力。

例如:

企业系统:

100个业务模块。

用户:

登录之后:

权限不同。


管理员:

看到:


createUser

deleteUser

manageRole

普通员工:

看到:


queryUser

流程:


User Login

↓

获取权限

↓

生成Tool列表

↓

返回tools/list

因此:

Tool:

不是固定的。

而是:

动态能力。


4.22 Tool Chain(工具链)

Agent 最核心能力:

不是调用一个 Tool。

而是:

多个 Tool 组合。


案例:

自动处理工单

用户:


帮我处理这个客户投诉

Agent:

步骤:


第一步:

查询客户。

调用:


searchCustomer

第二步:

查询订单。

调用:


getOrder

第三步:

分析问题。

调用:


analysisComplaint

第四步:

发送邮件。

调用:


sendEmail

最终:


用户

↓

Agent

↓

Tool1

↓

Tool2

↓

Tool3

↓

Tool4

↓

结果

4.23 Tool Chain 不应该写死

错误:


await searchCustomer();

await getOrder();

await sendEmail();

这是传统程序。

不是 Agent。


Agent 模式:

由 LLM 决定:


当前状态

↓

选择下一步Tool

↓

观察结果

↓

继续规划

这就是:

ReAct Agent。


4.24 ReAct 模式

ReAct:

Reason + Act。

即:

推理 + 行动。

流程:


Thought

↓

Action

↓

Observation

↓

Thought

↓

Action

↓

Answer

例如:

用户:


帮我找一下北京销量最高的商品

AI:

Thought:


需要查询商品数据

Action:


searchProduct

Observation:


销量数据

Thought:


需要排序

Action:


sortProduct

Answer:

返回结果。


MCP:

非常适合:

ReAct。


4.25 数据库 MCP Tool 实战设计

数据库:

是企业最常见 Tool。

例如:

自然语言:


查询本月订单金额

AI:

调用:


queryDatabase

设计:

不要:

直接暴露:


executeSQL

危险。


推荐:

业务化 Tool。

例如:

错误:


runSQL

正确:


getMonthlySales

为什么?

AI:

容易生成:

危险 SQL。


数据库 Tool

Schema:


{
"name":"getOrderStatistics",

"description":
"查询订单销售统计数据",

"inputSchema":{

"type":"object",

"properties":{

"month":{

"type":"string"

}

}

}

}

内部:

固定 SQL:


SELECT
sum(amount)

FROM orders

WHERE month=?

安全:

提升。


4.26 Git MCP Tool 实战

开发 Agent:

非常需要 Git。

常见 Tool:


gitStatus

gitDiff

gitCommit

gitBranch

gitLog

例如:

用户:


分析我的代码修改

流程:


gitDiff

↓

LLM分析

↓

返回建议

用户:


帮我提交代码

流程:


gitStatus

↓

gitCommit

注意:

Git Tool:

必须:

权限限制。

禁止:

AI:

随便:


rm -rf

4.27 文件系统 MCP Tool

文件 Tool:

非常常见。

例如:

代码 Agent:

需要:

读取:


src/main.ts

Tool:


readFile

writeFile

listDirectory

searchFile

但是:

安全:

非常重要。


必须限制:

Root目录。

例如:

允许:


/project

禁止:


/etc/passwd

代码:


function checkPath(path){


if(
!path.startsWith(
"/project"
)
){

throw Error(
"禁止访问"
);

}


}

4.28 浏览器 MCP Tool

Browser Agent:

需要:

网页操作。

常见:


openPage

click

input

screenshot

extractText

例如:

用户:


帮我查一下某商品价格

Agent:

调用:


openPage

↓

extractText

↓

analysis

典型:

Computer Use Agent。


4.29 Tool 返回中间状态

复杂任务:

不能:

一直等待。

例如:

AI:

执行:


扫描10000文件

需要:

进度。


使用:

Progress Notification。

例如:


{
"method":
"notifications/progress",

"params":{

"progress":500,

"total":10000

}

}

用户:

看到:


5%
50%

100%

体验接近传统软件。


4.30 Tool 并发执行

例如:

查询:

三个系统:


订单

库存

物流

互不依赖。

可以:

并行。


传统:


订单

↓

库存

↓

物流

耗时:

3秒。


并发:


订单

库存

物流

同时执行

耗时:

1秒。


代码:


await Promise.all([

getOrder(),

getStock(),

getDelivery()

]);

4.31 Tool 超时管理

任何外部 Tool:

必须:

设置:

Timeout。

例如:


const timeout =
5000;

超过:

返回:


{
"code":
"TIMEOUT",

"message":
"服务响应超时"
}

AI:

可以:

换方案。


4.32 Tool 缓存设计

很多查询:

重复。

例如:

天气:

用户连续问:


北京天气

不用:

每次调用 API。


架构:


Tool

↓

Cache

↓

API

例如:

Redis:

保存:


weather:beijing

TTL=10分钟

4.33 Tool 监控

企业必须知道:

AI:

调用了什么。

例如:

指标:


Tool调用次数

成功率

平均耗时

错误率

Token消耗

推荐:

接入:

OpenTelemetry。

链路:


User Request

↓

Agent Trace

↓

MCP Tool

↓

API

4.34 一个完整企业 Agent 架构

最终:


                 用户

                  |

                  v

             AI Agent

                  |

        +---------+---------+

        |                   |

    MCP Client          Memory

        |

        |

    MCP Server

        |

+-------+--------+

|       |        |

Tool  Resource Prompt

|

+----------------+

|

企业系统

|

CRM

ERP

Git

DB

API

第5章 MCP Resource 开发实战(上)

——从文件读取到企业知识库:打造 AI 可访问的数据资源层

前面章节我们重点学习了 MCP 的 Tool

Tool 解决的问题:

AI 如何执行动作?

例如:


查询天气

创建订单

提交代码

发送邮件

但是企业 AI Agent 还有一个巨大需求:

AI 如何读取企业已有的数据?

例如:

  • 产品文档
  • API 文档
  • 数据库数据
  • Git代码
  • PDF 文件
  • Wiki知识库
  • 用户手册
  • 业务规则

这些内容:

不是动作。

而是:

上下文资源(Context Resource)。

这就是 MCP Resource。


5.1 什么是 MCP Resource?

简单理解:

Resource:

就是:

MCP Server 暴露给 AI 的可读取数据。

例如:


AI

↓

MCP Resource

↓

企业数据

举例:

你的公司:

有:


docs/

├── payment.md

├── user.md

├── api.md

└── order.md

以前:

AI:

不知道。

现在:

MCP Resource:

暴露:


docs://payment

docs://user

docs://api

docs://order

AI:

可以读取。


5.2 Tool 和 Resource 的区别

这是很多新人最容易混淆的地方。


Tool

关键词:

做事情

例如:


发送邮件

创建订单

查询天气

执行代码

流程:


AI

↓

调用Tool

↓

产生动作

Resource

关键词:

提供信息

例如:


产品文档

用户协议

数据库记录

代码文件

流程:


AI

↓

读取Resource

↓

获得上下文

对比:

Tool Resource
作用 执行动作 提供数据
是否改变系统 可能改变 通常只读
调用方式 tools/call resources/read
示例 创建订单 读取订单规则

5.3 为什么 MCP 需要 Resource?

很多 AI 应用:

早期采用:

RAG。

架构:


用户

↓

Embedding

↓

Vector DB

↓

检索

↓

LLM

问题:

企业数据:

越来越复杂。

例如:


实时数据库

文件系统

代码仓库

API文档

业务系统

全部需要:

统一访问。


MCP Resource:

提供:

统一入口:


任何数据

↓

MCP Resource

↓

AI

5.4 Resource URI 设计

Resource:

通过 URI 标识。

类似:

URL。

例如:

文件:


file:///project/readme.md

数据库:


mysql://users/10001

文档:


docs://payment/api

代码:


git://repo/src/main.ts

推荐:

企业统一设计:

例如:


company://

├── docs/

├── database/

├── git/

├── knowledge/

5.5 第一个 Resource 示例

目标:

让 AI 读取:


README.md

目录:


project

├── src

│    index.ts

└── docs

     README.md

内容:

README.md


# 商品系统

支持:

- 商品管理
- 库存管理
- 订单管理

创建 Resource:


const resource = {


uri:

"docs://readme",


name:

"项目说明文档",


description:

"商品系统项目介绍"

};

5.6 注册 Resource

Server:

添加:


server.setRequestHandler(

"resources/list",

async()=>{


return {

resources:[

{

uri:"docs://readme",

name:"项目说明文档",

description:
"商品系统说明"

}

]

};


}

);

Client:

请求:


resources/list

返回:


{
"resources":[

{
"uri":"docs://readme"
}

]
}

AI:

知道:

存在这个资源。


5.7 读取 Resource

Client:

发送:


{
"method":

"resources/read",

"params":{

"uri":

"docs://readme"

}

}

Server:

读取:


server.setRequestHandler(

"resources/read",

async(request)=>{


return {

contents:[

{

uri:
"docs://readme",

mimeType:
"text/markdown",

text:

"# 商品系统..."

}

]

};


}

);

AI:

获得:

Markdown。


5.8 文件系统 Resource 实战

企业最常见:

文件资源。

例如:

代码 Agent。

需要:

读取:


src/UserService.java

设计:

Resource:


file://src/UserService.java

读取:


import fs from "fs/promises";


async function readFileResource(path){


return await fs.readFile(

path,

"utf-8"

);


}

但是:

这里有巨大安全问题。


5.9 文件 Resource 安全设计

不能:

允许:


file:///etc/passwd

否则:

AI:

可能读取:

服务器敏感文件。


必须:

限制:

Root目录。

例如:


/workspace

检查:


function checkPath(path:string){


if(
!path.startsWith(
"/workspace"
)
){

throw Error(
"非法路径"
);

}


}

企业必须:

做:

路径沙箱。


5.10 数据库 Resource

数据库也是 Resource。

例如:

用户信息。

URI:


mysql://user/10001

读取:

流程:


AI

↓

resources/read

↓

MCP Server

↓

Database

↓

返回JSON

例如:

返回:


{
"id":10001,

"name":"张三",

"level":"VIP"

}

注意:

数据库 Resource:

通常:

只读。


5.11 为什么数据库不要直接给 SQL Resource?

错误设计:


mysql://executeSQL

然后:

AI:

传:


DELETE FROM user

危险。


推荐:

业务资源。

例如:


customer://10001

order://88888

product://100

AI:

看到:

业务含义。


5.12 Git Resource

代码 Agent:

非常需要。

例如:

Resource:


git://repo/file/src/main.ts

读取:


git show HEAD:path

返回:

代码内容。


然后:

AI:

可以:

分析:


Bug

优化

重构

5.13 Resource + RAG 架构

MCP 和 RAG:

不是竞争。

而是结合。


传统:


用户

↓

Embedding

↓

Vector DB

↓

LLM

MCP:

升级:


用户

↓

AI Agent

↓

MCP Resource

↓

数据源

↓

Embedding/RAG

↓

LLM

例如:

企业知识库:


MCP Server

    |

    |

Knowledge Resource

    |

Vector DB

    |

Documents

5.14 动态 Resource

Resource:

不一定固定。

例如:

用户:

登录之后:

看到:

自己的数据。


流程:


User Login

↓

权限查询

↓

生成Resource列表

↓

resources/list

管理员:

看到:


company://all/users

普通员工:

看到:


company://my/profile

5.15 Resource 分页

企业数据:

可能:

百万级。

不能:

一次返回:

全部。


例如:

错误:


resources/list

返回100万个文件

推荐:

分页:


{
"cursor":

"page2"
}

类似:

数据库分页。


5.16 Resource 缓存

资源:

很多:

不会变化。

例如:

API文档。

可以缓存:


Resource

↓

Cache

↓

File/DB

例如:

Redis:


docs:api

TTL=1小时

5.17 Resource 权限控制

企业:

必须。

例如:

HR 文档:

普通员工不能看。


流程:


AI

↓

Resource请求

↓

权限检查

↓

允许

↓

读取

例如:


if(
!user.hasPermission(
"HR_READ"
)
){

throw Error(
"Forbidden"
)

}

5.18 Resource 和 Context Window

一个重要问题:

AI 上下文有限。

不能:

把:

100MB 文档:

全部塞进去。


正确:

流程:


Resource

↓

选择

↓

摘要

↓

相关片段

↓

LLM

这就是:

MCP + RAG。

第5章 MCP Resource 开发实战(下)

——构建企业级知识库 MCP Server:MCP + RAG + Vector Database 实战

上一节我们学习了:

  • Resource 基础概念
  • Tool 与 Resource 区别
  • 文件 Resource
  • 数据库 Resource
  • Git Resource
  • 权限控制

但是企业真正落地 AI Agent 时,最常见的场景是:

让 AI 理解公司的所有知识。

例如:

员工问:


退款流程是什么?

AI 自动:


查询知识库

↓

找到退款规则

↓

结合上下文回答

这就是:

企业知识库 Agent。


5.20 企业知识库为什么需要 MCP?

传统知识库:

架构:


用户

↓

搜索系统

↓

关键词匹配

↓

返回文档

问题:

理解能力弱。

例如:

用户:


客户取消订单后多久退款?

文档:


订单关闭后的资金原路退回周期

关键词:

完全不同。


RAG:

解决:


用户问题

↓

Embedding

↓

向量搜索

↓

相关文档

↓

LLM

但是:

企业数据来源很多:


Confluence

Git

数据库

PDF

Word

内部系统

OSS

如何统一?

答案:

MCP Resource。


5.21 MCP + RAG 总体架构

完整架构:


                 用户

                  |

                  v

             AI Agent

                  |

             MCP Client

                  |

          MCP Knowledge Server

                  |

      +-----------+------------+

      |                        |

 Resource                 Tool


      |

      |

  Knowledge Layer


      |

+-----+------+


文件

数据库

Git

Wiki


      |

      |

 Embedding


      |

 Vector Database


      |

 文档片段

5.22 知识库 Resource 设计

假设:

公司:

支付系统。

文档:


payment/

├── refund.md

├── payment_api.md

├── error_code.md

└── settlement.md

设计 URI:


knowledge://payment/refund

例如:


knowledge://payment/api

knowledge://payment/error

为什么不用:


file:///xxx/refund.md

因为:

业务语义更强。

AI:

更容易理解。


5.23 Markdown Resource 实现

创建:


resources/documentResource.ts

代码:


import fs from "fs/promises";


export async function readDocument(
path:string
){

const content =
await fs.readFile(
path,
"utf-8"
);


return {

uri:
`knowledge://${path}`,

mimeType:
"text/markdown",

text:
content

};

}

注册:


server.setRequestHandler(

"resources/read",

async(req)=>{


if(
req.params.uri
==="knowledge://payment/refund"
){


return {

contents:[

await readDocument(
"./docs/refund.md"
)

]

};

}


}

);

现在:

AI:

可以读取:


退款规则文档

5.24 PDF Resource 实现

企业文档:

大量 PDF。

例如:


产品手册.pdf

合同模板.pdf

技术规范.pdf

流程:


PDF

↓

文本提取

↓

Resource

↓

AI

Node:

常用:


pdf-parse

安装:


npm install pdf-parse

代码:


import pdf from "pdf-parse";


async function readPDF(
file
){

const buffer =
await fs.readFile(file);


const data =
await pdf(buffer);


return {

mimeType:
"text/plain",

text:
data.text

};


}

AI:

读取:

PDF内容。


5.25 Word 文档 Resource

企业:

大量:


.docx

流程:


docx

↓

文本

↓

Resource

使用:


mammoth

代码:


import mammoth
from "mammoth";


const result =
await mammoth.extractRawText({

path:"contract.docx"

});


return result.value;

5.26 Excel Resource

企业:

大量:


销售报表.xlsx

库存表.xlsx

财务表.xlsx

不要:

直接返回:

Excel。


转换:


Excel

↓

JSON

↓

Resource

例如:

原表:

商品 销量
手机 100

转换:


{
"product":"手机",
"sales":100
}

AI:

更容易理解。


5.27 数据库 Resource 实战

例如:

订单数据库。

表:


orders

字段:


id

amount

status

create_time

Resource:

设计:


order://88888

读取:


async function getOrder(id){

return await db.query(

`
SELECT *
FROM orders
WHERE id=?
`

,[id]

);

}

返回:


{
"id":88888,
"amount":199,
"status":"paid"
}

5.28 Elasticsearch Resource

企业搜索:

经常使用:


Elasticsearch

架构:


MCP Resource

↓

ES

↓

全文搜索

↓

返回文档

例如:

用户:


查询支付失败原因

Resource:

调用:


search:

payment failed

返回:

相关文档。


5.29 Vector Database Resource

真正 RAG:

核心:

向量数据库。

常见:


Milvus

Qdrant

Chroma

Pinecone

Weaviate

流程:


用户问题

↓

Embedding

↓

Vector Search

↓

Top K 文档

↓

Resource

↓

LLM

例如:

问题:


退款多久到账?

Embedding:

找到:


refund.md

5.30 文档切片 Chunk

大文档:

不能:

一次 Embedding。

例如:

100页 PDF。


需要:

切片。

例如:


文档

↓

Chunk

↓

Embedding

常见:

chunk size:


500~1000 tokens

例如:

原文:


退款规则全文

切:


chunk1:

退款申请流程


chunk2:

退款到账时间


chunk3:

异常处理

5.31 Metadata 设计

每个 Chunk:

保存:

元数据。

例如:


{
"text":
"退款到账时间",

"source":
"refund.md",

"department":
"finance",

"version":
"2026"
}

为什么?

过滤。

例如:

用户:

财务部门。

只搜索:


department=finance

5.32 MCP Resource + RAG 查询流程

完整:


用户:

退款多久到账?

↓

AI Agent

↓

判断需要知识

↓

调用 Resource

↓

knowledge://refund

↓

Vector Search

↓

找到相关Chunk

↓

LLM总结

↓

回答

5.33 企业知识库权限

这是重点。

企业不能:

所有人:

看到所有文档。


例如:

HR:


薪资制度

普通员工:

不能。


权限模型:


User

↓

Role

↓

Permission

↓

Resource

例如:

Resource:


hr://salary

检查:


if(
!user.hasRole(
"HR"
)
){

deny();

}

5.34 多租户知识库

SaaS 场景:

非常重要。

例如:

公司A:


company_a://docs

公司B:


company_b://docs

Vector:

必须隔离:


tenant_id

例如:

Metadata:


{
"tenant":"company_a"
}

查询:

自动过滤。


5.35 Resource 缓存策略

文档:

不会频繁变化。

可以缓存。


架构:


Resource

↓

Redis

↓

Storage

例如:


payment_api.md

缓存:

1小时

5.36 Resource 更新通知

企业文档:

会变化。

例如:

产品规则更新。

需要通知 AI。


流程:


文档更新

↓

MCP Server

↓

Resource Changed

↓

Client刷新

例如:


notifications/resources/list_changed

5.37 MCP Resource 与 Memory

很多 Agent:

还有 Memory。

区别:

Resource:


企业知识

Memory:


用户历史

例如:

Resource:


公司退款规则

Memory:


用户喜欢中文回答

完整 Agent:


Context

=

Resource

+

Memory

+

Tool Result

+
Prompt

5.38 企业知识助手案例

最终效果:

用户:


我们公司的退款政策是什么?

Agent:

执行:


1. 查询知识库

2. 找退款文档

3. 获取最新版本

4. 总结回答

返回:


根据2026年退款政策:

普通订单:
3-7个工作日

信用卡:
7-15个工作日

第6章 MCP Prompt 开发实战(上)

——让 AI Agent 拥有企业级工作模板能力

前面章节,我们已经掌握 MCP 的两个核心能力:

Tool

解决:

AI 能不能执行任务?

例如:


创建订单

发送邮件

执行代码

查询数据库

Resource

解决:

AI 能不能获取知识?

例如:


产品文档

业务规则

数据库记录

代码文件

但是企业 Agent 还有一个问题:

AI 每次执行任务,都需要重新理解流程吗?

例如:

代码审查:

每次告诉 AI:


请检查代码质量
请检查安全问题
请检查性能问题
请给优化建议

非常浪费。


于是 MCP 提供第三种能力:

Prompt

它解决:

给 AI 提供标准化任务模板。


6.1 MCP 三大核心能力关系

完整 MCP:


             MCP

              |

+-------------+--------------+

|             |              |

Tool       Resource       Prompt


执行动作      提供数据       指导行为

举例:

开发 Agent:

用户:


帮我优化这段代码

Agent:

需要:

Resource:

读取代码:


git://src/UserService.ts

Tool:

执行测试:


runTest()

Prompt:

告诉 AI:


按照代码审查规范分析:

1. 性能

2. 安全

3. 可维护性

4. 最佳实践

三者组合:

形成完整 Agent。


6.2 什么是 MCP Prompt?

简单理解:

Prompt:

就是:

MCP Server 提供给 AI 的可复用提示模板。


例如:

定义:


code-review

内容:


你是一名高级代码审查工程师。

请检查:

1. Bug

2. 性能

3. 安全

4. 架构问题

输出详细报告。

AI:

调用:


prompts/get

获得模板。


6.3 Prompt 与普通 Prompt 区别

普通开发:

Prompt 写死:


const prompt=

"你是客服机器人"

问题:

不可管理。


MCP Prompt:

变成:

资源化能力:


MCP Server

↓

Prompt Repository

↓

AI Client

优势:

  • 统一管理
  • 动态更新
  • 权限控制
  • 版本管理
  • 企业复用

6.4 第一个 MCP Prompt

目标:

创建:

代码审查 Prompt。


目录:


src

├── prompts

│    └── codeReviewPrompt.ts

└── index.ts

创建:


export const codeReviewPrompt = {


name:

"code-review",


description:

"用于代码质量审查的专业分析模板",



arguments:[

{

name:"language",

description:

"代码语言",

required:true

}

]


};

这里:

定义:

Prompt 名称。


6.5 注册 Prompt

Server:

添加:


server.setRequestHandler(

"prompts/list",

async()=>{


return {


prompts:[

codeReviewPrompt

]


};


}

);

Client:

请求:


{
"method":

"prompts/list"
}

返回:


{
"prompts":[

{

"name":
"code-review"

}

]
}

AI:

知道:

存在这个模板。


6.6 获取 Prompt 内容

定义:


server.setRequestHandler(

"prompts/get",

async(request)=>{


if(

request.params.name
==="code-review"

){


return {


messages:[

{

role:"user",

content:{


type:"text",

text:

`
你是一名高级软件工程师。

请审查${request.params.arguments.language}代码。

关注:

1.Bug

2.安全

3.性能

4.可维护性

`

}

}

]

};


}


}

);

调用:

参数:


{
"name":
"code-review",

"arguments":{

"language":"TypeScript"

}
}

返回:

完整 Prompt。


6.7 参数化 Prompt

企业场景:

不能写死。

例如:

客服 Prompt。

错误:


你是客服。

正确:

参数:


行业

产品

语气

用户类型

定义:


arguments:[

{
name:"industry",
required:true
},

{
name:"tone",
required:true
}

]

调用:


{
"industry":"电商",

"tone":"专业友好"
}

生成:


你是一名电商客服。

回答风格:

专业友好。

6.8 企业 Prompt 模板库

大型企业:

通常:

建立:

Prompt Center。

结构:


prompts

├── customer-service

│      v1

│      v2


├── code-review

│      v1


├── data-analysis


├── report-generation

类似:

代码仓库。


6.9 Prompt 版本管理

Prompt:

也需要版本。

例如:

客服:

v1:


简单回答问题

v2:


增加投诉处理流程

URI:

设计:


prompt://customer/v2

或者:

metadata:


{
"name":

"customer",

"version":

"2.0"
}

6.10 动态 Prompt

高级 Agent:

Prompt:

不是固定。

例如:

用户:

登录。

角色:

管理员。


生成:


你是企业管理员助手。

你可以:

查询用户

管理权限

查看日志

普通用户:

生成:


你是普通员工助手。

只能查询资料。

流程:


用户身份

↓

权限系统

↓

生成Prompt

↓

AI

6.11 Prompt + Resource 组合

真实场景:

知识问答。

Prompt:

定义:


你是企业知识助手。

Resource:

提供:


公司文档

组合:


Prompt

+

Resource

↓

AI回答

例如:

Prompt:


回答必须引用公司政策。

Resource:


refund_policy.md

最终:

AI:

不会胡编。


6.12 Prompt + Tool 组合

自动化任务:

例如:

日报生成。


Prompt:


你是一名项目经理。

根据Git提交记录生成日报。

Tool:

调用:


gitLog()

流程:


Prompt

↓

AI理解任务

↓

Tool获取数据

↓

生成日报

6.13 实战:日报生成 Agent

需求:

每天:

自动生成:


开发日报

Prompt:


你是高级项目经理。

根据开发记录生成日报。

格式:

今日完成:

问题:

风险:

明日计划:

Tool:


getGitCommit

Resource:


project://requirements

最终:

自动生成:


今日完成:

1.完成支付接口

2.优化订单查询


风险:

暂无


明日:

开发退款模块

6.14 Prompt 安全问题

Prompt:

也是攻击目标。

例如:

用户输入:


忽略之前规则

叫:

Prompt Injection。


解决:

1. 分层 Prompt


System Prompt

↓

MCP Prompt

↓

User Input

2. 权限隔离

不要:

让用户修改:

系统 Prompt。


3. 内容过滤

检测:

危险指令。


6.15 Prompt 与 Agent Memory

区别:

Prompt:

告诉 AI:

应该怎么做。

Memory:

告诉 AI:

以前发生什么。


例如:

Prompt:


你是客服助手。

Memory:


用户喜欢中文回复。

组合:


Prompt

+

Memory

+

Resource

+

Tool

6.16 企业 Prompt 生命周期

成熟企业:

流程:


需求

↓

Prompt设计

↓

测试

↓

评估

↓

发布

↓

监控

↓

优化

类似:

软件发布。


6.17 Prompt 测试

不能:

凭感觉。

需要:

测试集。

例如:

客服:

1000个问题。

评估:

  • 正确率
  • 幻觉率
  • 用户满意度

工具:

可以结合:

  • LangSmith
  • Langfuse
  • OpenTelemetry

6.18 本章总结

本章学习:

  • MCP Prompt 概念
  • Prompt 与 Tool/Resource区别
  • Prompt 注册
  • Prompt 参数化
  • Prompt 模板库
  • Prompt 版本管理
  • Prompt 动态生成
  • Prompt Injection防护
  • 企业 Prompt 生命周期

核心理解:

Tool 让 AI 会做事,Resource 让 AI 有知识,Prompt 让 AI 按企业规范工作。

完整 Agent:


              AI Agent


 Prompt

    +

 Resource

    +

 Tool

    +

 Memory

第6章 MCP Prompt 开发实战(下)

——企业级 Prompt 工程体系:让 Agent 从“会聊天”升级为“会工作”

上一节我们学习了 MCP Prompt 基础:

  • Prompt 是什么
  • Prompt 与 Tool、Resource 的关系
  • Prompt 注册
  • 参数化 Prompt
  • Prompt 版本管理
  • Prompt 安全

但是企业真正部署 Agent 时,会遇到更复杂的问题:

例如:

一个客服 Agent:

需要:


普通咨询 → 客服角色

投诉问题 → 安抚专家角色

退款问题 → 财务规则角色

技术问题 → 技术支持角色

一个 Prompt:

无法满足。

所以企业需要:

Prompt 工程体系。


6.19 企业为什么需要 Prompt 工程?

很多团队初期:

直接:


system prompt:

你是一个AI助手。

然后:

不断追加:


不要骗人。

回答详细一点。

注意安全。

遵守规则。

最后:

Prompt:

几千行。


问题:

1. 无法维护

没人知道:

哪句话影响效果。


2. 无法测试

修改一句:

不知道:

效果提升还是下降。


3. 无法复用

客服团队:

一套。

销售团队:

一套。

开发团队:

一套。


因此:

需要:

Prompt Engineering。


6.20 企业 Prompt 分层架构

推荐:

五层模型:


                Agent Prompt


              Role Layer

                  |

              Rule Layer

                  |

             Knowledge Layer

                  |

              Tool Layer

                  |

             Output Layer

第一层:Role(角色)

定义:

AI是谁。

例如:


你是一名资深Java架构师。

第二层:Rule(规则)

定义:

行为约束。

例如:


不要编造不存在的信息。

发现不确定时明确说明。

第三层:Knowledge(知识)

来自:

Resource。

例如:


公司退款政策。

第四层:Tool

定义:

可使用能力。

例如:


查询订单。

发送邮件。

第五层:Output

输出格式。

例如:


{
"summary":"",
"solution":""
}

6.21 Prompt Factory 设计

企业:

不应该:

到处写字符串。

例如:

错误:


const prompt =
"你是客服..."

应该:

创建:

Prompt Factory。

结构:


prompt

├── factory

│    PromptFactory.ts


├── templates

│    customer.ts

│    developer.ts

│    analyst.ts

6.22 Prompt 模板

例如:


export const customerPrompt = {

role:

"你是一名专业客服",


rules:[

"保持友好",

"不要承诺无法完成的事情"

],


output:

"使用Markdown格式"

};


Factory:


class PromptFactory{


create(type){

switch(type){


case "customer":

return customerPrompt;


case "developer":

return developerPrompt;


}


}


}

调用:


factory.create(
"customer"
);

6.23 Prompt 模板变量

企业:

大量动态信息。

例如:

客服:

需要:


用户姓名

会员等级

订单状态

模板:


你是客服助手。

用户:

{{username}}

会员等级:

{{level}}

运行:

输入:


{
"username":"张三",

"level":"VIP"
}

生成:


你是客服助手。

用户:

张三

会员等级:

VIP

6.24 Prompt Template Engine

类似:

前端模板。

例如:

使用:

Handlebars。


模板:


你好 {{name}}

你的订单:

{{orderId}}

渲染:


template.render({

name:"李四",

orderId:"8888"

});

输出:


你好 李四

你的订单:

8888

6.25 多角色 Agent Prompt

企业复杂任务:

通常:

不是一个 Agent。

而是:

多个角色。


例如:

软件开发 Agent。

包含:

Planner

规划。


Prompt:


你是项目规划专家。

负责拆解任务。

Coder

编码。


Prompt:


你是高级开发工程师。

负责实现代码。

Reviewer

审查。


Prompt:


你是代码审查专家。

寻找问题。

架构:


              User


               |

          Planner Agent


               |

        +------+------+

        |             |

     Coder       Reviewer

6.26 Planner Prompt 设计

Planner:

不能直接写代码。

职责:

拆任务。


Prompt:


你是任务规划Agent。

你的职责:

1.分析需求

2.拆分步骤

3.选择工具

4.制定执行计划


不要直接执行。

输出:


{
"steps":[

"查询用户信息",

"检查订单",

"生成方案"

]
}

6.27 Executor Prompt

Executor:

执行。


Prompt:


你是执行Agent。

根据计划调用工具。

每一步必须确认结果。

调用:


Tool

↓

Observation

↓

Next Step

6.28 Reviewer Prompt

Reviewer:

负责质量。


例如:

代码:


检查:

安全漏洞

性能问题

代码规范

测试覆盖

输出:


{
"issues":[

{
"type":"security",

"level":"high"

}

]
}

6.29 Prompt Chain

多个 Prompt:

串联。

例如:

文章生成:


主题

↓

Research Prompt

↓

Writer Prompt

↓

Editor Prompt

↓

SEO Prompt

每一步:

不同角色。


6.30 Prompt A/B 测试

企业优化:

不能靠感觉。


例如:

客服 Prompt:

版本A:


简短回答。

版本B:


详细解释。

比较:

指标:


用户满意度

解决率

平均响应时间

最终:

选择:

效果更好的版本。


6.31 Prompt 评估体系

推荐指标:

准确率

回答是否正确。


幻觉率

是否编造。


完成率

任务是否完成。


成本

Token消耗。


延迟

响应时间。


6.32 Prompt 自动优化

高级:

让 AI 优化 Prompt。

流程:


旧Prompt

↓

测试集

↓

分析失败案例

↓

生成优化Prompt

↓

人工审核

↓

上线

类似:

代码持续优化。


6.33 Prompt 管理平台设计

企业:

可以建立:

Prompt Hub。

架构:


             Web UI


              |

        Prompt Service


              |

        Database


              |

       MCP Prompt Server

功能:

  • 创建 Prompt
  • 编辑
  • 发布
  • 回滚
  • 测试
  • 统计

数据库:

例如:

prompt表:


CREATE TABLE prompt(

id bigint,

name varchar(100),

version varchar(20),

content text,

status varchar(20)

);

6.34 Prompt 权限管理

不是所有人:

可以修改。

例如:

开发:

可以测试。

产品:

可以编辑。

管理员:

可以发布。


权限:


User

↓

Role

↓

Permission

↓

Prompt

6.35 Prompt 与 MCP 集成

最终:

MCP Server:

提供:


prompts/list

返回:


[
{
"name":
"code-review"
},

{
"name":
"customer-service"
}
]

AI Client:

动态获取。


6.36 企业 Agent 完整架构

最终:



                    用户


                     |

                 AI Agent


                     |

        +------------+------------+

        |            |            |

      Prompt      Resource      Tool


        |            |            |


   角色规范       企业知识       系统能力


                     |

              Enterprise System

第7章 MCP Client 开发实战(上)

——自己实现一个 AI Agent 客户端:从协议连接到智能调用

前面章节,我们一直在开发:

  • MCP Server
  • Tool
  • Resource
  • Prompt

但是有一个关键角色还没有深入:

谁来连接 MCP Server?

答案:

MCP Client。


很多人理解 MCP:

认为:


AI模型

↓

MCP Server

实际上:

中间还有:


AI Agent Runtime

也就是:

MCP Client。


7.1 MCP 完整通信架构

完整链路:


                 用户

                  |

                  v

             AI Agent


                  |

                  v

             MCP Client


                  |

                  v

             MCP Server


        +---------+---------+

        |         |         |

      Tool    Resource   Prompt


                  |

                  v

          企业业务系统

角色说明:

组件 职责
LLM 理解需求、规划
MCP Client 连接管理、协议调用
MCP Server 提供能力
Tool 执行动作
Resource 提供数据
Prompt 提供模板

7.2 MCP Client 是什么?

简单理解:

MCP Client:

就是:

一个懂 MCP 协议的 AI Agent 运行环境。

它负责:

  1. 连接 Server
  2. 获取能力
  3. 调用 Tool
  4. 读取 Resource
  5. 获取 Prompt
  6. 管理上下文

类似:

浏览器:

访问:

HTTP Server。


MCP Client:

访问:

MCP Server。


7.3 为什么要自己实现 MCP Client?

现有客户端:

例如:

  • Claude Desktop
  • Cursor
  • VS Code Agent

已经支持 MCP。

但是企业经常需要:

自己的 Agent 平台。

例如:

客服机器人:


用户

↓

企业Agent

↓

MCP Client

↓

CRM MCP Server

↓

CRM系统

所以:

需要:

自己实现 Runtime。


7.4 MCP Client 项目结构

创建:


mcp-agent-client

src

├── index.ts


├── client

│     └── mcpClient.ts


├── llm

│     └── agent.ts


├── tools

│     └── toolManager.ts


├── memory

│     └── memory.ts


└── config

      └── server.json

架构:


Agent

 |

MCP Client

 |

MCP Server

7.5 创建 MCP Client

安装 SDK:


npm install @modelcontextprotocol/sdk

创建:


src/client/mcpClient.ts

代码:


import {
Client
}
from "@modelcontextprotocol/sdk/client/index.js";


export class MCPClient{


client:Client;


constructor(){


this.client =
new Client(

{

name:"my-agent",

version:"1.0.0"

}

);


}



}

现在:

拥有:

一个 MCP Client。


7.6 连接 MCP Server

MCP 支持多种 Transport:

常见:

stdio

本地进程:


Client

↓

启动Server进程

HTTP/SSE

远程:


Client

↓

Network

↓

Server

本章:

使用:

stdio。


代码:


import {

StdioClientTransport

}

from "@modelcontextprotocol/sdk/client/stdio.js";



async connect(){


const transport =

new StdioClientTransport({

command:"node",

args:[

"../weather-server/index.js"

]

});


await this.client.connect(
transport
);


}

连接:

成功。


7.7 MCP 初始化流程

连接后:

第一步:

initialize。


流程:


Client

    initialize

        ↓


Server

    返回能力


Client

    保存能力

例如:

Client发送:


{
"method":"initialize",

"params":{

"clientInfo":{

"name":"my-agent"

}

}

}

Server:

返回:


{
"serverInfo":{

"name":"weather-mcp"

},

"capabilities":{

"tools":{}

}

}

这一步:

类似:

HTTP握手。


7.8 获取 Tool 列表

连接后:

Client:

调用:


tools/list

代码:


async listTools(){


const result =

await this.client.listTools();



return result.tools;


}

返回:

例如:


[
{

"name":

"getWeather",

"description":

"查询天气"

}

]

现在:

Agent:

知道:

有什么能力。


7.9 获取 Resource 列表

同理:


async listResources(){


return await this.client.listResources();


}

返回:


[
{

"uri":

"docs://payment"

}

]

7.10 获取 Prompt 列表

调用:


listPrompts()

返回:


[
{

"name":

"code-review"

}

]

现在:

Client:

拥有:

完整能力地图。


7.11 Agent Runtime 核心循环

真正 Agent:

不是:

一次调用。

而是:

循环。


核心:


用户问题

↓

LLM分析

↓

需要Tool?

↓

调用MCP

↓

获得结果

↓

继续思考

↓

最终回答

这叫:

Agent Loop。


7.12 实现 Agent Loop

伪代码:


while(true){


response =

llm.chat(messages);



if(response.toolCall){


result =

mcp.callTool(

response.tool


);


messages.push(result);



continue;


}



return response.text;


}

这就是:

ChatGPT Agent 工作方式。


7.13 Tool 自动发现

传统:

写死:


if(tool==="weather")

不好。


企业:

动态:

启动:


连接Server

↓

tools/list

↓

注册Tool

↓

提供给LLM

例如:

获得:


[
{

name:"getWeather"

},

{

name:"searchCustomer"

}

]

转换:

LLM Function Calling 格式。


7.14 MCP Tool 转 OpenAI Function

很多模型:

使用:

Function Calling。

例如:

OpenAI格式:


{
"name":

"getWeather",

"parameters":{

"type":"object"

}

}

MCP:

转换:


MCP Tool Schema

↓

LLM Function Schema

这样:

任何支持 Function Calling 的模型:

都可以使用 MCP。


7.15 Tool 调用流程

完整:

用户:


北京天气

LLM:

返回:


{
"tool":

"getWeather",

"arguments":{

"city":"北京"

}

}

Client:

调用:


MCP tools/call

Server:

返回:


{
"temperature":

32
}

Client:

追加:


Tool Result

再次请求:

LLM。


最终:

回答。


7.16 多 MCP Server 管理

企业:

通常:

不是一个 Server。

例如:


Agent

 |

 +----------------+

 |

天气MCP

 |

CRM MCP

 |

Git MCP

 |

数据库MCP

Client:

需要:

Server Manager。


结构:


servers

├── weather

├── crm

├── git

└── database

配置:


{
"servers":[

{

"name":"crm",

"command":"node crm.js"

},

{

"name":"git",

"command":"node git.js"

}

]

}

启动:

自动连接。


7.17 MCP Client 状态管理

需要保存:


连接状态

能力列表

Tool缓存

Resource缓存

Session信息

例如:


class ServerSession{


serverName:string;


tools=[];


resources=[];


status:"connected";


}

7.18 MCP Client 错误处理

常见:

Server关闭

处理:

自动重连。


Tool失败

返回:

错误上下文。


网络超时

切换备用Server。


类似:

微服务治理。


7.19 MCP Client 安全

Client:

也需要安全。

例如:

不要允许:

任意 MCP Server。


需要:

Server 白名单:


{
"allowed":[

"company-crm",

"company-git"

]

}

7.20 本章总结

本章完成:

✅ MCP Client 原理

✅ Client 创建

✅ Server连接

✅ initialize流程

✅ Tool发现

✅ Resource发现

✅ Prompt发现

✅ Agent Loop

✅ Function Calling转换

✅ 多Server管理


核心理解:

MCP Server 提供能力,MCP Client 负责把这些能力变成 AI 可以使用的行动。

完整链路:


User

↓

LLM

↓

MCP Client

↓

MCP Server

↓

Tool / Resource / Prompt

↓

Enterprise System

第7章 MCP Client 开发实战(下)

——打造类似 Cursor 的企业级 Agent Runtime

上一节我们完成了:

  • MCP Client 创建
  • Server 连接
  • initialize 握手
  • Tool/Resource/Prompt 发现
  • Agent Loop 基础流程

但是:

真正的 AI Agent 平台还需要:

  • 自动规划
  • 多工具调度
  • 上下文管理
  • 记忆系统
  • 长任务执行
  • 人工确认
  • 任务恢复

这一章开始:

我们实现一个接近 Cursor / Claude Agent 的 Runtime。


7.21 什么是 Agent Runtime?

很多人认为:

Agent = 大模型。

这是错误的。

LLM:

只是“大脑”。

完整 Agent:

实际上:


 id="m3x0z1"
                 Agent Runtime


        +---------------------+

        |                     |

      Planner              Executor


        |                     |

        +----------+----------+

                   |

             MCP Client


                   |

             MCP Server


                   |

          Tools / Resources

Runtime 负责:

  • 调度模型
  • 管理状态
  • 调用工具
  • 保存上下文
  • 控制流程

7.22 Agent Runtime 核心模块

企业级:

通常:

包含:


src

├── agent

│    ├── planner.ts

│    ├── executor.ts

│    └── loop.ts


├── context

│    └── contextManager.ts


├── memory

│    └── memoryStore.ts


├── mcp

│    └── mcpClient.ts


└── tools

     └── toolRegistry.ts

7.23 Planner Agent

Planner:

负责:

思考:

下一步做什么。


例如:

用户:


帮我分析订单异常原因

Planner:

生成:


{
"steps":[

"查询订单",

"检查支付状态",

"查询日志",

"生成分析报告"

]
}

Planner 不执行。

只规划。


代码:


class Planner{


async plan(task:string){


return {


steps:[

"collect_data",

"analysis",

"report"

]


};


}


}

7.24 Executor Agent

Executor:

负责:

执行计划。


流程:


Planner

↓

Step1

↓

Tool

↓

Result

↓

Step2

↓

Tool

↓

Result

代码:


class Executor{


async execute(plan){


for(
const step of plan.steps
){


await this.runStep(step);


}


}


}

7.25 Agent Loop 完整实现

核心:


async function runAgent(
input
){


while(true){


const response =
await llm.chat(
messages
);



if(response.finish){


return response.text;

}



if(response.toolCall){


const result =

await mcp.callTool(

response.toolCall.name,

response.toolCall.args

);



messages.push({

role:"tool",

content:
result

});


}


}


}

这就是:

现代 Agent 核心。


7.26 Tool 自动选择

传统:

代码决定:


if(weather)
调用天气

Agent:

让模型决定。


流程:

启动:

获取:


tools/list

得到:


[
{
"name":
"getWeather"
},

{
"name":
"searchCustomer"
}
]

转换:

给 LLM:


{
"functions":[

{
"name":
"getWeather"
}

]

}

模型:

自主选择。


7.27 多 Tool 冲突解决

问题:

例如:

有:


searchCustomer

searchUser

findCustomer

AI:

可能混乱。


解决:

增加:

Tool Router。


架构:


User

↓

Router Agent

↓

选择领域

↓

CRM Agent

↓

Tool

例如:

问题:


查询客户资料

Router:

判断:


{
"domain":"CRM"
}

进入:

CRM Agent。


7.28 MCP Server 动态发现

大型企业:

Server 很多。

不能:

全部配置。


可以:

建立:

MCP Registry。


结构:


MCP Registry

|

+-- CRM Server

+-- Git Server

+-- Database Server

+-- Knowledge Server

Client:

启动:

查询:


有哪些 MCP Server?

返回:


[
{
"name":"crm",

"url":"xxx"
}
]

动态连接。


7.29 Session 管理

MCP Client:

需要管理会话。

例如:

用户:

连续聊天。


Session:

保存:


{
id:"abc123",

userId:"10001",

messages:[],

tools:[],

memory:[]
}

生命周期:


创建Session

↓

用户交互

↓

保存状态

↓

结束

7.30 Context Manager

Agent 最大问题:

上下文爆炸。

例如:

聊天100轮。

全部发送:

成本巨大。


需要:

Context Manager。


功能:

压缩历史

例如:

旧消息:


50轮聊天

总结:


用户目标:

开发支付模块。

当前状态:

接口已完成。

保留关键内容

保留:

  • 当前任务
  • Tool结果
  • 用户偏好

7.31 Memory 系统设计

Agent Memory:

分:

Short Memory

短期。

当前会话。

例如:


正在开发订单模块

Long Memory

长期。

用户习惯。

例如:


用户喜欢Java代码示例

架构:


Memory

 |

 +-------------+

 |

Redis       Vector DB

7.32 Memory + MCP Resource

结合:

例如:

用户:


继续之前的项目

Agent:

查询:

Memory:


之前开发商城系统

Resource:


项目代码

Tool:


Git操作

形成:

连续工作能力。


7.33 长任务执行

企业任务:

可能:

几小时。

例如:

自动迁移数据库。


不能:

一个请求完成。


需要:

Task Manager。


架构:


User

↓

Task Queue

↓

Agent Worker

↓

MCP Tool

↓

Result

类似:

后台任务系统。


7.34 Task 状态机

任务:

不要:

简单:

成功/失败。


设计:


CREATED

↓

PLANNING

↓

RUNNING

↓

WAITING_CONFIRM

↓

COMPLETED

例如:

删除数据库:

进入:


WAITING_CONFIRM

等待用户。


7.35 Human-in-the-loop

企业非常重要。

AI:

不能:

完全自主。


危险操作:

例如:


删除数据

发布代码

付款

需要:

人工确认。


流程:


AI

↓

生成计划

↓

请求确认

↓

用户批准

↓

执行

例如:

AI:


准备删除1000条测试数据。

是否继续?

7.36 Agent Observability

生产环境:

必须知道:

AI 做了什么。


记录:


Trace:

用户输入

↓

Prompt

↓

LLM响应

↓

Tool调用

↓

Tool结果

↓

最终输出

类似:

分布式链路追踪。


推荐:

OpenTelemetry。


7.37 Agent Cost Control

企业:

必须控制成本。


指标:


Token

调用次数

响应时间

模型费用

策略:

模型路由

简单任务:

小模型。

复杂任务:

大模型。


例如:


分类

↓

小模型

代码分析

↓

大模型

7.38 Agent 安全边界

必须限制:

Tool 权限

例如:

AI:

不能:

生产删除。


Resource 权限

例如:

AI:

不能:

读取工资文件。


Prompt 防护

防止:

Prompt Injection。


7.39 一个完整企业 Agent Runtime

最终:


                         User


                          |

                          v


                    Agent Runtime


        +---------------+---------------+

        |                               |

    Planner                         Memory


        |                               |

        +---------------+---------------+

                        |

                  MCP Client


                        |

        +---------------+---------------+

        |               |               |

     CRM MCP        Git MCP       Knowledge MCP


        |               |               |

      CRM             Git             RAG

第8章 MCP 企业实战项目(上)

——从零搭建一个完整 AI Agent 助手平台

前面 7 章,我们已经掌握:

  • MCP Server
  • Tool
  • Resource
  • Prompt
  • MCP Client
  • Agent Runtime

现在进入真正项目阶段:

从 0 搭建一个企业级 AI Agent 平台。

目标:

打造一个类似:

  • Cursor
  • Claude Desktop
  • 企业 Copilot

的智能助手系统。


8.1 项目目标

我们实现:

一个企业 AI 助手:

名字:


Enterprise Agent

能力:

1. 企业知识问答

例如:

用户:


公司的退款规则是什么?

AI:

自动查询:

  • 产品文档
  • 业务规则
  • PDF资料

2. CRM 客户管理

用户:


查询客户张三的信息

AI:

调用:

CRM MCP Server。


3. Git 代码助手

用户:


帮我分析最近提交的问题

AI:

调用:

Git MCP Server。


4. 数据分析助手

用户:


统计本月销售额

AI:

查询数据库。


最终架构:


                         用户


                          |

                          v


                   Enterprise Agent


                          |

              +-----------+-----------+

              |                       |

          Agent Runtime          Memory


              |

          MCP Client


              |

 +------------+------------+-------------+

 |            |            |             |

CRM MCP    Git MCP    DB MCP     Knowledge MCP


 |            |            |             |

CRM        Git仓库     数据库       RAG知识库

8.2 技术选型

后端:


Node.js

TypeScript

MCP SDK

AI:

支持:

  • GPT
  • Claude
  • Gemini
  • 本地模型

数据库:

业务:


PostgreSQL

向量:


Qdrant

Milvus

Chroma

缓存:


Redis

部署:


Docker

Kubernetes

8.3 项目目录设计

企业项目:

推荐:

Monorepo。

结构:


enterprise-agent


├── apps

│

├── agent-runtime

│

├── web-console


├── servers


│

├── crm-server


├── git-server


├── database-server


├── knowledge-server



├── packages


│

├── mcp-client


├── prompt-engine


├── memory


├── shared


└── docker

说明:

apps

应用。


servers

MCP Server。


packages

公共能力。


8.4 Agent Runtime 核心

Runtime:

负责:

调度。

目录:


agent-runtime

src

├── Agent.ts

├── Planner.ts

├── Executor.ts

├── Context.ts

└── Router.ts

入口:


class Agent{


async run(input){


const plan =

await this.planner.create(input);



const result =

await this.executor.run(plan);



return result;


}


}


8.5 MCP Client 管理层

创建:


packages/mcp-client

核心:


class MCPManager{


servers = [];



async connect(server){


const client =
new Client();


await client.connect(
server
);


this.servers.push(
client
);


}


}

作用:

统一管理:

多个 MCP Server。


8.6 CRM MCP Server

第一个业务 Server:

客户系统。


目录:


servers/crm-server

src

├── index.ts

├── tools

│   customer.ts

└── database.ts

提供 Tool:


 id="d2o8sy"
get_customer

create_customer

update_customer

例如:

Tool:


{

name:

"get_customer",


description:

"查询客户信息",


inputSchema:{

customerId:"string"

}

}

AI:

看到:

知道:

可以查询客户。


8.7 CRM Resource

除了 Tool:

还提供:

客户资料。

Resource:

设计:


crm://customer/{id}

例如:


crm://customer/10001

返回:


{
"id":10001,

"name":"张三",

"level":"VIP",

"orders":20
}

区别:

Tool:

主动查询。

Resource:

提供上下文。


8.8 Git MCP Server

代码 Agent:

核心。

目录:


git-server

src

├── tools

│   commit.ts

│   diff.ts

│   branch.ts

提供:

Tool:


get_commit

get_diff

create_branch

例如:

用户:


分析最近提交

Agent:

调用:


git.get_commit

获得:


commit abc123

修改:

payment.ts

8.9 Database MCP Server

数据分析:

必须。

提供:

Tool:


query_database

但是:

不能:

直接 SQL。

危险:


DROP TABLE user;

设计:

业务 API。

例如:


sales_report

user_statistics

order_summary

安全:

限制:

只读账号。


8.10 Knowledge MCP Server

企业最核心。

目录:


knowledge-server


src


├── loader


├── embedding


├── vector


└── resource

流程:


PDF

Word

Markdown

网页


↓

解析


↓

Chunk


↓

Embedding


↓

Vector DB


↓

MCP Resource

8.11 Knowledge Resource设计

URI:


knowledge://document/{id}

例如:


knowledge://document/payment-policy

返回:


{
"title":

"退款政策",

"content":

"退款7个工作日内到账"

}

8.12 Prompt Center

企业:

不要写死 Prompt。

单独:

服务。

结构:


prompt-center


├── customer

├── coder

├── analyst

└── manager

MCP:

提供:


prompts/list

prompts/get

例如:

获取:


code-review-v2

返回:


你是一名高级代码审查工程师...

8.13 Agent Router

企业:

多个 Agent。

例如:

用户:


帮我查订单

进入:

订单 Agent。

用户:


分析代码

进入:

Coding Agent。


Router:

负责:

分类。

流程:


用户输入


↓

Router


↓

选择Agent


↓

执行

代码:


switch(domain){


case "crm":

return crmAgent;


case "coding":

return codingAgent;


}

8.14 多 Agent 协作

复杂任务:

多个 Agent。

例如:

上线新功能:

需要:


产品Agent

↓

开发Agent

↓

测试Agent

↓

发布Agent

架构:


                Supervisor


                     |

      +--------------+--------------+

      |              |              |

 Product          Dev          Test

Supervisor:

协调。


8.15 用户请求完整流程

用户:


分析支付失败原因

步骤:

第一步

Router:

判断:


支付领域

第二步

Planner:

制定:


1 查询订单

2 查询日志

3 分析错误码

第三步

MCP Client:

调用:


CRM Tool

Database Tool

Knowledge Resource

第四步

LLM:

生成:

分析报告。


最终:


支付失败原因:

银行卡渠道超时。

建议:

切换备用渠道。

8.16 企业安全设计

必须考虑:

身份认证

例如:

OAuth2。


权限控制

RBAC:


用户

↓

角色

↓

权限

↓

Tool/Resource

审计日志

记录:


谁

什么时候

调用什么Tool

参数是什么

结果是什么

第8章 MCP 企业实战项目(下)

——完整实现、Docker 部署与生产级 AI Agent 架构

上一节我们完成了企业 AI Agent 平台的整体设计:

  • Agent Runtime
  • MCP Client
  • CRM MCP Server
  • Git MCP Server
  • Database MCP Server
  • Knowledge MCP Server
  • Prompt Center
  • Multi-Agent 架构

这一节进入真正生产部署:

目标:

将 MCP Agent 从 Demo 变成企业可运行的平台。


8.18 生产环境整体架构

最终生产架构:


                         用户

                          |

                    Web / App / API

                          |

                    API Gateway

                          |

                Enterprise Agent Runtime

                          |

              +-----------+-----------+

              |                       |

          MCP Client             Memory System


              |                       |

              |                    Redis

              |

      +-------+--------+--------+---------+

      |                |        |         |

 CRM MCP        Git MCP    DB MCP   Knowledge MCP


      |                |        |         |

 CRM系统          Git仓库    数据库    Vector DB


8.19 Docker 化 MCP Server

企业中:

每个 MCP Server:

独立部署。

例如:


crm-server

git-server

database-server

knowledge-server

目录:


crm-server

├── Dockerfile

├── package.json

└── src

Dockerfile:


FROM node:22


WORKDIR /app


COPY package*.json .


RUN npm install


COPY . .


CMD [

"node",

"dist/index.js"

]

构建:


docker build -t crm-mcp-server .

运行:


docker run \

-p 8080:8080 \

crm-mcp-server

8.20 MCP Server 容器化原则

生产环境:

不要:

一个容器:

所有能力。

错误:


Agent

+

CRM

+

Git

+

Database

全部一起。


正确:

微服务:


Agent Runtime

       |

       |

 MCP Server 集群


 +---------+

 CRM


 +---------+

 Git


 +---------+

 Knowledge

优势:

  • 独立扩容
  • 独立升级
  • 故障隔离

8.21 Docker Compose 本地环境

开发阶段:

使用:

docker-compose。


结构:


docker-compose.yml

示例:


version: "3"


services:


agent:

 image:

 enterprise-agent



crm-mcp:

 image:

 crm-server



git-mcp:

 image:

 git-server



redis:

 image:

 redis


启动:


docker compose up

本地:

完整环境启动。


8.22 MCP Server 服务发现

生产:

MCP Server:

动态变化。


需要:

Service Registry。

例如:


MCP Registry


crm-server

git-server

database-server

注册:


{

"name":

"crm-server",


"url":

"http://crm:8080",


"capabilities":[

"tools",

"resources"

]

}

Agent:

启动:

查询 Registry。


8.23 Kubernetes 部署

企业:

通常:

K8S。


架构:


Kubernetes Cluster


 namespace: ai-agent


        |

+----------------+

Agent Deployment


+----------------+

CRM MCP Deployment


+----------------+

Knowledge MCP Deployment


8.24 Agent Runtime Deployment

Deployment:


apiVersion:

apps/v1


kind:

Deployment


metadata:

 name:

 agent-runtime


spec:


 replicas:

3

为什么:

3?

因为:

高可用。


如果:

一个挂掉:

自动恢复。


8.25 MCP Server 自动扩容

例如:

知识库查询:

高峰:

10000请求。


增加:


knowledge-mcp

replicas:

10

Kubernetes:

自动负载。


8.26 MCP 通信方式选择

MCP:

支持:

本地

stdio:


Client

 |

Process

 |

Server

适合:

桌面 Agent。


企业

HTTP:


Client

 |

HTTP

 |

Server

适合:

云端。


大规模

Streaming:


Client

 |

SSE/WebSocket

 |

Server

适合:

实时 Agent。


8.27 Redis Memory 系统

Agent Memory:

不能:

存在进程内。


原因:

多实例:

数据不共享。


错误:


Agent1

memory[]

Agent2

memory[]

正确:


Agent

 |

Redis

存储:

短期记忆:


{

session:

"10001",


messages:[

]

}

8.28 Vector Database 部署

知识库:

需要:

向量数据库。

选择:

Qdrant

适合:

轻量。


Milvus

适合:

大型企业。


Elasticsearch

适合:

搜索融合。


架构:


Document

 |

Embedding

 |

Vector DB

 |

MCP Resource

8.29 Knowledge Pipeline

企业文档:

自动同步。

流程:


文件上传

↓

Parser

↓

Chunk

↓

Embedding

↓

Vector DB

↓

Knowledge MCP

例如:

新增:

payment.pdf。

自动:

生成:


payment chunk1

payment chunk2

payment chunk3

8.30 Agent 可观测性

生产最大问题:

不知道 AI 为什么这么回答。


必须记录:

Trace。

例如:

一次请求:


User Question


↓

Prompt


↓

LLM


↓

Tool Call


↓

Tool Result


↓

Final Answer

类似:

后端链路追踪。


8.31 OpenTelemetry 接入

架构:


Agent Runtime


 |

OpenTelemetry


 |

Trace Collector


 |

Monitoring System

记录:

例如:


{

traceId:

"abc123",


tool:

"query_order",


duration:

1200

}

8.32 Agent 日志体系

日志:

分:

应用日志

例如:


Agent started

推理日志

例如:


调用CRM Tool

审计日志

例如:


用户A查询客户B

8.33 Agent 成本控制

企业最关注:

费用。

主要来源:

Token。


优化:

1. Prompt压缩

减少:

无用内容。


2. Context窗口管理

历史:

摘要。


3. 模型路由

简单:

小模型。

复杂:

大模型。


架构:


Request

 |

Classifier


 |

+-------+

|

Small LLM


|

Large LLM

8.34 Agent 限流

防止:

恶意调用。

例如:

用户:

一分钟:

1000次。


限制:


user:

100 requests/min

Tool:

限制:


delete_user

10/day

8.35 MCP 安全网关

大型企业:

建议:

增加:

MCP Gateway。

架构:


Agent


 |

MCP Gateway


 |

MCP Servers

Gateway:

负责:

  • 身份认证
  • 权限
  • 审计
  • 限流
  • 路由

8.36 Agent 发布流程

类似软件:


开发

↓

测试

↓

Prompt评估

↓

灰度

↓

上线

灰度:

例如:

10% 用户。


观察:

指标:

  • 成功率
  • 成本
  • 延迟

8.37 企业级 Agent 测试

测试:

不能只测接口。

需要:

Prompt测试

输入:

1000问题。


Tool测试

模拟:

异常。


Agent测试

完整流程。


例如:

测试:


用户:

退款多久到账?

期望:

返回退款规则

8.38 MCP Agent 高可用设计

核心:

避免单点。


设计:


          Load Balancer


                |

        +-------+-------+

        |       |       |

     Agent   Agent   Agent


                |

             MCP Pool

数据库:

主从。


Redis:

Cluster。


Vector:

集群。


8.39 最终企业架构图

完整:


                         用户


                          |

                    Web / Mobile


                          |

                     API Gateway


                          |

                Enterprise Agent Platform


        +-----------------+-----------------+

        |                                   |

   Agent Runtime                      Observability


        |

    MCP Client


        |

+-------+--------+---------+------------+

|                |         |            |

CRM MCP      Git MCP    DB MCP    Knowledge MCP


|                |         |            |

CRM系统       GitLab    SQL DB     Vector DB


8.40 MCP 企业落地路线

推荐路线:

第一阶段

单 Agent。

实现:

  • MCP Client
  • 一个 Server
  • 一个 Tool

第二阶段

知识库。

增加:

  • Resource
  • RAG

第三阶段

多 Agent。

增加:

  • Planner
  • Executor

第四阶段

生产化。

增加:

  • Kubernetes
  • Monitoring
  • Security

8.41 本系列总结

经过 8 章:

我们完整学习:

MCP基础

  • MCP协议
  • 架构
  • 生命周期

Server开发

  • Tool
  • Resource
  • Prompt

Client开发

  • MCP Client
  • Agent Runtime

企业实践

  • RAG
  • Memory
  • Multi Agent
  • Docker
  • Kubernetes

最终理解:

MCP 不是一个简单协议。

它正在成为:

AI Agent 连接现实世界能力的标准接口。

未来企业 AI 架构:

很可能:


AI Model

+

Agent Runtime

+

MCP Protocol

+

Enterprise Capability

第9章 MCP 高级开发篇(上)

——深入理解 MCP 协议底层原理:从 JSON-RPC 到 Agent 通信模型

前面 8 章,我们完成了:

  • MCP 基础概念
  • Server 开发
  • Tool / Resource / Prompt
  • Client 开发
  • Agent Runtime
  • 企业部署

现在进入 MCP 深层原理。

本章目标:

不只是会用 MCP,而是理解 MCP 为什么这样设计,以及如何打造自己的 MCP 基础设施。


9.1 MCP 的本质是什么?

很多人认为:

MCP:

=

“给 AI 调工具的协议”。

这个理解:

不完整。


MCP 本质:

是一套:

AI 应用与外部能力之间的标准通信协议。

类似:

过去:

Web

解决:

浏览器 ↔ 服务端通信。

JDBC

解决:

Java ↔ 数据库通信。

MCP

解决:

AI Agent ↔ 外部世界通信。


架构:



传统互联网:

Browser

    |

 HTTP

    |

Server



AI时代:

Agent

    |

 MCP

    |

Capability Server

9.2 为什么 MCP 不直接调用 API?

很多人问:

已经有 REST API:

为什么需要 MCP?

例如:

CRM:

已有:


GET /customer/10001

为什么还需要:

MCP Tool?


原因:

API:

面向程序。

例如:

开发者知道:


/customer/{id}

但是 AI:

不知道:

  • 哪个接口适合
  • 参数是什么
  • 什么情况下调用

MCP 增加:

语义描述。

例如:

Tool:


{

"name":

"get_customer",


"description":

"根据客户编号查询客户资料"

}

AI:

理解:

用途。


9.3 MCP 协议分层模型

MCP:

类似网络协议栈。


五层:



        Application Layer

        Tool Resource Prompt


              |

        Protocol Layer

        JSON-RPC


              |

        Transport Layer

        stdio HTTP SSE


              |

        Session Layer


              |

        Runtime Layer

9.4 MCP 基于 JSON-RPC

核心:

JSON-RPC 2.0。

为什么选择?

因为:

简单。

跨语言。


一个请求:


{

"jsonrpc":

"2.0",


"id":

1,


"method":

"tools/list",


"params":{}

}

解释:

jsonrpc

协议版本。

id

请求编号。

method

调用方法。

params

参数。


9.5 MCP 请求生命周期

一次 Tool 调用:

完整流程:



Client


 |

 | tools/call

 |

 v


Server


 |

 | 执行业务

 |

 v


返回Result


 |

Client


 |

LLM继续推理

例如:

用户:

查询天气。


第一步:

LLM:

决定:

调用:


getWeather

第二步:

MCP Client:

发送:


{

"method":

"tools/call",

"params":{

"name":

"getWeather"

}

}

第三步:

Server:

执行。


第四步:

返回。


9.6 MCP Initialize 握手原理

连接不是:

直接调用。

第一步:

必须:

初始化。


Client:

发送:


{

"method":

"initialize",


"params":{


"clientInfo":{


"name":

"agent"

}


}

}

Server:

返回:


{

"serverInfo":{


"name":

"crm-server"

},


"capabilities":{


"tools":{}

}

}

作用:

双方确认:

能力。


类似:

TCP Handshake。


9.7 Capability 协商

MCP:

不是所有 Server:

都支持全部能力。

例如:

Server A:

支持:


{

"tools":{}

}

Server B:

支持:


{

"resources":{}

}

Client:

根据能力:

决定:

调用什么。


9.8 MCP Method 分类

主要:

三类。


Tool

方法:


tools/list

tools/call

Resource

方法:


resources/list

resources/read

Prompt

方法:


prompts/list

prompts/get

9.9 Tool Schema 设计原理

Tool:

核心:

Schema。

例如:


{

"name":

"create_order",


"inputSchema":{


"type":

"object",


"properties":{


"userId":{

"type":"string"

}

}


}

}

为什么重要?

因为:

LLM 根据 Schema:

决定:

怎么调用。


9.10 Tool 描述设计原则

错误:


{

"name":

"query"

}

AI:

不知道:

查什么。


正确:


{

"name":

"get_customer_orders",


"description":

"查询指定客户最近订单列表"

}

原则:

名称

动词 + 对象。

例如:

good:


search_customer

create_invoice

bad:


data1

api2

9.11 Tool 参数设计

错误:

一个参数:


{

"input":

"string"

}

问题:

AI不知道格式。


正确:


{

"customerId":

{

"type":

"string",

"description":

"客户编号"

}

}

描述:

非常重要。


9.12 Tool 返回值设计

不要:

返回:

巨大 JSON。

错误:


{

100个字段

}

推荐:

结构化:


{

"success":

true,


"data":{


"name":

"张三"

}

}

方便 AI 理解。


9.13 MCP Resource 深层设计

Resource:

不是简单文件。

它代表:

知识对象。


例如:

错误:


file:///a/b/c.pdf

正确:


customer://10001/profile

order://8888/detail

policy://refund

为什么?

因为:

AI 理解业务语义。


9.14 MCP Prompt 本质

Prompt:

不是字符串。

而是:

企业行为规范。


例如:

代码审查:


code-review-v2

包含:

  • 角色
  • 规则
  • 输出格式
  • 安全限制

类似:

“AI工作流程模板”。


9.15 MCP Transport 原理

MCP:

支持不同传输。


stdio

流程:



Client

 |

stdin/stdout

 |

Server Process

特点:

简单。

适合:

桌面应用。


HTTP

流程:



Client

 |

HTTP Request

 |

Server

适合:

云服务。


SSE

支持:

服务器推送。

例如:

任务执行进度。


9.16 为什么 MCP 选择 JSON-RPC?

原因:

1. 双向通信

客户端:

调用服务器。

服务器:

也可以通知客户端。


例如:

资源更新:


resources/list_changed

2. 简单

容易:

跨语言。


3. 适合 Agent

Agent:

大量:

动态调用。


9.17 MCP 与微服务区别

很多人混淆。

微服务:

解决:

服务拆分。

MCP:

解决:

AI访问能力。


对比:

微服务 MCP
调用者 程序 AI
接口 API Tool/Resource
描述 文档 Schema
目标 业务通信 智能调用

9.18 MCP 与 OpenAPI 区别

OpenAPI:

描述:

HTTP API。

MCP:

描述:

AI Capability。


可以:

OpenAPI 转 MCP。

流程:



OpenAPI

↓

Schema转换

↓

MCP Tool

↓

Agent调用

9.19 MCP Server 设计最佳实践

一个 Server 一个领域

推荐:


crm-server

payment-server

knowledge-server

不要:


everything-server

第9章 MCP 高级开发篇(下)

——MCP SDK 源码解析与高级 Server 设计

上一节我们从协议层理解了 MCP:

  • JSON-RPC
  • initialize
  • Capability
  • Tool / Resource / Prompt
  • Transport

这一节进入 SDK 和框架层。

目标:

不只是调用 MCP SDK,而是理解 SDK 如何工作,并设计自己的企业级 MCP Framework。


9.21 MCP SDK 整体结构分析

以 TypeScript MCP SDK 为例。

整体结构:



@mcp/sdk


├── client

│    ├── Client

│    ├── Session


├── server

│    ├── Server

│    ├── RequestHandler


├── transport

│    ├── Stdio

│    ├── HTTP


├── types

│    ├── Tool

│    ├── Resource

│    └── Prompt


└── protocol

     └── JSON-RPC

核心:

其实只有三个部分:



Protocol

Transport

Capability

9.22 MCP Server 内部运行模型

一个 Server:

启动后:

执行:



创建Server

↓

注册能力

↓

监听Transport

↓

接收Request

↓

匹配Handler

↓

执行业务

↓

返回Result

代码结构:



const server =
new MCPServer();


server.registerTool();


server.start();


9.23 Server 初始化过程

例如:



const server =
new Server({

name:"crm",

version:"1.0"

});

内部:

创建:



{

name,

version,

capabilities,

handlers

}

其中:

handlers:

保存:

所有请求处理函数。


9.24 Tool 注册机制源码思想

调用:



server.tool(

"get_customer",

schema,

handler

)

实际上:

类似:



tools.set(

"get_customer",

{

schema,

handler

}

)

内部:

维护:

Map。

结构:



ToolRegistry


{

get_customer:

 handler


create_order:

 handler


}

9.25 Request Handler 工作流程

收到:



{

method:

"tools/call"

}

进入:

Router:



switch(method){


case "tools/call":

handleToolCall();


}

然后:

找到:

Tool。


执行:



tool.handler(args)

返回:

Result。


9.26 自己实现一个 MCP Mini Framework

理解原理后:

可以自己封装。

目录:



mini-mcp


src


├── server.ts

├── registry.ts

├── transport.ts

└── protocol.ts


9.27 Tool Registry设计

核心:

工具注册中心。

代码:



class ToolRegistry{


private tools =
new Map();



register(
tool
){

this.tools.set(

tool.name,

tool

);


}



get(name){

return this.tools.get(name);

}


}

使用:



registry.register({

name:"weather",

handler:getWeather

})

9.28 Request Router设计

所有请求:

进入 Router。



class Router{


async dispatch(request){


const method =
request.method;



if(method==="tools/list"){


return this.listTools();


}



if(method==="tools/call"){


return this.callTool(
request
);


}


}

}

类似:

Web Router。


9.29 Schema 校验系统

企业环境:

参数必须安全。

例如:

Tool:

要求:



{

age:

number

}

用户:

传:



{

age:

"abc"

}

必须拒绝。


使用:

Schema Validator。

例如:



validate(

schema,

params

)

流程:



Request

↓

Schema验证

↓

Handler

↓

Result

9.30 MCP Middleware设计

类似:

Express。

例如:



Request


↓

Auth Middleware


↓

Logging Middleware


↓

Permission Middleware


↓

Tool Handler

代码:



server.use(

middleware

)

用途:

  • 权限
  • 审计
  • 限流

9.31 MCP 权限系统设计

企业:

不能:

所有 Tool:

全部开放。


设计:

Permission Matrix。

例如:



             Tool


User       query    delete


Admin       √        √


Operator    √        ×


Guest       √        ×


实现:



checkPermission(

user,

tool

)

9.32 MCP Gateway设计

大型企业:

不会:

Agent直接连接几十个Server。

中间:

增加 Gateway。

架构:



             Agent


               |

          MCP Gateway


      +--------+---------+

      |        |         |

    CRM      Git      DB

Gateway职责:

  • 路由
  • 鉴权
  • 监控
  • 限流

9.33 Gateway Tool 聚合

例如:

三个 Server:

CRM:


get_customer

Order:


get_order

Payment:


get_payment

Gateway:

统一暴露:


enterprise.tools

Agent:

只连接一个入口。


9.34 Tool 动态注册

企业:

新系统上线:

不希望:

重启 Agent。


动态:



新Tool上线


↓

注册中心


↓

Gateway发现


↓

Agent刷新能力

类似:

服务发现。


9.35 MCP Server 热更新

需求:

修改 Tool:

无需停机。

方案:

Tool版本管理。

例如:



customer-search-v1


customer-search-v2

灰度:



10%

↓

50%

↓

100%

9.36 MCP Server 集群

生产:

单 Server:

不够。

架构:



              Load Balancer


                    |


        +-----------+-----------+

        |           |           |

      MCP1       MCP2        MCP3


注意:

MCP Server:

最好:

无状态。


为什么?

方便扩容。


9.37 无状态 MCP 架构

推荐:

不要保存:

用户状态。

错误:



Server

{

session:{}

}

正确:



Server

 |

Redis

 |

Database

优势:

任意节点处理请求。


9.38 MCP Event机制

高级场景:

需要:

事件通知。

例如:

数据更新。

流程:



Database变化


↓

Event


↓

MCP Server


↓

通知Agent

例如:

Resource变化:



resources/list_changed

9.39 MCP 长任务设计

例如:

生成报告:

需要30分钟。

不能:

HTTP一直等待。


设计:

异步任务。

流程:



Tool Call


↓

Create Task


↓

Return taskId


↓

后台执行


↓

Notify Result

返回:



{

taskId:

"123456",

status:

"running"

}

9.40 MCP Framework 企业封装

最终:

企业可以封装:

自己的 MCP Framework。

结构:



Enterprise MCP Framework


├── Tool SDK


├── Auth SDK


├── Registry


├── Gateway


├── Monitor


└── Deployment

开发者:

只需要:



@mcpTool({

name:"queryOrder"

})

class OrderService{


}

自动生成:

MCP Tool。


9.41 MCP 未来演进方向

未来 MCP:

可能发展:

1. Capability Marketplace

能力市场。

类似:

App Store。


2. Agent Operating System

AI操作系统。


3. Enterprise AI Bus

企业AI总线。


架构:



AI Agents


    |

MCP Bus


    |

Enterprise Systems
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐