@kodycodes/cli 1.0.0 → 1.0.1
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 +4 -3
- package/dist/auth.d.ts +1 -1
- package/dist/auth.js +91 -89
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/defaults.d.ts +8 -0
- package/dist/defaults.js +12 -0
- package/dist/defaults.js.map +1 -1
- package/dist/mcp.js +6 -7
- package/dist/mcp.js.map +1 -1
- package/dist/oauth-provider.d.ts +12 -0
- package/dist/oauth-provider.js +89 -0
- package/dist/oauth-provider.js.map +1 -0
- package/package.json +2 -2
- package/skills/kody/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Turn one-off agent work into something you can rerun: a local MCP client for
|
|
4
4
|
[Kody](https://kody.codes) with login, OS keychain token storage, `search`, and
|
|
5
|
-
`execute`.
|
|
5
|
+
`execute`. Talks MCP `2026-07-28` (Kody's stateless `/mcp` lane) and logs in
|
|
6
|
+
with Client ID Metadata Documents (SEP-991).
|
|
6
7
|
|
|
7
8
|
```bash
|
|
8
9
|
npx @kodycodes/cli login
|
|
@@ -25,7 +26,7 @@ Or run via `npx @kodycodes/cli` without a global install.
|
|
|
25
26
|
|
|
26
27
|
| Command | Purpose |
|
|
27
28
|
| --- | --- |
|
|
28
|
-
| `kody login` | Browser OAuth (
|
|
29
|
+
| `kody login` | Browser OAuth (CIMD + PKCE). Stores access and refresh tokens. |
|
|
29
30
|
| `kody logout` | Deletes stored credentials. |
|
|
30
31
|
| `kody status` | Shows login state without printing secrets. |
|
|
31
32
|
| `kody whoami` | Confirms the MCP connection and lists tools. |
|
|
@@ -45,7 +46,7 @@ Credentials are stored in the OS secret store:
|
|
|
45
46
|
- Linux: Secret Service / libsecret
|
|
46
47
|
|
|
47
48
|
If the keychain is unavailable (common on headless Linux), the CLI writes a
|
|
48
|
-
`0600` file under `$XDG_CONFIG_HOME/kody` (or `%APPDATA
|
|
49
|
+
`0600` file under `$XDG_CONFIG_HOME/kody` (or `%APPDATA%\kody` on Windows,
|
|
49
50
|
`~/Library/Application Support/kody` on macOS). Tokens are never printed.
|
|
50
51
|
|
|
51
52
|
Access tokens refresh automatically on expiry or HTTP 401.
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type OAuthClientInformationMixed, type OAuthTokens } from '@modelcontextprotocol/client';
|
|
2
2
|
import { type SecretBackend, type StoredCredentials } from './store.js';
|
|
3
3
|
export type LoginOptions = {
|
|
4
4
|
mcpUrl?: string;
|
package/dist/auth.js
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import { createServer, } from 'node:http';
|
|
2
|
-
import {
|
|
3
|
-
import { accessTokenSkewMs, defaultMcpUrl, defaultScopes, loginTimeoutMs, } from './defaults.js';
|
|
4
|
-
import {
|
|
2
|
+
import { auth, } from '@modelcontextprotocol/client';
|
|
3
|
+
import { accessTokenSkewMs, cliRedirectUrl, defaultMcpUrl, defaultScopes, loginTimeoutMs, } from './defaults.js';
|
|
4
|
+
import { createCliOAuthProvider } from './oauth-provider.js';
|
|
5
5
|
import { redactError } from './redact.js';
|
|
6
6
|
import { loadCredentials, saveCredentials, } from './store.js';
|
|
7
|
-
function clientInformationFrom(credentials) {
|
|
8
|
-
return {
|
|
9
|
-
client_id: credentials.clientId,
|
|
10
|
-
...(credentials.clientSecret
|
|
11
|
-
? { client_secret: credentials.clientSecret }
|
|
12
|
-
: {}),
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
7
|
export function isAccessTokenExpired(credentials, now = Date.now()) {
|
|
16
8
|
if (!credentials.expiresAt)
|
|
17
9
|
return false;
|
|
@@ -38,31 +30,54 @@ export function credentialsFromTokens(input) {
|
|
|
38
30
|
scope: input.tokens.scope ?? input.previous?.scope,
|
|
39
31
|
};
|
|
40
32
|
}
|
|
33
|
+
async function persistAuthorizedSession(input) {
|
|
34
|
+
const tokens = await input.provider.tokens();
|
|
35
|
+
const client = await input.provider.clientInformation();
|
|
36
|
+
if (!tokens || !client) {
|
|
37
|
+
throw new Error('OAuth completed without tokens. Run `kody login`.');
|
|
38
|
+
}
|
|
39
|
+
const credentials = credentialsFromTokens({
|
|
40
|
+
mcpUrl: input.mcpUrl,
|
|
41
|
+
resource: input.mcpUrl,
|
|
42
|
+
authorizationServerUrl: tokens.issuer ??
|
|
43
|
+
input.previous?.authorizationServerUrl ??
|
|
44
|
+
new URL(input.mcpUrl).origin,
|
|
45
|
+
client,
|
|
46
|
+
tokens,
|
|
47
|
+
previous: input.previous,
|
|
48
|
+
now: input.now,
|
|
49
|
+
});
|
|
50
|
+
const saved = saveCredentials(credentials, input.backend);
|
|
51
|
+
return { credentials, saved };
|
|
52
|
+
}
|
|
41
53
|
export async function refreshStoredCredentials(input) {
|
|
42
54
|
const { credentials } = input;
|
|
43
55
|
if (!credentials.refreshToken) {
|
|
44
56
|
throw new Error('No refresh token is stored. Run `kody login`.');
|
|
45
57
|
}
|
|
46
|
-
const
|
|
47
|
-
|
|
58
|
+
const provider = createCliOAuthProvider({
|
|
59
|
+
mcpUrl: credentials.mcpUrl,
|
|
60
|
+
redirectUri: cliRedirectUrl(),
|
|
61
|
+
existing: credentials,
|
|
62
|
+
loadStoredTokens: true,
|
|
63
|
+
openBrowser: false,
|
|
64
|
+
expectedState: crypto.randomUUID(),
|
|
48
65
|
});
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
refreshToken: credentials.refreshToken,
|
|
53
|
-
resource: new URL(credentials.resource),
|
|
66
|
+
const result = await auth(provider, {
|
|
67
|
+
serverUrl: credentials.mcpUrl,
|
|
68
|
+
scope: defaultScopes.join(' '),
|
|
54
69
|
fetchFn: input.fetchFn,
|
|
55
70
|
});
|
|
56
|
-
|
|
71
|
+
if (result !== 'AUTHORIZED') {
|
|
72
|
+
throw new Error('Token refresh requires a new `kody login`.');
|
|
73
|
+
}
|
|
74
|
+
const { credentials: next } = await persistAuthorizedSession({
|
|
57
75
|
mcpUrl: credentials.mcpUrl,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
client: clientInformationFrom(credentials),
|
|
61
|
-
tokens,
|
|
76
|
+
provider,
|
|
77
|
+
backend: input.backend,
|
|
62
78
|
previous: credentials,
|
|
63
79
|
now: input.now,
|
|
64
80
|
});
|
|
65
|
-
saveCredentials(next, input.backend);
|
|
66
81
|
return next;
|
|
67
82
|
}
|
|
68
83
|
export async function ensureFreshCredentials(input) {
|
|
@@ -81,33 +96,29 @@ export async function ensureFreshCredentials(input) {
|
|
|
81
96
|
fetchFn: input.fetchFn,
|
|
82
97
|
});
|
|
83
98
|
}
|
|
84
|
-
function startCallbackServer() {
|
|
99
|
+
function startCallbackServer(redirectUri) {
|
|
85
100
|
return new Promise((resolve, reject) => {
|
|
86
101
|
const server = createServer();
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
reject(new Error(
|
|
102
|
+
const port = Number(redirectUri.port);
|
|
103
|
+
server.listen(port, redirectUri.hostname, () => resolve(server));
|
|
104
|
+
server.on('error', (error) => {
|
|
105
|
+
if ('code' in error && error.code === 'EADDRINUSE') {
|
|
106
|
+
reject(new Error(`Login callback port ${port} is in use. Stop the other listener and retry.`));
|
|
92
107
|
return;
|
|
93
108
|
}
|
|
94
|
-
|
|
95
|
-
server,
|
|
96
|
-
redirectUri: new URL(`http://127.0.0.1:${address.port}/callback`),
|
|
97
|
-
});
|
|
109
|
+
reject(error);
|
|
98
110
|
});
|
|
99
|
-
server.on('error', reject);
|
|
100
111
|
});
|
|
101
112
|
}
|
|
102
113
|
function waitForCallback(input) {
|
|
103
114
|
return new Promise((resolve, reject) => {
|
|
104
|
-
const finish = (error,
|
|
115
|
+
const finish = (error, result) => {
|
|
105
116
|
clearTimeout(timer);
|
|
106
117
|
input.server.close();
|
|
107
118
|
if (error)
|
|
108
119
|
reject(error);
|
|
109
120
|
else
|
|
110
|
-
resolve(
|
|
121
|
+
resolve(result ?? { code: '' });
|
|
111
122
|
};
|
|
112
123
|
const timer = setTimeout(() => {
|
|
113
124
|
finish(new Error('Timed out waiting for the browser login.'));
|
|
@@ -130,6 +141,7 @@ function waitForCallback(input) {
|
|
|
130
141
|
}
|
|
131
142
|
const state = url.searchParams.get('state');
|
|
132
143
|
const code = url.searchParams.get('code');
|
|
144
|
+
const iss = url.searchParams.get('iss') ?? undefined;
|
|
133
145
|
if (state !== input.expectedState || !code) {
|
|
134
146
|
response
|
|
135
147
|
.writeHead(400, { 'Content-Type': 'text/html' })
|
|
@@ -140,7 +152,7 @@ function waitForCallback(input) {
|
|
|
140
152
|
response
|
|
141
153
|
.writeHead(200, { 'Content-Type': 'text/html' })
|
|
142
154
|
.end('<p>Kody CLI is signed in. You can close this window.</p>');
|
|
143
|
-
finish(null, code);
|
|
155
|
+
finish(null, { code, ...(iss ? { iss } : {}) });
|
|
144
156
|
}
|
|
145
157
|
catch (error) {
|
|
146
158
|
finish(redactError(error));
|
|
@@ -150,64 +162,54 @@ function waitForCallback(input) {
|
|
|
150
162
|
}
|
|
151
163
|
export async function login(options = {}) {
|
|
152
164
|
const mcpUrl = options.mcpUrl ?? defaultMcpUrl;
|
|
153
|
-
const
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
const
|
|
165
|
+
const redirectUri = cliRedirectUrl();
|
|
166
|
+
const expectedState = crypto.randomUUID();
|
|
167
|
+
const server = await startCallbackServer(redirectUri);
|
|
168
|
+
let authorizationUrl = redirectUri;
|
|
169
|
+
const provider = createCliOAuthProvider({
|
|
170
|
+
mcpUrl,
|
|
171
|
+
redirectUri,
|
|
172
|
+
loadStoredTokens: false,
|
|
173
|
+
openBrowser: options.openBrowser !== false,
|
|
174
|
+
expectedState,
|
|
175
|
+
onAuthorizationUrl: (url) => {
|
|
176
|
+
authorizationUrl = url;
|
|
177
|
+
options.onAuthorizationUrl?.(url);
|
|
178
|
+
},
|
|
179
|
+
});
|
|
158
180
|
try {
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
metadata,
|
|
162
|
-
clientMetadata: {
|
|
163
|
-
redirect_uris: [redirectUri.href],
|
|
164
|
-
client_name: 'Kody CLI',
|
|
165
|
-
client_uri: 'https://github.com/kody-bot/cli',
|
|
166
|
-
grant_types: ['authorization_code', 'refresh_token'],
|
|
167
|
-
response_types: ['code'],
|
|
168
|
-
token_endpoint_auth_method: 'none',
|
|
169
|
-
scope: defaultScopes.join(' '),
|
|
170
|
-
},
|
|
181
|
+
const first = await auth(provider, {
|
|
182
|
+
serverUrl: mcpUrl,
|
|
171
183
|
scope: defaultScopes.join(' '),
|
|
172
|
-
fetchFn,
|
|
184
|
+
fetchFn: options.fetchFn,
|
|
173
185
|
});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
if (first !== 'AUTHORIZED') {
|
|
187
|
+
const callback = await waitForCallback({
|
|
188
|
+
server,
|
|
189
|
+
redirectUri,
|
|
190
|
+
expectedState,
|
|
191
|
+
timeoutMs: options.timeoutMs ?? loginTimeoutMs,
|
|
192
|
+
});
|
|
193
|
+
const exchanged = await auth(provider, {
|
|
194
|
+
serverUrl: mcpUrl,
|
|
195
|
+
authorizationCode: callback.code,
|
|
196
|
+
...(callback.iss ? { iss: callback.iss } : {}),
|
|
197
|
+
scope: defaultScopes.join(' '),
|
|
198
|
+
fetchFn: options.fetchFn,
|
|
199
|
+
});
|
|
200
|
+
if (exchanged !== 'AUTHORIZED') {
|
|
201
|
+
throw new Error('OAuth redirect completed without tokens.');
|
|
202
|
+
}
|
|
186
203
|
}
|
|
187
|
-
|
|
188
|
-
server
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
timeoutMs: options.timeoutMs ?? loginTimeoutMs,
|
|
192
|
-
});
|
|
193
|
-
const tokens = await exchangeAuthorization(info.authorizationServerUrl, {
|
|
194
|
-
metadata,
|
|
195
|
-
clientInformation: client,
|
|
196
|
-
authorizationCode: code,
|
|
197
|
-
codeVerifier,
|
|
198
|
-
redirectUri,
|
|
199
|
-
resource: new URL(resource),
|
|
200
|
-
fetchFn,
|
|
201
|
-
});
|
|
202
|
-
const credentials = credentialsFromTokens({
|
|
204
|
+
else {
|
|
205
|
+
server.close();
|
|
206
|
+
}
|
|
207
|
+
const { credentials, saved } = await persistAuthorizedSession({
|
|
203
208
|
mcpUrl,
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
client,
|
|
207
|
-
tokens,
|
|
209
|
+
provider,
|
|
210
|
+
backend: options.backend,
|
|
208
211
|
now: options.now?.(),
|
|
209
212
|
});
|
|
210
|
-
const saved = saveCredentials(credentials, options.backend);
|
|
211
213
|
return {
|
|
212
214
|
credentials,
|
|
213
215
|
authorizationUrl,
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,GAIZ,MAAM,WAAW,CAAA;AAClB,OAAO,EACN,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parseArgs } from 'node:util';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
|
-
import { defaultMcpUrl } from './defaults.js';
|
|
3
|
+
import { defaultMcpUrl, modernMcpProtocolVersion } from './defaults.js';
|
|
4
4
|
import { usage } from './help.js';
|
|
5
5
|
import { ensureFreshCredentials, login } from './auth.js';
|
|
6
6
|
import { deleteCredentials, loadCredentials } from './store.js';
|
|
@@ -135,12 +135,13 @@ async function dispatch(parsed, write) {
|
|
|
135
135
|
if (json) {
|
|
136
136
|
write(`${JSON.stringify({
|
|
137
137
|
mcpUrl: credentials.mcpUrl,
|
|
138
|
+
protocol: modernMcpProtocolVersion,
|
|
138
139
|
scope: credentials.scope ?? null,
|
|
139
140
|
tools: tools.map((tool) => tool.name),
|
|
140
141
|
}, null, 2)}\n`);
|
|
141
142
|
return 0;
|
|
142
143
|
}
|
|
143
|
-
write(`Connected to ${credentials.mcpUrl}\nTools: ${tools.map((tool) => tool.name).join(', ') || '(none)'}\n`);
|
|
144
|
+
write(`Connected to ${credentials.mcpUrl} (${modernMcpProtocolVersion})\nTools: ${tools.map((tool) => tool.name).join(', ') || '(none)'}\n`);
|
|
144
145
|
return 0;
|
|
145
146
|
}
|
|
146
147
|
case 'search': {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/defaults.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
export declare const defaultMcpUrl = "https://kody.codes/mcp";
|
|
2
|
+
/** Pin to Kody's stateless `/mcp` lane. */
|
|
3
|
+
export declare const modernMcpProtocolVersion = "2026-07-28";
|
|
2
4
|
export declare const defaultScopes: readonly ["profile", "email"];
|
|
3
5
|
export declare const keyringService = "kody.codes";
|
|
4
6
|
export declare const loginTimeoutMs: number;
|
|
5
7
|
export declare const accessTokenSkewMs = 60000;
|
|
6
8
|
export declare const cliName = "@kodycodes/cli";
|
|
9
|
+
export declare const cliClientUri = "https://github.com/kody-bot/cli";
|
|
10
|
+
/** Fixed loopback port so CIMD can list an exact redirect URI. */
|
|
11
|
+
export declare const oauthCallbackPort = 43742;
|
|
12
|
+
export declare const cliClientIdMetadataPath = "/oauth/cli-client-metadata.json";
|
|
13
|
+
export declare function cliClientMetadataUrl(mcpUrl: string): string;
|
|
14
|
+
export declare function cliRedirectUrl(port?: number): URL;
|
package/dist/defaults.js
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
export const defaultMcpUrl = 'https://kody.codes/mcp';
|
|
2
|
+
/** Pin to Kody's stateless `/mcp` lane. */
|
|
3
|
+
export const modernMcpProtocolVersion = '2026-07-28';
|
|
2
4
|
export const defaultScopes = ['profile', 'email'];
|
|
3
5
|
export const keyringService = 'kody.codes';
|
|
4
6
|
export const loginTimeoutMs = 5 * 60 * 1000;
|
|
5
7
|
export const accessTokenSkewMs = 60_000;
|
|
6
8
|
export const cliName = '@kodycodes/cli';
|
|
9
|
+
export const cliClientUri = 'https://github.com/kody-bot/cli';
|
|
10
|
+
/** Fixed loopback port so CIMD can list an exact redirect URI. */
|
|
11
|
+
export const oauthCallbackPort = 43742;
|
|
12
|
+
export const cliClientIdMetadataPath = '/oauth/cli-client-metadata.json';
|
|
13
|
+
export function cliClientMetadataUrl(mcpUrl) {
|
|
14
|
+
return new URL(cliClientIdMetadataPath, mcpUrl).href;
|
|
15
|
+
}
|
|
16
|
+
export function cliRedirectUrl(port = oauthCallbackPort) {
|
|
17
|
+
return new URL(`http://127.0.0.1:${port}/callback`);
|
|
18
|
+
}
|
|
7
19
|
//# sourceMappingURL=defaults.js.map
|
package/dist/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AACrD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAA;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAA;AACvC,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAA;AAC7D,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AACtC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA;AAExE,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,OAAO,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,iBAAiB;IAC9D,OAAO,IAAI,GAAG,CAAC,oBAAoB,IAAI,WAAW,CAAC,CAAA;AACpD,CAAC"}
|
package/dist/mcp.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { Client } from '@modelcontextprotocol/
|
|
2
|
-
import {
|
|
3
|
-
import { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
4
|
-
import { cliName } from './defaults.js';
|
|
1
|
+
import { Client, StreamableHTTPClientTransport, UnauthorizedError, } from '@modelcontextprotocol/client';
|
|
2
|
+
import { cliName, modernMcpProtocolVersion } from './defaults.js';
|
|
5
3
|
import { ensureFreshCredentials, refreshStoredCredentials } from './auth.js';
|
|
6
4
|
import { readPackageVersion } from './package-info.js';
|
|
7
5
|
import { redactError } from './redact.js';
|
|
@@ -12,12 +10,12 @@ async function connect(mcpUrl, accessToken, fetchFn) {
|
|
|
12
10
|
Authorization: `Bearer ${accessToken}`,
|
|
13
11
|
},
|
|
14
12
|
},
|
|
15
|
-
fetch: fetchFn,
|
|
13
|
+
...(fetchFn ? { fetch: fetchFn } : {}),
|
|
16
14
|
});
|
|
17
15
|
const client = new Client({
|
|
18
16
|
name: cliName,
|
|
19
17
|
version: readPackageVersion(),
|
|
20
|
-
});
|
|
18
|
+
}, { versionNegotiation: { mode: { pin: modernMcpProtocolVersion } } });
|
|
21
19
|
await client.connect(transport);
|
|
22
20
|
return { client, transport };
|
|
23
21
|
}
|
|
@@ -100,6 +98,7 @@ function isUnauthorized(error) {
|
|
|
100
98
|
if (!error || typeof error !== 'object')
|
|
101
99
|
return false;
|
|
102
100
|
const status = 'code' in error ? error.code : undefined;
|
|
103
|
-
return status === 401 ||
|
|
101
|
+
return (status === 401 ||
|
|
102
|
+
(error instanceof Error && /401|unauthorized/i.test(error.message)));
|
|
104
103
|
}
|
|
105
104
|
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type OAuthClientMetadata, type OAuthClientProvider } from '@modelcontextprotocol/client';
|
|
2
|
+
import type { StoredCredentials } from './store.js';
|
|
3
|
+
export declare function buildCliClientMetadata(): OAuthClientMetadata;
|
|
4
|
+
export declare function createCliOAuthProvider(input: {
|
|
5
|
+
mcpUrl: string;
|
|
6
|
+
redirectUri: URL;
|
|
7
|
+
existing?: StoredCredentials;
|
|
8
|
+
loadStoredTokens: boolean;
|
|
9
|
+
openBrowser: boolean;
|
|
10
|
+
expectedState: string;
|
|
11
|
+
onAuthorizationUrl?: (url: URL) => void;
|
|
12
|
+
}): OAuthClientProvider;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { validateClientMetadataUrl, } from '@modelcontextprotocol/client';
|
|
2
|
+
import { cliClientMetadataUrl, cliClientUri, cliName, cliRedirectUrl, defaultScopes, } from './defaults.js';
|
|
3
|
+
import { openUrl } from './open-url.js';
|
|
4
|
+
export function buildCliClientMetadata() {
|
|
5
|
+
return {
|
|
6
|
+
client_name: cliName,
|
|
7
|
+
client_uri: cliClientUri,
|
|
8
|
+
redirect_uris: [cliRedirectUrl().href],
|
|
9
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
10
|
+
response_types: ['code'],
|
|
11
|
+
token_endpoint_auth_method: 'none',
|
|
12
|
+
application_type: 'native',
|
|
13
|
+
scope: defaultScopes.join(' '),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function createCliOAuthProvider(input) {
|
|
17
|
+
const clientMetadataUrl = cliClientMetadataUrl(input.mcpUrl);
|
|
18
|
+
validateClientMetadataUrl(clientMetadataUrl);
|
|
19
|
+
let codeVerifier = '';
|
|
20
|
+
let discoveryState;
|
|
21
|
+
// Always present a CIMD client_id. Leaving this empty would let the SDK
|
|
22
|
+
// fall back to deprecated dynamic client registration.
|
|
23
|
+
let clientInformation = input.existing
|
|
24
|
+
? {
|
|
25
|
+
client_id: input.existing.clientId,
|
|
26
|
+
...(input.existing.clientSecret
|
|
27
|
+
? { client_secret: input.existing.clientSecret }
|
|
28
|
+
: {}),
|
|
29
|
+
issuer: input.existing.authorizationServerUrl,
|
|
30
|
+
}
|
|
31
|
+
: { client_id: clientMetadataUrl };
|
|
32
|
+
let tokens = input.loadStoredTokens && input.existing
|
|
33
|
+
? {
|
|
34
|
+
access_token: input.existing.accessToken,
|
|
35
|
+
token_type: input.existing.tokenType,
|
|
36
|
+
...(input.existing.refreshToken
|
|
37
|
+
? { refresh_token: input.existing.refreshToken }
|
|
38
|
+
: {}),
|
|
39
|
+
...(input.existing.scope ? { scope: input.existing.scope } : {}),
|
|
40
|
+
issuer: input.existing.authorizationServerUrl,
|
|
41
|
+
}
|
|
42
|
+
: undefined;
|
|
43
|
+
return {
|
|
44
|
+
clientMetadataUrl,
|
|
45
|
+
get redirectUrl() {
|
|
46
|
+
return input.redirectUri;
|
|
47
|
+
},
|
|
48
|
+
get clientMetadata() {
|
|
49
|
+
return buildCliClientMetadata();
|
|
50
|
+
},
|
|
51
|
+
state() {
|
|
52
|
+
return input.expectedState;
|
|
53
|
+
},
|
|
54
|
+
clientInformation() {
|
|
55
|
+
return clientInformation;
|
|
56
|
+
},
|
|
57
|
+
saveClientInformation(next) {
|
|
58
|
+
clientInformation = next;
|
|
59
|
+
},
|
|
60
|
+
tokens() {
|
|
61
|
+
return tokens;
|
|
62
|
+
},
|
|
63
|
+
saveTokens(next) {
|
|
64
|
+
tokens = next;
|
|
65
|
+
},
|
|
66
|
+
async redirectToAuthorization(authorizationUrl) {
|
|
67
|
+
input.onAuthorizationUrl?.(authorizationUrl);
|
|
68
|
+
if (input.openBrowser) {
|
|
69
|
+
await openUrl(authorizationUrl.href);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
saveCodeVerifier(next) {
|
|
73
|
+
codeVerifier = next;
|
|
74
|
+
},
|
|
75
|
+
codeVerifier() {
|
|
76
|
+
if (!codeVerifier) {
|
|
77
|
+
throw new Error('OAuth PKCE verifier is missing.');
|
|
78
|
+
}
|
|
79
|
+
return codeVerifier;
|
|
80
|
+
},
|
|
81
|
+
saveDiscoveryState(next) {
|
|
82
|
+
discoveryState = next;
|
|
83
|
+
},
|
|
84
|
+
discoveryState() {
|
|
85
|
+
return discoveryState;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=oauth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../src/oauth-provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kodycodes/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Official Kody MCP client CLI: login, secure token storage, search, and execute.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@modelcontextprotocol/
|
|
50
|
+
"@modelcontextprotocol/client": "2.0.0",
|
|
51
51
|
"@napi-rs/keyring": "^1.3.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
package/skills/kody/SKILL.md
CHANGED
|
@@ -31,7 +31,7 @@ npx @kodycodes/cli skill install
|
|
|
31
31
|
kody login
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
The CLI opens a browser for Kody OAuth (PKCE +
|
|
34
|
+
The CLI opens a browser for Kody OAuth (PKCE + Client ID Metadata Documents).
|
|
35
35
|
If a browser cannot open, it prints the URL. Tokens (access + refresh) are
|
|
36
36
|
stored in the OS keychain on macOS, Windows, and Linux. Linux without Secret
|
|
37
37
|
Service falls back to a `0600` file under `$XDG_CONFIG_HOME/kody`.
|