# 使用 Mcp 操作云服务资源

前面鼓吹 MCP 的时候，我把 MCP 形容为一座桥，大模型和存量的 IT 系统藉由 MCP 的连接，让大模型的能力能够轻松地直接作用到在线的存量系统之中。市面上出现了 API 网关/注册发现工具直接对接 MCP 的产品，也直接证明了这个新东西的吸引力。

每个公有云，都有数量庞大的 API，头部厂商还提供了对应的 CLI 工具，方便快速进行集成，对接 MCP 可以说是得天独厚了，下面就用 MCP 的 [Python SDK](https://github.com/modelcontextprotocol/python-sdk) 编写一个简单的 AWS EC2 查询，并把它集成到 Claude App 中。

## UV

MCP 官方文档中，Python 的项目初始化、依赖和运行都是用 [uv](https://github.com/astral-sh/uv) 来承载的，为了方便起见，可以先把 UV 装上，安装很简单：

```bash
# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh
```

macOS 中的 Homebrew 也可以直接部署 UV。

## 编码

有了 uv 之后，就可以初始化一下我们的新项目，例如：

```bash
$ uv init cloud-mcp-server
Initialized project `cloud-mcp-server` at `/Users/[xxx]/cloud-mcp-server`
$ cd mcp-server-demo
$ ls -a
.git            .gitignore      .python-version README.md       main.py         pyproject.toml
```

可以看到这中间已经生成了几个主要文件，其中 `pyproject.toml` 包含了当前项目的基本信息：

```toml
[project]
name = "cloud-mcp-server"
version = "0.1.0"
description = "A Sample MCP Server for AWS EC2"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
```

接下来要初始化我们要用到的依赖包，SDK 需要使用 `mcp` 相关的包，而要使用 AWS SDK，则需要安装 `boto3`，同样可以用 `uv` 命令实现：

```bash
$ uv add "mcp[cli]" "boto3"
Using CPython 3.13.2 interpreter at: /opt/homebrew/opt/python@3.13/bin/python3.13
Creating virtual environment at: .venv
Resolved 35 packages in 1.29s
Prepared 7 packages in 13.04s
Installed 33 packages in 89ms
 + annotated-types==0.7.0
 + anyio==4.9.0
 + boto3==1.37.28
 + botocore==1.37.28
 + certifi==2025.1.31
...
```

接下来编辑 `main.py`，在其中加入一个查询 ec2 实例的 `tool`：

```python
from mcp.server.fastmcp import FastMCP

# Create an MCP server
mcp = FastMCP("aws-operator")


@mcp.tool()
# 只有一个参数，region_id
def list_ec2(region_id: str) -> list:
    import os
    import boto3
    # 从环境中读取 AWS 凭据，并初始化客户端
    aws_access_key_id = os.getenv("AWS_ACCESS_KEY_ID")
    aws_secret_access_key = os.getenv("AWS_SECRET_ACCESS_KEY")
    session = boto3.Session(aws_access_key_id=aws_access_key_id,
                            aws_secret_access_key=aws_secret_access_key)

    # 调用 AWS API
    ec2 = boto3.client('ec2', region_name=region_id)
    response = ec2.describe_instances()
    instance_list = []
    for reservation in response["Reservations"]:
        for instance in reservation["Instances"]:
            instance_list.append(instance)
    return instance_list
```

## 安装和提问

完成编辑后，将 MCP Server 载入 Claude App：

```bash
$ uv run mcp install \
    -f .env \
    --with boto3 main.py
[04/07/25 21:52:38] INFO     Added server 'aws-operator' to Claude config
INFO     Successfully installed aws-operator in Claude app
```

然后打开 Claude App，会看到锤子图标已经出现，也能在工具列表中看到我们的 `list_ec2` 方法：

```plaintext
Available MCP tools
Claude can use tools provided by specialized servers using Model Context Protocol. Learn more about MCP.

list_ec2
From server: aws-operator
```

接下来尝试提问：

### Q：我在欧洲有没有购买 ec2 实例？

我可以帮您检查您在欧洲是否有购买EC2实例。我需要先了解您在欧洲哪个区域可能有实例。让我们来查看一下。
我将帮您检查欧洲各个AWS区域的EC2实例。AWS在欧洲有以下几个区域:

eu-west-1 (爱尔兰)
eu-west-2 (伦敦)
eu-west-3 (巴黎)
eu-central-1 (法兰克福)
eu-north-1 (斯德哥尔摩)
eu-south-1 (米兰)
...
根据我的查询结果，在我能够成功查询的欧洲AWS区域(爱尔兰、伦敦、巴黎、法兰克福和斯德哥尔摩)中，没有找到您的EC2实例。尝试查询米兰区域(eu-south-1)时出现了凭证验证错误。

### Q：查找我所有在北美洲和亚洲的 EC2 实例，用表格形式列出 EC2 的关键数据

...
经检查北美洲和亚洲的AWS区域，共找到2个运行中的EC2实例，详情如下：

| 区域        | 实例ID                | 实例名称  | 实例类型     | 状态      | 公网IP           | 私网IP          | AMI ID                | 启动时间                 |
| --------- | ------------------- | ----- | -------- | ------- | -------------- | ------------- | --------------------- | -------------------- |
| us-east-1 | i-066d6788cf6d6b85f | us113 | t2.micro | running | 13.218.36.31   | 172.31.21.105 | ami-00a929b66ed6e0de6 | 2025-04-07T09:01:41Z |
| us-west-2 | i-07d219e7fdea42897 | us2   | t2.micro | running | 44.243.226.237 | 172.31.39.36  | ami-087f352c165340ea1 | 2025-04-07T09:02:39Z |

#### 注意事项

- 在亚洲区域未发现任何实例
- 在ap-east-1区域（香港）查询时出现凭证验证错误
- 所有找到的实例均位于北美洲区域（美国东部和美国西部）
- 两个实例均使用t2.micro配置并且状态为运行中

## 然后

例子很粗陋，例如没有保护敏感数据、没有进行异常处理等。LLM 很贵，用它做编排也是非常不合理的。这里展示的主要是这样一种可能，将一些存量的关键服务接入 MCP 之后，即使是一个未经训练、微调的公共/开源大模型，也可以和我们自身的业务结合起来，发挥更接地气的大模型能力。
