@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 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
- **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+.
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
- Remote auth takes one of two paths:
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
- - **OAuth (interactive, recommended)**: add the URL only—your IDE opens the browser for login and consent, so no keys land in config files.
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
 
@@ -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