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

网站失败后怎么重新建设创建全国文明城市简报

网站失败后怎么重新建设,创建全国文明城市简报,广州易网外贸网站建设,建一个网站大概需要多长时间【Go类库分享】mcp-go Go搭建MCP服务 介绍 目前Go 生态圈有两个知名的开发 MCP 的库,一个是mark3labs/mcp-go,另一个是metoro-io/mcp-golang。 在介绍常用库之前,先来简单介绍一下mcp协议: MCP全称Model Context Protocol 模型上下文协议&a…

【Go类库分享】mcp-go Go搭建MCP服务

介绍

目前Go 生态圈有两个知名的开发 MCP 的库,一个是mark3labs/mcp-go,另一个是metoro-io/mcp-golang。

在介绍常用库之前,先来简单介绍一下mcp协议:

MCP全称Model Context Protocol 模型上下文协议,MCP 是一个开放协议,它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样,MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口。

相比之前各大AI厂商各自为战,接口以及协议之间不通用,导致开发者针对同一个功能为了适配多个AI模型,需要开发多套。现在有了MCP,各大模型厂商和开发者只需遵循MCP协议,即可实现一次编写,多模型适用。

MCP与大模型调用之间原理图:
在这里插入图片描述
MCP架构主要包含一下几个模块:

  • MCP Hosts: 如 Claude Desktop、IDE 、DeepChat或 AI 工具,希望通过 MCP 访问数据的程序
  • MCP Clients: 维护与服务器一对一连接的协议客户端
  • MCP Servers: 轻量级程序,通过标准的 Model Context Protocol 提供特定能力
  • 本地数据源: MCP 服务器可安全访问的计算机文件、数据库和服务
  • 远程服务: MCP 服务器可连接的互联网上的外部系统(如通过 APIs)

安装

go get "github.com/mark3labs/mcp-go"

API介绍

1. server.NewMCPServer:新建一个mcp server

目前MCP 支持 SSE 和Stdio两种类型。

  1. stdio:standard input output,标准输入输出,适用于mcp client和mcp server部署在同一个机器上,不涉及跨机器。
  2. sse:Server-Sent Events,服务器发送事件,是一个基于HTTP的协议。适用于mcp client与mcp server不在同一个机器中的场景,涉及网络传输。

这里我们以新建一个基于Stdio协议的mcp server为例:

//新建mcp 服务
mcpServer := server.NewMCPServer("ziyi Mcp Server", "1.0.0")
//对外提供 stdio mcp server服务
if err := server.ServeStdio(mcpServer); err != nil {panic(err)
}

2. mcp.NewResource:对外提供资源

资源是你向 LLMs 暴露数据的方式。它们可以是任何东西:文件、API 响应、数据库查询、系统信息等。资源可以是:

  • 静态资源(固定 URI)
  • 动态资源(使用 URI 模板)
//新增一个mcp server对外暴露的静态资源(固定URI),比如:对外暴露项目的操作手册以及部署方式等,就可以通过静态资源README文件的方式来告诉大模型
resource := mcp.NewResource("docs://readme","项目的README文件",mcp.WithResourceDescription("这是一个项目的README文件"),mcp.WithMIMEType("text/markdown"),
)
// 添加对静态资源的处理器
mcpServer.AddResource(resource, func(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {content, err := os.ReadFile("README.md")if err != nil {return nil, err}return []mcp.ResourceContents{mcp.TextResourceContents{URI:      "docs://readme",MIMEType: "text/markdown",Text:     string(content),},}, nil
})

3. mcp.NewTool:对外提供工具

工具让 LLM 通过你的服务器执行操作。与资源不同,工具预期会进行计算并产生副作用。它们类似于 REST API 中的 POST 端点。 下面是一个算术运算的工具示例:

工具可以用于任何种类的计算:

  1. Database queries 数据库查询
  2. File operations 文件操作
  3. External API calls 外部 API 调用
  4. Calculations 计算
  5. System operations 系统操作

每个工具应该:

  1. 有清晰的描述
  2. 验证输入
  3. 优雅处理错误
  4. 返回结构化的响应
  5. 使用适当的结果类型
//给该mcp server添加计算能力(Tools)
// 1. 描述该工具,以及调用该工具调用的参数机器含义
calculatorTool := mcp.NewTool("calculate",mcp.WithDescription("进行基础的数学运算"),mcp.WithString("operation",mcp.Required(),mcp.Description("The arithmetic operation to perform"),mcp.Enum("add", "subtract", "multiply", "divide"),),mcp.WithNumber("x",mcp.Required(),mcp.Description("First number"),),mcp.WithNumber("y",mcp.Required(),mcp.Description("Second number"),),
)
// 2. 实现工具的具体处理逻辑,类比大模型function_calling中的func部分
mcpServer.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {op := request.Params.Arguments["operation"].(string)x := request.Params.Arguments["x"].(float64)y := request.Params.Arguments["y"].(float64)var result float64switch op {case "add":result = x + ycase "subtract":result = x - ycase "multiply":result = x * ycase "divide":if y == 0 {return nil, errors.New("Division by zero is not allowed")}result = x / y}return mcp.FormatNumberResult(result), nil
})

4. s.AddPrompt:添加提示词

下面是一个简单的提示词示例,它需要一个名称参数,然后返回一个问候提示词:

// 给mcpServer添加提示词模版
mcpServer.AddPrompt(mcp.NewPrompt("打招呼",mcp.WithPromptDescription("A friendly greeting prompt"),mcp.WithArgument("name",mcp.ArgumentDescription("Name of the person to greet"),),
), 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
})

实战使用

1. 编写mcp server

这里我们演示一个查询IP的mcp server。大模型传入ip,mcp server返回地址信息。

ip mcp server全部代码:

package mainimport ("context""errors""fmt""github.com/mark3labs/mcp-go/mcp""github.com/mark3labs/mcp-go/server""io""net""net/http"
)func main() {// Create MCP servers := server.NewMCPServer("ip-mcp","1.0.0",)// Add tooltool := mcp.NewTool("ip_query",mcp.WithDescription("query geo location of an IP address"),mcp.WithString("ip",mcp.Required(),mcp.Description("IP address to query"),),)// Add tool handlers.AddTool(tool, ipQueryHandler)// Start the stdio serverif err := server.ServeStdio(s); err != nil {fmt.Printf("Server error: %v\n", err)}
}func ipQueryHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {ip, ok := request.Params.Arguments["ip"].(string)if !ok {return nil, errors.New("ip must be a string")}parsedIP := net.ParseIP(ip)if parsedIP == nil {return nil, errors.New("invalid IP address")}resp, err := http.Get("https://ip.rpcx.io/api/ip?ip=" + ip)if err != nil {return nil, fmt.Errorf("Error fetching IP information: %v", err)}defer resp.Body.Close()data, err := io.ReadAll(resp.Body)if err != nil {return nil, fmt.Errorf("Error reading response body: %v", err)}fmt.Printf("call ip: %s  Response body: %s\n", ip, string(data))return mcp.NewToolResultText(string(data)), nil
}

然后我们编译代码:

# 执行命令编译mcp server
go build -o mcp-ip main.go

在这里插入图片描述

2. 桌面版调用mcp server插件

这里使用桌面版的deepchat来演示大模型调用mcp server。

deepchat下载地址:https://deepchat.thinkinai.xyz/#/download

  1. 下载后配置本地大模型(通过ollama方式搭建等)或者直接配置远程模型地址

远程模型这里我使用openrouter的免费deepseek-r1版本:https://openrouter.ai/deepseek/deepseek-r1:free

  1. 选择模型,配置URL以及Token后,点击校验
    在这里插入图片描述
  2. 点击下一步,然后就可以与大模型对话了
    在这里插入图片描述

tips:

  1. 可修改页面文字为中文
    在这里插入图片描述
  2. 可修改对话模型
    在这里插入图片描述
  1. 下面我们配置mcp server
    在这里插入图片描述
  2. 跳过json方式配置,转为手动配置
    在这里插入图片描述
  3. 填写mcp server配置参数,然后点击提交
    在这里插入图片描述
  4. 启用mcp server
    在这里插入图片描述
  5. 输入问题,查看效果

如:帮我查询39.156.66.10 IP信息

在这里插入图片描述

参考文章:
https://mcp-docs.cn/introduction
https://mp.weixin.qq.com/s/UgdXztu3SKYMs56DqiX3Sg
https://www.junki.cn/archives/Zqgi7fzK

http://www.dtcms.com/a/503929.html

相关文章:

  • LLMs-from-scratch(第4章:从零开始实现GPT模型以生成文本)
  • 密钥管理:AWS KMS信封加密,数据密钥轮换?
  • 单独复习一下 BCD码 和 余3码 的关系
  • 1. Qt 基础
  • 网站专题策划方案书直播app开发教程
  • Process Monitor 学习笔记(5.15):三大经典实战(文件被占用 / 启动慢 / 权限失败)与标准排错流程
  • 福建省晋江市建设局网站想学python从哪里入手
  • 做网站的语言叫什么多个wordpress
  • 建网站要多少钱 优帮云百度上找不到网站
  • 泰兴做网站的公司搜狐快站建站
  • 手机网站模板下载免费.net 网站模板 下载
  • 设备健康管理大数据平台:工业智能化的核心数据引擎​
  • T247867 05-06-D03-海狸咬树(选做)(L5)
  • JAVA 架构师面试题含答案:JVM+spring+ 分布式 + 并发编程
  • 19.6 《3步攻克语音输入提示工程:智能纠错+多模态融合实战全解》
  • 怎么样自己创建网站古焰传奇
  • DTAS 3D-尺寸公差分析软件-如何提高工作效率?
  • 防火墙的白名单和黑名单
  • C#编写的WebApi接口直接返回byte数组引发的问题
  • 室内设计素材网站推荐品牌设计有哪些
  • 厦门市集美区建设局网站网络营销模式的建议
  • 网站建设哪些是需要外援的问题专业设计vi公司
  • 面向对象OOP
  • FFmpeg 基本API avcodec_alloc_context3函数内部调用流程分析
  • 多传感器信息融合---深度学习
  • 成都市网站建设公司怎么建立公众号写文章
  • 做百度移动端网站排名如何自创软件
  • 2014年数据结构应用题深度解析
  • 如何弄自己的公司网站搜索引擎网站建设公司
  • 【中国太平洋人寿保险-注册/登录安全分析报告】