🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
Book a DemoInstallSign in
Socket

alibabacloud-devops-mcp-server

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

alibabacloud-devops-mcp-server - npm Package Compare versions

Comparing version

to
0.1.18

dist/common/modularTemplates.js

192

dist/index.js

@@ -18,2 +18,4 @@ #!/usr/bin/env node

import * as pipelineJob from './operations/flow/pipelineJob.js';
import * as serviceConnection from './operations/flow/serviceConnection.js';
import * as hostGroup from './operations/flow/hostGroup.js';
import * as packageRepositories from './operations/packages/repositories.js';

@@ -23,2 +25,3 @@ import * as artifacts from './operations/packages/artifacts.js';

import { VERSION } from "./common/version.js";
import { config } from "dotenv";
import * as types from "./common/types.js";

@@ -222,2 +225,57 @@ const server = new Server({

{
name: "generate_pipeline_yaml",
description: "[Pipeline Management] Generate pipeline YAML configuration without creating a pipeline. Useful for previewing the generated YAML or for manual pipeline creation. The LLM should provide structured parameters including buildLanguage, buildTool, repository info, versions, etc.",
inputSchema: zodToJsonSchema(z.object({
buildLanguage: z.enum(['java', 'nodejs', 'python', 'go', 'dotnet']).describe("Programming language of the project"),
buildTool: z.enum(['maven', 'gradle', 'npm', 'yarn', 'pip', 'go', 'dotnet']).describe("Build tool to use"),
deployTarget: z.enum(['vm', 'k8s', 'none']).optional().describe("Deployment target"),
// Repository configuration
repoUrl: z.string().optional().describe("Repository URL (should be detected from git config)"),
branch: z.string().optional().describe("Git branch (should be detected from git branch --show-current)"),
serviceName: z.string().optional().describe("Service name (can be derived from repository name)"),
serviceConnectionId: z.string().optional().describe("Service connection UUID for code source"),
// Version configuration
jdkVersion: z.string().optional().describe("JDK version for Java projects (e.g., '1.8', '11', '17')"),
mavenVersion: z.string().optional().describe("Maven version (e.g., '3.6.3')"),
nodeVersion: z.string().optional().describe("Node.js version (e.g., '18.12', '20.x')"),
pythonVersion: z.string().optional().describe("Python version (e.g., '3.7', '3.12')"),
goVersion: z.string().optional().describe("Go version (e.g., '1.21')"),
// Build configuration
buildCommand: z.string().optional().describe("Custom build command"),
testCommand: z.string().optional().describe("Custom test command"),
// Artifact upload configuration
uploadType: z.enum(['packages', 'flowPublic']).optional().describe("Artifact upload type"),
packagesServiceConnection: z.string().optional().describe("Packages service connection UUID"),
artifactName: z.string().optional().describe("Artifact name"),
artifactVersion: z.string().optional().describe("Artifact version"),
packagesRepoId: z.string().optional().describe("Packages repository ID"),
includePathInArtifact: z.boolean().optional().describe("Include path in artifact"),
// VM deployment configuration
machineGroupId: z.string().optional().describe("Machine group UUID for VM deployment"),
executeUser: z.string().optional().describe("Execution user for VM deployment"),
artifactDownloadPath: z.string().optional().describe("Artifact download path on VM"),
deployCommand: z.string().optional().describe("Deployment command for VM"),
pauseStrategy: z.enum(['firstBatchPause', 'noPause', 'eachBatchPause']).optional().describe("Pause strategy for VM deployment"),
batchNumber: z.number().optional().describe("Batch number for VM deployment"),
// Kubernetes deployment configuration
kubernetesClusterId: z.string().optional().describe("Kubernetes cluster ID"),
kubectlVersion: z.string().optional().describe("kubectl version"),
namespace: z.string().optional().describe("Kubernetes namespace"),
yamlPath: z.string().optional().describe("Kubernetes YAML file path"),
dockerImage: z.string().optional().describe("Docker image for Kubernetes deployment"),
})),
},
{
name: "create_pipeline_from_description",
description: "[Pipeline Management] Create a pipeline based on structured parameters extracted by the LLM from user descriptions and IDE context. The LLM should:\n" +
"1. Parse user's natural language description to extract: buildLanguage, buildTool, deployTarget, versions, etc.\n" +
"2. Automatically detect project context from IDE: repository URL (git config), current branch (git branch), project name\n" +
"3. Infer buildLanguage from project files (pom.xml→java, package.json→nodejs, requirements.txt→python, etc.)\n" +
"4. Set default buildTool based on buildLanguage (java→maven, nodejs→npm, python→pip, etc.)\n" +
"5. Extract version requirements from project files (pom.xml, package.json, etc.)\n" +
"\n" +
"This tool focuses on YAML generation and pipeline creation, not on parsing descriptions or detecting project context.",
inputSchema: zodToJsonSchema(types.CreatePipelineFromDescriptionSchema),
},
{
name: "smart_list_pipelines",

@@ -290,2 +348,14 @@ description: "[Pipeline Management] Intelligently search pipelines with natural language time references (e.g., 'today', 'this week')",

inputSchema: zodToJsonSchema(types.GetArtifactSchema),
},
// Service Connection Operations
{
name: "list_service_connections",
description: "[Service Connection Management] List service connections in an organization with filtering options",
inputSchema: zodToJsonSchema(types.ListServiceConnectionsSchema),
},
// Host Group Operations
{
name: "list_host_groups",
description: "[Host Group Management] List host groups in an organization with filtering options",
inputSchema: zodToJsonSchema(types.ListHostGroupsSchema),
}

@@ -529,2 +599,96 @@ ],

}
case "generate_pipeline_yaml": {
// Parse arguments using the schema defined in the tool registration
const args = z.object({
buildLanguage: z.enum(['java', 'nodejs', 'python', 'go', 'dotnet']),
buildTool: z.enum(['maven', 'gradle', 'npm', 'yarn', 'pip', 'go', 'dotnet']),
deployTarget: z.enum(['vm', 'k8s', 'none']).optional(),
repoUrl: z.string().optional(),
branch: z.string().optional(),
serviceName: z.string().optional(),
serviceConnectionId: z.string().optional(),
jdkVersion: z.string().optional(),
mavenVersion: z.string().optional(),
nodeVersion: z.string().optional(),
pythonVersion: z.string().optional(),
goVersion: z.string().optional(),
buildCommand: z.string().optional(),
testCommand: z.string().optional(),
uploadType: z.enum(['packages', 'flowPublic']).optional(),
packagesServiceConnection: z.string().optional(),
artifactName: z.string().optional(),
artifactVersion: z.string().optional(),
packagesRepoId: z.string().optional(),
includePathInArtifact: z.boolean().optional(),
machineGroupId: z.string().optional(),
executeUser: z.string().optional(),
artifactDownloadPath: z.string().optional(),
deployCommand: z.string().optional(),
pauseStrategy: z.enum(['firstBatchPause', 'noPause', 'eachBatchPause']).optional(),
batchNumber: z.number().optional(),
kubernetesClusterId: z.string().optional(),
kubectlVersion: z.string().optional(),
namespace: z.string().optional(),
yamlPath: z.string().optional(),
dockerImage: z.string().optional(),
}).parse(request.params.arguments);
const yamlContent = await pipeline.generatePipelineYamlFunc(args);
return {
content: [{ type: "text", text: yamlContent }],
};
}
case "create_pipeline_from_description": {
const args = types.CreatePipelineFromDescriptionSchema.parse(request.params.arguments);
// 检查必需的参数
if (!args.name) {
throw new Error("Pipeline name is required");
}
if (!args.buildLanguage) {
throw new Error("Build language is required. Please specify one of: java, nodejs, python, go, dotnet");
}
if (!args.buildTool) {
throw new Error("Build tool is required. Please specify one of: maven, npm, pip, go, dotnet");
}
const result = await pipeline.createPipelineWithOptionsFunc(args.organizationId, {
name: args.name,
repoUrl: args.repoUrl,
branch: args.branch,
serviceConnectionId: args.serviceConnectionId,
// 技术栈参数
buildLanguage: args.buildLanguage,
buildTool: args.buildTool,
deployTarget: args.deployTarget,
// 版本相关参数
jdkVersion: args.jdkVersion,
mavenVersion: args.mavenVersion,
nodeVersion: args.nodeVersion,
pythonVersion: args.pythonVersion,
goVersion: args.goVersion,
kubectlVersion: args.kubectlVersion,
// 构建物上传相关参数
uploadType: args.uploadType,
artifactName: args.artifactName,
artifactVersion: args.artifactVersion,
packagesServiceConnection: args.packagesServiceConnection,
packagesRepoId: args.packagesRepoId,
includePathInArtifact: args.includePathInArtifact,
// 部署相关参数
executeUser: args.executeUser,
artifactDownloadPath: args.artifactDownloadPath,
machineGroupId: args.machineGroupId,
pauseStrategy: args.pauseStrategy,
batchNumber: args.batchNumber,
kubernetesClusterId: args.kubernetesClusterId,
yamlPath: args.yamlPath,
namespace: args.namespace,
dockerImage: args.dockerImage,
// 自定义命令
buildCommand: args.buildCommand,
testCommand: args.testCommand,
deployCommand: args.deployCommand,
});
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
};
}
case "smart_list_pipelines": {

@@ -646,2 +810,28 @@ // Parse arguments using the schema defined in the tool registration

}
// Service Connection Operations
case "list_service_connections": {
const args = types.ListServiceConnectionsSchema.parse(request.params.arguments);
const serviceConnections = await serviceConnection.listServiceConnectionsFunc(args.organizationId, args.serviceConnectionType);
return {
content: [{ type: "text", text: JSON.stringify(serviceConnections, null, 2) }],
};
}
// Host Group Operations
case "list_host_groups": {
const args = types.ListHostGroupsSchema.parse(request.params.arguments);
const hostGroups = await hostGroup.listHostGroupsFunc(args.organizationId, {
ids: args.ids,
name: args.name,
createStartTime: args.createStartTime,
createEndTime: args.createEndTime,
creatorAccountIds: args.creatorAccountIds,
perPage: args.perPage,
page: args.page,
pageSort: args.pageSort,
pageOrder: args.pageOrder
});
return {
content: [{ type: "text", text: JSON.stringify(hostGroups, null, 2) }],
};
}
default:

@@ -661,3 +851,3 @@ throw new Error(`Unknown tool: ${request.params.name}`);

});
// config();
config();
async function runServer() {

@@ -664,0 +854,0 @@ const transport = new StdioServerTransport();

import * as utils from "../../common/utils.js";
import { PipelineDetailSchema, PipelineListItemSchema, PipelineRunSchema, PipelineRunListItemSchema } from "../../common/types.js";
import { generateModularPipeline } from "../../common/modularTemplates.js";
import { listServiceConnectionsFunc } from "./serviceConnection.js";
/**

@@ -261,1 +263,213 @@ * 获取流水线详情

}
/**
* 创建流水线
* @param organizationId 组织ID
* @param name 流水线名称
* @param content 流水线YAML描述
* @returns 流水线ID
*/
export async function createPipelineFunc(organizationId, name, content) {
const url = `/oapi/v1/flow/organizations/${organizationId}/pipelines`;
const body = {
name: name,
content: content
};
const response = await utils.yunxiaoRequest(url, {
method: "POST",
body: body,
});
return Number(response);
}
/**
* 基于结构化参数生成流水线YAML(不创建流水线)
* @param options 结构化的流水线配置选项
* @returns 生成的YAML字符串
*/
export async function generatePipelineYamlFunc(options) {
// 准备变量,确保版本号有双引号
const variables = {
// 基础配置
...(options.repoUrl && { repoUrl: options.repoUrl }),
...(options.branch && { branch: options.branch }),
...(options.serviceName && { serviceName: options.serviceName }),
...(options.serviceConnectionId && { serviceConnectionId: options.serviceConnectionId }),
...(options.packagesServiceConnection && { packagesServiceConnection: options.packagesServiceConnection }),
...(options.machineGroupId && { machineGroupId: options.machineGroupId }),
...(options.namespace && { namespace: options.namespace }),
...(options.dockerImage && { dockerImage: options.dockerImage }),
// 版本相关(确保双引号)
...(options.jdkVersion && { jdkVersion: `"${options.jdkVersion}"` }),
...(options.mavenVersion && { mavenVersion: `"${options.mavenVersion}"` }),
...(options.nodeVersion && { nodeVersion: `"${options.nodeVersion}"` }),
...(options.pythonVersion && { pythonVersion: `"${options.pythonVersion}"` }),
...(options.goVersion && { goVersion: `"${options.goVersion}"` }),
...(options.kubectlVersion && { kubectlVersion: `"${options.kubectlVersion}"` }),
// 构建物上传相关
...(options.uploadType && { uploadType: options.uploadType }),
...(options.artifactName && { artifactName: options.artifactName }),
...(options.artifactVersion && { artifactVersion: options.artifactVersion }),
...(options.packagesRepoId && { packagesRepoId: options.packagesRepoId }),
...(options.includePathInArtifact !== undefined && { includePathInArtifact: options.includePathInArtifact }),
// 部署相关
...(options.executeUser && { executeUser: options.executeUser }),
...(options.artifactDownloadPath && { artifactDownloadPath: options.artifactDownloadPath }),
...(options.kubernetesClusterId && { kubernetesClusterId: options.kubernetesClusterId }),
...(options.yamlPath && { yamlPath: options.yamlPath }),
// 命令
...(options.buildCommand && { buildCommand: options.buildCommand }),
...(options.testCommand && { testCommand: options.testCommand }),
...(options.deployCommand && { deployCommand: options.deployCommand }),
};
// 转换为模块化流水线选项
const deployTargets = options.deployTarget ? [options.deployTarget] : [];
// 使用模块化架构生成YAML
return generateModularPipeline({
keywords: [options.buildLanguage, options.buildTool],
buildLanguages: [options.buildLanguage],
buildTools: [options.buildTool],
deployTargets: deployTargets,
uploadType: options.uploadType || 'packages',
variables: variables
});
}
/**
* 基于结构化参数创建流水线
* @param organizationId 组织ID
* @param options 结构化的流水线配置选项
* @returns 创建结果,包含流水线ID和生成的YAML
*/
export async function createPipelineWithOptionsFunc(organizationId, options) {
// 获取默认服务连接ID(如果用户没有明确指定)
let defaultServiceConnectionId = null;
const hasServiceConnectionId = options.serviceConnectionId;
if (!hasServiceConnectionId) {
defaultServiceConnectionId = await getDefaultServiceConnectionId(organizationId);
}
// 获取默认Packages服务连接ID(如果用户没有明确指定且需要packages上传)
let defaultPackagesServiceConnectionId = null;
const hasPackagesServiceConnectionId = options.packagesServiceConnection;
const needsPackagesUpload = !options.uploadType || options.uploadType === 'packages';
if (!hasPackagesServiceConnectionId && needsPackagesUpload) {
defaultPackagesServiceConnectionId = await getDefaultPackagesServiceConnectionId(organizationId);
}
// 获取默认主机组ID(如果用户没有明确指定且需要VM部署)
let defaultMachineGroupId = null;
const hasMachineGroupId = options.machineGroupId;
const needsVMDeploy = options.deployTarget === 'vm';
if (!hasMachineGroupId && needsVMDeploy) {
defaultMachineGroupId = await getDefaultHostGroupId(organizationId);
}
// 准备模块化流水线生成的变量
const finalVariables = {
// 基础配置(直接使用用户提供的值)
...(options.repoUrl && { repoUrl: options.repoUrl }),
...(options.branch && { branch: options.branch }),
...(options.serviceName && { serviceName: options.serviceName }),
// 使用获取到的默认服务连接ID
...(defaultServiceConnectionId && !hasServiceConnectionId && { serviceConnectionId: defaultServiceConnectionId }),
// 使用获取到的默认Packages服务连接ID
...(defaultPackagesServiceConnectionId && !hasPackagesServiceConnectionId && { packagesServiceConnection: defaultPackagesServiceConnectionId }),
// 使用获取到的默认主机组ID
...(defaultMachineGroupId && !hasMachineGroupId && { machineGroupId: defaultMachineGroupId }),
// 用户明确指定的值优先级最高
...(options.serviceConnectionId && { serviceConnectionId: options.serviceConnectionId }),
...(options.packagesServiceConnection && { packagesServiceConnection: options.packagesServiceConnection }),
...(options.machineGroupId && { machineGroupId: options.machineGroupId }),
...(options.namespace && { namespace: options.namespace }),
...(options.dockerImage && { dockerImage: options.dockerImage }),
// 版本相关(确保双引号)
...(options.jdkVersion && { jdkVersion: `"${options.jdkVersion}"` }),
...(options.mavenVersion && { mavenVersion: `"${options.mavenVersion}"` }),
...(options.nodeVersion && { nodeVersion: `"${options.nodeVersion}"` }),
...(options.pythonVersion && { pythonVersion: `"${options.pythonVersion}"` }),
...(options.goVersion && { goVersion: `"${options.goVersion}"` }),
...(options.kubectlVersion && { kubectlVersion: `"${options.kubectlVersion}"` }),
// 构建物上传相关
...(options.uploadType && { uploadType: options.uploadType }),
...(options.artifactName && { artifactName: options.artifactName }),
...(options.artifactVersion && { artifactVersion: options.artifactVersion }),
...(options.packagesRepoId && { packagesRepoId: options.packagesRepoId }),
...(options.includePathInArtifact !== undefined && { includePathInArtifact: options.includePathInArtifact }),
// 部署相关
...(options.executeUser && { executeUser: options.executeUser }),
...(options.artifactDownloadPath && { artifactDownloadPath: options.artifactDownloadPath }),
...(options.kubernetesClusterId && { kubernetesClusterId: options.kubernetesClusterId }),
...(options.yamlPath && { yamlPath: options.yamlPath }),
// 命令
...(options.buildCommand && { buildCommand: options.buildCommand }),
...(options.testCommand && { testCommand: options.testCommand }),
...(options.deployCommand && { deployCommand: options.deployCommand }),
};
console.log('🔍 [DEBUG] finalVariables:', JSON.stringify(finalVariables, null, 2));
// 转换为模块化流水线选项
const deployTargets = options.deployTarget ? [options.deployTarget] : [];
// 使用模块化架构生成YAML
const generatedYaml = generateModularPipeline({
keywords: [options.buildLanguage, options.buildTool],
buildLanguages: [options.buildLanguage],
buildTools: [options.buildTool],
deployTargets: deployTargets,
uploadType: options.uploadType || 'packages',
variables: finalVariables
});
console.log('生成的YAML:', generatedYaml);
// 创建流水线
const pipelineId = await createPipelineFunc(organizationId, options.name, generatedYaml);
return {
pipelineId,
generatedYaml,
usedTemplate: '模块化流水线'
};
}
/**
* 获取默认的服务连接ID(用于代码源配置)
* @param organizationId 组织ID
* @returns 服务连接ID
*/
async function getDefaultServiceConnectionId(organizationId) {
try {
// 获取Codeup类型的服务连接(代码源最常用)
const serviceConnections = await listServiceConnectionsFunc(organizationId, 'codeup');
if (serviceConnections && serviceConnections.length > 0) {
// 优先使用UUID,如果没有UUID则使用ID转字符串
return serviceConnections[0].uuid || null;
}
return null;
}
catch (error) {
console.error('获取Codeup服务连接失败:', error);
return null;
}
}
/**
* 获取默认的Packages服务连接ID(用于制品上传配置)
* @param organizationId 组织ID
* @returns Packages服务连接ID
*/
async function getDefaultPackagesServiceConnectionId(organizationId) {
try {
// 获取packages类型的服务连接
const serviceConnections = await listServiceConnectionsFunc(organizationId, 'packages');
if (serviceConnections && serviceConnections.length > 0) {
// 优先使用UUID,如果没有UUID则使用ID转字符串
return serviceConnections[0].uuid || null;
}
return null;
}
catch (error) {
console.error('获取Packages服务连接失败:', error);
return null;
}
}
/**
* 获取默认的主机组ID(用于VM部署配置)
* 注意:由于主机组API只返回数字ID而不是UUID,这个函数暂时不使用
* 用户需要在描述中明确指定主机组UUID
* @param organizationId 组织ID
* @returns null(暂不自动获取)
*/
async function getDefaultHostGroupId(organizationId) {
// 暂时不自动获取主机组,因为API只返回数字ID,无法在流水线中使用
// 用户需要在options中明确提供machineGroupId(UUID格式)
return null;
}

2

package.json
{
"name": "alibabacloud-devops-mcp-server",
"version": "0.1.17",
"version": "0.1.18",
"description": "MCP Server for using the alibabacloud-devops API: allows AI assistants to directly participate in development collaboration, helping teams optimize development processes and improve efficiency.",

@@ -5,0 +5,0 @@ "type": "module",

# alibabacloud-devops-mcp-server
[![smithery badge](https://smithery.ai/badge/@aliyun/alibabacloud-devops-mcp-server)](https://smithery.ai/server/@aliyun/alibabacloud-devops-mcp-server)
Yunxiao MCP Server provides AI assistants with the ability to interact with the Yunxiao platform, enabling them to read work item contents in projects, automatically write code after understanding requirements, and submit code merge requests. Enterprise development teams can use it to assist with code reviews, optimize task management, reduce repetitive operations, and thus focus on more important innovation and product delivery.

@@ -55,2 +57,3 @@

- `list_pipelines`: Get pipeline list
- `smart_list_pipelines`: Smart pipeline search with natural language time references
- `create_pipeline_run`: Create a pipeline run instance

@@ -64,2 +67,5 @@ - `get_latest_pipeline_run`: Get the latest pipeline run instance

- `get_pipeline_job_run_log`: Get the execution logs of a pipeline job
- `list_service_connections`: List service connections in organization
- `generate_pipeline_yaml`: Automatically generates YAML configuration
- `create_pipeline_from_description`: Automatically generates YAML configuration and creates pipeline

@@ -80,2 +86,10 @@ ### Packages Management Tools

### Installing via Smithery
To install Yunxiao DevOps Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@aliyun/alibabacloud-devops-mcp-server):
```bash
npx -y @smithery/cli install @aliyun/alibabacloud-devops-mcp-server --client claude
```
### Install Yunxiao MCP server via MCP marketplace

@@ -82,0 +96,0 @@ The MCP market built into Lingma (AlibabaCloud Tongyi Lingma) has already provided the Yunxiao MCP service. To install it, simply enter the MCP market in Lingma and search for "Yunxiao DevOps", then click install.

@@ -51,15 +51,18 @@ # alibabacloud-devops-mcp-server

### 流水线工具
### 流水线工具
- `get_pipeline` - 获取流水线详情
- `list_pipelines` - 获取流水线列表
- `smart_list_pipelines` - 智能查询流水线(支持自然语言时间)
- `create_pipeline_run` - 运行流水线
- `get_latest_pipeline_run` - 获取最新运行信息
- `get_pipeline_run` - 获取运行详情
- `list_pipeline_runs` - 获取运行历史
- `list_pipeline_jobs_by_category` - 获取流水线任务
- `list_pipeline_job_historys` - 获取任务历史
- `execute_pipeline_job_run` - 手动运行任务
- `get_pipeline_job_run_log` - 获取任务日志
- `list_service_connections` - 获取服务连接列表
- `generate_pipeline_yaml`: 生成流水线 YAML
- `create_pipeline_from_description`: 根据自然语言描述生成流水线 YAML 并创建流水线
- `get_pipeline`: 获取流水线详情
- `list_pipelines`: 获取流水线列表
- `create_pipeline_run`: 运行流水线
- `get_latest_pipeline_run`: 获取最近一次流水线运行信息
- `get_pipeline_run`: 获取流水线运行实例
- `list_pipeline_runs`: 获取流水线运行实例列表
- `list_pipeline_jobs_by_category`: 按任务分类获取流水线执行的任务
- `list_pipeline_job_historys`: 获取流水线任务的执行历史
- `execute_pipeline_job_run`: 手动运行流水线任务
- `get_pipeline_job_run_log`: 查询流水线任务运行日志
### 制品仓库工具

@@ -79,2 +82,10 @@

### 在 Smithery.ai 中使用云效 MCP 服务
云效 MCP 服务已部署到 Smithery.ai 中,可以按照下列命令安装使用 [Smithery](https://smithery.ai/server/@aliyun/alibabacloud-devops-mcp-server):
```bash
npx -y @smithery/cli install @aliyun/alibabacloud-devops-mcp-server --client claude
```
### 通过 MCP市场 安装云效 MCP 服务

@@ -81,0 +92,0 @@ 通义灵码内置的MCP市场中已经提供了云效的MCP服务,在通义灵码中进入MCP市场并且找到「云效DevOps」,直接安装即可。

Sorry, the diff of this file is too big to display