@botuyo/mcp 0.3.4 → 0.3.6
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/index.js +26 -20
- package/dist/index.js.map +1 -1
- package/dist/tools/__tests__/configure_agent_tool.spec.js +17 -8
- package/dist/tools/__tests__/configure_agent_tool.spec.js.map +1 -1
- package/dist/tools/__tests__/configure_avatar.spec.d.ts +1 -0
- package/dist/tools/__tests__/configure_avatar.spec.js +87 -0
- package/dist/tools/__tests__/configure_avatar.spec.js.map +1 -0
- package/dist/tools/__tests__/get_tool_config.spec.js +24 -6
- package/dist/tools/__tests__/get_tool_config.spec.js.map +1 -1
- package/dist/tools/__tests__/list_base_tools.spec.js +60 -15
- package/dist/tools/__tests__/list_base_tools.spec.js.map +1 -1
- package/dist/tools/__tests__/list_tool_configs.spec.js +19 -11
- package/dist/tools/__tests__/list_tool_configs.spec.js.map +1 -1
- package/dist/tools/__tests__/remove_tool_config.spec.js +3 -8
- package/dist/tools/__tests__/remove_tool_config.spec.js.map +1 -1
- package/dist/tools/__tests__/switch_tenant.spec.js +1 -1
- package/dist/tools/__tests__/switch_tenant.spec.js.map +1 -1
- package/dist/tools/configure_agent_tool.js +21 -20
- package/dist/tools/configure_agent_tool.js.map +1 -1
- package/dist/tools/configure_avatar.d.ts +10 -0
- package/dist/tools/configure_avatar.js +78 -0
- package/dist/tools/configure_avatar.js.map +1 -0
- package/dist/tools/get_tool_config.js +13 -5
- package/dist/tools/get_tool_config.js.map +1 -1
- package/dist/tools/index.js +8 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list_base_tools.d.ts +4 -2
- package/dist/tools/list_base_tools.js +40 -24
- package/dist/tools/list_base_tools.js.map +1 -1
- package/dist/tools/list_tool_configs.js +34 -32
- package/dist/tools/list_tool_configs.js.map +1 -1
- package/dist/tools/remove_tool_config.js +5 -7
- package/dist/tools/remove_tool_config.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -85,35 +85,37 @@ async function main() {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
async function startMcpServer() {
|
|
88
|
-
// Resolve JWT token
|
|
88
|
+
// Resolve JWT token — server starts regardless of auth state
|
|
89
89
|
const token = await resolveToken();
|
|
90
|
+
let authenticated = false;
|
|
91
|
+
let client = null;
|
|
90
92
|
if (!token) {
|
|
91
93
|
const expired = await isTokenExpired();
|
|
92
94
|
if (expired) {
|
|
93
|
-
console.error('[botuyo-mcp]
|
|
95
|
+
console.error('[botuyo-mcp] ⚠ Tu sesión expiró. Ejecutá: npx @botuyo/mcp login');
|
|
94
96
|
}
|
|
95
97
|
else {
|
|
96
|
-
console.error('[botuyo-mcp]
|
|
98
|
+
console.error('[botuyo-mcp] ⚠ No hay credenciales. Ejecutá: npx @botuyo/mcp login');
|
|
97
99
|
}
|
|
98
|
-
console.error('[botuyo-mcp] Ejecutá `npx @botuyo/mcp login` para autenticarte.');
|
|
99
|
-
process.exit(1);
|
|
100
100
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
101
|
+
else {
|
|
102
|
+
const creds = await readCredentials();
|
|
103
|
+
client = new BotuyoApiClient({ token, apiUrl: API_URL });
|
|
104
|
+
try {
|
|
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}`);
|
|
109
|
+
authenticated = true;
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
113
|
+
console.error(`[botuyo-mcp] ⚠ Auth failed: ${msg}`);
|
|
114
|
+
console.error('[botuyo-mcp] Las tools pedirán re-autenticación. Ejecutá: npx @botuyo/mcp login');
|
|
115
|
+
}
|
|
115
116
|
}
|
|
116
|
-
|
|
117
|
+
const AUTH_ERROR_MSG = 'No autenticado. El usuario debe ejecutar: npx @botuyo/mcp login';
|
|
118
|
+
// ── MCP Server — starts ALWAYS, even without valid auth ────────────────
|
|
117
119
|
const server = new Server({ name: 'botuyo-mcp', version: '0.3.0' }, { capabilities: { tools: {} } });
|
|
118
120
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: ALL_TOOLS }));
|
|
119
121
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
@@ -122,6 +124,10 @@ async function startMcpServer() {
|
|
|
122
124
|
if (!handler) {
|
|
123
125
|
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
|
|
124
126
|
}
|
|
127
|
+
// Guard: if not authenticated, every tool returns a login prompt
|
|
128
|
+
if (!authenticated || !client) {
|
|
129
|
+
return { content: [{ type: 'text', text: AUTH_ERROR_MSG }], isError: true };
|
|
130
|
+
}
|
|
125
131
|
try {
|
|
126
132
|
const result = await handler(client, args || {});
|
|
127
133
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;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;AAC7C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE3G,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wBAAwB,CAAA;AAEtE,iFAAiF;AAEjF,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAA;AAEvC,KAAK,UAAU,IAAI;IACjB,QAAQ,GAAG,EAAE,CAAC;QACZ,0EAA0E;QAC1E,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;YACxD,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;YACpB,OAAM;QACR,CAAC;QAED,wEAAwE;QACxE,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YACtD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,0EAA0E;QAC1E,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;YAC5D,MAAM,UAAU,EAAE,CAAA;YAClB,OAAM;QACR,CAAC;QAED,yEAAyE;QACzE,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACvE,MAAM,eAAe,EAAE,CAAA;YACvB,OAAM;QACR,CAAC;QAED,0EAA0E;QAC1E,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;YACxD,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;YACpB,OAAM;QACR,CAAC;QAED,0EAA0E;QAC1E,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAA;YAClC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;YACrC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;gBACnE,OAAM;YACR,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAA;YACtC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;YACvC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;YAC5C,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YACtC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;YAC1E,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;YAChG,OAAM;QACR,CAAC;QAED,0EAA0E;QAC1E,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,gBAAgB,EAAE,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;QAED,0EAA0E;QAC1E,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,cAAc,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,6DAA6D;IAC7D,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAA;IAClC,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,IAAI,MAAM,GAA2B,IAAI,CAAA;IAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAA;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAA;QAClF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QAExD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;YAClC,MAAM,UAAU,GAAG,KAAK,EAAE,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAA;YACrD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAA;YACrC,OAAO,CAAC,KAAK,CAAC,+BAA+B,UAAU,UAAU,IAAI,EAAE,CAAC,CAAA;YACxE,aAAa,GAAG,IAAI,CAAA;QACtB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAA;YACnD,OAAO,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAA;QAClG,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,iEAAiE,CAAA;IAExF,0EAA0E;IAC1E,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAA;IAED,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;IAEpF,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;QAChD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QAEnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACtF,CAAC;QAED,iEAAiE;QACjE,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC7E,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;YAChD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;QAC/E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAElE,gDAAgD;YAChD,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/E,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kEAAkE,EAAE,CAAC;oBACrG,OAAO,EAAE,IAAI;iBACd,CAAA;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC9E,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -8,24 +8,33 @@ class MockPutClient {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
describe('configureAgentToolHandler', () => {
|
|
11
|
-
it('should
|
|
11
|
+
it('should PUT to /tool-config/:toolName with payload (no toolName in body)', async () => {
|
|
12
12
|
const client = new MockPutClient();
|
|
13
|
-
|
|
13
|
+
await configureAgentToolHandler(client, {
|
|
14
14
|
agentId: 'agent-123',
|
|
15
15
|
toolName: 'send_email',
|
|
16
|
-
baseTool: '
|
|
16
|
+
baseTool: 'call_webhook',
|
|
17
17
|
params: { templateId: '123' },
|
|
18
18
|
instruction: 'Send email safely'
|
|
19
|
-
};
|
|
20
|
-
await configureAgentToolHandler(client, payloadOpts);
|
|
19
|
+
});
|
|
21
20
|
expect(client.methodCalls.length).toBe(1);
|
|
22
|
-
expect(client.methodCalls[0].path).toBe('/api/v1/mcp/agents/agent-123/
|
|
21
|
+
expect(client.methodCalls[0].path).toBe('/api/v1/mcp/agents/agent-123/tool-config/send_email');
|
|
23
22
|
expect(client.methodCalls[0].payload).toMatchObject({
|
|
24
|
-
|
|
25
|
-
baseTool: 'email_factory',
|
|
23
|
+
baseTool: 'call_webhook',
|
|
26
24
|
params: { templateId: '123' },
|
|
27
25
|
instruction: 'Send email safely'
|
|
28
26
|
});
|
|
27
|
+
// toolName should NOT be in payload (it's in the URL)
|
|
28
|
+
expect(client.methodCalls[0].payload.toolName).toBeUndefined();
|
|
29
|
+
});
|
|
30
|
+
it('should only include defined fields in payload', async () => {
|
|
31
|
+
const client = new MockPutClient();
|
|
32
|
+
await configureAgentToolHandler(client, {
|
|
33
|
+
agentId: 'agent-123',
|
|
34
|
+
toolName: 'send_email',
|
|
35
|
+
params: { fromEmail: 'test@test.com' }
|
|
36
|
+
});
|
|
37
|
+
expect(client.methodCalls[0].payload).toEqual({ params: { fromEmail: 'test@test.com' } });
|
|
29
38
|
});
|
|
30
39
|
it('should throw error if agentId or toolName is missing', async () => {
|
|
31
40
|
const client = new MockPutClient();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure_agent_tool.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/configure_agent_tool.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAEtE,MAAM,aAAa;IACV,WAAW,GAAU,EAAE,CAAA;IAC9B,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAY;QAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACzC,CAAC;CACF;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"configure_agent_tool.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/configure_agent_tool.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAEtE,MAAM,aAAa;IACV,WAAW,GAAU,EAAE,CAAA;IAC9B,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAY;QAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACzC,CAAC;CACF;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,yBAAyB,CAAC,MAAM,EAAE;YACtC,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,cAAc;YACxB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;YAC7B,WAAW,EAAE,mBAAmB;SACjC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;QAC9F,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YAClD,QAAQ,EAAE,cAAc;YACxB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;YAC7B,WAAW,EAAE,mBAAmB;SACjC,CAAC,CAAA;QACF,sDAAsD;QACtD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,yBAAyB,CAAC,MAAM,EAAE;YACtC,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;SACvC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,MAAM,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAA;QACvH,MAAM,MAAM,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAA;IAC1H,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { listAvatarsHandler, selectAvatarHandler } from '../configure_avatar.js';
|
|
3
|
+
class MockClient {
|
|
4
|
+
routes = {};
|
|
5
|
+
mockGet(path, response) {
|
|
6
|
+
this.routes[`GET:${path}`] = response;
|
|
7
|
+
return this;
|
|
8
|
+
}
|
|
9
|
+
mockPost(path, response) {
|
|
10
|
+
this.routes[`POST:${path}`] = response;
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
async get(path) {
|
|
14
|
+
return this.routes[`GET:${path}`] || { success: false };
|
|
15
|
+
}
|
|
16
|
+
async post(path, _body) {
|
|
17
|
+
return this.routes[`POST:${path}`] || { success: false };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
describe('listAvatarsHandler', () => {
|
|
21
|
+
it('should return formatted catalog text', async () => {
|
|
22
|
+
const client = new MockClient()
|
|
23
|
+
.mockGet('/api/avatars/catalog', {
|
|
24
|
+
success: true,
|
|
25
|
+
data: [
|
|
26
|
+
{ _id: 'av1', name: 'Corporate F', modelFormat: 'vrm', category: 'corporate', isPremium: false, modelUrl: 'https://r2/av1.vrm' },
|
|
27
|
+
{ _id: 'av2', name: 'Premium Bot', modelFormat: 'glb', category: 'fantasy', isPremium: true, modelUrl: 'https://r2/av2.glb' }
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
const result = await listAvatarsHandler(client, {});
|
|
31
|
+
const text = result.text;
|
|
32
|
+
expect(text).toContain('av1');
|
|
33
|
+
expect(text).toContain('Corporate F');
|
|
34
|
+
expect(text).toContain('[PREMIUM]');
|
|
35
|
+
expect(text).toContain('VRM');
|
|
36
|
+
});
|
|
37
|
+
it('should handle empty catalog', async () => {
|
|
38
|
+
const client = new MockClient()
|
|
39
|
+
.mockGet('/api/avatars/catalog', { success: true, data: [] });
|
|
40
|
+
const result = await listAvatarsHandler(client, {});
|
|
41
|
+
expect(result.text).toContain('No hay avatares');
|
|
42
|
+
});
|
|
43
|
+
it('should throw on API failure', async () => {
|
|
44
|
+
const client = new MockClient()
|
|
45
|
+
.mockGet('/api/avatars/catalog', { success: false });
|
|
46
|
+
await expect(listAvatarsHandler(client, {})).rejects.toThrow('Could not fetch');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('selectAvatarHandler', () => {
|
|
50
|
+
it('should select from catalog by avatarId', async () => {
|
|
51
|
+
const client = new MockClient()
|
|
52
|
+
.mockGet('/api/avatars/catalog/av1', { success: true, data: { modelUrl: 'https://r2/av1.vrm' } })
|
|
53
|
+
.mockPost('/api/avatars/select', { success: true, message: 'Avatar updated' });
|
|
54
|
+
const result = await selectAvatarHandler(client, { agentId: 'agent_1', avatarId: 'av1' });
|
|
55
|
+
const text = result.text;
|
|
56
|
+
expect(text).toContain('✅');
|
|
57
|
+
expect(text).toContain('catálogo');
|
|
58
|
+
expect(text).toContain('https://r2/av1.vrm');
|
|
59
|
+
});
|
|
60
|
+
it('should select by custom URL', async () => {
|
|
61
|
+
const client = new MockClient()
|
|
62
|
+
.mockPost('/api/avatars/select', { success: true, message: 'Avatar updated' });
|
|
63
|
+
const result = await selectAvatarHandler(client, { agentId: 'agent_1', avatarUrl: 'https://my.site/avatar.glb' });
|
|
64
|
+
const text = result.text;
|
|
65
|
+
expect(text).toContain('✅');
|
|
66
|
+
expect(text).toContain('URL custom');
|
|
67
|
+
});
|
|
68
|
+
it('should throw when agentId missing', async () => {
|
|
69
|
+
const client = new MockClient();
|
|
70
|
+
await expect(selectAvatarHandler(client, {})).rejects.toThrow('agentId is required');
|
|
71
|
+
});
|
|
72
|
+
it('should throw when neither avatarId nor avatarUrl provided', async () => {
|
|
73
|
+
const client = new MockClient();
|
|
74
|
+
await expect(selectAvatarHandler(client, { agentId: 'a1' })).rejects.toThrow('Provide either');
|
|
75
|
+
});
|
|
76
|
+
it('should throw when both avatarId and avatarUrl provided', async () => {
|
|
77
|
+
const client = new MockClient();
|
|
78
|
+
await expect(selectAvatarHandler(client, { agentId: 'a1', avatarId: 'x', avatarUrl: 'y' })).rejects.toThrow('not both');
|
|
79
|
+
});
|
|
80
|
+
it('should throw when catalog avatar not found', async () => {
|
|
81
|
+
const client = new MockClient()
|
|
82
|
+
.mockGet('/api/avatars/catalog/missing', { success: false });
|
|
83
|
+
await expect(selectAvatarHandler(client, { agentId: 'a1', avatarId: 'missing' }))
|
|
84
|
+
.rejects.toThrow('not found in catalog');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=configure_avatar.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure_avatar.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/configure_avatar.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,16 +2,34 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import { getToolConfigHandler } from '../get_tool_config.js';
|
|
3
3
|
class MockGetClient {
|
|
4
4
|
async get(path) {
|
|
5
|
-
expect(path).toBe('/api/v1/mcp/agents/a1/
|
|
6
|
-
return {
|
|
5
|
+
expect(path).toBe('/api/v1/mcp/agents/a1/tool-configs');
|
|
6
|
+
return {
|
|
7
|
+
success: true,
|
|
8
|
+
data: {
|
|
9
|
+
configured: [
|
|
10
|
+
{ toolName: 'send_email', mode: 'single', params: { fromEmail: 'test@test.com' } },
|
|
11
|
+
{ toolName: 'webhook_pedidos', mode: 'multi-instance', baseTool: 'call_webhook' }
|
|
12
|
+
],
|
|
13
|
+
enabledWithoutConfig: ['google_search']
|
|
14
|
+
}
|
|
15
|
+
};
|
|
7
16
|
}
|
|
8
17
|
}
|
|
9
18
|
describe('getToolConfigHandler', () => {
|
|
10
|
-
it('should
|
|
19
|
+
it('should return the matching tool config from the list', async () => {
|
|
11
20
|
const client = new MockGetClient();
|
|
12
|
-
const res = await getToolConfigHandler(client, { agentId: 'a1', toolName: '
|
|
13
|
-
expect(res.
|
|
14
|
-
expect(res.
|
|
21
|
+
const res = await getToolConfigHandler(client, { agentId: 'a1', toolName: 'send_email' });
|
|
22
|
+
expect(res.toolName).toBe('send_email');
|
|
23
|
+
expect(res.mode).toBe('single');
|
|
24
|
+
expect(res.params.fromEmail).toBe('test@test.com');
|
|
25
|
+
});
|
|
26
|
+
it('should return text message if tool not found', async () => {
|
|
27
|
+
const client = new MockGetClient();
|
|
28
|
+
const res = await getToolConfigHandler(client, { agentId: 'a1', toolName: 'nonexistent' });
|
|
29
|
+
expect(res.text).toContain('no tiene configuración');
|
|
30
|
+
});
|
|
31
|
+
it('should throw if missing arguments', async () => {
|
|
32
|
+
await expect(getToolConfigHandler({}, { agentId: 'a1' })).rejects.toThrow('agentId and toolName are required');
|
|
15
33
|
});
|
|
16
34
|
});
|
|
17
35
|
//# sourceMappingURL=get_tool_config.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_tool_config.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/get_tool_config.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,MAAM,aAAa;IACjB,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"get_tool_config.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/get_tool_config.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,MAAM,aAAa;IACjB,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;QACvD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,UAAU,EAAE;oBACV,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE;oBAClF,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE;iBAClF;gBACD,oBAAoB,EAAE,CAAC,eAAe,CAAC;aACxC;SACF,CAAA;IACH,CAAC;CACF;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAQ,CAAA;QAChG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACvC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAQ,CAAA;QACjG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,CAAC,oBAAoB,CAAC,EAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAA;IACvH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,29 +1,74 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
2
|
+
import { getToolsCatalogHandler } from '../list_base_tools.js';
|
|
3
3
|
class MockGetClient {
|
|
4
4
|
async get(path) {
|
|
5
|
-
expect(path).toBe('/api/v1/mcp/tools/
|
|
5
|
+
expect(path).toBe('/api/v1/mcp/tools/catalog');
|
|
6
6
|
return {
|
|
7
7
|
success: true,
|
|
8
|
-
data:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
description: '
|
|
8
|
+
data: [
|
|
9
|
+
{
|
|
10
|
+
name: 'call_webhook',
|
|
11
|
+
description: 'Calls an external webhook URL',
|
|
12
|
+
configurable: true,
|
|
13
|
+
allowMultiInstance: true,
|
|
14
|
+
configSchema: [
|
|
15
|
+
{ key: 'url', type: 'url', label: 'URL del webhook' },
|
|
16
|
+
{ key: 'method', type: 'select', label: 'Método HTTP' }
|
|
17
|
+
],
|
|
18
|
+
requiredIntegrations: null,
|
|
19
|
+
requiresAuth: false
|
|
12
20
|
},
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
{
|
|
22
|
+
name: 'google_search',
|
|
23
|
+
description: 'Searches Google',
|
|
24
|
+
configurable: false,
|
|
25
|
+
allowMultiInstance: false,
|
|
26
|
+
configSchema: [],
|
|
27
|
+
requiredIntegrations: null,
|
|
28
|
+
requiresAuth: false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'send_email',
|
|
32
|
+
description: 'Sends email',
|
|
33
|
+
configurable: true,
|
|
34
|
+
allowMultiInstance: false,
|
|
35
|
+
configSchema: [
|
|
36
|
+
{ key: 'fromEmail', type: 'email', label: 'Email remitente' }
|
|
37
|
+
],
|
|
38
|
+
requiredIntegrations: { category: 'email', label: 'Email provider' },
|
|
39
|
+
requiresAuth: true
|
|
40
|
+
}
|
|
41
|
+
]
|
|
15
42
|
};
|
|
16
43
|
}
|
|
17
44
|
}
|
|
18
|
-
describe('
|
|
19
|
-
it('should render
|
|
45
|
+
describe('getToolsCatalogHandler', () => {
|
|
46
|
+
it('should render the full catalog with badges and config info', async () => {
|
|
47
|
+
const client = new MockGetClient();
|
|
48
|
+
const res = await getToolsCatalogHandler(client, {});
|
|
49
|
+
expect(res.text).toContain('Catálogo de tools (3)');
|
|
50
|
+
expect(res.text).toContain('call_webhook');
|
|
51
|
+
expect(res.text).toContain('⚙️ configurable');
|
|
52
|
+
expect(res.text).toContain('🔁 multi-instance');
|
|
53
|
+
expect(res.text).toContain('url(url)');
|
|
54
|
+
expect(res.text).toContain('google_search');
|
|
55
|
+
expect(res.text).toContain('send_email');
|
|
56
|
+
expect(res.text).toContain('Requiere: Email provider');
|
|
57
|
+
});
|
|
58
|
+
it('should filter by configurable when filter=configurable', async () => {
|
|
59
|
+
const client = new MockGetClient();
|
|
60
|
+
const res = await getToolsCatalogHandler(client, { filter: 'configurable' });
|
|
61
|
+
expect(res.text).toContain('Catálogo de tools (2)');
|
|
62
|
+
expect(res.text).toContain('call_webhook');
|
|
63
|
+
expect(res.text).toContain('send_email');
|
|
64
|
+
expect(res.text).not.toContain('google_search');
|
|
65
|
+
});
|
|
66
|
+
it('should filter by multi-instance when filter=multi', async () => {
|
|
20
67
|
const client = new MockGetClient();
|
|
21
|
-
const res = await
|
|
22
|
-
expect(res.text).toContain('
|
|
23
|
-
expect(res.text).toContain('sync_document');
|
|
24
|
-
expect(res.text).toContain('Connectors: google_sheets, notion');
|
|
68
|
+
const res = await getToolsCatalogHandler(client, { filter: 'multi' });
|
|
69
|
+
expect(res.text).toContain('Catálogo de tools (1)');
|
|
25
70
|
expect(res.text).toContain('call_webhook');
|
|
26
|
-
expect(res.text).toContain('
|
|
71
|
+
expect(res.text).not.toContain('send_email');
|
|
27
72
|
});
|
|
28
73
|
});
|
|
29
74
|
//# sourceMappingURL=list_base_tools.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list_base_tools.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/list_base_tools.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"list_base_tools.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/list_base_tools.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,27 +2,35 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import { listToolConfigsHandler } from '../list_tool_configs.js';
|
|
3
3
|
class MockGetClient {
|
|
4
4
|
async get(path) {
|
|
5
|
-
expect(path).toBe('/api/v1/mcp/agents/agent-1');
|
|
5
|
+
expect(path).toBe('/api/v1/mcp/agents/agent-1/tool-configs');
|
|
6
6
|
return {
|
|
7
7
|
success: true,
|
|
8
8
|
data: {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
configured: [
|
|
10
|
+
{ toolName: 'send_email', mode: 'single', params: { fromEmail: 'test@test.com' } },
|
|
11
|
+
{ toolName: 'webhook_pedidos', mode: 'multi-instance', baseTool: 'call_webhook', params: { url: 'https://api.com/pedidos' }, instruction: 'Envía pedidos' }
|
|
12
|
+
],
|
|
13
|
+
enabledWithoutConfig: ['google_search', 'identify_client'],
|
|
14
|
+
multiInstanceSummary: {
|
|
15
|
+
call_webhook: ['webhook_pedidos']
|
|
16
|
+
}
|
|
12
17
|
}
|
|
13
18
|
};
|
|
14
19
|
}
|
|
15
20
|
}
|
|
16
21
|
describe('listToolConfigsHandler', () => {
|
|
17
|
-
it('should list tools
|
|
22
|
+
it('should list tools grouped by configured, enabled without config, and multi-instance summary', async () => {
|
|
18
23
|
const client = new MockGetClient();
|
|
19
24
|
const res = await listToolConfigsHandler(client, { agentId: 'agent-1' });
|
|
20
|
-
expect(res.text).toContain('Tools
|
|
21
|
-
expect(res.text).toContain('
|
|
22
|
-
expect(res.text).toContain('•
|
|
23
|
-
expect(res.text).toContain('
|
|
24
|
-
expect(res.text).toContain('
|
|
25
|
-
expect(res.text).toContain('
|
|
25
|
+
expect(res.text).toContain('Tools configuradas (2)');
|
|
26
|
+
expect(res.text).toContain('• send_email [single]');
|
|
27
|
+
expect(res.text).toContain('• webhook_pedidos [multi-instance: call_webhook]');
|
|
28
|
+
expect(res.text).toContain('params: fromEmail');
|
|
29
|
+
expect(res.text).toContain('instruction: "Envía pedidos"');
|
|
30
|
+
expect(res.text).toContain('Tools habilitadas sin config (2)');
|
|
31
|
+
expect(res.text).toContain('• google_search');
|
|
32
|
+
expect(res.text).toContain('Instancias multi-instance');
|
|
33
|
+
expect(res.text).toContain('call_webhook: webhook_pedidos');
|
|
26
34
|
});
|
|
27
35
|
it('should throw an error if agentId is missing', async () => {
|
|
28
36
|
await expect(listToolConfigsHandler({}, {})).rejects.toThrow('agentId is required');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list_tool_configs.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/list_tool_configs.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,MAAM,aAAa;IACjB,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"list_tool_configs.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/list_tool_configs.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,MAAM,aAAa;IACjB,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;QAC5D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,UAAU,EAAE;oBACV,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE;oBAClF,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,yBAAyB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;iBAC5J;gBACD,oBAAoB,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC;gBAC1D,oBAAoB,EAAE;oBACpB,YAAY,EAAE,CAAC,iBAAiB,CAAC;iBAClC;aACF;SACF,CAAA;IACH,CAAC;CACF;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC3G,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAqB,CAAA;QAE5F,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QACpD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QACnD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAA;QAC9E,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;QAC/C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;QAC1D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;QAC9D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAA;QACvD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,CAAC,sBAAsB,CAAC,EAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -8,15 +8,10 @@ class MockDeleteClient {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
describe('removeToolConfigHandler', () => {
|
|
11
|
-
it('should
|
|
11
|
+
it('should DELETE to /tool-config/:toolName', async () => {
|
|
12
12
|
const client = new MockDeleteClient();
|
|
13
|
-
await removeToolConfigHandler(client, { agentId: 'a1', toolName: '
|
|
14
|
-
expect(client.paths[0]).toBe('/api/v1/mcp/agents/a1/
|
|
15
|
-
});
|
|
16
|
-
it('should perform DELETE request without query param if removeFromEnabled is omitted', async () => {
|
|
17
|
-
const client = new MockDeleteClient();
|
|
18
|
-
await removeToolConfigHandler(client, { agentId: 'a1', toolName: 't1' });
|
|
19
|
-
expect(client.paths[0]).toBe('/api/v1/mcp/agents/a1/tools/t1/config');
|
|
13
|
+
await removeToolConfigHandler(client, { agentId: 'a1', toolName: 'webhook_pedidos' });
|
|
14
|
+
expect(client.paths[0]).toBe('/api/v1/mcp/agents/a1/tool-config/webhook_pedidos');
|
|
20
15
|
});
|
|
21
16
|
it('should throw if missing arguments', async () => {
|
|
22
17
|
const client = new MockDeleteClient();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove_tool_config.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/remove_tool_config.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,MAAM,gBAAgB;IACb,KAAK,GAAa,EAAE,CAAA;IAC3B,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"remove_tool_config.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/remove_tool_config.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,MAAM,gBAAgB;IACb,KAAK,GAAa,EAAE,CAAA;IAC3B,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAS,CAAA;QAC5C,MAAM,uBAAuB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAA;QACrF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAS,CAAA;QAC5C,MAAM,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAA;IACvH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { vi, describe, it, expect } from 'vitest';
|
|
2
2
|
import { switchTenantHandler } from '../switch_tenant.js';
|
|
3
|
-
vi.mock('
|
|
3
|
+
vi.mock('../../commands/credentials.js', () => ({
|
|
4
4
|
readCredentials: vi.fn(() => ({ token: 'mock-token', tenantId: 't1' })),
|
|
5
5
|
saveCredentials: vi.fn()
|
|
6
6
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch_tenant.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/switch_tenant.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAEzD,EAAE,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"switch_tenant.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/switch_tenant.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAEzD,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAA;AAEH,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACzC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,CAAC;CACrF,CAAC,CAAQ,CAAA;AAEV,MAAM,UAAU;IACP,WAAW,GAAU,EAAE,CAAA;IAC9B,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9C,IAAI,IAAI,KAAK,cAAc;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;QAC7G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IACpC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,OAAY;QACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAA;IACxD,CAAC;IACD,QAAQ,KAAI,CAAC;CACd;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAS,CAAA;QACtC,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACjD,MAAM,CAAE,GAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,CAAE,GAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,41 +1,42 @@
|
|
|
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
|
-
|
|
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
|
+
- **Multi-instance**: crea una instancia virtual con nombre propio basada en una tool real (requiere \`baseTool\`). Ej: \`webhook_pedidos\` basada en \`call_webhook\`.`,
|
|
6
8
|
inputSchema: {
|
|
7
9
|
type: 'object',
|
|
8
10
|
properties: {
|
|
9
11
|
agentId: { type: 'string', description: 'ID del agente' },
|
|
10
|
-
toolName: { type: 'string', description: 'Nombre del tool (existente o nombre
|
|
11
|
-
baseTool: { type: 'string', description: 'Tool base
|
|
12
|
-
|
|
13
|
-
params: { type: 'object', description: 'Parámetros invisibles al LLM (ej. templateId, spreadsheetId)' },
|
|
12
|
+
toolName: { type: 'string', description: 'Nombre del tool (existente para single-instance, o nombre custom para multi-instance)' },
|
|
13
|
+
baseTool: { type: 'string', description: 'Tool base del registry (solo multi-instance). Ej: "call_webhook", "sync_to_google_sheets", "sync_to_hubspot"' },
|
|
14
|
+
params: { type: 'object', description: 'Parámetros invisibles al LLM, inyectados en execute() (ej. fromEmail, url, spreadsheetId)' },
|
|
14
15
|
fields: {
|
|
15
16
|
type: 'array',
|
|
16
17
|
items: { type: 'object' },
|
|
17
|
-
description: 'Campos tipados (override del declaration). Array de
|
|
18
|
+
description: 'Campos tipados que la IA ve (override del declaration). Array de {name, type, label, required, enumValues, validation}'
|
|
18
19
|
},
|
|
19
|
-
instruction: { type: 'string', description: 'Guía para el LLM
|
|
20
|
+
instruction: { type: 'string', description: 'Guía de 1 línea para el LLM explicando qué hace esta tool/instancia' }
|
|
20
21
|
},
|
|
21
22
|
required: ['agentId', 'toolName']
|
|
22
23
|
}
|
|
23
24
|
};
|
|
24
25
|
export async function configureAgentToolHandler(client, args) {
|
|
25
|
-
const { agentId, toolName, baseTool,
|
|
26
|
+
const { agentId, toolName, baseTool, params, fields, instruction } = args;
|
|
26
27
|
if (!agentId || !toolName) {
|
|
27
28
|
throw new Error('agentId and toolName are required');
|
|
28
29
|
}
|
|
29
|
-
const payload = {
|
|
30
|
-
|
|
31
|
-
baseTool
|
|
32
|
-
|
|
33
|
-
params
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const result = await client.put(`/api/v1/mcp/agents/${agentId}/
|
|
30
|
+
const payload = {};
|
|
31
|
+
if (baseTool !== undefined)
|
|
32
|
+
payload.baseTool = baseTool;
|
|
33
|
+
if (params !== undefined)
|
|
34
|
+
payload.params = params;
|
|
35
|
+
if (fields !== undefined)
|
|
36
|
+
payload.fields = fields;
|
|
37
|
+
if (instruction !== undefined)
|
|
38
|
+
payload.instruction = instruction;
|
|
39
|
+
const result = await client.put(`/api/v1/mcp/agents/${agentId}/tool-config/${toolName}`, payload);
|
|
39
40
|
return result;
|
|
40
41
|
}
|
|
41
42
|
//# sourceMappingURL=configure_agent_tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure_agent_tool.js","sourceRoot":"","sources":["../../src/tools/configure_agent_tool.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACxC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"configure_agent_tool.js","sourceRoot":"","sources":["../../src/tools/configure_agent_tool.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACxC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE;;;;wKAIyJ;IACtK,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;YACzD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uFAAuF,EAAE;YAClI,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8GAA8G,EAAE;YACzJ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2FAA2F,EAAE;YACpI,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,wHAAwH;aACtI;YACD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qEAAqE,EAAE;SACpH;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;KAClC;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAAuB,EAAE,IAA6B;IACpG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAW,CAAA;IAEhF,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,OAAO,GAA4B,EAAE,CAAA;IAC3C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACvD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;IACjD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;IACjD,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAA;IAEhE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,sBAAsB,OAAO,gBAAgB,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAA;IACjG,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { BotuyoApiClient } from '../client.js';
|
|
3
|
+
export declare const LIST_AVATARS_TOOL: Tool;
|
|
4
|
+
export declare const SELECT_AVATAR_TOOL: Tool;
|
|
5
|
+
export declare function listAvatarsHandler(client: BotuyoApiClient, _args: Record<string, unknown>): Promise<{
|
|
6
|
+
text: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function selectAvatarHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<{
|
|
9
|
+
text: string;
|
|
10
|
+
}>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export const LIST_AVATARS_TOOL = {
|
|
2
|
+
name: 'list_avatars',
|
|
3
|
+
description: 'Lista los avatares 3D disponibles en el catálogo. Muestra nombre, formato, categoría y si es premium.',
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {},
|
|
7
|
+
required: []
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
export const SELECT_AVATAR_TOOL = {
|
|
11
|
+
name: 'select_avatar',
|
|
12
|
+
description: 'Selecciona un avatar 3D para un agente. Puede ser del catálogo (por ID) o una URL custom (.glb/.vrm).',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
agentId: { type: 'string', description: 'ID del agente' },
|
|
17
|
+
avatarId: { type: 'string', description: 'ID del avatar del catálogo (ej: avatar_corporate_female_01). Mutuamente excluyente con avatarUrl.' },
|
|
18
|
+
avatarUrl: { type: 'string', description: 'URL directa a un modelo .glb/.vrm. Mutuamente excluyente con avatarId.' }
|
|
19
|
+
},
|
|
20
|
+
required: ['agentId']
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
export async function listAvatarsHandler(client, _args) {
|
|
24
|
+
const result = await client.get('/api/avatars/catalog');
|
|
25
|
+
if (!result || !result.success || !result.data) {
|
|
26
|
+
throw new Error('Could not fetch avatar catalog');
|
|
27
|
+
}
|
|
28
|
+
const catalog = result.data;
|
|
29
|
+
if (catalog.length === 0) {
|
|
30
|
+
return { text: 'No hay avatares en el catálogo aún.' };
|
|
31
|
+
}
|
|
32
|
+
let output = `Catálogo de avatares 3D (${catalog.length}):\n\n`;
|
|
33
|
+
for (const avatar of catalog) {
|
|
34
|
+
const premium = avatar.isPremium ? ' [PREMIUM]' : '';
|
|
35
|
+
output += ` • ${avatar._id} — ${avatar.name}${premium}\n`;
|
|
36
|
+
output += ` Formato: ${avatar.modelFormat.toUpperCase()} | Categoría: ${avatar.category}\n`;
|
|
37
|
+
if (avatar.modelUrl) {
|
|
38
|
+
output += ` URL: ${avatar.modelUrl}\n`;
|
|
39
|
+
}
|
|
40
|
+
output += '\n';
|
|
41
|
+
}
|
|
42
|
+
output += `Usá select_avatar con --avatarId para asignar uno a un agente.`;
|
|
43
|
+
return { text: output };
|
|
44
|
+
}
|
|
45
|
+
export async function selectAvatarHandler(client, args) {
|
|
46
|
+
const agentId = args.agentId;
|
|
47
|
+
const avatarId = args.avatarId;
|
|
48
|
+
const avatarUrl = args.avatarUrl;
|
|
49
|
+
if (!agentId)
|
|
50
|
+
throw new Error('agentId is required');
|
|
51
|
+
if (!avatarId && !avatarUrl)
|
|
52
|
+
throw new Error('Provide either avatarId (from catalog) or avatarUrl (custom URL)');
|
|
53
|
+
if (avatarId && avatarUrl)
|
|
54
|
+
throw new Error('Provide avatarId OR avatarUrl, not both');
|
|
55
|
+
let finalUrl = avatarUrl || '';
|
|
56
|
+
// If avatarId provided, look up from catalog
|
|
57
|
+
if (avatarId) {
|
|
58
|
+
const catalogResult = await client.get(`/api/avatars/catalog/${avatarId}`);
|
|
59
|
+
if (!catalogResult || !catalogResult.success || !catalogResult.data) {
|
|
60
|
+
throw new Error(`Avatar "${avatarId}" not found in catalog. Use list_avatars to see available options.`);
|
|
61
|
+
}
|
|
62
|
+
finalUrl = catalogResult.data.modelUrl;
|
|
63
|
+
if (!finalUrl) {
|
|
64
|
+
throw new Error(`Avatar "${avatarId}" exists but has no model URL configured yet.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Select the avatar for the agent
|
|
68
|
+
const result = await client.post('/api/avatars/select', {
|
|
69
|
+
agentId,
|
|
70
|
+
avatarUrl: finalUrl
|
|
71
|
+
});
|
|
72
|
+
if (!result || !result.success) {
|
|
73
|
+
throw new Error(result?.message || 'Failed to select avatar');
|
|
74
|
+
}
|
|
75
|
+
const source = avatarId ? `catálogo (${avatarId})` : 'URL custom';
|
|
76
|
+
return { text: `✅ Avatar actualizado para agente ${agentId}\n Fuente: ${source}\n URL: ${finalUrl}` };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=configure_avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure_avatar.js","sourceRoot":"","sources":["../../src/tools/configure_avatar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export const GET_TOOL_CONFIG_TOOL = {
|
|
2
2
|
name: 'get_tool_config',
|
|
3
|
-
description: 'Ver el config completo de un tool (formato JSON).',
|
|
3
|
+
description: 'Ver el config completo de un tool específico de un agente (formato JSON).',
|
|
4
4
|
inputSchema: {
|
|
5
5
|
type: 'object',
|
|
6
6
|
properties: {
|
|
7
|
-
agentId: { type: 'string' },
|
|
8
|
-
toolName: { type: 'string' }
|
|
7
|
+
agentId: { type: 'string', description: 'ID del agente' },
|
|
8
|
+
toolName: { type: 'string', description: 'Nombre del tool o instancia' }
|
|
9
9
|
},
|
|
10
10
|
required: ['agentId', 'toolName']
|
|
11
11
|
}
|
|
@@ -14,7 +14,15 @@ export async function getToolConfigHandler(client, args) {
|
|
|
14
14
|
const { agentId, toolName } = args;
|
|
15
15
|
if (!agentId || !toolName)
|
|
16
16
|
throw new Error('agentId and toolName are required');
|
|
17
|
-
const result = await client.get(`/api/v1/mcp/agents/${agentId}/
|
|
18
|
-
|
|
17
|
+
const result = await client.get(`/api/v1/mcp/agents/${agentId}/tool-configs`);
|
|
18
|
+
if (!result || !result.success || !result.data) {
|
|
19
|
+
throw new Error('Could not fetch tool configs');
|
|
20
|
+
}
|
|
21
|
+
const configured = result.data.configured || [];
|
|
22
|
+
const match = configured.find((tc) => tc.toolName === toolName);
|
|
23
|
+
if (!match) {
|
|
24
|
+
return { text: `Tool "${toolName}" no tiene configuración en este agente.` };
|
|
25
|
+
}
|
|
26
|
+
return match;
|
|
19
27
|
}
|
|
20
28
|
//# sourceMappingURL=get_tool_config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_tool_config.js","sourceRoot":"","sources":["../../src/tools/get_tool_config.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACxC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"get_tool_config.js","sourceRoot":"","sources":["../../src/tools/get_tool_config.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAS;IACxC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,2EAA2E;IACxF,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;YACzD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;SACzE;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;KAClC;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAuB,EAAE,IAA6B;IAC/F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAClC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAE/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,sBAAsB,OAAO,eAAe,CAAC,CAAA;IAC7E,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,UAAU,GAAU,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;IACtD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;IAEpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,SAAS,QAAQ,0CAA0C,EAAE,CAAA;IAC9E,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -25,7 +25,8 @@ import { CONFIGURE_AGENT_TOOL, configureAgentToolHandler } from './configure_age
|
|
|
25
25
|
import { LIST_TOOL_CONFIGS_TOOL, listToolConfigsHandler } from './list_tool_configs.js';
|
|
26
26
|
import { REMOVE_TOOL_CONFIG_TOOL, removeToolConfigHandler } from './remove_tool_config.js';
|
|
27
27
|
import { GET_TOOL_CONFIG_TOOL, getToolConfigHandler } from './get_tool_config.js';
|
|
28
|
-
import {
|
|
28
|
+
import { GET_TOOLS_CATALOG_TOOL, getToolsCatalogHandler } from './list_base_tools.js';
|
|
29
|
+
import { LIST_AVATARS_TOOL, listAvatarsHandler, SELECT_AVATAR_TOOL, selectAvatarHandler } from './configure_avatar.js';
|
|
29
30
|
export const ALL_TOOLS = [
|
|
30
31
|
LIST_AGENTS_TOOL,
|
|
31
32
|
GET_AGENT_TOOL,
|
|
@@ -50,7 +51,9 @@ export const ALL_TOOLS = [
|
|
|
50
51
|
LIST_TOOL_CONFIGS_TOOL,
|
|
51
52
|
REMOVE_TOOL_CONFIG_TOOL,
|
|
52
53
|
GET_TOOL_CONFIG_TOOL,
|
|
53
|
-
|
|
54
|
+
GET_TOOLS_CATALOG_TOOL,
|
|
55
|
+
LIST_AVATARS_TOOL,
|
|
56
|
+
SELECT_AVATAR_TOOL,
|
|
54
57
|
];
|
|
55
58
|
export const TOOL_HANDLERS = {
|
|
56
59
|
list_agents: listAgentsHandler,
|
|
@@ -76,6 +79,8 @@ export const TOOL_HANDLERS = {
|
|
|
76
79
|
list_tool_configs: listToolConfigsHandler,
|
|
77
80
|
remove_tool_config: removeToolConfigHandler,
|
|
78
81
|
get_tool_config: getToolConfigHandler,
|
|
79
|
-
|
|
82
|
+
get_tools_catalog: getToolsCatalogHandler,
|
|
83
|
+
list_avatars: listAvatarsHandler,
|
|
84
|
+
select_avatar: selectAvatarHandler,
|
|
80
85
|
};
|
|
81
86
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,8BAA8B;AAC9B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACpF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC7E,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAC7F,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAE9F,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAC3F,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,8BAA8B;AAC9B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACpF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC7E,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAC7F,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAE9F,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAC3F,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AACtH,MAAM,CAAC,MAAM,SAAS,GAAW;IAC/B,gBAAgB;IAChB,cAAc;IACd,qBAAqB;IACrB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,yBAAyB;IACzB,kBAAkB;IAClB,kBAAkB;IAClB,sBAAsB;IACtB,sBAAsB;IACtB,mBAAmB;IACnB,yBAAyB;IACzB,kBAAkB;IAClB,iBAAiB;IACjB,wBAAwB;IACxB,yBAAyB;IACzB,wBAAwB;IACxB,oBAAoB;IACpB,sBAAsB;IACtB,uBAAuB;IACvB,oBAAoB;IACpB,sBAAsB;IACtB,iBAAiB;IACjB,kBAAkB;CACnB,CAAA;AAID,MAAM,CAAC,MAAM,aAAa,GAAgC;IACxD,WAAW,EAAE,iBAAiB;IAC9B,SAAS,EAAE,eAAe;IAC1B,gBAAgB,EAAE,qBAAqB;IACvC,YAAY,EAAE,kBAAkB;IAChC,YAAY,EAAE,kBAAkB;IAChC,YAAY,EAAE,kBAAkB;IAChC,oBAAoB,EAAE,gBAAgB;IACtC,oBAAoB,EAAE,yBAAyB;IAC/C,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;IAClC,iBAAiB,EAAE,sBAAsB;IACzC,iBAAiB,EAAE,sBAAsB;IACzC,cAAc,EAAE,oBAAoB;IACpC,oBAAoB,EAAE,yBAAyB;IAC/C,aAAa,EAAE,mBAAkC;IACjD,YAAY,EAAE,kBAAkB;IAChC,wBAAwB,EAAE,wBAAwB;IAClD,yBAAyB,EAAE,yBAAyB;IACpD,4BAA4B,EAAE,yBAAyB;IACvD,oBAAoB,EAAE,yBAAyB;IAC/C,iBAAiB,EAAE,sBAAsB;IACzC,kBAAkB,EAAE,uBAAuB;IAC3C,eAAe,EAAE,oBAAoB;IACrC,iBAAiB,EAAE,sBAAsB;IACzC,YAAY,EAAE,kBAAkB;IAChC,aAAa,EAAE,mBAAmB;CACnC,CAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
import type { BotuyoApiClient } from '../client.js';
|
|
3
|
-
export declare const
|
|
4
|
-
export declare function
|
|
3
|
+
export declare const GET_TOOLS_CATALOG_TOOL: Tool;
|
|
4
|
+
export declare function getToolsCatalogHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<{
|
|
5
|
+
text: string;
|
|
6
|
+
}>;
|
|
@@ -1,32 +1,48 @@
|
|
|
1
|
-
export const
|
|
2
|
-
name: '
|
|
3
|
-
description: 'Lista
|
|
1
|
+
export const GET_TOOLS_CATALOG_TOOL = {
|
|
2
|
+
name: 'get_tools_catalog',
|
|
3
|
+
description: 'Lista el catálogo completo de tools disponibles con su metadata: configurable, allowMultiInstance, configSchema, requiredIntegrations.',
|
|
4
4
|
inputSchema: {
|
|
5
5
|
type: 'object',
|
|
6
|
-
properties: {
|
|
6
|
+
properties: {
|
|
7
|
+
filter: { type: 'string', description: 'Filtro opcional: "configurable" (solo configurables), "multi" (solo multi-instance), o vacío para todas' }
|
|
8
|
+
}
|
|
7
9
|
}
|
|
8
10
|
};
|
|
9
|
-
export async function
|
|
10
|
-
const result = await client.get('/api/v1/mcp/tools/
|
|
11
|
-
if (result
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
11
|
+
export async function getToolsCatalogHandler(client, args) {
|
|
12
|
+
const result = await client.get('/api/v1/mcp/tools/catalog');
|
|
13
|
+
if (!result || !result.success) {
|
|
14
|
+
throw new Error('Could not fetch tools catalog');
|
|
15
|
+
}
|
|
16
|
+
let tools = result.data || [];
|
|
17
|
+
const filter = args.filter;
|
|
18
|
+
if (filter === 'configurable') {
|
|
19
|
+
tools = tools.filter((t) => t.configurable);
|
|
20
|
+
}
|
|
21
|
+
else if (filter === 'multi') {
|
|
22
|
+
tools = tools.filter((t) => t.allowMultiInstance);
|
|
23
|
+
}
|
|
24
|
+
let output = `Catálogo de tools (${tools.length}):\n\n`;
|
|
25
|
+
for (const tool of tools) {
|
|
26
|
+
const badges = [];
|
|
27
|
+
if (tool.configurable)
|
|
28
|
+
badges.push('⚙️ configurable');
|
|
29
|
+
if (tool.allowMultiInstance)
|
|
30
|
+
badges.push('🔁 multi-instance');
|
|
31
|
+
if (tool.requiresAuth)
|
|
32
|
+
badges.push('🔒 auth');
|
|
33
|
+
output += ` ${tool.name} ${badges.length > 0 ? `[${badges.join(', ')}]` : ''}\n`;
|
|
34
|
+
if (tool.description) {
|
|
35
|
+
output += ` ${tool.description.slice(0, 120)}\n`;
|
|
36
|
+
}
|
|
37
|
+
if (tool.configSchema && tool.configSchema.length > 0) {
|
|
38
|
+
const keys = tool.configSchema.map((f) => `${f.key}(${f.type})`).join(', ');
|
|
39
|
+
output += ` Config: ${keys}\n`;
|
|
40
|
+
}
|
|
41
|
+
if (tool.requiredIntegrations) {
|
|
42
|
+
output += ` Requiere: ${tool.requiredIntegrations.label || tool.requiredIntegrations.category}\n`;
|
|
27
43
|
}
|
|
28
|
-
|
|
44
|
+
output += '\n';
|
|
29
45
|
}
|
|
30
|
-
return
|
|
46
|
+
return { text: output };
|
|
31
47
|
}
|
|
32
48
|
//# sourceMappingURL=list_base_tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list_base_tools.js","sourceRoot":"","sources":["../../src/tools/list_base_tools.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"list_base_tools.js","sourceRoot":"","sources":["../../src/tools/list_base_tools.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAS;IAC1C,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,wIAAwI;IACrJ,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yGAAyG,EAAE;SACnJ;KACF;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAuB,EAAE,IAA6B;IACjG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IAE5D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,KAAK,GAAU,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAA;IAEhD,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC9B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAClD,CAAC;SAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,MAAM,GAAG,sBAAsB,KAAK,CAAC,MAAM,QAAQ,CAAA;IAEvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACrD,IAAI,IAAI,CAAC,kBAAkB;YAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC7D,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE7C,MAAM,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAA;QACjF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAA;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChF,MAAM,IAAI,eAAe,IAAI,IAAI,CAAA;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,MAAM,IAAI,iBAAiB,IAAI,CAAC,oBAAoB,CAAC,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,IAAI,CAAA;QACtG,CAAC;QACD,MAAM,IAAI,IAAI,CAAA;IAChB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const LIST_TOOL_CONFIGS_TOOL = {
|
|
2
2
|
name: 'list_tool_configs',
|
|
3
|
-
description: 'Lista las configs de tools de un agente,
|
|
3
|
+
description: 'Lista las configs de tools de un agente agrupadas: configuradas (single y multi-instance), habilitadas sin config, y resumen de multi-instance.',
|
|
4
4
|
inputSchema: {
|
|
5
5
|
type: 'object',
|
|
6
6
|
properties: {
|
|
@@ -13,46 +13,48 @@ export async function listToolConfigsHandler(client, args) {
|
|
|
13
13
|
const agentId = args.agentId;
|
|
14
14
|
if (!agentId)
|
|
15
15
|
throw new Error('agentId is required');
|
|
16
|
-
|
|
17
|
-
const result = await client.get(`/api/v1/mcp/agents/${agentId}`);
|
|
16
|
+
const result = await client.get(`/api/v1/mcp/agents/${agentId}/tool-configs`);
|
|
18
17
|
if (!result || !result.success || !result.data) {
|
|
19
|
-
throw new Error('Could not fetch
|
|
18
|
+
throw new Error('Could not fetch tool configs');
|
|
20
19
|
}
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
let output = `Tools del agente "${agent.name || agentId}":\n\n`;
|
|
27
|
-
output += ` Tools nativas (sin config):\n`;
|
|
28
|
-
if (nativeTools.length === 0) {
|
|
20
|
+
const { configured, enabledWithoutConfig, multiInstanceSummary } = result.data;
|
|
21
|
+
let output = `Tool configs del agente ${agentId}:\n\n`;
|
|
22
|
+
// Configured tools
|
|
23
|
+
output += ` Tools configuradas (${(configured || []).length}):\n`;
|
|
24
|
+
if (!configured || configured.length === 0) {
|
|
29
25
|
output += ` (Ninguna)\n`;
|
|
30
26
|
}
|
|
31
27
|
else {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
for (const tc of configured) {
|
|
29
|
+
const mode = tc.mode === 'multi-instance' ? `[multi-instance: ${tc.baseTool}]` : '[single]';
|
|
30
|
+
output += ` • ${tc.toolName} ${mode}\n`;
|
|
31
|
+
if (tc.params) {
|
|
32
|
+
output += ` └ params: ${Object.keys(tc.params).join(', ')}\n`;
|
|
33
|
+
}
|
|
34
|
+
if (tc.fieldsCount) {
|
|
35
|
+
output += ` └ fields: ${tc.fieldsCount} campos\n`;
|
|
36
|
+
}
|
|
37
|
+
if (tc.instruction) {
|
|
38
|
+
output += ` └ instruction: "${tc.instruction}"\n`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
35
41
|
}
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
// Enabled without config
|
|
43
|
+
output += `\n Tools habilitadas sin config (${(enabledWithoutConfig || []).length}):\n`;
|
|
44
|
+
if (!enabledWithoutConfig || enabledWithoutConfig.length === 0) {
|
|
38
45
|
output += ` (Ninguna)\n`;
|
|
39
46
|
}
|
|
40
47
|
else {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
if (config.instruction) {
|
|
53
|
-
output += ` └ instruction: "${config.instruction}"\n`;
|
|
54
|
-
}
|
|
55
|
-
});
|
|
48
|
+
for (const t of enabledWithoutConfig) {
|
|
49
|
+
output += ` • ${t}\n`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Multi-instance summary
|
|
53
|
+
if (multiInstanceSummary && Object.keys(multiInstanceSummary).length > 0) {
|
|
54
|
+
output += `\n Instancias multi-instance:\n`;
|
|
55
|
+
for (const [baseTool, instances] of Object.entries(multiInstanceSummary)) {
|
|
56
|
+
output += ` ${baseTool}: ${instances.join(', ')}\n`;
|
|
57
|
+
}
|
|
56
58
|
}
|
|
57
59
|
return { text: output };
|
|
58
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list_tool_configs.js","sourceRoot":"","sources":["../../src/tools/list_tool_configs.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAS;IAC1C,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"list_tool_configs.js","sourceRoot":"","sources":["../../src/tools/list_tool_configs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
export const REMOVE_TOOL_CONFIG_TOOL = {
|
|
2
2
|
name: 'remove_tool_config',
|
|
3
|
-
description: 'Elimina la configuración de un tool. Si es
|
|
3
|
+
description: 'Elimina la configuración de un tool. Si es multi-instance, también la remueve de enabledTools automáticamente.',
|
|
4
4
|
inputSchema: {
|
|
5
5
|
type: 'object',
|
|
6
6
|
properties: {
|
|
7
|
-
agentId: { type: 'string' },
|
|
8
|
-
toolName: { type: 'string' }
|
|
9
|
-
removeFromEnabled: { type: 'boolean', description: 'default: true para factory, false para native' }
|
|
7
|
+
agentId: { type: 'string', description: 'ID del agente' },
|
|
8
|
+
toolName: { type: 'string', description: 'Nombre del tool o instancia a eliminar' }
|
|
10
9
|
},
|
|
11
10
|
required: ['agentId', 'toolName']
|
|
12
11
|
}
|
|
13
12
|
};
|
|
14
13
|
export async function removeToolConfigHandler(client, args) {
|
|
15
|
-
const { agentId, toolName
|
|
14
|
+
const { agentId, toolName } = args;
|
|
16
15
|
if (!agentId || !toolName)
|
|
17
16
|
throw new Error('agentId and toolName are required');
|
|
18
|
-
const
|
|
19
|
-
const result = await client.delete(`/api/v1/mcp/agents/${agentId}/tools/${toolName}/config${query}`);
|
|
17
|
+
const result = await client.delete(`/api/v1/mcp/agents/${agentId}/tool-config/${toolName}`);
|
|
20
18
|
return result;
|
|
21
19
|
}
|
|
22
20
|
//# sourceMappingURL=remove_tool_config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove_tool_config.js","sourceRoot":"","sources":["../../src/tools/remove_tool_config.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"remove_tool_config.js","sourceRoot":"","sources":["../../src/tools/remove_tool_config.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,gHAAgH;IAC7H,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;YACzD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;SACpF;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;KAClC;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAuB,EAAE,IAA6B;IAClG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAClC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAE/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,sBAAsB,OAAO,gBAAgB,QAAQ,EAAE,CAAC,CAAA;IAC3F,OAAO,MAAM,CAAA;AACf,CAAC"}
|