AI超级助手开发入门:一文学会 MCP 协议 (Python & Java 实战)

🚀 AI超级助手开发入门:用 Python 和 Java 快速实现 MCP 协议服务

随着大模型时代到来,AI 应用正在迈向更高层次的“协作智能”。要想让 LLM 更聪明地访问工具、数据和服务,MCP(Model Context Protocol)应运而生。

本文以 MCP 官方协议为基础,结合 Server Quickstart 教程 和规范文档,带你使用 Python 和 Java 快速搭建一个支持 Claude、ChatGPT 等客户端调用的 MCP 服务。


🔍 什么是 MCP?

MCP 是一个开放协议,旨在定义 LLM 与外部系统(如文件、数据库、工具函数)进行交互的标准通信方式。你可以把它理解为:

“AI 的 USB-C 协议”

它让你的 AI 模型像插上“万能扩展坞”一样,调用各种本地和远程能力。

✅ MCP 基础能力

MCP 服务器可向 LLM 提供:

  • 资源 Resources:提供上下文信息(如文件、数据库记录)
  • 提示 Prompts:模板化消息提示或工作流
  • 工具 Tools:函数调用接口
  • 采样 Sampling:支持代理/递归调用

💡 架构图(来自官方)

在这里插入图片描述


🧰 开发 MCP 服务端(Python 示例)

我们以“天气查询服务”为例,使用 FastMCP 框架快速搭建符合 MCP 规范的服务。

✅ 环境准备

  • Python >= 3.10
  • MCP SDK >= 1.2.0

使用 uv 初始化项目(推荐):

curl -LsSf https://astral.sh/uv/install.sh | sh
uv init weather
cd weather
uv venv
source .venv/bin/activate
uv add "mcp[cli]" httpx

创建主程序文件:

touch weather.py

✅ 创建 MCP 服务

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("weather")

NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

async def make_nws_request(url: str) -> dict[str, Any] | None:
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/geo+json"
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

def format_alert(feature: dict) -> str:
    props = feature["properties"]
    return f"""
Event: {props.get('event', 'Unknown')}
Area: {props.get('areaDesc', 'Unknown')}
Severity: {props.get('severity', 'Unknown')}
Description: {props.get('description', 'No description available')}
Instructions: {props.get('instruction', 'No specific instructions provided')}
"""

@mcp.tool()
async def get_alerts(state: str) -> str:
    """Get weather alerts for a US state.

    Args:
        state: Two-letter US state code (e.g. CA, NY)
    """
    url = f"{NWS_API_BASE}/alerts/active/area/{state}"
    data = await make_nws_request(url)
    if not data or "features" not in data:
        return "Unable to fetch alerts or no alerts found."
    if not data["features"]:
        return "No active alerts for this state."
    alerts = [format_alert(feature) for feature in data["features"]]
    return "\n---\n".join(alerts)

@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
    """Get weather forecast for a location.

    Args:
        latitude: Latitude of the location
        longitude: Longitude of the location
    """
    points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
    points_data = await make_nws_request(points_url)
    if not points_data:
        return "Unable to fetch forecast data for this location."
    forecast_url = points_data["properties"]["forecast"]
    forecast_data = await make_nws_request(forecast_url)
    if not forecast_data:
        return "Unable to fetch detailed forecast."
    periods = forecast_data["properties"]["periods"]
    forecasts = []
    for period in periods[:5]:
        forecast = f"""
{period['name']}:
Temperature: {period['temperature']}°{period['temperatureUnit']}
Wind: {period['windSpeed']} {period['windDirection']}
Forecast: {period['detailedForecast']}
"""
        forecasts.append(forecast)
    return "\n---\n".join(forecasts)

if __name__ == "__main__":
    mcp.run(transport='stdio')

✅ 运行服务

uv run weather.py

🧪 配置 Claude for Desktop 测试

修改:~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory", "/ABSOLUTE/PATH/weather",
        "run", "weather.py"
      ]
    }
  }
}

保存后重启 Claude for Desktop,即可调用天气工具。


☕ Java 实现(基于 Spring AI Boot Starter)

Spring AI 团队与 Anthropic 合作推出的官方 Java SDK,基于 Spring Boot 自动配置机制,支持快速构建企业级 MCP 服务。

✅ 环境准备

  • Java 17+
  • Spring Boot 3.3.x+

推荐使用 Spring Initializr 快速生成项目,添加以下依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
  </dependency>
</dependencies>

✅ 配置 application.properties

spring.main.bannerMode=off
logging.pattern.console=

✅ 编写天气服务 WeatherService.java

@Service
public class WeatherService {

    private final RestClient restClient;

    public WeatherService() {
        this.restClient = RestClient.builder()
            .baseUrl("https://api.weather.gov")
            .defaultHeader("Accept", "application/geo+json")
            .defaultHeader("User-Agent", "WeatherApiClient/1.0 (your@email.com)")
            .build();
    }

      @Tool(description = "Get weather forecast for a specific latitude/longitude")
	  public String getWeatherForecastByLocation(
	      double latitude,   // Latitude coordinate
	      double longitude   // Longitude coordinate
	  ) {
	      // Returns detailed forecast including:
	      // - Temperature and unit
	      // - Wind speed and direction
	      // - Detailed forecast description
	  }
		
	  @Tool(description = "Get weather alerts for a US state")
	  public String getAlerts(
	      @ToolParam(description = "Two-letter US state code (e.g. CA, NY)" String state
	  ) {
	      // Returns active alerts including:
	      // - Event type
	      // - Affected area
	      // - Severity
	      // - Description
	      // - Safety instructions
	  }
}

✅ 启动类 McpServerApplication.java

@SpringBootApplication
public class McpServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(McpServerApplication.class, args);
    }

    @Bean
    public ToolCallbackProvider weatherTools(WeatherService weatherService) {
        return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
    }
}

✅ 构建与运行

./mvnw clean install

生成文件路径示例:

target/mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar

🧪 测试服务:配置 Claude for Desktop

编辑:~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "spring-ai-mcp-weather": {
      "command": "java",
      "args": [
        "-Dspring.ai.mcp.server.stdio=true",
        "-jar",
        "/ABSOLUTE/PATH/TO/mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar"
      ]
    }
  }
}

保存后重启 Claude,即可识别 MCP 工具。


✅ 使用 Java 客户端测试(可选)

var stdioParams = ServerParameters.builder("java")
    .args("-jar", "/ABSOLUTE/PATH/TO/mcp-weather-stdio-server-0.0.1-SNAPSHOT.jar")
    .build();

var mcpClient = McpClient.sync(new StdioClientTransport(stdioParams)).build();
mcpClient.initialize();

CallToolResult forecast = mcpClient.callTool(
    new CallToolRequest("getWeatherForecastByLocation", Map.of("latitude", "47.6", "longitude", "-122.3")));

CallToolResult alerts = mcpClient.callTool(
    new CallToolRequest("getAlerts", Map.of("state", "NY")));

System.out.println(forecast.getResult());
System.out.println(alerts.getResult());
mcpClient.closeGracefully();

你也可以使用 spring-ai-starter-mcp-client 自动配置客户端,重用 claude_desktop_config.json

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
spring.ai.mcp.client.stdio.servers-configuration=file:/PATH/TO/claude_desktop_config.json

更多示例可查看:starter-webflux-server

🔒 安全与用户控制

MCP 的设计核心是安全透明、用户可控

官方要求每个 MCP 工具都应:

  • 明确声明输入参数及说明
  • 提示模型说明该操作内容及风险
  • 用户明确授权后才能调用

📖 详见:Security and Trust


📦 官方资源推荐


✨ 总结

通过 MCP 协议,AI 模型可以真正成为你的“数字员工”,按需调用各种函数、操作数据、生成结果。

无论你使用 Python 还是 Java,借助 MCP SDK 都能快速构建出 Claude、ChatGPT 可连接的智能服务。

赶快动手试试,让你的 AI 有手有眼会用工具吧!🛠️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值