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

    • 创建数据库命令:

      mysql 复制代码
      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

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

六、使用

  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对话框直接沟通即可,比如通过大模型对话修改数据,创建数据等。

相关推荐
小红卒2 小时前
Go语言安全开发学习笔记5:tls反弹shell升级到C2指令执行马
笔记·学习·网络安全·golang
小红卒13 小时前
Go语言安全开发学习笔记1:Windows反向TCP反弹Shell 原理与代码
golang
国家一级摸鱼选手16 小时前
MCP(Model Context Protocol)学习笔记
unity·ai·mcp
b_q16 小时前
从零搭建 MCP Server:让 AI Agent 调用实盘量化信号
mcp
lisus200717 小时前
GO并发统计文件大小
开发语言·后端·golang
lars_lhuan18 小时前
Go 并发
golang
Reisentyan18 小时前
GoLang Learn Data Day 0
开发语言·rpc·golang
sudo_jin1 天前
别再造轮子了!2026年,用 MCP 给你的 AI 插上“万能 USB 接口”
mcp
读研的武1 天前
Golang学习笔记 入门篇
笔记·学习·golang