@namzu/cli 32.0.0 → 33.0.0
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/CHANGELOG.md +44 -0
- package/dist/browser/commands.js +11 -7
- package/dist/browser/commands.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +4 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +62 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +33 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp-oauth-login.d.ts +19 -0
- package/dist/commands/mcp-oauth-login.d.ts.map +1 -0
- package/dist/commands/mcp-oauth-login.js +213 -0
- package/dist/commands/mcp-oauth-login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +288 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +60 -5
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/worktree.d.ts +6 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +85 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/config/user-config.d.ts +2 -0
- package/dist/config/user-config.d.ts.map +1 -1
- package/dist/config/user-config.js +76 -6
- package/dist/config/user-config.js.map +1 -1
- package/dist/doctor/checks/credentials.d.ts.map +1 -1
- package/dist/doctor/checks/credentials.js +2 -0
- package/dist/doctor/checks/credentials.js.map +1 -1
- package/dist/integrations/mcp/oauth-store.d.ts +40 -0
- package/dist/integrations/mcp/oauth-store.d.ts.map +1 -0
- package/dist/integrations/mcp/oauth-store.js +549 -0
- package/dist/integrations/mcp/oauth-store.js.map +1 -0
- package/dist/integrations/mcp/servers.d.ts.map +1 -1
- package/dist/integrations/mcp/servers.js +155 -2
- package/dist/integrations/mcp/servers.js.map +1 -1
- package/dist/integrations/mcp/user-config.d.ts +25 -0
- package/dist/integrations/mcp/user-config.d.ts.map +1 -0
- package/dist/integrations/mcp/user-config.js +92 -0
- package/dist/integrations/mcp/user-config.js.map +1 -0
- package/dist/integrations/providers/credential-store.d.ts +8 -0
- package/dist/integrations/providers/credential-store.d.ts.map +1 -1
- package/dist/integrations/providers/credential-store.js +111 -22
- package/dist/integrations/providers/credential-store.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +11 -5
- package/dist/integrations/providers/discover.d.ts.map +1 -1
- package/dist/integrations/providers/discover.js +26 -12
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +1 -1
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +1 -1
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/sessions/store.d.ts +23 -5
- package/dist/integrations/sessions/store.d.ts.map +1 -1
- package/dist/integrations/sessions/store.js +164 -24
- package/dist/integrations/sessions/store.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +4 -2
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +62 -8
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/subagents/worktree-driver.d.ts +17 -0
- package/dist/integrations/subagents/worktree-driver.d.ts.map +1 -0
- package/dist/integrations/subagents/worktree-driver.js +72 -0
- package/dist/integrations/subagents/worktree-driver.js.map +1 -0
- package/dist/integrations/worktrees/managed.d.ts +49 -0
- package/dist/integrations/worktrees/managed.d.ts.map +1 -0
- package/dist/integrations/worktrees/managed.js +231 -0
- package/dist/integrations/worktrees/managed.js.map +1 -0
- package/dist/schedule/fire/fire.d.ts.map +1 -1
- package/dist/schedule/fire/fire.js +5 -0
- package/dist/schedule/fire/fire.js.map +1 -1
- package/dist/skills/audit.d.ts +31 -0
- package/dist/skills/audit.d.ts.map +1 -0
- package/dist/skills/audit.js +75 -0
- package/dist/skills/audit.js.map +1 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +245 -46
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +18 -3
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/ResumePicker.d.ts +2 -1
- package/dist/tui/ResumePicker.d.ts.map +1 -1
- package/dist/tui/ResumePicker.js +3 -3
- package/dist/tui/ResumePicker.js.map +1 -1
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +14 -5
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/browser-notices.d.ts.map +1 -1
- package/dist/tui/browser-notices.js +6 -1
- package/dist/tui/browser-notices.js.map +1 -1
- package/dist/tui/credential-entry.d.ts +4 -29
- package/dist/tui/credential-entry.d.ts.map +1 -1
- package/dist/tui/credential-entry.js +7 -29
- package/dist/tui/credential-entry.js.map +1 -1
- package/dist/tui/login-prompt.d.ts +3 -1
- package/dist/tui/login-prompt.d.ts.map +1 -1
- package/dist/tui/login-prompt.js +11 -0
- package/dist/tui/login-prompt.js.map +1 -1
- package/dist/tui/provider-list.d.ts.map +1 -1
- package/dist/tui/provider-list.js +3 -1
- package/dist/tui/provider-list.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +10 -1
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +16 -3
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/turn-interruption.d.ts.map +1 -1
- package/dist/tui/turn-interruption.js +4 -0
- package/dist/tui/turn-interruption.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/** Explicit, interactive OAuth sign-in for one configured HTTP MCP server. */
|
|
2
|
+
import { once } from 'node:events';
|
|
3
|
+
import { createServer } from 'node:http';
|
|
4
|
+
import { Client, StreamableHTTPClientTransport, UnauthorizedError, } from '@modelcontextprotocol/client';
|
|
5
|
+
import { clearMcpOAuthPending, consumeMcpOAuthCallbackState, createMcpOAuthProvider, isSecureMcpOAuthUrl, } from '../integrations/mcp/oauth-store.js';
|
|
6
|
+
import { openInBrowser } from '../tui/open-browser.js';
|
|
7
|
+
import { firstStdinLine } from './login.js';
|
|
8
|
+
const CALLBACK_PATH = '/callback';
|
|
9
|
+
const MAX_CALLBACK_URL_LENGTH = 8192;
|
|
10
|
+
function callbackPage(response, status, text) {
|
|
11
|
+
response.writeHead(status, {
|
|
12
|
+
'content-type': 'text/plain; charset=utf-8',
|
|
13
|
+
'cache-control': 'no-store',
|
|
14
|
+
'x-content-type-options': 'nosniff',
|
|
15
|
+
});
|
|
16
|
+
response.end(text);
|
|
17
|
+
}
|
|
18
|
+
function callbackParams(url, expectedOrigin) {
|
|
19
|
+
if (url.origin !== expectedOrigin || url.pathname !== CALLBACK_PATH || url.hash) {
|
|
20
|
+
throw new Error('The callback address does not match this sign-in.');
|
|
21
|
+
}
|
|
22
|
+
const params = url.searchParams;
|
|
23
|
+
if (params.getAll('state').length !== 1 ||
|
|
24
|
+
params.getAll('code').length > 1 ||
|
|
25
|
+
params.getAll('iss').length > 1) {
|
|
26
|
+
throw new Error('The callback parameters are invalid.');
|
|
27
|
+
}
|
|
28
|
+
return params;
|
|
29
|
+
}
|
|
30
|
+
function remaining(deadline) {
|
|
31
|
+
return Math.max(1, deadline - Date.now());
|
|
32
|
+
}
|
|
33
|
+
async function beforeDeadline(work, deadline) {
|
|
34
|
+
let timer;
|
|
35
|
+
try {
|
|
36
|
+
return await Promise.race([
|
|
37
|
+
work,
|
|
38
|
+
new Promise((_, reject) => {
|
|
39
|
+
timer = setTimeout(() => reject(new Error('Timed out waiting for MCP sign-in.')), remaining(deadline));
|
|
40
|
+
}),
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
if (timer)
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function closeListener(server) {
|
|
49
|
+
server.closeAllConnections();
|
|
50
|
+
if (!server.listening)
|
|
51
|
+
return;
|
|
52
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Start a loopback callback before asking the official MCP client to discover
|
|
56
|
+
* authorization. The SDK validates the authorization-server issuer and exchanges
|
|
57
|
+
* the code; Namzu validates the callback's one-shot state before calling it.
|
|
58
|
+
*/
|
|
59
|
+
export async function loginMcpServer(options) {
|
|
60
|
+
if (Object.keys(options.headers ?? {}).some((name) => name.toLowerCase() === 'authorization')) {
|
|
61
|
+
throw new Error('Remove the configured Authorization header before MCP OAuth sign-in.');
|
|
62
|
+
}
|
|
63
|
+
let acceptCallback;
|
|
64
|
+
const callback = new Promise((resolve) => {
|
|
65
|
+
acceptCallback = resolve;
|
|
66
|
+
});
|
|
67
|
+
let callbackOrigin = '';
|
|
68
|
+
const server = createServer((request, response) => {
|
|
69
|
+
if (request.method !== 'GET' ||
|
|
70
|
+
request.socket.remoteAddress !== '127.0.0.1' ||
|
|
71
|
+
request.headers.host !== callbackOrigin.slice('http://'.length) ||
|
|
72
|
+
!request.url ||
|
|
73
|
+
request.url.length > MAX_CALLBACK_URL_LENGTH) {
|
|
74
|
+
callbackPage(response, 400, 'This is not the MCP sign-in callback.\n');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const url = new URL(request.url, callbackOrigin);
|
|
79
|
+
const params = callbackParams(url, callbackOrigin);
|
|
80
|
+
consumeMcpOAuthCallbackState(options.endpoint, params.get('state'));
|
|
81
|
+
acceptCallback?.({ params, response });
|
|
82
|
+
acceptCallback = undefined;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
callbackPage(response, 400, 'The MCP sign-in callback was refused.\n');
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
server.listen(0, '127.0.0.1');
|
|
89
|
+
try {
|
|
90
|
+
await once(server, 'listening');
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
server.close();
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
const address = server.address();
|
|
97
|
+
if (!address || typeof address === 'string') {
|
|
98
|
+
await closeListener(server);
|
|
99
|
+
throw new Error('Could not reserve a loopback callback port.');
|
|
100
|
+
}
|
|
101
|
+
callbackOrigin = `http://127.0.0.1:${address.port}`;
|
|
102
|
+
const redirectUrl = `${callbackOrigin}${CALLBACK_PATH}`;
|
|
103
|
+
const abortInput = new AbortController();
|
|
104
|
+
const deadline = Date.now() + options.timeoutMs;
|
|
105
|
+
let authorizationUrl;
|
|
106
|
+
let client;
|
|
107
|
+
let providerStarted = false;
|
|
108
|
+
let firstTransport;
|
|
109
|
+
let browserResponse;
|
|
110
|
+
try {
|
|
111
|
+
const provider = createMcpOAuthProvider({
|
|
112
|
+
endpoint: options.endpoint,
|
|
113
|
+
redirectUrl,
|
|
114
|
+
onRedirect: (url) => {
|
|
115
|
+
if (!isSecureMcpOAuthUrl(url)) {
|
|
116
|
+
throw new Error('MCP authorization page must use HTTPS or loopback HTTP.');
|
|
117
|
+
}
|
|
118
|
+
authorizationUrl = url;
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
providerStarted = true;
|
|
122
|
+
client = new Client({ name: 'namzu-cli', version: '1.0.0' }, { versionNegotiation: { mode: 'auto' } });
|
|
123
|
+
const transport = () => new StreamableHTTPClientTransport(new URL(options.endpoint), {
|
|
124
|
+
authProvider: provider,
|
|
125
|
+
// The official transport also uses its fetch for OAuth discovery,
|
|
126
|
+
// registration and token exchange. Put configured resource headers
|
|
127
|
+
// only on the exact MCP endpoint, never in requestInit, which the
|
|
128
|
+
// official client would merge into the authorization-server calls.
|
|
129
|
+
// Manual redirects keep both headers and the Bearer token on this
|
|
130
|
+
// one URL, including for same-origin 307/308 responses.
|
|
131
|
+
fetch: (input, init) => {
|
|
132
|
+
const targetUrl = new URL(String(input));
|
|
133
|
+
if (!isSecureMcpOAuthUrl(targetUrl)) {
|
|
134
|
+
throw new Error('MCP OAuth network requests require HTTPS or loopback HTTP.');
|
|
135
|
+
}
|
|
136
|
+
const isResource = targetUrl.href === new URL(options.endpoint).href;
|
|
137
|
+
const headers = new Headers(init?.headers);
|
|
138
|
+
if (isResource) {
|
|
139
|
+
for (const [name, value] of Object.entries(options.headers ?? {}))
|
|
140
|
+
headers.set(name, value);
|
|
141
|
+
}
|
|
142
|
+
return fetch(input, { ...init, headers, redirect: 'manual' });
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
firstTransport = transport();
|
|
146
|
+
try {
|
|
147
|
+
await beforeDeadline(client.connect(firstTransport), deadline);
|
|
148
|
+
options.print({
|
|
149
|
+
name: options.name,
|
|
150
|
+
text: `MCP server ${options.name} is already signed in.`,
|
|
151
|
+
});
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (!(error instanceof UnauthorizedError) || !authorizationUrl)
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
const url = authorizationUrl.href;
|
|
159
|
+
const opened = options.noBrowser ? false : openInBrowser(url);
|
|
160
|
+
options.print({
|
|
161
|
+
name: options.name,
|
|
162
|
+
url,
|
|
163
|
+
text: [
|
|
164
|
+
`Authorize MCP server ${options.name} in your browser:`,
|
|
165
|
+
url,
|
|
166
|
+
opened
|
|
167
|
+
? 'Waiting for the browser callback.'
|
|
168
|
+
: 'Paste the complete callback URL here, or open the URL on this machine.',
|
|
169
|
+
].join('\n'),
|
|
170
|
+
});
|
|
171
|
+
// A remote/headless terminal can paste the complete callback URL instead
|
|
172
|
+
// of forwarding the loopback port. A closed stdin simply leaves the live
|
|
173
|
+
// loopback listener waiting; it must not end sign-in early.
|
|
174
|
+
const pasted = firstStdinLine(abortInput.signal).then((line) => {
|
|
175
|
+
if (line === null)
|
|
176
|
+
return new Promise(() => { });
|
|
177
|
+
const parsed = new URL(line.trim());
|
|
178
|
+
const params = callbackParams(parsed, callbackOrigin);
|
|
179
|
+
consumeMcpOAuthCallbackState(options.endpoint, params.get('state'));
|
|
180
|
+
return Promise.resolve({ params });
|
|
181
|
+
});
|
|
182
|
+
const result = await beforeDeadline(Promise.race([callback, pasted]), deadline);
|
|
183
|
+
browserResponse = result.response;
|
|
184
|
+
// Pass the complete query. The official SDK checks the RFC 9207 `iss`
|
|
185
|
+
// value before it redeems the code; the host checked `state` above.
|
|
186
|
+
await beforeDeadline(firstTransport.finishAuth(result.params), deadline);
|
|
187
|
+
await beforeDeadline(client.connect(transport()), deadline);
|
|
188
|
+
if (browserResponse)
|
|
189
|
+
callbackPage(browserResponse, 200, 'MCP sign-in complete. You may close this tab.\n');
|
|
190
|
+
browserResponse = undefined;
|
|
191
|
+
options.print({ name: options.name, text: `Signed in to MCP server ${options.name}.` });
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (browserResponse)
|
|
195
|
+
callbackPage(browserResponse, 400, 'MCP sign-in failed. Return to the terminal.\n');
|
|
196
|
+
// Never render callback-supplied error_description or a server's OAuth
|
|
197
|
+
// error text. It may be attacker controlled in an AS mix-up.
|
|
198
|
+
if (error instanceof Error && error.message === 'Timed out waiting for MCP sign-in.')
|
|
199
|
+
throw error;
|
|
200
|
+
throw new Error('MCP sign-in failed. Check the server configuration and try again.');
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
abortInput.abort();
|
|
204
|
+
try {
|
|
205
|
+
if (providerStarted)
|
|
206
|
+
clearMcpOAuthPending(options.endpoint);
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
await Promise.allSettled([client?.close(), closeListener(server)]);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=mcp-oauth-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-oauth-login.js","sourceRoot":"","sources":["../../src/commands/mcp-oauth-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAiC5C,eAAO,MAAM,UAAU,EAAE,UA4IxB,CAAA"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { loadConfig } from '../config/load.js';
|
|
2
|
+
import { userConfigPath } from '../config/user-config.js';
|
|
3
|
+
import { EXIT_BAD_CONFIG, EXIT_FAIL, EXIT_OK, EXIT_USAGE } from '../exit-codes.js';
|
|
4
|
+
import { clearMcpOAuthCredentials } from '../integrations/mcp/oauth-store.js';
|
|
5
|
+
import { transportFor } from '../integrations/mcp/servers.js';
|
|
6
|
+
import { addUserMcpServer, isUserMcpName, readUserMcpServers, removeUserMcpServer, summarizeUserMcpServer, } from '../integrations/mcp/user-config.js';
|
|
7
|
+
import { terminalDisplayText } from '../tui/terminal-display.js';
|
|
8
|
+
import { loginMcpServer } from './mcp-oauth-login.js';
|
|
9
|
+
const HELP = [
|
|
10
|
+
'Usage: namzu mcp <list|get|add|remove|login|logout> [arguments]',
|
|
11
|
+
'',
|
|
12
|
+
'Manage tool servers in your user config (~/.namzu/config.yaml).',
|
|
13
|
+
'Project and managed config can override these entries.',
|
|
14
|
+
'',
|
|
15
|
+
' namzu mcp list',
|
|
16
|
+
' namzu mcp get <name>',
|
|
17
|
+
" namzu mcp add <name> --url <http-url> [--header 'NAME=Bearer \u0024{ENV_VAR}']",
|
|
18
|
+
' namzu mcp add <name> [--env ENV_VAR] -- <command> [arguments...]',
|
|
19
|
+
' namzu mcp remove <name>',
|
|
20
|
+
' namzu mcp login <name> [--no-browser] [--timeout <seconds>]',
|
|
21
|
+
' namzu mcp logout <name>',
|
|
22
|
+
'',
|
|
23
|
+
'Use --format json for structured output. Values of headers, environment',
|
|
24
|
+
'variables and command arguments are hidden in list/get output.',
|
|
25
|
+
].join('\n');
|
|
26
|
+
export const mcpCommand = {
|
|
27
|
+
name: 'mcp',
|
|
28
|
+
description: 'Manage user tool servers',
|
|
29
|
+
passThrough: true,
|
|
30
|
+
help: HELP,
|
|
31
|
+
handler: async ({ ctx, rawArgs }) => {
|
|
32
|
+
const action = parseMcpAction(rawArgs);
|
|
33
|
+
if (action.kind === 'error') {
|
|
34
|
+
ctx.formatter.error({ message: action.message });
|
|
35
|
+
return EXIT_USAGE;
|
|
36
|
+
}
|
|
37
|
+
if (action.kind === 'login' || action.kind === 'logout') {
|
|
38
|
+
try {
|
|
39
|
+
// `mcp` uses a recovery context so list/add/remove can repair a
|
|
40
|
+
// broken config. Login and logout need the effective server entry,
|
|
41
|
+
// including a project/profile override, so load it only here.
|
|
42
|
+
const spec = loadConfig({ profile: ctx.selectedProfile }).mcpServers?.[action.name];
|
|
43
|
+
if (!spec || !spec.url || spec.command) {
|
|
44
|
+
ctx.formatter.error({
|
|
45
|
+
message: `MCP server "${oneLine(action.name)}" must be a configured HTTP server to use OAuth.`,
|
|
46
|
+
});
|
|
47
|
+
return EXIT_USAGE;
|
|
48
|
+
}
|
|
49
|
+
if (action.kind === 'logout') {
|
|
50
|
+
const removed = clearMcpOAuthCredentials(spec.url);
|
|
51
|
+
ctx.formatter.print({
|
|
52
|
+
name: action.name,
|
|
53
|
+
removed,
|
|
54
|
+
text: removed
|
|
55
|
+
? `Removed saved MCP sign-in for ${oneLine(action.name)}.`
|
|
56
|
+
: `No saved MCP sign-in for ${oneLine(action.name)}.`,
|
|
57
|
+
});
|
|
58
|
+
return EXIT_OK;
|
|
59
|
+
}
|
|
60
|
+
const resolved = transportFor(spec, process.cwd());
|
|
61
|
+
if (typeof resolved === 'string' || resolved.type !== 'streamable-http') {
|
|
62
|
+
ctx.formatter.error({
|
|
63
|
+
message: `MCP server "${oneLine(action.name)}" cannot start OAuth: ${typeof resolved === 'string' ? oneLine(resolved) : 'it is not an HTTP server'}.`,
|
|
64
|
+
});
|
|
65
|
+
return EXIT_BAD_CONFIG;
|
|
66
|
+
}
|
|
67
|
+
if (Object.keys(resolved.headers ?? {}).some((key) => key.toLowerCase() === 'authorization')) {
|
|
68
|
+
ctx.formatter.error({
|
|
69
|
+
message: `MCP server "${oneLine(action.name)}" already has an Authorization header. Remove that header before OAuth sign-in.`,
|
|
70
|
+
});
|
|
71
|
+
return EXIT_BAD_CONFIG;
|
|
72
|
+
}
|
|
73
|
+
await loginMcpServer({
|
|
74
|
+
name: action.name,
|
|
75
|
+
endpoint: resolved.url,
|
|
76
|
+
...(resolved.headers ? { headers: resolved.headers } : {}),
|
|
77
|
+
noBrowser: action.noBrowser,
|
|
78
|
+
timeoutMs: action.timeoutMs,
|
|
79
|
+
print: (value) => ctx.formatter.print(value),
|
|
80
|
+
});
|
|
81
|
+
return EXIT_OK;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
ctx.formatter.error({
|
|
85
|
+
message: error instanceof Error ? oneLine(error.message) : 'MCP sign-in failed.',
|
|
86
|
+
});
|
|
87
|
+
return EXIT_FAIL;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const entries = readUserMcpServers();
|
|
92
|
+
const file = userConfigPath();
|
|
93
|
+
if (action.kind === 'list') {
|
|
94
|
+
const servers = entries.map(summarizeUserMcpServer);
|
|
95
|
+
const lines = servers.length === 0
|
|
96
|
+
? ['No user tool servers are configured.']
|
|
97
|
+
: servers.map((server) => ` ${oneLine(server.name)}: ${server.transport}${server.command ? ` (${oneLine(server.command)})` : ''}${server.endpoint ? ` (${oneLine(server.endpoint)})` : ''}`);
|
|
98
|
+
ctx.formatter.print({ file, servers, text: ['User tool servers:', ...lines].join('\n') });
|
|
99
|
+
return EXIT_OK;
|
|
100
|
+
}
|
|
101
|
+
const existing = entries.find((entry) => entry.name === action.name);
|
|
102
|
+
if (action.kind === 'get') {
|
|
103
|
+
if (!existing) {
|
|
104
|
+
ctx.formatter.error({
|
|
105
|
+
message: `No user tool server named "${oneLine(action.name)}".`,
|
|
106
|
+
});
|
|
107
|
+
return EXIT_USAGE;
|
|
108
|
+
}
|
|
109
|
+
const server = summarizeUserMcpServer(existing);
|
|
110
|
+
const detail = server.transport === 'http'
|
|
111
|
+
? server.endpoint
|
|
112
|
+
: server.transport === 'stdio'
|
|
113
|
+
? server.command
|
|
114
|
+
: 'invalid entry';
|
|
115
|
+
ctx.formatter.print({
|
|
116
|
+
file,
|
|
117
|
+
server,
|
|
118
|
+
text: `${oneLine(server.name)}: ${server.transport} (${oneLine(detail ?? '')})\nConfig: ${oneLine(file)}`,
|
|
119
|
+
});
|
|
120
|
+
return EXIT_OK;
|
|
121
|
+
}
|
|
122
|
+
if (action.kind === 'add') {
|
|
123
|
+
if (existing) {
|
|
124
|
+
ctx.formatter.error({
|
|
125
|
+
message: `User tool server "${oneLine(action.name)}" already exists in ${oneLine(file)}.`,
|
|
126
|
+
});
|
|
127
|
+
return EXIT_USAGE;
|
|
128
|
+
}
|
|
129
|
+
addUserMcpServer(action.name, action.spec);
|
|
130
|
+
const server = summarizeUserMcpServer({ name: action.name, spec: action.spec });
|
|
131
|
+
ctx.formatter.print({
|
|
132
|
+
file,
|
|
133
|
+
server,
|
|
134
|
+
text: `Added user tool server ${oneLine(action.name)} to ${oneLine(file)}.`,
|
|
135
|
+
});
|
|
136
|
+
return EXIT_OK;
|
|
137
|
+
}
|
|
138
|
+
if (!existing || !removeUserMcpServer(action.name)) {
|
|
139
|
+
ctx.formatter.error({
|
|
140
|
+
message: `No user tool server named "${oneLine(action.name)}".`,
|
|
141
|
+
});
|
|
142
|
+
return EXIT_USAGE;
|
|
143
|
+
}
|
|
144
|
+
ctx.formatter.print({
|
|
145
|
+
file,
|
|
146
|
+
name: action.name,
|
|
147
|
+
text: `Removed user tool server ${oneLine(action.name)} from ${oneLine(file)}.`,
|
|
148
|
+
});
|
|
149
|
+
return EXIT_OK;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
ctx.formatter.error({
|
|
153
|
+
message: error instanceof Error
|
|
154
|
+
? oneLine(error.message)
|
|
155
|
+
: 'Could not read or write the user tool servers.',
|
|
156
|
+
});
|
|
157
|
+
return EXIT_BAD_CONFIG;
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
function parseMcpAction(args) {
|
|
162
|
+
const [verb, name] = args;
|
|
163
|
+
if (verb === 'list' && args.length === 1)
|
|
164
|
+
return { kind: 'list' };
|
|
165
|
+
if (verb === 'logout' && args.length === 2 && name && !name.startsWith('-')) {
|
|
166
|
+
return { kind: 'logout', name };
|
|
167
|
+
}
|
|
168
|
+
if (verb === 'login' && name && !name.startsWith('-')) {
|
|
169
|
+
let noBrowser = false;
|
|
170
|
+
let timeoutMs = 300_000;
|
|
171
|
+
for (let index = 2; index < args.length; index++) {
|
|
172
|
+
const arg = args[index];
|
|
173
|
+
if (arg === '--no-browser' && !noBrowser) {
|
|
174
|
+
noBrowser = true;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (arg === '--timeout') {
|
|
178
|
+
const value = args[++index];
|
|
179
|
+
const seconds = Number(value);
|
|
180
|
+
if (!value || !Number.isFinite(seconds) || seconds <= 0 || seconds > 3600) {
|
|
181
|
+
return { kind: 'error', message: '--timeout requires seconds between 0 and 3600.' };
|
|
182
|
+
}
|
|
183
|
+
timeoutMs = seconds * 1000;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
return { kind: 'error', message: `Unknown mcp login option: ${oneLine(arg ?? '')}` };
|
|
187
|
+
}
|
|
188
|
+
return { kind: 'login', name, noBrowser, timeoutMs };
|
|
189
|
+
}
|
|
190
|
+
if ((verb === 'get' || verb === 'remove') && args.length === 2 && name !== undefined) {
|
|
191
|
+
return { kind: verb, name };
|
|
192
|
+
}
|
|
193
|
+
if (verb !== 'add' || !name || !isUserMcpName(name)) {
|
|
194
|
+
return {
|
|
195
|
+
kind: 'error',
|
|
196
|
+
message: 'Usage: namzu mcp <list|get|add|remove|login|logout>; new server names must start with a letter and use only letters, digits, _ or -.',
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
let url;
|
|
200
|
+
const inheritEnv = [];
|
|
201
|
+
const headers = {};
|
|
202
|
+
let command;
|
|
203
|
+
for (let index = 2; index < args.length; index++) {
|
|
204
|
+
const arg = args[index];
|
|
205
|
+
if (arg === '--') {
|
|
206
|
+
command = args.slice(index + 1);
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
if (arg === '--url') {
|
|
210
|
+
url = args[++index];
|
|
211
|
+
if (!url)
|
|
212
|
+
return { kind: 'error', message: '--url requires an HTTP URL.' };
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (arg === '--env') {
|
|
216
|
+
const variable = args[++index];
|
|
217
|
+
if (!variable || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(variable)) {
|
|
218
|
+
return { kind: 'error', message: '--env requires an environment variable name.' };
|
|
219
|
+
}
|
|
220
|
+
inheritEnv.push(variable);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (arg === '--header') {
|
|
224
|
+
const header = args[++index];
|
|
225
|
+
const split = header?.indexOf('=') ?? -1;
|
|
226
|
+
if (!header ||
|
|
227
|
+
split <= 0 ||
|
|
228
|
+
!/^[A-Za-z0-9-]+$/.test(header.slice(0, split)) ||
|
|
229
|
+
!/^(?:Bearer )?\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(header.slice(split + 1))) {
|
|
230
|
+
return {
|
|
231
|
+
kind: 'error',
|
|
232
|
+
message: '--header requires NAME=\u0024{ENV_VAR} or NAME=Bearer \u0024{ENV_VAR}; literal secrets are refused.',
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
headers[header.slice(0, split)] = header.slice(split + 1);
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (arg && !arg.startsWith('-')) {
|
|
239
|
+
command = args.slice(index);
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
return { kind: 'error', message: `Unknown mcp add option: ${oneLine(arg ?? '')}` };
|
|
243
|
+
}
|
|
244
|
+
if (url && command)
|
|
245
|
+
return { kind: 'error', message: 'Choose --url or a command, not both.' };
|
|
246
|
+
if (url) {
|
|
247
|
+
if (inheritEnv.length > 0)
|
|
248
|
+
return { kind: 'error', message: '--env applies only to a command server.' };
|
|
249
|
+
let parsed;
|
|
250
|
+
try {
|
|
251
|
+
parsed = new URL(url);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return { kind: 'error', message: '--url requires an HTTP URL.' };
|
|
255
|
+
}
|
|
256
|
+
if (!['http:', 'https:'].includes(parsed.protocol) || parsed.username || parsed.password) {
|
|
257
|
+
return { kind: 'error', message: '--url requires an HTTP URL without embedded credentials.' };
|
|
258
|
+
}
|
|
259
|
+
const remoteInsecure = parsed.protocol === 'http:' && !['localhost', '127.0.0.1', '[::1]'].includes(parsed.hostname);
|
|
260
|
+
if (remoteInsecure && parsed.search) {
|
|
261
|
+
return {
|
|
262
|
+
kind: 'error',
|
|
263
|
+
message: 'URL query parameters require HTTPS or a loopback endpoint.',
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
if (Object.keys(headers).length > 0 && remoteInsecure) {
|
|
267
|
+
return { kind: 'error', message: 'Credential headers require HTTPS or a loopback endpoint.' };
|
|
268
|
+
}
|
|
269
|
+
return { kind: 'add', name, spec: { url, ...(Object.keys(headers).length ? { headers } : {}) } };
|
|
270
|
+
}
|
|
271
|
+
if (Object.keys(headers).length > 0)
|
|
272
|
+
return { kind: 'error', message: '--header applies only to an HTTP server.' };
|
|
273
|
+
if (!command?.[0])
|
|
274
|
+
return { kind: 'error', message: 'Provide --url or -- <command> [arguments...].' };
|
|
275
|
+
return {
|
|
276
|
+
kind: 'add',
|
|
277
|
+
name,
|
|
278
|
+
spec: {
|
|
279
|
+
command: command[0],
|
|
280
|
+
...(command.length > 1 ? { args: command.slice(1) } : {}),
|
|
281
|
+
...(inheritEnv.length > 0 ? { inheritEnv } : {}),
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
function oneLine(value) {
|
|
286
|
+
return terminalDisplayText(value).replaceAll('\n', ' ').replaceAll('\t', ' ');
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAU5C,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAA;IACpC,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,qDAAqD;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,YAAY,CAAC,CAAA;IAC7C,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,wDAAwD;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAA;IACzC,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAkBD,eAAO,MAAM,aAAa,EAAE,UAsD3B,CAAA"}
|