@botuyo/mcp 0.1.0 β 0.2.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/dist/client.d.ts +9 -14
- package/dist/client.js +34 -29
- package/dist/client.js.map +1 -1
- package/dist/commands/auth.d.ts +15 -0
- package/dist/commands/auth.js +123 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/credentials.d.ts +28 -0
- package/dist/commands/credentials.js +59 -0
- package/dist/commands/credentials.js.map +1 -0
- package/dist/commands/login.d.ts +15 -0
- package/dist/commands/login.js +202 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/setup.d.ts +8 -0
- package/dist/commands/setup.js +95 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/switch_tenant.d.ts +10 -0
- package/dist/commands/switch_tenant.js +117 -0
- package/dist/commands/switch_tenant.js.map +1 -0
- package/dist/commands/tenants.d.ts +9 -0
- package/dist/commands/tenants.js +48 -0
- package/dist/commands/tenants.js.map +1 -0
- package/dist/index.d.ts +13 -14
- package/dist/index.js +120 -57
- package/dist/index.js.map +1 -1
- package/package.json +12 -3
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npx @botuyo/mcp setup
|
|
3
|
+
*
|
|
4
|
+
* Generates the mcp.json snippet for the current MCP client.
|
|
5
|
+
* Since auth uses ~/.botuyo/credentials.json (saved by login),
|
|
6
|
+
* the server block only needs command + args, no env vars.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runSetup(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npx @botuyo/mcp setup
|
|
3
|
+
*
|
|
4
|
+
* Generates the mcp.json snippet for the current MCP client.
|
|
5
|
+
* Since auth uses ~/.botuyo/credentials.json (saved by login),
|
|
6
|
+
* the server block only needs command + args, no env vars.
|
|
7
|
+
*/
|
|
8
|
+
import { readCredentials } from './credentials.js';
|
|
9
|
+
import { writeFile, readFile } from 'fs/promises';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
const CLIENTS = {
|
|
13
|
+
cursor: {
|
|
14
|
+
name: 'Cursor',
|
|
15
|
+
configPath: '.cursor/mcp.json'
|
|
16
|
+
},
|
|
17
|
+
vscode: {
|
|
18
|
+
name: 'VS Code / Antigravity',
|
|
19
|
+
configPath: '.vscode/mcp.json'
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
function buildServerBlock() {
|
|
23
|
+
return {
|
|
24
|
+
servers: {
|
|
25
|
+
botuyo: {
|
|
26
|
+
command: 'npx',
|
|
27
|
+
args: ['-y', '@botuyo/mcp']
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function runSetup(args) {
|
|
33
|
+
console.log('\nπ§ BotUyo MCP β Setup\n');
|
|
34
|
+
const creds = await readCredentials();
|
|
35
|
+
if (!creds?.token) {
|
|
36
|
+
console.log('β οΈ No estΓ‘s autenticado. EjecutΓ‘ `npx @botuyo/mcp login` primero.\n');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log(`β
Autenticado como: ${creds.email} (${creds.tenantName})\n`);
|
|
40
|
+
}
|
|
41
|
+
const target = args[0] || autoDetectClient();
|
|
42
|
+
if (target && CLIENTS[target]) {
|
|
43
|
+
await writeConfigFile(target);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Print all snippets
|
|
47
|
+
console.log('CopiΓ‘ el snippet para tu herramienta:\n');
|
|
48
|
+
const block = buildServerBlock();
|
|
49
|
+
for (const [_id, client] of Object.entries(CLIENTS)) {
|
|
50
|
+
console.log(`ββ ${client.name} (${client.configPath}) ββ`);
|
|
51
|
+
console.log(JSON.stringify(block, null, 2));
|
|
52
|
+
console.log();
|
|
53
|
+
}
|
|
54
|
+
printClaudeSnippet();
|
|
55
|
+
}
|
|
56
|
+
console.log('π‘ El servidor lee las credenciales de ~/.botuyo/credentials.json automΓ‘ticamente.');
|
|
57
|
+
console.log(' No necesitΓ‘s configurar variables de entorno.\n');
|
|
58
|
+
}
|
|
59
|
+
async function writeConfigFile(clientId) {
|
|
60
|
+
const client = CLIENTS[clientId];
|
|
61
|
+
const configPath = join(process.cwd(), client.configPath);
|
|
62
|
+
const config = buildServerBlock();
|
|
63
|
+
try {
|
|
64
|
+
// Merge with existing config if present
|
|
65
|
+
let merged = config;
|
|
66
|
+
if (existsSync(configPath)) {
|
|
67
|
+
const existing = JSON.parse(await readFile(configPath, 'utf8'));
|
|
68
|
+
merged = { ...existing, servers: { ...existing.servers, ...config.servers } };
|
|
69
|
+
}
|
|
70
|
+
const dir = configPath.split(/[/\\]/).slice(0, -1).join('/');
|
|
71
|
+
if (dir) {
|
|
72
|
+
const { mkdir } = await import('fs/promises');
|
|
73
|
+
await mkdir(dir, { recursive: true });
|
|
74
|
+
}
|
|
75
|
+
await writeFile(configPath, JSON.stringify(merged, null, 2));
|
|
76
|
+
console.log(`β
Escrito en ${configPath}`);
|
|
77
|
+
console.log(` ReiniciΓ‘ tu editor para que tome los cambios.\n`);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
console.error(`β Error al escribir config: ${err.message}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function autoDetectClient() {
|
|
84
|
+
if (existsSync('.cursor'))
|
|
85
|
+
return 'cursor';
|
|
86
|
+
if (existsSync('.vscode'))
|
|
87
|
+
return 'vscode';
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
function printClaudeSnippet() {
|
|
91
|
+
console.log(`ββ Claude Desktop (~/.config/claude/claude_desktop_config.json) ββ`);
|
|
92
|
+
console.log(JSON.stringify(buildServerBlock(), null, 2));
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @botuyo/mcp switch-tenant command
|
|
4
|
+
*
|
|
5
|
+
* Usage: npx @botuyo/mcp switch-tenant
|
|
6
|
+
*
|
|
7
|
+
* Lists the user's tenants and lets them pick a different one.
|
|
8
|
+
* Calls POST /api/auth/switch-tenant and saves the new JWT.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runSwitchTenant(): Promise<void>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @botuyo/mcp switch-tenant command
|
|
4
|
+
*
|
|
5
|
+
* Usage: npx @botuyo/mcp switch-tenant
|
|
6
|
+
*
|
|
7
|
+
* Lists the user's tenants and lets them pick a different one.
|
|
8
|
+
* Calls POST /api/auth/switch-tenant and saves the new JWT.
|
|
9
|
+
*/
|
|
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';
|
|
13
|
+
export async function runSwitchTenant() {
|
|
14
|
+
console.log('\nπ BotUyo MCP β Switch Tenant\n');
|
|
15
|
+
const token = await resolveToken();
|
|
16
|
+
const creds = await readCredentials();
|
|
17
|
+
if (!token || !creds) {
|
|
18
|
+
console.error('β No estΓ‘s autenticado. EjecutΓ‘: npx @botuyo/mcp login');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
// Get user's tenants
|
|
22
|
+
const meRes = await fetch(`${API_URL}/api/auth/me`, {
|
|
23
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
24
|
+
});
|
|
25
|
+
const meData = (await meRes.json());
|
|
26
|
+
if (!meData.success) {
|
|
27
|
+
console.error(`β SesiΓ³n invΓ‘lida: ${meData.error || 'Token expirado'}`);
|
|
28
|
+
console.error(' EjecutΓ‘: npx @botuyo/mcp login');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const user = meData.data.user;
|
|
32
|
+
const tenantIds = user.tenantIds || [];
|
|
33
|
+
const roles = user.roles || [];
|
|
34
|
+
if (tenantIds.length === 0) {
|
|
35
|
+
console.log('No tenΓ©s tenants disponibles.');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (tenantIds.length === 1) {
|
|
39
|
+
console.log(`Solo tenΓ©s un tenant: ${creds.tenantName} (${creds.role})`);
|
|
40
|
+
console.log('No hay nada para cambiar.\n');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
console.log(`TenΓ©s ${tenantIds.length} tenants disponibles:\n`);
|
|
44
|
+
for (let i = 0; i < tenantIds.length; i++) {
|
|
45
|
+
const tid = tenantIds[i];
|
|
46
|
+
const role = roles.find((r) => r.tenantId === tid)?.role || 'member';
|
|
47
|
+
const isActive = tid === creds.tenantId;
|
|
48
|
+
const marker = isActive ? ' β actual' : '';
|
|
49
|
+
console.log(` ${i + 1}. ${tid} (${role})${marker}`);
|
|
50
|
+
}
|
|
51
|
+
const choice = await prompt('\nΒΏA quΓ© tenant querΓ©s cambiar? (nΓΊmero): ');
|
|
52
|
+
const choiceNum = parseInt(choice, 10);
|
|
53
|
+
if (!choiceNum || choiceNum < 1 || choiceNum > tenantIds.length) {
|
|
54
|
+
console.log('OperaciΓ³n cancelada.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const selectedTenantId = tenantIds[choiceNum - 1];
|
|
58
|
+
if (selectedTenantId === creds.tenantId) {
|
|
59
|
+
console.log('\nYa estΓ‘s en ese tenant. No hubo cambios.\n');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
console.log(`\nβ³ Cambiando a tenant ${selectedTenantId}...`);
|
|
63
|
+
const switchRes = await fetch(`${API_URL}/api/auth/switch-tenant`, {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers: {
|
|
66
|
+
Authorization: `Bearer ${token}`,
|
|
67
|
+
'Content-Type': 'application/json'
|
|
68
|
+
},
|
|
69
|
+
body: JSON.stringify({ tenantId: selectedTenantId })
|
|
70
|
+
});
|
|
71
|
+
const switchData = (await switchRes.json());
|
|
72
|
+
if (!switchData.success) {
|
|
73
|
+
console.error(`β Error al cambiar de tenant: ${switchData.error}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const newToken = switchData.data.token;
|
|
77
|
+
const newRole = switchData.data.user?.role || roles.find((r) => r.tenantId === selectedTenantId)?.role || 'member';
|
|
78
|
+
// Try to get tenant name
|
|
79
|
+
let tenantName = selectedTenantId;
|
|
80
|
+
try {
|
|
81
|
+
const tenantRes = await fetch(`${API_URL}/api/v1/tenants/${selectedTenantId}`, {
|
|
82
|
+
headers: { Authorization: `Bearer ${newToken}` }
|
|
83
|
+
});
|
|
84
|
+
const tenantData = (await tenantRes.json());
|
|
85
|
+
if (tenantData.success && tenantData.data?.name) {
|
|
86
|
+
tenantName = tenantData.data.name;
|
|
87
|
+
}
|
|
88
|
+
else if (tenantData.data?.tenant?.name) {
|
|
89
|
+
tenantName = tenantData.data.tenant.name;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// use tenantId
|
|
94
|
+
}
|
|
95
|
+
await saveCredentials({
|
|
96
|
+
...creds,
|
|
97
|
+
token: newToken,
|
|
98
|
+
tenantId: selectedTenantId,
|
|
99
|
+
tenantName,
|
|
100
|
+
role: newRole,
|
|
101
|
+
savedAt: new Date().toISOString(),
|
|
102
|
+
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()
|
|
103
|
+
});
|
|
104
|
+
console.log(`\nβ
Cambiado exitosamente`);
|
|
105
|
+
console.log(` Tenant: ${tenantName}`);
|
|
106
|
+
console.log(` Role: ${newRole}\n`);
|
|
107
|
+
}
|
|
108
|
+
function prompt(question) {
|
|
109
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
110
|
+
return new Promise((resolve) => {
|
|
111
|
+
rl.question(question, (answer) => {
|
|
112
|
+
rl.close();
|
|
113
|
+
resolve(answer);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=switch_tenant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch_tenant.js","sourceRoot":"","sources":["../../src/commands/switch_tenant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @botuyo/mcp tenants command
|
|
4
|
+
*
|
|
5
|
+
* Usage: npx @botuyo/mcp tenants
|
|
6
|
+
*
|
|
7
|
+
* Lists all tenants the current user belongs to with their roles.
|
|
8
|
+
*/
|
|
9
|
+
import { readCredentials, resolveToken } from './credentials.js';
|
|
10
|
+
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
11
|
+
export async function runTenants() {
|
|
12
|
+
console.log('\nπ BotUyo MCP β Mis Tenants\n');
|
|
13
|
+
const token = await resolveToken();
|
|
14
|
+
const creds = await readCredentials();
|
|
15
|
+
if (!token || !creds) {
|
|
16
|
+
console.error('β No estΓ‘s autenticado. EjecutΓ‘: npx @botuyo/mcp login');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const meRes = await fetch(`${API_URL}/api/auth/me`, {
|
|
20
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
21
|
+
});
|
|
22
|
+
const meData = (await meRes.json());
|
|
23
|
+
if (!meData.success) {
|
|
24
|
+
console.error(`β SesiΓ³n invΓ‘lida: ${meData.error || 'Token expirado'}`);
|
|
25
|
+
console.error(' EjecutΓ‘: npx @botuyo/mcp login');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const user = meData.data.user;
|
|
29
|
+
const tenantIds = user.tenantIds || [];
|
|
30
|
+
const roles = user.roles || [];
|
|
31
|
+
if (tenantIds.length === 0) {
|
|
32
|
+
console.log('No tenΓ©s tenants disponibles.\n');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
console.log(`Email: ${creds.email}`);
|
|
36
|
+
console.log(`Tenants: ${tenantIds.length}\n`);
|
|
37
|
+
console.log(' # Tenant ID Rol Estado');
|
|
38
|
+
console.log(' β βββββββββββββββββββββββββββββββββ βββββββββ ββββββ');
|
|
39
|
+
for (let i = 0; i < tenantIds.length; i++) {
|
|
40
|
+
const tid = tenantIds[i];
|
|
41
|
+
const role = roles.find((r) => r.tenantId === tid)?.role || 'member';
|
|
42
|
+
const isActive = tid === creds.tenantId;
|
|
43
|
+
const status = isActive ? 'β activo' : '';
|
|
44
|
+
console.log(` ${i + 1} ${tid.padEnd(37)} ${role.padEnd(10)} ${status}`);
|
|
45
|
+
}
|
|
46
|
+
console.log(`\nPara cambiar de tenant: npx @botuyo/mcp switch-tenant\n`);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=tenants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/commands/tenants.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEhE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wBAAwB,CAAA;AAEtE,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;IAErC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAA;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,cAAc,EAAE;QAClD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC9C,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAQ,CAAA;IAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAA;QACvE,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,SAAS,GAAa,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA;IAChD,MAAM,KAAK,GAA8C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;IAEzE,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,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;AAC1E,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* @botuyo/mcp β Entry Point
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* }
|
|
5
|
+
* Sub-commands:
|
|
6
|
+
* npx @botuyo/mcp login β Login with email/password
|
|
7
|
+
* npx @botuyo/mcp tenants β List your tenants
|
|
8
|
+
* npx @botuyo/mcp switch-tenant β Switch active tenant
|
|
9
|
+
* npx @botuyo/mcp setup β Generate mcp.json for your editor
|
|
10
|
+
* npx @botuyo/mcp whoami β Show current credentials
|
|
11
|
+
* npx @botuyo/mcp logout β Clear stored credentials
|
|
12
|
+
* npx @botuyo/mcp β Start the MCP server (default)
|
|
13
|
+
*
|
|
14
|
+
* Token resolution (in priority order):
|
|
15
|
+
* 1. BOTUYO_TOKEN env var
|
|
16
|
+
* 2. ~/.botuyo/credentials.json (saved by `npx @botuyo/mcp login`)
|
|
18
17
|
*/
|
|
19
18
|
export {};
|
package/dist/index.js
CHANGED
|
@@ -1,80 +1,143 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* @botuyo/mcp β Entry Point
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* }
|
|
5
|
+
* Sub-commands:
|
|
6
|
+
* npx @botuyo/mcp login β Login with email/password
|
|
7
|
+
* npx @botuyo/mcp tenants β List your tenants
|
|
8
|
+
* npx @botuyo/mcp switch-tenant β Switch active tenant
|
|
9
|
+
* npx @botuyo/mcp setup β Generate mcp.json for your editor
|
|
10
|
+
* npx @botuyo/mcp whoami β Show current credentials
|
|
11
|
+
* npx @botuyo/mcp logout β Clear stored credentials
|
|
12
|
+
* npx @botuyo/mcp β Start the MCP server (default)
|
|
13
|
+
*
|
|
14
|
+
* Token resolution (in priority order):
|
|
15
|
+
* 1. BOTUYO_TOKEN env var
|
|
16
|
+
* 2. ~/.botuyo/credentials.json (saved by `npx @botuyo/mcp login`)
|
|
18
17
|
*/
|
|
19
18
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
20
19
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
21
20
|
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
22
21
|
import { BotuyoApiClient } from './client.js';
|
|
23
22
|
import { ALL_TOOLS, TOOL_HANDLERS } from './tools/index.js';
|
|
24
|
-
|
|
25
|
-
const API_KEY = process.env.BOTUYO_API_KEY;
|
|
23
|
+
import { resolveToken, readCredentials, clearCredentials, isTokenExpired } from './commands/credentials.js';
|
|
26
24
|
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
25
|
+
// βββ Sub-command routing ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
26
|
+
const [, , cmd, ...rest] = process.argv;
|
|
27
|
+
async function main() {
|
|
28
|
+
switch (cmd) {
|
|
29
|
+
// ββ login ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
30
|
+
case 'login': {
|
|
31
|
+
const { runLogin } = await import('./commands/login.js');
|
|
32
|
+
await runLogin(rest);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// ββ auth (backward compat alias for login) βββββββββββββββββββββββββββββ
|
|
36
|
+
case 'auth': {
|
|
37
|
+
const { runLogin } = await import('./commands/login.js');
|
|
38
|
+
await runLogin(rest);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// ββ tenants ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
42
|
+
case 'tenants': {
|
|
43
|
+
const { runTenants } = await import('./commands/tenants.js');
|
|
44
|
+
await runTenants();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// ββ switch-tenant βββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
48
|
+
case 'switch-tenant': {
|
|
49
|
+
const { runSwitchTenant } = await import('./commands/switch_tenant.js');
|
|
50
|
+
await runSwitchTenant();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// ββ setup ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
54
|
+
case 'setup': {
|
|
55
|
+
const { runSetup } = await import('./commands/setup.js');
|
|
56
|
+
await runSetup(rest);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// ββ whoami βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
60
|
+
case 'whoami': {
|
|
61
|
+
const token = await resolveToken();
|
|
62
|
+
const creds = await readCredentials();
|
|
63
|
+
if (!token || !creds) {
|
|
64
|
+
console.log('No estΓ‘s autenticado. EjecutΓ‘: npx @botuyo/mcp login');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const expired = await isTokenExpired();
|
|
68
|
+
console.log(`Email: ${creds.email}`);
|
|
69
|
+
console.log(`Tenant: ${creds.tenantName}`);
|
|
70
|
+
console.log(`Role: ${creds.role}`);
|
|
71
|
+
console.log(`Expira: ${new Date(creds.expiresAt).toLocaleDateString()}`);
|
|
72
|
+
console.log(`Estado: ${expired ? 'β Expirado β ejecutΓ‘: npx @botuyo/mcp login' : 'β
Activo'}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// ββ logout βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
76
|
+
case 'logout': {
|
|
77
|
+
await clearCredentials();
|
|
78
|
+
console.log('β
SesiΓ³n cerrada.');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// ββ default: start MCP server ββββββββββββββββββββββββββββββββββββββββββ
|
|
82
|
+
default: {
|
|
83
|
+
await startMcpServer();
|
|
84
|
+
}
|
|
54
85
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
86
|
+
}
|
|
87
|
+
async function startMcpServer() {
|
|
88
|
+
// Resolve JWT token
|
|
89
|
+
const token = await resolveToken();
|
|
90
|
+
if (!token) {
|
|
91
|
+
const expired = await isTokenExpired();
|
|
92
|
+
if (expired) {
|
|
93
|
+
console.error('[botuyo-mcp] Error: Tu sesiΓ³n expirΓ³.');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.error('[botuyo-mcp] Error: No hay credenciales guardadas.');
|
|
97
|
+
}
|
|
98
|
+
console.error('[botuyo-mcp] EjecutΓ‘ `npx @botuyo/mcp login` para autenticarte.');
|
|
99
|
+
process.exit(1);
|
|
61
100
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
async function main() {
|
|
101
|
+
const creds = await readCredentials();
|
|
102
|
+
const client = new BotuyoApiClient({ token, apiUrl: API_URL });
|
|
65
103
|
// Verify credentials on startup
|
|
66
104
|
try {
|
|
67
|
-
const auth = await client.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
105
|
+
const auth = await client.verify();
|
|
106
|
+
const tenantName = creds?.tenantName || auth.tenantId;
|
|
107
|
+
const role = creds?.role || auth.role;
|
|
108
|
+
console.error(`[botuyo-mcp] β Conectado a "${tenantName}" como ${role}`);
|
|
72
109
|
}
|
|
73
110
|
catch (err) {
|
|
74
111
|
const msg = err instanceof Error ? err.message : String(err);
|
|
75
112
|
console.error(`[botuyo-mcp] β Auth failed: ${msg}`);
|
|
113
|
+
console.error('[botuyo-mcp] EjecutΓ‘ `npx @botuyo/mcp login` para re-autenticarte.');
|
|
76
114
|
process.exit(1);
|
|
77
115
|
}
|
|
116
|
+
// ββ MCP Server βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
117
|
+
const server = new Server({ name: 'botuyo-mcp', version: '0.3.0' }, { capabilities: { tools: {} } });
|
|
118
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: ALL_TOOLS }));
|
|
119
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
120
|
+
const { name, arguments: args } = request.params;
|
|
121
|
+
const handler = TOOL_HANDLERS[name];
|
|
122
|
+
if (!handler) {
|
|
123
|
+
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const result = await handler(client, args || {});
|
|
127
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
131
|
+
// Detect expired token and give helpful message
|
|
132
|
+
if (msg.includes('401') || msg.includes('expirada') || msg.includes('expired')) {
|
|
133
|
+
return {
|
|
134
|
+
content: [{ type: 'text', text: `SesiΓ³n expirada. El usuario debe ejecutar: npx @botuyo/mcp login` }],
|
|
135
|
+
isError: true
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return { content: [{ type: 'text', text: `Error: ${msg}` }], isError: true };
|
|
139
|
+
}
|
|
140
|
+
});
|
|
78
141
|
const transport = new StdioServerTransport();
|
|
79
142
|
await server.connect(transport);
|
|
80
143
|
console.error('[botuyo-mcp] Server running via stdio');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botuyo/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "BotUyo MCP Server β create and manage AI agents via Model Context Protocol",
|
|
5
|
-
"keywords": [
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"botuyo",
|
|
8
|
+
"ai-agents",
|
|
9
|
+
"chatbot",
|
|
10
|
+
"model-context-protocol"
|
|
11
|
+
],
|
|
6
12
|
"type": "module",
|
|
7
13
|
"main": "dist/index.js",
|
|
8
14
|
"bin": {
|
|
9
15
|
"botuyo-mcp": "dist/index.js"
|
|
10
16
|
},
|
|
11
|
-
"files": [
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
12
21
|
"scripts": {
|
|
13
22
|
"build": "tsc",
|
|
14
23
|
"dev": "tsc -w",
|