@botuyo/mcp 0.3.4 → 0.3.5

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.
Files changed (32) hide show
  1. package/dist/tools/__tests__/configure_agent_tool.spec.js +17 -8
  2. package/dist/tools/__tests__/configure_agent_tool.spec.js.map +1 -1
  3. package/dist/tools/__tests__/configure_avatar.spec.d.ts +1 -0
  4. package/dist/tools/__tests__/configure_avatar.spec.js +87 -0
  5. package/dist/tools/__tests__/configure_avatar.spec.js.map +1 -0
  6. package/dist/tools/__tests__/get_tool_config.spec.js +24 -6
  7. package/dist/tools/__tests__/get_tool_config.spec.js.map +1 -1
  8. package/dist/tools/__tests__/list_base_tools.spec.js +60 -15
  9. package/dist/tools/__tests__/list_base_tools.spec.js.map +1 -1
  10. package/dist/tools/__tests__/list_tool_configs.spec.js +19 -11
  11. package/dist/tools/__tests__/list_tool_configs.spec.js.map +1 -1
  12. package/dist/tools/__tests__/remove_tool_config.spec.js +3 -8
  13. package/dist/tools/__tests__/remove_tool_config.spec.js.map +1 -1
  14. package/dist/tools/__tests__/switch_tenant.spec.js +1 -1
  15. package/dist/tools/__tests__/switch_tenant.spec.js.map +1 -1
  16. package/dist/tools/configure_agent_tool.js +21 -20
  17. package/dist/tools/configure_agent_tool.js.map +1 -1
  18. package/dist/tools/configure_avatar.d.ts +10 -0
  19. package/dist/tools/configure_avatar.js +78 -0
  20. package/dist/tools/configure_avatar.js.map +1 -0
  21. package/dist/tools/get_tool_config.js +13 -5
  22. package/dist/tools/get_tool_config.js.map +1 -1
  23. package/dist/tools/index.js +8 -3
  24. package/dist/tools/index.js.map +1 -1
  25. package/dist/tools/list_base_tools.d.ts +4 -2
  26. package/dist/tools/list_base_tools.js +40 -24
  27. package/dist/tools/list_base_tools.js.map +1 -1
  28. package/dist/tools/list_tool_configs.js +34 -32
  29. package/dist/tools/list_tool_configs.js.map +1 -1
  30. package/dist/tools/remove_tool_config.js +5 -7
  31. package/dist/tools/remove_tool_config.js.map +1 -1
  32. package/package.json +1 -1
@@ -8,24 +8,33 @@ class MockPutClient {
8
8
  }
9
9
  }
10
10
  describe('configureAgentToolHandler', () => {
11
- it('should call the botuyo backend with correct PUT request', async () => {
11
+ it('should PUT to /tool-config/:toolName with payload (no toolName in body)', async () => {
12
12
  const client = new MockPutClient();
13
- const payloadOpts = {
13
+ await configureAgentToolHandler(client, {
14
14
  agentId: 'agent-123',
15
15
  toolName: 'send_email',
16
- baseTool: 'email_factory',
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/tools/config');
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
- toolName: 'send_email',
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,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,WAAW,GAAG;YAClB,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,eAAe;YACzB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;YAC7B,WAAW,EAAE,mBAAmB;SACjC,CAAA;QAED,MAAM,yBAAyB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAEpD,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,2CAA2C,CAAC,CAAA;QACpF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YAClD,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,eAAe;YACzB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;YAC7B,WAAW,EAAE,mBAAmB;SACjC,CAAC,CAAA;IACJ,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"}
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/tools/t1/config');
6
- return { success: true, fake: 'data' };
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 perform GET request to fetch tool config', async () => {
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: 't1' });
13
- expect(res.success).toBe(true);
14
- expect(res.fake).toBe('data');
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,uCAAuC,CAAC,CAAA;QAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACxC,CAAC;CACF;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACjF,MAAM,CAAE,GAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,CAAE,GAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
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 { listBaseToolsHandler } from '../list_base_tools.js';
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/base');
5
+ expect(path).toBe('/api/v1/mcp/tools/catalog');
6
6
  return {
7
7
  success: true,
8
- data: {
9
- sync_document: {
10
- connectors: ['google_sheets', 'notion'],
11
- description: 'Sincronizar doc'
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
- call_webhook: {}
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('listBaseToolsHandler', () => {
19
- it('should render base tools with their connectors', async () => {
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 listBaseToolsHandler(client, {});
22
- expect(res.text).toContain('Base tools disponibles');
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('Connectors: —');
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,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,MAAM,aAAa;IACjB,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QAC3C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,aAAa,EAAE;oBACb,UAAU,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC;oBACvC,WAAW,EAAE,iBAAiB;iBAC/B;gBACD,YAAY,EAAE,EAAE;aACjB;SACF,CAAA;IACH,CAAC;CACF;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAqB,CAAA;QAEtE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QACpD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;QAC/D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
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
- name: 'Agent Tester',
10
- enabledTools: ['native1', 'configured1'],
11
- toolConfigs: { configured1: { baseTool: 'sync_document' } }
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 separating native and configured ones', async () => {
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 del agente "Agent Tester"');
21
- expect(res.text).toContain('Tools nativas (sin config)');
22
- expect(res.text).toContain('• native1');
23
- expect(res.text).toContain('Tools configuradas');
24
- expect(res.text).toContain(' configured1');
25
- expect(res.text).toContain('[factory: sync_document]');
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,4BAA4B,CAAC,CAAA;QAC/C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,IAAI,EAAE,cAAc;gBACpB,YAAY,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;gBACxC,WAAW,EAAE,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE;aAC5D;SACF,CAAA;IACH,CAAC;CACF;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,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,iCAAiC,CAAC,CAAA;QAC7D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACxD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QACvC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAChD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACxD,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"}
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 perform DELETE request with removeFromEnabled=true', async () => {
11
+ it('should DELETE to /tool-config/:toolName', async () => {
12
12
  const client = new MockDeleteClient();
13
- await removeToolConfigHandler(client, { agentId: 'a1', toolName: 't1', removeFromEnabled: true });
14
- expect(client.paths[0]).toBe('/api/v1/mcp/agents/a1/tools/t1/config?removeFromEnabled=true');
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,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAS,CAAA;QAC5C,MAAM,uBAAuB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAA;QACjG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAS,CAAA;QAC5C,MAAM,uBAAuB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IACvE,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
+ {"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('../commands/credentials.js', () => ({
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,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,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
+ {"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
- Usa esta herramienta para configurar tools nativas (ej. \`send_email\`) o para crear tool factories (instancias virtuales de tools base como \`sync_document\`).`,
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 nuevo para factory)' },
11
- baseTool: { type: 'string', description: 'Tool base para crear una factory (ej. "sync_document", "call_webhook")' },
12
- connector: { type: 'string', description: 'Conector a usar si es factory (ej. "google_sheets", "notion")' },
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 IToolField con name, type, label, required, enumValues, validation, etc.'
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 (1 línea explicando qué hace esta tool específica)' }
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, connector, params, fields, instruction } = args;
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
- toolName,
31
- baseTool,
32
- connector,
33
- params,
34
- fields,
35
- instruction
36
- };
37
- // Se asume endpoint: PUT /api/v1/mcp/agents/:agentId/tools/config
38
- const result = await client.put(`/api/v1/mcp/agents/${agentId}/tools/config`, payload);
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;;iKAEkJ;IAC/J,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,yDAAyD,EAAE;YACpG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wEAAwE,EAAE;YACnH,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAE;YAC3G,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;YACvG,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,8HAA8H;aAC5I;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,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAW,CAAA;IAE3F,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,OAAO,GAAG;QACd,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,MAAM;QACN,MAAM;QACN,WAAW;KACZ,CAAA;IAED,kEAAkE;IAClE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,sBAAsB,OAAO,eAAe,EAAE,OAAO,CAAC,CAAA;IACtF,OAAO,MAAM,CAAA;AACf,CAAC"}
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}/tools/${toolName}/config`);
18
- return result;
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,mDAAmD;IAChE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC7B;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,UAAU,QAAQ,SAAS,CAAC,CAAA;IACzF,OAAO,MAAM,CAAA;AACf,CAAC"}
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"}
@@ -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 { LIST_BASE_TOOLS_TOOL, listBaseToolsHandler } from './list_base_tools.js';
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
- LIST_BASE_TOOLS_TOOL,
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
- list_base_tools: listBaseToolsHandler,
82
+ get_tools_catalog: getToolsCatalogHandler,
83
+ list_avatars: listAvatarsHandler,
84
+ select_avatar: selectAvatarHandler,
80
85
  };
81
86
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -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 LIST_BASE_TOOLS_TOOL: Tool;
4
- export declare function listBaseToolsHandler(client: BotuyoApiClient, _args: Record<string, unknown>): Promise<any>;
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 LIST_BASE_TOOLS_TOOL = {
2
- name: 'list_base_tools',
3
- description: 'Lista los base tools disponibles para crear factories y los connectors que soportan.',
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 listBaseToolsHandler(client, _args) {
10
- const result = await client.get('/api/v1/mcp/tools/base');
11
- if (result && result.success && result.data) {
12
- let output = 'Base tools disponibles para factory:\n\n';
13
- const baseTools = result.data;
14
- for (const [baseToolName, info] of Object.entries(baseTools)) {
15
- const tl = info;
16
- output += ` ${baseToolName}\n`;
17
- if (tl.connectors && tl.connectors.length > 0) {
18
- output += ` Connectors: ${tl.connectors.join(', ')}\n`;
19
- }
20
- else {
21
- output += ` Connectors: —\n`;
22
- }
23
- if (tl.description) {
24
- output += ` Descripción: ${tl.description}\n`;
25
- }
26
- output += '\n';
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
- return { text: output };
44
+ output += '\n';
29
45
  }
30
- return result;
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,oBAAoB,GAAS;IACxC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,sFAAsF;IACnG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAuB,EAAE,KAA8B;IAChG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;IAEzD,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,MAAM,GAAG,0CAA0C,CAAA;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;QAE7B,KAAK,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,MAAM,EAAE,GAAG,IAAW,CAAA;YACtB,MAAM,IAAI,KAAK,YAAY,IAAI,CAAA;YAC/B,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,mBAAmB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,qBAAqB,CAAA;YACjC,CAAC;YACD,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM,IAAI,oBAAoB,EAAE,CAAC,WAAW,IAAI,CAAA;YAClD,CAAC;YACD,MAAM,IAAI,IAAI,CAAA;QAChB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACzB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
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, separando tools nativas y configuradas/factories.',
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
- // Obtener el agente para leer su toolConfigs y enabledTools
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 agent configuration');
18
+ throw new Error('Could not fetch tool configs');
20
19
  }
21
- const agent = result.data;
22
- const enabledTools = agent.enabledTools || [];
23
- const toolConfigs = agent.toolConfigs || {};
24
- const configuredTools = Object.keys(toolConfigs);
25
- const nativeTools = enabledTools.filter(t => !configuredTools.includes(t));
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
- nativeTools.forEach(t => {
33
- output += ` ${t}\n`;
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
- output += `\n Tools configuradas:\n`;
37
- if (configuredTools.length === 0) {
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
- configuredTools.forEach(toolName => {
42
- const config = toolConfigs[toolName];
43
- const isFactory = config.baseTool ? `[factory: ${config.baseTool}${config.connector ? ` → ${config.connector}` : ''}]` : '';
44
- output += ` • ${toolName} ${isFactory}\n`;
45
- if (config.params) {
46
- output += ` └ params: ${Object.keys(config.params).join(', ')}\n`;
47
- }
48
- if (config.fields && Array.isArray(config.fields)) {
49
- const fieldSummaries = config.fields.map((f) => `${f.name} (${f.type})`).join(', ');
50
- output += ` └ fields: ${fieldSummaries} — ${config.fields.length} campos\n`;
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":"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"}
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 factory, también la remueve de enabledTools por defecto.',
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, removeFromEnabled } = args;
14
+ const { agentId, toolName } = args;
16
15
  if (!agentId || !toolName)
17
16
  throw new Error('agentId and toolName are required');
18
- const query = removeFromEnabled !== undefined ? `?removeFromEnabled=${removeFromEnabled}` : '';
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,qGAAqG;IAClH,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,+CAA+C,EAAE;SACrG;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,iBAAiB,EAAE,GAAG,IAAI,CAAA;IACrD,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAE/E,MAAM,KAAK,GAAG,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,sBAAsB,OAAO,UAAU,QAAQ,UAAU,KAAK,EAAE,CAAC,CAAA;IAEpG,OAAO,MAAM,CAAA;AACf,CAAC"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botuyo/mcp",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "BotUyo MCP Server — create and manage AI agents via Model Context Protocol",
5
5
  "keywords": [
6
6
  "mcp",