@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.
- package/dist/elicit.d.ts +39 -0
- package/dist/elicit.d.ts.map +1 -0
- package/dist/elicit.js +238 -0
- package/dist/elicit.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-client.d.ts +66 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +172 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-sdk-transport.d.ts +49 -0
- package/dist/mcp-sdk-transport.d.ts.map +1 -0
- package/dist/mcp-sdk-transport.js +263 -0
- package/dist/mcp-sdk-transport.js.map +1 -0
- package/dist/photon-config.d.ts +19 -0
- package/dist/photon-config.d.ts.map +1 -0
- package/dist/photon-config.js +80 -0
- package/dist/photon-config.js.map +1 -0
- package/dist/types.d.ts +102 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
package/dist/elicit.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|