<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>技术 on Billy's Blog</title><link>https://virgoc0der.github.io/categories/%E6%8A%80%E6%9C%AF/</link><description>Recent content in 技术 on Billy's Blog</description><generator>Hugo</generator><language>zh-CN</language><managingEditor>billychen826@gmail.com (Billy)</managingEditor><webMaster>billychen826@gmail.com (Billy)</webMaster><lastBuildDate>Thu, 08 May 2025 14:30:00 +0800</lastBuildDate><atom:link href="https://virgoc0der.github.io/categories/%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>使用Go实现业务的多国本土化适配方案</title><link>https://virgoc0der.github.io/posts/go-i18n-localization/</link><pubDate>Thu, 08 May 2025 14:30:00 +0800</pubDate><author>billychen826@gmail.com (Billy)</author><guid>https://virgoc0der.github.io/posts/go-i18n-localization/</guid><description>&lt;h1 id="使用go实现业务的多国本土化适配方案">使用Go实现业务的多国本土化适配方案&lt;/h1>
&lt;p>在当今全球化的市场环境中，将产品或服务扩展到不同国家和地区已经成为众多企业的重要战略。然而，这一过程中面临的本土化挑战不容忽视。本文将探讨如何利用Go语言构建一套灵活、高效的多国本土化适配系统，从架构设计到具体实现，全方位解析国际化(i18n)与本土化(l10n)的最佳实践。&lt;/p>
&lt;h2 id="1-理解i18n与l10n的区别">1. 理解i18n与l10n的区别&lt;/h2>
&lt;p>在开始之前，我们需要明确两个概念：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>国际化(Internationalization, i18n)&lt;/strong>: 是指设计和开发产品时，使其能够适应不同的语言和地区，而无需进行工程上的修改。&lt;/li>
&lt;li>&lt;strong>本土化(Localization, l10n)&lt;/strong>: 是指使产品适应特定地区或语言的过程，包括翻译文本、调整日期/时间格式、货币符号等。&lt;/li>
&lt;/ul>
&lt;p>简单来说，国际化是一次性的工程设计，而本土化是针对每个市场的持续适配过程。&lt;/p>
&lt;h2 id="2-go语言的本土化工具生态">2. Go语言的本土化工具生态&lt;/h2>
&lt;p>Go语言有丰富的本土化工具生态系统，以下是几个流行的库：&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/nicksnyder/go-i18n">go-i18n&lt;/a>：强大的i18n库，支持复数形式和消息格式。&lt;/li>
&lt;li>&lt;a href="https://github.com/leonelquinteros/gotext">gotext&lt;/a>：Go的gettext支持。&lt;/li>
&lt;li>&lt;a href="https://github.com/m1/go-localize">go-localize&lt;/a>：简单易用的本土化库。&lt;/li>
&lt;li>&lt;a href="https://github.com/projectfluent/fluent-go">fluent&lt;/a>：Mozilla的Fluent本土化系统的Go实现。&lt;/li>
&lt;/ul>
&lt;p>在本文中，我们将主要使用&lt;code>go-i18n&lt;/code>构建我们的多国本土化系统。&lt;/p>
&lt;h2 id="3-构建多国本土化架构">3. 构建多国本土化架构&lt;/h2>
&lt;h3 id="31-整体架构设计">3.1 整体架构设计&lt;/h3>
&lt;p>一个完善的多国本土化系统应当具备以下特点：&lt;/p>
&lt;ul>
&lt;li>易于扩展：添加新语言不需要修改代码&lt;/li>
&lt;li>高性能：翻译查找应该是高效的&lt;/li>
&lt;li>灵活性：支持各种本土化需求，从简单文本到复杂内容&lt;/li>
&lt;li>开发友好：对开发人员友好，便于维护&lt;/li>
&lt;/ul>
&lt;p>以下是我们要构建的架构图：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>┌─────────────────┐ ┌──────────────────┐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ HTTP/API 请求 │─────▶│ 语言检测中间件 │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└─────────────────┘ └──────────┬───────┘
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ▼
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>┌─────────────────┐ ┌──────────────────┐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ 翻译文件 │◀────▶│ 本土化服务 │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ (JSON/YAML) │ │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└─────────────────┘ └──────────┬───────┘
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ▼
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>┌─────────────────┐ ┌──────────────────┐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ 缓存层 │◀────▶│ 业务逻辑层 │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└─────────────────┘ └──────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="32-项目结构">3.2 项目结构&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>project/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── cmd/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── server/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── main.go
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── internal/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── config/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ └── config.go
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── handler/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ └── handler.go
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── middleware/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ └── locale.go
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── model/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ └── model.go
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── service/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── localization.go
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── locales/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── en.json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── zh-CN.json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── ja.json
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── ...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── go.mod
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└── go.sum
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-实现关键组件">4. 实现关键组件&lt;/h2>
&lt;h3 id="41-配置国际化服务">4.1 配置国际化服务&lt;/h3>
&lt;p>首先，我们来实现本土化服务的核心组件：&lt;/p></description></item><item><title>使用Go实现业务多国本土化：策略模式、依赖注入与i18n集成实战</title><link>https://virgoc0der.github.io/posts/go-multilingual-localization/</link><pubDate>Thu, 08 May 2025 10:00:00 +0800</pubDate><author>billychen826@gmail.com (Billy)</author><guid>https://virgoc0der.github.io/posts/go-multilingual-localization/</guid><description>&lt;h1 id="使用go实现业务多国本土化策略模式依赖注入与i18n集成实战">使用Go实现业务多国本土化：策略模式、依赖注入与i18n集成实战&lt;/h1>
&lt;p>在当今全球化的商业环境中，将产品和服务本土化以适应不同国家和地区的需求已成为企业扩张的必要步骤。然而，从技术角度来看，实现多国本土化不仅仅是简单的翻译问题，更涉及到如何优雅地处理各国在业务逻辑、法规要求、支付方式等方面的差异。本文将探讨如何使用Go语言构建一个灵活的多国本土化框架，通过策略模式、依赖注入和i18n集成来实现可扩展的国际化应用。&lt;/p>
&lt;h2 id="目录">目录&lt;/h2>
&lt;ol>
&lt;li>&lt;a href="#%E4%B8%9A%E5%8A%A1%E5%9B%BD%E9%99%85%E5%8C%96%E7%9A%84%E6%8C%91%E6%88%98">业务国际化的挑战&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%80%BB%E4%BD%93%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1">总体架构设计&lt;/a>&lt;/li>
&lt;li>&lt;a href="#i18n%E5%AE%9E%E7%8E%B0%E6%96%87%E6%9C%AC%E5%92%8C%E6%B6%88%E6%81%AF%E5%9B%BD%E9%99%85%E5%8C%96">i18n实现：文本和消息国际化&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F%E5%AE%9E%E7%8E%B0%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E5%B7%AE%E5%BC%82%E5%8C%96">策略模式实现业务逻辑差异化&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BD%BF%E7%94%A8%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%E7%AE%A1%E7%90%86%E5%A4%9A%E5%9B%BD%E7%AD%96%E7%95%A5">使用工厂模式管理多国策略&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E4%B8%8Ewire%E9%9B%86%E6%88%90">依赖注入与Wire集成&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AE%9E%E6%88%98%E6%A1%88%E4%BE%8B%E5%9B%BD%E9%99%85%E5%8C%96%E6%94%AF%E4%BB%98%E7%B3%BB%E7%BB%9F">实战案例：国际化支付系统&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%B5%8B%E8%AF%95%E4%B8%8E%E7%BB%B4%E6%8A%A4">测试与维护&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%80%BB%E7%BB%93%E4%B8%8E%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">总结与最佳实践&lt;/a>&lt;/li>
&lt;/ol>
&lt;h2 id="业务国际化的挑战">业务国际化的挑战&lt;/h2>
&lt;p>在开始技术实现之前，让我们先明确多国本土化面临的主要挑战：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>语言和文本翻译&lt;/strong> - 最基本的国际化需求，涉及UI、错误信息、通知等&lt;/li>
&lt;li>&lt;strong>日期、时间和货币格式&lt;/strong> - 不同国家有不同的显示偏好&lt;/li>
&lt;li>&lt;strong>业务规则差异&lt;/strong> - 各国法规、税务、隐私政策可能有很大不同&lt;/li>
&lt;li>&lt;strong>支付方式和流程&lt;/strong> - 每个国家流行的支付方式往往不同&lt;/li>
&lt;li>&lt;strong>地区特定功能&lt;/strong> - 某些功能可能只在特定国家可用&lt;/li>
&lt;li>&lt;strong>可扩展性&lt;/strong> - 系统需要能够轻松添加新的国家或地区支持&lt;/li>
&lt;/ol>
&lt;p>接下来，我们将探讨如何使用Go的各种设计模式和工具来解决这些挑战。&lt;/p>
&lt;h2 id="总体架构设计">总体架构设计&lt;/h2>
&lt;p>我们的多国本土化框架将基于以下核心原则：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>关注点分离&lt;/strong> - 将翻译、业务逻辑、配置等分开处理&lt;/li>
&lt;li>&lt;strong>策略模式&lt;/strong> - 使用接口定义标准行为，每个国家实现自己的策略&lt;/li>
&lt;li>&lt;strong>工厂模式&lt;/strong> - 根据国家/地区代码创建适当的策略实现&lt;/li>
&lt;li>&lt;strong>依赖注入&lt;/strong> - 使用Wire自动组装各个组件&lt;/li>
&lt;li>&lt;strong>配置驱动&lt;/strong> - 使用配置文件管理国家特定设置&lt;/li>
&lt;/ol>
&lt;p>下面是整体架构的简化视图：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>┌───────────────┐ ┌─────────────────┐ ┌───────────────┐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ 国家检测服务 ├─────►│ 策略工厂服务 ├─────►│ 具体国家策略 │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└───────┬───────┘ └─────────────────┘ └───────┬───────┘
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>┌───────▼───────┐ ┌─────────────────┐ ┌───────▼───────┐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ i18n服务 │◄─────┤ 业务服务 ├─────►│ 支付服务 │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ │ │ │ │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└───────────────┘ └─────────────────┘ └───────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>接下来，我们将逐一实现这些组件。&lt;/p></description></item><item><title>使用Go开发MCP并接入Claude Desktop：go-mcp库实践</title><link>https://virgoc0der.github.io/posts/go-mcp-claude/</link><pubDate>Tue, 08 Apr 2025 15:30:00 +0800</pubDate><author>billychen826@gmail.com (Billy)</author><guid>https://virgoc0der.github.io/posts/go-mcp-claude/</guid><description>&lt;h2 id="引言">引言&lt;/h2>
&lt;p>人工智能助手如Claude已经成为我们日常工作的重要工具，但其能力往往受限于预设功能。通过Model Completion Protocol (MCP)，我们可以显著扩展AI助手的能力边界，使其能够执行更多实用的任务。本文将详细介绍如何使用go-mcp开源库在Go语言环境下开发MCP服务，并将其成功接入Claude Desktop，实现与本地应用程序的交互。&lt;/p>
&lt;h2 id="mcp协议简介">MCP协议简介&lt;/h2>
&lt;p>Model Completion Protocol (MCP)是一个允许AI助手与外部工具进行交互的协议。通过MCP，Claude等AI助手可以：&lt;/p>
&lt;ul>
&lt;li>调用外部工具和API&lt;/li>
&lt;li>访问本地系统资源&lt;/li>
&lt;li>执行特定的计算任务&lt;/li>
&lt;li>获取和处理实时数据&lt;/li>
&lt;/ul>
&lt;p>这使得Claude能够突破知识截止日期的限制，获取最新信息，并执行需要额外计算能力或系统访问权限的任务。&lt;/p>
&lt;h2 id="go-mcp库介绍">go-mcp库介绍&lt;/h2>
&lt;p>&lt;a href="https://github.com/virgoC0der/go-mcp">go-mcp&lt;/a>是一个基于Go语言的MCP协议实现库，它提供了一套完整的API用于开发MCP服务。使用go-mcp，开发者可以轻松地创建自定义工具，并将这些工具无缝集成到Claude Desktop中。&lt;/p>
&lt;p>该库的主要特点包括：&lt;/p>
&lt;ul>
&lt;li>完整实现MCP协议规范&lt;/li>
&lt;li>支持HTTP和stdio两种通信方式&lt;/li>
&lt;li>灵活的服务端架构&lt;/li>
&lt;li>内置请求验证和错误处理&lt;/li>
&lt;li>类型安全的API设计&lt;/li>
&lt;/ul>
&lt;h2 id="开发环境准备">开发环境准备&lt;/h2>
&lt;p>在开始开发之前，我们需要准备以下环境：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#414868;font-style:italic"># 安装Go (确保版本至少为1.18)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>brew install go
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#414868;font-style:italic"># 克隆go-mcp仓库&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git clone https://github.com/virgoC0der/go-mcp.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#9ece6a">cd&lt;/span> go-mcp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#414868;font-style:italic"># 安装依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>go mod tidy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="实现应用启动器mcp服务">实现应用启动器MCP服务&lt;/h2>
&lt;p>参考go-mcp仓库中的examples/app-launcher示例，我们来实现一个应用启动器MCP服务，这个服务将允许Claude Desktop打开本地应用程序。&lt;/p>
&lt;h3 id="1-创建项目结构">1. 创建项目结构&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir claude-app-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#9ece6a">cd&lt;/span> claude-app-launcher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>go mod init github.com/yourusername/claude-app-launcher
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-实现服务结构">2. 实现服务结构&lt;/h3>
&lt;p>首先，让我们实现一个满足MCP协议要求的服务结构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#7dcfff">package&lt;/span> main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#7dcfff">import&lt;/span> (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;context&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;encoding/json&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;fmt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;log&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;os&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;os/exec&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;os/signal&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;runtime&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;sync&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;syscall&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;github.com/virgoC0der/go-mcp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;github.com/virgoC0der/go-mcp/internal/types&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#9ece6a">&amp;#34;github.com/virgoC0der/go-mcp/transport&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#414868;font-style:italic">// AppLauncherServer implements the MCP service interface&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#9d7cd8">type&lt;/span> AppLauncherServer &lt;span style="color:#9d7cd8">struct&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	prompts []types.Prompt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	tools []types.Tool
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	resources []types.Resource
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#414868;font-style:italic">// NewAppLauncherServer creates a new app launcher server instance&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#9d7cd8">func&lt;/span> &lt;span style="color:#7aa2f7">NewAppLauncherServer&lt;/span>() &lt;span style="color:#9ece6a;font-weight:bold">*&lt;/span>AppLauncherServer {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	s &lt;span style="color:#9ece6a;font-weight:bold">:=&lt;/span> &lt;span style="color:#9ece6a;font-weight:bold">&amp;amp;&lt;/span>AppLauncherServer{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#414868;font-style:italic">// 定义支持的提示&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		prompts: []types.Prompt{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				Name: &lt;span style="color:#9ece6a">&amp;#34;openApp&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				Description: &lt;span style="color:#9ece6a">&amp;#34;Open a macOS application&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				Arguments: []types.PromptArgument{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>					{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>						Name: &lt;span style="color:#9ece6a">&amp;#34;appName&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>						Description: &lt;span style="color:#9ece6a">&amp;#34;Name of the application to open&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>						Required: &lt;span style="color:#e0af68">true&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>					},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#414868;font-style:italic">// 定义支持的工具&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		tools: []types.Tool{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				Name: &lt;span style="color:#9ece6a">&amp;#34;openApp&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				Description: &lt;span style="color:#9ece6a">&amp;#34;Open a macOS application&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				InputSchema: &lt;span style="color:#9d7cd8">map&lt;/span>[&lt;span style="color:#41a6b5">string&lt;/span>]&lt;span style="color:#9d7cd8">interface&lt;/span>{}{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>					&lt;span style="color:#9ece6a">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#9ece6a">&amp;#34;object&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>					&lt;span style="color:#9ece6a">&amp;#34;properties&amp;#34;&lt;/span>: &lt;span style="color:#9d7cd8">map&lt;/span>[&lt;span style="color:#41a6b5">string&lt;/span>]&lt;span style="color:#9d7cd8">interface&lt;/span>{}{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>						&lt;span style="color:#9ece6a">&amp;#34;appName&amp;#34;&lt;/span>: &lt;span style="color:#9d7cd8">map&lt;/span>[&lt;span style="color:#41a6b5">string&lt;/span>]&lt;span style="color:#9d7cd8">interface&lt;/span>{}{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>							&lt;span style="color:#9ece6a">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#9ece6a">&amp;#34;string&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>							&lt;span style="color:#9ece6a">&amp;#34;description&amp;#34;&lt;/span>: &lt;span style="color:#9ece6a">&amp;#34;Name of the application to open&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>						},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>					},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>					&lt;span style="color:#9ece6a">&amp;#34;required&amp;#34;&lt;/span>: []&lt;span style="color:#41a6b5">string&lt;/span>{&lt;span style="color:#9ece6a">&amp;#34;appName&amp;#34;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		&lt;span style="color:#414868;font-style:italic">// 定义支持的资源&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		resources: []types.Resource{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				URI: &lt;span style="color:#9ece6a">&amp;#34;apps&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				Name: &lt;span style="color:#9ece6a">&amp;#34;apps&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				Description: &lt;span style="color:#9ece6a">&amp;#34;List of common macOS applications&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>				MimeType: &lt;span style="color:#9ece6a">&amp;#34;application/json&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>			},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>		},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&lt;span style="color:#bb9af7">return&lt;/span> s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-实现服务接口方法">3. 实现服务接口方法&lt;/h3>
&lt;p>接下来，我们需要实现MCP服务接口所需的各种方法：&lt;/p></description></item><item><title>Claude+MCP一键生成博客：AI助力内容创作与自动化部署</title><link>https://virgoc0der.github.io/posts/claude-mcp-blog-automation/</link><pubDate>Mon, 31 Mar 2025 10:00:00 +0800</pubDate><author>billychen826@gmail.com (Billy)</author><guid>https://virgoc0der.github.io/posts/claude-mcp-blog-automation/</guid><description>&lt;h1 id="claudemcp一键生成博客ai助力内容创作与自动化部署">Claude+MCP一键生成博客：AI助力内容创作与自动化部署&lt;/h1>
&lt;p>在这个信息爆炸的时代，高效地创建和发布内容已成为许多创作者的迫切需求。今天，我想分享一个结合了AI大语言模型Claude和Model Context Protocol (MCP)的强大工作流，它可以让你以惊人的速度从创意到发布完成整个博客创作过程。&lt;/p>
&lt;h2 id="工作流概述">工作流概述&lt;/h2>
&lt;p>这个一键式博客生成和部署流程包含三个主要步骤：&lt;/p>
&lt;ol>
&lt;li>使用Claude生成高质量的博客内容并保存为Markdown文件&lt;/li>
&lt;li>通过MCP desktop-commander自动推送到GitHub仓库并触发GitHub Actions&lt;/li>
&lt;li>利用MCP playwright自动检查部署结果&lt;/li>
&lt;/ol>
&lt;p>这个过程完全自动化，从内容创建到部署验证，几乎不需要人工干预。&lt;/p>
&lt;h2 id="配置mcp工具">配置MCP工具&lt;/h2>
&lt;p>要开始使用这个工作流，首先需要在Claude客户端中配置MCP工具。步骤如下：&lt;/p>
&lt;ol>
&lt;li>打开Claude客户端&lt;/li>
&lt;li>点击Settings -&amp;gt; Developer -&amp;gt; Edit Config&lt;/li>
&lt;li>输入以下配置：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;mcpServers&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;fileSystme&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#9ece6a">&amp;#34;npx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;args&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;-y&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;@modelcontextprotocol/server-filesystem&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;YOUR PATH&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;playwright&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#9ece6a">&amp;#34;npx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;args&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;@playwright/mcp@latest&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;desktop-commander&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;command&amp;#34;&lt;/span>: &lt;span style="color:#9ece6a">&amp;#34;npx&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb9af7">&amp;#34;args&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;-y&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;@smithery/cli@latest&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;run&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;@wonderwhy-er/desktop-commander&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;--key&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#9ece6a">&amp;#34;YOUR PERSONAL KEY&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个配置告诉Claude如何与三个关键MCP工具通信：&lt;/p></description></item></channel></rss>