@botuyo/mcp 0.3.3 → 0.3.4

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 (90) hide show
  1. package/dist/tools/__tests__/associate_knowledge.spec.d.ts +1 -0
  2. package/dist/tools/__tests__/associate_knowledge.spec.js +23 -0
  3. package/dist/tools/__tests__/associate_knowledge.spec.js.map +1 -0
  4. package/dist/tools/__tests__/configure_agent_tool.spec.d.ts +1 -0
  5. package/dist/tools/__tests__/configure_agent_tool.spec.js +36 -0
  6. package/dist/tools/__tests__/configure_agent_tool.spec.js.map +1 -0
  7. package/dist/tools/__tests__/create_agent.spec.d.ts +1 -0
  8. package/dist/tools/__tests__/create_agent.spec.js +23 -0
  9. package/dist/tools/__tests__/create_agent.spec.js.map +1 -0
  10. package/dist/tools/__tests__/create_from_template.spec.d.ts +1 -0
  11. package/dist/tools/__tests__/create_from_template.spec.js +21 -0
  12. package/dist/tools/__tests__/create_from_template.spec.js.map +1 -0
  13. package/dist/tools/__tests__/delete_agent.spec.d.ts +1 -0
  14. package/dist/tools/__tests__/delete_agent.spec.js +31 -0
  15. package/dist/tools/__tests__/delete_agent.spec.js.map +1 -0
  16. package/dist/tools/__tests__/delete_knowledge_doc.spec.d.ts +1 -0
  17. package/dist/tools/__tests__/delete_knowledge_doc.spec.js +17 -0
  18. package/dist/tools/__tests__/delete_knowledge_doc.spec.js.map +1 -0
  19. package/dist/tools/__tests__/example_agent.spec.d.ts +1 -0
  20. package/dist/tools/__tests__/example_agent.spec.js +12 -0
  21. package/dist/tools/__tests__/example_agent.spec.js.map +1 -0
  22. package/dist/tools/__tests__/export_agent_json.spec.d.ts +1 -0
  23. package/dist/tools/__tests__/export_agent_json.spec.js +30 -0
  24. package/dist/tools/__tests__/export_agent_json.spec.js.map +1 -0
  25. package/dist/tools/__tests__/get_agent.spec.d.ts +1 -0
  26. package/dist/tools/__tests__/get_agent.spec.js +19 -0
  27. package/dist/tools/__tests__/get_agent.spec.js.map +1 -0
  28. package/dist/tools/__tests__/get_agent_status.spec.d.ts +1 -0
  29. package/dist/tools/__tests__/get_agent_status.spec.js +16 -0
  30. package/dist/tools/__tests__/get_agent_status.spec.js.map +1 -0
  31. package/dist/tools/__tests__/get_tool_config.spec.d.ts +1 -0
  32. package/dist/tools/__tests__/get_tool_config.spec.js +17 -0
  33. package/dist/tools/__tests__/get_tool_config.spec.js.map +1 -0
  34. package/dist/tools/__tests__/import_agent_json.spec.d.ts +1 -0
  35. package/dist/tools/__tests__/import_agent_json.spec.js +28 -0
  36. package/dist/tools/__tests__/import_agent_json.spec.js.map +1 -0
  37. package/dist/tools/__tests__/list_agents.spec.d.ts +1 -0
  38. package/dist/tools/__tests__/list_agents.spec.js +16 -0
  39. package/dist/tools/__tests__/list_agents.spec.js.map +1 -0
  40. package/dist/tools/__tests__/list_available_tools.spec.d.ts +1 -0
  41. package/dist/tools/__tests__/list_available_tools.spec.js +16 -0
  42. package/dist/tools/__tests__/list_available_tools.spec.js.map +1 -0
  43. package/dist/tools/__tests__/list_base_tools.spec.d.ts +1 -0
  44. package/dist/tools/__tests__/list_base_tools.spec.js +29 -0
  45. package/dist/tools/__tests__/list_base_tools.spec.js.map +1 -0
  46. package/dist/tools/__tests__/list_knowledge_docs.spec.d.ts +1 -0
  47. package/dist/tools/__tests__/list_knowledge_docs.spec.js +22 -0
  48. package/dist/tools/__tests__/list_knowledge_docs.spec.js.map +1 -0
  49. package/dist/tools/__tests__/list_templates.spec.d.ts +1 -0
  50. package/dist/tools/__tests__/list_templates.spec.js +16 -0
  51. package/dist/tools/__tests__/list_templates.spec.js.map +1 -0
  52. package/dist/tools/__tests__/list_tool_configs.spec.d.ts +1 -0
  53. package/dist/tools/__tests__/list_tool_configs.spec.js +31 -0
  54. package/dist/tools/__tests__/list_tool_configs.spec.js.map +1 -0
  55. package/dist/tools/__tests__/publish_agent.spec.d.ts +1 -0
  56. package/dist/tools/__tests__/publish_agent.spec.js +18 -0
  57. package/dist/tools/__tests__/publish_agent.spec.js.map +1 -0
  58. package/dist/tools/__tests__/remove_tool_config.spec.d.ts +1 -0
  59. package/dist/tools/__tests__/remove_tool_config.spec.js +26 -0
  60. package/dist/tools/__tests__/remove_tool_config.spec.js.map +1 -0
  61. package/dist/tools/__tests__/switch_tenant.spec.d.ts +1 -0
  62. package/dist/tools/__tests__/switch_tenant.spec.js +32 -0
  63. package/dist/tools/__tests__/switch_tenant.spec.js.map +1 -0
  64. package/dist/tools/__tests__/update_agent.spec.d.ts +1 -0
  65. package/dist/tools/__tests__/update_agent.spec.js +23 -0
  66. package/dist/tools/__tests__/update_agent.spec.js.map +1 -0
  67. package/dist/tools/__tests__/update_enabled_tools.spec.d.ts +1 -0
  68. package/dist/tools/__tests__/update_enabled_tools.spec.js +18 -0
  69. package/dist/tools/__tests__/update_enabled_tools.spec.js.map +1 -0
  70. package/dist/tools/__tests__/upsert_stage.spec.d.ts +1 -0
  71. package/dist/tools/__tests__/upsert_stage.spec.js +27 -0
  72. package/dist/tools/__tests__/upsert_stage.spec.js.map +1 -0
  73. package/dist/tools/configure_agent_tool.d.ts +4 -0
  74. package/dist/tools/configure_agent_tool.js +41 -0
  75. package/dist/tools/configure_agent_tool.js.map +1 -0
  76. package/dist/tools/get_tool_config.d.ts +4 -0
  77. package/dist/tools/get_tool_config.js +20 -0
  78. package/dist/tools/get_tool_config.js.map +1 -0
  79. package/dist/tools/index.js +15 -0
  80. package/dist/tools/index.js.map +1 -1
  81. package/dist/tools/list_base_tools.d.ts +4 -0
  82. package/dist/tools/list_base_tools.js +32 -0
  83. package/dist/tools/list_base_tools.js.map +1 -0
  84. package/dist/tools/list_tool_configs.d.ts +6 -0
  85. package/dist/tools/list_tool_configs.js +59 -0
  86. package/dist/tools/list_tool_configs.js.map +1 -0
  87. package/dist/tools/remove_tool_config.d.ts +4 -0
  88. package/dist/tools/remove_tool_config.js +22 -0
  89. package/dist/tools/remove_tool_config.js.map +1 -0
  90. package/package.json +4 -2
@@ -0,0 +1,26 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { removeToolConfigHandler } from '../remove_tool_config.js';
3
+ class MockDeleteClient {
4
+ paths = [];
5
+ async delete(path) {
6
+ this.paths.push(path);
7
+ return { success: true };
8
+ }
9
+ }
10
+ describe('removeToolConfigHandler', () => {
11
+ it('should perform DELETE request with removeFromEnabled=true', async () => {
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');
20
+ });
21
+ it('should throw if missing arguments', async () => {
22
+ const client = new MockDeleteClient();
23
+ await expect(removeToolConfigHandler(client, { agentId: 'a1' })).rejects.toThrow('agentId and toolName are required');
24
+ });
25
+ });
26
+ //# sourceMappingURL=remove_tool_config.spec.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
1
+ import { vi, describe, it, expect } from 'vitest';
2
+ import { switchTenantHandler } from '../switch_tenant.js';
3
+ vi.mock('../commands/credentials.js', () => ({
4
+ readCredentials: vi.fn(() => ({ token: 'mock-token', tenantId: 't1' })),
5
+ saveCredentials: vi.fn()
6
+ }));
7
+ global.fetch = vi.fn(() => Promise.resolve({
8
+ json: () => Promise.resolve({ success: true, data: { name: 'Target Tenant Name' } })
9
+ }));
10
+ class MockClient {
11
+ methodCalls = [];
12
+ async get(path) {
13
+ this.methodCalls.push({ method: 'GET', path });
14
+ if (path === '/api/auth/me')
15
+ return { success: true, data: { user: { tenantIds: ['t1', 't2'], roles: [] } } };
16
+ return { success: true, data: {} };
17
+ }
18
+ async post(path, payload) {
19
+ this.methodCalls.push({ method: 'POST', path, payload });
20
+ return { success: true, data: { token: 'new-token' } };
21
+ }
22
+ setToken() { }
23
+ }
24
+ describe('switchTenantHandler', () => {
25
+ it('should list tenants when no tenantId provided', async () => {
26
+ const client = new MockClient();
27
+ const res = await switchTenantHandler(client, {});
28
+ expect(res.success).toBe(true);
29
+ expect(res.tenants.length).toBe(2);
30
+ });
31
+ });
32
+ //# sourceMappingURL=switch_tenant.spec.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { updateAgentHandler } from '../update_agent.js';
3
+ class MockClient {
4
+ methodCalls = [];
5
+ async put(path, payload) {
6
+ this.methodCalls.push({ path, payload });
7
+ return { success: true };
8
+ }
9
+ }
10
+ describe('updateAgentHandler', () => {
11
+ it('should call PUT /api/v1/mcp/agents/:id', async () => {
12
+ const client = new MockClient();
13
+ const args = { agentId: 'a1', name: 'New Name', identity: { tone: 'friendly' } };
14
+ await updateAgentHandler(client, args);
15
+ expect(client.methodCalls[0].path).toBe('/api/v1/mcp/agents/a1');
16
+ expect(client.methodCalls[0].payload.name).toBe('New Name');
17
+ expect(client.methodCalls[0].payload.identity.tone).toBe('friendly');
18
+ });
19
+ it('should require agentId', async () => {
20
+ await expect(updateAgentHandler({}, {})).rejects.toThrow();
21
+ });
22
+ });
23
+ //# sourceMappingURL=update_agent.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_agent.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/update_agent.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,UAAU;IACP,WAAW,GAAU,EAAE,CAAA;IAC9B,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAY;QAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAS,CAAA;QACtC,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAA;QAEhF,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAChE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC3D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,CAAC,kBAAkB,CAAC,EAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;IACnE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { updateEnabledToolsHandler } from '../update_enabled_tools.js';
3
+ class MockPutClient {
4
+ methodCalls = [];
5
+ async put(path, payload) {
6
+ this.methodCalls.push({ path, payload });
7
+ return { success: true };
8
+ }
9
+ }
10
+ describe('updateEnabledToolsHandler', () => {
11
+ it('should call PUT to replace enabled tools', async () => {
12
+ const client = new MockPutClient();
13
+ await updateEnabledToolsHandler(client, { agentId: 'a1', toolIds: ['t1', 't2'] });
14
+ expect(client.methodCalls[0].path).toBe('/api/v1/mcp/agents/a1');
15
+ expect(client.methodCalls[0].payload.enabledTools).toEqual(['t1', 't2']);
16
+ });
17
+ });
18
+ //# sourceMappingURL=update_enabled_tools.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_enabled_tools.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/update_enabled_tools.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,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,yBAAyB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QAEjF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAChE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { upsertStageHandler } from '../upsert_stage.js';
3
+ class MockPutClient {
4
+ methodCalls = [];
5
+ async put(path, payload) {
6
+ this.methodCalls.push({ path, payload });
7
+ return { success: true };
8
+ }
9
+ }
10
+ describe('upsertStageHandler', () => {
11
+ it('should PUT merged stage, connections and channelFlows', async () => {
12
+ const client = new MockPutClient();
13
+ const args = {
14
+ agentId: 'a1',
15
+ stageName: 'start',
16
+ stageConfig: { instruction: 'Hello' },
17
+ connections: [{ id: 'c1', from: 'start', to: 'end', type: 'default' }],
18
+ channelFlows: { web: { connections: [] } }
19
+ };
20
+ await upsertStageHandler(client, args);
21
+ expect(client.methodCalls[0].path).toBe('/api/v1/mcp/agents/a1');
22
+ expect(client.methodCalls[0].payload.stages.start.instruction).toBe('Hello');
23
+ expect(client.methodCalls[0].payload.connections[0].id).toBe('c1');
24
+ expect(client.methodCalls[0].payload.channelFlows.web).toBeDefined();
25
+ });
26
+ });
27
+ //# sourceMappingURL=upsert_stage.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert_stage.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/upsert_stage.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,aAAa;IACV,WAAW,GAAU,EAAE,CAAA;IAC9B,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAY;QAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,aAAa,EAAS,CAAA;QACzC,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,OAAO;YAClB,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;YACrC,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACtE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE;SAC3C,CAAA;QAED,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAChE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5E,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { BotuyoApiClient } from '../client.js';
3
+ export declare const CONFIGURE_AGENT_TOOL: Tool;
4
+ export declare function configureAgentToolHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<any>;
@@ -0,0 +1,41 @@
1
+ export const CONFIGURE_AGENT_TOOL = {
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\`).`,
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ 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)' },
14
+ fields: {
15
+ type: 'array',
16
+ items: { type: 'object' },
17
+ description: 'Campos tipados (override del declaration). Array de IToolField con name, type, label, required, enumValues, validation, etc.'
18
+ },
19
+ instruction: { type: 'string', description: 'Guía para el LLM (1 línea explicando qué hace esta tool específica)' }
20
+ },
21
+ required: ['agentId', 'toolName']
22
+ }
23
+ };
24
+ export async function configureAgentToolHandler(client, args) {
25
+ const { agentId, toolName, baseTool, connector, params, fields, instruction } = args;
26
+ if (!agentId || !toolName) {
27
+ throw new Error('agentId and toolName are required');
28
+ }
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);
39
+ return result;
40
+ }
41
+ //# sourceMappingURL=configure_agent_tool.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { BotuyoApiClient } from '../client.js';
3
+ export declare const GET_TOOL_CONFIG_TOOL: Tool;
4
+ export declare function getToolConfigHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<any>;
@@ -0,0 +1,20 @@
1
+ export const GET_TOOL_CONFIG_TOOL = {
2
+ name: 'get_tool_config',
3
+ description: 'Ver el config completo de un tool (formato JSON).',
4
+ inputSchema: {
5
+ type: 'object',
6
+ properties: {
7
+ agentId: { type: 'string' },
8
+ toolName: { type: 'string' }
9
+ },
10
+ required: ['agentId', 'toolName']
11
+ }
12
+ };
13
+ export async function getToolConfigHandler(client, args) {
14
+ const { agentId, toolName } = args;
15
+ if (!agentId || !toolName)
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;
19
+ }
20
+ //# sourceMappingURL=get_tool_config.js.map
@@ -0,0 +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"}
@@ -21,6 +21,11 @@ import { DELETE_AGENT_TOOL, deleteAgentHandler } from './delete_agent.js';
21
21
  import { LIST_KNOWLEDGE_DOCS_TOOL, listKnowledgeDocsHandler } from './list_knowledge_docs.js';
22
22
  import { DELETE_KNOWLEDGE_DOC_TOOL, deleteKnowledgeDocHandler } from './delete_knowledge_doc.js';
23
23
  import { ASSOCIATE_KNOWLEDGE_TOOL, associateKnowledgeHandler } from './associate_knowledge.js';
24
+ import { CONFIGURE_AGENT_TOOL, configureAgentToolHandler } from './configure_agent_tool.js';
25
+ import { LIST_TOOL_CONFIGS_TOOL, listToolConfigsHandler } from './list_tool_configs.js';
26
+ import { REMOVE_TOOL_CONFIG_TOOL, removeToolConfigHandler } from './remove_tool_config.js';
27
+ import { GET_TOOL_CONFIG_TOOL, getToolConfigHandler } from './get_tool_config.js';
28
+ import { LIST_BASE_TOOLS_TOOL, listBaseToolsHandler } from './list_base_tools.js';
24
29
  export const ALL_TOOLS = [
25
30
  LIST_AGENTS_TOOL,
26
31
  GET_AGENT_TOOL,
@@ -41,6 +46,11 @@ export const ALL_TOOLS = [
41
46
  LIST_KNOWLEDGE_DOCS_TOOL,
42
47
  DELETE_KNOWLEDGE_DOC_TOOL,
43
48
  ASSOCIATE_KNOWLEDGE_TOOL,
49
+ CONFIGURE_AGENT_TOOL,
50
+ LIST_TOOL_CONFIGS_TOOL,
51
+ REMOVE_TOOL_CONFIG_TOOL,
52
+ GET_TOOL_CONFIG_TOOL,
53
+ LIST_BASE_TOOLS_TOOL,
44
54
  ];
45
55
  export const TOOL_HANDLERS = {
46
56
  list_agents: listAgentsHandler,
@@ -62,5 +72,10 @@ export const TOOL_HANDLERS = {
62
72
  list_knowledge_documents: listKnowledgeDocsHandler,
63
73
  delete_knowledge_document: deleteKnowledgeDocHandler,
64
74
  associate_knowledge_to_agent: associateKnowledgeHandler,
75
+ configure_agent_tool: configureAgentToolHandler,
76
+ list_tool_configs: listToolConfigsHandler,
77
+ remove_tool_config: removeToolConfigHandler,
78
+ get_tool_config: getToolConfigHandler,
79
+ list_base_tools: listBaseToolsHandler,
65
80
  };
66
81
  //# sourceMappingURL=index.js.map
@@ -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,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;CACzB,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;CACxD,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
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>;
@@ -0,0 +1,32 @@
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.',
4
+ inputSchema: {
5
+ type: 'object',
6
+ properties: {}
7
+ }
8
+ };
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';
27
+ }
28
+ return { text: output };
29
+ }
30
+ return result;
31
+ }
32
+ //# sourceMappingURL=list_base_tools.js.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { BotuyoApiClient } from '../client.js';
3
+ export declare const LIST_TOOL_CONFIGS_TOOL: Tool;
4
+ export declare function listToolConfigsHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<{
5
+ text: string;
6
+ }>;
@@ -0,0 +1,59 @@
1
+ export const LIST_TOOL_CONFIGS_TOOL = {
2
+ name: 'list_tool_configs',
3
+ description: 'Lista las configs de tools de un agente, separando tools nativas y configuradas/factories.',
4
+ inputSchema: {
5
+ type: 'object',
6
+ properties: {
7
+ agentId: { type: 'string', description: 'ID del agente' }
8
+ },
9
+ required: ['agentId']
10
+ }
11
+ };
12
+ export async function listToolConfigsHandler(client, args) {
13
+ const agentId = args.agentId;
14
+ if (!agentId)
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}`);
18
+ if (!result || !result.success || !result.data) {
19
+ throw new Error('Could not fetch agent configuration');
20
+ }
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) {
29
+ output += ` (Ninguna)\n`;
30
+ }
31
+ else {
32
+ nativeTools.forEach(t => {
33
+ output += ` • ${t}\n`;
34
+ });
35
+ }
36
+ output += `\n Tools configuradas:\n`;
37
+ if (configuredTools.length === 0) {
38
+ output += ` (Ninguna)\n`;
39
+ }
40
+ 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
+ });
56
+ }
57
+ return { text: output };
58
+ }
59
+ //# sourceMappingURL=list_tool_configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_tool_configs.js","sourceRoot":"","sources":["../../src/tools/list_tool_configs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { BotuyoApiClient } from '../client.js';
3
+ export declare const REMOVE_TOOL_CONFIG_TOOL: Tool;
4
+ export declare function removeToolConfigHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<any>;
@@ -0,0 +1,22 @@
1
+ export const REMOVE_TOOL_CONFIG_TOOL = {
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.',
4
+ inputSchema: {
5
+ type: 'object',
6
+ properties: {
7
+ agentId: { type: 'string' },
8
+ toolName: { type: 'string' },
9
+ removeFromEnabled: { type: 'boolean', description: 'default: true para factory, false para native' }
10
+ },
11
+ required: ['agentId', 'toolName']
12
+ }
13
+ };
14
+ export async function removeToolConfigHandler(client, args) {
15
+ const { agentId, toolName, removeFromEnabled } = args;
16
+ if (!agentId || !toolName)
17
+ 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}`);
20
+ return result;
21
+ }
22
+ //# sourceMappingURL=remove_tool_config.js.map
@@ -0,0 +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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botuyo/mcp",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "BotUyo MCP Server — create and manage AI agents via Model Context Protocol",
5
5
  "keywords": [
6
6
  "mcp",
@@ -22,6 +22,7 @@
22
22
  "build": "tsc",
23
23
  "dev": "tsc -w",
24
24
  "start": "node dist/index.js",
25
+ "test": "vitest run",
25
26
  "inspect": "npx @modelcontextprotocol/inspector node dist/index.js",
26
27
  "prepublishOnly": "npm run build"
27
28
  },
@@ -34,7 +35,8 @@
34
35
  },
35
36
  "devDependencies": {
36
37
  "@types/node": "^22.0.0",
37
- "typescript": "^5.3.3"
38
+ "typescript": "^5.3.3",
39
+ "vitest": "^4.1.1"
38
40
  },
39
41
  "engines": {
40
42
  "node": ">=18"