MCP服务管理

MSE Nacos企业版支持MCP 服务的注册与配置管理,为大语言模型(LLM)提供标准化的外部工具集成能力。

创建MCP服务

目前只支持MSE Nacos企业版3.0及以上版本。请您根据业务需求的不同,选择微服务引擎注册配置中心提供的三种MCP服务创建方式:

创建标准MCP服务

  1. 登录MSE注册配置中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择注册配置中心 > 实例列表,单击目标实例名称。

  3. 单击左侧导航栏的MCP Registry,选择命名空间,然后单击创建MCP服务,并单击标准MCP服务页签。

  4. 标准MCP服务页面,配置基本信息,其中重要参数说明如下:

    • MCP协议类型

      • Stdio:不具备网络通信能力,适用于本地开发调试,离线环境验证。

      • SSE:用于API网关配置推送等单向实时通信场景,延迟低、兼容性强,但仅支持服务端到客户端的单向流。

      • Streamable HTTP:适合正式环境部署和跨网络通信(如混合云/跨VPC),支持双向通信

    • 后端服务

      • 使用已有服务:如果您的MCP服务已经通过控制台或SDK注册到MSE Nacos中,可直接选择。

      • 新建服务:如果您的MCP服务尚未注册到MSE Nacos中,需要配置服务 IP/服务域名服务端口访问路径(必须以/开头,如/v1/mcp)。

  5. 配置完成后,单击保存并发布

创建HTTP转化MCP服务

  1. 登录MSE注册配置中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择注册配置中心 > 实例列表,单击目标实例名称。

  3. 单击左侧导航栏的MCP Registry,选择命名空间,然后单击创建MCP服务,并单击HTTP转化MCP服务页签。

  4. HTTP转化MCP服务页签,配置基本信息,其中重要参数说明如下:

    • HTTPS服务区分原有的HTTP服务协议。

    • MCP协议

      • SSE:用于API网关配置推送等单向实时通信场景,延迟低、兼容性强,但仅支持服务端到客户端的单向流。

      • Streamable HTTP:适合正式环境部署和跨网络通信(如混合云/跨VPC),支持双向通信

    • 后端服务

      • 使用已有服务:如果您的HTTP服务已经通过控制台或SDK注册到MSE Nacos中,可直接选择。

      • 新建服务:如果您的HTTP服务尚未注册到MSE Nacos中,需要配置服务 IP/服务域名服务端口

  5. (可选)创建MCP工具

  6. 配置完成后,单击保存并发布

动态注册MCP服务

通过使用Spring AI Alibaba 框架,或者 Nacos MCP Wrapper Python 开发 MCP Server, 可以在 MCP Server启动后动态注册至 Nacos,并对齐进统一管理,支持以下能力:

  • 服务动态管理:通过 MCP 服务列表增删改查服务信息。

  • 描述动态生效:工具描述、参数定义等元信息支持运行时热更新,无需重启服务。

  • MCP Server Tools 动态开关:支持 MCP Server 服务 Tools 运行时动态开启和关闭,无需重启服务。

  • 全链路集成:服务注册信息自动同步至 Nacos 配置中心与服务发现模块,适配 AI Agent 调用需求。

MCP服务支持通过函数计算进行部署,具体操作请参见:FC函数计算中部署MCP服务并注册至MSE Nacos

建议为应用分配独立 RAM 用户,独立于控制台访问的 RAM 用户,防止权限扩大风险。

  • RAM鉴权开启时,身份认证需要使用阿里云账号ACCESS_KEY_IDACCESS_KEY_SECRET。

  • 若未开启鉴权,采用开源用户名密码进行认证,用户名为固定值Nacos ,密码前往实例列表,单击所选实例ID,在基础信息页面开源控制台密码处点击重置,然后复制密码。

使用 Spring AI Alibaba Nacos MCP 框架开发 MCP Server

spring ai alibaba的版本要大于等于1.0.0.3。
1.依赖引入
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-mcp-registry</artifactId>
    <version>{1.0.0.3及以上版本}</version>
</dependency>

<!-- MCP Server (WebMVC) -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
    <version>{1.0.0及以上版本}</version>
</dependency>
2.服务定义(示例)
@Service
public class WeatherService {

  @Tool(description = "Get weather information by city name")
  public String getWeather(@ToolParam(description = "City name") String cityName) {
    return "Sunny in " + cityName;
  }
}
3. 配置 Nacos 注册参数
spring:
  application:
    name: mcp-nacos-registry-example
  ai:
    mcp:
      server:
        name: webmvc-mcp-server   # MCP服务名称
        version: 1.0.0            # 服务版本
        type: SYNC                # 调用类型:SYNC(同步)或ASYNC(异步)
        instructions: "This mcp server provides time information tools and resources"
    alibaba:
      mcp:
        nacos:
          server-addr:          # 替换为你的 Nacos 地址
          namespace: public    # Nacos 命名空间 ID(默认为public)
          access-key:           # 阿里云账号access-key
          secret-key:           # 阿里云账号secret-key
          register:
            enabled: true   # 是否开启服务注册
4.服务启动
@SpringBootApplication
public class Application {

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

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

}

使用 Nacos MCP Wrapper Python 开发 MCP Server

1.环境准备
pip install nacos-mcp-wrapper-python
2.自动注册参数配置
nacos_settings = NacosSettings()
nacos_settings.SERVER_ADDR = "127.0.0.1:8848" # <nacos_server_addr> e.g. 127.0.0.1:8848
nacos_settings.NAMESPACE= "public" # Nacos 命名空间ID
nacos_settings.ACCESS_KEY="" #阿里云账号access-key
nacos_settings.SECRET_KEY="" #阿里云账号secret-key
3.代码编写
from nacos_mcp_wrapper.server.nacos_mcp import NacosMCP
from nacos_mcp_wrapper.server.nacos_settings import NacosSettings

# Create an MCP server instance
nacos_settings = NacosSettings()
nacos_settings.SERVER_ADDR = "127.0.0.1:8848"  # <nacos_server_addr> e.g. 127.0.0.1:8848
nacos_settings.ACCESS_KEY = ""
nacos_settings.SECRET_KEY = ""
mcp = NacosMCP("nacos-mcp-python", nacos_settings=nacos_settings, version="1.0.1", port=18001)

# Register an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two integers together"""
    return a + b

# Register a subtraction tool
@mcp.tool()
def minus(a: int, b: int) -> int:
    """Subtract two numbers"""
    return a - b


if __name__ == "__main__":
    try:
        mcp.run(transport="sse")
        # mcp.run(transport="stdio")
        # mcp.run(transport="streamable-http")
    except Exception as e:
        print(f"Runtime error: {e}")

常见问题

  1. 启动时出现 mcp server info is not compatible 或者 check mcp server compatible false报错。

    由于 Nacos 中已经存在对应版本的 MCP Server 数据,并且注册的 MCP Server 数据与Nacos中的MCP Server 数据不兼容,需确保自动注册的 MCP Server 数据与 Nacos 中对应版本的数据兼容性,包括:

    • MCP Server 协议(stdio,sse,streamable)是否一致。

    • 服务引用是否一致。

    • Tools 数据是否一致(Tools 名称,Tools 数量,参数类型,参数是否可选),Tools 描述和参数描述不要求一致。

MCP Server 发现和调用

建议为应用分配独立 RAM 用户,独立于控制台访问的 RAM 用户,防止权限扩大风险。

  • RAM鉴权开启时,身份认证需要使用阿里云账号ACCESS_KEY_IDACCESS_KEY_SECRET。

  • 若未开启鉴权,采用开源用户名密码进行认证,用户名为固定值Nacos ,密码前往实例列表,单击所选实例ID,在基础信息页面开源控制台密码处点击重置,然后复制密码。

使用 Spring AI Alibaba Nacos MCP 框架发现和调用 MCP Server

1.依赖引入
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-autoconfigure-model-openai</artifactId>
    <version>{1.0.0及以上版本}</version>
</dependency>

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-autoconfigure-model-chat-client</artifactId>
    <version>{1.0.0及以上版本}</version>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-mcp-registry</artifactId>
    <version>{1.0.0.3及以上版本}</version>
</dependency>

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
    <version>{1.0.0及以上版本}</version>
</dependency>

2.创建 Async 或者 Sync MCP Client

声明同步 MCP 客户端列表:

@Autowired
 private List<LoadbalancedMcpSyncClient> loadbalancedMcpSyncClients;

或声明异步 MCP 客户端列表:

 @Autowired
 private List<LoadbalancedMcpAsyncClient> loadbalancedMcpAsyncClients;

使用 ToolCallbackProvider 注入同步工具回调:

@Qualifier("loadbalancedSyncMcpToolCallbacks") ToolCallbackProvider tools

或使用 ToolCallbackProvider 注入异步工具回调:

@Qualifier("loadbalancedMcpAsyncToolCallbacks") ToolCallbackProvider tools

3.application.yml配置

spring:
  application:
    name: mcp-client-webflux
  ai:
    openai:
      api-key: ${DASHSCOPE_API_KEY}
      base-url: https://dashscope.aliyuncs.com/compatible-mode
      chat:
        options:
          model: qwen-max
    alibaba:
      mcp:
        nacos:
          namespace: 4ad3108b-4d44-43d0-9634-3c1ac4850c8c
          server-addr: 127.0.0.1:8848
          access-key:           # 阿里云账号access-key
          secret-key:           # 阿里云账号secret-key
          client:
            enabled: true
            sse:
              connections:
                server1:
                  service-name: webflux-mcp-server # Nacos 中对应 MCP Server 的服务名
                  version: 1.0.0 # Nacos 中对应 MCP Server 的版本号
    mcp:
      client:
        enabled: true
        name: mcp-client-webflux
        version: 0.0.1
        initialized: true
        request-timeout: 600s
        type: sync
        toolcallback:
          enabled: true
        root-change-notification: true

4.参考示例代码

@SpringBootApplication
public class NacosMcpDiscoveryClientApplication {


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

    @Bean
    public CommandLineRunner predefinedQuestionsDemo(ChatClient.Builder chatClientBuilder, @Qualifier("loadbalancedMcpAsyncToolCallbacks") ToolCallbackProvider tools,
                                                 ConfigurableApplicationContext context) {

        return args -> {
            var chatClient = chatClientBuilder
                    .defaultToolCallbacks(tools.getToolCallbacks())
                    .build();

            Scanner scanner = new Scanner(System.in);
            while (true) {
                System.out.print("\n>>> QUESTION: ");
                String userInput = scanner.nextLine();
                if (userInput.equalsIgnoreCase("exit")) {
                    break;
                }
                if (userInput.isEmpty()) {
                    userInput = "北京时间现在几点钟";
                }
                System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());
            }
            scanner.close();
            context.close();
        };
    }
}

使用 Nacos MCP Router 发现和调用 Nacos 中的 MCP Server

Nacos MCP Router 有两种工作模式:

  • router模式:默认模式,Nacos MCP Router 作为一个标准MCP Server,提供MCP Server推荐、分发、安装及代理其他MCP Server的功能。

  • proxy模式:Nacos MCP Router 仅提供代理功能,无需代码改动即可实现stdio、sse协议一键转换为streamableHTTP协议。

router模式

stdio协议

启动Nacos MCP Router:

uvx启动:

{
  "mcpServers": {
    "nacos-mcp-router": {
      "command": "uvx",
      "args": [
        "nacos-mcp-router@latest"
      ],
      "env": {
        "NACOS_ADDR": "<NACOS-ADDR>, 选填,默认为127.0.0.1:8848",
        "ACCESS_KEY_ID": "<ACCESS_KEY_ID>, 阿里云账号access-key",
        "ACCESS_KEY_SECRET": "<ACCESS_KEY_SECRET>, 阿里云账号secret-key"
      }
    }
  }
}

docker启动:

{
  "mcpServers": {
    "nacos-mcp-router": {
      "command": "docker",
      "args": [
        "run", 
        "-i", 
        "--rm", 
        "--network", 
        "host",  
        "-e", 
        "NACOS_ADDR=<NACOS-ADDR>", 
        "-e",  
        "ACCESS_KEY_ID=<ACCESS_KEY_ID>", 
        "-e", 
        "ACCESS_KEY_SECRET=<ACCESS_KEY_SECRET>", 
        "-e", 
        "TRANSPORT_TYPE=stdio", 
        "nacos-mcp-router:latest"
      ]
    }
  }
}

MCP配置(以CherryStudio为例):

{
    "mcpServers": {
        "nacos-mcp-router": {
            "command": "docker",
            "args": [
                "run", 
                "-i", 
                "--rm", 
                "--network", 
                "host",  
                "-e", 
                "NACOS_ADDR=<NACOS-ADDR>", 
                "-e",  
                "ACCESS_KEY_ID=<ACCESS_KEY_ID>", 
                "-e", 
                "ACCESS_KEY_SECRET=<ACCESS_KEY_SECRET>",
                "-e", 
                "TRANSPORT_TYPE=stdio", 
                "nacos-mcp-router:latest"
            ]
        }
    }
}

sse协议

uvx启动:

export NACOS_ADDR=127.0.0.1:8848
export ACCESS_KEY_ID=ACCESS_KEY_ID
export ACCESS_KEY_SECRET=ACCESS_KEY_SECRET
export TRANSPORT_TYPE=sse
uvx nacos-mcp-router@latest

docker启动:

docker run -i --rm --network host -e NACOS_ADDR=$NACOS_ADDR -e ACCESS_KEY_ID=$ACCESS_KEY_ID -e ACCESS_KEY_SECRET=$ACCESS_KEY_SECRET -e TRANSPORT_TYPE=sse nacos-mcp-router:latest

MCP配置(以CherryStudio为例):

{
    "mcpServers": {
        "nacos-mcp-router": {
            "url": "http://$router_ip:8000/sse"
        }
    }
}

streamableHTTP 协议

uvx启动:

export NACOS_ADDR=127.0.0.1:8848
export ACCESS_KEY_ID=ACCESS_KEY_ID
export ACCESS_KEY_SECRET=ACCESS_KEY_SECRET
export TRANSPORT_TYPE=streamable_http
uvx nacos-mcp-router@latest

docker启动:

docker run -i --rm --network host -e NACOS_ADDR=$NACOS_ADDR -e ACCESS_KEY_ID=$ACCESS_KEY_ID -e ACCESS_KEY_SECRET=$ACCESS_KEY_SECRET -e TRANSPORT_TYPE=streamable_http nacos-mcp-router:latest

MCP配置(以CherryStudio为例):

{
    "mcpServers": {
        "nacos-mcp-router": {
            "url": "http://$router_ip:8000/mcp"
        }
    }
}

proxy模式

proxy模式下,需设置环境变量MODE=proxyPROXIED_MCP_NAME。

使用uvx:

export NACOS_ADDR=$NACOS_ADDR
export ACCESS_KEY_ID=$ACCESS_KEY_ID
export ACCESS_KEY_SECRET=$ACCESS_KEY_SECRET
export TRANSPORT_TYPE=streamable_http
export MODE=proxy
export PROXIED_MCP_NAME=$PROXIED_MCP_NAME
uvx nacos-mcp-router@latest

使用docker:

docker run -i --rm --network host -e NACOS_ADDR=$NACOS_ADDR -e ACCESS_KEY_ID=$ACCESS_KEY_ID -e ACCESS_KEY_SECRET=$ACCESS_KEY_SECRET -e TRANSPORT_TYPE=streamable_http -e MODE=proxy -e PROXIED_MCP_NAME=$PROXIED_MCP_NAME  nacos-mcp-router:latest

环境变量配置:

参数

描述

默认值

是否必填

备注

NACOS_ADDR

Nacos 服务器地址

127.0.0.1:8848

Nacos 服务器的地址,如 192.168.1.1:8848,需填写端口

ACCESS_KEY_ID

阿里云账号access-key

-

ACCESS_KEY_SECRET

阿里云账号access-secret

-

NACOS_NAMESPACE

Nacos命名空间

public

Nacos命名空间,如 public

TRANSPORT_TYPE

传输协议类型

stdio

传输协议类型,可选值:stdio、sse、streamable_http

PROXIED_MCP_NAME

代理的 MCP 服务器名称

-

proxy模式下需要被转换的 MCP 服务器名称,需要先注册到Nacos

MODE

工作模式

router

可选值:router、proxy

PORT

服务端口

8000

协议类型为ssestreamable时使用

Dify 对接 Nacos MCP Registry 实现 MCP Server 集中管理

Nacos 3.0 版本实现了MCP Registry 管理功能,可以对所有的MCP Server 进行集中式的管理,详情请参见Dify 对接 Nacos MCP Registry 实现 MCP Server 集中管理

编辑MCP服务

  1. 登录MSE注册配置中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择注册配置中心 > 实例列表,单击目标实例名称。

  3. 单击左侧导航栏的MCP Registry,选择命名空间编辑目标MCP服务:

    • MCP工具的工具描述参数结构中的描述,无需变更版本号,可直接编辑保存;

    • 除此之外,需要先更新版本号之后再进行编辑。

    重要

    每个 MCP 服务仅支持保存一个草稿,最新保存且不发布的版本会覆盖掉之前的草稿。

删除MCP服务

  1. 登录MSE注册配置中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择注册配置中心 > 实例列表,单击目标实例名称。

  3. 单击左侧导航栏的MCP Registry,选择命名空间删除目标MCP服务。

创建MCP工具

支持白屏编辑黑屏编辑两种方式新建MCP工具。白屏编辑模式下支持通过导入Swagger文件创建 MCP工具;黑屏编辑完全兼容AI网关 YAML 格式。

协议转换配置:用于 AI 网关将 HTTP 服务转换为 MCP 服务,完全兼容开源Higress RestToMcp模板格式。

通过Swagger导入创建MCP工具

前序步骤请参见创建HTTP转化MCP服务。在导入之前请确保Swagger文件格式正确,导入成功之后MCP 工具将会展示在MCP 工具列表中。

如果存在同名的工具,新的工具将会覆盖原有同名的工具。

image

示例1:Swagger文件

{
  "openapi": "3.0.0",
  "info": {
    "version": "1.0.0",
    "title": "Path Parameters API",
    "description": "A sample API that demonstrates path parameters"
  },
  "servers": [
    {
      "url": "http://api.example.com/v1"
    }
  ],
  "paths": {
    "/users/{userId}": {
      "get": {
        "summary": "Get user by ID",
        "operationId": "getUserById",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "description": "The ID of the user to retrieve",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "User ID"
                    },
                    "name": {
                      "type": "string",
                      "description": "User name"
                    },
                    "email": {
                      "type": "string",
                      "description": "User email"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "Update user",
        "operationId": "updateUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "description": "The ID of the user to update",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "User information to update",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "User name"
                  },
                  "email": {
                    "type": "string",
                    "description": "User email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "User updated successfully"
          }
        }
      }
    }
  }
}

示例2:黑屏编辑YAML文件

requestTemplate:
  method: GET
  url: http://restapi.amap.com/v3/weather/weatherInfo?key=xxxx
  argsToUrlParam: true

相关文档

FC函数计算中部署MCP服务并注册至MSE Nacos