@apify/mcpc 0.1.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.
Files changed (178) hide show
  1. package/.claude/settings.local.json +36 -0
  2. package/.eslintrc.json +44 -0
  3. package/.idea/codeStyles/Project.xml +60 -0
  4. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  5. package/.idea/inspectionProfiles/Project_Default.xml +11 -0
  6. package/.idea/prettier.xml +6 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/.idea/workspace.xml +572 -0
  9. package/LICENSE +201 -0
  10. package/PHASE1-SUMMARY.md +269 -0
  11. package/PUBLISHING.md +111 -0
  12. package/README.md +1056 -0
  13. package/TESTING.md +212 -0
  14. package/TODOs.md +94 -0
  15. package/bin/mcpc +9 -0
  16. package/bin/mcpc-bridge +9 -0
  17. package/dist/bridge/index.d.ts +3 -0
  18. package/dist/bridge/index.d.ts.map +1 -0
  19. package/dist/bridge/index.js +587 -0
  20. package/dist/bridge/index.js.map +1 -0
  21. package/dist/cli/commands/auth.d.ts +9 -0
  22. package/dist/cli/commands/auth.d.ts.map +1 -0
  23. package/dist/cli/commands/auth.js +81 -0
  24. package/dist/cli/commands/auth.js.map +1 -0
  25. package/dist/cli/commands/clean.d.ts +11 -0
  26. package/dist/cli/commands/clean.d.ts.map +1 -0
  27. package/dist/cli/commands/clean.js +224 -0
  28. package/dist/cli/commands/clean.js.map +1 -0
  29. package/dist/cli/commands/index.d.ts +8 -0
  30. package/dist/cli/commands/index.d.ts.map +1 -0
  31. package/dist/cli/commands/index.js +8 -0
  32. package/dist/cli/commands/index.js.map +1 -0
  33. package/dist/cli/commands/logging.d.ts +3 -0
  34. package/dist/cli/commands/logging.d.ts.map +1 -0
  35. package/dist/cli/commands/logging.js +22 -0
  36. package/dist/cli/commands/logging.js.map +1 -0
  37. package/dist/cli/commands/prompts.d.ts +6 -0
  38. package/dist/cli/commands/prompts.d.ts.map +1 -0
  39. package/dist/cli/commands/prompts.js +27 -0
  40. package/dist/cli/commands/prompts.js.map +1 -0
  41. package/dist/cli/commands/resources.d.ts +11 -0
  42. package/dist/cli/commands/resources.d.ts.map +1 -0
  43. package/dist/cli/commands/resources.js +70 -0
  44. package/dist/cli/commands/resources.js.map +1 -0
  45. package/dist/cli/commands/sessions.d.ts +28 -0
  46. package/dist/cli/commands/sessions.d.ts.map +1 -0
  47. package/dist/cli/commands/sessions.js +356 -0
  48. package/dist/cli/commands/sessions.js.map +1 -0
  49. package/dist/cli/commands/tools.d.ts +8 -0
  50. package/dist/cli/commands/tools.d.ts.map +1 -0
  51. package/dist/cli/commands/tools.js +54 -0
  52. package/dist/cli/commands/tools.js.map +1 -0
  53. package/dist/cli/commands/utilities.d.ts +3 -0
  54. package/dist/cli/commands/utilities.d.ts.map +1 -0
  55. package/dist/cli/commands/utilities.js +20 -0
  56. package/dist/cli/commands/utilities.js.map +1 -0
  57. package/dist/cli/helpers.d.ts +18 -0
  58. package/dist/cli/helpers.d.ts.map +1 -0
  59. package/dist/cli/helpers.js +165 -0
  60. package/dist/cli/helpers.js.map +1 -0
  61. package/dist/cli/index.d.ts +3 -0
  62. package/dist/cli/index.d.ts.map +1 -0
  63. package/dist/cli/index.js +326 -0
  64. package/dist/cli/index.js.map +1 -0
  65. package/dist/cli/output.d.ts +18 -0
  66. package/dist/cli/output.d.ts.map +1 -0
  67. package/dist/cli/output.js +221 -0
  68. package/dist/cli/output.js.map +1 -0
  69. package/dist/cli/parser.d.ts +19 -0
  70. package/dist/cli/parser.d.ts.map +1 -0
  71. package/dist/cli/parser.js +168 -0
  72. package/dist/cli/parser.js.map +1 -0
  73. package/dist/cli/shell-parser.d.ts +5 -0
  74. package/dist/cli/shell-parser.d.ts.map +1 -0
  75. package/dist/cli/shell-parser.js +38 -0
  76. package/dist/cli/shell-parser.js.map +1 -0
  77. package/dist/cli/shell.d.ts +2 -0
  78. package/dist/cli/shell.d.ts.map +1 -0
  79. package/dist/cli/shell.js +277 -0
  80. package/dist/cli/shell.js.map +1 -0
  81. package/dist/cli/tool-result.d.ts +2 -0
  82. package/dist/cli/tool-result.d.ts.map +1 -0
  83. package/dist/cli/tool-result.js +19 -0
  84. package/dist/cli/tool-result.js.map +1 -0
  85. package/dist/core/factory.d.ts +19 -0
  86. package/dist/core/factory.d.ts.map +1 -0
  87. package/dist/core/factory.js +55 -0
  88. package/dist/core/factory.js.map +1 -0
  89. package/dist/core/index.d.ts +4 -0
  90. package/dist/core/index.d.ts.map +1 -0
  91. package/dist/core/index.js +4 -0
  92. package/dist/core/index.js.map +1 -0
  93. package/dist/core/mcp-client.d.ts +30 -0
  94. package/dist/core/mcp-client.d.ts.map +1 -0
  95. package/dist/core/mcp-client.js +215 -0
  96. package/dist/core/mcp-client.js.map +1 -0
  97. package/dist/core/transports.d.ts +12 -0
  98. package/dist/core/transports.d.ts.map +1 -0
  99. package/dist/core/transports.js +65 -0
  100. package/dist/core/transports.js.map +1 -0
  101. package/dist/lib/auth/auth-profiles.d.ts +7 -0
  102. package/dist/lib/auth/auth-profiles.d.ts.map +1 -0
  103. package/dist/lib/auth/auth-profiles.js +105 -0
  104. package/dist/lib/auth/auth-profiles.js.map +1 -0
  105. package/dist/lib/auth/keychain.d.ts +22 -0
  106. package/dist/lib/auth/keychain.d.ts.map +1 -0
  107. package/dist/lib/auth/keychain.js +92 -0
  108. package/dist/lib/auth/keychain.js.map +1 -0
  109. package/dist/lib/auth/oauth-flow.d.ts +7 -0
  110. package/dist/lib/auth/oauth-flow.d.ts.map +1 -0
  111. package/dist/lib/auth/oauth-flow.js +236 -0
  112. package/dist/lib/auth/oauth-flow.js.map +1 -0
  113. package/dist/lib/auth/oauth-provider.d.ts +24 -0
  114. package/dist/lib/auth/oauth-provider.d.ts.map +1 -0
  115. package/dist/lib/auth/oauth-provider.js +144 -0
  116. package/dist/lib/auth/oauth-provider.js.map +1 -0
  117. package/dist/lib/auth/oauth-token-manager.d.ts +25 -0
  118. package/dist/lib/auth/oauth-token-manager.d.ts.map +1 -0
  119. package/dist/lib/auth/oauth-token-manager.js +70 -0
  120. package/dist/lib/auth/oauth-token-manager.js.map +1 -0
  121. package/dist/lib/auth/oauth-utils.d.ts +14 -0
  122. package/dist/lib/auth/oauth-utils.d.ts.map +1 -0
  123. package/dist/lib/auth/oauth-utils.js +68 -0
  124. package/dist/lib/auth/oauth-utils.js.map +1 -0
  125. package/dist/lib/auth/token-refresh.d.ts +2 -0
  126. package/dist/lib/auth/token-refresh.d.ts.map +1 -0
  127. package/dist/lib/auth/token-refresh.js +70 -0
  128. package/dist/lib/auth/token-refresh.js.map +1 -0
  129. package/dist/lib/bridge-client.d.ts +23 -0
  130. package/dist/lib/bridge-client.d.ts.map +1 -0
  131. package/dist/lib/bridge-client.js +181 -0
  132. package/dist/lib/bridge-client.js.map +1 -0
  133. package/dist/lib/bridge-manager.d.ts +17 -0
  134. package/dist/lib/bridge-manager.d.ts.map +1 -0
  135. package/dist/lib/bridge-manager.js +240 -0
  136. package/dist/lib/bridge-manager.js.map +1 -0
  137. package/dist/lib/config.d.ts +6 -0
  138. package/dist/lib/config.d.ts.map +1 -0
  139. package/dist/lib/config.js +116 -0
  140. package/dist/lib/config.js.map +1 -0
  141. package/dist/lib/errors.d.ts +23 -0
  142. package/dist/lib/errors.d.ts.map +1 -0
  143. package/dist/lib/errors.js +81 -0
  144. package/dist/lib/errors.js.map +1 -0
  145. package/dist/lib/file-lock.d.ts +2 -0
  146. package/dist/lib/file-lock.d.ts.map +1 -0
  147. package/dist/lib/file-lock.js +46 -0
  148. package/dist/lib/file-lock.js.map +1 -0
  149. package/dist/lib/file-logger.d.ts +19 -0
  150. package/dist/lib/file-logger.d.ts.map +1 -0
  151. package/dist/lib/file-logger.js +126 -0
  152. package/dist/lib/file-logger.js.map +1 -0
  153. package/dist/lib/index.d.ts +6 -0
  154. package/dist/lib/index.d.ts.map +1 -0
  155. package/dist/lib/index.js +6 -0
  156. package/dist/lib/index.js.map +1 -0
  157. package/dist/lib/logger.d.ts +24 -0
  158. package/dist/lib/logger.d.ts.map +1 -0
  159. package/dist/lib/logger.js +189 -0
  160. package/dist/lib/logger.js.map +1 -0
  161. package/dist/lib/session-client.d.ts +28 -0
  162. package/dist/lib/session-client.d.ts.map +1 -0
  163. package/dist/lib/session-client.js +104 -0
  164. package/dist/lib/session-client.js.map +1 -0
  165. package/dist/lib/sessions.d.ts +9 -0
  166. package/dist/lib/sessions.d.ts.map +1 -0
  167. package/dist/lib/sessions.js +116 -0
  168. package/dist/lib/sessions.js.map +1 -0
  169. package/dist/lib/types.d.ts +117 -0
  170. package/dist/lib/types.d.ts.map +1 -0
  171. package/dist/lib/types.js +2 -0
  172. package/dist/lib/types.js.map +1 -0
  173. package/dist/lib/utils.d.ts +29 -0
  174. package/dist/lib/utils.d.ts.map +1 -0
  175. package/dist/lib/utils.js +173 -0
  176. package/dist/lib/utils.js.map +1 -0
  177. package/package.json +71 -0
  178. package/tsconfig.test.json +11 -0
@@ -0,0 +1,70 @@
1
+ import { getAuthProfile, saveAuthProfile } from '../auth/auth-profiles.js';
2
+ import { createLogger } from '../logger.js';
3
+ import { createReauthError, DEFAULT_AUTH_PROFILE } from './oauth-utils.js';
4
+ import { readKeychainOAuthTokenInfo, storeKeychainOAuthTokenInfo, readKeychainOAuthClientInfo } from './keychain.js';
5
+ import { OAuthTokenManager } from './oauth-token-manager.js';
6
+ const logger = createLogger('token-refresh');
7
+ function createPersistenceCallback(serverUrl, profileName, profile, existingTokens) {
8
+ return async (newTokens) => {
9
+ const tokenInfo = {
10
+ accessToken: newTokens.access_token,
11
+ tokenType: newTokens.token_type,
12
+ };
13
+ if (newTokens.expires_in !== undefined) {
14
+ tokenInfo.expiresIn = newTokens.expires_in;
15
+ tokenInfo.expiresAt = Math.floor(Date.now() / 1000) + newTokens.expires_in;
16
+ }
17
+ const refreshToken = newTokens.refresh_token ?? existingTokens.refreshToken;
18
+ if (refreshToken) {
19
+ tokenInfo.refreshToken = refreshToken;
20
+ }
21
+ if (newTokens.scope !== undefined) {
22
+ tokenInfo.scope = newTokens.scope;
23
+ }
24
+ await storeKeychainOAuthTokenInfo(serverUrl, profileName, tokenInfo);
25
+ const updatedProfile = {
26
+ ...profile,
27
+ refreshedAt: new Date().toISOString(),
28
+ };
29
+ if (newTokens.scope) {
30
+ updatedProfile.scopes = newTokens.scope.split(' ');
31
+ }
32
+ await saveAuthProfile(updatedProfile);
33
+ logger.info(`Token refreshed and saved for profile: ${profileName}`);
34
+ };
35
+ }
36
+ export async function getValidAccessTokenFromKeychain(serverUrl, profileName = DEFAULT_AUTH_PROFILE) {
37
+ const profile = await getAuthProfile(serverUrl, profileName);
38
+ if (!profile) {
39
+ logger.debug(`No auth profile found for ${serverUrl} (profile: ${profileName})`);
40
+ return undefined;
41
+ }
42
+ const tokens = await readKeychainOAuthTokenInfo(serverUrl, profileName);
43
+ if (!tokens?.accessToken) {
44
+ logger.warn(`Auth profile exists but has no access token in keychain: ${profileName}`);
45
+ return undefined;
46
+ }
47
+ if (!tokens.refreshToken) {
48
+ if (tokens.expiresAt && Date.now() / 1000 > tokens.expiresAt - 60) {
49
+ throw createReauthError(serverUrl, profileName, 'Authentication token expired and no refresh token available');
50
+ }
51
+ logger.debug(`Using auth profile: ${profileName}`);
52
+ return tokens.accessToken;
53
+ }
54
+ const clientInfo = await readKeychainOAuthClientInfo(serverUrl, profileName);
55
+ if (!clientInfo?.clientId) {
56
+ throw createReauthError(serverUrl, profileName, 'OAuth client ID not found in keychain (required for token refresh)');
57
+ }
58
+ const tokenManager = new OAuthTokenManager({
59
+ serverUrl,
60
+ profileName,
61
+ clientId: clientInfo.clientId,
62
+ refreshToken: tokens.refreshToken,
63
+ accessToken: tokens.accessToken,
64
+ ...(tokens.expiresAt !== undefined && { accessTokenExpiresAt: tokens.expiresAt }),
65
+ onTokenRefresh: createPersistenceCallback(serverUrl, profileName, profile, tokens),
66
+ });
67
+ logger.debug(`Using auth profile: ${profileName}`);
68
+ return await tokenManager.getValidAccessToken();
69
+ }
70
+ //# sourceMappingURL=token-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-refresh.js","sourceRoot":"","sources":["../../../src/lib/auth/token-refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { IpcMessage } from './types.js';
3
+ export declare class BridgeClient extends EventEmitter {
4
+ private socket;
5
+ private socketPath;
6
+ private buffer;
7
+ private pendingRequests;
8
+ constructor(socketPath: string);
9
+ connect(): Promise<void>;
10
+ private setupSocket;
11
+ private handleMessage;
12
+ request(method: string, params?: unknown): Promise<unknown>;
13
+ send(message: IpcMessage): void;
14
+ sendAuthCredentials(credentials: {
15
+ serverUrl: string;
16
+ profileName: string;
17
+ refreshToken?: string;
18
+ headers?: Record<string, string>;
19
+ }): void;
20
+ close(): Promise<void>;
21
+ private cleanup;
22
+ }
23
+ //# sourceMappingURL=bridge-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-client.d.ts","sourceRoot":"","sources":["../../src/lib/bridge-client.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAa/D,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,eAAe,CAIlB;gBAEO,UAAU,EAAE,MAAM;IASxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD9B,OAAO,CAAC,WAAW;IAqCnB,OAAO,CAAC,aAAa;IA+Cf,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCjE,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAa/B,mBAAmB,CAAC,WAAW,EAAE;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,IAAI;IAUR,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,OAAO,CAAC,OAAO;CAehB"}
@@ -0,0 +1,181 @@
1
+ import { connect } from 'net';
2
+ import { EventEmitter } from 'events';
3
+ import { createLogger } from './logger.js';
4
+ import { NetworkError, ClientError, ServerError, AuthError } from './errors.js';
5
+ import { generateRequestId } from './utils.js';
6
+ const logger = createLogger('bridge-client');
7
+ const REQUEST_TIMEOUT = 3 * 60 * 1000;
8
+ const CONNECT_TIMEOUT = 5 * 1000;
9
+ export class BridgeClient extends EventEmitter {
10
+ socket = null;
11
+ socketPath;
12
+ buffer = '';
13
+ pendingRequests = new Map();
14
+ constructor(socketPath) {
15
+ super();
16
+ this.socketPath = socketPath;
17
+ }
18
+ async connect() {
19
+ if (this.socket) {
20
+ return;
21
+ }
22
+ return new Promise((resolve, reject) => {
23
+ logger.debug(`Connecting to bridge socket: ${this.socketPath}`);
24
+ let settled = false;
25
+ const settle = (fn) => {
26
+ if (!settled) {
27
+ settled = true;
28
+ clearTimeout(timeoutId);
29
+ fn();
30
+ }
31
+ };
32
+ const timeoutId = setTimeout(() => {
33
+ settle(() => {
34
+ logger.debug(`Socket connection timeout after ${CONNECT_TIMEOUT}ms`);
35
+ if (this.socket) {
36
+ this.socket.destroy();
37
+ this.socket = null;
38
+ }
39
+ reject(new NetworkError(`Connection to bridge timed out`));
40
+ });
41
+ }, CONNECT_TIMEOUT);
42
+ this.socket = connect(this.socketPath);
43
+ this.socket.on('connect', () => {
44
+ settle(() => {
45
+ logger.debug('Connected to bridge socket');
46
+ this.setupSocket();
47
+ resolve();
48
+ });
49
+ });
50
+ this.socket.on('error', (error) => {
51
+ settle(() => {
52
+ logger.debug('Socket connection error:', error.message);
53
+ this.socket = null;
54
+ reject(new NetworkError(`Failed to connect to bridge: ${error.message}`));
55
+ });
56
+ });
57
+ });
58
+ }
59
+ setupSocket() {
60
+ if (!this.socket)
61
+ return;
62
+ this.socket.on('data', (data) => {
63
+ this.buffer += data.toString();
64
+ let newlineIndex;
65
+ while ((newlineIndex = this.buffer.indexOf('\n')) !== -1) {
66
+ const line = this.buffer.slice(0, newlineIndex);
67
+ this.buffer = this.buffer.slice(newlineIndex + 1);
68
+ if (line.trim()) {
69
+ try {
70
+ const message = JSON.parse(line);
71
+ this.handleMessage(message);
72
+ }
73
+ catch (error) {
74
+ logger.error('Failed to parse message:', error);
75
+ }
76
+ }
77
+ }
78
+ });
79
+ this.socket.on('end', () => {
80
+ logger.debug('Socket disconnected');
81
+ this.cleanup();
82
+ });
83
+ this.socket.on('error', (error) => {
84
+ logger.error('Socket error:', error);
85
+ this.cleanup();
86
+ });
87
+ }
88
+ handleMessage(message) {
89
+ logger.debug('Received message:', { type: message.type, id: message.id });
90
+ if (message.type === 'response' && message.id) {
91
+ const pending = this.pendingRequests.get(message.id);
92
+ if (pending) {
93
+ clearTimeout(pending.timeoutId);
94
+ this.pendingRequests.delete(message.id);
95
+ if (message.error) {
96
+ let error;
97
+ switch (message.error.code) {
98
+ case 1:
99
+ error = new ClientError(message.error.message);
100
+ break;
101
+ case 2:
102
+ error = new ServerError(message.error.message);
103
+ break;
104
+ case 3:
105
+ error = new NetworkError(message.error.message);
106
+ break;
107
+ case 4:
108
+ error = new AuthError(message.error.message);
109
+ break;
110
+ default:
111
+ error = new Error(message.error.message);
112
+ }
113
+ pending.reject(error);
114
+ }
115
+ else {
116
+ pending.resolve(message.result);
117
+ }
118
+ }
119
+ }
120
+ else if (message.type === 'notification' && message.notification) {
121
+ const notification = message.notification;
122
+ logger.debug('Received notification:', notification.method);
123
+ this.emit('notification', notification);
124
+ }
125
+ }
126
+ async request(method, params) {
127
+ if (!this.socket) {
128
+ throw new NetworkError('Not connected to bridge');
129
+ }
130
+ const id = generateRequestId();
131
+ const message = {
132
+ type: 'request',
133
+ id,
134
+ method,
135
+ params,
136
+ };
137
+ logger.debug('Sending request:', { id, method });
138
+ const promise = new Promise((resolve, reject) => {
139
+ const timeoutId = setTimeout(() => {
140
+ this.pendingRequests.delete(id);
141
+ reject(new NetworkError(`Request timeout: ${method}`));
142
+ }, REQUEST_TIMEOUT);
143
+ this.pendingRequests.set(id, { resolve, reject, timeoutId });
144
+ });
145
+ const data = JSON.stringify(message) + '\n';
146
+ this.socket.write(data);
147
+ return promise;
148
+ }
149
+ send(message) {
150
+ if (!this.socket) {
151
+ throw new NetworkError('Not connected to bridge');
152
+ }
153
+ logger.debug('Sending message:', { type: message.type });
154
+ const data = JSON.stringify(message) + '\n';
155
+ this.socket.write(data);
156
+ }
157
+ sendAuthCredentials(credentials) {
158
+ this.send({
159
+ type: 'set-auth-credentials',
160
+ authCredentials: credentials,
161
+ });
162
+ }
163
+ close() {
164
+ logger.debug('Closing bridge client');
165
+ this.cleanup();
166
+ return Promise.resolve();
167
+ }
168
+ cleanup() {
169
+ for (const [id, pending] of this.pendingRequests.entries()) {
170
+ clearTimeout(pending.timeoutId);
171
+ pending.reject(new NetworkError('Connection closed'));
172
+ this.pendingRequests.delete(id);
173
+ }
174
+ if (this.socket) {
175
+ this.socket.end();
176
+ this.socket = null;
177
+ }
178
+ this.buffer = '';
179
+ }
180
+ }
181
+ //# sourceMappingURL=bridge-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-client.js","sourceRoot":"","sources":["../../src/lib/bridge-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { TransportConfig } from './types.js';
2
+ export interface StartBridgeOptions {
3
+ sessionName: string;
4
+ target: TransportConfig;
5
+ verbose?: boolean;
6
+ profileName?: string;
7
+ headers?: Record<string, string>;
8
+ }
9
+ export interface StartBridgeResult {
10
+ pid: number;
11
+ socketPath: string;
12
+ }
13
+ export declare function startBridge(options: StartBridgeOptions): Promise<StartBridgeResult>;
14
+ export declare function stopBridge(sessionName: string): Promise<void>;
15
+ export declare function restartBridge(sessionName: string): Promise<StartBridgeResult>;
16
+ export declare function ensureBridgeReady(sessionName: string): Promise<string>;
17
+ //# sourceMappingURL=bridge-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-manager.d.ts","sourceRoot":"","sources":["../../src/lib/bridge-manager.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAsBnE,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAiBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0FzF;AAMD,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCnE;AASD,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2DnF;AAkHD,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiE5E"}
@@ -0,0 +1,240 @@
1
+ import { spawn } from 'child_process';
2
+ import { unlink } from 'fs/promises';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { getBridgesDir, waitForFile, isProcessAlive, fileExists } from './utils.js';
6
+ import { updateSession, getSession } from './sessions.js';
7
+ import { createLogger } from './logger.js';
8
+ import { ClientError, NetworkError } from './errors.js';
9
+ import { BridgeClient } from './bridge-client.js';
10
+ import { readKeychainOAuthTokenInfo, readKeychainOAuthClientInfo, readKeychainSessionHeaders } from './auth/keychain.js';
11
+ import { getAuthProfile } from './auth/auth-profiles.js';
12
+ const logger = createLogger('bridge-manager');
13
+ function getBridgeExecutable() {
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ return join(__dirname, '..', 'bridge', 'index.js');
17
+ }
18
+ export async function startBridge(options) {
19
+ const { sessionName, target, verbose, profileName, headers } = options;
20
+ logger.debug(`Launching bridge for session: ${sessionName}`);
21
+ const socketPath = join(getBridgesDir(), `${sessionName}.sock`);
22
+ if (await fileExists(socketPath)) {
23
+ logger.debug(`Removing existing socket: ${socketPath}`);
24
+ await unlink(socketPath);
25
+ }
26
+ const sanitizedTarget = { ...target };
27
+ if (sanitizedTarget.type === 'http') {
28
+ delete sanitizedTarget.headers;
29
+ }
30
+ const bridgeExecutable = getBridgeExecutable();
31
+ const targetJson = JSON.stringify(sanitizedTarget);
32
+ const args = [sessionName, socketPath, targetJson];
33
+ if (verbose) {
34
+ args.push('--verbose');
35
+ }
36
+ if (profileName) {
37
+ args.push('--profile', profileName);
38
+ }
39
+ else if (headers && Object.keys(headers).length > 0) {
40
+ args.push('--profile', 'dummy');
41
+ }
42
+ logger.debug('Bridge executable:', bridgeExecutable);
43
+ logger.debug('Bridge args:', args);
44
+ const bridgeProcess = spawn('node', [bridgeExecutable, ...args], {
45
+ detached: true,
46
+ stdio: 'ignore',
47
+ });
48
+ bridgeProcess.unref();
49
+ logger.debug(`Bridge process spawned with PID: ${bridgeProcess.pid}`);
50
+ if (!bridgeProcess.pid) {
51
+ throw new ClientError('Failed to spawn bridge process: no PID');
52
+ }
53
+ const pid = bridgeProcess.pid;
54
+ try {
55
+ await waitForFile(socketPath, { timeoutMs: 5000 });
56
+ }
57
+ catch {
58
+ try {
59
+ process.kill(pid, 'SIGTERM');
60
+ }
61
+ catch {
62
+ }
63
+ throw new ClientError(`Bridge failed to start: socket file not created within timeout. Check bridge logs.`);
64
+ }
65
+ if (profileName || headers) {
66
+ await sendAuthCredentialsToBridge(socketPath, target.url || target.command || '', profileName, headers);
67
+ }
68
+ logger.debug(`Bridge started successfully for session: ${sessionName}`);
69
+ return { pid, socketPath };
70
+ }
71
+ export async function stopBridge(sessionName) {
72
+ logger.debug(`Stopping bridge for: ${sessionName}`);
73
+ const session = await getSession(sessionName);
74
+ if (!session) {
75
+ throw new ClientError(`Session not found: ${sessionName}`);
76
+ }
77
+ if (session.pid && isProcessAlive(session.pid)) {
78
+ try {
79
+ logger.debug(`Killing bridge process: ${session.pid}`);
80
+ process.kill(session.pid, 'SIGTERM');
81
+ await new Promise(resolve => setTimeout(resolve, 1000));
82
+ if (isProcessAlive(session.pid)) {
83
+ logger.debug('Bridge did not exit gracefully, sending SIGKILL');
84
+ process.kill(session.pid, 'SIGKILL');
85
+ }
86
+ }
87
+ catch (error) {
88
+ logger.warn('Error killing bridge process:', error);
89
+ }
90
+ logger.info(`Bridge stopped for ${sessionName}`);
91
+ }
92
+ }
93
+ export async function restartBridge(sessionName) {
94
+ logger.debug(`Trying to restart bridge for ${sessionName}...`);
95
+ const session = await getSession(sessionName);
96
+ if (!session) {
97
+ throw new ClientError(`Session not found: ${sessionName}`);
98
+ }
99
+ try {
100
+ await stopBridge(sessionName);
101
+ }
102
+ catch {
103
+ }
104
+ const target = session.transport === 'http'
105
+ ? { type: 'http', url: session.target }
106
+ : { type: 'stdio', command: session.target };
107
+ let headers;
108
+ if (session.transport === 'http' && session.headerCount && session.headerCount > 0) {
109
+ headers = await readKeychainSessionHeaders(sessionName);
110
+ const retrievedCount = Object.keys(headers || {}).length;
111
+ if (retrievedCount !== session.headerCount) {
112
+ throw new ClientError(`Failed to retrieve ${session.headerCount} HTTP header(s) from keychain for session ${sessionName}. ` +
113
+ `The session may need to be recreated with "mcpc ${sessionName} close" followed by a new connect.`);
114
+ }
115
+ logger.debug(`Retrieved ${retrievedCount} headers from keychain for failover`);
116
+ }
117
+ const bridgeOptions = {
118
+ sessionName,
119
+ target,
120
+ };
121
+ if (headers) {
122
+ bridgeOptions.headers = headers;
123
+ }
124
+ if (session.profileName) {
125
+ bridgeOptions.profileName = session.profileName;
126
+ }
127
+ const { pid, socketPath } = await startBridge(bridgeOptions);
128
+ await updateSession(sessionName, {
129
+ pid,
130
+ socketPath,
131
+ });
132
+ logger.debug(`Bridge restarted for ${sessionName} with PID: ${pid}`);
133
+ return { pid, socketPath };
134
+ }
135
+ async function sendAuthCredentialsToBridge(socketPath, serverUrl, profileName, headers) {
136
+ const credentials = {
137
+ serverUrl,
138
+ profileName: profileName || 'dummy',
139
+ };
140
+ if (profileName) {
141
+ logger.debug(`Looking up auth profile ${profileName} for ${serverUrl}`);
142
+ const profile = await getAuthProfile(serverUrl, profileName);
143
+ if (profile) {
144
+ const tokens = await readKeychainOAuthTokenInfo(profile.serverUrl, profileName);
145
+ if (tokens?.refreshToken) {
146
+ credentials.refreshToken = tokens.refreshToken;
147
+ credentials.serverUrl = profile.serverUrl;
148
+ logger.debug(`Found OAuth refresh token for profile ${profileName}`);
149
+ }
150
+ const clientInfo = await readKeychainOAuthClientInfo(profile.serverUrl, profileName);
151
+ if (clientInfo?.clientId) {
152
+ credentials.clientId = clientInfo.clientId;
153
+ logger.debug(`Found OAuth client ID for profile ${profileName}`);
154
+ }
155
+ }
156
+ }
157
+ if (headers) {
158
+ credentials.headers = headers;
159
+ logger.debug(`Including ${Object.keys(headers).length} headers in credentials`);
160
+ }
161
+ if (!credentials.refreshToken && !credentials.headers) {
162
+ logger.debug('No auth credentials to send to bridge');
163
+ return;
164
+ }
165
+ const client = new BridgeClient(socketPath);
166
+ try {
167
+ await client.connect();
168
+ client.sendAuthCredentials(credentials);
169
+ logger.debug('Auth credentials sent to bridge successfully');
170
+ }
171
+ finally {
172
+ await client.close();
173
+ }
174
+ }
175
+ async function checkBridgeHealth(socketPath) {
176
+ const client = new BridgeClient(socketPath);
177
+ try {
178
+ await client.connect();
179
+ await client.request('getServerInfo');
180
+ return true;
181
+ }
182
+ catch (error) {
183
+ if (error instanceof NetworkError) {
184
+ return false;
185
+ }
186
+ throw error;
187
+ }
188
+ finally {
189
+ await client.close();
190
+ }
191
+ }
192
+ export async function ensureBridgeReady(sessionName) {
193
+ const session = await getSession(sessionName);
194
+ if (!session) {
195
+ throw new ClientError(`Session not found: ${sessionName}`);
196
+ }
197
+ if (session.status === 'expired') {
198
+ throw new ClientError(`Session ${sessionName} has expired. ` +
199
+ `The MCP server indicated the session is no longer valid.\n` +
200
+ `To reconnect, run: mcpc ${sessionName} connect\n` +
201
+ `To remove the expired session, run: mcpc ${sessionName} close`);
202
+ }
203
+ if (!session.socketPath) {
204
+ throw new ClientError(`Session ${sessionName} has no socket path`);
205
+ }
206
+ const processAlive = session.pid ? isProcessAlive(session.pid) : false;
207
+ if (processAlive) {
208
+ try {
209
+ const isHealthy = await checkBridgeHealth(session.socketPath);
210
+ if (isHealthy) {
211
+ logger.debug(`Bridge for ${sessionName} is healthy`);
212
+ return session.socketPath;
213
+ }
214
+ logger.warn(`Bridge process alive but socket not responding for ${sessionName}`);
215
+ }
216
+ catch (error) {
217
+ throw new ClientError(`Bridge for ${sessionName} failed to connect to MCP server: ${error.message}`);
218
+ }
219
+ }
220
+ else {
221
+ logger.warn(`Bridge process not alive for ${sessionName}, will try to restart it`);
222
+ }
223
+ const { socketPath: freshSocketPath } = await restartBridge(sessionName);
224
+ try {
225
+ const isHealthy = await checkBridgeHealth(freshSocketPath);
226
+ if (isHealthy) {
227
+ logger.debug(`Bridge for ${sessionName} passed health check`);
228
+ return freshSocketPath;
229
+ }
230
+ throw new ClientError(`Bridge for ${sessionName} not responding after restart`);
231
+ }
232
+ catch (error) {
233
+ if (error instanceof ClientError) {
234
+ throw error;
235
+ }
236
+ throw new ClientError(`Bridge for ${sessionName} failed to connect to MCP server: ${error.message}. ` +
237
+ `Check logs at ~/.mcpc/logs/bridge-${sessionName}.log for details.`);
238
+ }
239
+ }
240
+ //# sourceMappingURL=bridge-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-manager.js","sourceRoot":"","sources":["../../src/lib/bridge-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { McpConfig, McpServerConfig } from './types.js';
2
+ export declare function loadConfig(configPath: string): McpConfig;
3
+ export declare function getServerConfig(config: McpConfig, serverName: string): McpServerConfig;
4
+ export declare function listServers(config: McpConfig): string[];
5
+ export declare function validateServerConfig(config: McpServerConfig): boolean;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAc7D,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAwCxD;AAUD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,CAiBtF;AAuFD,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAEvD;AASD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CA0CrE"}