alibaba-cloud-ops-mcp-server 0.9.25__tar.gz → 0.9.27__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/PKG-INFO +15 -12
- alibaba_cloud_ops_mcp_server-0.9.27/README_mcp_args.md +78 -0
- alibaba_cloud_ops_mcp_server-0.9.27/README_mcp_args_zh.md +78 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/README_zh.md +12 -12
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/pyproject.toml +4 -1
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/server.py +151 -3
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/application_management_tools.py +572 -41
- alibaba_cloud_ops_mcp_server-0.9.27/tests/alibabacloud/test_utils.py +293 -0
- alibaba_cloud_ops_mcp_server-0.9.27/tests/test_server.py +535 -0
- alibaba_cloud_ops_mcp_server-0.9.27/tests/tools/test_application_management_tools.py +357 -0
- alibaba_cloud_ops_mcp_server-0.9.27/tests/tools/test_local_tools.py +304 -0
- alibaba_cloud_ops_mcp_server-0.9.27/tests/tools/test_oss_tools.py +262 -0
- alibaba_cloud_ops_mcp_server-0.9.25/README_mcp_args.md +0 -22
- alibaba_cloud_ops_mcp_server-0.9.25/tests/alibabacloud/test_utils.py +0 -75
- alibaba_cloud_ops_mcp_server-0.9.25/tests/test_server.py +0 -106
- alibaba_cloud_ops_mcp_server-0.9.25/tests/tools/test_oss_tools.py +0 -98
- alibaba_cloud_ops_mcp_server-0.9.25/uv.lock +0 -1567
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/.github/workflows/python-ci.yml +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/.gitignore +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/Dockerfile +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/LICENSE +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/README.md +11 -11
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/examples/openapi_mcp_quickstart/server.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/image/Alibaba-Cloud-Ops-MCP-User-Group-en.png +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/image/Alibaba-Cloud-Ops-MCP-User-Group-zh.png +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/image/alibaba-cloud.png +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/image/qoder.svg +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/__init__.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/__init__.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/__main__.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/alibabacloud/__init__.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/alibabacloud/api_meta_client.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/alibabacloud/exception.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/alibabacloud/static/PROMPT_UNDERSTANDING.md +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/alibabacloud/static/__init__.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/alibabacloud/utils.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/config.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/settings.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/__init__.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/api_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/cms_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/common_api_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/local_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/oos_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/src/alibaba_cloud_ops_mcp_server/tools/oss_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/tests/alibabacloud/test_api_meta_client.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/tests/alibabacloud/test_exception.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/tests/test_init.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/tests/tools/test_api_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/tests/tools/test_cms_tools.py +0 -0
- {alibaba_cloud_ops_mcp_server-0.9.25 → alibaba_cloud_ops_mcp_server-0.9.27}/tests/tools/test_oos_tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: alibaba-cloud-ops-mcp-server
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.27
|
|
4
4
|
Summary: A MCP server for Alibaba Cloud
|
|
5
5
|
Author-email: Zheng Dayu <dayu.zdy@alibaba-inc.com>, Zhao Shuaibo <zhaoshuaibo.zsb@alibaba-inc.com>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -9,7 +9,10 @@ Requires-Dist: alibabacloud-cms20190101>=3.1.4
|
|
|
9
9
|
Requires-Dist: alibabacloud-credentials>=1.0.3
|
|
10
10
|
Requires-Dist: alibabacloud-ecs20140526>=6.1.0
|
|
11
11
|
Requires-Dist: alibabacloud-oos20190601>=3.5.0
|
|
12
|
+
Requires-Dist: alibabacloud-openapi-util>=0.2.0
|
|
12
13
|
Requires-Dist: alibabacloud-oss-v2>=1.2.0
|
|
14
|
+
Requires-Dist: alibabacloud-tea-openapi>=0.3.0
|
|
15
|
+
Requires-Dist: alibabacloud-tea-util>=0.3.0
|
|
13
16
|
Requires-Dist: click>=8.1.8
|
|
14
17
|
Requires-Dist: fastmcp==2.8.0
|
|
15
18
|
Requires-Dist: pydantic==2.11.3
|
|
@@ -23,6 +26,17 @@ Description-Content-Type: text/markdown
|
|
|
23
26
|
|
|
24
27
|
Alibaba Cloud Ops MCP Server is a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) server that provides seamless integration with Alibaba Cloud APIs, enabling AI assistants to operate resources on Alibaba Cloud, supporting ECS, Cloud Monitor, OOS, OSS, VPC, RDS and other widely used cloud products. It also enables AI assistants to analyze, build, and deploy applications to Alibaba Cloud ECS instances.
|
|
25
28
|
|
|
29
|
+
## MCP Maketplace Integration
|
|
30
|
+
|
|
31
|
+
* [Qoder](https://qoder.com) <a href="qoder://aicoding.aicoding-deeplink/mcp/add?name=alibaba-cloud-ops-mcp-server&config=JTdCJTIyY29tbWFuZCUyMiUzQSUyMnV2eCUyMiUyQyUyMmFyZ3MlMjIlM0ElNUIlMjJhbGliYWJhLWNsb3VkLW9wcy1tY3Atc2VydmVyJTQwbGF0ZXN0JTIyJTVEJTJDJTIyZW52JTIyJTNBJTdCJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEJTIyJTNBJTIyWW91ciUyMEFjY2VzcyUyMEtleSUyMElkJTIyJTJDJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCUyMiUzQSUyMllvdXIlMjBBY2Nlc3MlMjBLZXklMjBTRUNSRVQlMjIlN0QlN0Q%3D"><img src="./image/qoder.svg" alt="Install MCP Server" height="20"></a>
|
|
32
|
+
* [Cursor](https://docs.cursor.com/tools) [](https://cursor.com/en/install-mcp?name=alibaba-cloud-ops-mcp-server&config=eyJ0aW1lb3V0Ijo2MDAsImNvbW1hbmQiOiJ1dnggYWxpYmFiYS1jbG91ZC1vcHMtbWNwLXNlcnZlckBsYXRlc3QiLCJlbnYiOnsiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEIjoiWW91ciBBY2Nlc3MgS2V5IElkIiwiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCI6IllvdXIgQWNjZXNzIEtleSBTZWNyZXQifX0%3D)
|
|
33
|
+
* [Cline](https://cline.bot/mcp-marketplace)
|
|
34
|
+
* [ModelScope](https://www.modelscope.cn/mcp/servers/@aliyun/alibaba-cloud-ops-mcp-server?lang=en_US)
|
|
35
|
+
* [Lingma](https://lingma.aliyun.com/)
|
|
36
|
+
* [Smithery AI](https://smithery.ai/server/@aliyun/alibaba-cloud-ops-mcp-server)
|
|
37
|
+
* [FC-Function AI](https://cap.console.aliyun.com/template-detail?template=237)
|
|
38
|
+
* [Alibaba Cloud Model Studio](https://bailian.console.aliyun.com/?tab=mcp#/mcp-market/detail/alibaba-cloud-ops)
|
|
39
|
+
|
|
26
40
|
## Features
|
|
27
41
|
|
|
28
42
|
- **ECS Management**: Create, start, stop, reboot, delete instances, run commands, view instances, regions, zones, images, security groups, and more
|
|
@@ -70,17 +84,6 @@ To use `alibaba-cloud-ops-mcp-server` MCP Server with any other MCP Client, you
|
|
|
70
84
|
|
|
71
85
|
[For detailed parameter description, see MCP startup parameter document](./README_mcp_args.md)
|
|
72
86
|
|
|
73
|
-
## MCP Maketplace Integration
|
|
74
|
-
|
|
75
|
-
* [Qoder](https://qoder.com) <a href="qoder://aicoding.aicoding-deeplink/mcp/add?name=alibaba-cloud-ops-mcp-server&config=JTdCJTIyY29tbWFuZCUyMiUzQSUyMnV2eCUyMiUyQyUyMmFyZ3MlMjIlM0ElNUIlMjJhbGliYWJhLWNsb3VkLW9wcy1tY3Atc2VydmVyJTQwbGF0ZXN0JTIyJTVEJTJDJTIyZW52JTIyJTNBJTdCJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEJTIyJTNBJTIyWW91ciUyMEFjY2VzcyUyMEtleSUyMElkJTIyJTJDJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCUyMiUzQSUyMllvdXIlMjBBY2Nlc3MlMjBLZXklMjBTRUNSRVQlMjIlN0QlN0Q%3D"><img src="./image/qoder.svg" alt="Install MCP Server" height="20"></a>
|
|
76
|
-
* [Cursor](https://docs.cursor.com/tools) [](https://cursor.com/en/install-mcp?name=alibaba-cloud-ops-mcp-server&config=eyJ0aW1lb3V0Ijo2MDAsImNvbW1hbmQiOiJ1dnggYWxpYmFiYS1jbG91ZC1vcHMtbWNwLXNlcnZlckBsYXRlc3QiLCJlbnYiOnsiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEIjoiWW91ciBBY2Nlc3MgS2V5IElkIiwiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCI6IllvdXIgQWNjZXNzIEtleSBTZWNyZXQifX0%3D)
|
|
77
|
-
* [Cline](https://cline.bot/mcp-marketplace)
|
|
78
|
-
* [ModelScope](https://www.modelscope.cn/mcp/servers/@aliyun/alibaba-cloud-ops-mcp-server?lang=en_US)
|
|
79
|
-
* [Lingma](https://lingma.aliyun.com/)
|
|
80
|
-
* [Smithery AI](https://smithery.ai/server/@aliyun/alibaba-cloud-ops-mcp-server)
|
|
81
|
-
* [FC-Function AI](https://cap.console.aliyun.com/template-detail?template=237)
|
|
82
|
-
* [Alibaba Cloud Model Studio](https://bailian.console.aliyun.com/?tab=mcp#/mcp-market/detail/alibaba-cloud-ops)
|
|
83
|
-
|
|
84
87
|
## Know More
|
|
85
88
|
|
|
86
89
|
* [Alibaba Cloud Ops MCP Server is ready to use out of the box!!](https://developer.aliyun.com/article/1661348)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# MCP Startup Parameters Guide
|
|
2
|
+
|
|
3
|
+
This document provides a detailed introduction to the available parameters for starting the Alibaba Cloud MCP Server, helping users configure the server according to their needs.
|
|
4
|
+
|
|
5
|
+
## Parameter Table
|
|
6
|
+
|
|
7
|
+
| Parameter | Required | Type | Default | Description |
|
|
8
|
+
|:---------------------------:|:--------:|:-------:|:------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
9
|
+
| `--transport` | No | string | `stdio` | Transport protocol for MCP Server communication.<br>Options:<br> • `stdio` <br> • `sse` <br> • `streamable-http` |
|
|
10
|
+
| `--port` | No | int | `8000` | Specifies the port number MCP Server listens on. Make sure the port is not occupied. |
|
|
11
|
+
| `--host` | No | string | `127.0.0.1` | Specifies the host address MCP Server listens on. `0.0.0.0` means listening on all network interfaces. |
|
|
12
|
+
| `--services` | No | string | None | Comma-separated services, e.g., `ecs,vpc`.<br>Supported services:<br> • `ecs`<br> • `oos`<br> • `rds`<br> • `vpc`<br> • `slb`<br> • `ess`<br> • `ros`<br> • `cbn`<br> • `dds`<br> • `r-kvstore`<br> • `bssopenapi` |
|
|
13
|
+
| `--headers-credential-only` | No | bool | `false` | Whether to use credentials only from HTTP headers. When enabled, credentials must be provided via request headers instead of environment variables. |
|
|
14
|
+
| `--env` | No | string | `domestic` | Environment type for API endpoints.<br>Options:<br> • `domestic` - Use domestic (China) endpoints<br> • `international` - Use international (overseas) endpoints |
|
|
15
|
+
| `--code-deploy` | No | flag | `false` | Enable code deploy mode. When enabled, only loads 6 specific tools:<br> • `OOS_CodeDeploy`<br> • `OOS_GetDeployStatus`<br> • `OOS_GetLastDeploymentInfo`<br> • `LOCAL_ListDirectory`<br> • `LOCAL_RunShellScript`<br> • `LOCAL_AnalyzeDeployStack` |
|
|
16
|
+
| `--extra-config` | No | string | None | Add extra services and APIs to config (additive, does not replace existing config). Supports JSON format or Python dict format with single quotes.<br>Example: `"{'sls': ['GetProject', 'ListProject'], 'ecs': ['StartInstance']}"` |
|
|
17
|
+
| `--visible-tools` | No | string | None | Comma-separated list of tool names to make visible (whitelist mode). Only these specified tools will be registered when this parameter is provided.<br>Example: `OOS_RunCommand,ECS_DescribeInstances,LOCAL_ListDirectory` |
|
|
18
|
+
|
|
19
|
+
## Usage Examples
|
|
20
|
+
|
|
21
|
+
### Basic Usage
|
|
22
|
+
```bash
|
|
23
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --transport sse --port 8080 --host 0.0.0.0 --services ecs,vpc
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Code Deploy Mode
|
|
27
|
+
```bash
|
|
28
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --code-deploy
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Add Extra APIs via MCP Config
|
|
32
|
+
Using `--extra-config` to dynamically add services and APIs:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# JSON format (double quotes inside)
|
|
36
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --extra-config '{"sls": ["GetProject", "ListProject"], "ecs": ["StartInstance"]}'
|
|
37
|
+
|
|
38
|
+
# Python dict format (single quotes inside)
|
|
39
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --extra-config "{'sls': ['GetProject', 'ListProject'], 'ecs': ['StartInstance']}"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Whitelist Mode
|
|
43
|
+
Using `--visible-tools` to only expose specific tools:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --visible-tools "OOS_RunCommand,ECS_DescribeInstances,LOCAL_ListDirectory"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### International Environment
|
|
50
|
+
```bash
|
|
51
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --env international --services ecs,vpc
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### MCP JSON Configuration Example
|
|
55
|
+
|
|
56
|
+
You can configure these parameters in your MCP client's JSON configuration file:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"alibaba-cloud-ops-mcp-server": {
|
|
62
|
+
"timeout": 600,
|
|
63
|
+
"command": "uvx",
|
|
64
|
+
"args": [
|
|
65
|
+
"alibaba-cloud-ops-mcp-server@latest"
|
|
66
|
+
],
|
|
67
|
+
"env": {
|
|
68
|
+
"ALIBABA_CLOUD_ACCESS_KEY_ID": "Your Access Key ID",
|
|
69
|
+
"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "Your Access Key SECRET"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
For more help, please refer to the main project documentation or contact the maintainer.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# MCP 启动参数说明
|
|
2
|
+
|
|
3
|
+
本文档详细介绍 Alibaba Cloud MCP Server 的可用启动参数,帮助用户根据需求配置服务器。
|
|
4
|
+
|
|
5
|
+
## 参数列表
|
|
6
|
+
|
|
7
|
+
| 参数 | 是否必需 | 类型 | 默认值 | 说明 |
|
|
8
|
+
|:---------------------------:|:-------:|:-------:|:------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
9
|
+
| `--transport` | 否 | string | `stdio` | MCP Server 通信传输协议。<br>可选值:<br> • `stdio` <br> • `sse` <br> • `streamable-http` |
|
|
10
|
+
| `--port` | 否 | int | `8000` | MCP Server 监听的端口号,请确保端口未被占用。 |
|
|
11
|
+
| `--host` | 否 | string | `127.0.0.1` | MCP Server 监听的主机地址。`0.0.0.0` 表示监听所有网络接口。 |
|
|
12
|
+
| `--services` | 否 | string | None | 逗号分隔的服务列表,例如 `ecs,vpc`。<br>支持的服务:<br> • `ecs` - 弹性计算服务<br> • `oos` - 运维编排服务<br> • `rds` - 关系型数据库<br> • `vpc` - 专有网络<br> • `slb` - 负载均衡<br> • `ess` - 弹性伸缩<br> • `ros` - 资源编排<br> • `cbn` - 云企业网<br> • `dds` - MongoDB 数据库<br> • `r-kvstore` - Tair (兼容 Redis)<br> • `bssopenapi` - 费用中心 |
|
|
13
|
+
| `--headers-credential-only` | 否 | bool | `false` | 是否仅使用 HTTP 请求头中的凭证。启用后,凭证必须通过请求头提供,而非环境变量。 |
|
|
14
|
+
| `--env` | 否 | string | `domestic` | API 端点的环境类型。<br>可选值:<br> • `domestic` - 使用国内端点<br> • `international` - 使用国际端点 |
|
|
15
|
+
| `--code-deploy` | 否 | flag | `false` | 启用代码部署模式。启用后,仅加载以下 6 个工具:<br> • `OOS_CodeDeploy`<br> • `OOS_GetDeployStatus`<br> • `OOS_GetLastDeploymentInfo`<br> • `LOCAL_ListDirectory`<br> • `LOCAL_RunShellScript`<br> • `LOCAL_AnalyzeDeployStack` |
|
|
16
|
+
| `--extra-config` | 否 | string | None | 动态添加额外的服务和 API(累加模式,不会替换现有配置)。支持 JSON 格式或 Python 字典格式(单引号)。<br>示例:`"{'sls': ['GetProject', 'ListProject'], 'ecs': ['StartInstance']}"` |
|
|
17
|
+
| `--visible-tools` | 否 | string | None | 工具白名单模式。逗号分隔的工具名称列表,仅注册指定的工具。<br>示例:`OOS_RunCommand,ECS_DescribeInstances,LOCAL_ListDirectory` |
|
|
18
|
+
|
|
19
|
+
## 使用示例
|
|
20
|
+
|
|
21
|
+
### 基本用法
|
|
22
|
+
```bash
|
|
23
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --transport sse --port 8080 --host 0.0.0.0 --services ecs,vpc
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 代码部署模式
|
|
27
|
+
```bash
|
|
28
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --code-deploy
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 通过 MCP 配置动态添加 API
|
|
32
|
+
使用 `--extra-config` 动态添加服务和 API:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# JSON 格式(内部使用双引号)
|
|
36
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --extra-config '{"sls": ["GetProject", "ListProject"], "ecs": ["StartInstance"]}'
|
|
37
|
+
|
|
38
|
+
# Python 字典格式(内部使用单引号)
|
|
39
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --extra-config "{'sls': ['GetProject', 'ListProject'], 'ecs': ['StartInstance']}"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 白名单模式
|
|
43
|
+
使用 `--visible-tools` 仅暴露指定的工具:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --visible-tools "OOS_RunCommand,ECS_DescribeInstances,LOCAL_ListDirectory"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 国际环境
|
|
50
|
+
```bash
|
|
51
|
+
uv run src/alibaba_cloud_ops_mcp_server/server.py --env international --services ecs,vpc
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### MCP JSON 配置示例
|
|
55
|
+
|
|
56
|
+
您可以在 MCP 客户端的 JSON 配置文件中设置这些参数:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"alibaba-cloud-ops-mcp-server": {
|
|
62
|
+
"timeout": 600,
|
|
63
|
+
"command": "uvx",
|
|
64
|
+
"args": [
|
|
65
|
+
"alibaba-cloud-ops-mcp-server@latest"
|
|
66
|
+
],
|
|
67
|
+
"env": {
|
|
68
|
+
"ALIBABA_CLOUD_ACCESS_KEY_ID": "Your Access Key ID",
|
|
69
|
+
"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "Your Access Key SECRET"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
如需更多帮助,请参考项目主文档或联系维护者。
|
|
@@ -6,6 +6,17 @@
|
|
|
6
6
|
|
|
7
7
|
Alibaba Cloud Ops MCP Server是一个[模型上下文协议(MCP)](https://modelcontextprotocol.io/introduction)服务器,提供与阿里云API的无缝集成,使AI助手能够操作阿里云上的资源,支持ECS、云监控、OOS、OSS、VPC、RDS等广泛使用的云产品。同时,它还使AI助手能够分析、构建和部署应用到阿里云ECS实例。
|
|
8
8
|
|
|
9
|
+
## MCP市场集成
|
|
10
|
+
|
|
11
|
+
* [Qoder](https://qoder.com) <a href="qoder://aicoding.aicoding-deeplink/mcp/add?name=alibaba-cloud-ops-mcp-server&config=JTdCJTIyY29tbWFuZCUyMiUzQSUyMnV2eCUyMiUyQyUyMmFyZ3MlMjIlM0ElNUIlMjJhbGliYWJhLWNsb3VkLW9wcy1tY3Atc2VydmVyJTQwbGF0ZXN0JTIyJTVEJTJDJTIyZW52JTIyJTNBJTdCJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEJTIyJTNBJTIyWW91ciUyMEFjY2VzcyUyMEtleSUyMElkJTIyJTJDJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCUyMiUzQSUyMllvdXIlMjBBY2Nlc3MlMjBLZXklMjBTRUNSRVQlMjIlN0QlN0Q%3D"><img src="./image/qoder.svg" alt="Install MCP Server" height="20"></a>
|
|
12
|
+
* [Cursor](https://docs.cursor.com/tools) [](https://cursor.com/en/install-mcp?name=alibaba-cloud-ops-mcp-server&config=eyJ0aW1lb3V0Ijo2MDAsImNvbW1hbmQiOiJ1dnggYWxpYmFiYS1jbG91ZC1vcHMtbWNwLXNlcnZlckBsYXRlc3QiLCJlbnYiOnsiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEIjoiWW91ciBBY2Nlc3MgS2V5IElkIiwiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCI6IllvdXIgQWNjZXNzIEtleSBTZWNyZXQifX0%3D)
|
|
13
|
+
* [Cline](https://cline.bot/mcp-marketplace)
|
|
14
|
+
* [魔搭](https://www.modelscope.cn/mcp/servers/@aliyun/alibaba-cloud-ops-mcp-server)
|
|
15
|
+
* [通义灵码](https://lingma.aliyun.com/)
|
|
16
|
+
* [Smithery AI](https://smithery.ai/server/@aliyun/alibaba-cloud-ops-mcp-server)
|
|
17
|
+
* [FC-Function AI](https://cap.console.aliyun.com/template-detail?template=237)
|
|
18
|
+
* [阿里云百炼平台](https://bailian.console.aliyun.com/?tab=mcp#/mcp-market/detail/alibaba-cloud-ops)
|
|
19
|
+
|
|
9
20
|
## 功能特性
|
|
10
21
|
|
|
11
22
|
- **ECS 管理**:创建、启动、停止、重启、删除实例,运行命令,查看实例、地域、可用区、镜像、安全组等
|
|
@@ -51,18 +62,7 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
51
62
|
}
|
|
52
63
|
```
|
|
53
64
|
|
|
54
|
-
[详细参数说明见 MCP 启动参数文档](./
|
|
55
|
-
|
|
56
|
-
## MCP市场集成
|
|
57
|
-
|
|
58
|
-
* [Qoder](https://qoder.com) <a href="qoder://aicoding.aicoding-deeplink/mcp/add?name=alibaba-cloud-ops-mcp-server&config=JTdCJTIyY29tbWFuZCUyMiUzQSUyMnV2eCUyMiUyQyUyMmFyZ3MlMjIlM0ElNUIlMjJhbGliYWJhLWNsb3VkLW9wcy1tY3Atc2VydmVyJTQwbGF0ZXN0JTIyJTVEJTJDJTIyZW52JTIyJTNBJTdCJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEJTIyJTNBJTIyWW91ciUyMEFjY2VzcyUyMEtleSUyMElkJTIyJTJDJTIyQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCUyMiUzQSUyMllvdXIlMjBBY2Nlc3MlMjBLZXklMjBTRUNSRVQlMjIlN0QlN0Q%3D"><img src="./image/qoder.svg" alt="Install MCP Server" height="20"></a>
|
|
59
|
-
* [Cursor](https://docs.cursor.com/tools) [](https://cursor.com/en/install-mcp?name=alibaba-cloud-ops-mcp-server&config=eyJ0aW1lb3V0Ijo2MDAsImNvbW1hbmQiOiJ1dnggYWxpYmFiYS1jbG91ZC1vcHMtbWNwLXNlcnZlckBsYXRlc3QiLCJlbnYiOnsiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX0lEIjoiWW91ciBBY2Nlc3MgS2V5IElkIiwiQUxJQkFCQV9DTE9VRF9BQ0NFU1NfS0VZX1NFQ1JFVCI6IllvdXIgQWNjZXNzIEtleSBTZWNyZXQifX0%3D)
|
|
60
|
-
* [Cline](https://cline.bot/mcp-marketplace)
|
|
61
|
-
* [魔搭](https://www.modelscope.cn/mcp/servers/@aliyun/alibaba-cloud-ops-mcp-server)
|
|
62
|
-
* [通义灵码](https://lingma.aliyun.com/)
|
|
63
|
-
* [Smithery AI](https://smithery.ai/server/@aliyun/alibaba-cloud-ops-mcp-server)
|
|
64
|
-
* [FC-Function AI](https://cap.console.aliyun.com/template-detail?template=237)
|
|
65
|
-
* [阿里云百炼平台](https://bailian.console.aliyun.com/?tab=mcp#/mcp-market/detail/alibaba-cloud-ops)
|
|
65
|
+
[详细参数说明见 MCP 启动参数文档](./README_mcp_args_zh.md)
|
|
66
66
|
|
|
67
67
|
## 了解更多
|
|
68
68
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "alibaba-cloud-ops-mcp-server"
|
|
3
|
-
version = "0.9.
|
|
3
|
+
version = "0.9.27"
|
|
4
4
|
description = "A MCP server for Alibaba Cloud"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -14,6 +14,9 @@ dependencies = [
|
|
|
14
14
|
"alibabacloud-oos20190601>=3.5.0",
|
|
15
15
|
"alibabacloud_oss_v2>=1.2.0",
|
|
16
16
|
"alibabacloud-credentials>=1.0.3",
|
|
17
|
+
"alibabacloud-openapi-util>=0.2.0",
|
|
18
|
+
"alibabacloud-tea-openapi>=0.3.0",
|
|
19
|
+
"alibabacloud-tea-util>=0.3.0",
|
|
17
20
|
"click>=8.1.8",
|
|
18
21
|
"fastmcp==2.8.0",
|
|
19
22
|
"pydantic==2.11.3"
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import sys
|
|
2
|
+
import copy
|
|
3
|
+
import json
|
|
4
|
+
import ast
|
|
2
5
|
|
|
3
6
|
from fastmcp import FastMCP
|
|
4
7
|
import click
|
|
@@ -43,6 +46,97 @@ SUPPORTED_SERVICES_MAP = {
|
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
|
|
49
|
+
def _register_tools_with_filter(mcp: FastMCP, visible_tools_set: set, visible_tools_original: dict, services: str, extra_config: str):
|
|
50
|
+
"""
|
|
51
|
+
Register tools based on visible_tools whitelist (case-insensitive).
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
mcp: FastMCP instance
|
|
55
|
+
visible_tools_set: Set of allowed tool names (lowercase for case-insensitive matching)
|
|
56
|
+
visible_tools_original: Dict mapping lowercase names to original names
|
|
57
|
+
services: Services parameter for common_api_tools
|
|
58
|
+
extra_config: Extra config parameter
|
|
59
|
+
"""
|
|
60
|
+
registered_tools = set()
|
|
61
|
+
|
|
62
|
+
# 1. Register common_api_tools if services is specified
|
|
63
|
+
if services:
|
|
64
|
+
service_keys = [s.strip().lower() for s in services.split(",")]
|
|
65
|
+
service_list = [(key, SUPPORTED_SERVICES_MAP.get(key, key)) for key in service_keys]
|
|
66
|
+
set_custom_service_list(service_list)
|
|
67
|
+
for tool in common_api_tools.tools:
|
|
68
|
+
if tool.__name__.lower() in visible_tools_set:
|
|
69
|
+
mcp.tool(tool)
|
|
70
|
+
registered_tools.add(tool.__name__.lower())
|
|
71
|
+
|
|
72
|
+
# 2. Register static tools from all modules
|
|
73
|
+
static_tool_modules = [
|
|
74
|
+
oos_tools,
|
|
75
|
+
application_management_tools,
|
|
76
|
+
cms_tools,
|
|
77
|
+
oss_tools,
|
|
78
|
+
local_tools
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
for tool_module in static_tool_modules:
|
|
82
|
+
for tool in tool_module.tools:
|
|
83
|
+
if tool.__name__.lower() in visible_tools_set:
|
|
84
|
+
mcp.tool(tool)
|
|
85
|
+
registered_tools.add(tool.__name__.lower())
|
|
86
|
+
|
|
87
|
+
# 3. Handle dynamic API tools
|
|
88
|
+
# Parse tool names in visible_tools that follow SERVICE_API format
|
|
89
|
+
# Use original names to preserve API case (important for Alibaba Cloud APIs)
|
|
90
|
+
dynamic_tools_config = {}
|
|
91
|
+
|
|
92
|
+
for tool_name_lower in visible_tools_set:
|
|
93
|
+
if '_' in tool_name_lower and tool_name_lower not in registered_tools:
|
|
94
|
+
# Get original name to preserve API case
|
|
95
|
+
original_name = visible_tools_original.get(tool_name_lower, tool_name_lower)
|
|
96
|
+
parts = original_name.split('_', 1)
|
|
97
|
+
if len(parts) == 2:
|
|
98
|
+
service_code = parts[0].lower()
|
|
99
|
+
api_name = parts[1] # Preserve original case
|
|
100
|
+
if service_code not in dynamic_tools_config:
|
|
101
|
+
dynamic_tools_config[service_code] = []
|
|
102
|
+
if api_name not in dynamic_tools_config[service_code]:
|
|
103
|
+
dynamic_tools_config[service_code].append(api_name)
|
|
104
|
+
|
|
105
|
+
# 4. Merge with extra_config (only tools in visible_tools whitelist)
|
|
106
|
+
if extra_config:
|
|
107
|
+
try:
|
|
108
|
+
try:
|
|
109
|
+
extra = json.loads(extra_config)
|
|
110
|
+
except json.JSONDecodeError:
|
|
111
|
+
extra = ast.literal_eval(extra_config)
|
|
112
|
+
|
|
113
|
+
for service_code, apis in extra.items():
|
|
114
|
+
for api in apis:
|
|
115
|
+
tool_name_lower = f"{service_code.lower()}_{api.lower()}"
|
|
116
|
+
if tool_name_lower in visible_tools_set:
|
|
117
|
+
if service_code not in dynamic_tools_config:
|
|
118
|
+
dynamic_tools_config[service_code] = []
|
|
119
|
+
if api not in dynamic_tools_config[service_code]:
|
|
120
|
+
dynamic_tools_config[service_code].append(api)
|
|
121
|
+
logger.info(f'Merged extra config with visible tools filter: {dynamic_tools_config}')
|
|
122
|
+
except Exception as e:
|
|
123
|
+
logger.error(f'Failed to parse extra-config: {e}')
|
|
124
|
+
|
|
125
|
+
# 5. Create dynamic API tools
|
|
126
|
+
if dynamic_tools_config:
|
|
127
|
+
api_tools.create_api_tools(mcp, dynamic_tools_config)
|
|
128
|
+
for service_code, apis in dynamic_tools_config.items():
|
|
129
|
+
for api in apis:
|
|
130
|
+
registered_tools.add(f"{service_code.lower()}_{api.lower()}")
|
|
131
|
+
|
|
132
|
+
# 6. Log results
|
|
133
|
+
unregistered_tools = visible_tools_set - registered_tools
|
|
134
|
+
if unregistered_tools:
|
|
135
|
+
logger.warning(f"The following tools were not found and not registered: {unregistered_tools}")
|
|
136
|
+
|
|
137
|
+
logger.info(f"Visible tools mode: registered {len(registered_tools)} tools: {registered_tools}")
|
|
138
|
+
|
|
139
|
+
|
|
46
140
|
@click.command()
|
|
47
141
|
@click.option(
|
|
48
142
|
"--transport",
|
|
@@ -86,7 +180,19 @@ SUPPORTED_SERVICES_MAP = {
|
|
|
86
180
|
default=False,
|
|
87
181
|
help="Enable code deploy mode, only load 6 specific tools: OOS_CodeDeploy, OOS_GetDeployStatus, OOS_GetLastDeploymentInfo, LOCAL_ListDirectory, LOCAL_RunShellScript, LOCAL_AnalyzeDeployStack",
|
|
88
182
|
)
|
|
89
|
-
|
|
183
|
+
@click.option(
|
|
184
|
+
"--extra-config",
|
|
185
|
+
type=str,
|
|
186
|
+
default=None,
|
|
187
|
+
help="Add extra services and APIs to config, e.g., \"{'sls': ['GetProject', 'ListProject'], 'ecs': ['StartInstance']}\"",
|
|
188
|
+
)
|
|
189
|
+
@click.option(
|
|
190
|
+
"--visible-tools",
|
|
191
|
+
type=str,
|
|
192
|
+
default=None,
|
|
193
|
+
help="Comma-separated list of tool names to make visible (whitelist mode). Only these tools will be registered when specified, e.g., 'OOS_RunCommand,ECS_DescribeInstances,LOCAL_ListDirectory'",
|
|
194
|
+
)
|
|
195
|
+
def main(transport: str, port: int, host: str, services: str, headers_credential_only: bool, env: str, code_deploy: bool, extra_config: str, visible_tools: str):
|
|
90
196
|
_setup_logging()
|
|
91
197
|
# Create an MCP server
|
|
92
198
|
mcp = FastMCP(
|
|
@@ -158,6 +264,12 @@ def main(transport: str, port: int, host: str, services: str, headers_credential
|
|
|
158
264
|
settings.headers_credential_only = headers_credential_only
|
|
159
265
|
if env:
|
|
160
266
|
settings.env = env
|
|
267
|
+
|
|
268
|
+
# Handle mutual exclusivity between code_deploy and visible_tools
|
|
269
|
+
if code_deploy and visible_tools:
|
|
270
|
+
logger.warning("--code-deploy and --visible-tools are mutually exclusive. Using --code-deploy mode.")
|
|
271
|
+
visible_tools = None
|
|
272
|
+
|
|
161
273
|
if code_deploy:
|
|
162
274
|
# Code deploy mode: only load 6 specific tools
|
|
163
275
|
code_deploy_tools = {
|
|
@@ -179,7 +291,21 @@ def main(transport: str, port: int, host: str, services: str, headers_credential
|
|
|
179
291
|
for tool in local_tools.tools:
|
|
180
292
|
if tool.__name__ in code_deploy_tools:
|
|
181
293
|
mcp.tool(tool)
|
|
182
|
-
|
|
294
|
+
elif visible_tools:
|
|
295
|
+
# Visible tools mode: only load tools in whitelist (case-insensitive)
|
|
296
|
+
# Build both lowercase set and original name mapping
|
|
297
|
+
visible_tools_list = [tool.strip() for tool in visible_tools.split(",") if tool.strip()]
|
|
298
|
+
visible_tools_set = set(t.lower() for t in visible_tools_list)
|
|
299
|
+
visible_tools_original = {t.lower(): t for t in visible_tools_list}
|
|
300
|
+
if visible_tools_set:
|
|
301
|
+
logger.info(f"Visible tools mode enabled (case-insensitive). Allowed tools: {visible_tools_set}")
|
|
302
|
+
_register_tools_with_filter(mcp, visible_tools_set, visible_tools_original, services, extra_config)
|
|
303
|
+
else:
|
|
304
|
+
logger.warning("--visible-tools is empty, falling back to normal mode.")
|
|
305
|
+
# Fall through to normal mode by setting a flag
|
|
306
|
+
visible_tools = None
|
|
307
|
+
|
|
308
|
+
if not code_deploy and not visible_tools:
|
|
183
309
|
# Normal mode: load all tools
|
|
184
310
|
if services:
|
|
185
311
|
service_keys = [s.strip().lower() for s in services.split(",")]
|
|
@@ -197,7 +323,29 @@ def main(transport: str, port: int, host: str, services: str, headers_credential
|
|
|
197
323
|
mcp.tool(tool)
|
|
198
324
|
for tool in oss_tools.tools:
|
|
199
325
|
mcp.tool(tool)
|
|
200
|
-
|
|
326
|
+
# Merge extra_config into the existing config
|
|
327
|
+
merged_config = copy.deepcopy(config)
|
|
328
|
+
if extra_config:
|
|
329
|
+
try:
|
|
330
|
+
# Try JSON first, then fallback to ast.literal_eval for single quotes
|
|
331
|
+
try:
|
|
332
|
+
extra = json.loads(extra_config)
|
|
333
|
+
except json.JSONDecodeError:
|
|
334
|
+
extra = ast.literal_eval(extra_config)
|
|
335
|
+
for service_code, apis in extra.items():
|
|
336
|
+
if service_code in merged_config:
|
|
337
|
+
# Add new APIs to existing service (avoid duplicates)
|
|
338
|
+
existing_apis = set(merged_config[service_code])
|
|
339
|
+
for api in apis:
|
|
340
|
+
if api not in existing_apis:
|
|
341
|
+
merged_config[service_code].append(api)
|
|
342
|
+
else:
|
|
343
|
+
# Add new service with its APIs
|
|
344
|
+
merged_config[service_code] = apis
|
|
345
|
+
logger.info(f'Merged extra config: {extra}')
|
|
346
|
+
except Exception as e:
|
|
347
|
+
logger.error(f'Failed to parse extra-config: {e}')
|
|
348
|
+
api_tools.create_api_tools(mcp, merged_config)
|
|
201
349
|
for tool in local_tools.tools:
|
|
202
350
|
mcp.tool(tool)
|
|
203
351
|
|