工作中用到了mcp服务本文主要讲解go语言的go-mcp包的使用是针对于服务端的开始之前需要简单介绍下什么是mcpmcp是用来干啥的。一、简介MCPModel Context Protocol模型上下文协议 完整介绍MCPModel 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服务端角色工具 / 资源的提供者与执行者。核心能力三大原语Tools工具可执行函数如查天气、读文件、SQL 查询、调用 APIModel Context Protocol。Resources资源只读数据源如本地文件、知识库、日志。Prompts提示词预定义的结构化 Prompt 模板。职责暴露工具元数据、执行工具调用、返回结果、做权限与安全控制。三、MCP服务端流程示例1.输入问题2.封装 MCP 请求3.组装Prompt→调用API4.解析Prompt→判断是否调用Tool5.需要工具 → 调用 Tool6.Tool返回结果7.结果回传给模型8.生成自然语言回答→封装MCP响应9.返回 MCP 响应10.展示最终回答 用户 Client 客户端Cline⚙️ MCP 服务端 DeepSeek 大模型 注册的 Tool 工具注模型可以是任何大模型如GPT、千问、Claude、Gemini等等博主只是使用了DeepSeek来操作示例Client客户端也有很多如Claude等博主只是使用了VScodecline插件的形式。四、准备工具需要用到的开发工具VScode 项目代码 DeepSeek账户VScode安装VScode下载地址示例项目代码地址示例项目demo代码项目中使用了数据库需要调整数据的用户密码地址等数据路径goweb_board/model/db.go创建数据库命令:CREATE DATABASE goweb_board;创建数据库后第一次执行需要初始化数据库代码修改文件goweb_board/model/db.go的第46行代码打开注释运行一次项目然后在注释即可。原因写的时候只考虑怎么方便怎么来没有详细处理数据库这块。DeepSeek官网注册申请账户DeepSeek地址点开注册登录充值最小充值金额10元。创建并复制Key这个key后面会用到配置在cline上。注意这个key只有在创建的时候可以复制忘记了把旧的删除重新创建一个即可。五、核心代码go-mcp 中 Prompt、Resource、Tool 核心概念解析在 go-mcpMCP 协议的 Go 实现里Prompt、Resource、Tool 是构成 MCP 服务的三大核心原语Primitive分别对应「引导 AI 思考」「提供只读数据」「执行可操作功能」三者分工明确且协同工作共同支撑 AI 完成复杂任务。使用的go-mcpgo-mcp连接1.Prompt给 AI 的「自然语言指令 / 上下文」引导 AI 理解需求、决策行为。简单理解就是把输入的内容prompt处理下然后再提交给大模型理解。核心特性纯文本 / 结构化文本如 JSON无执行逻辑仅用于「指导 AI 思考」可包含用户需求、角色定义、工具调用规则、对话历史等是 AI 的核心输入决定 AI “怎么想、怎么回复、是否调用工具 / 读取资源”。代码块示例注意详细项目实例请看上面的demo地址文件路径goweb_board/prompt/demo.gopackage 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.gopackage 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.gopackage 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对话框直接沟通即可比如通过大模型对话修改数据创建数据等。