@cloudbase/cloudbase-mcp 2.34.8 → 2.35.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -5
- package/README.zh-CN.md +1 -1
- package/dist/931.index.cjs +0 -233
- package/dist/cli.cjs +3 -3
- package/dist/index.cjs +5335 -1882
- package/dist/index.d.ts +112 -2
- package/dist/index.js +1577 -1615
- package/package.json +12 -9
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ You need a [CloudBase environment](https://tcb.cloud.tencent.com/dev) and should
|
|
|
63
63
|
| Official MCP Registry `io.github.TencentCloudBase/cloudbase-mcp` | Discover via [registry search=cloudbase](https://registry.modelcontextprotocol.io/v0/servers?search=cloudbase) |
|
|
64
64
|
| `npx plugins add TencentCloudBase/cloudbase-plugin` | Open Plugin Spec tools |
|
|
65
65
|
| `npm i -g @cloudbase/cli && tcb ai` | [CloudBase AI CLI](https://docs.cloudbase.net/cli-v1/ai/introduce) configures many IDEs |
|
|
66
|
-
| Marketplace / built-in plugin | Claude Code, Codex, CodeBuddy, WorkBuddy, Kimi Code, Kimi Work, ZCode, etc. |
|
|
66
|
+
| Marketplace / built-in plugin | Claude Code, Codex, CodeBuddy, WorkBuddy, Doubao, MiniMax Code, DeepSeek Harness, Kimi Code, Kimi Work, ZCode, etc. |
|
|
67
67
|
|
|
68
68
|
## Connection modes
|
|
69
69
|
|
|
@@ -76,7 +76,20 @@ You need a [CloudBase environment](https://tcb.cloud.tencent.com/dev) and should
|
|
|
76
76
|
|
|
77
77
|
Pick the endpoint matching the site your environment lives in—the two sites use separate accounts and credentials.
|
|
78
78
|
|
|
79
|
-
**
|
|
79
|
+
**OAuth (interactive, recommended)**: the URL is the whole configuration—your IDE opens the browser for login and consent, and you pick the environment there. No keys land in config files, and there is nothing to rotate.
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"mcpServers": {
|
|
84
|
+
"cloudbase": {
|
|
85
|
+
"type": "http",
|
|
86
|
+
"url": "https://tcb-api.cloud.tencent.com/mcp/v1"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Static credentials** (for a client without OAuth, and for CI/CD): append `env_id` and a key pair created on the same site as the endpoint.
|
|
80
93
|
|
|
81
94
|
```json
|
|
82
95
|
{
|
|
@@ -93,10 +106,9 @@ Pick the endpoint matching the site your environment lives in—the two sites us
|
|
|
93
106
|
}
|
|
94
107
|
```
|
|
95
108
|
|
|
96
|
-
|
|
109
|
+
> A static key pair stays valid until it is rotated or deleted; an OAuth session ends when you log out. Use the static form only where the browser flow is impossible—and keep it out of a repository.
|
|
97
110
|
|
|
98
|
-
|
|
99
|
-
- **Static credentials (CI/CD)**: add `env_id` with the `X-TencentCloud-*` headers above.
|
|
111
|
+
**Local**: runs `npx @cloudbase/cloudbase-mcp@latest` on your machine—full features, including local filesystem upload and template download. Requires Node.js v18.15.0+.
|
|
100
112
|
|
|
101
113
|
Remote trade-off: local-filesystem features (upload, template download) are unavailable, and the international site does not yet expose NoSQL tools.
|
|
102
114
|
|
package/README.zh-CN.md
CHANGED
|
@@ -63,7 +63,7 @@ IDE 支持时优先用 Plugin;只需 MCP 配置时用本包即可。
|
|
|
63
63
|
| Official MCP Registry `io.github.TencentCloudBase/cloudbase-mcp` | [registry search=cloudbase](https://registry.modelcontextprotocol.io/v0/servers?search=cloudbase) 发现 |
|
|
64
64
|
| `npx plugins add TencentCloudBase/cloudbase-plugin` | 支持 Open Plugin Spec 的工具 |
|
|
65
65
|
| `npm i -g @cloudbase/cli && tcb ai` | [CloudBase AI CLI](https://docs.cloudbase.net/cli-v1/ai/introduce) 统一配置多种 IDE |
|
|
66
|
-
| Marketplace / 内置插件 | Claude Code、Codex、CodeBuddy、WorkBuddy、Kimi Code、Kimi Work、ZCode 等 |
|
|
66
|
+
| Marketplace / 内置插件 | Claude Code、Codex、CodeBuddy、WorkBuddy、豆包、MiniMax Code、DeepSeek Harness、Kimi Code、Kimi Work、ZCode 等 |
|
|
67
67
|
|
|
68
68
|
## 连接方式
|
|
69
69
|
|
package/dist/931.index.cjs
CHANGED
|
@@ -918,239 +918,6 @@ function ContentDisposition (type, parameters) {
|
|
|
918
918
|
}
|
|
919
919
|
|
|
920
920
|
|
|
921
|
-
/***/ },
|
|
922
|
-
|
|
923
|
-
/***/ 22525
|
|
924
|
-
(__unused_webpack_module, exports) {
|
|
925
|
-
|
|
926
|
-
"use strict";
|
|
927
|
-
/*!
|
|
928
|
-
* content-type
|
|
929
|
-
* Copyright(c) 2015 Douglas Christopher Wilson
|
|
930
|
-
* MIT Licensed
|
|
931
|
-
*/
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
/**
|
|
936
|
-
* RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1
|
|
937
|
-
*
|
|
938
|
-
* parameter = token "=" ( token / quoted-string )
|
|
939
|
-
* token = 1*tchar
|
|
940
|
-
* tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
|
|
941
|
-
* / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
|
|
942
|
-
* / DIGIT / ALPHA
|
|
943
|
-
* ; any VCHAR, except delimiters
|
|
944
|
-
* quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
|
|
945
|
-
* qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
|
|
946
|
-
* obs-text = %x80-FF
|
|
947
|
-
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
|
948
|
-
*/
|
|
949
|
-
var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g // eslint-disable-line no-control-regex
|
|
950
|
-
var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ // eslint-disable-line no-control-regex
|
|
951
|
-
var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/
|
|
952
|
-
|
|
953
|
-
/**
|
|
954
|
-
* RegExp to match quoted-pair in RFC 7230 sec 3.2.6
|
|
955
|
-
*
|
|
956
|
-
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
|
957
|
-
* obs-text = %x80-FF
|
|
958
|
-
*/
|
|
959
|
-
var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g // eslint-disable-line no-control-regex
|
|
960
|
-
|
|
961
|
-
/**
|
|
962
|
-
* RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6
|
|
963
|
-
*/
|
|
964
|
-
var QUOTE_REGEXP = /([\\"])/g
|
|
965
|
-
|
|
966
|
-
/**
|
|
967
|
-
* RegExp to match type in RFC 7231 sec 3.1.1.1
|
|
968
|
-
*
|
|
969
|
-
* media-type = type "/" subtype
|
|
970
|
-
* type = token
|
|
971
|
-
* subtype = token
|
|
972
|
-
*/
|
|
973
|
-
var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/
|
|
974
|
-
|
|
975
|
-
/**
|
|
976
|
-
* Module exports.
|
|
977
|
-
* @public
|
|
978
|
-
*/
|
|
979
|
-
|
|
980
|
-
exports.format = format
|
|
981
|
-
exports.parse = parse
|
|
982
|
-
|
|
983
|
-
/**
|
|
984
|
-
* Format object to media type.
|
|
985
|
-
*
|
|
986
|
-
* @param {object} obj
|
|
987
|
-
* @return {string}
|
|
988
|
-
* @public
|
|
989
|
-
*/
|
|
990
|
-
|
|
991
|
-
function format (obj) {
|
|
992
|
-
if (!obj || typeof obj !== 'object') {
|
|
993
|
-
throw new TypeError('argument obj is required')
|
|
994
|
-
}
|
|
995
|
-
|
|
996
|
-
var parameters = obj.parameters
|
|
997
|
-
var type = obj.type
|
|
998
|
-
|
|
999
|
-
if (!type || !TYPE_REGEXP.test(type)) {
|
|
1000
|
-
throw new TypeError('invalid type')
|
|
1001
|
-
}
|
|
1002
|
-
|
|
1003
|
-
var string = type
|
|
1004
|
-
|
|
1005
|
-
// append parameters
|
|
1006
|
-
if (parameters && typeof parameters === 'object') {
|
|
1007
|
-
var param
|
|
1008
|
-
var params = Object.keys(parameters).sort()
|
|
1009
|
-
|
|
1010
|
-
for (var i = 0; i < params.length; i++) {
|
|
1011
|
-
param = params[i]
|
|
1012
|
-
|
|
1013
|
-
if (!TOKEN_REGEXP.test(param)) {
|
|
1014
|
-
throw new TypeError('invalid parameter name')
|
|
1015
|
-
}
|
|
1016
|
-
|
|
1017
|
-
string += '; ' + param + '=' + qstring(parameters[param])
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
|
|
1021
|
-
return string
|
|
1022
|
-
}
|
|
1023
|
-
|
|
1024
|
-
/**
|
|
1025
|
-
* Parse media type to object.
|
|
1026
|
-
*
|
|
1027
|
-
* @param {string|object} string
|
|
1028
|
-
* @return {Object}
|
|
1029
|
-
* @public
|
|
1030
|
-
*/
|
|
1031
|
-
|
|
1032
|
-
function parse (string) {
|
|
1033
|
-
if (!string) {
|
|
1034
|
-
throw new TypeError('argument string is required')
|
|
1035
|
-
}
|
|
1036
|
-
|
|
1037
|
-
// support req/res-like objects as argument
|
|
1038
|
-
var header = typeof string === 'object'
|
|
1039
|
-
? getcontenttype(string)
|
|
1040
|
-
: string
|
|
1041
|
-
|
|
1042
|
-
if (typeof header !== 'string') {
|
|
1043
|
-
throw new TypeError('argument string is required to be a string')
|
|
1044
|
-
}
|
|
1045
|
-
|
|
1046
|
-
var index = header.indexOf(';')
|
|
1047
|
-
var type = index !== -1
|
|
1048
|
-
? header.slice(0, index).trim()
|
|
1049
|
-
: header.trim()
|
|
1050
|
-
|
|
1051
|
-
if (!TYPE_REGEXP.test(type)) {
|
|
1052
|
-
throw new TypeError('invalid media type')
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
var obj = new ContentType(type.toLowerCase())
|
|
1056
|
-
|
|
1057
|
-
// parse parameters
|
|
1058
|
-
if (index !== -1) {
|
|
1059
|
-
var key
|
|
1060
|
-
var match
|
|
1061
|
-
var value
|
|
1062
|
-
|
|
1063
|
-
PARAM_REGEXP.lastIndex = index
|
|
1064
|
-
|
|
1065
|
-
while ((match = PARAM_REGEXP.exec(header))) {
|
|
1066
|
-
if (match.index !== index) {
|
|
1067
|
-
throw new TypeError('invalid parameter format')
|
|
1068
|
-
}
|
|
1069
|
-
|
|
1070
|
-
index += match[0].length
|
|
1071
|
-
key = match[1].toLowerCase()
|
|
1072
|
-
value = match[2]
|
|
1073
|
-
|
|
1074
|
-
if (value.charCodeAt(0) === 0x22 /* " */) {
|
|
1075
|
-
// remove quotes
|
|
1076
|
-
value = value.slice(1, -1)
|
|
1077
|
-
|
|
1078
|
-
// remove escapes
|
|
1079
|
-
if (value.indexOf('\\') !== -1) {
|
|
1080
|
-
value = value.replace(QESC_REGEXP, '$1')
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
|
-
|
|
1084
|
-
obj.parameters[key] = value
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
if (index !== header.length) {
|
|
1088
|
-
throw new TypeError('invalid parameter format')
|
|
1089
|
-
}
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1092
|
-
return obj
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
/**
|
|
1096
|
-
* Get content-type from req/res objects.
|
|
1097
|
-
*
|
|
1098
|
-
* @param {object}
|
|
1099
|
-
* @return {Object}
|
|
1100
|
-
* @private
|
|
1101
|
-
*/
|
|
1102
|
-
|
|
1103
|
-
function getcontenttype (obj) {
|
|
1104
|
-
var header
|
|
1105
|
-
|
|
1106
|
-
if (typeof obj.getHeader === 'function') {
|
|
1107
|
-
// res-like
|
|
1108
|
-
header = obj.getHeader('content-type')
|
|
1109
|
-
} else if (typeof obj.headers === 'object') {
|
|
1110
|
-
// req-like
|
|
1111
|
-
header = obj.headers && obj.headers['content-type']
|
|
1112
|
-
}
|
|
1113
|
-
|
|
1114
|
-
if (typeof header !== 'string') {
|
|
1115
|
-
throw new TypeError('content-type header is missing from object')
|
|
1116
|
-
}
|
|
1117
|
-
|
|
1118
|
-
return header
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1121
|
-
/**
|
|
1122
|
-
* Quote a string if necessary.
|
|
1123
|
-
*
|
|
1124
|
-
* @param {string} val
|
|
1125
|
-
* @return {string}
|
|
1126
|
-
* @private
|
|
1127
|
-
*/
|
|
1128
|
-
|
|
1129
|
-
function qstring (val) {
|
|
1130
|
-
var str = String(val)
|
|
1131
|
-
|
|
1132
|
-
// no need to quote tokens
|
|
1133
|
-
if (TOKEN_REGEXP.test(str)) {
|
|
1134
|
-
return str
|
|
1135
|
-
}
|
|
1136
|
-
|
|
1137
|
-
if (str.length > 0 && !TEXT_REGEXP.test(str)) {
|
|
1138
|
-
throw new TypeError('invalid parameter value')
|
|
1139
|
-
}
|
|
1140
|
-
|
|
1141
|
-
return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"'
|
|
1142
|
-
}
|
|
1143
|
-
|
|
1144
|
-
/**
|
|
1145
|
-
* Class to represent a content type.
|
|
1146
|
-
* @private
|
|
1147
|
-
*/
|
|
1148
|
-
function ContentType (type) {
|
|
1149
|
-
this.parameters = Object.create(null)
|
|
1150
|
-
this.type = type
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
921
|
/***/ },
|
|
1155
922
|
|
|
1156
923
|
/***/ 51618
|