将 MCP Server 提交到 MCP Registry
前言 MCP Registry 是 MCP 官方提供的一个 提供 MCP Server 的平台,开发者可以将自己开发的 MCP Server 提交到 MCP Registry 以便其他用户可以方便的使用,MCP Registry 于 2025年 9月 8号推出了预览版,本文就讲述如何将自己开发的 MCP Server 提交到 MCP Registry。 提交 MCP Server 本文所使用的 MCP Server 是 qweather-mcp-go ,是一个使用 Node.js 开发的 MCP Server, 环境是 windows 11, 其他系统类似。 安装 Publisher CLI 要提交 MCP Server 需要使用安装使用 Publisher CLI macOS/Linux/WSL 使用 Homebrew 安装: brew install mcp-publisher macOS/Linux/WSL 使用预编译的二进制文件安装: # 下载最新版本的预编译二进制文件 curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/ macOS/Linux/WSL 使用源码安装: 需要 Git、Make 和 Go 1.24 以上版本 ...
Zed acp-claude-code
前言 zed 在 0.201.4 版本推出了应用 Agent Client Protocol (ACP) 协议的第一个正式版本,Agent Client Protocol (ACP) 是一个将外部 Agents 与编辑器集成的开放协议,zed 在这个版本中集成了 Google Gemini CLI , 开发者可以自己开发兼容 ACP 的自定义代理,本文就是讲述如何安装配置 acp-claude-code 以在 zed 更方便的使用 Claude Code. 配置 acp-claude-code 的配置很简单,打开 zed 的设置,填入设置: { "agent_servers": { "Claude Code": { "command": "npx", "args": ["acp-claude-code"] } } } 设置完打开 Agent 面板就可以看到外部 Agents的选项中已有 Claude Code 选项。 新建 Claude Code 线程,发现报错了,提示 program not found 。 根据以往的经验,这种错误主要发生在 windows 系统上,windows 系统的用户应该使用如下配置。 ...
Enhancing qweather-mcp-go
前言 Claude Code 是 Anthropic 公司开发的 AI 编程工具,它在终端运行,能理解整个项目架构,通过自然语言指令进行代码生成、Bug 修复、Git 操作和自动化开发流程,显著提升开发效率。它支持 macOS、Ubuntu 和 Windows (WSL),并提供按量付费或包月订阅模式。 本文将使用 Claude Code 来增强 qweather-mcp-go 项目,qweather-mcp-go 是一个 mcp 工具,可以方便的查询天气情况等数据。本文将一步步使用 Claude Code 来为 qweather-mcp-go 添加 Streamable HTTP 的支持。 开始 开始编写代码之前,介绍一下使用的工具及环境: 开发工具: zed mcp: context7 、 server-sequential-thinking AI 编程工具: claude code 模型: claude-sonnet-4 qweather-mcp-go 当前只支持 stdio 和 sse 协议,我们来为它添加 streamable http 的支持。 初始化项目 打开终端,输入 /init 初始化项目,会在项目中生成 CLAUDE.md 文件,使 Claude Code 能够快速理解项目。 实现 在 Claude Code 中输入以下内容: 请按照以下步骤实现 Streamable HTTP 支持: 1. 首先阅读 GitHub issue:https://github.com/overstarry/qweather-mcp-go/issues/4,理解具体的需求和期望的功能 2. 使用 context7 工具获取 github.com/mark3labs/mcp-go 库中与 Streamable HTTP 相关的 API 文档,重点关注: - 流式 HTTP 请求和响应的接口定义 - 相关的结构体、方法和配置选项 - 使用示例和最佳实践 3. 基于获取的文档信息,分析当前 qweather-mcp-go 项目的代码结构,确定需要修改的文件和组件 4. 提出一个详细的实现方案,包括: - 需要实现的具体功能点 - 代码架构设计 - 主要的实现步骤 - 可能遇到的技术挑战和解决方案 5. 在开始编码前,先展示完整的实现计划供确认 输入后可以看到 Claude Code 会创建计划来一步步实现需求。 ...
Docker Push Error
问题 最近升级 Docker-Desktop 后,发现 push 镜像到 nexus 注册表时,报错如下: error from registry: unknown 升级到 v4.42.1 时,甚至出现镜像不能顺利上传的问题。 解决 通过查阅相关 issue , 发现是 nexus 版本太低,不支持目前主流的 OCI 镜像标准,如果想要解决,可以有两种方法解决: 1 升级 nexus 版本,从稳定版 Nexus 3.47.1 支持 OCI,升级到此版本以上即可解决。 2 通过 –provenance=false 参数解决,–provenance 标志是 docker buildx build 命令的一个选项,用于控制是否生成 provenance 凭证 。它是 –attest=type=provenance 的简写形式 。 启用 Provenance (默认行为): 在较新版本的 Buildx 中,provenance 凭证是默认启用的 。您也可以显式地使用 true 来启用它,这会以 mode=min 的模式附加凭证 为了兼容旧的镜像仓库,可以禁用。 小结 本文讲述了在使用 docker push 时遇到由于注册表版本太低导致的推送镜像失败问题,并提出了两个解决方案,对于两个方案,如果允许升级的话,最好还是更新 nexus 版本来解决,不能升级的话可以使用 –provenance=false 参数解决。 参考 https://github.com/docker/build-push-action/issues/780#issuecomment-1408361775 https://github.com/docker/buildx/issues/1653 https://central.sonatype.org/faq/what-happened-to-issues-sonatype-org/ https://github.com/docker/buildx/issues/1513#issuecomment-1401751716
Dify 学习 - 安装和初探
前言 Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。本篇将介绍如何安装和初步使用 Dify,接下来还会有多篇介绍 Dify 的文章,敬请期待。 安装 接下来介绍如何使用 Docker 安装 Dify。 安装 Docker 在各个操作系统上安装 Docker,可以参考 Docker 官方文档,这里就不进行叙述了。 Clone Dify 仓库 使用命令 git clone https://github.com/langgenius/dify.git 克隆 Dify 仓库。 启动 Dify 进入 Docker 目录,拷贝一份环境变量配置文件,使用 docker compose up -d 命令启动 Dify。 cd dify/docker cp .env.example .env docker compose up -d 过一会儿,使用 docker compose ps 命令查看容器状态,确保所有容器都正常运行。 设置管理员账号 访问 http://localhost/install 设置管理员账号,设置完成之后,访问 http://localhost/signin 即可登录。 ...
使用 gpt 改造你的小米音箱
前言 前段时间看到了一个项目 mi-gpt ,可以将你的小爱音箱接入 gpt,改造成专属于你的语音助手。 接下来就由作者来介绍小爱同学从零接入 deepseek 的过程。 设置环境变量和配置文件 mi-gpt 有两种部署方式,一是使用 docker 部署,二是使用 Node.js 进行部署,本文使用 docker 进行部署使用。 需要提供两个文件 .env 和 .migpt.js 文件,.migpt.js 是配置文件,包括一些配置,.env 是环境变量文件,存放 gpt 密钥相关文件。文件的例子可以从仓库里复制,然后进行相应的修改。 启动 使用以下命令启动 docker: docker run -d --env-file $(pwd)/.env -v $(pwd)/.migpt.js:/app/.migpt.js idootop/mi-gpt:latest windows 环境下需要将$(pwd) 替换为绝对路径。 启动后可以通过 callAIKeywords 设置的关键字调用 ai 来响应用户的消息。 小结 本文介绍了使用 mi-gpt 升级你的闲置的小爱音箱,通过简单的测试和使用,个人感觉还不够完善,稳定性不够好,感兴趣的读者可以根据本文的内容进行自行搭建尝试。 参考 https://github.com/idootop/mi-gpt
node.js 项目构建问题及解决
前言 今天在编译构建一个 node.js 项目时,在构建过程中遇到了一些问题,本文将记录问题及对应的解决方案。 问题 1 在执行 npm run build 遇到此提示: error Expected linebreaks to be 'LF' but found 'CRLF' linebreak-style 根据信息可以看出是 eslint 的报错,查看 .eslintrc.js 文件,修改 linebreak-style 对应的行: 'linebreak-style': ['error', process.platform === 'win32' ? 'windows' : 'unix'], 重新运行命令,顺利构建成功。 这个问题的原因是项目的作者可能是使用 Linux 或 Mac 构建的,没有考虑 Windows 的情况,通过这行配置,可以根据运行的环境来决定 lint 规则。 问题 2 在执行 npm start 遇到了第二个问题: Generating browser application bundles (phase: building)...node:internal/crypto/hash:79 this[kHandle] = new _Hash(algorithm, xofLen, algorithmId, getHashCache()); ^ Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:79:19) at Object.createHash (node:crypto:139:10) at BulkUpdateDecorator.hashFactory (D:\code\xx\node_modules\webpack\lib\util\createHash.js:145:18) at BulkUpdateDecorator.update (D:\code\xx\node_modules\webpack\lib\util\createHash.js:46:50) at RawSource.updateHash (D:\code\xx\node_modules\webpack\node_modules\webpack-sources\lib\RawSource.js:77:8) at NormalModule._initBuildHash (D:\code\xx\node_modules\webpack\lib\NormalModule.js:880:17) at handleParseResult (D:\code\xx\node_modules\webpack\lib\NormalModule.js:946:10) at D:\code\xx\node_modules\webpack\lib\NormalModule.js:1040:4 at processResult (D:\code\xx\node_modules\webpack\lib\NormalModule.js:755:11) at D:\code\xx\node_modules\webpack\lib\NormalModule.js:819:5 { opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error', 'error:0308010C:digital envelope routines::unsupported' ], library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED' } 根据这个报错,推测可能是啥 hash 算法不支持,通过查阅相关资料,得到以下解决方案: ...
go 解析 csv 文件报错
问题 最近在使用 go 解析 csv 文件时,读取并打印 csv 的每行内容时,读取到第 11 行时,程序报错,提示: record on line 11: wrong number of fields 分析 遇到这个问题,我第一反应是 csv 文件的格式有问题,于是我使用 cat 命令查看 csv 文件,发现 csv 文件的格式是正确的,没有问题。 并查看分隔符是正确的,于是可以得出 csv 文件是没有问题的。 接下来就查看所使用的标准库 encoding/csv,通过查阅文档及 issue, 发现 csv 包中的 FieldsPerRecord 字段,FieldsPerRecord 表示 csv 文件每行的预期字段数, 如果为正数,则读取的每条记录都必须有对应的字段数,如果为 0,则会以第一条记录的数量为标准,接下来每行都必须有对应的字段数,如果为负数,则不会检查字段数。 修改后的代码如下: package main import ( "encoding/csv" "fmt" "io" "log" "os" ) func main() { file, err := os.Open("./xx.csv") if err != nil { log.Fatal(err) } defer file.Close() // 创建一个 CSV reader reader := csv.NewReader(file) reader.FieldsPerRecord = -1 // 循环读取 CSV 文件中的每一行数据 for { record, err := reader.Read() if err == io.EOF { break } if err != nil { log.Fatal(err) } // 处理每一行数据 fmt.Println(record) fmt.Println(len(record)) } } 小结 本文记录了在使用 go 解析 csv 时遇到字段数不匹配的问题,并分析了问题的原因,并给出了相应的解决方法。 ...
Go Recivie Email
前言 电子邮件是现代办公和通信中不可或缺的工具,它广泛应用于数据交换和工作沟通。为了更高效地处理邮件内容,我们可以借助程序来实现自动化处理。本文将详细介绍如何使用 Go 语言来接收和处理电子邮件。 通过查阅资料,了解到可以通过 IMAP 协议来接收电子邮件,IMAP 协议是电子邮件接收协议,它允许客户端通过网络连接到邮件服务器,并从服务器上下载邮件。除了 IMAP 协议,还有 POP3 协议,POP3 协议与 IMAP 协议类似,但它在在客户端上对邮件的操作不会反馈到邮件服务器上,也就是说,在客户端的操作不会影响服务器上的邮件。当你需要从多个邮件客户端访问邮件时,IMAP 协议是一个更好的选择。 go-imap 通过对比不同的库,最后选择了 go-imap 库,它是一个基于 IMAP 协议的 Go 语言库,可以通过它构建客户端或者服务端。 安装 可以通过以下命令安装: go get github.com/emersion/go-imap 使用 我们将通过官方的例子进行切入: 先通过 DialTLS 连接对应的电子邮箱 IMAP 服务器,然后通过登录邮箱,获取所有的邮箱文件夹,最后选择收件箱,获取收件箱中最新的 4 封邮件,并打印没封邮件的主题。 运行代码: 2024/11/23 16:16:11 Connecting to server... 2024/11/23 16:16:11 Connected 2024/11/23 16:16:12 Logged in 2024/11/23 16:16:12 Mailboxes: 2024/11/23 16:16:13 * 其他文件夹 2024/11/23 16:16:13 * Drafts 2024/11/23 16:16:13 * Deleted Messages 2024/11/23 16:16:13 * Sent Messages 2024/11/23 16:16:13 * Junk 2024/11/23 16:16:13 * INBOX 2024/11/23 16:16:13 Flags for INBOX: [\Answered \Flagged \Deleted \Draft \Seen] 2024/11/23 16:16:13 Last 4 messages: 2024/11/23 16:16:13 * =?GBK?B?xx?= 2024/11/23 16:16:13 * =?GBK?B?xxx?= 2024/11/23 16:16:13 * =?GBK?B?xx==?= 2024/11/23 16:16:13 * =?GBK?B?xx+k=?= 2024/11/23 16:16:13 Done! 可以看到打印出来的邮件主题是乱码,通过查询资料,了解到邮件的字段是采用特殊编码的,需要进行解码。可以通过 https://github.com/emersion/go-message 这个库进行解码。 ...
go-soap 简介
前言 最近需要调用一个第三方的接口进行数据的采集,这个接口是基于 SOAP 协议的,所以需要使用 soap 相关的客户端进行调用。于是我调研了一些开源的 golang 的 soap 客户端,发现 go-soap 这个库的文档比较完善,而且使用起来也比较简单,所以就选择了这个库。 安装 使用以下命令进行安装: go get github.com/tiaguinho/gosoap 使用 由于目前没有特别好的例子,这里就以官方的例子进行说明。 官方的代码如下: package main import ( "encoding/xml" "log" "net/http" "time" "github.com/tiaguinho/gosoap" ) // GetIPLocationResponse will hold the Soap response type GetIPLocationResponse struct { GetIPLocationResult string `xml:"GetIpLocationResult"` } // GetIPLocationResult will type GetIPLocationResult struct { XMLName xml.Name `xml:"GeoIP"` Country string `xml:"Country"` State string `xml:"State"` } var ( r GetIPLocationResponse ) func main() { httpClient := &http.Client{ Timeout: 1500 * time.Millisecond, } soap, err := gosoap.SoapClient("http://wsgeoip.lavasoft.com/ipservice.asmx?WSDL", httpClient) if err != nil { log.Fatalf("SoapClient error: %s", err) } // Use gosoap.ArrayParams to support fixed position params params := gosoap.Params{ "sIp": "8.8.8.8", } res, err := soap.Call("GetIpLocation", params) if err != nil { log.Fatalf("Call error: %s", err) } res.Unmarshal(&r) // GetIpLocationResult will be a string. We need to parse it to XML result := GetIPLocationResult{} err = xml.Unmarshal([]byte(r.GetIPLocationResult), &result) if err != nil { log.Fatalf("xml.Unmarshal error: %s", err) } if result.Country != "US" { log.Fatalf("error: %+v", r) } log.Println("Country: ", result.Country) log.Println("State: ", result.State) } 可以看到 go-soap 的使用跟常规的 http client 的使用方法类似,都是创建一个连接,准备方法的参数,然后调用相应的方法。 这段代码展示了如何使用 go-soap 库连接 SOAP 服务、发送请求、处理响应,以及如何解析 XML 格式的返回数据。 ...