工作中用到了mcp服务,本文主要讲解go语言的go-mcp包的使用,是针对于服务端的,开始之前需要简单介绍下什么是mcp,mcp是用来干啥的。
一、简介
MCP(Model Context Protocol)模型上下文协议 完整介绍
MCP(Model Context Protocol,模型上下文协议) 是 Anthropic 于 2024 年 11 月推出的开放、标准化协议,核心是统一大语言模型(LLM)与外部工具、数据源的交互方式,被称为 AI 世界的 "USB‑C 接口"------ 让不同模型能像插外设一样,即插即用各类工具与数据。
定位与价值
- 解决的痛点
- 接口不统一:不同模型(GPT、Claude、DeepSeek 等)调用工具的格式、参数、规则各异,适配成本高。
- 集成复杂:传统方式需为每个工具 / 数据源单独写适配代码,难以维护。
- 数据孤岛:模型难以安全、便捷地访问本地文件、数据库、API 等外部资源。
- 核心价值
- 标准化:一套协议适配所有模型与工具,降低开发与集成成本。
- 即插即用:模型可动态发现、调用 MCP 服务端提供的工具,无需预编码。
- 安全隔离:模型不直接接触敏感数据,由 MCP 服务端统一管控权限。
- 能力扩展:让模型从 "纯文本生成" 升级为 "可操作外部世界" 的智能体。
二、架构
MCP 的核心架构模式(C/S模式)
MCP 采用客户端‑服务器(Client‑Server) 架构,三大核心组件分工明确:
- MCP Host(主机 / 宿主)
- 角色:用户交互入口 + 模型运行环境(如 Cline、Cursor、Claude Desktop、DeepSeek 客户端)。
- 职责:接收用户输入、展示结果、管理会话、运行 MCP 客户端。
- MCP Client(客户端)
- 角色:Host 与 Server 之间的桥梁。
- 职责:
- 向 MCP Server 动态发现可用工具(
tools/list)。 - 将工具描述、用户请求封装后发给 LLM。
- 解析 LLM 的工具调用指令,转发给 MCP Server。
- 接收 Server 返回的结果,回传给 LLM 生成最终回答。
- 向 MCP Server 动态发现可用工具(
- MCP Server(服务端)
- 角色:工具 / 资源的提供者与执行者。
- 核心能力(三大原语):
- Tools(工具):可执行函数(如查天气、读文件、SQL 查询、调用 API)Model Context Protocol。
- Resources(资源):只读数据源(如本地文件、知识库、日志)。
- Prompts(提示词):预定义的结构化 Prompt 模板。
- 职责:暴露工具元数据、执行工具调用、返回结果、做权限与安全控制。
三、MCP服务端流程示例
1.输入问题
2.封装 MCP 请求
3.组装Prompt→调用API
4.解析Prompt→判断是否调用Tool
5.需要工具 → 调用 Tool
6.Tool返回结果
7.结果回传给模型
8.生成自然语言回答→封装MCP响应
9.返回 MCP 响应
10.展示最终回答
👤 用户
💻 Client 客户端(Cline)
⚙️ MCP 服务端
🤖 DeepSeek 大模型
🔧 注册的 Tool 工具
注:
- 模型可以是任何大模型,如GPT、千问、Claude、Gemini等等,博主只是使用了DeepSeek来操作示例;
- Client客户端也有很多,如Claude等,博主只是使用了VScode+cline插件的形式。
四、准备工具
需要用到的开发工具:VScode + 项目代码 + DeepSeek账户
-
VScode安装:VScode下载地址

-
示例项目代码地址:示例项目demo代码
-
项目中使用了数据库,需要调整数据的用户密码地址等数据,路径:goweb_board/model/db.go
-
创建数据库命令:
mysqlCREATE DATABASE `goweb_board`; -
创建数据库后,第一次执行需要初始化数据库代码,修改文件:
goweb_board/model/db.go的第46行代码,打开注释运行一次项目,然后在注释即可。原因:写的时候只考虑怎么方便怎么来,没有详细处理数据库这块。
-
-
DeepSeek官网注册申请账户:DeepSeek地址
-
点开,注册登录,充值,最小充值金额10元。

-
创建并复制Key,这个key后面会用到配置在cline上。注意:这个key只有在创建的时候可以复制,忘记了,把旧的删除重新创建一个即可。

-
五、核心代码
go-mcp 中 Prompt、Resource、Tool 核心概念解析:在 go-mcp(MCP 协议的 Go 实现)里,Prompt、Resource、Tool 是构成 MCP 服务的三大核心原语(Primitive),分别对应「引导 AI 思考」「提供只读数据」「执行可操作功能」,三者分工明确且协同工作,共同支撑 AI 完成复杂任务。
使用的go-mcp:go-mcp连接
1.Prompt
给 AI 的「自然语言指令 / 上下文」,引导 AI 理解需求、决策行为。简单理解就是,把输入的内容prompt处理下,然后再提交给大模型理解。
核心特性
- 纯文本 / 结构化文本(如 JSON),无执行逻辑,仅用于「指导 AI 思考」;
- 可包含用户需求、角色定义、工具调用规则、对话历史等;
- 是 AI 的核心输入,决定 AI "怎么想、怎么回复、是否调用工具 / 读取资源"。
代码块示例
注意:详细项目实例请看上面的demo地址
文件路径:goweb_board/prompt/demo.go
golang
package prompt
import (
"context"
"fmt"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
type Demo struct{}
func DemoInstance() Prompter {
return Demo{}
}
func (Demo) Prompt() mcp.Prompt {
return mcp.NewPrompt("greeting",
mcp.WithPromptDescription("A friendly greeting prompt"),
mcp.WithArgument("name",
mcp.ArgumentDescription("Name of the person to greet"),
),
)
}
func (Demo) HanderFunc() server.PromptHandlerFunc {
return func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {
name := request.Params.Arguments["name"]
if name == "" {
name = "friend"
}
return mcp.NewGetPromptResult(
"A friendly greeting",
[]mcp.PromptMessage{
mcp.NewPromptMessage(
mcp.RoleAssistant,
mcp.NewTextContent(fmt.Sprintf("Hello, %s! How can I help you today?", name)),
),
},
), nil
}
}
2.resource
给 AI 提供的「只读数据源」(文件、知识库、API 结果等),AI 可读取但不能修改。简单理解就是给AI提供仅可查询的一个内置静态的"数据库"
核心特性
- 只读性:AI 只能读取数据,无法修改 / 删除资源内容;
- 类型丰富:支持本地文件、数据库查询结果、API 静态响应、知识库片段等;
- 安全可控:由 MCP 服务端管控访问权限,AI 无需直连敏感数据源。
代码块示例
注意:详细项目实例请看上面的demo地址
文件路径:goweb_board/resource/pc_mid.go
golang
package resource
import (
"context"
"os"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
type PcMid struct{}
func PcMidInstance() Resourcer {
return PcMid{}
}
func (pc PcMid) Resource() mcp.Resource {
return mcp.NewResource(
"stats://xxx/pc/test.md",
"pc测试结果",
mcp.WithResourceDescription("pc测试结果"),
mcp.WithMIMEType("text/markdown"),
)
}
func (pc PcMid) HanderFunc() server.ResourceHandlerFunc {
return func(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {
content, err := os.ReadFile("/xxx/xxx/xxx/test.md")
if err != nil {
return nil, err
}
return []mcp.ResourceContents{
mcp.TextResourceContents{
URI: "stats://xxx/pc/test.md",
MIMEType: "text/markdown",
Text: string(content),
},
}, nil
}
}
3.tool
给 AI 开放的「可执行功能」,AI 调用后能执行具体操作(查接口、算数据等)。简单理解就是给AI提供的固定规则执行的操作工具。
核心特性
- 可执行性:绑定具体业务逻辑,调用后会执行操作(调接口、写文件、算数据等);
- 参数约束:支持定义入参类型(字符串 / 数字)、必填项、校验规则;
- 双向交互:可返回执行结果给 AI,也可接收 AI 传递的参数。
代码块示例
注意:详细项目实例请看上面的demo地址
这里只粘贴最小的文件,文件路径:goweb_board/tool/project_delete.go
golang
package tool
import (
"context"
"goweb_board/service"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
type ProjectDelete struct{}
func ProjectDeleteInstance() Tooler {
return ProjectDelete{}
}
func (ProjectDelete) Tool() mcp.Tool {
return mcp.NewTool("delete_project",
mcp.WithDescription(`
项目管理助手-删除: 根据提供的项目名称删除项目
### 核心功能
根据对话内容整理获取项目名称,对项目进行删除操作(底层实现是逻辑删除)
`),
mcp.WithString("name", mcp.Description(`
需要删除的项目名称(必传参数)
- 用途:要删除的项目名称
- 示例:
• "鸿蒙"
- 注意事项:
名称长度建议不超过30个字符,避免特殊字符(如/|\等)
`)))
}
func (ProjectDelete) HanderFunc() server.ToolHandlerFunc {
return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
name := checkParams(request, "name")
var project service.ProjectBatService
err := project.DeleteProject(name)
if err != nil {
return nil, err
}
return mcp.NewToolResultText("删除成功"), nil
}
}
六、使用
-
运行项目:按照项目的使用文档:README.md,执行命令:go run main.go
-
配置VSCode的cline
-
配置大模型
打开cline的设置

这块就用到之前的DeekSeep的Key了

-
配置stream-http(项目默认使用stream-http,如需sse,请自行调整代码,README.md文档中已写清楚)
点击 MCP Servers 进入配置

选择 Remote Servers,配置Mcp服务

选择 Configure 查看配置结果,开关蓝色,并且显示联通的小点是绿色。表示已经连接到服务,且服务可用。

-
对话:cline对话框直接沟通即可,比如通过大模型对话修改数据,创建数据等。
-