@botuyo/mcp 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -74,7 +74,7 @@ The server resolves your JWT from `BOTUYO_TOKEN`, falling back to `~/.botuyo/cre
74
74
 
75
75
  ## Available tools
76
76
 
77
- The server exposes **45 tools**. Read tools (`list_*`, `get_*`, `export_*`, `audit_*`) need `viewer+`; write/publish tools need `developer+`; channel connect/disconnect need `admin+` (see [Roles](#roles)).
77
+ The server exposes **48 tools**. Read tools (`list_*`, `get_*`, `export_*`, `audit_*`) need `viewer+`; write/publish tools need `developer+`; channel & integration connect/configure need `admin+` (see [Roles](#roles)).
78
78
 
79
79
  > **For AI assistants / IDE agents:** every tool is self-describing — its `inputSchema` lists the exact arguments (with `required`) and its `description` states role requirements and side effects. Discover the live catalog with the MCP `tools/list` request; you never need to hardcode tool names. A typical build flow is `create_agent` → `update_agent` (identity/voice) → `upsert_stage` (conversation graph) → `update_enabled_tools` / `configure_agent_tool` (capabilities) → `publish_agent`. Use `example_agent` to see a fully documented reference config, and `audit_agent_family` to validate before publishing.
80
80
 
@@ -183,6 +183,18 @@ Connect messaging channels to the tenant **with their secrets**. Secrets are **w
183
183
 
184
184
  > Channels that require an interactive flow (WhatsApp/Instagram Embedded Signup QR/OAuth) still need [admin.botuyo.com](https://admin.botuyo.com). Channels that authenticate with a static token (Telegram, Discord, WhatsApp Cloud API with an existing token, Web) can be connected here.
185
185
 
186
+ ### Integrations
187
+
188
+ Install and configure the tenant's external integrations (Shopify, PaseoLibre, Google Calendar, email SMTP, …) **with their secrets**, using the same write-only secret model as channels. Configure/remove require role **owner or admin**.
189
+
190
+ | Tool | Description |
191
+ |---|---|
192
+ | `list_integrations` | List the integration catalog (available) + the tenant's installed integrations. Never returns secret values — only `configKeys` (which config keys are set) |
193
+ | `configure_integration` | Install or update an integration with its config/secret (validated against the provider, stored server-side). Accepts literal `config` or `configFromEnv` (env-var reference) |
194
+ | `remove_integration` | Uninstall an integration by id |
195
+
196
+ Same two secret modes as `connect_channel`: literal `config`, or `configFromEnv` (map config key → env var name resolved from the MCP server environment, keeping the secret out of the chat).
197
+
186
198
  ### Account
187
199
 
188
200
  | Tool | Description |
@@ -198,7 +210,7 @@ Connect messaging channels to the tenant **with their secrets**. Secrets are **w
198
210
  | `developer` | ✅ | ✅ | ✅ |
199
211
  | `viewer` | ✅ | ❌ | ❌ |
200
212
 
201
- > **Channels:** `connect_channel` / `disconnect_channel` additionally require **owner or admin** (a `developer` can build agents but not wire up channel secrets).
213
+ > **Channels & integrations:** `connect_channel` / `disconnect_channel` / `configure_integration` / `remove_integration` additionally require **owner or admin** (a `developer` can build agents but not wire up channel/integration secrets).
202
214
 
203
215
  ## Channel Integrations
204
216
 
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,79 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import { listIntegrationsHandler, configureIntegrationHandler, removeIntegrationHandler } from '../integrations.js';
3
+ class MockClient {
4
+ gets = [];
5
+ posts = [];
6
+ deletes = [];
7
+ async get(path) {
8
+ this.gets.push(path);
9
+ return { success: true, data: { available: [], installed: [] } };
10
+ }
11
+ async post(path, payload) {
12
+ this.posts.push({ path, payload });
13
+ return { success: true, data: { integrationId: 'shopify', status: 'active' } };
14
+ }
15
+ async delete(path) {
16
+ this.deletes.push(path);
17
+ return { success: true };
18
+ }
19
+ }
20
+ describe('listIntegrationsHandler', () => {
21
+ it('GETs the MCP integrations namespace', async () => {
22
+ const client = new MockClient();
23
+ await listIntegrationsHandler(client);
24
+ expect(client.gets[0]).toBe('/api/v1/mcp/integrations');
25
+ });
26
+ });
27
+ describe('configureIntegrationHandler', () => {
28
+ it('POSTs integrationId + literal config', async () => {
29
+ const client = new MockClient();
30
+ await configureIntegrationHandler(client, {
31
+ integrationId: 'shopify',
32
+ config: { apiUrl: 'https://x', apiKey: 'sk-123' }
33
+ });
34
+ expect(client.posts[0].path).toBe('/api/v1/mcp/integrations/configure');
35
+ expect(client.posts[0].payload).toEqual({
36
+ integrationId: 'shopify',
37
+ config: { apiUrl: 'https://x', apiKey: 'sk-123' }
38
+ });
39
+ });
40
+ it('throws when integrationId is missing', async () => {
41
+ const client = new MockClient();
42
+ await expect(configureIntegrationHandler(client, {})).rejects.toThrow(/integrationId/i);
43
+ });
44
+ describe('configFromEnv (keeps secrets out of the chat)', () => {
45
+ afterEach(() => {
46
+ delete process.env.TEST_SHOPIFY_KEY;
47
+ });
48
+ it('resolves + merges the secret from the MCP server environment', async () => {
49
+ process.env.TEST_SHOPIFY_KEY = 'sk-from-env';
50
+ const client = new MockClient();
51
+ await configureIntegrationHandler(client, {
52
+ integrationId: 'shopify',
53
+ config: { apiUrl: 'https://x' },
54
+ configFromEnv: { apiKey: 'TEST_SHOPIFY_KEY' }
55
+ });
56
+ expect(client.posts[0].payload.config).toEqual({ apiUrl: 'https://x', apiKey: 'sk-from-env' });
57
+ });
58
+ it('throws a helpful error when the env var is not set', async () => {
59
+ const client = new MockClient();
60
+ await expect(configureIntegrationHandler(client, {
61
+ integrationId: 'shopify',
62
+ configFromEnv: { apiKey: 'DEFINITELY_UNSET_ENV_VAR_XYZ' }
63
+ })).rejects.toThrow(/DEFINITELY_UNSET_ENV_VAR_XYZ/);
64
+ expect(client.posts).toHaveLength(0);
65
+ });
66
+ });
67
+ });
68
+ describe('removeIntegrationHandler', () => {
69
+ it('DELETEs by integration id', async () => {
70
+ const client = new MockClient();
71
+ await removeIntegrationHandler(client, { integrationId: 'shopify' });
72
+ expect(client.deletes[0]).toBe('/api/v1/mcp/integrations/shopify');
73
+ });
74
+ it('throws when integrationId is missing', async () => {
75
+ const client = new MockClient();
76
+ await expect(removeIntegrationHandler(client, {})).rejects.toThrow(/integrationId/i);
77
+ });
78
+ });
79
+ //# sourceMappingURL=integrations.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.spec.js","sourceRoot":"","sources":["../../../src/tools/__tests__/integrations.spec.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,7 @@ import { RESTORE_AGENT_VERSION_TOOL, restoreAgentVersionHandler } from './restor
45
45
  import { LIST_AGENT_FAMILIES_TOOL, listAgentFamiliesHandler, GET_AGENT_FAMILY_TOOL, getAgentFamilyHandler, CREATE_AGENT_FAMILY_TOOL, createAgentFamilyHandler, UPDATE_FAMILY_BASE_TOOL, updateFamilyBaseHandler, ADD_FAMILY_VARIANT_TOOL, addFamilyVariantHandler, UPDATE_FAMILY_VARIANT_TOOL, updateFamilyVariantHandler, REMOVE_FAMILY_VARIANT_TOOL, removeFamilyVariantHandler, PUBLISH_AGENT_FAMILY_TOOL, publishAgentFamilyHandler, DELETE_AGENT_FAMILY_TOOL, deleteAgentFamilyHandler, EXPORT_AGENT_FAMILY_TOOL, exportAgentFamilyHandler, IMPORT_AGENT_FAMILY_TOOL, importAgentFamilyHandler } from './agent_families.js';
46
46
  import { AUDIT_AGENT_FAMILY_TOOL, auditAgentFamilyHandler } from './audit_agent_family.js';
47
47
  import { LIST_CHANNELS_TOOL, listChannelsHandler, CONNECT_CHANNEL_TOOL, connectChannelHandler, DISCONNECT_CHANNEL_TOOL, disconnectChannelHandler } from './channels.js';
48
+ import { LIST_INTEGRATIONS_TOOL, listIntegrationsHandler, CONFIGURE_INTEGRATION_TOOL, configureIntegrationHandler, REMOVE_INTEGRATION_TOOL, removeIntegrationHandler } from './integrations.js';
48
49
  export const ALL_TOOLS = [
49
50
  LIST_AGENTS_TOOL,
50
51
  GET_AGENT_TOOL,
@@ -91,6 +92,9 @@ export const ALL_TOOLS = [
91
92
  LIST_CHANNELS_TOOL,
92
93
  CONNECT_CHANNEL_TOOL,
93
94
  DISCONNECT_CHANNEL_TOOL,
95
+ LIST_INTEGRATIONS_TOOL,
96
+ CONFIGURE_INTEGRATION_TOOL,
97
+ REMOVE_INTEGRATION_TOOL,
94
98
  ];
95
99
  export const TOOL_HANDLERS = {
96
100
  list_agents: listAgentsHandler,
@@ -138,5 +142,8 @@ export const TOOL_HANDLERS = {
138
142
  list_channels: (client) => listChannelsHandler(client),
139
143
  connect_channel: connectChannelHandler,
140
144
  disconnect_channel: disconnectChannelHandler,
145
+ list_integrations: (client) => listIntegrationsHandler(client),
146
+ configure_integration: configureIntegrationHandler,
147
+ remove_integration: removeIntegrationHandler,
141
148
  };
142
149
  //# 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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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Integration tools — install/list/remove the tenant's external integrations (Shopify, PaseoLibre,
3
+ * Google Calendar, email SMTP, etc.) with their secret config.
4
+ *
5
+ * SECURITY MODEL (same as channels):
6
+ * - Secret config values are WRITE-ONLY: the server validates + stores them and NEVER returns
7
+ * them. `list_integrations` reports only `configKeys` (which keys are set), never values.
8
+ * - `configure_integration` accepts the secret two ways:
9
+ * 1. `config` — literal values (simplest; the secret travels through the chat/LLM).
10
+ * 2. `configFromEnv` — a map of `{ configKey: ENV_VAR_NAME }`; the MCP server reads the value
11
+ * from its OWN environment so the secret never appears in the conversation. PREFER this.
12
+ * - Configure/remove require role owner or admin.
13
+ *
14
+ * All calls go through the /api/v1/mcp/integrations namespace (RULE 7).
15
+ *
16
+ * NOTE (RULE 0): these are agent/tenant integrations. Recruiting-owned config (e.g. recruiting
17
+ * email senders) is NOT managed here — that belongs to the Recruiting copiloto.
18
+ */
19
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
20
+ import type { BotuyoApiClient } from '../client.js';
21
+ export declare const LIST_INTEGRATIONS_TOOL: Tool;
22
+ export declare const CONFIGURE_INTEGRATION_TOOL: Tool;
23
+ export declare const REMOVE_INTEGRATION_TOOL: Tool;
24
+ export declare function listIntegrationsHandler(client: BotuyoApiClient): Promise<unknown>;
25
+ export declare function configureIntegrationHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<unknown>;
26
+ export declare function removeIntegrationHandler(client: BotuyoApiClient, args: Record<string, unknown>): Promise<unknown>;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Integration tools — install/list/remove the tenant's external integrations (Shopify, PaseoLibre,
3
+ * Google Calendar, email SMTP, etc.) with their secret config.
4
+ *
5
+ * SECURITY MODEL (same as channels):
6
+ * - Secret config values are WRITE-ONLY: the server validates + stores them and NEVER returns
7
+ * them. `list_integrations` reports only `configKeys` (which keys are set), never values.
8
+ * - `configure_integration` accepts the secret two ways:
9
+ * 1. `config` — literal values (simplest; the secret travels through the chat/LLM).
10
+ * 2. `configFromEnv` — a map of `{ configKey: ENV_VAR_NAME }`; the MCP server reads the value
11
+ * from its OWN environment so the secret never appears in the conversation. PREFER this.
12
+ * - Configure/remove require role owner or admin.
13
+ *
14
+ * All calls go through the /api/v1/mcp/integrations namespace (RULE 7).
15
+ *
16
+ * NOTE (RULE 0): these are agent/tenant integrations. Recruiting-owned config (e.g. recruiting
17
+ * email senders) is NOT managed here — that belongs to the Recruiting copiloto.
18
+ */
19
+ const BASE = '/api/v1/mcp/integrations';
20
+ export const LIST_INTEGRATIONS_TOOL = {
21
+ name: 'list_integrations',
22
+ description: 'List the integration catalog (available) and the tenant\'s installed integrations with their ' +
23
+ 'status. SECRETS ARE NEVER RETURNED — each installed integration reports only `configKeys` ' +
24
+ '(which config keys are set), never their values. Available to any authenticated role.',
25
+ inputSchema: { type: 'object', properties: {} }
26
+ };
27
+ export const CONFIGURE_INTEGRATION_TOOL = {
28
+ name: 'configure_integration',
29
+ description: 'Install or update a tenant integration with its config/secret (API key, tokens, SMTP creds, etc.). ' +
30
+ 'Requires role owner or admin. The server validates the credentials against the provider and stores ' +
31
+ 'them; secrets are WRITE-ONLY and never echoed back — DO NOT repeat them to the user. ' +
32
+ '\n\nTwo ways to pass secret values:\n' +
33
+ '• `config`: literal values, e.g. { "apiKey": "sk-..." }. Simplest, but the secret passes through this chat.\n' +
34
+ '• `configFromEnv` (RECOMMENDED for real secrets): a map of config key → environment variable name, ' +
35
+ 'e.g. { "apiKey": "MY_SHOPIFY_KEY" }. The MCP server reads the value from its own environment so the ' +
36
+ 'secret NEVER appears in the chat. Both sources are merged. Use `list_integrations` to see available ids.',
37
+ inputSchema: {
38
+ type: 'object',
39
+ properties: {
40
+ integrationId: { type: 'string', description: 'Integration id from the catalog (e.g. "shopify", "email-smtp").' },
41
+ config: {
42
+ type: 'object',
43
+ description: 'Config/secret values as literals (e.g. { "apiUrl": "...", "apiKey": "..." }).',
44
+ additionalProperties: true
45
+ },
46
+ configFromEnv: {
47
+ type: 'object',
48
+ description: 'Map of config key → env var name read from the MCP server environment (keeps the secret out of the chat).',
49
+ additionalProperties: { type: 'string' }
50
+ }
51
+ },
52
+ required: ['integrationId']
53
+ }
54
+ };
55
+ export const REMOVE_INTEGRATION_TOOL = {
56
+ name: 'remove_integration',
57
+ description: 'Uninstall a tenant integration by its id (from list_integrations). Requires role owner or admin.',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: { integrationId: { type: 'string', description: 'The integration id to remove.' } },
61
+ required: ['integrationId']
62
+ }
63
+ };
64
+ export async function listIntegrationsHandler(client) {
65
+ return client.get(BASE);
66
+ }
67
+ export async function configureIntegrationHandler(client, args) {
68
+ const integrationId = args.integrationId;
69
+ if (!integrationId)
70
+ throw new Error('integrationId is required');
71
+ const config = { ...(args.config || {}) };
72
+ const fromEnv = args.configFromEnv;
73
+ if (fromEnv) {
74
+ for (const [key, envName] of Object.entries(fromEnv)) {
75
+ const value = process.env[envName];
76
+ if (value === undefined || value === '') {
77
+ throw new Error(`Environment variable "${envName}" (for config "${key}") is not set in the MCP server environment. ` +
78
+ `Add it to your MCP client config or use the literal "config" field.`);
79
+ }
80
+ config[key] = value;
81
+ }
82
+ }
83
+ return client.post(`${BASE}/configure`, { integrationId, config });
84
+ }
85
+ export async function removeIntegrationHandler(client, args) {
86
+ const integrationId = args.integrationId;
87
+ if (!integrationId)
88
+ throw new Error('integrationId is required');
89
+ return client.delete(`${BASE}/${integrationId}`);
90
+ }
91
+ //# sourceMappingURL=integrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/tools/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,IAAI,GAAG,0BAA0B,CAAA;AAEvC,MAAM,CAAC,MAAM,sBAAsB,GAAS;IAC1C,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,+FAA+F;QAC/F,4FAA4F;QAC5F,uFAAuF;IACzF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;CAChD,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAS;IAC9C,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,qGAAqG;QACrG,qGAAqG;QACrG,uFAAuF;QACvF,uCAAuC;QACvC,+GAA+G;QAC/G,qGAAqG;QACrG,sGAAsG;QACtG,0GAA0G;IAC5G,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iEAAiE,EAAE;YACjH,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+EAA+E;gBAC5F,oBAAoB,EAAE,IAAI;aAC3B;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,2GAA2G;gBAC7G,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzC;SACF;QACD,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B;CACF,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAS;IAC3C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,kGAAkG;IACpG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE,EAAE;QAC/F,QAAQ,EAAE,CAAC,eAAe,CAAC;KAC5B;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAuB;IACnE,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAuB,EACvB,IAA6B;IAE7B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAuB,CAAA;IAClD,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEhE,MAAM,MAAM,GAA4B,EAAE,GAAG,CAAE,IAAI,CAAC,MAAkC,IAAI,EAAE,CAAC,EAAE,CAAA;IAE/F,MAAM,OAAO,GAAG,IAAI,CAAC,aAAmD,CAAA;IACxE,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAClC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,yBAAyB,OAAO,kBAAkB,GAAG,+CAA+C;oBAClG,qEAAqE,CACxE,CAAA;YACH,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAuB,EACvB,IAA6B;IAE7B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAuB,CAAA;IAClD,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAChE,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,aAAa,EAAE,CAAC,CAAA;AAClD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botuyo/mcp",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "BotUyo MCP Server — create and manage AI agents via Model Context Protocol",
5
5
  "keywords": [
6
6
  "mcp",