go构建sse服务端

news/2025/10/27 23:16:19/文章来源:https://www.cnblogs.com/jiftle/p/19170429
package mainimport ("context""errors""fmt""log""net/http""os""os/signal""syscall""time""github.com/ThinkInAIXYZ/go-mcp/protocol""github.com/ThinkInAIXYZ/go-mcp/server""github.com/ThinkInAIXYZ/go-mcp/transport""github.com/gin-gonic/gin"
)type currentTimeReq struct {Timezone string `json:"timezone" description:"current time timezone"`
}func main() {messageEndpointURL := "/message"sseTransport, mcpHandler, err := transport.NewSSEServerTransportAndHandler(messageEndpointURL)if err != nil {log.Panicf("new sse transport and hander with error: %v", err)}mcpServer, err := server.NewServer(sseTransport,server.WithServerInfo(protocol.Implementation{Name:    "mcp-example",Version: "1.0.0",}),)if err != nil {panic(err)}tool, err := protocol.NewTool("current_time", "Get current time with timezone, Asia/Shanghai is default", currentTimeReq{})if err != nil {panic(fmt.Sprintf("Failed to create tool: %v", err))}mcpServer.RegisterTool(tool, currentTime)router := gin.Default()router.GET("/sse", func(ctx *gin.Context) {mcpHandler.HandleSSE().ServeHTTP(ctx.Writer, ctx.Request)})router.POST(messageEndpointURL, func(ctx *gin.Context) {mcpHandler.HandleMessage().ServeHTTP(ctx.Writer, ctx.Request)})httpServer := &http.Server{Addr:        ":8080",Handler:     router,IdleTimeout: time.Minute,}errCh := make(chan error, 3)go func() {errCh <- mcpServer.Run()}()go func() {if err = httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {errCh <- err}}()if err = signalWaiter(errCh); err != nil {panic(fmt.Sprintf("signal waiter: %v", err))}ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)defer cancel()httpServer.RegisterOnShutdown(func() {if err = mcpServer.Shutdown(ctx); err != nil {panic(err)}})if err = httpServer.Shutdown(ctx); err != nil {panic(err)}
}func currentTime(_ context.Context, request *protocol.CallToolRequest) (*protocol.CallToolResult, error) {req := new(currentTimeReq)if err := protocol.VerifyAndUnmarshal(request.RawArguments, &req); err != nil {return nil, err}text := fmt.Sprintf(`current time is %s`, time.Now().Format(time.DateTime))fmt.Println(text)return &protocol.CallToolResult{Content: []protocol.Content{&protocol.TextContent{Type: "text",Text: text,},},}, nil
}func signalWaiter(errCh chan error) error {signalToNotify := []os.Signal{syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM}if signal.Ignored(syscall.SIGHUP) {signalToNotify = []os.Signal{syscall.SIGINT, syscall.SIGTERM}}signals := make(chan os.Signal, 1)signal.Notify(signals, signalToNotify...)select {case sig := <-signals:switch sig {case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM:log.Printf("Received signal: %s\n", sig)// graceful shutdownreturn nil}case err := <-errCh:return err}return nil
}
```go

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结对编程心得

电梯调度系统项目文档项目仓库地址:https://z.gitee.cn/zgca/repos/zgca/elevator_arrange/blob/develop/ 队友博客参考:CSDN 博客链接1. 项目简介 本项目作为《现代软件工程》课程核心大作业,由三人团队采用结对编…

关于结对编程的一些感悟

为期一个月的结对编程落下帷幕。 看到其他组的合作,了解到了团队合作的重要性。 助教京哥真的是相当负责,我是个新手,很多问题都请教了助教,助教总是帮助我解决了很多问题。 可惜结对编程没做太好,下面进行项目总…

关联子查询

关联子查询是一种依赖外部查询结果的子查询,它的核心特点是:子查询中会引用外部查询的表或字段,因此会针对外部查询的每一行数据,动态执行一次子查询,形成“内外联动”的关系。 关键特点:依赖外部查询:子查询的…

AI概念

LLM 大型语言模型(Large Language Model)的缩写。是一种通过海量文本数据训练,能够理解和生成人类语言的人工智能系统token AI大模型调用中,模型处理文本的基本单位。各家算法切字逻辑,但是大致一个token约等于一个…

工控modBus TCP, 服务端或客户端, 均可以与PHP 通讯

一. 搭建socket服务器,地址是:192.168.18.83,端口是4444;二. 或TCP网络助手, 地址是:192.168.18.83,端口是:4444;三. 在PHP服务器中, cURL模拟发送POST, 请求参数为: {"a":"b"};四. 请求一次PHP, …

[Mirror] LinuxMirrors: Linux 一键换源项目

[Mirror] LinuxMirrors: Linux 一键换源项目$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");目录01 简介1.1 项目地址1.2 官方网站02 更换 Linux 镜像源03 安…

10月27日日记

1.今天学习java 2.明天工程实训 3.Spring 等框架中,依赖注入失败

20232326 2025-2026-1 《网络与系统攻防技术》实验三实验报告

一、实验内容与问题回答 1.1 实验核心内容 (1)使用msfvenom及编码器生成多格式恶意文件,验证编码免杀效果; (2)通过Veil-Evasion工具生成自定义免杀Payload; (3)手动编写C语言加载器执行Shellcode,实现底层免…

20232309 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1学习内容 1.msfvenom的使用 2.veil的下载和使用 1.2问题回答 1.杀软是如何检测出恶意代码的?特征码检测:通过比对文件或程序的静态特征(如特定字符串、哈希值、代码片段)与病毒库中的已知恶意代码特…

应急响应特洛伊挖矿木马

州弟应急响应|特洛伊挖矿木马 前言 被感染主程序会释放/tmp/随机命名挖矿文件 产生的crontab无法下载与删除 被感染的git程序环境:特洛伊挖矿木马事件排查 还记得我们上一次的挖矿环境吗,上一次算是最简单的挖矿环境…

20232429 马成栋 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 问题回答: (1)杀软是如何检测出恶意代码的? 1.特征码检测,2.行为分析检测,3.启发式检测。 (2)免杀是做什么? 免杀本质是“让恶意代码绕过杀软检测的技术手段”,但需明确其合法边界。 (3)免杀的…

做题记录 #4

A. P11364 树上查询 (7) 一开始想着直接转 dfn 好处理一个区间的 LCA,因为编号区间可以直接变成区间最大最小 dfn 中最小 dep。但是若是想要维护,很难不上一些笛卡尔树和单调栈。玩一玩想一想发现根本想不到一个性质…

扩散模型

论文:《Denoising Diffusion Probabilistic Models》(DDPM, NeurIPS 2020) 简述: (大白话) 训练阶段:首先是将图片一步步进行加noise,将每一步加入noise生成的像素图片进行去噪,目标是预测噪声;预测阶段:从…

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1. 实验内容 本次实验的名称为免杀原理与实践,通过本部分内容的学习,能够掌握免杀原理与技术,认识到杀软局限性,提高在工作生活中对于恶意软件防范能力…

《程序员修炼之道》阅读笔记2

书里反复强调,程序员不能把学习停留在 “够用就好” 的层面,因为技术行业的迭代速度太快了 —— 今天课堂上教的热门框架,可能几年后就会被更高效的工具替代;现在觉得 “用不上” 的底层原理,说不定哪天就成了解决…

算法分析--分治--1.二分搜索

难题被逐层拆解,每一次的拆解都使它变得更为简单。分而治之揭示了一个重要的事实:从简单做起,一切都不再复杂。 1.1 分治算法 分治 是一种非常常见的算法策略。 分:将整个问题划分为多个小问题。 治:从小问题开始…

衡量模型生成图片质量的指标

FID 是生成图像和真实图像在特征空间中的分布距离。(越小越好)1.FID 假设生成图像和真实图像在特征空间的分布都是高斯分布,然后计算这两个高斯分布的距离。 CLIP是什么?(对比语言图像预训练)它有image Encoder …