4.6新版特色功能
WSO2 API Manager 从 4.5 升级到 4.6 的版本中,对 MCP(模型上下文协议,Model Context Protocol)的支持确实是一个非常重要的架构级更新。下面我以 MCP 为切入点,重新梳理一下这个版本的核心变化。
这个新功能的本质,是将 WSO2 API Manager 从一个传统的 API 管理平台,升级为同时具备 AI 就绪能力的网关和中心。它解决了如何让现有 API 被 AI 智能体(Agents)高效、可控地发现和调用的问题。
🌉 核心概念:MCP Gateway 与 MCP Hub
WSO2 APIM 4.6.0 通过引入两个核心概念来实现这一目标:
- MCP Gateway (MCP 网关):这是 API 网关能力的延伸。它让 WSO2 可以原生地接入和处理 MCP 协议,将现有 API 无缝转换为 AI 智能体能直接调用的工具(Tools)。
- MCP Hub (MCP 中心):这是控制平面的新角色。开发者门户(Developer Portal)可以配置为 MCP Hub,成为组织内部所有 MCP 服务器的统一发现、管理和复用中心,方便不同团队共享 AI 能力。
✨ 核心能力:三大应用场景
基于上述架构,WSO2 APIM 4.6.0 为管理和使用 MCP 服务提供了三种主要方式:
-
灵活多样的 MCP 服务创建方式:你可以通过三种途径来生成 MCP 服务:
- 从现有 API 转换:将平台内已有的 API 直接转换为 MCP 服务,让传统 API 快速具备 AI 交互能力。
- 导入外部 API 定义:通过导入标准的 OpenAPI 定义,将外部的 REST API 封装成 MCP 服务。
- 代理外部 MCP 服务器:将已经存在的、第三方或外部的 MCP 服务器接入 WSO2 进行统一代理和管理。
-
MCP Hub 的集中管理:
- 开发者门户模式切换 :你可以将开发者门户设置为
MCP_ONLY(仅MCP模式)、HYBRID(混合模式)或API_ONLY(仅API模式),以匹配团队的消费习惯。 - 集成测试工具 :开发者门户中内置了 MCP Playground,你可以像使用 Swagger UI 一样,在这里直观地浏览 MCP 服务的 Schema 并直接调用其工具进行测试,大大降低了 AI 应用的开发调试门槛。
- 开发者门户模式切换 :你可以将开发者门户设置为
-
开发优先的导入与治理:
- API 控制器支持 :WSO2 的命令行工具 apictl 增加了对 MCP 服务的导入和管理能力。你可以通过
apictl import mcp-server命令,在 CI/CD 管道中自动化地创建和部署 MCP 服务。 - 企业级治理能力 :所有接入的 MCP 服务,都可以享受到 WSO2 APIM 平台原有的治理能力,如认证、限流、监控和分析,确保 AI 对后端服务的访问是安全、可控和可观测的。
- API 控制器支持 :WSO2 的命令行工具 apictl 增加了对 MCP 服务的导入和管理能力。你可以通过
WSO2 API Manager 4.5 到 4.6 数据库升级指南
wso2-apim4.6多了几张表,现在有表加了几个字段,已总结到wso2am4_6_upgrade.sql文件
apimgt4.6新增表
- am_api_metadata
- am_api_operation_mapping
- am_backend
- am_backend_operation_mapping
- am_gw_instance_env_mapping
- am_gw_instances
- am_gw_revision_deployment
- am_task_lock
apimgt4.6表修改
- am_api
- API_DISPLAY_NAME
- INITIATED_FROM_GW
- am_api_primary_ep_mapping
- REVISION_UUID
- am_api_url_mapping
- DESCRIPTION
- SCHEMA_DEFINITION
- am_llm_provider
- MODEL_FAMILY_SUPPORTED
- MODEL_FAMILY_NAME
- am_gateway_environment
- ENV_MODE
- SCHEDULED_TIME
sql总结如下
SET FOREIGN_KEY_CHECKS=0;
-- 去索引避免无法复制数据
-- ALTER TABLE `wso2am_db`.`am_api_metadata` DROP FOREIGN KEY `am_api_metadata_ibfk_1`;
-- ALTER TABLE `wso2am_db`.`am_backend` DROP FOREIGN KEY `am_backend_ibfk_1`;
-- ALTER TABLE `wso2am_db`.`am_gw_revision_deployment` DROP FOREIGN KEY `am_gw_revision_deployment_ibfk_2`;
-- 添加字段
ALTER TABLE `wso2am_db_pre`.`am_api`
MODIFY COLUMN `API_SUBTYPE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `API_TYPE`;
ALTER TABLE `wso2am_db`.`am_api` ADD COLUMN `API_DISPLAY_NAME` varchar(256) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `SUB_VALIDATION`;
ALTER TABLE `wso2am_db`.`am_api` ADD COLUMN `INITIATED_FROM_GW` int NULL DEFAULT 0 AFTER `API_DISPLAY_NAME`;
ALTER TABLE `wso2am_db`.`am_api_primary_ep_mapping` ADD COLUMN `REVISION_UUID` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'Current API' AFTER `ENDPOINT_UUID`;
ALTER TABLE `wso2am_db`.`am_api_url_mapping` ADD COLUMN `DESCRIPTION` blob NULL AFTER `LOG_LEVEL`;
ALTER TABLE `wso2am_db`.`am_api_url_mapping` ADD COLUMN `SCHEMA_DEFINITION` blob NULL AFTER `DESCRIPTION`;
ALTER TABLE `wso2am_db`.`am_llm_provider` ADD COLUMN `MODEL_FAMILY_SUPPORTED` varchar(5) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'false' AFTER `API_DEFINITION`;
ALTER TABLE `wso2am_db`.`am_llm_provider_model` ADD COLUMN `MODEL_FAMILY_NAME` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `MODEL_NAME`;
ALTER TABLE `wso2am_db`.`am_gateway_environment` ADD COLUMN `ENV_MODE` varchar(45) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'WRITE_ONLY' AFTER `GATEWAY_TYPE`;
ALTER TABLE `wso2am_db`.`am_gateway_environment` ADD COLUMN `SCHEDULED_TIME` int NULL DEFAULT NULL AFTER `ENV_MODE`;
CREATE TABLE `wso2am_db`.`am_api_metadata` (
`API_UUID` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`REVISION_UUID` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'Current API',
`METADATA_KEY` varchar(256) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`METADATA_VALUE` varchar(1024) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
PRIMARY KEY (`API_UUID`, `REVISION_UUID`, `METADATA_KEY`) USING BTREE,
CONSTRAINT `am_api_metadata_ibfk_1` FOREIGN KEY (`API_UUID`) REFERENCES `wso2am_db`.`am_api` (`API_UUID`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
CREATE TABLE `wso2am_db`.`am_api_operation_mapping` (
`MAPPING_ID` int NOT NULL AUTO_INCREMENT,
`URL_MAPPING_ID` int NOT NULL,
`REF_URL_MAPPING_ID` int NOT NULL,
PRIMARY KEY (`MAPPING_ID`) USING BTREE,
INDEX `URL_MAPPING_ID`(`URL_MAPPING_ID` ASC) USING BTREE,
INDEX `REF_URL_MAPPING_ID`(`REF_URL_MAPPING_ID` ASC) USING BTREE,
CONSTRAINT `am_api_operation_mapping_ibfk_1` FOREIGN KEY (`URL_MAPPING_ID`) REFERENCES `wso2am_db`.`am_api_url_mapping` (`URL_MAPPING_ID`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `am_api_operation_mapping_ibfk_2` FOREIGN KEY (`REF_URL_MAPPING_ID`) REFERENCES `wso2am_db`.`am_api_url_mapping` (`URL_MAPPING_ID`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
CREATE TABLE `wso2am_db`.`am_backend` (
`BACKEND_ID` varchar(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`BACKEND_NAME` varchar(256) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`ENDPOINT_CONFIG` blob NULL,
`DEFINITION` longblob NULL,
`REFERENCE_API_UUID` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`REFERENCE_API_REVISION_UUID` varchar(256) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'Current API',
`ORGANIZATION` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
PRIMARY KEY (`BACKEND_ID`) USING BTREE,
UNIQUE INDEX `REFERENCE_API_UUID`(`REFERENCE_API_UUID` ASC, `REFERENCE_API_REVISION_UUID` ASC, `BACKEND_NAME` ASC) USING BTREE,
CONSTRAINT `am_backend_ibfk_1` FOREIGN KEY (`REFERENCE_API_UUID`) REFERENCES `wso2am_db`.`am_api` (`API_UUID`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
CREATE TABLE `wso2am_db`.`am_backend_operation_mapping` (
`MAPPING_ID` int NOT NULL AUTO_INCREMENT,
`URL_MAPPING_ID` int NOT NULL,
`BACKEND_ID` varchar(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`TARGET` varchar(256) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`VERB` varchar(10) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
PRIMARY KEY (`MAPPING_ID`) USING BTREE,
INDEX `URL_MAPPING_ID`(`URL_MAPPING_ID` ASC) USING BTREE,
INDEX `BACKEND_ID`(`BACKEND_ID` ASC) USING BTREE,
CONSTRAINT `am_backend_operation_mapping_ibfk_1` FOREIGN KEY (`URL_MAPPING_ID`) REFERENCES `wso2am_db`.`am_api_url_mapping` (`URL_MAPPING_ID`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `am_backend_operation_mapping_ibfk_2` FOREIGN KEY (`BACKEND_ID`) REFERENCES `wso2am_db`.`am_backend` (`BACKEND_ID`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
CREATE TABLE `wso2am_db`.`am_gw_instance_env_mapping` (
`GATEWAY_ID` int NOT NULL,
`ENV_LABEL` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
PRIMARY KEY (`GATEWAY_ID`, `ENV_LABEL`) USING BTREE,
CONSTRAINT `am_gw_instance_env_mapping_ibfk_1` FOREIGN KEY (`GATEWAY_ID`) REFERENCES `wso2am_db`.`am_gw_instances` (`GATEWAY_ID`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
CREATE TABLE `wso2am_db`.`am_gw_instances` (
`GATEWAY_ID` int NOT NULL AUTO_INCREMENT,
`GATEWAY_UUID` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`ORGANIZATION` varchar(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`LAST_UPDATED` timestamp NOT NULL,
`GW_PROPERTIES` blob NOT NULL,
PRIMARY KEY (`GATEWAY_ID`) USING BTREE,
UNIQUE INDEX `GATEWAY_UUID`(`GATEWAY_UUID` ASC, `ORGANIZATION` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
CREATE TABLE `wso2am_db`.`am_gw_revision_deployment` (
`GATEWAY_ID` int NOT NULL,
`API_ID` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`ORGANIZATION` varchar(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`STATUS` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`ACTION` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`REVISION_UUID` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
`LAST_UPDATED` bigint NOT NULL,
PRIMARY KEY (`GATEWAY_ID`, `API_ID`) USING BTREE,
INDEX `API_ID`(`API_ID` ASC) USING BTREE,
INDEX `IDX_GW_REV_DEPLOY_STATUS`(`STATUS` ASC, `ACTION` ASC) USING BTREE,
CONSTRAINT `am_gw_revision_deployment_ibfk_1` FOREIGN KEY (`GATEWAY_ID`) REFERENCES `wso2am_db`.`am_gw_instances` (`GATEWAY_ID`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `am_gw_revision_deployment_ibfk_2` FOREIGN KEY (`API_ID`) REFERENCES `wso2am_db`.`am_api` (`API_UUID`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
CREATE TABLE `wso2am_db`.`am_task_lock` (
`LOCK_TIME` bigint NOT NULL,
`TASK_ID` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
`NODE_ID` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
PRIMARY KEY (`TASK_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS=1;