@botuyo/mcp 0.3.13 → 0.3.16
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/LICENSE +21 -0
- package/README.md +16 -2
- package/dist/__tests__/client.spec.d.ts +5 -0
- package/dist/__tests__/client.spec.js +139 -0
- package/dist/__tests__/client.spec.js.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +22 -7
- package/dist/client.js.map +1 -1
- package/dist/commands/__tests__/credentials.spec.d.ts +5 -0
- package/dist/commands/__tests__/credentials.spec.js +174 -0
- package/dist/commands/__tests__/credentials.spec.js.map +1 -0
- package/dist/commands/auth.js +17 -33
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/credentials.d.ts +38 -4
- package/dist/commands/credentials.js +80 -12
- package/dist/commands/credentials.js.map +1 -1
- package/dist/commands/login.js +26 -56
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/switch_tenant.js +11 -36
- package/dist/commands/switch_tenant.js.map +1 -1
- package/dist/commands/tenants.js +10 -19
- package/dist/commands/tenants.js.map +1 -1
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/dist/tools/__tests__/configure_avatar.spec.js +2 -3
- package/dist/tools/__tests__/configure_avatar.spec.js.map +1 -1
- package/dist/tools/configure_avatar.js +2 -3
- package/dist/tools/configure_avatar.js.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/ingest_knowledge_url.d.ts +4 -0
- package/dist/tools/ingest_knowledge_url.js +35 -0
- package/dist/tools/ingest_knowledge_url.js.map +1 -0
- package/package.json +2 -3
|
@@ -10,6 +10,7 @@ export interface BotuyoCredentials {
|
|
|
10
10
|
email: string;
|
|
11
11
|
savedAt: string;
|
|
12
12
|
expiresAt: string;
|
|
13
|
+
apiUrl?: string;
|
|
13
14
|
}
|
|
14
15
|
export declare function readCredentials(): Promise<BotuyoCredentials | null>;
|
|
15
16
|
export declare function saveCredentials(creds: BotuyoCredentials): Promise<void>;
|
|
@@ -27,8 +28,41 @@ export declare function resolveToken(): Promise<string | null>;
|
|
|
27
28
|
*/
|
|
28
29
|
export declare function isTokenExpired(): Promise<boolean>;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
31
|
+
* Resolve the API URL to use, in priority order:
|
|
32
|
+
* 1. BOTUYO_API_URL env var
|
|
33
|
+
* 2. apiUrl from ~/.botuyo/credentials.json
|
|
34
|
+
* 3. Default: https://api.botuyo.com
|
|
33
35
|
*/
|
|
34
|
-
export declare
|
|
36
|
+
export declare const DEFAULT_API_URL = "https://api.botuyo.com";
|
|
37
|
+
export declare function resolveApiUrl(): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if there is a valid existing session.
|
|
40
|
+
* Returns the credentials if valid, null if re-auth is needed.
|
|
41
|
+
*
|
|
42
|
+
* Logic:
|
|
43
|
+
* 1. No credentials on disk → null
|
|
44
|
+
* 2. Locally expired → clear + null
|
|
45
|
+
* 3. force=true → null (skip validation)
|
|
46
|
+
* 4. Server rejects token → clear + null
|
|
47
|
+
* 5. Network error → assume valid (return creds)
|
|
48
|
+
* 6. Valid → return creds
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkExistingSession(apiUrl: string, force: boolean): Promise<BotuyoCredentials | null>;
|
|
51
|
+
export interface UserInfo {
|
|
52
|
+
tenantIds: string[];
|
|
53
|
+
roles: Array<{
|
|
54
|
+
tenantId: string;
|
|
55
|
+
role: string;
|
|
56
|
+
}>;
|
|
57
|
+
email: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Fetch the current user's info from GET /api/auth/me.
|
|
61
|
+
* Returns parsed UserInfo or throws on failure.
|
|
62
|
+
*/
|
|
63
|
+
export declare function fetchUserInfo(apiUrl: string, token: string): Promise<UserInfo>;
|
|
64
|
+
/**
|
|
65
|
+
* Resolve a tenant's display name via GET /api/tenants/:id.
|
|
66
|
+
* Returns the name or the tenantId as fallback (never throws).
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveTenantName(apiUrl: string, token: string, tenantId: string): Promise<string>;
|
|
@@ -58,30 +58,98 @@ export async function isTokenExpired() {
|
|
|
58
58
|
return new Date(creds.expiresAt) < new Date();
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
61
|
+
* Resolve the API URL to use, in priority order:
|
|
62
|
+
* 1. BOTUYO_API_URL env var
|
|
63
|
+
* 2. apiUrl from ~/.botuyo/credentials.json
|
|
64
|
+
* 3. Default: https://api.botuyo.com
|
|
64
65
|
*/
|
|
65
|
-
export
|
|
66
|
-
|
|
66
|
+
export const DEFAULT_API_URL = 'https://api.botuyo.com';
|
|
67
|
+
export async function resolveApiUrl() {
|
|
68
|
+
if (process.env.BOTUYO_API_URL)
|
|
69
|
+
return process.env.BOTUYO_API_URL;
|
|
70
|
+
const creds = await readCredentials();
|
|
71
|
+
if (creds?.apiUrl)
|
|
72
|
+
return creds.apiUrl;
|
|
73
|
+
return DEFAULT_API_URL;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if there is a valid existing session.
|
|
77
|
+
* Returns the credentials if valid, null if re-auth is needed.
|
|
78
|
+
*
|
|
79
|
+
* Logic:
|
|
80
|
+
* 1. No credentials on disk → null
|
|
81
|
+
* 2. Locally expired → clear + null
|
|
82
|
+
* 3. force=true → null (skip validation)
|
|
83
|
+
* 4. Server rejects token → clear + null
|
|
84
|
+
* 5. Network error → assume valid (return creds)
|
|
85
|
+
* 6. Valid → return creds
|
|
86
|
+
*/
|
|
87
|
+
export async function checkExistingSession(apiUrl, force) {
|
|
88
|
+
const creds = await readCredentials();
|
|
89
|
+
if (!creds)
|
|
90
|
+
return null;
|
|
91
|
+
// Locally expired
|
|
92
|
+
if (creds.expiresAt && new Date(creds.expiresAt) < new Date()) {
|
|
93
|
+
await clearCredentials();
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
// Force re-auth
|
|
97
|
+
if (force)
|
|
98
|
+
return null;
|
|
99
|
+
// Verify with server
|
|
67
100
|
try {
|
|
68
|
-
const res = await fetch(`${
|
|
69
|
-
headers: { Authorization: `Bearer ${token}` }
|
|
101
|
+
const res = await fetch(`${apiUrl}/api/auth/me`, {
|
|
102
|
+
headers: { Authorization: `Bearer ${creds.token}` }
|
|
70
103
|
});
|
|
71
104
|
if (!res.ok) {
|
|
72
105
|
await clearCredentials();
|
|
73
|
-
return
|
|
106
|
+
return null;
|
|
74
107
|
}
|
|
75
108
|
const body = await res.json();
|
|
76
109
|
if (!body.success) {
|
|
77
110
|
await clearCredentials();
|
|
78
|
-
return
|
|
111
|
+
return null;
|
|
79
112
|
}
|
|
80
|
-
return
|
|
113
|
+
return creds;
|
|
81
114
|
}
|
|
82
115
|
catch {
|
|
83
|
-
// Network error — don't clear
|
|
84
|
-
return
|
|
116
|
+
// Network error — don't clear, assume valid
|
|
117
|
+
return creds;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Fetch the current user's info from GET /api/auth/me.
|
|
122
|
+
* Returns parsed UserInfo or throws on failure.
|
|
123
|
+
*/
|
|
124
|
+
export async function fetchUserInfo(apiUrl, token) {
|
|
125
|
+
const res = await fetch(`${apiUrl}/api/auth/me`, {
|
|
126
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
127
|
+
});
|
|
128
|
+
const data = (await res.json());
|
|
129
|
+
if (!data.success) {
|
|
130
|
+
throw new Error(data.error || 'Failed to fetch user info');
|
|
131
|
+
}
|
|
132
|
+
const user = data.data.user;
|
|
133
|
+
return {
|
|
134
|
+
tenantIds: user.tenantIds || [],
|
|
135
|
+
roles: user.roles || [],
|
|
136
|
+
email: user.email
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Resolve a tenant's display name via GET /api/tenants/:id.
|
|
141
|
+
* Returns the name or the tenantId as fallback (never throws).
|
|
142
|
+
*/
|
|
143
|
+
export async function resolveTenantName(apiUrl, token, tenantId) {
|
|
144
|
+
try {
|
|
145
|
+
const res = await fetch(`${apiUrl}/api/tenants/${tenantId}`, {
|
|
146
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
147
|
+
});
|
|
148
|
+
const data = (await res.json());
|
|
149
|
+
return data.data?.name || data.data?.tenant?.name || tenantId;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return tenantId;
|
|
85
153
|
}
|
|
86
154
|
}
|
|
87
155
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -13,29 +13,21 @@
|
|
|
13
13
|
* 6. Saves the credentials to ~/.botuyo/credentials.json
|
|
14
14
|
*/
|
|
15
15
|
import * as readline from 'readline';
|
|
16
|
-
import {
|
|
17
|
-
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
16
|
+
import { saveCredentials, checkExistingSession, resolveApiUrl, fetchUserInfo, resolveTenantName } from './credentials.js';
|
|
18
17
|
export async function runLogin(args) {
|
|
19
18
|
console.log('\n🤖 BotUyo MCP — Login\n');
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
console.log(` Tenant: ${existing.tenantName} (${existing.role})`);
|
|
33
|
-
console.log('\n Usá --force para re-autenticarte.');
|
|
34
|
-
console.log(' O usá `npx @botuyo/mcp auth` para login por browser (OAuth).\n');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
console.log('⚠️ Tu sesión ya no es válida en el servidor. Vamos a re-autenticarte.\n');
|
|
38
|
-
}
|
|
19
|
+
const API_URL = process.env.BOTUYO_API_URL || await resolveApiUrl();
|
|
20
|
+
const force = args.includes('--force');
|
|
21
|
+
const existing = await checkExistingSession(API_URL, force);
|
|
22
|
+
if (existing) {
|
|
23
|
+
console.log(`✅ Ya estás autenticado como: ${existing.email}`);
|
|
24
|
+
console.log(` Tenant: ${existing.tenantName} (${existing.role})`);
|
|
25
|
+
console.log('\n Usá --force para re-autenticarte.');
|
|
26
|
+
console.log(' O usá `npx @botuyo/mcp auth` para login por browser (OAuth).\n');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!force) {
|
|
30
|
+
console.log('⚠️ Sesión expirada o inválida. Vamos a re-autenticarte.\n');
|
|
39
31
|
}
|
|
40
32
|
// Offer login method choice
|
|
41
33
|
if (process.stdin.isTTY) {
|
|
@@ -58,6 +50,7 @@ export async function runLogin(args) {
|
|
|
58
50
|
process.exit(1);
|
|
59
51
|
}
|
|
60
52
|
console.log('\n⏳ Autenticando...');
|
|
53
|
+
console.log(` API: ${API_URL}\n`);
|
|
61
54
|
// 1. Login
|
|
62
55
|
const loginRes = await fetch(`${API_URL}/api/auth/login`, {
|
|
63
56
|
method: 'POST',
|
|
@@ -72,17 +65,15 @@ export async function runLogin(args) {
|
|
|
72
65
|
let token = loginData.data.token;
|
|
73
66
|
let tenantId = loginData.data.tenantId;
|
|
74
67
|
// 2. Get user info and tenants
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
console.error(`❌ Error al obtener info del usuario: ${
|
|
68
|
+
let userInfo;
|
|
69
|
+
try {
|
|
70
|
+
userInfo = await fetchUserInfo(API_URL, token);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
console.error(`❌ Error al obtener info del usuario: ${err.message}`);
|
|
81
74
|
process.exit(1);
|
|
82
75
|
}
|
|
83
|
-
const
|
|
84
|
-
const tenantIds = user.tenantIds || [];
|
|
85
|
-
const roles = user.roles || [];
|
|
76
|
+
const { tenantIds, roles } = userInfo;
|
|
86
77
|
// 3. If multiple tenants, ask user to pick
|
|
87
78
|
if (tenantIds.length > 1) {
|
|
88
79
|
console.log(`\n📋 Tenés ${tenantIds.length} tenants disponibles:\n`);
|
|
@@ -90,15 +81,7 @@ export async function runLogin(args) {
|
|
|
90
81
|
const tenantInfos = await Promise.all(tenantIds.map(async (tid, i) => {
|
|
91
82
|
const role = roles.find((r) => r.tenantId === tid)?.role || 'member';
|
|
92
83
|
const isActive = tid === tenantId;
|
|
93
|
-
|
|
94
|
-
try {
|
|
95
|
-
const tRes = await fetch(`${API_URL}/api/tenants/${tid}`, {
|
|
96
|
-
headers: { Authorization: `Bearer ${token}` }
|
|
97
|
-
});
|
|
98
|
-
const tData = (await tRes.json());
|
|
99
|
-
name = tData.data?.name || tData.data?.tenant?.name || tid;
|
|
100
|
-
}
|
|
101
|
-
catch { /* keep tid as fallback */ }
|
|
84
|
+
const name = await resolveTenantName(API_URL, token, tid);
|
|
102
85
|
return { id: tid, name, role, isActive, index: i + 1 };
|
|
103
86
|
}));
|
|
104
87
|
for (const t of tenantInfos) {
|
|
@@ -142,24 +125,11 @@ export async function runLogin(args) {
|
|
|
142
125
|
role: activeRole,
|
|
143
126
|
email: email.trim(),
|
|
144
127
|
savedAt: new Date().toISOString(),
|
|
145
|
-
expiresAt
|
|
128
|
+
expiresAt,
|
|
129
|
+
apiUrl: API_URL
|
|
146
130
|
};
|
|
147
|
-
//
|
|
148
|
-
|
|
149
|
-
const tenantRes = await fetch(`${API_URL}/api/tenants/${tenantId}`, {
|
|
150
|
-
headers: { Authorization: `Bearer ${token}` }
|
|
151
|
-
});
|
|
152
|
-
const tenantData = (await tenantRes.json());
|
|
153
|
-
if (tenantData.success && tenantData.data?.name) {
|
|
154
|
-
creds.tenantName = tenantData.data.name;
|
|
155
|
-
}
|
|
156
|
-
else if (tenantData.data?.tenant?.name) {
|
|
157
|
-
creds.tenantName = tenantData.data.tenant.name;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
// If we can't get the name, tenantId is fine
|
|
162
|
-
}
|
|
131
|
+
// Resolve tenant display name
|
|
132
|
+
creds.tenantName = await resolveTenantName(API_URL, token, tenantId);
|
|
163
133
|
await saveCredentials(creds);
|
|
164
134
|
console.log(`\n✅ ¡Autenticado exitosamente!`);
|
|
165
135
|
console.log(` Email: ${creds.email}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,29 +8,27 @@
|
|
|
8
8
|
* Calls POST /api/auth/switch-tenant and saves the new JWT.
|
|
9
9
|
*/
|
|
10
10
|
import * as readline from 'readline';
|
|
11
|
-
import { readCredentials, saveCredentials, resolveToken } from './credentials.js';
|
|
12
|
-
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
11
|
+
import { readCredentials, saveCredentials, resolveToken, resolveApiUrl, fetchUserInfo, resolveTenantName } from './credentials.js';
|
|
13
12
|
export async function runSwitchTenant() {
|
|
14
13
|
console.log('\n🔄 BotUyo MCP — Switch Tenant\n');
|
|
15
14
|
const token = await resolveToken();
|
|
16
15
|
const creds = await readCredentials();
|
|
16
|
+
const API_URL = await resolveApiUrl();
|
|
17
17
|
if (!token || !creds) {
|
|
18
18
|
console.error('❌ No estás autenticado. Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
19
19
|
process.exit(1);
|
|
20
20
|
}
|
|
21
21
|
// Get user's tenants
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
console.error(`❌ Sesión inválida: ${
|
|
22
|
+
let userInfo;
|
|
23
|
+
try {
|
|
24
|
+
userInfo = await fetchUserInfo(API_URL, token);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
console.error(`❌ Sesión inválida: ${err.message || 'Token expirado'}`);
|
|
28
28
|
console.error(' Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
29
29
|
process.exit(1);
|
|
30
30
|
}
|
|
31
|
-
const
|
|
32
|
-
const tenantIds = user.tenantIds || [];
|
|
33
|
-
const roles = user.roles || [];
|
|
31
|
+
const { tenantIds, roles } = userInfo;
|
|
34
32
|
if (tenantIds.length === 0) {
|
|
35
33
|
console.log('No tenés tenants disponibles.');
|
|
36
34
|
return;
|
|
@@ -47,14 +45,7 @@ export async function runSwitchTenant() {
|
|
|
47
45
|
const isActive = tid === creds.tenantId;
|
|
48
46
|
let name = isActive ? (creds.tenantName || tid) : tid;
|
|
49
47
|
if (name === tid) {
|
|
50
|
-
|
|
51
|
-
const tRes = await fetch(`${API_URL}/api/tenants/${tid}`, {
|
|
52
|
-
headers: { Authorization: `Bearer ${token}` }
|
|
53
|
-
});
|
|
54
|
-
const tData = (await tRes.json());
|
|
55
|
-
name = tData.data?.name || tData.data?.tenant?.name || tid;
|
|
56
|
-
}
|
|
57
|
-
catch { /* keep tid as fallback */ }
|
|
48
|
+
name = await resolveTenantName(API_URL, token, tid);
|
|
58
49
|
}
|
|
59
50
|
return { id: tid, name, role, isActive, index: i + 1 };
|
|
60
51
|
}));
|
|
@@ -90,23 +81,7 @@ export async function runSwitchTenant() {
|
|
|
90
81
|
}
|
|
91
82
|
const newToken = switchData.data.token;
|
|
92
83
|
const newRole = switchData.data.user?.role || roles.find((r) => r.tenantId === selectedTenantId)?.role || 'member';
|
|
93
|
-
|
|
94
|
-
let tenantName = selectedTenantId;
|
|
95
|
-
try {
|
|
96
|
-
const tenantRes = await fetch(`${API_URL}/api/tenants/${selectedTenantId}`, {
|
|
97
|
-
headers: { Authorization: `Bearer ${newToken}` }
|
|
98
|
-
});
|
|
99
|
-
const tenantData = (await tenantRes.json());
|
|
100
|
-
if (tenantData.success && tenantData.data?.name) {
|
|
101
|
-
tenantName = tenantData.data.name;
|
|
102
|
-
}
|
|
103
|
-
else if (tenantData.data?.tenant?.name) {
|
|
104
|
-
tenantName = tenantData.data.tenant.name;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
// use tenantId
|
|
109
|
-
}
|
|
84
|
+
const tenantName = await resolveTenantName(API_URL, newToken, selectedTenantId);
|
|
110
85
|
await saveCredentials({
|
|
111
86
|
...creds,
|
|
112
87
|
token: newToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch_tenant.js","sourceRoot":"","sources":["../../src/commands/switch_tenant.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"switch_tenant.js","sourceRoot":"","sources":["../../src/commands/switch_tenant.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/tenants.js
CHANGED
|
@@ -6,28 +6,26 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Lists all tenants the current user belongs to with their roles.
|
|
8
8
|
*/
|
|
9
|
-
import { readCredentials, resolveToken } from './credentials.js';
|
|
10
|
-
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
9
|
+
import { readCredentials, resolveToken, resolveApiUrl, fetchUserInfo, resolveTenantName } from './credentials.js';
|
|
11
10
|
export async function runTenants() {
|
|
12
11
|
console.log('\n📋 BotUyo MCP — Mis Tenants\n');
|
|
13
12
|
const token = await resolveToken();
|
|
14
13
|
const creds = await readCredentials();
|
|
14
|
+
const API_URL = await resolveApiUrl();
|
|
15
15
|
if (!token || !creds) {
|
|
16
16
|
console.error('❌ No estás autenticado. Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
17
17
|
process.exit(1);
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
console.error(`❌ Sesión inválida: ${
|
|
19
|
+
let userInfo;
|
|
20
|
+
try {
|
|
21
|
+
userInfo = await fetchUserInfo(API_URL, token);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error(`❌ Sesión inválida: ${err.message || 'Token expirado'}`);
|
|
25
25
|
console.error(' Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
26
26
|
process.exit(1);
|
|
27
27
|
}
|
|
28
|
-
const
|
|
29
|
-
const tenantIds = user.tenantIds || [];
|
|
30
|
-
const roles = user.roles || [];
|
|
28
|
+
const { tenantIds, roles } = userInfo;
|
|
31
29
|
if (tenantIds.length === 0) {
|
|
32
30
|
console.log('No tenés tenants disponibles.\n');
|
|
33
31
|
return;
|
|
@@ -42,14 +40,7 @@ export async function runTenants() {
|
|
|
42
40
|
const isActive = tid === creds.tenantId;
|
|
43
41
|
let name = isActive ? (creds.tenantName || tid) : tid;
|
|
44
42
|
if (name === tid) {
|
|
45
|
-
|
|
46
|
-
const tRes = await fetch(`${API_URL}/api/tenants/${tid}`, {
|
|
47
|
-
headers: { Authorization: `Bearer ${token}` }
|
|
48
|
-
});
|
|
49
|
-
const tData = (await tRes.json());
|
|
50
|
-
name = tData.data?.name || tData.data?.tenant?.name || tid;
|
|
51
|
-
}
|
|
52
|
-
catch { /* keep tid as fallback */ }
|
|
43
|
+
name = await resolveTenantName(API_URL, token, tid);
|
|
53
44
|
}
|
|
54
45
|
const status = isActive ? '✓ activo' : '';
|
|
55
46
|
console.log(` ${i + 1} ${name.padEnd(37)} ${role.padEnd(10)} ${status}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/commands/tenants.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/commands/tenants.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEjH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IACrC,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAA;IAErC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,oGAAoG,CAAC,CAAA;QACnH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,QAAQ,CAAA;IACZ,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,OAAO,IAAI,gBAAgB,EAAE,CAAC,CAAA;QACtE,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAA;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAA;IAErC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;QAC9C,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,IAAI,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;IAC1E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;IAE1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,QAAQ,CAAA;QACzE,MAAM,QAAQ,GAAG,GAAG,KAAK,KAAK,CAAC,QAAQ,CAAA;QACvC,IAAI,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACrD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;AAC1E,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -19,10 +19,9 @@
|
|
|
19
19
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
20
20
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
21
21
|
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
22
|
-
import { BotuyoApiClient } from './client.js';
|
|
22
|
+
import { BotuyoApiClient, ApiError } from './client.js';
|
|
23
23
|
import { ALL_TOOLS, TOOL_HANDLERS } from './tools/index.js';
|
|
24
|
-
import { resolveToken, readCredentials, clearCredentials, isTokenExpired } from './commands/credentials.js';
|
|
25
|
-
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
24
|
+
import { resolveToken, readCredentials, clearCredentials, isTokenExpired, resolveApiUrl } from './commands/credentials.js';
|
|
26
25
|
// ─── Sub-command routing ──────────────────────────────────────────────────────
|
|
27
26
|
const [, , cmd, ...rest] = process.argv;
|
|
28
27
|
async function main() {
|
|
@@ -69,6 +68,7 @@ async function main() {
|
|
|
69
68
|
console.log(`Email: ${creds.email}`);
|
|
70
69
|
console.log(`Tenant: ${creds.tenantName}`);
|
|
71
70
|
console.log(`Role: ${creds.role}`);
|
|
71
|
+
console.log(`API: ${creds.apiUrl || '(no guardada — se usará default)'}`);
|
|
72
72
|
console.log(`Expira: ${new Date(creds.expiresAt).toLocaleDateString()}`);
|
|
73
73
|
console.log(`Estado: ${expired ? '❌ Expirado — ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)' : '✅ Activo'}`);
|
|
74
74
|
return;
|
|
@@ -86,8 +86,9 @@ async function main() {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
async function startMcpServer() {
|
|
89
|
-
// Resolve JWT token — server starts regardless of auth state
|
|
89
|
+
// Resolve JWT token and API URL — server starts regardless of auth state
|
|
90
90
|
const token = await resolveToken();
|
|
91
|
+
const apiUrl = await resolveApiUrl();
|
|
91
92
|
let authenticated = false;
|
|
92
93
|
let client = null;
|
|
93
94
|
if (!token) {
|
|
@@ -101,7 +102,8 @@ async function startMcpServer() {
|
|
|
101
102
|
}
|
|
102
103
|
else {
|
|
103
104
|
const creds = await readCredentials();
|
|
104
|
-
client = new BotuyoApiClient({ token, apiUrl
|
|
105
|
+
client = new BotuyoApiClient({ token, apiUrl });
|
|
106
|
+
console.error(`[botuyo-mcp] API: ${apiUrl}`);
|
|
105
107
|
try {
|
|
106
108
|
const auth = await client.verify();
|
|
107
109
|
const tenantName = creds?.tenantName || auth.tenantId;
|
|
@@ -134,12 +136,13 @@ async function startMcpServer() {
|
|
|
134
136
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
135
137
|
}
|
|
136
138
|
catch (error) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
139
|
+
// Detect expired token via ApiError.status (reliable) or message fallback
|
|
140
|
+
const is401 = (error instanceof ApiError && error.status === 401) ||
|
|
141
|
+
(error instanceof Error && (error.message.includes('401') || error.message.includes('expirada') || error.message.includes('expired')));
|
|
142
|
+
if (is401) {
|
|
143
|
+
// Try to reload credentials from disk (user may have re-authenticated)
|
|
140
144
|
const freshToken = await resolveToken();
|
|
141
145
|
if (freshToken && freshToken !== client.getToken()) {
|
|
142
|
-
// New credentials found on disk — hot-swap and retry once
|
|
143
146
|
client.setToken(freshToken);
|
|
144
147
|
console.error('[botuyo-mcp] ✓ Credenciales recargadas desde disco, reintentando...');
|
|
145
148
|
try {
|
|
@@ -156,6 +159,7 @@ async function startMcpServer() {
|
|
|
156
159
|
isError: true
|
|
157
160
|
};
|
|
158
161
|
}
|
|
162
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
159
163
|
return { content: [{ type: 'text', text: `Error: ${msg}` }], isError: true };
|
|
160
164
|
}
|
|
161
165
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|