crewly 1.20.264 → 1.20.266
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/config/skills/agent/core/docs-comment/SKILL.md +6 -3
- package/config/skills/agent/core/docs-comment/execute.sh +1 -1
- package/config/skills/agent/core/gmail-send/SKILL.md +4 -0
- package/config/skills/agent/core/gmail-send/execute.sh +1 -1
- package/config/skills/agent/core/gmail-send/execute.test.sh +11 -0
- package/config/skills/agent/core/slack-file/SKILL.md +53 -0
- package/config/skills/agent/core/slack-file/execute.sh +72 -0
- package/config/skills/agent/core/slack-file/execute.test.sh +34 -0
- package/dist/backend/backend/src/constants.d.ts +77 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +77 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.js +6 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts +69 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js +203 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts +16 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js +126 -5
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google-connect-card.d.ts +12 -1
- package/dist/backend/backend/src/controllers/google/google-connect-card.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google-connect-card.js +28 -10
- package/dist/backend/backend/src/controllers/google/google-connect-card.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +26 -2
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.js +123 -33
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +37 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +15 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +4 -3
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts +43 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js +98 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts +277 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js +719 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts +196 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js +351 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts +3 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js +8 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/credential-files.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/credential-files.js +2 -0
- package/dist/backend/backend/src/services/core/credential-files.js.map +1 -1
- package/dist/backend/backend/src/services/google/docs-comments.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/docs-comments.service.js +4 -1
- package/dist/backend/backend/src/services/google/docs-comments.service.js.map +1 -1
- package/dist/backend/backend/src/services/google/google-api.client.d.ts +16 -0
- package/dist/backend/backend/src/services/google/google-api.client.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/google-api.client.js +44 -0
- package/dist/backend/backend/src/services/google/google-api.client.js.map +1 -1
- package/dist/backend/backend/src/services/google/google-reauth-notifier.service.d.ts +159 -0
- package/dist/backend/backend/src/services/google/google-reauth-notifier.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-reauth-notifier.service.js +283 -0
- package/dist/backend/backend/src/services/google/google-reauth-notifier.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-reauth.wiring.d.ts +71 -0
- package/dist/backend/backend/src/services/google/google-reauth.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-reauth.wiring.js +132 -0
- package/dist/backend/backend/src/services/google/google-reauth.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +28 -10
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js +24 -11
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js +415 -0
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts +69 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.js +177 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +16 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +2 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +3 -1
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +11 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +77 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +77 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/credential-files.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/credential-files.js +2 -0
- package/dist/cli/backend/src/services/core/credential-files.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js +415 -0
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts +69 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.js +177 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +2 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +3 -1
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +11 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/frontend/dist/assets/{index-83188f0b.js → index-7e5ebf78.js} +111 -111
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent → remote MCP proxy: `/api/connectors/remote-mcp/:id/mcp`.
|
|
3
|
+
*
|
|
4
|
+
* Agents' MCP configs point here instead of at the server, so the server's
|
|
5
|
+
* URL (Zoho's carries its key) and OAuth tokens never sit in an agent's
|
|
6
|
+
* config. Each request:
|
|
7
|
+
*
|
|
8
|
+
* 1. must come from an agent (its badge or session header — the owner and
|
|
9
|
+
* anonymous callers are refused with 403, never 401: a 401 would make
|
|
10
|
+
* Claude Code start its own localhost OAuth flow against us);
|
|
11
|
+
* 2. passes the server's `mcp:<id>` role allowlist;
|
|
12
|
+
* 3. is forwarded with the server's static headers plus a fresh
|
|
13
|
+
* `Authorization: Bearer` for OAuth servers — streamable HTTP as is:
|
|
14
|
+
* JSON or `text/event-stream` responses stream through, `Mcp-Session-Id`,
|
|
15
|
+
* `MCP-Protocol-Version` and `Last-Event-ID` pass both ways;
|
|
16
|
+
* 4. on an upstream 401 the token is refreshed once and the request
|
|
17
|
+
* retried; when that fails the owner gets a sign-in card (throttled) and
|
|
18
|
+
* the agent gets a JSON-RPC error saying so.
|
|
19
|
+
*
|
|
20
|
+
* Nothing about the URL, token or body is logged.
|
|
21
|
+
*
|
|
22
|
+
* @module controllers/connector/remote-mcp-proxy.controller
|
|
23
|
+
*/
|
|
24
|
+
import type { Request, Response } from 'express';
|
|
25
|
+
import { ConnectorAccessService } from '../../services/connector/connector-access.service.js';
|
|
26
|
+
import { RemoteMcpService } from '../../services/connector/remote-mcp.service.js';
|
|
27
|
+
import { RemoteMcpAuthService } from '../../services/connector/remote-mcp-auth.service.js';
|
|
28
|
+
/** Upstream response shape the proxy needs (fetch's Response). */
|
|
29
|
+
export interface UpstreamResponse {
|
|
30
|
+
status: number;
|
|
31
|
+
headers: {
|
|
32
|
+
get(name: string): string | null;
|
|
33
|
+
};
|
|
34
|
+
body: ReadableStream<Uint8Array> | null;
|
|
35
|
+
text(): Promise<string>;
|
|
36
|
+
}
|
|
37
|
+
/** Collaborators (tests inject). */
|
|
38
|
+
export interface ProxyDeps {
|
|
39
|
+
servers: () => Pick<RemoteMcpService, 'get'>;
|
|
40
|
+
auth: () => Pick<RemoteMcpAuthService, 'usesOAuth' | 'getAccessToken' | 'onUnauthorized' | 'view'>;
|
|
41
|
+
access: () => Pick<ConnectorAccessService, 'isAllowed' | 'allowedRoles'>;
|
|
42
|
+
fetchImpl: (url: string, init: {
|
|
43
|
+
method: string;
|
|
44
|
+
headers: Record<string, string>;
|
|
45
|
+
body?: string;
|
|
46
|
+
signal: AbortSignal;
|
|
47
|
+
}) => Promise<UpstreamResponse>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Replace collaborators (tests).
|
|
51
|
+
*
|
|
52
|
+
* @param next - Partial overrides
|
|
53
|
+
*/
|
|
54
|
+
export declare function setRemoteMcpProxyDeps(next: Partial<ProxyDeps>): void;
|
|
55
|
+
/**
|
|
56
|
+
* The JSON-RPC id of a request body, if it is a request (not a notification).
|
|
57
|
+
*
|
|
58
|
+
* @param body - Raw body
|
|
59
|
+
* @returns The id, or undefined
|
|
60
|
+
*/
|
|
61
|
+
export declare function rpcIdOf(body: string | undefined): string | number | null | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* ALL /api/connectors/remote-mcp/:id/mcp
|
|
64
|
+
*
|
|
65
|
+
* @param req - Agent request (JSON-RPC over streamable HTTP)
|
|
66
|
+
* @param res - The server's answer, streamed
|
|
67
|
+
*/
|
|
68
|
+
export declare function proxyRemoteMcp(req: Request, res: Response): Promise<void>;
|
|
69
|
+
//# sourceMappingURL=remote-mcp-proxy.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-mcp-proxy.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp-proxy.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAA8C,MAAM,gDAAgD,CAAC;AAC9H,OAAO,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAW3F,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9C,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACxC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,EAAE,MAAM,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,MAAM,CAAC,CAAC;IACnG,MAAM,EAAE,MAAM,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,cAAc,CAAC,CAAC;IACzE,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACtJ;AASD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CASpF;AAmBD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkH/E"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent → remote MCP proxy: `/api/connectors/remote-mcp/:id/mcp`.
|
|
3
|
+
*
|
|
4
|
+
* Agents' MCP configs point here instead of at the server, so the server's
|
|
5
|
+
* URL (Zoho's carries its key) and OAuth tokens never sit in an agent's
|
|
6
|
+
* config. Each request:
|
|
7
|
+
*
|
|
8
|
+
* 1. must come from an agent (its badge or session header — the owner and
|
|
9
|
+
* anonymous callers are refused with 403, never 401: a 401 would make
|
|
10
|
+
* Claude Code start its own localhost OAuth flow against us);
|
|
11
|
+
* 2. passes the server's `mcp:<id>` role allowlist;
|
|
12
|
+
* 3. is forwarded with the server's static headers plus a fresh
|
|
13
|
+
* `Authorization: Bearer` for OAuth servers — streamable HTTP as is:
|
|
14
|
+
* JSON or `text/event-stream` responses stream through, `Mcp-Session-Id`,
|
|
15
|
+
* `MCP-Protocol-Version` and `Last-Event-ID` pass both ways;
|
|
16
|
+
* 4. on an upstream 401 the token is refreshed once and the request
|
|
17
|
+
* retried; when that fails the owner gets a sign-in card (throttled) and
|
|
18
|
+
* the agent gets a JSON-RPC error saying so.
|
|
19
|
+
*
|
|
20
|
+
* Nothing about the URL, token or body is logged.
|
|
21
|
+
*
|
|
22
|
+
* @module controllers/connector/remote-mcp-proxy.controller
|
|
23
|
+
*/
|
|
24
|
+
import { Readable } from 'stream';
|
|
25
|
+
import { LoggerService } from '../../services/core/logger.service.js';
|
|
26
|
+
import { getCallerIdentity } from '../../middleware/caller-identity.middleware.js';
|
|
27
|
+
import { resolveAgentCaller } from '../../utils/agent-caller.utils.js';
|
|
28
|
+
import { ConnectorAccessService } from '../../services/connector/connector-access.service.js';
|
|
29
|
+
import { RemoteMcpService, remoteMcpConnectorId } from '../../services/connector/remote-mcp.service.js';
|
|
30
|
+
import { RemoteMcpAuthService } from '../../services/connector/remote-mcp-auth.service.js';
|
|
31
|
+
import { REMOTE_MCP_CONSTANTS } from '../../constants.js';
|
|
32
|
+
const logger = LoggerService.getInstance().createComponentLogger('RemoteMcpProxy');
|
|
33
|
+
const C = REMOTE_MCP_CONSTANTS;
|
|
34
|
+
/** Request headers passed upstream. */
|
|
35
|
+
const FORWARD_REQUEST = ['content-type', 'accept', 'mcp-session-id', 'mcp-protocol-version', 'last-event-id'];
|
|
36
|
+
/** Response headers passed back. */
|
|
37
|
+
const FORWARD_RESPONSE = ['content-type', 'mcp-session-id', 'mcp-protocol-version', 'cache-control'];
|
|
38
|
+
let deps = {
|
|
39
|
+
servers: () => RemoteMcpService.getInstance(),
|
|
40
|
+
auth: () => RemoteMcpAuthService.getInstance(),
|
|
41
|
+
access: () => ConnectorAccessService.getInstance(),
|
|
42
|
+
fetchImpl: (url, init) => fetch(url, init),
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Replace collaborators (tests).
|
|
46
|
+
*
|
|
47
|
+
* @param next - Partial overrides
|
|
48
|
+
*/
|
|
49
|
+
export function setRemoteMcpProxyDeps(next) {
|
|
50
|
+
deps = { ...deps, ...next };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The JSON-RPC id of a request body, if it is a request (not a notification).
|
|
54
|
+
*
|
|
55
|
+
* @param body - Raw body
|
|
56
|
+
* @returns The id, or undefined
|
|
57
|
+
*/
|
|
58
|
+
export function rpcIdOf(body) {
|
|
59
|
+
if (!body)
|
|
60
|
+
return undefined;
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(body);
|
|
63
|
+
const first = Array.isArray(parsed) ? parsed[0] : parsed;
|
|
64
|
+
return first && 'id' in first ? first.id : undefined;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Answer the agent without reaching the server.
|
|
72
|
+
*
|
|
73
|
+
* @param res - Response
|
|
74
|
+
* @param body - Raw request body (decides JSON-RPC error vs plain)
|
|
75
|
+
* @param message - What the agent should know
|
|
76
|
+
* @param httpStatus - Status when it is not a JSON-RPC request
|
|
77
|
+
*/
|
|
78
|
+
function refuse(res, body, message, httpStatus, rpcCode = -32000) {
|
|
79
|
+
const id = rpcIdOf(body);
|
|
80
|
+
if (id !== undefined) {
|
|
81
|
+
res.status(200).json({ jsonrpc: '2.0', id, error: { code: rpcCode, message } });
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
res.status(httpStatus).json({ success: false, error: message });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* ALL /api/connectors/remote-mcp/:id/mcp
|
|
88
|
+
*
|
|
89
|
+
* @param req - Agent request (JSON-RPC over streamable HTTP)
|
|
90
|
+
* @param res - The server's answer, streamed
|
|
91
|
+
*/
|
|
92
|
+
export async function proxyRemoteMcp(req, res) {
|
|
93
|
+
const id = String(req.params.id ?? '');
|
|
94
|
+
const raw = req.rawBody;
|
|
95
|
+
const body = req.method === 'POST' ? (raw ?? (req.body && Object.keys(req.body).length ? JSON.stringify(req.body) : undefined)) : undefined;
|
|
96
|
+
const identity = getCallerIdentity(req);
|
|
97
|
+
if (identity.kind !== 'agent') {
|
|
98
|
+
res.status(403).json({ success: false, error: 'agents_only', message: 'This endpoint is for Crewly agents. The owner manages servers in Connections.' });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const caller = await resolveAgentCaller(req);
|
|
102
|
+
let server;
|
|
103
|
+
try {
|
|
104
|
+
server = await deps.servers().get(id);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
server = undefined;
|
|
108
|
+
}
|
|
109
|
+
if (!server) {
|
|
110
|
+
refuse(res, body, 'No such remote MCP server on this machine.', 404);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (!(await deps.access().isAllowed(remoteMcpConnectorId(server.id), caller.role || 'unknown'))) {
|
|
114
|
+
const allowed = await deps.access().allowedRoles(remoteMcpConnectorId(server.id)).catch(() => []);
|
|
115
|
+
logger.warn('Remote MCP proxy: role not allowed', { id, session: caller.session, role: caller.role, allowed });
|
|
116
|
+
refuse(res, body, `Your role (${caller.role}) may not use ${server.label}. The owner limited it to: ${allowed.join(', ')}.`, 403);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const auth = deps.auth();
|
|
120
|
+
const oauth = await auth.usesOAuth(server.id);
|
|
121
|
+
const needsSignIn = async () => {
|
|
122
|
+
void auth.onUnauthorized(server, caller.session).catch(() => undefined);
|
|
123
|
+
logger.info('Remote MCP proxy: owner sign-in needed', { id, session: caller.session });
|
|
124
|
+
refuse(res, body, `${server.label} needs the owner to sign in once. A sign-in link was sent to the owner in Slack (and is on the Connections page). Tell the owner, then try again after they authorize.`, 503, C.PROXY_NEEDS_AUTH_RPC_CODE);
|
|
125
|
+
};
|
|
126
|
+
let token = null;
|
|
127
|
+
if (oauth) {
|
|
128
|
+
token = await auth.getAccessToken(server.id);
|
|
129
|
+
if (!token) {
|
|
130
|
+
await needsSignIn();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const controller = new AbortController();
|
|
135
|
+
// `close` on the response fires when the agent goes away (or we finish).
|
|
136
|
+
res.on('close', () => controller.abort());
|
|
137
|
+
const send = (bearer) => {
|
|
138
|
+
const headers = { ...(server.headers ?? {}) };
|
|
139
|
+
for (const name of FORWARD_REQUEST) {
|
|
140
|
+
const v = req.headers[name];
|
|
141
|
+
if (typeof v === 'string' && v)
|
|
142
|
+
headers[name] = v;
|
|
143
|
+
}
|
|
144
|
+
if (!headers['accept'])
|
|
145
|
+
headers['accept'] = 'application/json, text/event-stream';
|
|
146
|
+
if (bearer)
|
|
147
|
+
headers['Authorization'] = `Bearer ${bearer}`;
|
|
148
|
+
return deps.fetchImpl(server.url, { method: req.method, headers, ...(body !== undefined ? { body } : {}), signal: controller.signal });
|
|
149
|
+
};
|
|
150
|
+
let upstream;
|
|
151
|
+
try {
|
|
152
|
+
upstream = await send(token);
|
|
153
|
+
if (upstream.status === 401 && oauth) {
|
|
154
|
+
await upstream.text().catch(() => '');
|
|
155
|
+
const fresh = await auth.getAccessToken(server.id, { force: true });
|
|
156
|
+
if (!fresh) {
|
|
157
|
+
await needsSignIn();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
upstream = await send(fresh);
|
|
161
|
+
if (upstream.status === 401) {
|
|
162
|
+
await upstream.text().catch(() => '');
|
|
163
|
+
await needsSignIn();
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else if (upstream.status === 401) {
|
|
168
|
+
// A static-key server refused: the URL/key is wrong, or it moved to OAuth.
|
|
169
|
+
await upstream.text().catch(() => '');
|
|
170
|
+
logger.warn('Remote MCP proxy: upstream refused a static-key server', { id });
|
|
171
|
+
refuse(res, body, `${server.label} refused the request (401). The owner should press Test on it in Connections.`, 502);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
if (controller.signal.aborted)
|
|
177
|
+
return;
|
|
178
|
+
logger.warn('Remote MCP proxy: upstream unreachable', { id, error: err instanceof Error ? err.name : 'unknown' });
|
|
179
|
+
refuse(res, body, `${server.label} is unreachable right now.`, 502);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
res.status(upstream.status);
|
|
183
|
+
for (const name of FORWARD_RESPONSE) {
|
|
184
|
+
const v = upstream.headers.get(name);
|
|
185
|
+
if (v)
|
|
186
|
+
res.setHeader(name, v);
|
|
187
|
+
}
|
|
188
|
+
if ((upstream.headers.get('content-type') ?? '').includes('text/event-stream')) {
|
|
189
|
+
res.setHeader('X-Accel-Buffering', 'no');
|
|
190
|
+
res.flushHeaders();
|
|
191
|
+
}
|
|
192
|
+
if (!upstream.body) {
|
|
193
|
+
res.end();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const stream = Readable.fromWeb(upstream.body);
|
|
197
|
+
stream.on('error', () => {
|
|
198
|
+
if (!res.writableEnded)
|
|
199
|
+
res.end();
|
|
200
|
+
});
|
|
201
|
+
stream.pipe(res);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=remote-mcp-proxy.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-mcp-proxy.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp-proxy.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAwB,MAAM,gDAAgD,CAAC;AAC9H,OAAO,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACnF,MAAM,CAAC,GAAG,oBAAoB,CAAC;AAE/B,uCAAuC;AACvC,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC;AAC9G,oCAAoC;AACpC,MAAM,gBAAgB,GAAG,CAAC,cAAc,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC;AAkBrG,IAAI,IAAI,GAAc;IACpB,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,WAAW,EAAE;IAC7C,IAAI,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,WAAW,EAAE;IAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,WAAW,EAAE;IAClD,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAyC;CACnF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAwB;IAC5D,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAwB;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA6E,CAAC;QAC5G,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACzD,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,MAAM,CAAC,GAAa,EAAE,IAAwB,EAAE,OAAe,EAAE,UAAkB,EAAE,OAAO,GAAG,CAAC,KAAK;IAC5G,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAY,EAAE,GAAa;IAC9D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,GAAG,GAAI,GAAsC,CAAC,OAAO,CAAC;IAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtJ,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,+EAA+E,EAAE,CAAC,CAAC;QACzJ,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,MAAmC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,4CAA4C,EAAE,GAAG,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC;QAChG,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;QAC9G,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/G,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,MAAM,CAAC,IAAI,iBAAiB,MAAM,CAAC,KAAK,8BAA8B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClI,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC5C,KAAK,IAAI,CAAC,cAAc,CAAC,MAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,MAAM,CACJ,GAAG,EACH,IAAI,EACJ,GAAG,MAAO,CAAC,KAAK,wKAAwK,EACxL,GAAG,EACH,CAAC,CAAC,yBAAyB,CAC5B,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,yEAAyE;IACzE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAE1C,MAAM,IAAI,GAAG,CAAC,MAAqB,EAA6B,EAAE;QAChE,MAAM,OAAO,GAA2B,EAAE,GAAG,CAAC,MAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,qCAAqC,CAAC;QAClF,IAAI,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,MAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1I,CAAC,CAAC;IAEF,IAAI,QAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YACrC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,WAAW,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,WAAW,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,2EAA2E;YAC3E,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,wDAAwD,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9E,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,+EAA+E,EAAE,GAAG,CAAC,CAAC;YACvH,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QACtC,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAClH,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,4BAA4B,EAAE,GAAG,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACzC,GAAG,CAAC,YAAY,EAAE,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAsD,CAAC,CAAC;IACjG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -10,6 +10,13 @@
|
|
|
10
10
|
* - POST /api/connectors/remote-mcp/:id/rename — same as PATCH (relay: GET/POST only)
|
|
11
11
|
* - POST /api/connectors/remote-mcp/:id/remove — same as DELETE (relay: GET/POST only)
|
|
12
12
|
* - POST /api/connectors/remote-mcp/:id/access — `{ allowedRoles }` for this server only
|
|
13
|
+
* - POST /api/connectors/remote-mcp/:id/authorize — start (or reuse) an OAuth sign-in → `{ url, expiresAt, posted }`
|
|
14
|
+
*
|
|
15
|
+
* OAuth servers (Zoho MCP answers 401 + `resource_metadata`) are detected on
|
|
16
|
+
* add and on test: the response then carries `authorize: { url, expiresAt }`
|
|
17
|
+
* — a single-use Crewly Cloud link the owner can open on a phone — and the
|
|
18
|
+
* owner gets the same link as a Slack card. Each server's view carries
|
|
19
|
+
* `auth` (needs_auth / connected / error, scopes, expiry).
|
|
13
20
|
*
|
|
14
21
|
* Which agents get a server is its `mcp:<id>` allowlist
|
|
15
22
|
* (`PUT /api/connectors/access/mcp:<id>`). Changes reach an agent the next
|
|
@@ -55,6 +62,15 @@ export declare function removeRemoteMcp(req: Request, res: Response): Promise<vo
|
|
|
55
62
|
* @param res - `{ success, data: { ok, toolCount, tools, serverName? } | { ok: false, error } }`
|
|
56
63
|
*/
|
|
57
64
|
export declare function testRemoteMcp(req: Request, res: Response): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* POST /api/connectors/remote-mcp/:id/authorize — body `{ notify? }`.
|
|
67
|
+
* Starts (or reuses) an OAuth sign-in and returns its phone-friendly link;
|
|
68
|
+
* `notify: true` also posts it to the owner in Slack.
|
|
69
|
+
*
|
|
70
|
+
* @param req - Request
|
|
71
|
+
* @param res - `{ success, data: { url, expiresAt, posted } }`
|
|
72
|
+
*/
|
|
73
|
+
export declare function authorizeRemoteMcp(req: Request, res: Response): Promise<void>;
|
|
58
74
|
/**
|
|
59
75
|
* POST /api/connectors/remote-mcp/:id/access — body `{ allowedRoles: string[] }`
|
|
60
76
|
* (empty = every agent). The same rule as `PUT /api/connectors/access/mcp:<id>`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-mcp.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"remote-mcp.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYjD,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,qFAAqF,CAAC;AAwEnH;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9E;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC7E;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAahF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAahF;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9E;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnF;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnF"}
|
|
@@ -10,6 +10,13 @@
|
|
|
10
10
|
* - POST /api/connectors/remote-mcp/:id/rename — same as PATCH (relay: GET/POST only)
|
|
11
11
|
* - POST /api/connectors/remote-mcp/:id/remove — same as DELETE (relay: GET/POST only)
|
|
12
12
|
* - POST /api/connectors/remote-mcp/:id/access — `{ allowedRoles }` for this server only
|
|
13
|
+
* - POST /api/connectors/remote-mcp/:id/authorize — start (or reuse) an OAuth sign-in → `{ url, expiresAt, posted }`
|
|
14
|
+
*
|
|
15
|
+
* OAuth servers (Zoho MCP answers 401 + `resource_metadata`) are detected on
|
|
16
|
+
* add and on test: the response then carries `authorize: { url, expiresAt }`
|
|
17
|
+
* — a single-use Crewly Cloud link the owner can open on a phone — and the
|
|
18
|
+
* owner gets the same link as a Slack card. Each server's view carries
|
|
19
|
+
* `auth` (needs_auth / connected / error, scopes, expiry).
|
|
13
20
|
*
|
|
14
21
|
* Which agents get a server is its `mcp:<id>` allowlist
|
|
15
22
|
* (`PUT /api/connectors/access/mcp:<id>`). Changes reach an agent the next
|
|
@@ -22,6 +29,8 @@ import { rejectNonOwner } from '../../middleware/caller-identity.middleware.js';
|
|
|
22
29
|
import { RemoteMcpService, RemoteMcpValidationError, remoteMcpConnectorId, toView } from '../../services/connector/remote-mcp.service.js';
|
|
23
30
|
import { ConnectorAccessService } from '../../services/connector/connector-access.service.js';
|
|
24
31
|
import { probeRemoteMcp } from '../../services/connector/remote-mcp-probe.service.js';
|
|
32
|
+
import { RemoteMcpAuthError, RemoteMcpAuthService } from '../../services/connector/remote-mcp-auth.service.js';
|
|
33
|
+
import { parseWwwAuthenticate } from '../../services/connector/remote-mcp-oauth.js';
|
|
25
34
|
const logger = LoggerService.getInstance().createComponentLogger('RemoteMcpController');
|
|
26
35
|
/** Told to the owner after every change. */
|
|
27
36
|
export const NEXT_LAUNCH_NOTE = 'Agents pick this up the next time they start (restart an agent to apply it now).';
|
|
@@ -43,6 +52,57 @@ function fail(res, err, what) {
|
|
|
43
52
|
logger.error(`Remote MCP: ${what} failed`, { error: err instanceof Error ? err.message : String(err) });
|
|
44
53
|
res.status(500).json({ success: false, error: 'internal', message: `Could not ${what} the remote MCP server` });
|
|
45
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* A server's view plus its sign-in state.
|
|
57
|
+
*
|
|
58
|
+
* @param server - Stored server
|
|
59
|
+
* @returns View with `auth` for OAuth servers
|
|
60
|
+
*/
|
|
61
|
+
async function viewWithAuth(server) {
|
|
62
|
+
const auth = await RemoteMcpAuthService.getInstance().view(server.id).catch(() => undefined);
|
|
63
|
+
return { ...toView(server), ...(auth ? { auth } : {}) };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Start a sign-in and describe the outcome for a response.
|
|
67
|
+
*
|
|
68
|
+
* @param server - Stored server
|
|
69
|
+
* @param challenge - Raw `WWW-Authenticate`, when a probe saw one
|
|
70
|
+
* @param notify - Post the Slack card too
|
|
71
|
+
* @returns `{ url, expiresAt, posted }`, or `{ error }`
|
|
72
|
+
*/
|
|
73
|
+
async function startSignIn(server, challenge, notify) {
|
|
74
|
+
try {
|
|
75
|
+
return await RemoteMcpAuthService.getInstance().startAuthorization(server, {
|
|
76
|
+
notify,
|
|
77
|
+
...(challenge !== undefined ? { challenge: parseWwwAuthenticate(challenge) } : {}),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
const message = err instanceof RemoteMcpAuthError ? err.message : 'Could not start the sign-in.';
|
|
82
|
+
logger.warn('Remote MCP: sign-in not started', { id: server.id, error: message });
|
|
83
|
+
return { error: message };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Probe a server, with its OAuth token when it has one (refreshed once on 401).
|
|
88
|
+
*
|
|
89
|
+
* @param server - Stored server
|
|
90
|
+
* @returns Probe result
|
|
91
|
+
*/
|
|
92
|
+
async function probeWithAuth(server) {
|
|
93
|
+
const auth = RemoteMcpAuthService.getInstance();
|
|
94
|
+
if (!(await auth.usesOAuth(server.id)))
|
|
95
|
+
return probeRemoteMcp(server);
|
|
96
|
+
const run = async (token) => probeRemoteMcp({ url: server.url, headers: { ...(server.headers ?? {}), ...(token ? { Authorization: `Bearer ${token}` } : {}) } });
|
|
97
|
+
const token = await auth.getAccessToken(server.id);
|
|
98
|
+
if (!token)
|
|
99
|
+
return { ok: false, error: 'Sign in to this server first.', needsAuth: true };
|
|
100
|
+
const first = await run(token);
|
|
101
|
+
if (first.ok || !first.needsAuth)
|
|
102
|
+
return first;
|
|
103
|
+
const fresh = await auth.getAccessToken(server.id, { force: true });
|
|
104
|
+
return fresh ? run(fresh) : first;
|
|
105
|
+
}
|
|
46
106
|
/**
|
|
47
107
|
* GET /api/connectors/remote-mcp
|
|
48
108
|
*
|
|
@@ -54,7 +114,7 @@ export async function listRemoteMcp(req, res) {
|
|
|
54
114
|
return;
|
|
55
115
|
try {
|
|
56
116
|
const servers = await RemoteMcpService.getInstance().list();
|
|
57
|
-
res.json({ success: true, data: servers.map(
|
|
117
|
+
res.json({ success: true, data: await Promise.all(servers.map(viewWithAuth)) });
|
|
58
118
|
}
|
|
59
119
|
catch (err) {
|
|
60
120
|
fail(res, err, 'list');
|
|
@@ -71,13 +131,35 @@ export async function addRemoteMcp(req, res) {
|
|
|
71
131
|
return;
|
|
72
132
|
try {
|
|
73
133
|
const body = (req.body ?? {});
|
|
134
|
+
const clientId = typeof body.oauthClientId === 'string' ? body.oauthClientId.trim() : '';
|
|
135
|
+
const clientSecret = typeof body.oauthClientSecret === 'string' ? body.oauthClientSecret.trim() : '';
|
|
136
|
+
if ((clientId && !/^[\x21-\x7e]{1,256}$/.test(clientId)) || (clientSecret && !/^[\x21-\x7e]{1,512}$/.test(clientSecret))) {
|
|
137
|
+
res.status(400).json({ success: false, error: 'validation', message: 'The OAuth client ID / secret must be single-line text.' });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
74
140
|
const server = await RemoteMcpService.getInstance().add({
|
|
75
141
|
label: typeof body.label === 'string' ? body.label : '',
|
|
76
142
|
url: typeof body.url === 'string' ? body.url : '',
|
|
77
143
|
headers: body.headers,
|
|
78
144
|
provider: typeof body.provider === 'string' ? body.provider : undefined,
|
|
79
145
|
});
|
|
80
|
-
|
|
146
|
+
// Does it want OAuth? (Zoho MCP: 401 + resource_metadata.) Then start the
|
|
147
|
+
// sign-in right away and send the owner the phone link.
|
|
148
|
+
const auth = RemoteMcpAuthService.getInstance();
|
|
149
|
+
if (clientId)
|
|
150
|
+
await auth.setManualClient(server.id, { clientId, ...(clientSecret ? { clientSecret } : {}) });
|
|
151
|
+
const challenge = await auth.detect(server);
|
|
152
|
+
let authorize;
|
|
153
|
+
if (challenge) {
|
|
154
|
+
try {
|
|
155
|
+
await auth.markOAuth(server, challenge);
|
|
156
|
+
authorize = await startSignIn(server, undefined, true);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
authorize = { error: err instanceof RemoteMcpAuthError ? err.message : 'Could not work out how to sign in to this server.' };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
res.status(201).json({ success: true, data: await viewWithAuth(server), ...(authorize ? { authorize } : {}), note: NEXT_LAUNCH_NOTE });
|
|
81
163
|
}
|
|
82
164
|
catch (err) {
|
|
83
165
|
fail(res, err, 'add');
|
|
@@ -116,6 +198,8 @@ export async function removeRemoteMcp(req, res) {
|
|
|
116
198
|
return;
|
|
117
199
|
try {
|
|
118
200
|
const removed = await RemoteMcpService.getInstance().remove(String(req.params.id ?? ''));
|
|
201
|
+
if (removed)
|
|
202
|
+
await RemoteMcpAuthService.getInstance().forget(String(req.params.id ?? '')).catch(() => undefined);
|
|
119
203
|
if (!removed) {
|
|
120
204
|
res.status(404).json({ success: false, error: 'not_found', message: 'No such remote MCP server' });
|
|
121
205
|
return;
|
|
@@ -141,14 +225,51 @@ export async function testRemoteMcp(req, res) {
|
|
|
141
225
|
res.status(404).json({ success: false, error: 'not_found', message: 'No such remote MCP server' });
|
|
142
226
|
return;
|
|
143
227
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
228
|
+
let result = await probeWithAuth(server);
|
|
229
|
+
let authorize;
|
|
230
|
+
if (!result.ok && result.needsAuth) {
|
|
231
|
+
authorize = await startSignIn(server, result.wwwAuthenticate, true);
|
|
232
|
+
result = { ok: false, needsAuth: true, error: 'The server wants you to sign in once. Open the authorize link (it works on your phone).' };
|
|
233
|
+
}
|
|
234
|
+
logger.info('Remote MCP test', { id: server.id, ok: result.ok, toolCount: result.ok ? result.toolCount : undefined, needsAuth: !result.ok && !!result.needsAuth });
|
|
235
|
+
// Never hand the raw challenge to a client.
|
|
236
|
+
const data = result.ok ? result : { ok: false, error: result.error, ...(result.needsAuth ? { needsAuth: true } : {}) };
|
|
237
|
+
res.json({ success: true, data, ...(authorize ? { authorize } : {}), server: await viewWithAuth(server) });
|
|
147
238
|
}
|
|
148
239
|
catch (err) {
|
|
149
240
|
fail(res, err, 'test');
|
|
150
241
|
}
|
|
151
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* POST /api/connectors/remote-mcp/:id/authorize — body `{ notify? }`.
|
|
245
|
+
* Starts (or reuses) an OAuth sign-in and returns its phone-friendly link;
|
|
246
|
+
* `notify: true` also posts it to the owner in Slack.
|
|
247
|
+
*
|
|
248
|
+
* @param req - Request
|
|
249
|
+
* @param res - `{ success, data: { url, expiresAt, posted } }`
|
|
250
|
+
*/
|
|
251
|
+
export async function authorizeRemoteMcp(req, res) {
|
|
252
|
+
if (rejectNonOwner(req, res, AGENT_REFUSAL))
|
|
253
|
+
return;
|
|
254
|
+
try {
|
|
255
|
+
const server = await RemoteMcpService.getInstance().get(String(req.params.id ?? ''));
|
|
256
|
+
if (!server) {
|
|
257
|
+
res.status(404).json({ success: false, error: 'not_found', message: 'No such remote MCP server' });
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const notify = req.body?.notify === true;
|
|
261
|
+
const out = await startSignIn(server, undefined, notify);
|
|
262
|
+
if ('error' in out) {
|
|
263
|
+
res.status(409).json({ success: false, error: 'authorize_failed', message: out.error });
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
267
|
+
res.json({ success: true, data: out });
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
fail(res, err, 'authorize');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
152
273
|
/**
|
|
153
274
|
* POST /api/connectors/remote-mcp/:id/access — body `{ allowedRoles: string[] }`
|
|
154
275
|
* (empty = every agent). The same rule as `PUT /api/connectors/access/mcp:<id>`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-mcp.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gDAAgD,CAAC;AAC1I,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;AAEtF,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;AAExF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,kFAAkF,CAAC;AAEnH,6BAA6B;AAC7B,MAAM,aAAa,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAC;AAEtI;;;;;;GAMG;AACH,SAAS,IAAI,CAAC,GAAa,EAAE,GAAY,EAAE,IAAY;IACrD,IAAI,GAAG,YAAY,wBAAwB,EAAE,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IACD,6DAA6D;IAC7D,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,IAAI,wBAAwB,EAAE,CAAC,CAAC;AAClH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAY,EAAE,GAAa;IAC7D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5D,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,GAAa;IAC5D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA8E,CAAC;QAC3G,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;YACtD,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACvD,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjD,OAAO,EAAE,IAAI,CAAC,OAA6C;YAC3D,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACxE,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa;IAC/D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,KAAK,GAAI,GAAG,CAAC,IAAwC,EAAE,KAAK,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChI,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa;IAC/D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAY,EAAE,GAAa;IAC7D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACtH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY,EAAE,GAAa;IAClE,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA+B,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC,CAAC;YAC5I,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9H,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"remote-mcp.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,15 +19,26 @@ export interface SlackOrigin {
|
|
|
19
19
|
threadTs?: string;
|
|
20
20
|
botToken?: string;
|
|
21
21
|
}
|
|
22
|
+
/** Human names for the products, for the card's first line. */
|
|
23
|
+
export declare const PRODUCT_LABELS: Record<string, string>;
|
|
22
24
|
/**
|
|
23
25
|
* Build the card. Pure, so the wording is testable without Slack.
|
|
24
26
|
*
|
|
27
|
+
* A reconnect (`reconnect`) replaces the generic "Needs access" with the
|
|
28
|
+
* reason the harness hit — "Gmail needs re-authorization to save drafts" —
|
|
29
|
+
* and names the Google account, because an owner with two Gmail logins has
|
|
30
|
+
* to know which one to pick.
|
|
31
|
+
*
|
|
25
32
|
* @param product - Product needing consent
|
|
26
33
|
* @param url - The ticket link behind the button
|
|
27
34
|
* @param expiresAt - When the link stops working
|
|
35
|
+
* @param reconnect - Why a working connection needs the owner again, and for which account
|
|
28
36
|
* @returns Block Kit blocks and the fallback text
|
|
29
37
|
*/
|
|
30
|
-
export declare function buildConnectCard(product: string, url: string, expiresAt: string
|
|
38
|
+
export declare function buildConnectCard(product: string, url: string, expiresAt: string, reconnect?: {
|
|
39
|
+
message: string;
|
|
40
|
+
account?: string;
|
|
41
|
+
}): {
|
|
31
42
|
text: string;
|
|
32
43
|
blocks: unknown[];
|
|
33
44
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-connect-card.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/google/google-connect-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKzE,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"google-connect-card.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/google/google-connect-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKzE,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIjD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAoCrC;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClE,+CAA+C;IAC/C,UAAU,EAAE,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,8CAA8C;IAC9C,aAAa,EAAE,CACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI,CAErE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DhF"}
|