bdy 1.22.90 → 1.22.91-dev
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/distTs/package.json +2 -2
- package/distTs/src/command/mcp.js +64 -21
- package/distTs/src/input.js +15 -0
- package/distTs/src/texts.js +26 -5
- package/distTs/src/utils.js +78 -1
- package/package.json +2 -2
package/distTs/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bdy",
|
|
3
3
|
"preferGlobal": false,
|
|
4
|
-
"version": "1.22.
|
|
4
|
+
"version": "1.22.91-dev",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://buddy.works/docs/cli",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"@fastify/accept-negotiator": "2.0.1",
|
|
43
43
|
"@fastify/cors": "11.2.0",
|
|
44
44
|
"@inquirer/prompts": "8.5.2",
|
|
45
|
-
"@modelcontextprotocol/sdk": "
|
|
45
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
46
46
|
"@puppeteer/browsers": "2.13.0",
|
|
47
47
|
"@scalar/json-magic": "0.12.16",
|
|
48
48
|
"@scalar/openapi-parser": "0.28.7",
|
|
@@ -13,11 +13,22 @@ const logErr = (msg) => {
|
|
|
13
13
|
};
|
|
14
14
|
const commandMcp = (0, utils_1.newCommand)('mcp', texts_1.DESC_COMMAND_MCP);
|
|
15
15
|
commandMcp.skipPre = true;
|
|
16
|
-
commandMcp.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
commandMcp.option('-t, --tools <list>', texts_1.OPT_COMMAND_MCP_TOOLS);
|
|
17
|
+
commandMcp.addHelpText('after', `\n${(0, texts_1.HELP_COMMAND_MCP)(utils_1.MCP_TOOL_CATEGORIES.map(({ name, description }) => ` ${name.padEnd(12)}${description}`).join('\n'))}`);
|
|
18
|
+
commandMcp.action(async (options) => {
|
|
19
|
+
// The proxy is meant to be spawned by an MCP client with piped stdio. Run
|
|
20
|
+
// interactively it would sit waiting for JSON-RPC on stdin - show the help
|
|
21
|
+
// (with the client registration instructions) instead
|
|
22
|
+
if (output_1.default.isStdInTTY()) {
|
|
23
|
+
commandMcp.help();
|
|
24
|
+
}
|
|
25
|
+
const allowedCategories = input_1.default.mcpToolCategories(options.tools);
|
|
26
|
+
const isToolAllowed = (name) => {
|
|
27
|
+
if (!allowedCategories)
|
|
28
|
+
return true;
|
|
29
|
+
const category = (0, utils_1.getMcpToolCategory)(name);
|
|
30
|
+
return category !== null && allowedCategories.has(category);
|
|
31
|
+
};
|
|
21
32
|
const { token, refreshToken, clientId, clientSecret, clientToken } = input_1.default.restApiToken();
|
|
22
33
|
const baseUrl = input_1.default.restApiBaseUrl('', '', token);
|
|
23
34
|
// BUDDY_MCP_ENDPOINT is intentionally undocumented - it exists only for
|
|
@@ -128,17 +139,52 @@ commandMcp.action(async () => {
|
|
|
128
139
|
// On stdin EOF responses to piped one-shot requests (e.g. `echo <initialize
|
|
129
140
|
// message> | bdy mcp`) may still be in flight - exit once they all got their
|
|
130
141
|
// response, with a hard cap as remote.send() can resolve before an
|
|
131
|
-
// SSE-delivered response arrives
|
|
132
|
-
|
|
142
|
+
// SSE-delivered response arrives. The request method is kept so tools/list
|
|
143
|
+
// responses can be recognized and filtered
|
|
144
|
+
const pendingRequests = new Map();
|
|
133
145
|
let stdinClosed = false;
|
|
134
146
|
const exitWhenDrained = () => {
|
|
135
147
|
if (stdinClosed && !pendingRequests.size)
|
|
136
148
|
void shutdown(0);
|
|
137
149
|
};
|
|
150
|
+
// Delivers a response to the client, keeping its request id pending until
|
|
151
|
+
// the write settles so exitWhenDrained cannot fire in between - used for
|
|
152
|
+
// forwarded remote responses and locally-synthesized errors alike
|
|
153
|
+
const respondLocal = (message, requestId) => {
|
|
154
|
+
if (requestId !== undefined)
|
|
155
|
+
pendingRequests.set(requestId, 'response');
|
|
156
|
+
local
|
|
157
|
+
.send(message)
|
|
158
|
+
.catch((err) => {
|
|
159
|
+
fatal(`Failed to write to stdout: ${err.message}`);
|
|
160
|
+
})
|
|
161
|
+
.finally(() => {
|
|
162
|
+
if (requestId !== undefined) {
|
|
163
|
+
pendingRequests.delete(requestId);
|
|
164
|
+
exitWhenDrained();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
};
|
|
138
168
|
local.onmessage = (message) => {
|
|
139
169
|
const m = message;
|
|
140
|
-
|
|
141
|
-
|
|
170
|
+
const isRequest = m.id !== undefined && m.method !== undefined;
|
|
171
|
+
// Calls to tools outside the selected categories are answered locally
|
|
172
|
+
// with a JSON-RPC error instead of being forwarded
|
|
173
|
+
if (isRequest &&
|
|
174
|
+
m.method === 'tools/call' &&
|
|
175
|
+
!isToolAllowed(m.params?.name ?? '')) {
|
|
176
|
+
respondLocal({
|
|
177
|
+
jsonrpc: '2.0',
|
|
178
|
+
id: m.id,
|
|
179
|
+
error: {
|
|
180
|
+
code: -32602,
|
|
181
|
+
message: (0, texts_1.ERR_MCP_TOOL_FILTERED)(m.params?.name ?? ''),
|
|
182
|
+
},
|
|
183
|
+
}, m.id);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (isRequest)
|
|
187
|
+
pendingRequests.set(m.id, m.method);
|
|
142
188
|
remote.send(message).catch((err) => {
|
|
143
189
|
if (m.id !== undefined)
|
|
144
190
|
pendingRequests.delete(m.id);
|
|
@@ -147,18 +193,15 @@ commandMcp.action(async () => {
|
|
|
147
193
|
};
|
|
148
194
|
remote.onmessage = (message) => {
|
|
149
195
|
const m = message;
|
|
150
|
-
local
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
exitWhenDrained();
|
|
160
|
-
}
|
|
161
|
-
});
|
|
196
|
+
// a message with an id and no method is a response to a local request
|
|
197
|
+
const isResponse = m.id !== undefined && m.method === undefined;
|
|
198
|
+
if (isResponse &&
|
|
199
|
+
allowedCategories &&
|
|
200
|
+
pendingRequests.get(m.id) === 'tools/list' &&
|
|
201
|
+
m.result?.tools) {
|
|
202
|
+
m.result.tools = m.result.tools.filter((t) => isToolAllowed(t.name));
|
|
203
|
+
}
|
|
204
|
+
respondLocal(message, isResponse ? m.id : undefined);
|
|
162
205
|
};
|
|
163
206
|
local.onerror = (err) => {
|
|
164
207
|
logErr(`Local transport error: ${err.message}`);
|
package/distTs/src/input.js
CHANGED
|
@@ -215,6 +215,21 @@ class Input {
|
|
|
215
215
|
}
|
|
216
216
|
return whitelist;
|
|
217
217
|
}
|
|
218
|
+
static mcpToolCategories(tools) {
|
|
219
|
+
if (!tools)
|
|
220
|
+
return null;
|
|
221
|
+
const categories = tools
|
|
222
|
+
.split(',')
|
|
223
|
+
.map((c) => c.trim().toLowerCase())
|
|
224
|
+
.filter((c) => c.length > 0);
|
|
225
|
+
const valid = utils_1.MCP_TOOL_CATEGORIES.map((c) => c.name);
|
|
226
|
+
for (const category of categories) {
|
|
227
|
+
if (!valid.includes(category)) {
|
|
228
|
+
output_1.default.exitError((0, texts_1.ERR_MCP_TOOLS_CATEGORY)(category, valid.join(', ')));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return categories.length > 0 ? new Set(categories) : null;
|
|
232
|
+
}
|
|
218
233
|
static region(region) {
|
|
219
234
|
if (!region)
|
|
220
235
|
output_1.default.exitError((0, texts_1.ERR_REGION_IS_NOT_VALID)(''));
|
package/distTs/src/texts.js
CHANGED
|
@@ -13,11 +13,11 @@ exports.DESC_COMMAND_SANDBOX_LOGS = exports.DESC_COMMAND_SANDBOX_RESTART = expor
|
|
|
13
13
|
exports.DESC_COMMAND_SANDBOX_APP_REMOVE = exports.DESC_COMMAND_SANDBOX_APP_ADD = exports.DESC_COMMAND_SANDBOX_APP_LIST = exports.TXT_SANDBOX_WAITING_START = exports.TXT_SANDBOX_WAITING_STOP = exports.TXT_SANDBOX_WAITING_APPS = exports.TXT_SANDBOX_WAITING_SETUP = exports.TXT_SANDBOX_WAITING_RUNNING = exports.TXT_SANDBOX_STOPPED = exports.TXT_SANDBOX_STARTED = exports.TXT_SANDBOX_DESTROYED = exports.TXT_SANDBOX_DESTROY_CONFIRM = exports.TXT_SANDBOX_UPDATED = exports.TXT_SANDBOX_CREATED = exports.TXT_SANDBOX_CREATING = exports.TXT_SANDBOX_APP_STARTED = exports.TXT_SANDBOX_APP_STOPPED = exports.OPTION_SANDBOX_WAIT = exports.OPTION_SANDBOX_WAIT_APPS = exports.OPTION_SANDBOX_WAIT_CONFIGURED = exports.OPTION_SANDBOX_WAIT_RUNNING = exports.ERR_SANDBOX_STOP_FAILED = exports.ERR_SANDBOX_NO_COMMANDS = exports.ERR_SANDBOX_RUNNING_FAILED = exports.ERR_SANDBOX_STOP_TIMEOUT = exports.ERR_SANDBOX_SNAPSHOT_TIMEOUT = exports.ERR_SANDBOX_RUNNING_TIMEOUT = exports.ERR_SANDBOX_APPS_TIMEOUT = exports.ERR_SANDBOX_SETUP_TIMEOUT = exports.ERR_SANDBOX_APP_FAILED = exports.ERR_SANDBOX_SETUP_FAILED = exports.ERR_SANDBOX_INVALID_RESOURCES = exports.ERR_SANDBOX_APP_NOT_FOUND = exports.ERR_SANDBOX_NOT_FOUND = exports.OPTION_SANDBOX_RUNTIME = exports.OPTION_SANDBOX_TIMEOUT = exports.OPTION_SANDBOX_FETCH = exports.OPTION_SANDBOX_APP_DIR = exports.OPTION_SANDBOX_APP_COMMAND = exports.OPTION_SANDBOX_YAML = exports.OPTION_SANDBOX_TAGS = exports.OPTION_SANDBOX_INSTALL_SCRIPT = exports.OPTION_SANDBOX_INSTALL_COMMANDS = exports.OPTION_SANDBOX_RESOURCES = exports.OPTION_SANDBOX_OS = exports.OPTION_SANDBOX_NAME = exports.OPTION_SANDBOX_IDENTIFIER = exports.DESC_COMMAND_SANDBOX_APP = exports.DESC_COMMAND_SANDBOX_EXEC = exports.DESC_COMMAND_SANDBOX_STATUS = void 0;
|
|
14
14
|
exports.OPTION_SANDBOX_CP_DOWNLOAD_REPLACE = exports.OPTION_SANDBOX_CP_DOWNLOAD_MERGE = exports.OPTION_SANDBOX_CP_DEST = exports.OPTION_SANDBOX_CP_SOURCE = exports.DESC_COMMAND_SANDBOX_CP = exports.ERR_SANDBOX_ENDPOINTS_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_EXISTS = exports.TXT_SANDBOX_ENDPOINT_DELETED = exports.TXT_SANDBOX_ENDPOINT_DELETE_CONFIRM = exports.TXT_SANDBOX_ENDPOINT_ADDED = exports.TXT_SANDBOX_APP_REMOVED = exports.TXT_SANDBOX_APP_ADDED = exports.OPTION_SANDBOX_ENDPOINT_TYPE = exports.OPTION_SANDBOX_ENDPOINT_PORT = exports.OPTION_SANDBOX_ENDPOINT_NAME_ARG = exports.OPTION_SANDBOX_ENDPOINT_NAME = exports.DESC_COMMAND_SANDBOX_ENDPOINT_DELETE = exports.DESC_COMMAND_SANDBOX_ENDPOINT_ADD = exports.DESC_COMMAND_SANDBOX_ENDPOINT_GET = exports.DESC_COMMAND_SANDBOX_ENDPOINT_LIST = exports.DESC_COMMAND_SANDBOX_ENDPOINT = exports.ERR_SANDBOX_SNAPSHOTS_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_FAILED = exports.TXT_SANDBOX_SNAPSHOT_WAITING = exports.TXT_SANDBOX_SNAPSHOT_DELETE_CONFIRM = exports.TXT_SANDBOX_SNAPSHOT_DELETED = exports.TXT_SANDBOX_SNAPSHOT_CREATED = exports.OPTION_SANDBOX_FROM_SNAPSHOT = exports.OPTION_SANDBOX_SNAPSHOT_NAME_ARG = exports.OPTION_SANDBOX_SNAPSHOT_NAME = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_DELETE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_GET = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_CREATE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_LIST = exports.DESC_COMMAND_SANDBOX_SNAPSHOT = exports.TXT_SANDBOX_COMMAND_KILLED = exports.OPTION_SANDBOX_COMMAND_KILL_CONFIRM = exports.OPTION_SANDBOX_LOGS_LIMIT = exports.OPTION_SANDBOX_APP_ID = exports.OPTION_SANDBOX_COMMAND_ID = exports.DESC_COMMAND_SANDBOX_EXEC_KILL = exports.DESC_COMMAND_SANDBOX_EXEC_LOGS = exports.DESC_COMMAND_SANDBOX_APP_START = exports.DESC_COMMAND_SANDBOX_APP_STOP = exports.DESC_COMMAND_SANDBOX_APP_STATUS = exports.DESC_COMMAND_SANDBOX_APP_LOGS = exports.DESC_COMMAND_SANDBOX_EXEC_STATUS = exports.DESC_COMMAND_SANDBOX_EXEC_LIST = void 0;
|
|
15
15
|
exports.OPT_COMMAND_API_INFO_METHOD = exports.OPT_COMMAND_API_LIST_SEARCH = exports.OPT_COMMAND_API_LIST_METHOD = exports.ERR_API_REQUEST_BODY_VALUE = exports.ERR_API_REQUEST_QUERY_VALUE = exports.ERR_API_REQUEST_INVALID_JSON = exports.ERR_API_REQUEST_FILE_ERROR = exports.ERR_API_REQUEST_OUTPUT_EXISTS = exports.DESC_COMMAND_API_INFO = exports.DESC_COMMAND_API_FORM = exports.DESC_COMMAND_API_JSON = exports.DESC_COMMAND_API_DATA = exports.DESC_COMMAND_API_OUTPUT = exports.DESC_COMMAND_API_REQUEST_QUERY = exports.DESC_COMMAND_API_PROJECT = exports.DESC_COMMAND_API_WORKSPACE = exports.DESC_COMMAND_API_REQUEST_URL = exports.DESC_COMMAND_API_GET = exports.DESC_COMMAND_API_PATCH = exports.DESC_COMMAND_API_DELETE = exports.DESC_COMMAND_API_PUT = exports.DESC_COMMAND_API_POST = exports.DESC_COMMAND_API_LIST = exports.DESC_COMMAND_API = exports.ERR_WHOAMI_LOGOUT = exports.TXT_WHOAMI_NO_WORKSPACE = exports.DESC_COMMAND_WHOAMI = exports.TXT_SANDBOX_EXEC_FAILED = exports.TXT_SANDBOX_EXEC_INPROGRESS = exports.TXT_SANDBOX_EXEC_SUCCESS = exports.TXT_SANDBOX_EXEC_BACKGROUND = exports.TXT_SANDBOX_EXEC_ID = exports.ERR_SANDBOX_CP_INVALID_SOURCE = exports.ERR_SANDBOX_CP_INVALID_DEST = exports.ERR_SANDBOX_CP_REPLACE = exports.ERR_SANDBOX_CP_MKDIR = exports.ERR_SANDBOX_CP_PATH_EXISTS = exports.ERR_SANDBOX_CP_NOT_EMPTY_DIR = exports.ERR_SANDBOX_CP_READDIR = exports.ERR_SANDBOX_CP_DEST_NOT_FOLDER = exports.ERR_SANDBOX_CP_SOURCE_NOT_FOUND = exports.TXT_SANDBOX_CP_DONE = exports.TXT_SANDBOX_CP_PROGRESS = exports.TXT_SANDBOX_UNZIPPING_COUNT = exports.TXT_SANDBOX_UNZIP_DONE = exports.TXT_SANDBOX_UNZIP = exports.TXT_SANDBOX_CP_DOWNLOAD_DONE = exports.TXT_SANDBOX_CP_DOWNLOAD = exports.OPTION_SANDBOX_CP_IGNORE = exports.OPTION_SANDBOX_CP_USER = void 0;
|
|
16
|
-
exports.
|
|
17
|
-
exports.
|
|
18
|
-
exports.
|
|
19
|
-
exports.
|
|
20
|
-
exports.EXAMPLE_CRAWL_LINK = exports.EXAMPLE_CRAWL_RUN = exports.EXAMPLE_TESTS_CAPTURE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CLOSE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CREATE = exports.EXAMPLE_TESTS_VISUAL_LINK = exports.EXAMPLE_TESTS_VISUAL_UPLOAD = exports.EXAMPLE_TESTS_VISUAL_SETUP = exports.EXAMPLE_TESTS_UNIT_LINK = exports.EXAMPLE_TESTS_UNIT_UPLOAD = exports.EXAMPLE_ARTIFACT_VERSION_DELETE = exports.EXAMPLE_ARTIFACT_VERSION_GET = exports.EXAMPLE_ARTIFACT_VERSION_LIST = exports.EXAMPLE_ARTIFACT_CREATE = exports.EXAMPLE_ARTIFACT_DELETE = exports.EXAMPLE_ARTIFACT_DOWNLOAD = exports.EXAMPLE_ARTIFACT_PUBLISH = exports.EXAMPLE_ARTIFACT_VERSION_CREATE = exports.EXAMPLE_PIPELINE_RUN_RETRY = exports.EXAMPLE_PIPELINE_RUN_LIST = exports.EXAMPLE_PIPELINE_LIST = exports.EXAMPLE_PIPELINE_YML = exports.EXAMPLE_PIPELINE_GET = exports.EXAMPLE_PIPELINE_UPDATE = void 0;
|
|
16
|
+
exports.ERR_LOGIN_NO_WORKSPACES = exports.ERR_REGISTER_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_FAILED = exports.ERR_LOGIN_HTTP_SERVER_PORT_TAKEN = exports.TXT_REGISTER_SUCCESS = exports.TXT_LOGIN_SUCCESS = exports.TXT_LOGIN_SELECT_WORKSPACE = exports.TXT_LOGIN_ENTER_BASE_URL = exports.TXT_LOGIN_PROVIDE_CODE = exports.TXT_REGISTER_OPEN_URL = exports.TXT_LOGIN_OPEN_URL = exports.TXT_REGISTER_OPENING_STAR = exports.TXT_LOGIN_OPENING_STAR = exports.TXT_REGISTER_OPENING = exports.TXT_LOGIN_OPENING = exports.TXT_LOGIN_SELECT_REGION = exports.TXT_WORKSPACE_NONE = exports.TXT_WORKSPACE_SET_SUCCESS = exports.ARG_COMMAND_WORKSPACE = exports.DESC_COMMAND_WORKSPACE_GET = exports.DESC_COMMAND_WORKSPACE_SET = exports.DESC_COMMAND_WORKSPACE_LIST = exports.DESC_COMMAND_WORKSPACE = exports.TXT_COMMAND_REGISTER_PROVIDE_NAME = exports.TXT_COMMAND_REGISTER_PROVIDE_EMAIL = exports.ERR_COMMAND_REGISTER_INVALID_NAME = exports.ERR_COMMAND_REGISTER_INVALID_EMAIL = exports.OPT_COMMAND_REGISTER_NAME = exports.OPT_COMMAND_REGISTER_EMAIL = exports.DESC_COMMAND_REGISTER = exports.TXT_LOGOUT_SUCCESS = exports.DESC_COMMAND_LOGOUT = exports.DESC_COMMAND_LOGIN = exports.HELP_COMMAND_MCP = exports.ERR_MCP_TOOL_FILTERED = exports.ERR_MCP_TOOLS_CATEGORY = exports.OPT_COMMAND_MCP_TOOLS = exports.ERR_MCP_REFRESH_FAILED = exports.ERR_MCP_URL_INVALID = exports.ERR_MCP_ENDPOINT = exports.DESC_COMMAND_MCP = exports.ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED = exports.ERR_API_PARAMETER_NOT_REPLACED = exports.TXT_API_ENDPOINT_REQUIRED_SCOPES = exports.ERR_API_ENDPOINT_NOT_FOUND = exports.ERR_API_WRONG_METHOD = exports.ERR_SCHEMA_FETCH_FAILED = exports.OPT_COMMAND_API_INFO_URL = exports.OPT_COMMAND_API_INFO_SCHEMA = void 0;
|
|
17
|
+
exports.ERR_COMMAND_DOMAIN_NOT_FOUND = exports.OPT_COMMAND_DOMAIN_ONLY_AVAILABLE = exports.OPT_COMMAND_DOMAIN_SORT = exports.OPT_COMMAND_DOMAIN_PHRASE = exports.OPT_COMMAND_DOMAIN_BUY_OWNER = exports.OPT_COMMAND_DOMAIN_BUY_TLD = exports.DESC_COMMAND_DOMAIN_GET = exports.DESC_COMMAND_DOMAIN_LIST = exports.DESC_COMMAND_DOMAIN_SEARCH = exports.DESC_COMMAND_DOMAIN_BUY = exports.DESC_COMMAND_DOMAIN = exports.ERR_ROUTE_NO_DEFAULT = exports.ERR_WRONG_ROUTE_TARGET = exports.ERR_COMMAND_ROUTE_NO_TARGET = exports.ERR_COMMAND_ROUTE_TYPE = exports.TXT_COMMAND_ROUTES_NOT_FOUND = exports.TXT_COMMAND_DISTROS_NOT_FOUND = exports.TXT_COMMAND_ROUTE_DELETED = exports.TXT_COMMAND_DISTRO_DELETED = exports.TXT_COMMAND_ROUTE_DELETE_CONFIRM = exports.TXT_COMMAND_DISTRO_DELETE_CONFIRM = exports.ERR_COMMAND_ROUTE_NO_UPDATE = exports.ERR_COMMAND_DISTRO_NOT_FOUND = exports.ERR_COMMAND_SCOPE = exports.TXT_COMMAND_ROUTE_UPDATED = exports.TXT_ROUTE_SERVE = exports.TXT_COMMAND_ROUTE_CREATED = exports.TXT_COMMAND_DISTRO_CREATED = exports.ERR_COMMAND_SCOPE_NO_PROJECT = exports.OPT_COMMAND_DISTRO_NAME = exports.OPT_COMMAND_ROUTE_TARGET = exports.OPT_COMMAND_ROUTE_PATH = exports.OPT_COMMAND_ROUTE_DOMAIN = exports.OPT_COMMAND_ROUTE_SUBDOMAIN = exports.OPT_COMMAND_ROUTE_TYPE = exports.OPT_COMMAND_ROUTE_ID = exports.OPT_COMMAND_DISTRO_IDENTIFIER = exports.OPT_COMMAND_SCOPE = exports.DESC_COMMAND_ROUTE = exports.DESC_COMMAND_ROUTE_UPDATE = exports.DESC_COMMAND_ROUTE_DELETE = exports.DESC_COMMAND_ROUTE_LIST = exports.DESC_COMMAND_DISTRO_LIST = exports.DESC_COMMAND_DISTRO_DELETE = exports.DESC_COMMAND_ROUTE_CREATE = exports.DESC_COMMAND_DISTRO_CREATE = exports.DESC_COMMAND_DISTRO = exports.ERR_API_MESSAGE_REPLACER = exports.ERR_LOGIN_INVALID_BASE_URL = exports.ERR_LOGIN_NO_WORKSPACE_FOUND = void 0;
|
|
18
|
+
exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW_DESC = exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW = exports.ERR_COMMAND_PROJECT_LINK_DIR_NOT_DIR = exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO_INITIALIZED = exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO = exports.TXT_COMMAND_PROJECT_LINK_DIR_CONFIRM = exports.TXT_COMMAND_PROJECT_LINK_DIR_LINKED = exports.ERR_COMMAND_PROJECT_LINK_DIR_CREATE = exports.OPT_COMMAND_PROJECT_LINK_TRY_NOW = exports.OPT_COMMAND_PROJECT_LINK_SET_GIT_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_HAS_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_DIRECTORY = exports.OPT_COMMAND_PROJECT_LINK_GIT = exports.OPT_COMMAND_PROJECT_LINK_RELINK = exports.DESC_COMMAND_PROJECT_LINK = exports.DESC_COMMAND_PROJECT_LIST = exports.DESC_COMMAND_PROJECT_GIT = exports.DESC_COMMAND_PROJECT_GIT_CREDENTIAL = exports.DESC_COMMAND_PROJECT = exports.TXT_ARTIFACT_VERSION_DOWNLOAD = exports.TXT_ARTIFACT_PUBLISH = exports.TXT_ARTIFACT_CREATED = exports.TXT_ARTIFACT_VERSION_DELETED = exports.TXT_ARTIFACT_DELETED = exports.ERR_COMMAND_ARTIFACT_TYPE = exports.OPT_COMMAND_ARTIFACT_VERSION = exports.OPT_COMMAND_ARTIFACT_IDENTIFIER = exports.OPT_COMMAND_ARTIFACT_CREATE_IDENTIFIER = exports.OPT_COMMAND_ARTIFACT_NAME = exports.OPT_COMMAND_ARTIFACT_TYPE = exports.DESC_COMMAND_ARTIFACT_CREATE = exports.DESC_COMMAND_ARTIFACT_GET = exports.TXT_ARTIFACT_DOCKER_LOGIN_FAILED = exports.TXT_ARTIFACT_DOCKER_LOGIN_SUCCESS = exports.TXT_ARTIFACT_VERSION_DELETE_CONFIRM = exports.TXT_ARTIFACT_DELETE_CONFIRM = exports.DESC_COMMAND_ARTIFACT_DELETE = exports.ERR_COMMAND_ARTIFACT_NO_PROJECTS = exports.DESC_COMMAND_ARTIFACT_VERSION_GET = exports.DESC_COMMAND_ARTIFACT_VERSION_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION_DELETE = exports.DESC_COMMAND_ARTIFACT_DOCKER_LOGIN = exports.DESC_COMMAND_ARTIFACT_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION = exports.ERR_COMMAND_DOMAIN_UNAVAILABLE = exports.OPTION_COMMAND_DOMAIN_IDENTIFIER = exports.ERR_COMMAND_DOMAIN_NO_DOMAINS = exports.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED = exports.TXT_COMMAND_DOMAIN_BUY_SELECT_DOMAIN = exports.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT = void 0;
|
|
19
|
+
exports.EXAMPLE_PIPELINE_RUN_LOGS = exports.EXAMPLE_PIPELINE_RUN_JSONL = exports.EXAMPLE_PIPELINE_RUN_STATUS = exports.EXAMPLE_PIPELINE_RUN_START = exports.EXAMPLE_SANDBOX_ENDPOINT_LIST = exports.EXAMPLE_SANDBOX_ENDPOINT_GET = exports.EXAMPLE_SANDBOX_ENDPOINT_DELETE = exports.EXAMPLE_SANDBOX_ENDPOINT_CREATE = exports.EXAMPLE_SANDBOX_SNAPSHOT_LIST = exports.EXAMPLE_SANDBOX_SNAPSHOT_GET = exports.EXAMPLE_SANDBOX_SNAPSHOT_DELETE = exports.EXAMPLE_SANDBOX_SNAPSHOT_CREATE = exports.EXAMPLE_SANDBOX_EXEC_STATUS = exports.EXAMPLE_SANDBOX_EXEC_LOGS = exports.EXAMPLE_SANDBOX_APP_STATUS = exports.EXAMPLE_SANDBOX_APP_STOP = exports.EXAMPLE_SANDBOX_APP_REMOVE = exports.EXAMPLE_SANDBOX_APP_ADD = exports.EXAMPLE_SANDBOX_APP_START = exports.EXAMPLE_SANDBOX_APP_LOGS = exports.EXAMPLE_SANDBOX_EXEC_LIST = exports.EXAMPLE_SANDBOX_APP_LIST = exports.EXAMPLE_SANDBOX_EXEC_KILL = exports.EXAMPLE_SANDBOX_EXEC_COMMAND = exports.EXAMPLE_TUNNEL_START = exports.EXAMPLE_TUNNEL_TCP = exports.EXAMPLE_TUNNEL_TLS = exports.EXAMPLE_AGENT_TUNNEL_START = exports.EXAMPLE_AGENT_TUNNEL_STATUS = exports.EXAMPLE_AGENT_TUNNEL_REMOVE = exports.EXAMPLE_AGENT_TUNNEL_LIST = exports.EXAMPLE_TUNNEL_HTTP = exports.EXAMPLE_SANDBOX_CREATE = exports.EXAMPLE_DISTRO_CREATE = exports.EXAMPLE_ROUTE_CREATE = exports.EXAMPLE_ROUTE_LIST = exports.EXAMPLE_ROUTE_UPDATE = exports.EXAMPLE_ROUTE_DELETE = exports.EXAMPLE_DISTRO_DELETE = exports.EXAMPLE_DISTRO_LIST = exports.EXAMPLE_SANDBOX_CP = exports.ERR_PROJECT_NO_PROJECTS = exports.TXT_LOGIN_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_CREATED = exports.TXT_COMMAND_PROJECT_LINK_NOT_FOUND = exports.TXT_COMMAND_PROJECT_LINK_NAME = exports.TXT_COMMAND_PROJECT_LINK_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_LINK_TO = exports.TXT_COMMAND_PROJECT_LINK_EXISTING_DESC = exports.TXT_COMMAND_PROJECT_LINK_EXISTING = void 0;
|
|
20
|
+
exports.EXAMPLE_CRAWL_LINK = exports.EXAMPLE_CRAWL_RUN = exports.EXAMPLE_TESTS_CAPTURE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CLOSE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CREATE = exports.EXAMPLE_TESTS_VISUAL_LINK = exports.EXAMPLE_TESTS_VISUAL_UPLOAD = exports.EXAMPLE_TESTS_VISUAL_SETUP = exports.EXAMPLE_TESTS_UNIT_LINK = exports.EXAMPLE_TESTS_UNIT_UPLOAD = exports.EXAMPLE_ARTIFACT_VERSION_DELETE = exports.EXAMPLE_ARTIFACT_VERSION_GET = exports.EXAMPLE_ARTIFACT_VERSION_LIST = exports.EXAMPLE_ARTIFACT_CREATE = exports.EXAMPLE_ARTIFACT_DELETE = exports.EXAMPLE_ARTIFACT_DOWNLOAD = exports.EXAMPLE_ARTIFACT_PUBLISH = exports.EXAMPLE_ARTIFACT_VERSION_CREATE = exports.EXAMPLE_PIPELINE_RUN_RETRY = exports.EXAMPLE_PIPELINE_RUN_LIST = exports.EXAMPLE_PIPELINE_LIST = exports.EXAMPLE_PIPELINE_YML = exports.EXAMPLE_PIPELINE_GET = exports.EXAMPLE_PIPELINE_UPDATE = exports.EXAMPLE_PIPELINE_DELETE = exports.EXAMPLE_PIPELINE_CREATE = exports.EXAMPLE_PIPELINE_RUN_CANCEL = exports.EXAMPLE_PIPELINE_RUN_APPLY = void 0;
|
|
21
21
|
const utils_1 = require("./utils");
|
|
22
22
|
exports.ERR_CANCELLED = 'Cancelled';
|
|
23
23
|
exports.ERR_REST_API_GENERAL_ERROR = 'Something went wrong';
|
|
@@ -835,6 +835,27 @@ exports.ERR_MCP_ENDPOINT = ERR_MCP_ENDPOINT;
|
|
|
835
835
|
const ERR_MCP_URL_INVALID = (url) => `Invalid MCP url: ${url}`;
|
|
836
836
|
exports.ERR_MCP_URL_INVALID = ERR_MCP_URL_INVALID;
|
|
837
837
|
exports.ERR_MCP_REFRESH_FAILED = 'Session expired and token refresh failed. Run `bdy login` to authenticate';
|
|
838
|
+
exports.OPT_COMMAND_MCP_TOOLS = 'comma-separated tool categories to expose (default: all)';
|
|
839
|
+
const ERR_MCP_TOOLS_CATEGORY = (category, valid) => `Unknown tool category '${category}'. Valid categories: ${valid}`;
|
|
840
|
+
exports.ERR_MCP_TOOLS_CATEGORY = ERR_MCP_TOOLS_CATEGORY;
|
|
841
|
+
const ERR_MCP_TOOL_FILTERED = (tool) => `Tool '${tool}' is not exposed by this MCP server (started with a --tools filter)`;
|
|
842
|
+
exports.ERR_MCP_TOOL_FILTERED = ERR_MCP_TOOL_FILTERED;
|
|
843
|
+
const HELP_COMMAND_MCP = (categories) => `TOOL CATEGORIES:
|
|
844
|
+
Narrow the exposed tool set with --tools so the agent stays focused:
|
|
845
|
+
|
|
846
|
+
${categories}
|
|
847
|
+
|
|
848
|
+
REGISTER IN A CLIENT:
|
|
849
|
+
Claude Code claude mcp add buddy -- bdy mcp --tools pipelines,source
|
|
850
|
+
Codex codex mcp add buddy -- bdy mcp --tools pipelines,source
|
|
851
|
+
Grok Build grok mcp add buddy -- bdy mcp --tools pipelines,source
|
|
852
|
+
|
|
853
|
+
Omit --tools to expose all categories.
|
|
854
|
+
|
|
855
|
+
For other clients (Cursor, OpenCode, Antigravity, ...) see:
|
|
856
|
+
https://buddy.works/docs/agents-ai/mcp
|
|
857
|
+
`;
|
|
858
|
+
exports.HELP_COMMAND_MCP = HELP_COMMAND_MCP;
|
|
838
859
|
// Login command
|
|
839
860
|
exports.DESC_COMMAND_LOGIN = 'Log in to Buddy';
|
|
840
861
|
exports.DESC_COMMAND_LOGOUT = 'Log out from Buddy';
|
package/distTs/src/utils.js
CHANGED
|
@@ -37,7 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.getVersion = exports.isInstalledByChoco = exports.isInstalledByApt = exports.isInstalledByBrew = exports.isInstalledByNpm = exports.tryGetEmail = exports.execLocally = exports.getHomeDirectory = exports.isDomainAvailable = exports.newCommand = exports.formatBytes = exports.formatHelp = exports.getPlatform = exports.getHostname = exports.isStringRegExp = exports.getWorkingDir = exports.getRootDir = exports.TARGET_ONLY_PORT_REGEX = exports.TARGET_HTTP_REGEX = exports.TARGET_TCP_TLS_REGEX = exports.ApiErrorTunnelsDisabled = exports.ApiErrorWorkspaceFlagged = exports.ApiErrorTunnelLimitReached = exports.ApiErrorAgentLimitReached = exports.ApiErrorDomainRestricted = exports.ApiErrorTargetInvalid = exports.ApiErrorWrongToken = exports.ApiErrorFailedToConnect = exports.ApiErrorAgentNotFound = exports.ARTIFACT_AUTH_TYPE = exports.ARTIFACT_TYPE = exports.SANDBOX_SNAPSHOT_STATUS = exports.SANDBOX_APP_STATUS = exports.SANDBOX_SETUP_STATUS = exports.SANDBOX_EXEC_STATUS = exports.SANDBOX_EXEC_RUNTIME = exports.SANDBOX_STATUS = exports.REST_API_ENDPOINT = exports.REST_API_REGION = exports.DEFAULT_SANDBOX_CP_USER = exports.ARTIFACT_DEFAULT_VERSION = exports.SUGGESTED_BROWSER_VERSION = exports.DEFAULT_TIMEOUT = exports.TUNNEL_HTTP_CB_MIN_REQUESTS = exports.TUNNEL_HTTP_CB_WINDOW = exports.TUNNEL_MAX_REQUEST_SIZE_TO_SYNC = exports.TUNNEL_HTTP_LOG_MAX_REQUESTS = exports.TUNNEL_HTTP_LOG_MAX_BODY = exports.TUNNEL_HTTP_RATE_WINDOW = exports.TUNNEL_HTTP_RATE_LIMIT = void 0;
|
|
40
|
-
exports.getGitName = exports.getGitEmail = exports.getBasicCommandTls = exports.getBasicCommandHttp = exports.getBasicCommandSandboxEndpoint = exports.getBasicCommandTcp = exports.getCurrentUser = exports.getServiceUser = exports.getRealTargetHost = exports.isWindows = exports.isLinux = exports.isOsx = exports.isDocker = exports.sleep = exports.getLatestVersion = exports.getVersionEnv = exports.getCurrentVersionWithoutEnv = exports.getVersionWithoutEnv = void 0;
|
|
40
|
+
exports.getGitName = exports.getGitEmail = exports.MCP_TOOL_CATEGORIES = exports.getBasicCommandTls = exports.getBasicCommandHttp = exports.getBasicCommandSandboxEndpoint = exports.getBasicCommandTcp = exports.getCurrentUser = exports.getServiceUser = exports.getRealTargetHost = exports.isWindows = exports.isLinux = exports.isOsx = exports.isDocker = exports.sleep = exports.getLatestVersion = exports.getVersionEnv = exports.getCurrentVersionWithoutEnv = exports.getVersionWithoutEnv = void 0;
|
|
41
41
|
exports.apiErrorCodeToClass = apiErrorCodeToClass;
|
|
42
42
|
exports.isFile = isFile;
|
|
43
43
|
exports.getAppWorkspaceUrl = getAppWorkspaceUrl;
|
|
@@ -45,6 +45,7 @@ exports.getAppWorkspaceSettingsUrl = getAppWorkspaceSettingsUrl;
|
|
|
45
45
|
exports.getAppUrl = getAppUrl;
|
|
46
46
|
exports.getDockerRegistryHostByApiBaseUrl = getDockerRegistryHostByApiBaseUrl;
|
|
47
47
|
exports.getMcpUrlByApiBaseUrl = getMcpUrlByApiBaseUrl;
|
|
48
|
+
exports.getMcpToolCategory = getMcpToolCategory;
|
|
48
49
|
exports.openApiPrepareUrl = openApiPrepareUrl;
|
|
49
50
|
exports.getOpenApiEndpointByApiBaseUrl = getOpenApiEndpointByApiBaseUrl;
|
|
50
51
|
exports.isValidDomain = isValidDomain;
|
|
@@ -700,6 +701,82 @@ function getMcpUrlByApiBaseUrl(baseUrl) {
|
|
|
700
701
|
}
|
|
701
702
|
return null;
|
|
702
703
|
}
|
|
704
|
+
// Tool categories for `bdy mcp --tools` - the single source for option
|
|
705
|
+
// validation, name->category matching and the help text. Entries are in help
|
|
706
|
+
// display order; remote tool names follow a `verb-resource` convention and a
|
|
707
|
+
// tool belongs to the LAST entry whose pattern matches, so compound names land
|
|
708
|
+
// in the most specific bucket (`list-project-sandbox-snapshots` -> sandboxes,
|
|
709
|
+
// not projects)
|
|
710
|
+
exports.MCP_TOOL_CATEGORIES = [
|
|
711
|
+
{
|
|
712
|
+
name: 'user',
|
|
713
|
+
pattern: /user|ssh-key/,
|
|
714
|
+
description: 'current user account & profile',
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
name: 'workspaces',
|
|
718
|
+
pattern: /workspace/,
|
|
719
|
+
description: 'workspaces: list, create, settings',
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
name: 'projects',
|
|
723
|
+
pattern: /project/,
|
|
724
|
+
description: 'projects & configuration',
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
name: 'members',
|
|
728
|
+
pattern: /member/,
|
|
729
|
+
description: 'workspace/project members & permissions',
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
name: 'pipelines',
|
|
733
|
+
pattern: /pipeline|(^|-)runs?(-|$)/,
|
|
734
|
+
description: 'CI/CD pipelines, runs, actions',
|
|
735
|
+
},
|
|
736
|
+
{
|
|
737
|
+
name: 'source',
|
|
738
|
+
pattern: /branch|commit|tag|pull-request/,
|
|
739
|
+
description: 'repositories, branches, commits',
|
|
740
|
+
},
|
|
741
|
+
{
|
|
742
|
+
name: 'targets',
|
|
743
|
+
pattern: /target/,
|
|
744
|
+
description: 'deployment targets & servers',
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
name: 'sandboxes',
|
|
748
|
+
pattern: /sandbox/,
|
|
749
|
+
description: 'ephemeral sandbox environments',
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
name: 'packages',
|
|
753
|
+
pattern: /package/,
|
|
754
|
+
description: 'artifact & package registries',
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
name: 'domains',
|
|
758
|
+
pattern: /domain/,
|
|
759
|
+
description: 'DNS zones & domains',
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
name: 'distros',
|
|
763
|
+
pattern: /distro/,
|
|
764
|
+
description: 'distributions & routing',
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
name: 'suites',
|
|
768
|
+
pattern: /suite/,
|
|
769
|
+
description: 'test suites (visual & unit)',
|
|
770
|
+
},
|
|
771
|
+
];
|
|
772
|
+
function getMcpToolCategory(tool) {
|
|
773
|
+
let match = null;
|
|
774
|
+
for (const { name, pattern } of exports.MCP_TOOL_CATEGORIES) {
|
|
775
|
+
if (pattern.test(tool))
|
|
776
|
+
match = name;
|
|
777
|
+
}
|
|
778
|
+
return match;
|
|
779
|
+
}
|
|
703
780
|
function openApiPrepareUrl(url, workspace, project) {
|
|
704
781
|
let preparedUrl = url.replaceAll('{workspace_domain}', workspace);
|
|
705
782
|
if (project)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bdy",
|
|
3
3
|
"preferGlobal": false,
|
|
4
|
-
"version": "1.22.
|
|
4
|
+
"version": "1.22.91-dev",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://buddy.works/docs/cli",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"@fastify/accept-negotiator": "2.0.1",
|
|
43
43
|
"@fastify/cors": "11.2.0",
|
|
44
44
|
"@inquirer/prompts": "8.5.2",
|
|
45
|
-
"@modelcontextprotocol/sdk": "
|
|
45
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
46
46
|
"@puppeteer/browsers": "2.13.0",
|
|
47
47
|
"@scalar/json-magic": "0.12.16",
|
|
48
48
|
"@scalar/openapi-parser": "0.28.7",
|