alibaba-cloud-ops-mcp-server 0.9.23__tar.gz → 0.9.25__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.
Files changed (44) hide show
  1. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/PKG-INFO +1 -1
  2. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/pyproject.toml +1 -1
  3. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/application_management_tools.py +61 -77
  4. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/uv.lock +2 -2
  5. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/.github/workflows/python-ci.yml +0 -0
  6. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/.gitignore +0 -0
  7. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/Dockerfile +0 -0
  8. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/LICENSE +0 -0
  9. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/README.md +0 -0
  10. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/README_mcp_args.md +0 -0
  11. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/README_zh.md +0 -0
  12. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/examples/openapi_mcp_quickstart/server.py +0 -0
  13. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/image/Alibaba-Cloud-Ops-MCP-User-Group-en.png +0 -0
  14. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/image/Alibaba-Cloud-Ops-MCP-User-Group-zh.png +0 -0
  15. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/image/alibaba-cloud.png +0 -0
  16. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/image/qoder.svg +0 -0
  17. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/__init__.py +0 -0
  18. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/__init__.py +0 -0
  19. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/__main__.py +0 -0
  20. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/alibabacloud/__init__.py +0 -0
  21. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/alibabacloud/api_meta_client.py +0 -0
  22. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/alibabacloud/exception.py +0 -0
  23. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/alibabacloud/static/PROMPT_UNDERSTANDING.md +0 -0
  24. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/alibabacloud/static/__init__.py +0 -0
  25. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/alibabacloud/utils.py +0 -0
  26. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/config.py +0 -0
  27. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/server.py +0 -0
  28. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/settings.py +0 -0
  29. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/__init__.py +0 -0
  30. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/api_tools.py +0 -0
  31. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/cms_tools.py +0 -0
  32. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/common_api_tools.py +0 -0
  33. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/local_tools.py +0 -0
  34. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/oos_tools.py +0 -0
  35. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/src/alibaba_cloud_ops_mcp_server/tools/oss_tools.py +0 -0
  36. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/alibabacloud/test_api_meta_client.py +0 -0
  37. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/alibabacloud/test_exception.py +0 -0
  38. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/alibabacloud/test_utils.py +0 -0
  39. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/test_init.py +0 -0
  40. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/test_server.py +0 -0
  41. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/tools/test_api_tools.py +0 -0
  42. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/tools/test_cms_tools.py +0 -0
  43. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/tools/test_oos_tools.py +0 -0
  44. {alibaba_cloud_ops_mcp_server-0.9.23 → alibaba_cloud_ops_mcp_server-0.9.25}/tests/tools/test_oss_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.23
3
+ Version: 0.9.25
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "alibaba-cloud-ops-mcp-server"
3
- version = "0.9.23"
3
+ version = "0.9.25"
4
4
  description = "A MCP server for Alibaba Cloud"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -77,81 +77,46 @@ def OOS_CodeDeploy(
77
77
 
78
78
  ):
79
79
  """
80
- 部署应用到阿里云ECS实例。
81
-
82
- 完整部署流程(在调用此工具之前):
83
-
84
- 步骤 1:识别部署方式
85
- - 通过本地文件操作工具读取项目文件(package.jsonrequirements.txt、pom.xml 等)
86
- - 识别项目的部署方式和技术栈(npm、python、java、go 等),项目的部署语言可以作为参数:deploy_language 传入
87
- - 生成构建命令,注意,该构建命令不需要生成构建命令,不要因此新增sh文件,任何情况下都不要,因为构建命令是CodeDeploy的参数,不需要生成文件
88
-
89
- 步骤 2:构建或压缩文件,并记录文件路径
90
- - 在本地执行构建命令,生成部署产物(tar.gz、zip 等压缩包)
91
- - 将构建产物保存到 .code_deploy/release 目录下
92
- - 记录文件路径,留待后续CodeDeploy使用
93
-
94
- 步骤 3:调用此工具进行部署
95
-
96
- 重要提示:
97
- 1. 启动命令(application_start)和停止命令必须采用防御性编程策略,确保每一步操作都经过验证,避免因路径不存在、命令缺失等问题导致部署失败。
98
-
99
- 关键要求
100
- 1. 压缩包处理规范
101
- 如果产物是压缩包(tartar.gz、zip等),必须先解压再执行启动命令
102
- 解压前应验证压缩包文件存在
103
- 使用非交互式解压命令(如 unzip -o、tar -xzf)避免需要用户确认
104
-
105
- # 正确示例 - 带防御性检查
106
- [ -f app.tar.gz ] && tar -xzf app.tar.gz || { echo "压缩包不存在"; exit 1; }
107
- [ -f start.sh ] && chmod +x start.sh && nohup ./start.sh > /root/app.log 2>&1 & || { echo "启动脚本不存在"; exit 1; }
108
-
109
- # 错误示例 - 无检查直接执行
110
- cd /var/www/html # 如果目录不存在会失败
111
- ./start.sh # 如果文件不存在会失败
112
-
113
- # 防御性停止命令 - 检查服务是否存在
114
- if systemctl list-units --full --all | grep -q "nginx.service"; then
115
- systemctl stop nginx
116
- elif systemctl list-units --full --all | grep -q "apache2.service"; then
117
- systemctl stop apache2
118
- elif systemctl list-units --full --all | grep -q "httpd.service"; then
119
- systemctl stop httpd
120
- fi
121
-
122
- # 或者通过进程名停止
123
- pkill -f "node.*app.js" || true
124
- pkill -f "java.*app.jar" || true
125
-
126
- # 检查命令是否存在
127
- command -v npm >/dev/null 2>&1 || { echo "npm未安装"; exit 1; }
128
- command -v java >/dev/null 2>&1 || { echo "java未安装"; exit 1; }
129
- command -v python >/dev/null 2>&1 || { echo "python未安装"; exit 1; }
130
-
131
- 2. 启动命令(application_start)必须与上传的产物对应。如果产物是压缩包(tar、tar.gz、zip等),
132
- 需要先解压并进入对应目录后再执行启动命令。
133
- 3. 示例:如果上传的是 app.tar.gz,启动命令应该类似,一般压缩包就在当前目录下,直接解压即可,未经确认路径是否存在,禁止使用cd,使用前务必确认对应文件和路径存在:
134
- "tar -xzf app.tar.gz && ./start.sh"
135
- 或者如果解压后是Java应用:
136
- "tar -xzf app.tar.gz && java -jar app.jar"
137
- 4. 确保启动命令能够正确找到并执行解压后的可执行文件或命令,避免部署失败。启动命令应该将程序运行在后台并打印日志到指定文件,
138
- 注意使用非交互式命令,比如unzip -o等自动覆盖的命令,无需交互
139
- 例如:
140
- - npm 程序示例:
141
- "tar -xzf app.tar.gz && nohup npm start > /root/app.log 2>&1 &"
142
- 或者分别输出标准输出和错误日志:
143
- "tar -xzf app.tar.gz && nohup npm start > /root/app.log 2> /root/app.error.log &"
144
- - Java 程序示例:
145
- "tar -xzf app.tar.gz && nohup java -jar app.jar > /root/app.log 2>&1 &"
146
- - Python 程序示例:
147
- "tar -xzf app.tar.gz && nohup python app.py > /root/app.log 2>&1 &"
148
- 说明:使用 nohup 命令可以让程序在后台运行,即使终端关闭也不会终止;> 重定向标准输出到日志文件;2>&1 将标准错误也重定向到同一文件;& 符号让命令在后台执行。
149
- 4. 应用和应用分组会自动检查是否存在,如果存在则跳过创建,避免重复创建错误。
150
- 5. 如果未提供 ECS 实例 ID,工具会返回提示信息,引导用户到 ECS 控制台创建实例。
151
- 6. 部署完成后,部署信息会保存到项目根目录下的 .code_deploy/.application.json 文件中。
152
- 7. project_path 参数用于指定项目根目录,.code_deploy 目录将在此路径下创建。如果不提供,将尝试从 file_path 推断或使用当前工作目录。
153
-
154
- 创建完成后,你应该以markdown的形式向用户展示你获取的service link,方便用户跳转
80
+ 将应用部署到阿里云ECS实例。使用阿里云OOS(运维编排服务)的CodeDeploy功能实现自动化部署。
81
+
82
+ ## 前置条件(调用此工具前需完成)
83
+
84
+ 1. **识别项目类型**:读取项目配置文件(package.json、pom.xml、requirements.txt等),确定技术栈和部署语言(通过deploy_language参数传入)
85
+ 2. **构建部署产物**:执行构建命令生成压缩包(tar.gzzip等),保存到 `.code_deploy/release` 目录
86
+ 3. **准备ECS实例**:确保目标ECS实例已创建,获取实例ID列表
87
+
88
+ ## 核心要求
89
+
90
+ ### 1. 防御性命令设计(必须)
91
+ 启动和停止命令必须包含存在性检查,避免因路径/文件/命令不存在导致失败:
92
+ - 压缩包:先检查文件存在再解压 `[ -f app.tar.gz ] && tar -xzf app.tar.gz || exit 1`
93
+ - 可执行文件:检查文件存在再执行 `[ -f start.sh ] && chmod +x start.sh && ./start.sh || exit 1`
94
+ - 命令可用性:检查命令是否存在 `command -v npm >/dev/null 2>&1 || exit 1`
95
+ - 禁止直接使用 `cd`,必须先验证路径存在
96
+
97
+ ### 2. 压缩包处理规范(必须)
98
+ 如果产物是压缩包,启动命令必须先解压:
99
+ - 使用非交互式命令:`tar -xzf`、`unzip -o`(自动覆盖,无需确认)
100
+ - 解压后执行启动命令,确保路径对应
101
+ - 示例:`tar -xzf app.tar.gz && nohup java -jar app.jar > /root/app.log 2>&1 &`
102
+
103
+ ### 3. 后台运行与日志(必须)
104
+ 启动命令必须使用后台运行并重定向日志:
105
+ - 格式:`nohup <command> > /root/app.log 2>&1 &`
106
+ - 说明:nohup保持后台运行,`>` 重定向标准输出,`2>&1` 合并错误输出,`&` 后台执行
107
+
108
+ ### 4. 停止命令规范
109
+ 停止命令需检查服务/进程是否存在:
110
+ - systemctl服务:`systemctl list-units | grep -q "service" && systemctl stop service`
111
+ - 进程名:`pkill -f "process_pattern" || true`
112
+
113
+ ## 注意事项
114
+
115
+ - 应用和应用分组会自动检查,已存在则跳过创建
116
+ - 未提供ECS实例ID时,工具会返回创建引导链接
117
+ - 部署信息自动保存到 `.code_deploy/.application.json`
118
+ - project_path未提供时,会从file_path推断或使用当前目录
119
+ - 部署完成后,以markdown格式展示service_link供用户跳转
155
120
  """
156
121
  # Set project path if provided
157
122
  if project_path:
@@ -707,8 +672,27 @@ def _list_application_group_deployment(client, name, application_group_name, sta
707
672
  )
708
673
  response = client.get_application_group(get_application_group_request)
709
674
  status = response.body.application_group.status
710
- if status in status_list:
711
- return response.body
675
+ execution_id = response.body.application_group.execution_id
676
+ list_executions_response = None
677
+
678
+ if execution_id:
679
+ try:
680
+ list_executions_request = oos_20190601_models.ListExecutionsRequest(
681
+ execution_id=execution_id
682
+ )
683
+ list_executions_response = client.list_executions(list_executions_request)
684
+ except Exception as e:
685
+ logger.info(f"[_list_application_group_deployment] Error listing executions for application group {application_group_name}: {e}")
686
+ pass
687
+
688
+ resp = {
689
+ 'info': response.body,
690
+ 'status': status,
691
+ 'execution_id': execution_id,
692
+ 'deploy_execution_info': list_executions_response.body if list_executions_response else None
693
+ }
694
+
695
+ return resp
712
696
 
713
697
 
714
698
  def _check_application_exists(client: oos20190601Client, name: str) -> bool:
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 1
2
+ revision = 3
3
3
  requires-python = ">=3.10"
4
4
 
5
5
  [[package]]
@@ -116,7 +116,7 @@ wheels = [
116
116
 
117
117
  [[package]]
118
118
  name = "alibaba-cloud-ops-mcp-server"
119
- version = "0.9.19"
119
+ version = "0.9.25"
120
120
  source = { editable = "." }
121
121
  dependencies = [
122
122
  { name = "alibabacloud-cms20190101" },