Skip to content

Commit f019966

Browse files
authored
[Feat] mcp server (#528)
1 parent c7a1d97 commit f019966

File tree

10 files changed

+1977
-3
lines changed

10 files changed

+1977
-3
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: ubuntu-latest
1414
strategy:
1515
matrix:
16-
node-version: [12.x, 14.x, 16.x, 18.x]
16+
node-version: [12.x, 14.x, 16.x, 18.x, 20.x]
1717
steps:
1818
- uses: actions/checkout@v2
1919
- name: Use Node.js ${{ matrix.node-version }}
@@ -22,5 +22,5 @@ jobs:
2222
node-version: ${{ matrix.node-version }}
2323
- run: npm install
2424
- run: npm run lint
25-
if: matrix.node-version == '18.x'
25+
if: matrix.node-version == '20.x'
2626
- run: npm run build --if-present

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,6 @@ package-lock.json
2424
# visual studio
2525
.history
2626
dist/*
27+
28+
# Private individual user cursor rules
29+
.cursor/rules/_*.mdc

src/common/router.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ export const getRouterData = (app) => {
9595
() => import("../layouts/BasicLayout"),
9696
),
9797
},
98+
"/plug/Mcp/mcpServer": {
99+
component: dynamicWrapper(
100+
app,
101+
["mcpServer"],
102+
() => import("../routes/Plugin/McpServer"),
103+
),
104+
},
98105
"/home": {
99106
component: dynamicWrapper(app, [], () => import("../routes/Home")),
100107
},

src/locales/en-US.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,23 @@
2424
"SHENYU.COMMON.SURE": "Sure",
2525
"SHENYU.COMMON.CALCEL": "Cancel",
2626
"SHENYU.COMMON.RULE.NAME": "RuleName",
27+
"SHENYU.COMMON.TOOL.NAME": "ToolName",
28+
"SHENYU.COMMON.RULE.HANDLE": "Handle",
29+
"SHENYU.COMMON.TOOL.REQUESTMETHOD": "RequestMethod",
30+
"SHENYU.COMMON.TOOL.REQUESTURI": "RequestURI",
31+
"SHENYU.COMMON.TOOL.REQUESTPARAMS": "RequestParams",
32+
"SHENYU.COMMON.TOOL.REQUESTCONFIG": "RequestConfig",
2733
"SHENYU.COMMON.SYN": "Synchronous",
34+
"SHENYU.COMMON.PREVIEW": "Preview",
2835
"SHENYU.COMMON.ADD.RULE": "Add",
36+
"SHENYU.COMMON.ADD.TOOL": "Add",
2937
"SHENYU.COMMON.ADD": "Add",
3038
"SHENYU.COMMON.COPY": "Copy",
3139
"SHENYU.COMMON.INPUTNAME": "InputName",
40+
"SHENYU.COMMON.INPUTDESCRIPTION": "InputDescription",
41+
"SHENYU.COMMON.INPUTREQUESTCONFIG": "InputRequestConfig",
42+
"SHENYU.COMMON.INPUTREQUESTMETHOD": "InputRequestMethod",
43+
"SHENYU.COMMON.INPUTREQUESTURI": "InputRequestURI",
3244
"SHENYU.COMMON.TYPE": "Type",
3345
"SHENYU.COMMON.INPUTTYPE": "InputType",
3446
"SHENYU.COMMON.SELECTOR.TYPE.FULL": "full",
@@ -37,6 +49,10 @@
3749
"SHENYU.COMMON.MATCHTYPE": "MatchType",
3850
"SHENYU.COMMON.INPUTMATCHTYPE": "MatchMode",
3951
"SHENYU.COMMON.CONDITION": "Conditions",
52+
"SHENYU.COMMON.PARAMETER": "Parameter",
53+
"SHENYU.COMMON.PARAMETER.NAME": "ParamName",
54+
"SHENYU.COMMON.PARAMETER.TYPE": "ParamType",
55+
"SHENYU.COMMON.PARAMETER.DESCRIPTION": "ParamDescription",
4056
"SHENYU.COMMON.DEAL": "Handler",
4157
"SHENYU.COMMON.DEAL.COMPONENT": "Component Handler",
4258
"SHENYU.COMMON.DEAL.CUSTOM": "Custom Handler",
@@ -81,15 +97,23 @@
8197
"SHENYU.MENU.SYSTEM.MANAGMENT.NAMESPACE": "Namespace",
8298
"SHENYU.MENU.CONFIG.MANAGMENT": "BasicConfig",
8399
"SHENYU.PLUGIN.SELECTOR.LIST.TITLE": "SelectorList",
100+
"SHENYU.PLUGIN.SERVER.LIST.TITLE": "ServerList",
84101
"SHENYU.PLUGIN.SELECTOR.LIST.ADD": "Add",
85102
"SHENYU.PLUGIN.SELECTOR.BATCH.OPENED": "Batch Opened",
86103
"SHENYU.PLUGIN.SELECTOR.BATCH.CLOSED": "Batch Closed",
87104
"SHENYU.PLUGIN.SELECTOR.RULE.LIST": "RulesList",
105+
"SHENYU.PLUGIN.SELECTOR.TOOL.LIST": "ToolList",
88106
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.NAME": "Name",
107+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.DESCRIPTION": "Description",
108+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.REQUESTCONFIG": "RequestConfig",
109+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.REQUESTMETHOD": "RequestMethod",
110+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.REQUESTURI": "RequestURI",
89111
"SHENYU.PLUGIN.SEARCH.SELECTOR.NAME": "Name",
90112
"SHENYU.PLUGIN.SEARCH.RULE.NAME": "RuleName",
113+
"SHENYU.PLUGIN.SEARCH.TOOL.NAME": "ToolName",
91114
"SHENYU.PLUGIN.SEARCH.RULE.COPY": "Copy Rule",
92115
"SHENYU.SELECTOR.NAME": "Selector",
116+
"SHENYU.SERVER.NAME": "Server",
93117
"SHENYU.SELECTOR.COPY": "Copy Selector",
94118
"SHENYU.SELECTOR.CONTINUE": "Continued",
95119
"SHENYU.SELECTOR.PRINTLOG": "PrintLogs",
@@ -100,6 +124,7 @@
100124
"SHENYU.SELECTOR.INPUTORDER": "You can fill in the numeric flag execution order between 1 and 1000",
101125
"SHENYU.SELECTOR.SOURCE.PLACEHOLDER": "Please select the selector you want to copy",
102126
"SHENYU.RULE.NAME": "Rules",
127+
"SHENYU.TOOL.NAME": "Tools",
103128
"SHENYU.RULE.SOURCE.PLACEHOLDER": "Please select the rule you want to copy",
104129
"SHENYU.COMMON.LOAD": "LoadPlugins",
105130
"SHENYU.COMMON.LOADSTRATEGY": "LoadStrategy",

src/locales/zh-CN.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,23 @@
2323
"SHENYU.COMMON.SURE": "确认",
2424
"SHENYU.COMMON.CALCEL": "取消",
2525
"SHENYU.COMMON.RULE.NAME": "规则名称",
26+
"SHENYU.COMMON.TOOL.NAME": "工具名称",
27+
"SHENYU.COMMON.RULE.HANDLE": "处理",
28+
"SHENYU.COMMON.TOOL.REQUESTMETHOD": "请求方法",
29+
"SHENYU.COMMON.TOOL.REQUESTURI": "请求URI",
30+
"SHENYU.COMMON.TOOL.REQUESTPARAMS": "请求参数",
31+
"SHENYU.COMMON.TOOL.REQUESTCONFIG": "请求配置",
2632
"SHENYU.COMMON.SYN": "同步自定义",
33+
"SHENYU.COMMON.PREVIEW": "预览",
2734
"SHENYU.COMMON.ADD.RULE": "添加规则",
35+
"SHENYU.COMMON.ADD.TOOL": "添加工具",
2836
"SHENYU.COMMON.ADD": "新增",
2937
"SHENYU.COMMON.COPY": "复制",
3038
"SHENYU.COMMON.INPUTNAME": "请输入名称",
39+
"SHENYU.COMMON.INPUTDESCRIPTION": "请输入描述",
40+
"SHENYU.COMMON.INPUTREQUESTCONFIG": "请输入请求配置",
41+
"SHENYU.COMMON.INPUTREQUESTMETHOD": "请输入请求方法",
42+
"SHENYU.COMMON.INPUTREQUESTURI": "请输入请求URI",
3143
"SHENYU.COMMON.TYPE": "类型",
3244
"SHENYU.COMMON.INPUTTYPE": "请输入类型",
3345
"SHENYU.COMMON.SELECTOR.TYPE.FULL": "全流量",
@@ -36,6 +48,10 @@
3648
"SHENYU.COMMON.MATCHTYPE": "匹配方式",
3749
"SHENYU.COMMON.INPUTMATCHTYPE": "请选择匹配方式",
3850
"SHENYU.COMMON.CONDITION": "条件",
51+
"SHENYU.COMMON.PARAMETER": "参数",
52+
"SHENYU.COMMON.PARAMETER.NAME": "参数名称",
53+
"SHENYU.COMMON.PARAMETER.TYPE": "参数类型",
54+
"SHENYU.COMMON.PARAMETER.DESCRIPTION": "参数描述",
3955
"SHENYU.COMMON.DEAL": "处理",
4056
"SHENYU.COMMON.DEAL.COMPONENT": "组件处理",
4157
"SHENYU.COMMON.DEAL.CUSTOM": "自定义处理",
@@ -82,15 +98,23 @@
8298
"SHENYU.MENU.CONFIG.MANAGMENT": "基础配置",
8399
"SHENYU.MENU.SYSTEM.MANAGMENT.NAMESPACE": "命名空间管理",
84100
"SHENYU.PLUGIN.SELECTOR.LIST.TITLE": "选择器列表",
101+
"SHENYU.PLUGIN.SERVER.LIST.TITLE": "服务列表",
85102
"SHENYU.PLUGIN.SELECTOR.LIST.ADD": "添加选择器",
86103
"SHENYU.PLUGIN.SELECTOR.BATCH.OPENED": "批量开启",
87104
"SHENYU.PLUGIN.SELECTOR.BATCH.CLOSED": "批量关闭",
88105
"SHENYU.PLUGIN.SELECTOR.RULE.LIST": "选择器规则列表",
106+
"SHENYU.PLUGIN.SELECTOR.TOOL.LIST": "选择器工具列表",
89107
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.NAME": "名称",
108+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.DESCRIPTION": "描述",
109+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.REQUESTCONFIG": "请求配置",
110+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.REQUESTMETHOD": "请求方法",
111+
"SHENYU.PLUGIN.SELECTOR.LIST.COLUMN.REQUESTURI": "请求URI",
90112
"SHENYU.PLUGIN.SEARCH.SELECTOR.NAME": "选择器名称",
91113
"SHENYU.PLUGIN.SEARCH.RULE.NAME": "规则名称",
114+
"SHENYU.PLUGIN.SEARCH.TOOL.NAME": "工具名称",
92115
"SHENYU.PLUGIN.SEARCH.RULE.COPY": "复制规则",
93116
"SHENYU.SELECTOR.NAME": "选择器",
117+
"SHENYU.SERVER.NAME": "服务",
94118
"SHENYU.SELECTOR.COPY": "复制选择器",
95119
"SHENYU.SELECTOR.CONTINUE": "继续后续选择器",
96120
"SHENYU.SELECTOR.PRINTLOG": "打印日志",
@@ -101,6 +125,7 @@
101125
"SHENYU.SELECTOR.INPUTORDER": "可以填写1-1000之间的数字标志执行先后顺序",
102126
"SHENYU.SELECTOR.SOURCE.PLACEHOLDER": "请选择需要复制的选择器",
103127
"SHENYU.RULE.NAME": "规则",
128+
"SHENYU.TOOL.NAME": "工具",
104129
"SHENYU.RULE.SOURCE.PLACEHOLDER": "请选择需要复制的规则",
105130
"SHENYU.COMMON.LOAD": "负载",
106131
"SHENYU.COMMON.LOADSTRATEGY": "负载策略",

src/models/mcpServer.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { message } from "antd";
2+
import {
3+
fetchMcpServer,
4+
addMcpServer,
5+
updateMcpServer,
6+
deleteMcpServer,
7+
} from "../services/api";
8+
import { getIntlContent } from "../utils/IntlUtils";
9+
10+
export default {
11+
namespace: "mcpServer",
12+
13+
state: {
14+
list: [],
15+
total: 0,
16+
currentPage: 1,
17+
pageSize: 12,
18+
},
19+
20+
effects: {
21+
*fetch({ payload }, { call, put }) {
22+
const response = yield call(fetchMcpServer, payload);
23+
if (response) {
24+
yield put({
25+
type: "saveList",
26+
payload: {
27+
list: response.data,
28+
total: response.total,
29+
currentPage: payload.currentPage,
30+
pageSize: payload.pageSize,
31+
},
32+
});
33+
}
34+
},
35+
*add({ payload, callback }, { call, put }) {
36+
const response = yield call(addMcpServer, payload);
37+
if (response) {
38+
message.success(getIntlContent("SHENYU.COMMON.RESPONSE.ADD.SUCCESS"));
39+
yield put({ type: "reload" });
40+
}
41+
if (callback) callback();
42+
},
43+
*update({ payload, callback }, { call, put }) {
44+
const response = yield call(updateMcpServer, payload);
45+
if (response) {
46+
message.success(
47+
getIntlContent("SHENYU.COMMON.RESPONSE.UPDATE.SUCCESS"),
48+
);
49+
yield put({ type: "reload" });
50+
}
51+
if (callback) callback();
52+
},
53+
*delete({ payload, callback }, { call, put }) {
54+
const response = yield call(deleteMcpServer, payload);
55+
if (response) {
56+
message.success(
57+
getIntlContent("SHENYU.COMMON.RESPONSE.DELETE.SUCCESS"),
58+
);
59+
yield put({ type: "reload" });
60+
}
61+
if (callback) callback();
62+
},
63+
*reload(_, { put, select }) {
64+
const { currentPage, pageSize } = yield select(
65+
(state) => state.mcpServer,
66+
);
67+
yield put({
68+
type: "fetch",
69+
payload: { currentPage, pageSize },
70+
});
71+
},
72+
},
73+
74+
reducers: {
75+
saveList(state, { payload }) {
76+
return {
77+
...state,
78+
list: payload.list,
79+
total: payload.total,
80+
currentPage: payload.currentPage,
81+
pageSize: payload.pageSize,
82+
};
83+
},
84+
},
85+
};

src/routes/Plugin/Common/Selector.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1725,7 +1725,7 @@ class AddModal extends Component {
17251725
<Modal
17261726
width="1100px"
17271727
centered
1728-
title={getIntlContent("SHENYU.SELECTOR.NAME")}
1728+
title={this.props.modalTitle || getIntlContent("SHENYU.SELECTOR.NAME")}
17291729
// visible here defaults to true, because the visibility of modal is determined by the popup attribute in index.js
17301730
visible
17311731
okText={getIntlContent("SHENYU.COMMON.SURE")}

0 commit comments

Comments
 (0)