EDAS存量Java应用快速转换为MCP Server应用

更新时间:
复制为 MD 格式

EDAS支持将部署在EDAS上的Java微服务应用,如SpringCloud、Dubbo应用,基于EDAS平台收集到的服务元数据和接口定义,快速转换生成一个基于Python3.13编写的MCP Server端代码文件。

背景信息

EDAS支持将部署在EDAS上的Java微服务应用,如SpringCloud、Dubbo应用,基于EDAS平台收集到的服务元数据和接口定义,快速转换生成一个基于Python3.13编写的MCP Server端代码文件。生成的代码文件中包含了对SpringCloud、Dubbo微服务接口的调用封装,和封装后接口的MCP 工具封装。

转换生成的代码默认以SSE协议暴露,MCP Client端可以使用转换生成的MCP Server应用暴露的端点访问部署在EDAS上的Java微服务应用。

说明

代码生成能力由qwen3-coder-plus提供,您可以根据实际使用场景修改生成的代码。

操作步骤

  1. EDAS上预创建一个SpringCloud微服务应用,本示例以EDAS上支持的Demo SpringCloud服务端应用为示例。

image

  1. 应用部署成功后,点击应用详情页的服务列表菜单,可以看到EDAS收集的应用注册微服务信息。

image

  1. 点击注册的服务,进入查看微服务详情信息。

image

  1. 查看接口元数据信息,勾选其中需要转化为MCP 工具的接口,并点击 生成MCP工具。

image

  1. 等待生成进度完成,查看已生成的MCP Server的代码内容。

image

  1. 查看生成的代码内容,可按需修改生成的代码,如修改工具执行逻辑、修改工具描述信息、修改工具参数定义等,然后点击下一步。

  2. 点击下一步进入查看生成的测试代码内容,生成的测试代码是基于生成的MCP代码暴露的工具生成,测试代码中包含了对每个暴露的MCP工具的测试调用。

image

  1. (可选)点击执行测试可基于模拟的MCP Client端代码,对生成的MCP Server端工具进行测试验证。测试执行流程可以点击下方的内容查看详细信息。

image

  1. 继续点击下一步,进入生成代码发布为应用界面。输入期望生成的MCP应用名称,即可快速生成MCP应用。

image

  1. (可选)网络暴露设置可以将MCP 应用端点通过支持对接的入口网关进行服务暴露。目前支持对接Nginx Ingress。

image

  1. 点击开始部署,即可直接部署生成的MCP代码为EDAS应用。

访问生成的MCP应用

使用Nginx Ingress访问生成的MCP应用

前提条件

  1. 待部署MCP应用的K8s集群中已安装Nginx Ingress Controller组件。

  2. Nginx Ingress Controller组件的配置ConfigMap(通常为kube-system命名空间下的nginx-configuration)开启了allow-snippet-annotations:"true"。

  3. 生成并部署MCP应用时网络配置做了Nginx Ingress路由配置。

image.png

  1. 应用部署成功后即可使用如下MCP ServerJSON配置快速接入该MCP Server:

{
    "mcpServers": {
        "edasService": {
            "url": "http://42.xxx.xxx.xx/mcp-generated-demo/sse",
            "type": "sse",
            "headers": {
                "edas_mcp_server": "mcp-generated-demo"
            }
        }
    }
}
重要

上述MCP ServerJSON配置中设置的请求头是EDAS基于Nginx Ingress做的路由策略。

  1. 其中url中的42.xxx.xxx.xx/mcp-generated-demo替换为实际的Ingress入口端点及在步骤一显示的MCP转发路径。

  2. headers中的edas_mcp_server为请求固定的Key,请不要修改。

  3. headers中的edas_mcp_server的值“mcp-generated-demo”,请替换为生成的MCP应用名称。

  1. 示例的MCP Client端测试代码如下:

import asyncio
from mcp_use import MCPClient


async def main():
    # Configuration for edas-service MCP server
    config = {
        "mcpServers": {
            "edasService": {
                "url": "http://42.xxx.xxx.xx/mcp-generated-demo/sse",
                "type": "sse",
                "headers": {
                    "edas_mcp_server": "mcp-generated-demo"
                }
            }
        }
    }
    # Initialize client and create session
    client = MCPClient.from_dict(config)
    session = await client.create_session("edasService")

    # List available tools
    tools = await session.list_tools()
    print("\nConnected to server with tools:", [tool.name for tool in tools])

    # Dubbo tool
    result = await session.call_tool('echo_tool', {'str_param': 'my test invoke'})
    print("\nCall tool result:", result.content[0].text)

if __name__ == "__main__":
    asyncio.run(main())
  1. 示例执行结果:

Connected to server with tools: ['echo_tool', 'ping_tool']

Call tool result: 
	1767678574910 Provider received.
		Provider processed after sleep 1 second! Echo String: "my test invoke"
	1767678575910 Provider Return

使用SLB访问MCP Server应用

  1. 根据上述步骤创建了MCP应用,进入MCP应用详情页在访问方式设置菜单中选择添加公网负载均衡:

image.png

在本示例中设置一个TCP监听暴露MCP应用的8000端口(默认)。

说明

实际的容器端口请修改为生成代码实际修改后的监听端口。

  1. 等待绑定SLB成功后客户端使用以下MCP Server JSON配置进行连接:

{
    "mcpServers": {
        "edasService": {
            "url": "http://8.140.xxx.xx/sse",
            "type": "sse"
        }
    }
}
说明

上述配置中的url端点8.140.xxx.xx替换为应用绑定的实际的SLBIP地址。

  1. 使用以下MCP Client端代码进行访问验证:

import asyncio
from mcp_use import MCPClient


async def main():
    # Configuration for edas-service MCP server
    config = {
        "mcpServers": {
            "edasService": {
                "url": "http://8.140.xxx.xx/sse",
                "type": "sse"
            }
        }
    }
    # Initialize client and create session
    client = MCPClient.from_dict(config)
    session = await client.create_session("edasService")

    # List available tools
    tools = await session.list_tools()
    print("\nConnected to server with tools:", [tool.name for tool in tools])

    # Dubbo tool
    result = await session.call_tool('echo', {'str_param': 'my test invoke'})
    print("\nCall tool result:", result.content[0].text)

if __name__ == "__main__":
    asyncio.run(main())
  1. 示例执行结果:

Connected to server with tools: ['echo', 'ping']

Call tool result: 
	1767682903298 Provider received.
		Provider processed after sleep 1 second! Echo String: "my test invoke"
	1767682904298 Provider Return

注意事项

  1. 代码生成能力由qwen3-coder-plus提供,您可以根据实际使用场景修改生成的代码。

  2. 如果生成的MCP Server应用无监控数据,请确保K8s集群中安装并升级了组件ack-onepilot的最新版本。

  3. 如果生成的MCP Server应用无监控数据,请确保应用挂载的监控及治理Python探针版本高于2.2.0。