@portel/mcp 1.0.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.
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Elicit - Cross-platform user input
3
+ *
4
+ * Provides a unified API for requesting user input that works across:
5
+ * - Native OS dialogs (default)
6
+ * - CLI readline (when in TTY)
7
+ * - MCP elicitation (when runtime provides handler)
8
+ */
9
+ import type { ElicitOptions, ElicitResult, PromptHandler, ElicitHandler } from './types.js';
10
+ declare global {
11
+ var __photon_prompt__: PromptHandler | undefined;
12
+ var __photon_elicit__: ElicitHandler | undefined;
13
+ }
14
+ export declare function setPromptHandler(handler: PromptHandler | null): void;
15
+ export declare function setElicitHandler(handler: ElicitHandler | null): void;
16
+ export declare function getPromptHandler(): PromptHandler | undefined;
17
+ export declare function getElicitHandler(): ElicitHandler | undefined;
18
+ /**
19
+ * Simple prompt function
20
+ */
21
+ export declare function prompt(message: string, defaultValue?: string): Promise<string | null>;
22
+ /**
23
+ * Confirm dialog - returns true/false
24
+ */
25
+ export declare function confirm(message: string): Promise<boolean>;
26
+ /**
27
+ * Full elicit with options
28
+ */
29
+ export declare function elicit(options: ElicitOptions): Promise<ElicitResult>;
30
+ /**
31
+ * Elicit using readline (for CLI/terminal)
32
+ */
33
+ export declare function elicitReadline(options: ElicitOptions): Promise<ElicitResult>;
34
+ /**
35
+ * Elicit using native OS dialog
36
+ */
37
+ export declare function elicitNativeDialog(options: ElicitOptions): Promise<ElicitResult>;
38
+ export type { ElicitOptions, ElicitResult, PromptHandler, ElicitHandler };
39
+ //# sourceMappingURL=elicit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elicit.d.ts","sourceRoot":"","sources":["../src/elicit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5F,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,iBAAiB,EAAE,aAAa,GAAG,SAAS,CAAC;IACjD,IAAI,iBAAiB,EAAE,aAAa,GAAG,SAAS,CAAC;CAClD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEpE;AAED,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAE5D;AAED,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY3F;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe/D;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAU1E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAgClF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBtF;AA6HD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
package/dist/elicit.js ADDED
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Elicit - Cross-platform user input
3
+ *
4
+ * Provides a unified API for requesting user input that works across:
5
+ * - Native OS dialogs (default)
6
+ * - CLI readline (when in TTY)
7
+ * - MCP elicitation (when runtime provides handler)
8
+ */
9
+ import { exec } from 'child_process';
10
+ import * as os from 'os';
11
+ import * as readline from 'readline';
12
+ export function setPromptHandler(handler) {
13
+ globalThis.__photon_prompt__ = handler || undefined;
14
+ }
15
+ export function setElicitHandler(handler) {
16
+ globalThis.__photon_elicit__ = handler || undefined;
17
+ }
18
+ export function getPromptHandler() {
19
+ return globalThis.__photon_prompt__;
20
+ }
21
+ export function getElicitHandler() {
22
+ return globalThis.__photon_elicit__;
23
+ }
24
+ /**
25
+ * Simple prompt function
26
+ */
27
+ export async function prompt(message, defaultValue) {
28
+ if (globalThis.__photon_prompt__) {
29
+ return globalThis.__photon_prompt__(message, defaultValue);
30
+ }
31
+ const result = await elicitNativeDialog({
32
+ prompt: message,
33
+ defaultValue,
34
+ type: 'text',
35
+ });
36
+ return result.success ? (result.value ?? null) : null;
37
+ }
38
+ /**
39
+ * Confirm dialog - returns true/false
40
+ */
41
+ export async function confirm(message) {
42
+ if (globalThis.__photon_elicit__) {
43
+ const result = await globalThis.__photon_elicit__({
44
+ prompt: message,
45
+ type: 'confirm',
46
+ });
47
+ return result.confirmed ?? false;
48
+ }
49
+ const result = await elicitNativeDialog({
50
+ prompt: message,
51
+ type: 'confirm',
52
+ });
53
+ return result.confirmed ?? false;
54
+ }
55
+ /**
56
+ * Full elicit with options
57
+ */
58
+ export async function elicit(options) {
59
+ if (globalThis.__photon_elicit__) {
60
+ return globalThis.__photon_elicit__(options);
61
+ }
62
+ if (process.stdin.isTTY && process.stdout.isTTY) {
63
+ return elicitReadline(options);
64
+ }
65
+ return elicitNativeDialog(options);
66
+ }
67
+ /**
68
+ * Elicit using readline (for CLI/terminal)
69
+ */
70
+ export async function elicitReadline(options) {
71
+ return new Promise((resolve) => {
72
+ const rl = readline.createInterface({
73
+ input: process.stdin,
74
+ output: process.stdout,
75
+ });
76
+ const promptText = options.defaultValue
77
+ ? `${options.prompt} [${options.defaultValue}]: `
78
+ : `${options.prompt}: `;
79
+ if (options.type === 'confirm') {
80
+ rl.question(`${options.prompt} (y/n): `, (answer) => {
81
+ rl.close();
82
+ const confirmed = answer.toLowerCase().startsWith('y');
83
+ resolve({ success: true, confirmed, value: confirmed ? 'yes' : 'no' });
84
+ });
85
+ }
86
+ else {
87
+ rl.question(promptText, (answer) => {
88
+ rl.close();
89
+ const value = answer || options.defaultValue || '';
90
+ resolve({ success: true, value });
91
+ });
92
+ }
93
+ if (options.timeout && options.timeout > 0) {
94
+ setTimeout(() => {
95
+ rl.close();
96
+ resolve({ success: false, error: 'Input timeout' });
97
+ }, options.timeout);
98
+ }
99
+ });
100
+ }
101
+ /**
102
+ * Elicit using native OS dialog
103
+ */
104
+ export async function elicitNativeDialog(options) {
105
+ const platform = os.platform();
106
+ try {
107
+ switch (platform) {
108
+ case 'darwin':
109
+ return elicitMacOS(options);
110
+ case 'win32':
111
+ return elicitWindows(options);
112
+ case 'linux':
113
+ return elicitLinux(options);
114
+ default:
115
+ return elicitReadline(options);
116
+ }
117
+ }
118
+ catch (error) {
119
+ return { success: false, error: error.message };
120
+ }
121
+ }
122
+ function elicitMacOS(options) {
123
+ return new Promise((resolve) => {
124
+ const title = options.title || 'Input Required';
125
+ const message = options.prompt;
126
+ const defaultValue = options.defaultValue || '';
127
+ const isPassword = options.type === 'password';
128
+ const isConfirm = options.type === 'confirm';
129
+ let script;
130
+ if (isConfirm) {
131
+ script = `display dialog "${escapeAppleScript(message)}" with title "${escapeAppleScript(title)}" buttons {"Cancel", "No", "Yes"} default button "Yes"\nset buttonPressed to button returned of result\nreturn buttonPressed`;
132
+ }
133
+ else if (isPassword) {
134
+ script = `display dialog "${escapeAppleScript(message)}" with title "${escapeAppleScript(title)}" default answer "${escapeAppleScript(defaultValue)}" with hidden answer buttons {"Cancel", "OK"} default button "OK"\nreturn text returned of result`;
135
+ }
136
+ else {
137
+ script = `display dialog "${escapeAppleScript(message)}" with title "${escapeAppleScript(title)}" default answer "${escapeAppleScript(defaultValue)}" buttons {"Cancel", "OK"} default button "OK"\nreturn text returned of result`;
138
+ }
139
+ exec(`osascript -e '${script.replace(/'/g, "'\"'\"'")}'`, (error, stdout, _stderr) => {
140
+ if (error) {
141
+ resolve({ success: false, error: error.code === 1 ? 'User cancelled' : error.message });
142
+ return;
143
+ }
144
+ const value = stdout.trim();
145
+ if (isConfirm) {
146
+ resolve({ success: true, confirmed: value === 'Yes', value });
147
+ }
148
+ else {
149
+ resolve({ success: true, value });
150
+ }
151
+ });
152
+ });
153
+ }
154
+ function elicitWindows(options) {
155
+ return new Promise((resolve) => {
156
+ const title = options.title || 'Input Required';
157
+ const message = options.prompt;
158
+ const defaultValue = options.defaultValue || '';
159
+ const isConfirm = options.type === 'confirm';
160
+ let script;
161
+ if (isConfirm) {
162
+ script = `Add-Type -AssemblyName System.Windows.Forms\n$result = [System.Windows.Forms.MessageBox]::Show('${escapePowerShell(message)}', '${escapePowerShell(title)}', 'YesNoCancel', 'Question')\nWrite-Output $result`;
163
+ }
164
+ else {
165
+ script = `Add-Type -AssemblyName Microsoft.VisualBasic\n$result = [Microsoft.VisualBasic.Interaction]::InputBox('${escapePowerShell(message)}', '${escapePowerShell(title)}', '${escapePowerShell(defaultValue)}')\nWrite-Output $result`;
166
+ }
167
+ exec(`powershell -Command "${script.replace(/"/g, '\\"')}"`, (error, stdout, _stderr) => {
168
+ if (error) {
169
+ resolve({ success: false, error: error.message });
170
+ return;
171
+ }
172
+ const value = stdout.trim();
173
+ if (isConfirm) {
174
+ if (value === 'Cancel') {
175
+ resolve({ success: false, error: 'User cancelled' });
176
+ }
177
+ else {
178
+ resolve({ success: true, confirmed: value === 'Yes', value });
179
+ }
180
+ }
181
+ else {
182
+ if (value === '') {
183
+ resolve({ success: false, error: 'User cancelled' });
184
+ }
185
+ else {
186
+ resolve({ success: true, value });
187
+ }
188
+ }
189
+ });
190
+ });
191
+ }
192
+ function elicitLinux(options) {
193
+ return new Promise((resolve) => {
194
+ const title = options.title || 'Input Required';
195
+ const message = options.prompt;
196
+ const defaultValue = options.defaultValue || '';
197
+ const isPassword = options.type === 'password';
198
+ const isConfirm = options.type === 'confirm';
199
+ let command;
200
+ if (isConfirm) {
201
+ command = `zenity --question --title="${escapeShell(title)}" --text="${escapeShell(message)}" 2>/dev/null || kdialog --yesno "${escapeShell(message)}" --title "${escapeShell(title)}" 2>/dev/null`;
202
+ }
203
+ else if (isPassword) {
204
+ command = `zenity --password --title="${escapeShell(title)}" 2>/dev/null || kdialog --password "${escapeShell(message)}" --title "${escapeShell(title)}" 2>/dev/null`;
205
+ }
206
+ else {
207
+ command = `zenity --entry --title="${escapeShell(title)}" --text="${escapeShell(message)}" --entry-text="${escapeShell(defaultValue)}" 2>/dev/null || kdialog --inputbox "${escapeShell(message)}" "${escapeShell(defaultValue)}" --title "${escapeShell(title)}" 2>/dev/null`;
208
+ }
209
+ exec(command, (error, stdout, _stderr) => {
210
+ if (error) {
211
+ if (error.code === 1) {
212
+ resolve({ success: false, error: 'User cancelled' });
213
+ }
214
+ else {
215
+ elicitReadline(options).then(resolve);
216
+ }
217
+ return;
218
+ }
219
+ const value = stdout.trim();
220
+ if (isConfirm) {
221
+ resolve({ success: true, confirmed: true, value: 'yes' });
222
+ }
223
+ else {
224
+ resolve({ success: true, value });
225
+ }
226
+ });
227
+ });
228
+ }
229
+ function escapeAppleScript(str) {
230
+ return str.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
231
+ }
232
+ function escapePowerShell(str) {
233
+ return str.replace(/'/g, "''");
234
+ }
235
+ function escapeShell(str) {
236
+ return str.replace(/"/g, '\\"').replace(/\$/g, '\\$').replace(/`/g, '\\`');
237
+ }
238
+ //# sourceMappingURL=elicit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elicit.js","sourceRoot":"","sources":["../src/elicit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @portel/mcp
3
+ *
4
+ * MCP protocol utilities for connecting to and calling MCP servers.
5
+ *
6
+ * Used by:
7
+ * - NCP (MCP orchestrator)
8
+ * - Photon runtimes
9
+ * - Any tool needing MCP connectivity
10
+ */
11
+ export type { MCPToolInfo, MCPToolResult, MCPTransport, MCPSourceType, MissingMCPInfo, MCPServerConfig, MCPConfig, PhotonMCPConfig, ElicitOptions, ElicitResult, PromptHandler, ElicitHandler, } from './types.js';
12
+ export { MCPClient, MCPClientFactory, MCPError, MCPNotConnectedError, MCPToolError, MCPConfigurationError, createMCPProxy, } from './mcp-client.js';
13
+ export { SDKMCPTransport, SDKMCPClientFactory, loadMCPConfig, createSDKMCPClientFactory, resolveMCPSource, } from './mcp-sdk-transport.js';
14
+ export { PHOTON_CONFIG_DIR, MCP_SERVERS_CONFIG_FILE, loadPhotonMCPConfig, savePhotonMCPConfig, isMCPConfigured, getMCPServerConfig, listMCPServers, setMCPServerConfig, removeMCPServerConfig, toMCPConfig, resolveEnvVars, } from './photon-config.js';
15
+ export { prompt, confirm, elicit, elicitReadline, elicitNativeDialog, setPromptHandler, getPromptHandler, setElicitHandler, getElicitHandler, } from './elicit.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,SAAS,EACT,eAAe,EACf,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,MAAM,EACN,OAAO,EACP,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @portel/mcp
3
+ *
4
+ * MCP protocol utilities for connecting to and calling MCP servers.
5
+ *
6
+ * Used by:
7
+ * - NCP (MCP orchestrator)
8
+ * - Photon runtimes
9
+ * - Any tool needing MCP connectivity
10
+ */
11
+ // MCP Client
12
+ export { MCPClient, MCPError, MCPNotConnectedError, MCPToolError, MCPConfigurationError, createMCPProxy, } from './mcp-client.js';
13
+ // MCP SDK Transport
14
+ export { SDKMCPTransport, SDKMCPClientFactory, loadMCPConfig, createSDKMCPClientFactory, resolveMCPSource, } from './mcp-sdk-transport.js';
15
+ // MCP Configuration
16
+ export { PHOTON_CONFIG_DIR, MCP_SERVERS_CONFIG_FILE, loadPhotonMCPConfig, savePhotonMCPConfig, isMCPConfigured, getMCPServerConfig, listMCPServers, setMCPServerConfig, removeMCPServerConfig, toMCPConfig, resolveEnvVars, } from './photon-config.js';
17
+ // Elicitation
18
+ export { prompt, confirm, elicit, elicitReadline, elicitNativeDialog, setPromptHandler, getPromptHandler, setElicitHandler, getElicitHandler, } from './elicit.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH,aAAa;AACb,OAAO,EACL,SAAS,EAET,QAAQ,EACR,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,oBAAoB;AACpB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,oBAAoB;AACpB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,cAAc;AACd,OAAO,EACL,MAAM,EACN,OAAO,EACP,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * MCP Protocol Client
3
+ *
4
+ * Enables calling external MCPs via the MCP protocol.
5
+ * Runtime-agnostic - the actual transport is provided by the runtime.
6
+ */
7
+ import type { MCPToolInfo, MCPToolResult, MCPTransport, MCPSourceType, MissingMCPInfo } from './types.js';
8
+ /**
9
+ * Factory interface for creating MCP clients
10
+ */
11
+ export interface MCPClientFactory {
12
+ create(mcpName: string): MCPClient;
13
+ listServers(): Promise<string[]>;
14
+ }
15
+ /**
16
+ * MCP Client - Protocol wrapper for calling external MCPs
17
+ */
18
+ export declare class MCPClient {
19
+ private mcpName;
20
+ private transport;
21
+ private toolsCache;
22
+ constructor(mcpName: string, transport: MCPTransport);
23
+ get name(): string;
24
+ call(toolName: string, parameters?: Record<string, any>): Promise<any>;
25
+ list(): Promise<MCPToolInfo[]>;
26
+ find(query: string): Promise<MCPToolInfo[]>;
27
+ isConnected(): Promise<boolean>;
28
+ clearCache(): void;
29
+ private parseResult;
30
+ }
31
+ /**
32
+ * Base class for MCP-related errors
33
+ */
34
+ export declare class MCPError extends Error {
35
+ readonly mcpName: string;
36
+ constructor(mcpName: string, message: string);
37
+ }
38
+ /**
39
+ * Error thrown when MCP server is not connected
40
+ */
41
+ export declare class MCPNotConnectedError extends MCPError {
42
+ constructor(mcpName: string);
43
+ }
44
+ /**
45
+ * Error thrown when MCP tool call fails
46
+ */
47
+ export declare class MCPToolError extends MCPError {
48
+ readonly toolName: string;
49
+ readonly details: string;
50
+ constructor(mcpName: string, toolName: string, details: string);
51
+ }
52
+ /**
53
+ * Error thrown when MCP is not configured correctly
54
+ */
55
+ export declare class MCPConfigurationError extends MCPError {
56
+ readonly configPath: string;
57
+ readonly missingMCPs: MissingMCPInfo[];
58
+ constructor(missingMCPs: MissingMCPInfo[]);
59
+ private static formatMessage;
60
+ }
61
+ /**
62
+ * Create a proxy-based MCP client for fluent API
63
+ */
64
+ export declare function createMCPProxy(client: MCPClient): MCPClient & Record<string, (params?: any) => Promise<any>>;
65
+ export type { MCPToolInfo, MCPToolResult, MCPTransport, MCPSourceType, MissingMCPInfo };
66
+ //# sourceMappingURL=mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,SAAS;IAIlB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IAJnB,OAAO,CAAC,UAAU,CAA8B;gBAGtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,YAAY;IAGjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyB1E,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAY9B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAU3C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,WAAW;CAuBpB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAEf,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM,EAC/B,OAAO,EAAE,MAAM;CAKlB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,QAAQ;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;aAGtB,QAAQ,EAAE,MAAM;aAChB,OAAO,EAAE,MAAM;gBAF/B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM;CAKlC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,QAAQ;IACjD,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,WAAW,EAAE,cAAc,EAAE,CAAC;gBAElC,WAAW,EAAE,cAAc,EAAE;IASzC,OAAO,CAAC,MAAM,CAAC,aAAa;CAyB7B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAO5G;AAED,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * MCP Protocol Client
3
+ *
4
+ * Enables calling external MCPs via the MCP protocol.
5
+ * Runtime-agnostic - the actual transport is provided by the runtime.
6
+ */
7
+ /**
8
+ * MCP Client - Protocol wrapper for calling external MCPs
9
+ */
10
+ export class MCPClient {
11
+ mcpName;
12
+ transport;
13
+ toolsCache = null;
14
+ constructor(mcpName, transport) {
15
+ this.mcpName = mcpName;
16
+ this.transport = transport;
17
+ }
18
+ get name() {
19
+ return this.mcpName;
20
+ }
21
+ async call(toolName, parameters = {}) {
22
+ const connected = await this.transport.isConnected(this.mcpName);
23
+ if (!connected) {
24
+ throw new MCPNotConnectedError(this.mcpName);
25
+ }
26
+ try {
27
+ const result = await this.transport.callTool(this.mcpName, toolName, parameters);
28
+ if (result.isError) {
29
+ const errorText = result.content.find(c => c.type === 'text')?.text || 'Unknown error';
30
+ throw new MCPToolError(this.mcpName, toolName, errorText);
31
+ }
32
+ return this.parseResult(result);
33
+ }
34
+ catch (error) {
35
+ if (error instanceof MCPError)
36
+ throw error;
37
+ throw new MCPToolError(this.mcpName, toolName, error instanceof Error ? error.message : String(error));
38
+ }
39
+ }
40
+ async list() {
41
+ if (this.toolsCache)
42
+ return this.toolsCache;
43
+ const connected = await this.transport.isConnected(this.mcpName);
44
+ if (!connected) {
45
+ throw new MCPNotConnectedError(this.mcpName);
46
+ }
47
+ this.toolsCache = await this.transport.listTools(this.mcpName);
48
+ return this.toolsCache;
49
+ }
50
+ async find(query) {
51
+ const tools = await this.list();
52
+ const lowerQuery = query.toLowerCase();
53
+ return tools.filter(t => t.name.toLowerCase().includes(lowerQuery) ||
54
+ t.description?.toLowerCase().includes(lowerQuery));
55
+ }
56
+ async isConnected() {
57
+ return this.transport.isConnected(this.mcpName);
58
+ }
59
+ clearCache() {
60
+ this.toolsCache = null;
61
+ }
62
+ parseResult(result) {
63
+ if (!result.content || result.content.length === 0)
64
+ return null;
65
+ if (result.content.length === 1 && result.content[0].type === 'text') {
66
+ const text = result.content[0].text || '';
67
+ try {
68
+ return JSON.parse(text);
69
+ }
70
+ catch {
71
+ return text;
72
+ }
73
+ }
74
+ return result.content.map(c => {
75
+ if (c.type === 'text') {
76
+ try {
77
+ return JSON.parse(c.text || '');
78
+ }
79
+ catch {
80
+ return c.text;
81
+ }
82
+ }
83
+ return c;
84
+ });
85
+ }
86
+ }
87
+ /**
88
+ * Base class for MCP-related errors
89
+ */
90
+ export class MCPError extends Error {
91
+ mcpName;
92
+ constructor(mcpName, message) {
93
+ super(message);
94
+ this.mcpName = mcpName;
95
+ this.name = 'MCPError';
96
+ }
97
+ }
98
+ /**
99
+ * Error thrown when MCP server is not connected
100
+ */
101
+ export class MCPNotConnectedError extends MCPError {
102
+ constructor(mcpName) {
103
+ super(mcpName, `MCP server '${mcpName}' is not connected`);
104
+ this.name = 'MCPNotConnectedError';
105
+ }
106
+ }
107
+ /**
108
+ * Error thrown when MCP tool call fails
109
+ */
110
+ export class MCPToolError extends MCPError {
111
+ toolName;
112
+ details;
113
+ constructor(mcpName, toolName, details) {
114
+ super(mcpName, `MCP tool '${mcpName}:${toolName}' failed: ${details}`);
115
+ this.toolName = toolName;
116
+ this.details = details;
117
+ this.name = 'MCPToolError';
118
+ }
119
+ }
120
+ /**
121
+ * Error thrown when MCP is not configured correctly
122
+ */
123
+ export class MCPConfigurationError extends MCPError {
124
+ configPath;
125
+ missingMCPs;
126
+ constructor(missingMCPs) {
127
+ const configPath = `~/.photon/mcp-servers.json`;
128
+ const message = MCPConfigurationError.formatMessage(missingMCPs, configPath);
129
+ super(missingMCPs[0]?.name || 'unknown', message);
130
+ this.name = 'MCPConfigurationError';
131
+ this.configPath = configPath;
132
+ this.missingMCPs = missingMCPs;
133
+ }
134
+ static formatMessage(missingMCPs, configPath) {
135
+ const lines = [
136
+ '',
137
+ '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
138
+ '❌ MCP Configuration Required',
139
+ '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
140
+ '',
141
+ `The following MCP server${missingMCPs.length > 1 ? 's are' : ' is'} required but not configured:`,
142
+ '',
143
+ ];
144
+ for (const mcp of missingMCPs) {
145
+ lines.push(` • ${mcp.name}`);
146
+ if (mcp.source)
147
+ lines.push(` Source: ${mcp.source} (${mcp.sourceType})`);
148
+ if (mcp.declaredIn)
149
+ lines.push(` Declared in: ${mcp.declaredIn}`);
150
+ if (mcp.originalError)
151
+ lines.push(` Error: ${mcp.originalError}`);
152
+ lines.push('');
153
+ }
154
+ lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
155
+ lines.push(`Add configuration to ${configPath}`);
156
+ lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
157
+ return lines.join('\n');
158
+ }
159
+ }
160
+ /**
161
+ * Create a proxy-based MCP client for fluent API
162
+ */
163
+ export function createMCPProxy(client) {
164
+ return new Proxy(client, {
165
+ get(target, prop) {
166
+ if (prop in target)
167
+ return target[prop];
168
+ return (params = {}) => target.call(prop, params);
169
+ },
170
+ });
171
+ }
172
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * MCP SDK Transport
3
+ *
4
+ * Uses the official @modelcontextprotocol/sdk for connecting to MCP servers.
5
+ * Supports: stdio, sse, streamable-http, websocket transports.
6
+ */
7
+ import { MCPClient, createMCPProxy, type MCPClientFactory } from './mcp-client.js';
8
+ import type { MCPToolInfo, MCPToolResult, MCPTransport, MCPServerConfig, MCPConfig } from './types.js';
9
+ /**
10
+ * SDK-based MCP Transport using official @modelcontextprotocol/sdk
11
+ */
12
+ export declare class SDKMCPTransport implements MCPTransport {
13
+ private config;
14
+ private verbose;
15
+ private connections;
16
+ constructor(config: MCPConfig, verbose?: boolean);
17
+ private getConnection;
18
+ callTool(mcpName: string, toolName: string, parameters: Record<string, any>): Promise<MCPToolResult>;
19
+ listTools(mcpName: string): Promise<MCPToolInfo[]>;
20
+ isConnected(mcpName: string): Promise<boolean>;
21
+ listServers(): string[];
22
+ disconnectAll(): Promise<void>;
23
+ }
24
+ /**
25
+ * SDK-based MCP Client Factory
26
+ */
27
+ export declare class SDKMCPClientFactory implements MCPClientFactory {
28
+ private transport;
29
+ constructor(config: MCPConfig, verbose?: boolean);
30
+ create(mcpName: string): MCPClient;
31
+ listServers(): Promise<string[]>;
32
+ disconnect(): Promise<void>;
33
+ getTransport(): SDKMCPTransport;
34
+ }
35
+ /**
36
+ * Resolve an MCP source to a runnable configuration
37
+ */
38
+ export declare function resolveMCPSource(name: string, source: string, sourceType: 'github' | 'npm' | 'url' | 'local'): MCPServerConfig;
39
+ /**
40
+ * Load MCP configuration from standard locations
41
+ */
42
+ export declare function loadMCPConfig(verbose?: boolean): Promise<MCPConfig>;
43
+ /**
44
+ * Create an SDK-based MCP client factory from default config
45
+ */
46
+ export declare function createSDKMCPClientFactory(verbose?: boolean): Promise<SDKMCPClientFactory>;
47
+ export { MCPClient, createMCPProxy };
48
+ export type { MCPServerConfig, MCPConfig };
49
+ //# sourceMappingURL=mcp-sdk-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-sdk-transport.d.ts","sourceRoot":"","sources":["../src/mcp-sdk-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EACL,SAAS,EAGT,cAAc,EACd,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,EACV,MAAM,YAAY,CAAC;AA4IpB;;GAEG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAIhD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IAJjB,OAAO,CAAC,WAAW,CAA4C;gBAGrD,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,OAAe;YAGpB,aAAa;IAerB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAKpG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAKlD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMpD,WAAW,IAAI,MAAM,EAAE;IAIjB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAMrC;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,gBAAgB;IAC1D,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,OAAe;IAIvD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAI5B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,YAAY,IAAI,eAAe;CAGhC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAC7C,eAAe,CAgBjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAyBhF;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAGtG;AAED,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AACrC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * MCP SDK Transport
3
+ *
4
+ * Uses the official @modelcontextprotocol/sdk for connecting to MCP servers.
5
+ * Supports: stdio, sse, streamable-http, websocket transports.
6
+ */
7
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
8
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
9
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
10
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
11
+ import { WebSocketClientTransport } from '@modelcontextprotocol/sdk/client/websocket.js';
12
+ import * as fs from 'fs/promises';
13
+ import * as path from 'path';
14
+ import * as os from 'os';
15
+ import { MCPClient, MCPNotConnectedError, MCPToolError, createMCPProxy, } from './mcp-client.js';
16
+ /**
17
+ * Manages a single MCP server connection using official SDK
18
+ */
19
+ class SDKMCPConnection {
20
+ name;
21
+ config;
22
+ verbose;
23
+ client = null;
24
+ transport = null;
25
+ tools = [];
26
+ initialized = false;
27
+ constructor(name, config, verbose = false) {
28
+ this.name = name;
29
+ this.config = config;
30
+ this.verbose = verbose;
31
+ }
32
+ log(message) {
33
+ if (this.verbose)
34
+ console.error(`[MCP:${this.name}] ${message}`);
35
+ }
36
+ createTransport() {
37
+ const transportType = this.config.transport || (this.config.command ? 'stdio' : 'sse');
38
+ switch (transportType) {
39
+ case 'stdio': {
40
+ if (!this.config.command) {
41
+ throw new Error(`stdio transport requires 'command' for ${this.name}`);
42
+ }
43
+ this.log(`Creating stdio transport: ${this.config.command} ${(this.config.args || []).join(' ')}`);
44
+ return new StdioClientTransport({
45
+ command: this.config.command,
46
+ args: this.config.args,
47
+ cwd: this.config.cwd,
48
+ env: this.config.env,
49
+ });
50
+ }
51
+ case 'sse': {
52
+ if (!this.config.url)
53
+ throw new Error(`sse transport requires 'url' for ${this.name}`);
54
+ this.log(`Creating SSE transport: ${this.config.url}`);
55
+ return new SSEClientTransport(new URL(this.config.url), {
56
+ requestInit: this.config.headers ? { headers: this.config.headers } : undefined,
57
+ });
58
+ }
59
+ case 'streamable-http': {
60
+ if (!this.config.url)
61
+ throw new Error(`streamable-http transport requires 'url' for ${this.name}`);
62
+ this.log(`Creating streamable HTTP transport: ${this.config.url}`);
63
+ return new StreamableHTTPClientTransport(new URL(this.config.url), {
64
+ requestInit: this.config.headers ? { headers: this.config.headers } : undefined,
65
+ });
66
+ }
67
+ case 'websocket': {
68
+ if (!this.config.url)
69
+ throw new Error(`websocket transport requires 'url' for ${this.name}`);
70
+ this.log(`Creating WebSocket transport: ${this.config.url}`);
71
+ return new WebSocketClientTransport(new URL(this.config.url));
72
+ }
73
+ default:
74
+ throw new Error(`Unknown transport type: ${transportType}`);
75
+ }
76
+ }
77
+ async connect() {
78
+ if (this.client)
79
+ return;
80
+ this.transport = this.createTransport();
81
+ this.client = new Client({ name: 'portel-mcp', version: '1.0.0' }, { capabilities: { roots: { listChanged: false } } });
82
+ this.log('Connecting...');
83
+ await this.client.connect(this.transport);
84
+ this.log('Connected');
85
+ const toolsResult = await this.client.listTools();
86
+ this.tools = (toolsResult.tools || []).map((t) => ({
87
+ name: t.name,
88
+ description: t.description,
89
+ inputSchema: t.inputSchema,
90
+ }));
91
+ this.log(`Loaded ${this.tools.length} tools`);
92
+ this.initialized = true;
93
+ }
94
+ async callTool(toolName, parameters) {
95
+ if (!this.client || !this.initialized) {
96
+ throw new MCPNotConnectedError(this.name);
97
+ }
98
+ try {
99
+ const result = await this.client.callTool({
100
+ name: toolName,
101
+ arguments: parameters,
102
+ });
103
+ if (result?.content && Array.isArray(result.content)) {
104
+ return {
105
+ content: result.content.map((c) => ({
106
+ type: c.type || 'text',
107
+ text: c.text,
108
+ data: c.data,
109
+ mimeType: c.mimeType,
110
+ })),
111
+ isError: result.isError,
112
+ };
113
+ }
114
+ return {
115
+ content: [{ type: 'text', text: typeof result === 'string' ? result : JSON.stringify(result) }],
116
+ isError: false,
117
+ };
118
+ }
119
+ catch (error) {
120
+ throw new MCPToolError(this.name, toolName, error.message);
121
+ }
122
+ }
123
+ listTools() {
124
+ return this.tools;
125
+ }
126
+ isConnected() {
127
+ return this.initialized && this.client !== null;
128
+ }
129
+ async disconnect() {
130
+ if (this.client) {
131
+ this.log('Disconnecting...');
132
+ await this.client.close();
133
+ this.client = null;
134
+ this.transport = null;
135
+ this.initialized = false;
136
+ }
137
+ }
138
+ }
139
+ /**
140
+ * SDK-based MCP Transport using official @modelcontextprotocol/sdk
141
+ */
142
+ export class SDKMCPTransport {
143
+ config;
144
+ verbose;
145
+ connections = new Map();
146
+ constructor(config, verbose = false) {
147
+ this.config = config;
148
+ this.verbose = verbose;
149
+ }
150
+ async getConnection(mcpName) {
151
+ let connection = this.connections.get(mcpName);
152
+ if (connection?.isConnected())
153
+ return connection;
154
+ const serverConfig = this.config.mcpServers[mcpName];
155
+ if (!serverConfig)
156
+ throw new MCPNotConnectedError(mcpName);
157
+ connection = new SDKMCPConnection(mcpName, serverConfig, this.verbose);
158
+ await connection.connect();
159
+ this.connections.set(mcpName, connection);
160
+ return connection;
161
+ }
162
+ async callTool(mcpName, toolName, parameters) {
163
+ const connection = await this.getConnection(mcpName);
164
+ return connection.callTool(toolName, parameters);
165
+ }
166
+ async listTools(mcpName) {
167
+ const connection = await this.getConnection(mcpName);
168
+ return connection.listTools();
169
+ }
170
+ async isConnected(mcpName) {
171
+ if (!this.config.mcpServers[mcpName])
172
+ return false;
173
+ const connection = this.connections.get(mcpName);
174
+ return connection?.isConnected() ?? false;
175
+ }
176
+ listServers() {
177
+ return Object.keys(this.config.mcpServers);
178
+ }
179
+ async disconnectAll() {
180
+ for (const connection of this.connections.values()) {
181
+ await connection.disconnect();
182
+ }
183
+ this.connections.clear();
184
+ }
185
+ }
186
+ /**
187
+ * SDK-based MCP Client Factory
188
+ */
189
+ export class SDKMCPClientFactory {
190
+ transport;
191
+ constructor(config, verbose = false) {
192
+ this.transport = new SDKMCPTransport(config, verbose);
193
+ }
194
+ create(mcpName) {
195
+ return new MCPClient(mcpName, this.transport);
196
+ }
197
+ async listServers() {
198
+ return this.transport.listServers();
199
+ }
200
+ async disconnect() {
201
+ await this.transport.disconnectAll();
202
+ }
203
+ getTransport() {
204
+ return this.transport;
205
+ }
206
+ }
207
+ /**
208
+ * Resolve an MCP source to a runnable configuration
209
+ */
210
+ export function resolveMCPSource(name, source, sourceType) {
211
+ switch (sourceType) {
212
+ case 'npm':
213
+ return { command: 'npx', args: ['-y', source.replace(/^npm:/, '')], transport: 'stdio' };
214
+ case 'github':
215
+ return { command: 'npx', args: ['-y', `@${source}`], transport: 'stdio' };
216
+ case 'url':
217
+ if (source.startsWith('ws://') || source.startsWith('wss://')) {
218
+ return { url: source, transport: 'websocket' };
219
+ }
220
+ return { url: source, transport: 'sse' };
221
+ case 'local':
222
+ return { command: 'node', args: [source.replace(/^~/, process.env.HOME || '')], transport: 'stdio' };
223
+ default:
224
+ throw new Error(`Unknown MCP source type: ${sourceType}`);
225
+ }
226
+ }
227
+ /**
228
+ * Load MCP configuration from standard locations
229
+ */
230
+ export async function loadMCPConfig(verbose = false) {
231
+ const log = verbose ? (msg) => console.error(`[MCPConfig] ${msg}`) : () => { };
232
+ const configPaths = [
233
+ process.env.PHOTON_MCP_CONFIG,
234
+ path.join(process.cwd(), 'photon.mcp.json'),
235
+ path.join(os.homedir(), '.config', 'photon', 'mcp.json'),
236
+ path.join(os.homedir(), '.photon', 'mcp-servers.json'),
237
+ ].filter(Boolean);
238
+ for (const configPath of configPaths) {
239
+ try {
240
+ const content = await fs.readFile(configPath, 'utf-8');
241
+ const config = JSON.parse(content);
242
+ if (config.mcpServers && typeof config.mcpServers === 'object') {
243
+ log(`Loaded MCP config from ${configPath}`);
244
+ return config;
245
+ }
246
+ }
247
+ catch (error) {
248
+ if (error.code !== 'ENOENT')
249
+ log(`Failed to load ${configPath}: ${error.message}`);
250
+ }
251
+ }
252
+ log('No MCP config found');
253
+ return { mcpServers: {} };
254
+ }
255
+ /**
256
+ * Create an SDK-based MCP client factory from default config
257
+ */
258
+ export async function createSDKMCPClientFactory(verbose = false) {
259
+ const config = await loadMCPConfig(verbose);
260
+ return new SDKMCPClientFactory(config, verbose);
261
+ }
262
+ export { MCPClient, createMCPProxy };
263
+ //# sourceMappingURL=mcp-sdk-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-sdk-transport.js","sourceRoot":"","sources":["../src/mcp-sdk-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,YAAY,EACZ,cAAc,GAEf,MAAM,iBAAiB,CAAC;AASzB;;GAEG;AACH,MAAM,gBAAgB;IAOV;IACA;IACA;IARF,MAAM,GAAkB,IAAI,CAAC;IAC7B,SAAS,GAAQ,IAAI,CAAC;IACtB,KAAK,GAAkB,EAAE,CAAC;IAC1B,WAAW,GAAG,KAAK,CAAC;IAE5B,YACU,IAAY,EACZ,MAAuB,EACvB,UAAmB,KAAK;QAFxB,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAiB;QACvB,YAAO,GAAP,OAAO,CAAiB;IAC/B,CAAC;IAEI,GAAG,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IAEO,eAAe;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAEvF,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnG,OAAO,IAAI,oBAAoB,CAAC;oBAC9B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;oBAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;oBACpB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;iBACrB,CAAC,CAAC;YACL,CAAC;YAED,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvF,IAAI,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gBACvD,OAAO,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACtD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;iBAChF,CAAC,CAAC;YACL,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACnG,IAAI,CAAC,GAAG,CAAC,uCAAuC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnE,OAAO,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACjE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;iBAChF,CAAC,CAAC;YACL,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7F,IAAI,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC7D,OAAO,IAAI,wBAAwB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,CAAC;YAED;gBACE,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CACpD,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEtB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YACtD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,UAA+B;QAC9D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACxC,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,OAAO;oBACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;wBACvC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,MAAM;wBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;qBACrB,CAAC,CAAC;oBACH,OAAO,EAAE,MAAM,CAAC,OAA8B;iBAC/C,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/F,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IAIhB;IACA;IAJF,WAAW,GAAkC,IAAI,GAAG,EAAE,CAAC;IAE/D,YACU,MAAiB,EACjB,UAAmB,KAAK;QADxB,WAAM,GAAN,MAAM,CAAW;QACjB,YAAO,GAAP,OAAO,CAAiB;IAC/B,CAAC;IAEI,KAAK,CAAC,aAAa,CAAC,OAAe;QACzC,IAAI,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,UAAU,EAAE,WAAW,EAAE;YAAE,OAAO,UAAU,CAAC;QAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE3D,UAAU,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE1C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,QAAgB,EAAE,UAA+B;QAC/E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,UAAU,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,UAAU,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;IAC5C,CAAC;IAED,WAAW;QACT,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACtB,SAAS,CAAkB;IAEnC,YAAY,MAAiB,EAAE,UAAmB,KAAK;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,MAAc,EACd,UAA8C;IAE9C,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC3F,KAAK,QAAQ;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC5E,KAAK,KAAK;YACR,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;YACjD,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC3C,KAAK,OAAO;YACV,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACvG;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAmB,KAAK;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;IAEtF,MAAM,WAAW,GAAG;QAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC;KACvD,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;IAE9B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;YAChD,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC/D,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;gBAC5C,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,GAAG,CAAC,kBAAkB,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC3B,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,UAAmB,KAAK;IACtE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Photon Runtime Configuration
3
+ *
4
+ * Manages ~/.photon/mcp-servers.json for MCP server configuration.
5
+ */
6
+ import type { MCPConfig, MCPServerConfig, PhotonMCPConfig } from './types.js';
7
+ export declare const PHOTON_CONFIG_DIR: string;
8
+ export declare const MCP_SERVERS_CONFIG_FILE: string;
9
+ export declare function loadPhotonMCPConfig(configPath?: string): Promise<PhotonMCPConfig>;
10
+ export declare function savePhotonMCPConfig(config: PhotonMCPConfig, configPath?: string): Promise<void>;
11
+ export declare function isMCPConfigured(mcpName: string, config?: PhotonMCPConfig): Promise<boolean>;
12
+ export declare function getMCPServerConfig(mcpName: string, config?: PhotonMCPConfig): Promise<MCPServerConfig | undefined>;
13
+ export declare function setMCPServerConfig(mcpName: string, serverConfig: MCPServerConfig, configPath?: string): Promise<void>;
14
+ export declare function removeMCPServerConfig(mcpName: string, configPath?: string): Promise<void>;
15
+ export declare function listMCPServers(configPath?: string): Promise<string[]>;
16
+ export declare function toMCPConfig(config: PhotonMCPConfig): MCPConfig;
17
+ export declare function resolveEnvVars(serverConfig: MCPServerConfig): MCPServerConfig;
18
+ export type { PhotonMCPConfig };
19
+ //# sourceMappingURL=photon-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"photon-config.d.ts","sourceRoot":"","sources":["../src/photon-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9E,eAAO,MAAM,iBAAiB,QAAqC,CAAC;AACpE,eAAO,MAAM,uBAAuB,QAAmD,CAAC;AAExF,wBAAsB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAkBvF;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrG;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAGxH;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3H;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/F;AAED,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG3E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAE9D;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,eAAe,CAoB7E;AAMD,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Photon Runtime Configuration
3
+ *
4
+ * Manages ~/.photon/mcp-servers.json for MCP server configuration.
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ export const PHOTON_CONFIG_DIR = path.join(os.homedir(), '.photon');
10
+ export const MCP_SERVERS_CONFIG_FILE = path.join(PHOTON_CONFIG_DIR, 'mcp-servers.json');
11
+ export async function loadPhotonMCPConfig(configPath) {
12
+ const filePath = configPath || MCP_SERVERS_CONFIG_FILE;
13
+ try {
14
+ const content = await fs.readFile(filePath, 'utf-8');
15
+ const config = JSON.parse(content);
16
+ if (!config.mcpServers || typeof config.mcpServers !== 'object') {
17
+ console.error(`Invalid config format in ${filePath}: missing mcpServers`);
18
+ return { mcpServers: {} };
19
+ }
20
+ return config;
21
+ }
22
+ catch (error) {
23
+ if (error.code === 'ENOENT')
24
+ return { mcpServers: {} };
25
+ console.error(`Failed to load config from ${filePath}: ${error.message}`);
26
+ return { mcpServers: {} };
27
+ }
28
+ }
29
+ export async function savePhotonMCPConfig(config, configPath) {
30
+ const filePath = configPath || MCP_SERVERS_CONFIG_FILE;
31
+ const dir = path.dirname(filePath);
32
+ await fs.mkdir(dir, { recursive: true });
33
+ await fs.writeFile(filePath, JSON.stringify(config, null, 2), 'utf-8');
34
+ }
35
+ export async function isMCPConfigured(mcpName, config) {
36
+ const cfg = config || await loadPhotonMCPConfig();
37
+ return mcpName in cfg.mcpServers;
38
+ }
39
+ export async function getMCPServerConfig(mcpName, config) {
40
+ const cfg = config || await loadPhotonMCPConfig();
41
+ return cfg.mcpServers[mcpName];
42
+ }
43
+ export async function setMCPServerConfig(mcpName, serverConfig, configPath) {
44
+ const config = await loadPhotonMCPConfig(configPath);
45
+ config.mcpServers[mcpName] = serverConfig;
46
+ await savePhotonMCPConfig(config, configPath);
47
+ }
48
+ export async function removeMCPServerConfig(mcpName, configPath) {
49
+ const config = await loadPhotonMCPConfig(configPath);
50
+ delete config.mcpServers[mcpName];
51
+ await savePhotonMCPConfig(config, configPath);
52
+ }
53
+ export async function listMCPServers(configPath) {
54
+ const config = await loadPhotonMCPConfig(configPath);
55
+ return Object.keys(config.mcpServers);
56
+ }
57
+ export function toMCPConfig(config) {
58
+ return { mcpServers: config.mcpServers };
59
+ }
60
+ export function resolveEnvVars(serverConfig) {
61
+ const resolved = { ...serverConfig };
62
+ if (resolved.env) {
63
+ const processedEnv = {};
64
+ for (const [key, value] of Object.entries(resolved.env)) {
65
+ processedEnv[key] = resolveEnvValue(value);
66
+ }
67
+ resolved.env = processedEnv;
68
+ }
69
+ if (resolved.args) {
70
+ resolved.args = resolved.args.map(resolveEnvValue);
71
+ }
72
+ if (resolved.url) {
73
+ resolved.url = resolveEnvValue(resolved.url);
74
+ }
75
+ return resolved;
76
+ }
77
+ function resolveEnvValue(value) {
78
+ return value.replace(/\$\{([^}]+)\}/g, (_, varName) => process.env[varName] || '');
79
+ }
80
+ //# sourceMappingURL=photon-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"photon-config.js","sourceRoot":"","sources":["../src/photon-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @portel/mcp type definitions
3
+ */
4
+ /**
5
+ * Tool information returned from MCP discovery
6
+ */
7
+ export interface MCPToolInfo {
8
+ name: string;
9
+ description?: string;
10
+ inputSchema?: {
11
+ type: 'object';
12
+ properties?: Record<string, any>;
13
+ required?: string[];
14
+ };
15
+ }
16
+ /**
17
+ * Result from an MCP tool call
18
+ */
19
+ export interface MCPToolResult {
20
+ content: Array<{
21
+ type: 'text' | 'image' | 'resource';
22
+ text?: string;
23
+ data?: string;
24
+ mimeType?: string;
25
+ }>;
26
+ isError?: boolean;
27
+ }
28
+ /**
29
+ * Interface that runtimes must implement to provide MCP connectivity
30
+ */
31
+ export interface MCPTransport {
32
+ callTool(mcpName: string, toolName: string, parameters: Record<string, any>): Promise<MCPToolResult>;
33
+ listTools(mcpName: string): Promise<MCPToolInfo[]>;
34
+ isConnected(mcpName: string): Promise<boolean>;
35
+ }
36
+ /**
37
+ * MCP source type - how the MCP was declared
38
+ */
39
+ export type MCPSourceType = 'npm' | 'github' | 'local' | 'url' | 'unknown';
40
+ /**
41
+ * Information about a missing MCP dependency
42
+ */
43
+ export interface MissingMCPInfo {
44
+ name: string;
45
+ source: string;
46
+ sourceType: MCPSourceType;
47
+ declaredIn?: string;
48
+ originalError?: string;
49
+ }
50
+ /**
51
+ * MCP Server configuration
52
+ */
53
+ export interface MCPServerConfig {
54
+ command?: string;
55
+ args?: string[];
56
+ cwd?: string;
57
+ env?: Record<string, string>;
58
+ url?: string;
59
+ transport?: 'stdio' | 'sse' | 'streamable-http' | 'websocket';
60
+ headers?: Record<string, string>;
61
+ }
62
+ /**
63
+ * Full MCP configuration file format
64
+ */
65
+ export interface MCPConfig {
66
+ mcpServers: Record<string, MCPServerConfig>;
67
+ }
68
+ /**
69
+ * Photon MCP servers configuration
70
+ */
71
+ export interface PhotonMCPConfig {
72
+ mcpServers: Record<string, MCPServerConfig>;
73
+ }
74
+ /**
75
+ * Elicitation options
76
+ */
77
+ export interface ElicitOptions {
78
+ prompt: string;
79
+ title?: string;
80
+ defaultValue?: string;
81
+ type?: 'text' | 'password' | 'confirm';
82
+ schema?: object;
83
+ timeout?: number;
84
+ }
85
+ /**
86
+ * Elicitation result
87
+ */
88
+ export interface ElicitResult {
89
+ success: boolean;
90
+ value?: string;
91
+ confirmed?: boolean;
92
+ error?: string;
93
+ }
94
+ /**
95
+ * Prompt handler type
96
+ */
97
+ export type PromptHandler = (message: string, defaultValue?: string) => Promise<string | null>;
98
+ /**
99
+ * Full elicit handler type
100
+ */
101
+ export type ElicitHandler = (options: ElicitOptions) => Promise<ElicitResult>;
102
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @portel/mcp type definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@portel/mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP protocol utilities - client, transport, elicitation",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "clean": "rm -rf dist",
21
+ "prepublishOnly": "npm run clean && npm run build"
22
+ },
23
+ "keywords": [
24
+ "mcp",
25
+ "model-context-protocol",
26
+ "client",
27
+ "transport",
28
+ "elicitation"
29
+ ],
30
+ "author": "Portel",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/AruLNa662/portel-mcp"
35
+ },
36
+ "dependencies": {
37
+ "@modelcontextprotocol/sdk": "^1.18.0",
38
+ "@portel/cli": "^1.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^20.0.0",
42
+ "typescript": "^5.3.0"
43
+ },
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ }
47
+ }