@botuyo/mcp 0.3.13 → 0.3.21
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 +135 -30
- 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 +6 -1
- package/dist/client.js +30 -10
- 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 +34 -50
- 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 +88 -11
- 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_agent_tool.js +4 -4
- package/dist/tools/configure_avatar.js +2 -3
- package/dist/tools/configure_avatar.js.map +1 -1
- package/dist/tools/example_agent.d.ts +5 -3
- package/dist/tools/example_agent.js +10 -8
- package/dist/tools/example_agent.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/dist/tools/switch_tenant.js +1 -1
- package/dist/tools/switch_tenant.js.map +1 -1
- package/package.json +2 -3
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,12 @@
|
|
|
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
|
-
|
|
24
|
+
import { resolveToken, readCredentials, clearCredentials, isTokenExpired, resolveApiUrl } from './commands/credentials.js';
|
|
25
|
+
import { watch, existsSync, mkdirSync } from 'fs';
|
|
26
|
+
import { join } from 'path';
|
|
27
|
+
import { homedir } from 'os';
|
|
26
28
|
// ─── Sub-command routing ──────────────────────────────────────────────────────
|
|
27
29
|
const [, , cmd, ...rest] = process.argv;
|
|
28
30
|
async function main() {
|
|
@@ -69,6 +71,7 @@ async function main() {
|
|
|
69
71
|
console.log(`Email: ${creds.email}`);
|
|
70
72
|
console.log(`Tenant: ${creds.tenantName}`);
|
|
71
73
|
console.log(`Role: ${creds.role}`);
|
|
74
|
+
console.log(`API: ${creds.apiUrl || '(no guardada — se usará default)'}`);
|
|
72
75
|
console.log(`Expira: ${new Date(creds.expiresAt).toLocaleDateString()}`);
|
|
73
76
|
console.log(`Estado: ${expired ? '❌ Expirado — ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)' : '✅ Activo'}`);
|
|
74
77
|
return;
|
|
@@ -86,8 +89,9 @@ async function main() {
|
|
|
86
89
|
}
|
|
87
90
|
}
|
|
88
91
|
async function startMcpServer() {
|
|
89
|
-
// Resolve JWT token — server starts regardless of auth state
|
|
92
|
+
// Resolve JWT token and API URL — server starts regardless of auth state
|
|
90
93
|
const token = await resolveToken();
|
|
94
|
+
const apiUrl = await resolveApiUrl();
|
|
91
95
|
let authenticated = false;
|
|
92
96
|
let client = null;
|
|
93
97
|
if (!token) {
|
|
@@ -101,7 +105,11 @@ async function startMcpServer() {
|
|
|
101
105
|
}
|
|
102
106
|
else {
|
|
103
107
|
const creds = await readCredentials();
|
|
104
|
-
client = new BotuyoApiClient({ token, apiUrl
|
|
108
|
+
client = new BotuyoApiClient({ token, apiUrl });
|
|
109
|
+
// Restore active tenant from prior switch_tenant session
|
|
110
|
+
if (creds?.tenantId)
|
|
111
|
+
client.setToken(token, creds.tenantId);
|
|
112
|
+
console.error(`[botuyo-mcp] API: ${apiUrl}`);
|
|
105
113
|
try {
|
|
106
114
|
const auth = await client.verify();
|
|
107
115
|
const tenantName = creds?.tenantName || auth.tenantId;
|
|
@@ -116,6 +124,39 @@ async function startMcpServer() {
|
|
|
116
124
|
}
|
|
117
125
|
}
|
|
118
126
|
const AUTH_ERROR_MSG = 'No autenticado. El usuario debe ejecutar: npx @botuyo/mcp login';
|
|
127
|
+
// ── Hot-reload: try to authenticate from disk credentials ─────────────
|
|
128
|
+
async function tryHotReload() {
|
|
129
|
+
const freshToken = await resolveToken();
|
|
130
|
+
if (!freshToken)
|
|
131
|
+
return false;
|
|
132
|
+
const freshCreds = await readCredentials();
|
|
133
|
+
const freshApiUrl = freshCreds?.apiUrl || apiUrl;
|
|
134
|
+
// Create or update client
|
|
135
|
+
if (!client) {
|
|
136
|
+
client = new BotuyoApiClient({ token: freshToken, apiUrl: freshApiUrl });
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
client.setToken(freshToken, freshCreds?.tenantId);
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const auth = await client.verify();
|
|
143
|
+
const tenantName = freshCreds?.tenantName || auth.tenantId;
|
|
144
|
+
const role = freshCreds?.role || auth.role;
|
|
145
|
+
console.error(`[botuyo-mcp] 🔄 Hot-reload: conectado a "${tenantName}" como ${role}`);
|
|
146
|
+
authenticated = true;
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
151
|
+
console.error(`[botuyo-mcp] 🔄 Hot-reload: auth failed: ${msg}`);
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ── Watch credentials file for changes (auto-restart on login/auth) ───
|
|
156
|
+
watchCredentialsFile(async () => {
|
|
157
|
+
console.error('[botuyo-mcp] 🔄 Credentials file changed — reloading authentication...');
|
|
158
|
+
await tryHotReload();
|
|
159
|
+
});
|
|
119
160
|
// ── MCP Server — starts ALWAYS, even without valid auth ────────────────
|
|
120
161
|
const server = new Server({ name: 'botuyo-mcp', version: '0.3.0' }, { capabilities: { tools: {} } });
|
|
121
162
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: ALL_TOOLS }));
|
|
@@ -125,21 +166,25 @@ async function startMcpServer() {
|
|
|
125
166
|
if (!handler) {
|
|
126
167
|
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
|
|
127
168
|
}
|
|
128
|
-
// Guard: if not authenticated,
|
|
169
|
+
// Guard: if not authenticated, attempt hot-reload from disk before rejecting
|
|
129
170
|
if (!authenticated || !client) {
|
|
130
|
-
|
|
171
|
+
const reloaded = await tryHotReload();
|
|
172
|
+
if (!reloaded || !client) {
|
|
173
|
+
return { content: [{ type: 'text', text: AUTH_ERROR_MSG }], isError: true };
|
|
174
|
+
}
|
|
131
175
|
}
|
|
132
176
|
try {
|
|
133
177
|
const result = await handler(client, args || {});
|
|
134
178
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
135
179
|
}
|
|
136
180
|
catch (error) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
181
|
+
// Detect expired token via ApiError.status (reliable) or message fallback
|
|
182
|
+
const is401 = (error instanceof ApiError && error.status === 401) ||
|
|
183
|
+
(error instanceof Error && (error.message.includes('401') || error.message.includes('expirada') || error.message.includes('expired')));
|
|
184
|
+
if (is401) {
|
|
185
|
+
// Try to reload credentials from disk (user may have re-authenticated)
|
|
140
186
|
const freshToken = await resolveToken();
|
|
141
187
|
if (freshToken && freshToken !== client.getToken()) {
|
|
142
|
-
// New credentials found on disk — hot-swap and retry once
|
|
143
188
|
client.setToken(freshToken);
|
|
144
189
|
console.error('[botuyo-mcp] ✓ Credenciales recargadas desde disco, reintentando...');
|
|
145
190
|
try {
|
|
@@ -156,6 +201,7 @@ async function startMcpServer() {
|
|
|
156
201
|
isError: true
|
|
157
202
|
};
|
|
158
203
|
}
|
|
204
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
159
205
|
return { content: [{ type: 'text', text: `Error: ${msg}` }], isError: true };
|
|
160
206
|
}
|
|
161
207
|
});
|
|
@@ -163,6 +209,37 @@ async function startMcpServer() {
|
|
|
163
209
|
await server.connect(transport);
|
|
164
210
|
console.error('[botuyo-mcp] Server running via stdio');
|
|
165
211
|
}
|
|
212
|
+
// ── Credentials file watcher ─────────────────────────────────────────────────
|
|
213
|
+
// Watches ~/.botuyo/credentials.json for changes. When the user runs `login` or
|
|
214
|
+
// `auth` in a separate terminal, the file is written and we auto-reload auth.
|
|
215
|
+
// Uses a debounce to handle rapid/duplicate fs events on Windows.
|
|
216
|
+
function watchCredentialsFile(onChanged) {
|
|
217
|
+
const configDir = join(homedir(), '.botuyo');
|
|
218
|
+
const credFile = join(configDir, 'credentials.json');
|
|
219
|
+
// Ensure the directory exists (login may not have run yet)
|
|
220
|
+
if (!existsSync(configDir)) {
|
|
221
|
+
mkdirSync(configDir, { recursive: true });
|
|
222
|
+
}
|
|
223
|
+
let debounceTimer = null;
|
|
224
|
+
try {
|
|
225
|
+
// Watch the directory (more reliable than watching a file that may not exist)
|
|
226
|
+
watch(configDir, (eventType, filename) => {
|
|
227
|
+
if (filename !== 'credentials.json')
|
|
228
|
+
return;
|
|
229
|
+
// Debounce: fs.watch fires multiple events per write on Windows
|
|
230
|
+
if (debounceTimer)
|
|
231
|
+
clearTimeout(debounceTimer);
|
|
232
|
+
debounceTimer = setTimeout(() => {
|
|
233
|
+
onChanged();
|
|
234
|
+
}, 500);
|
|
235
|
+
});
|
|
236
|
+
console.error(`[botuyo-mcp] 👁 Watching ${credFile} for auth changes`);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
240
|
+
console.error(`[botuyo-mcp] ⚠ Could not watch credentials file: ${msg}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
166
243
|
main().catch((err) => {
|
|
167
244
|
console.error('[botuyo-mcp] Fatal error:', err);
|
|
168
245
|
process.exit(1);
|
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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"}
|
|
@@ -23,15 +23,14 @@ describe('listAvatarsHandler', () => {
|
|
|
23
23
|
.mockGet('/api/avatars/catalog', {
|
|
24
24
|
success: true,
|
|
25
25
|
data: [
|
|
26
|
-
{ _id: 'av1', name: 'Corporate F', modelFormat: 'vrm', category: 'corporate',
|
|
27
|
-
{ _id: 'av2', name: '
|
|
26
|
+
{ _id: 'av1', name: 'Corporate F', modelFormat: 'vrm', category: 'corporate', modelUrl: 'https://r2/av1.vrm' },
|
|
27
|
+
{ _id: 'av2', name: 'Fantasy Bot', modelFormat: 'glb', category: 'fantasy', modelUrl: 'https://r2/av2.glb' }
|
|
28
28
|
]
|
|
29
29
|
});
|
|
30
30
|
const result = await listAvatarsHandler(client, {});
|
|
31
31
|
const text = result.text;
|
|
32
32
|
expect(text).toContain('av1');
|
|
33
33
|
expect(text).toContain('Corporate F');
|
|
34
|
-
expect(text).toContain('[PREMIUM]');
|
|
35
34
|
expect(text).toContain('VRM');
|
|
36
35
|
});
|
|
37
36
|
it('should handle empty catalog', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure_avatar.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/configure_avatar.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAEhF,MAAM,UAAU;IACN,MAAM,GAAwB,EAAE,CAAA;IAExC,OAAO,CAAC,IAAY,EAAE,QAAa;QACjC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAA;QACrC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,QAAa;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,KAAW;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC1D,CAAC;CACF;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;aAC5B,OAAO,CAAC,sBAAsB,EAAE;YAC/B,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"configure_avatar.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/configure_avatar.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export const CONFIGURE_AGENT_TOOL = {
|
|
2
2
|
name: 'configure_agent_tool',
|
|
3
|
-
description: `Crea o actualiza la config de un tool para un agente. Si la tool no está en \`enabledTools\`, la agrega automáticamente.
|
|
4
|
-
|
|
5
|
-
Dos modos:
|
|
6
|
-
- **Single-instance**: configura una tool existente (ej. \`send_email\`) con params fijos.
|
|
3
|
+
description: `Crea o actualiza la config de un tool para un agente. Si la tool no está en \`enabledTools\`, la agrega automáticamente.
|
|
4
|
+
|
|
5
|
+
Dos modos:
|
|
6
|
+
- **Single-instance**: configura una tool existente (ej. \`send_email\`) con params fijos.
|
|
7
7
|
- **Multi-instance**: crea una instancia virtual con nombre propio basada en una tool real (requiere \`baseTool\`). Ej: \`webhook_pedidos\` basada en \`call_webhook\`.`,
|
|
8
8
|
inputSchema: {
|
|
9
9
|
type: 'object',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const LIST_AVATARS_TOOL = {
|
|
2
2
|
name: 'list_avatars',
|
|
3
|
-
description: 'Lista los avatares 3D disponibles en el catálogo. Muestra nombre, formato
|
|
3
|
+
description: 'Lista los avatares 3D gratuitos disponibles en el catálogo. Muestra nombre, formato y categoría.',
|
|
4
4
|
inputSchema: {
|
|
5
5
|
type: 'object',
|
|
6
6
|
properties: {},
|
|
@@ -31,8 +31,7 @@ export async function listAvatarsHandler(client, _args) {
|
|
|
31
31
|
}
|
|
32
32
|
let output = `Catálogo de avatares 3D (${catalog.length}):\n\n`;
|
|
33
33
|
for (const avatar of catalog) {
|
|
34
|
-
|
|
35
|
-
output += ` • ${avatar._id} — ${avatar.name}${premium}\n`;
|
|
34
|
+
output += ` • ${avatar._id} — ${avatar.name}\n`;
|
|
36
35
|
output += ` Formato: ${avatar.modelFormat.toUpperCase()} | Categoría: ${avatar.category}\n`;
|
|
37
36
|
if (avatar.modelUrl) {
|
|
38
37
|
output += ` URL: ${avatar.modelUrl}\n`;
|