当前位置: 首页 > news >正文

go-mcp基础

工作中用到了mcp服务,本文主要讲解go语言的go-mcp包的使用,是针对于服务端的,开始之前需要简单介绍下什么是mcp,mcp是用来干啥的。

一、简介

MCP(Model Context Protocol)模型上下文协议 完整介绍

MCP(Model Context Protocol,模型上下文协议) 是 Anthropic 于 2024 年 11 月推出的开放、标准化协议,核心是统一大语言模型(LLM)与外部工具、数据源的交互方式,被称为 AI 世界的 “USB‑C 接口”—— 让不同模型能像插外设一样,即插即用各类工具与数据。

定位与价值

  1. 解决的痛点
  • 接口不统一:不同模型(GPT、Claude、DeepSeek 等)调用工具的格式、参数、规则各异,适配成本高。
  • 集成复杂:传统方式需为每个工具 / 数据源单独写适配代码,难以维护。
  • 数据孤岛:模型难以安全、便捷地访问本地文件、数据库、API 等外部资源。
  1. 核心价值
  • 标准化:一套协议适配所有模型与工具,降低开发与集成成本。
  • 即插即用:模型可动态发现、调用 MCP 服务端提供的工具,无需预编码。
  • 安全隔离:模型不直接接触敏感数据,由 MCP 服务端统一管控权限。
  • 能力扩展:让模型从 “纯文本生成” 升级为 “可操作外部世界” 的智能体。

二、架构

MCP 的核心架构模式(C/S模式)

MCP 采用客户端‑服务器(Client‑Server) 架构,三大核心组件分工明确:

  1. MCP Host(主机 / 宿主)
  • 角色:用户交互入口 + 模型运行环境(如 Cline、Cursor、Claude Desktop、DeepSeek 客户端)。
  • 职责:接收用户输入、展示结果、管理会话、运行 MCP 客户端。
  1. MCP Client(客户端)
  • 角色:Host 与 Server 之间的桥梁。
  • 职责:
    • 向 MCP Server 动态发现可用工具(tools/list)。
    • 将工具描述、用户请求封装后发给 LLM。
    • 解析 LLM 的工具调用指令,转发给 MCP Server。
    • 接收 Server 返回的结果,回传给 LLM 生成最终回答。
  1. 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账户

  1. VScode安装:VScode下载地址

  2. 示例项目代码地址:示例项目demo代码

    • 项目中使用了数据库,需要调整数据的用户密码地址等数据,路径:goweb_board/model/db.go

    • 创建数据库命令:

      CREATE DATABASE `goweb_board`;
    • 创建数据库后,第一次执行需要初始化数据库代码,修改文件:goweb_board/model/db.go的第46行代码,打开注释运行一次项目,然后在注释即可。原因:写的时候只考虑怎么方便怎么来,没有详细处理数据库这块。

  3. 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

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

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

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 } }

六、使用

  1. 运行项目:按照项目的使用文档:README.md,执行命令:go run main.go

  2. 配置VSCode的cline

    1. 配置大模型

      打开cline的设置

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

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

      点击 MCP Servers 进入配置

      选择 Remote Servers,配置Mcp服务

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

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

http://www.cnnetsun.cn/news/1275874.html

相关文章:

  • 情人节,爱你无数遍
  • 技术员视角:如何判断电商API接口的稳定性和可靠性
  • C 语言值传递陷阱:为什么链表初始化必须用 LinkList *L(二级指针)?
  • JeechBoot前端设置表格内自定义元素
  • 场景应用:全国首单车联网领域数据资产入表
  • 2026年存储市场核心数据与趋势分析
  • 打破小爱音箱音乐壁垒:XiaoMusic让你的智能音箱重获自由
  • 一文看懂 Bsin-PaaS Skills:把企业能力做成 AI 可调用的「技能」
  • 3步解锁显卡潜能:开源工具如何重构游戏体验
  • PyCINRAD:破解气象雷达数据密码的Python利器
  • 计算机毕业设计java基于Web的社区留守儿童管理系统 基于B/S架构的旅游景区综合信息管理平台设计 基于Spring Boot的景点资源与游客服务管理系统开发
  • autodl_M000_pytorch
  • 【中间件】Pulsar集群安装
  • python初应用
  • 【漏洞复现】CVE-2019-11043(PHP远程代码执行漏洞)信息安全论文_含漏洞复现完整过程_含Linux环境go语言编译环境安装
  • 算法题练习Day1:B2006 地球人口承载力估计
  • 2026年OpenClaw极简部署教程,两步拥有专属AI助理!
  • solidwork练习题29
  • 2026大客户销售培训机构推荐榜:聚焦工业品/ToB实战落地的优质服务商指南
  • 从数据库到大模型:开发者高效学习路径的思考
  • 柔性温度传感器--正六边型结构(2)
  • psd文件解析
  • java毕业设计——基于JSP+sqlserver的高校学生考勤管理系统设计与实现(毕业论文+程序源码)——考勤管理系统
  • java毕业设计——基于JSP+sqlserver的环境美容服务公司网站设计与实现(毕业论文+程序源码)——公司网站
  • 一文理解什么是贝叶斯优化的随机森林
  • 终极编程字体指南:Codeface位图字体画廊的完整使用教程
  • 探索网络盲区:推荐EHole 3.0 — 红队重点攻击系统指纹探测工具
  • Python-Fxxk-Spider 开源项目教程
  • RoundedImageView自定义边框终极指南:打造完美圆角图片的10个技巧
  • 终极Kryo异常处理指南:从KryoException到序列化追踪的完整解决方案