|
| 1 | +--- |
| 2 | +title: 服务器开发者 |
| 3 | +description: 快速开始 - 服务器开发者 |
| 4 | +--- |
| 5 | + |
| 6 | +开始构建自己的服务器,以便在Claude中用于Desktop和其他客户端。 |
| 7 | + |
| 8 | +在本教程中,我们将构建一个简单的MCP天气服务器,并将其连接到主机Claude for Desktop。我们将从基本设置开始,然后进行更复杂的用例。 |
| 9 | + |
| 10 | +## 我们将要干什么 |
| 11 | +许多LLM(包括Claude)目前无法获取预报和恶劣天气警报。让我们用MCP解决这个问题。 |
| 12 | + |
| 13 | +我们将构建一个server,该server提供两个工具:get-alerts and get-forecast。然后,我们将服务器连接到MCP主机(在本例中使用Claude for Desktop): |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | + |
| 18 | +服务可以连接任何客户端。为了简单起见,我们在这里选择了Claude作为桌面,但我们也有关于[建立自己的client](https://mcp.thinkinai.xyz/docs/quick-start/client-developers)建立自己的client的指南,以及[这里的其他客户列表](https://mcp.thinkinai.xyz/docs/example-clients)。 |
| 19 | + |
| 20 | + |
| 21 | +``` |
| 22 | +为什么选择Claude for DeskTop而不是Claude.ai? |
| 23 | +由于服务器是本地运行的,MCP目前只支持桌面主机。远程主机正在积极开发中。 |
| 24 | +``` |
| 25 | + |
| 26 | +## MCP核心概念 |
| 27 | +MCP服务器可以提供三种主要功能: |
| 28 | + 1. **Resources**:客户端可以读取的类文件数据(如API响应或文件内容) |
| 29 | + 2. **Tools**:LLM可以调用的函数(经用户批准) |
| 30 | + 3. **Prompts**:帮助用户完成特定任务的预先编写的模板 |
| 31 | +本教程将主要关注工具。 |
| 32 | + |
| 33 | +### 基于Java |
| 34 | +这是一个基于Spring AI MCP自动配置和引导启动器的快速入门演示。要了解如何手动创建同步和异步MCP服务器,请参阅[Java SDK服务器](https://modelcontextprotocol.io/sdk/java/mcp-server)文档。 |
| 35 | + |
| 36 | +让我们开始构建一个天气服务【MCP官方代码,支持查询美国天气情况】。 |
| 37 | +[这里的代码也可以](https://github.com/weishuai8888/spring-ai-examples)【fork官方代码后调整了逻辑,支持查询全世界的天气情况】 |
| 38 | + |
| 39 | +有关更多信息,请参阅[MCP Server Boot Starter](https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html)参考文档。有关手动MCP服务器实现,请参阅[MCP Server Java SDK文档](https://modelcontextprotocol.io/sdk/java/mcp-server)。 |
| 40 | + |
| 41 | +#### 系统要求 |
| 42 | +~ |
| 43 | + ● 已安装Java 17或更高版本 |
| 44 | + ● [Spring Boot 3.3.x](https://docs.spring.io/spring-boot/installing.html) 或更高版本 |
| 45 | + |
| 46 | +#### 设置你的环境变量 |
| 47 | +使用 [Spring Initizer](https://start.spring.io) 启动项目。 |
| 48 | + |
| 49 | +你需要添加以下的依赖项: |
| 50 | + |
| 51 | +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; |
| 52 | + |
| 53 | +<Tabs items={['Maven', 'Gradle']}> |
| 54 | + <Tab value="Maven"> |
| 55 | + ```xml |
| 56 | + <dependencies> |
| 57 | + <dependency> |
| 58 | + <groupId>org.springframework.ai</groupId> |
| 59 | + <artifactId>spring-ai-starter-mcp-server</artifactId> |
| 60 | + </dependency> |
| 61 | + |
| 62 | + <dependency> |
| 63 | + <groupId>org.springframework</groupId> |
| 64 | + <artifactId>spring-web</artifactId> |
| 65 | + </dependency> |
| 66 | + </dependencies> |
| 67 | + ``` |
| 68 | + </Tab> |
| 69 | + <Tab value='Gradle'> |
| 70 | + ```xml |
| 71 | + dependencies { |
| 72 | + implementation platform("org.springframework.ai:spring-ai-starter-mcp-server") |
| 73 | + implementation platform("org.springframework:spring-web") |
| 74 | + } |
| 75 | + ``` |
| 76 | + </Tab> |
| 77 | +</Tabs> |
| 78 | + |
| 79 | +然后通过设置应用程序属性来配置应用程序 |
| 80 | + |
| 81 | +<Tabs items={['application.yml', 'application.properties']}> |
| 82 | + <Tab value="application.yml"> |
| 83 | + ```yaml |
| 84 | + logging: |
| 85 | + pattern: |
| 86 | + console: |
| 87 | + spring: |
| 88 | + main: |
| 89 | + banner-mode: off |
| 90 | + ``` |
| 91 | + </Tab> |
| 92 | + <Tab value="application.properties"> |
| 93 | + ```properties |
| 94 | + logging.pattern.console= |
| 95 | + spring.main.banner-mode=off |
| 96 | + ``` |
| 97 | + </Tab> |
| 98 | +</Tabs> |
| 99 | + |
| 100 | +[服务器配置属性](https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html#_configuration_properties)记录了所有可用的属性。现在,让我们开始构建您的服务器。 |
| 101 | + |
| 102 | +# 构建你的服务器 |
| 103 | +## 天气服务 |
| 104 | +让我们实现一个WeatherService.java,它使用 REST 客户端从国家气象局 API 查询数据: |
| 105 | +``` java |
| 106 | +@Service |
| 107 | +public class WeatherService { |
| 108 | + |
| 109 | + private final RestClient restClient; |
| 110 | + |
| 111 | + public WeatherService() { |
| 112 | + this.restClient = RestClient.builder() |
| 113 | + .baseUrl("https://api.weather.gov") |
| 114 | + .defaultHeader("Accept", "application/geo+json") |
| 115 | + .defaultHeader("User-Agent", "WeatherApiClient/1.0 ( [email protected])") |
| 116 | + .build(); |
| 117 | + } |
| 118 | + |
| 119 | + @Tool(description = "Get weather forecast for a specific latitude/longitude") |
| 120 | + public String getWeatherForecastByLocation( |
| 121 | + double latitude, // Latitude coordinate |
| 122 | + double longitude // Longitude coordinate |
| 123 | + ) { |
| 124 | + // Returns detailed forecast including: |
| 125 | + // - Temperature and unit |
| 126 | + // - Wind speed and direction |
| 127 | + // - Detailed forecast description |
| 128 | + } |
| 129 | + |
| 130 | + @Tool(description = "Get weather alerts for a US state") |
| 131 | + public String getAlerts( |
| 132 | + @ToolParam(description = "Two-letter US state code (e.g. CA, NY)" String state |
| 133 | + ) { |
| 134 | + // Returns active alerts including: |
| 135 | + // - Event type |
| 136 | + // - Affected area |
| 137 | + // - Severity |
| 138 | + // - Description |
| 139 | + // - Safety instructions |
| 140 | + } |
| 141 | + |
| 142 | + // ...... |
| 143 | +} |
| 144 | +``` |
| 145 | +该@Service注释会自动在应用程序上下文中注册服务。Spring AI@Tool注释使创建和维护 MCP 工具变得容易。 |
| 146 | + |
| 147 | +自动配置将自动向 MCP 服务器注册这些工具。 |
| 148 | + |
| 149 | +## 创建启动应用程序 |
| 150 | +``` java |
| 151 | +@SpringBootApplication |
| 152 | +public class McpServerApplication { |
| 153 | + |
| 154 | + public static void main(String[] args) { |
| 155 | + SpringApplication.run(McpServerApplication.class, args); |
| 156 | + } |
| 157 | + |
| 158 | + @Bean |
| 159 | + public ToolCallbackProvider weatherTools(WeatherService weatherService) { |
| 160 | + return MethodToolCallbackProvider.builder().toolObjects(weatherService).build(); |
| 161 | + } |
| 162 | +} |
| 163 | +``` |
| 164 | +使用实用MethodToolCallbackProvider程序将其转换@Tools为 MCP 服务器使用的可操作回调。 |
| 165 | + |
| 166 | +## 运行服务器 |
| 167 | +最后,让我们构建服务器: |
| 168 | +```bash |
| 169 | +./mvnw clean install |
| 170 | +``` |
| 171 | +这将在文件夹mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar中生成一个文件target。 |
| 172 | + |
| 173 | +现在让我们从现有的 MCP 主机 Claude for Desktop 测试您的服务器。 |
| 174 | + |
| 175 | +# 使用 Claude for Desktop 测试你的服务器 |
| 176 | +Claude for Desktop 尚未在 Linux 上提供。 |
| 177 | + |
| 178 | +首先,请确保您已安装 Claude for Desktop。 [您可以在此处安装最新版本](https://www.anthropic.com/app-unavailable-in-region)。如果您已经安装了 Claude for Desktop,[请确保它已更新到最新版本](https://www.anthropic.com/app-unavailable-in-region)。 |
| 179 | + |
| 180 | +我们需要为您想要使用的 MCP 服务器配置 Claude for Desktop。为此,请在~/Library/Application Support/Claude/claude_desktop_config.json文本编辑器中打开您的 Claude for Desktop App 配置。如果该文件不存在,请务必创建。 |
| 181 | + |
| 182 | +例如,如果你安装了VS Code: |
| 183 | + |
| 184 | +<Tabs items={['MacOS/Linux', '视窗']}> |
| 185 | + <Tab value="MacOS/Linux"> |
| 186 | + ```shell |
| 187 | + code ~/Library/Application\ Support/Claude/claude_desktop_config.json |
| 188 | + ``` |
| 189 | + </Tab> |
| 190 | + <Tab value="视窗"> |
| 191 | + ```bash |
| 192 | + code $env:AppData\Claude\claude_desktop_config.json |
| 193 | + ``` |
| 194 | + </Tab> |
| 195 | +</Tabs> |
| 196 | + |
| 197 | +然后您将在密钥中添加服务器mcpServers。只有至少一台服务器配置正确,MCP UI 元素才会显示在 Claude for Desktop 中。 |
| 198 | + |
| 199 | +在这种情况下,我们将像这样添加单个天气服务器: |
| 200 | +<Tabs items={['MacOS/Linux', '视窗']}> |
| 201 | + <Tab value="MacOS/Linux"> |
| 202 | + ```java |
| 203 | + { |
| 204 | + "mcpServers": { |
| 205 | + "spring-ai-mcp-weather": { |
| 206 | + "command": "java", |
| 207 | + "args": [ |
| 208 | + "-Dspring.ai.mcp.server.stdio=true", |
| 209 | + "-jar", |
| 210 | + "/ABSOLUTE/PATH/TO/PARENT/FOLDER/mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar" |
| 211 | + ] |
| 212 | + } |
| 213 | + } |
| 214 | + } |
| 215 | + ``` |
| 216 | + </Tab> |
| 217 | + <Tab value="视窗"> |
| 218 | + ```bash |
| 219 | + { |
| 220 | + "mcpServers": { |
| 221 | + "spring-ai-mcp-weather": { |
| 222 | + "command": "java", |
| 223 | + "args": [ |
| 224 | + "-Dspring.ai.mcp.server.transport=STDIO", |
| 225 | + "-jar", |
| 226 | + "C:\\ABSOLUTE\\PATH\\TO\\PARENT\\FOLDER\\weather\\mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar" |
| 227 | + ] |
| 228 | + } |
| 229 | + } |
| 230 | + } |
| 231 | + ``` |
| 232 | + </Tab> |
| 233 | +</Tabs> |
| 234 | +确保传递了服务器的绝对路径。 |
| 235 | + |
| 236 | +这告诉 Claude for Desktop: |
| 237 | + |
| 238 | +1. 有一个名为“my-weather-server”的 MCP 服务器 |
| 239 | +2. 通过运行来启动它java -jar /ABSOLUTE/PATH/TO/PARENT/FOLDER/mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar |
| 240 | + |
| 241 | +保存文件并重新启动Claude for Desktop。 |
| 242 | + |
| 243 | + |
| 244 | + |
| 245 | + |
| 246 | + |
| 247 | + |
| 248 | + |
| 249 | + |
0 commit comments