@dobbyai/mcp-external 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -14
- package/dist/__tests__/tools/services.test.d.ts +2 -0
- package/dist/__tests__/tools/services.test.d.ts.map +1 -0
- package/dist/__tests__/tools/services.test.js +223 -0
- package/dist/__tests__/tools/services.test.js.map +1 -0
- package/dist/lib/dobby-client.d.ts +9 -0
- package/dist/lib/dobby-client.d.ts.map +1 -1
- package/dist/lib/dobby-client.js +37 -0
- package/dist/lib/dobby-client.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +27 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/tools/crew-builder.d.ts +165 -0
- package/dist/tools/crew-builder.d.ts.map +1 -0
- package/dist/tools/crew-builder.js +306 -0
- package/dist/tools/crew-builder.js.map +1 -0
- package/dist/tools/crewai.d.ts +140 -0
- package/dist/tools/crewai.d.ts.map +1 -0
- package/dist/tools/crewai.js +226 -0
- package/dist/tools/crewai.js.map +1 -0
- package/dist/tools/index.d.ts +453 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +83 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/jira.d.ts +437 -0
- package/dist/tools/jira.d.ts.map +1 -0
- package/dist/tools/jira.js +628 -0
- package/dist/tools/jira.js.map +1 -0
- package/dist/tools/mcp-tools.d.ts +90 -0
- package/dist/tools/mcp-tools.d.ts.map +1 -0
- package/dist/tools/mcp-tools.js +203 -0
- package/dist/tools/mcp-tools.js.map +1 -0
- package/dist/tools/services.d.ts +38 -0
- package/dist/tools/services.d.ts.map +1 -0
- package/dist/tools/services.js +166 -0
- package/dist/tools/services.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Remote Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tools for discovering and calling tools on external MCP servers
|
|
5
|
+
* through the Dobby gateway proxy.
|
|
6
|
+
*
|
|
7
|
+
* These are "meta-tools" — they let Claude Code interact with tools
|
|
8
|
+
* exposed by remote MCP-capable providers (LangSmith, Dify, n8n, etc.)
|
|
9
|
+
* without needing direct MCP transport connectivity.
|
|
10
|
+
*
|
|
11
|
+
* Flow:
|
|
12
|
+
* Claude Code → mcp_discover_tools → gateway proxy → MCP client → remote MCP server
|
|
13
|
+
* Claude Code → mcp_call_tool → gateway proxy → MCP client → remote MCP server
|
|
14
|
+
*/
|
|
15
|
+
import { DobbyClient } from '../lib/dobby-client.js';
|
|
16
|
+
export declare const mcpRemoteTools: {
|
|
17
|
+
mcp_discover_tools: {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: "object";
|
|
22
|
+
properties: {
|
|
23
|
+
connection_id: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
};
|
|
27
|
+
provider_id: {
|
|
28
|
+
type: string;
|
|
29
|
+
description: string;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
mcp_call_tool: {
|
|
35
|
+
name: string;
|
|
36
|
+
description: string;
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: "object";
|
|
39
|
+
properties: {
|
|
40
|
+
tool_name: {
|
|
41
|
+
type: string;
|
|
42
|
+
description: string;
|
|
43
|
+
};
|
|
44
|
+
tool_arguments: {
|
|
45
|
+
type: string;
|
|
46
|
+
description: string;
|
|
47
|
+
additionalProperties: boolean;
|
|
48
|
+
};
|
|
49
|
+
connection_id: {
|
|
50
|
+
type: string;
|
|
51
|
+
description: string;
|
|
52
|
+
};
|
|
53
|
+
provider_id: {
|
|
54
|
+
type: string;
|
|
55
|
+
description: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
required: string[];
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
export declare function handleMcpDiscoverTools(client: DobbyClient, args: {
|
|
63
|
+
connection_id?: string;
|
|
64
|
+
provider_id?: string;
|
|
65
|
+
}): Promise<{
|
|
66
|
+
content: {
|
|
67
|
+
type: "text";
|
|
68
|
+
text: string;
|
|
69
|
+
}[];
|
|
70
|
+
isError?: undefined;
|
|
71
|
+
} | {
|
|
72
|
+
content: {
|
|
73
|
+
type: "text";
|
|
74
|
+
text: string;
|
|
75
|
+
}[];
|
|
76
|
+
isError: boolean;
|
|
77
|
+
}>;
|
|
78
|
+
export declare function handleMcpCallTool(client: DobbyClient, args: {
|
|
79
|
+
tool_name: string;
|
|
80
|
+
tool_arguments: Record<string, unknown>;
|
|
81
|
+
connection_id?: string;
|
|
82
|
+
provider_id?: string;
|
|
83
|
+
}): Promise<{
|
|
84
|
+
isError?: boolean | undefined;
|
|
85
|
+
content: {
|
|
86
|
+
type: "text";
|
|
87
|
+
text: string;
|
|
88
|
+
}[];
|
|
89
|
+
}>;
|
|
90
|
+
//# sourceMappingURL=mcp-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAMrD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0D1B,CAAC;AAkDF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;GAwDvD;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IACJ,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;;;;;;GAqDF"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Remote Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tools for discovering and calling tools on external MCP servers
|
|
5
|
+
* through the Dobby gateway proxy.
|
|
6
|
+
*
|
|
7
|
+
* These are "meta-tools" — they let Claude Code interact with tools
|
|
8
|
+
* exposed by remote MCP-capable providers (LangSmith, Dify, n8n, etc.)
|
|
9
|
+
* without needing direct MCP transport connectivity.
|
|
10
|
+
*
|
|
11
|
+
* Flow:
|
|
12
|
+
* Claude Code → mcp_discover_tools → gateway proxy → MCP client → remote MCP server
|
|
13
|
+
* Claude Code → mcp_call_tool → gateway proxy → MCP client → remote MCP server
|
|
14
|
+
*/
|
|
15
|
+
// ============================================
|
|
16
|
+
// Tool Definitions
|
|
17
|
+
// ============================================
|
|
18
|
+
export const mcpRemoteTools = {
|
|
19
|
+
mcp_discover_tools: {
|
|
20
|
+
name: 'mcp_discover_tools',
|
|
21
|
+
description: 'Discover tools available on a remote MCP server connected through Dobby. ' +
|
|
22
|
+
'Connects to the MCP server configured on the provider connection, ' +
|
|
23
|
+
'runs tools/list, and returns the full tool catalog. ' +
|
|
24
|
+
'Results are cached on the connection for future reference.',
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: {
|
|
28
|
+
connection_id: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'Optional: specific connection ID. If omitted, uses the first active MCP-capable connection for the specified provider.',
|
|
31
|
+
},
|
|
32
|
+
provider_id: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'Optional: provider ID to filter connections (e.g., "langsmith", "dify", "n8n"). Defaults to "langsmith".',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
mcp_call_tool: {
|
|
40
|
+
name: 'mcp_call_tool',
|
|
41
|
+
description: 'Call a tool on a remote MCP server connected through Dobby. ' +
|
|
42
|
+
'Use mcp_discover_tools first to see available tools and their input schemas. ' +
|
|
43
|
+
'The tool call is proxied through the gateway with full auth and audit logging.',
|
|
44
|
+
inputSchema: {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: {
|
|
47
|
+
tool_name: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'Name of the MCP tool to call (from mcp_discover_tools results).',
|
|
50
|
+
},
|
|
51
|
+
tool_arguments: {
|
|
52
|
+
type: 'object',
|
|
53
|
+
description: 'Input arguments for the tool, matching its inputSchema.',
|
|
54
|
+
additionalProperties: true,
|
|
55
|
+
},
|
|
56
|
+
connection_id: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Optional: specific connection ID. If omitted, uses the first active MCP-capable connection for the specified provider.',
|
|
59
|
+
},
|
|
60
|
+
provider_id: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Optional: provider ID to filter connections (e.g., "langsmith", "dify", "n8n"). Defaults to "langsmith".',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
required: ['tool_name', 'tool_arguments'],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
async function callMcpGatewayProxy(client, payload) {
|
|
70
|
+
const url = `${client.apiUrl}/api/v1/gateway/agents/proxy`;
|
|
71
|
+
const response = await fetch(url, {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
headers: {
|
|
74
|
+
'Content-Type': 'application/json',
|
|
75
|
+
Authorization: `Bearer ${client.apiKey}`,
|
|
76
|
+
...(client.tenantId ? { 'X-Tenant-Id': client.tenantId } : {}),
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
...payload,
|
|
80
|
+
provider_id: payload.provider_id || 'langsmith',
|
|
81
|
+
}),
|
|
82
|
+
});
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
const errBody = await response.json().catch(() => ({
|
|
85
|
+
error: `Gateway proxy returned ${response.status}`,
|
|
86
|
+
}));
|
|
87
|
+
throw new Error(errBody.error ||
|
|
88
|
+
`Gateway proxy error: HTTP ${response.status}`);
|
|
89
|
+
}
|
|
90
|
+
return response.json();
|
|
91
|
+
}
|
|
92
|
+
// ============================================
|
|
93
|
+
// Tool Handlers
|
|
94
|
+
// ============================================
|
|
95
|
+
export async function handleMcpDiscoverTools(client, args) {
|
|
96
|
+
try {
|
|
97
|
+
const data = await callMcpGatewayProxy(client, {
|
|
98
|
+
action: 'mcp_discover_tools',
|
|
99
|
+
connection_id: args.connection_id,
|
|
100
|
+
provider_id: args.provider_id,
|
|
101
|
+
});
|
|
102
|
+
const tools = data.response?.tools || [];
|
|
103
|
+
const conn = data.connection || {};
|
|
104
|
+
const mcpStatus = data.response?.mcp_status || 'unknown';
|
|
105
|
+
let text = `# MCP Tool Discovery\n\n`;
|
|
106
|
+
text += `- **Provider:** ${conn.provider_id || args.provider_id || 'langsmith'}\n`;
|
|
107
|
+
text += `- **Connection:** ${conn.display_name || conn.connection_id || 'auto'}\n`;
|
|
108
|
+
text += `- **MCP Status:** ${mcpStatus}\n`;
|
|
109
|
+
text += `- **Tools Found:** ${tools.length}\n`;
|
|
110
|
+
text += `- **Latency:** ${data.latency_ms}ms\n\n`;
|
|
111
|
+
if (tools.length > 0) {
|
|
112
|
+
text += `## Available Tools\n\n`;
|
|
113
|
+
for (const tool of tools) {
|
|
114
|
+
text += `### ${tool.name}\n`;
|
|
115
|
+
if (tool.description) {
|
|
116
|
+
text += `${tool.description}\n`;
|
|
117
|
+
}
|
|
118
|
+
if (tool.inputSchema && Object.keys(tool.inputSchema).length > 0) {
|
|
119
|
+
const props = tool.inputSchema.properties;
|
|
120
|
+
if (props) {
|
|
121
|
+
text += `\n**Parameters:**\n`;
|
|
122
|
+
for (const [key, schema] of Object.entries(props)) {
|
|
123
|
+
const s = schema;
|
|
124
|
+
text += `- \`${key}\` (${s.type || 'any'})${s.description ? ` — ${s.description}` : ''}\n`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
text += '\n';
|
|
129
|
+
}
|
|
130
|
+
text += `Use \`mcp_call_tool\` with the tool name and arguments to execute a tool.`;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
text += `No tools found. The MCP server may not expose any tools, or the connection may need to be reconfigured.`;
|
|
134
|
+
}
|
|
135
|
+
return { content: [{ type: 'text', text }] };
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return {
|
|
139
|
+
content: [
|
|
140
|
+
{
|
|
141
|
+
type: 'text',
|
|
142
|
+
text: `MCP tool discovery failed: ${error.message}`,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
isError: true,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function handleMcpCallTool(client, args) {
|
|
150
|
+
try {
|
|
151
|
+
const data = await callMcpGatewayProxy(client, {
|
|
152
|
+
action: 'mcp_call_tool',
|
|
153
|
+
tool_name: args.tool_name,
|
|
154
|
+
tool_arguments: args.tool_arguments,
|
|
155
|
+
connection_id: args.connection_id,
|
|
156
|
+
provider_id: args.provider_id,
|
|
157
|
+
});
|
|
158
|
+
const conn = data.connection || {};
|
|
159
|
+
const content = data.response?.content || [];
|
|
160
|
+
const isError = data.response?.is_error || false;
|
|
161
|
+
let text = `# MCP Tool Call Result\n\n`;
|
|
162
|
+
text += `- **Tool:** ${args.tool_name}\n`;
|
|
163
|
+
text += `- **Provider:** ${conn.provider_id || args.provider_id || 'langsmith'}\n`;
|
|
164
|
+
text += `- **Status:** ${isError ? 'Error' : 'Success'}\n`;
|
|
165
|
+
text += `- **Latency:** ${data.latency_ms}ms\n\n`;
|
|
166
|
+
if (content.length > 0) {
|
|
167
|
+
text += `## Output\n\n`;
|
|
168
|
+
for (const item of content) {
|
|
169
|
+
if (item.type === 'text' && item.text) {
|
|
170
|
+
text += item.text + '\n';
|
|
171
|
+
}
|
|
172
|
+
else if (item.type === 'resource') {
|
|
173
|
+
text += `[Resource: ${item.mimeType || 'unknown type'}]\n`;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
text += `[${item.type}]\n`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else if (data.error) {
|
|
181
|
+
text += `## Error\n\n${data.error}\n`;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
text += `Tool returned no content.\n`;
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
content: [{ type: 'text', text }],
|
|
188
|
+
...(isError ? { isError: true } : {}),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
return {
|
|
193
|
+
content: [
|
|
194
|
+
{
|
|
195
|
+
type: 'text',
|
|
196
|
+
text: `MCP tool call failed: ${error.message}`,
|
|
197
|
+
},
|
|
198
|
+
],
|
|
199
|
+
isError: true,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=mcp-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../src/tools/mcp-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Discovery Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tools for discovering available services and capabilities.
|
|
5
|
+
*/
|
|
6
|
+
import { DobbyClient } from '../lib/dobby-client.js';
|
|
7
|
+
export declare const serviceTools: {
|
|
8
|
+
list_services: {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: "object";
|
|
13
|
+
properties: {
|
|
14
|
+
category: {
|
|
15
|
+
type: string;
|
|
16
|
+
enum: string[];
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export declare function handleListServices(client: DobbyClient, args: {
|
|
24
|
+
category?: string;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
content: {
|
|
27
|
+
type: "text";
|
|
28
|
+
text: string;
|
|
29
|
+
}[];
|
|
30
|
+
isError?: undefined;
|
|
31
|
+
} | {
|
|
32
|
+
content: {
|
|
33
|
+
type: "text";
|
|
34
|
+
text: string;
|
|
35
|
+
}[];
|
|
36
|
+
isError: boolean;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/tools/services.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAMrD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;CAgBxB,CAAC;AAMF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;GAuB5B"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Discovery Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tools for discovering available services and capabilities.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================
|
|
7
|
+
// Tool Definitions
|
|
8
|
+
// ============================================
|
|
9
|
+
export const serviceTools = {
|
|
10
|
+
list_services: {
|
|
11
|
+
name: 'list_services',
|
|
12
|
+
description: 'List all services and capabilities available in the current tenant. Returns connected LLM models, available models to connect, MCP tools, integrations, and managed services.',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
category: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
enum: ['all', 'llm', 'mcp_tools', 'integrations', 'managed_services'],
|
|
19
|
+
description: 'Filter by service category. Defaults to "all".',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
// ============================================
|
|
26
|
+
// Tool Handlers
|
|
27
|
+
// ============================================
|
|
28
|
+
export async function handleListServices(client, args) {
|
|
29
|
+
try {
|
|
30
|
+
const data = await client.listServices({
|
|
31
|
+
category: args.category || 'all',
|
|
32
|
+
});
|
|
33
|
+
const text = formatServiceDiscovery(data, args.category);
|
|
34
|
+
return {
|
|
35
|
+
content: [{ type: 'text', text }],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: 'text',
|
|
43
|
+
text: `Failed to discover services: ${error.message}`,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
isError: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ============================================
|
|
51
|
+
// Formatting
|
|
52
|
+
// ============================================
|
|
53
|
+
function formatServiceDiscovery(data, category) {
|
|
54
|
+
let text = '# Available Services\n\n';
|
|
55
|
+
// Context
|
|
56
|
+
if (data.context) {
|
|
57
|
+
text += `## Your Access Context\n`;
|
|
58
|
+
text += `- **Organization:** ${data.context.org_id}\n`;
|
|
59
|
+
text += `- **Tenant:** ${data.context.tenant_id}\n`;
|
|
60
|
+
text += `- **Key Type:** ${data.context.key_type}\n`;
|
|
61
|
+
text += `- **Scopes:** ${data.context.scopes.join(', ')}\n\n`;
|
|
62
|
+
}
|
|
63
|
+
const showAll = !category || category === 'all';
|
|
64
|
+
// LLM Models (connected + available)
|
|
65
|
+
if (data.llm && (showAll || category === 'llm')) {
|
|
66
|
+
const totalConnected = data.llm.total_connected_models || 0;
|
|
67
|
+
const totalAvailable = data.llm.total_available_models || 0;
|
|
68
|
+
text += `## LLM Models (${totalConnected} connected, ${totalAvailable} available to connect)\n\n`;
|
|
69
|
+
// Connected providers
|
|
70
|
+
if (data.llm.connected_providers?.length > 0) {
|
|
71
|
+
text += `### Connected Providers\n`;
|
|
72
|
+
for (const provider of data.llm.connected_providers) {
|
|
73
|
+
const validIcon = provider.is_valid ? '✅' : '⚠️';
|
|
74
|
+
text += `#### ${validIcon} ${provider.provider_name}`;
|
|
75
|
+
if (provider.key_prefix)
|
|
76
|
+
text += ` (key: ${provider.key_prefix}…)`;
|
|
77
|
+
text += '\n';
|
|
78
|
+
for (const model of provider.models || []) {
|
|
79
|
+
text += `- **${model.display_name || model.name}** (\`${model.id}\`) — ${model.context_window?.toLocaleString()} ctx`;
|
|
80
|
+
if (model.supports_vision)
|
|
81
|
+
text += ' | vision';
|
|
82
|
+
text += '\n';
|
|
83
|
+
}
|
|
84
|
+
text += '\n';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
text += `### Connected Providers\n`;
|
|
89
|
+
text += `_No LLM providers connected yet._\n\n`;
|
|
90
|
+
}
|
|
91
|
+
// Available providers (catalog)
|
|
92
|
+
if (data.llm.available_providers?.length > 0) {
|
|
93
|
+
text += `### Available to Connect\n`;
|
|
94
|
+
for (const provider of data.llm.available_providers) {
|
|
95
|
+
text += `- **${provider.provider_name}** — ${provider.models?.length || 0} models available\n`;
|
|
96
|
+
}
|
|
97
|
+
text += '\n';
|
|
98
|
+
}
|
|
99
|
+
if (data.llm.policy) {
|
|
100
|
+
text += `### Policy Limits\n`;
|
|
101
|
+
if (data.llm.policy.max_cost_per_request != null)
|
|
102
|
+
text += `- Max cost/request: $${data.llm.policy.max_cost_per_request}\n`;
|
|
103
|
+
if (data.llm.policy.daily_cost_limit != null)
|
|
104
|
+
text += `- Daily limit: $${data.llm.policy.daily_cost_limit}\n`;
|
|
105
|
+
if (data.llm.policy.rate_limit_rpm != null)
|
|
106
|
+
text += `- Rate limit: ${data.llm.policy.rate_limit_rpm} RPM\n`;
|
|
107
|
+
text += '\n';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// MCP Tools (unchanged)
|
|
111
|
+
if (data.mcp_tools && (showAll || category === 'mcp_tools')) {
|
|
112
|
+
text += `## MCP Tools (${data.mcp_tools.total_tools} total)\n\n`;
|
|
113
|
+
text += `Read: ${data.mcp_tools.read_tools} | Execute: ${data.mcp_tools.execute_tools}\n\n`;
|
|
114
|
+
for (const tool of data.mcp_tools.available || []) {
|
|
115
|
+
const icon = tool.accessible ? '✅' : '🔒';
|
|
116
|
+
text += `- ${icon} **${tool.name}** [${tool.scope}] — ${tool.description}\n`;
|
|
117
|
+
}
|
|
118
|
+
text += '\n';
|
|
119
|
+
}
|
|
120
|
+
// Integrations (replaces old mcp_servers)
|
|
121
|
+
if (data.integrations && (showAll || category === 'integrations')) {
|
|
122
|
+
const connectedCount = data.integrations.connected?.length || 0;
|
|
123
|
+
const availableCount = data.integrations.available?.length || 0;
|
|
124
|
+
text += `## Integrations (${connectedCount} connected, ${availableCount} available)\n\n`;
|
|
125
|
+
if (data.integrations.connected?.length > 0) {
|
|
126
|
+
text += `### Connected\n`;
|
|
127
|
+
for (const integ of data.integrations.connected) {
|
|
128
|
+
const validIcon = integ.is_valid ? '✅' : '⚠️';
|
|
129
|
+
text += `- ${validIcon} **${integ.name}** [${integ.category}]`;
|
|
130
|
+
if (integ.key_prefix)
|
|
131
|
+
text += ` (key: ${integ.key_prefix}…)`;
|
|
132
|
+
text += '\n';
|
|
133
|
+
}
|
|
134
|
+
text += '\n';
|
|
135
|
+
}
|
|
136
|
+
if (data.integrations.available?.length > 0) {
|
|
137
|
+
text += `### Available to Connect\n`;
|
|
138
|
+
for (const integ of data.integrations.available) {
|
|
139
|
+
text += `- **${integ.name}** [${integ.category}] — ${integ.description}\n`;
|
|
140
|
+
}
|
|
141
|
+
text += '\n';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Managed Services (unchanged)
|
|
145
|
+
if (data.managed_services?.length > 0 && (showAll || category === 'managed_services')) {
|
|
146
|
+
const enabled = data.managed_services.filter((s) => s.is_enabled);
|
|
147
|
+
const disabled = data.managed_services.filter((s) => !s.is_enabled);
|
|
148
|
+
text += `## Managed Services (${enabled.length} enabled, ${disabled.length} available)\n\n`;
|
|
149
|
+
if (enabled.length > 0) {
|
|
150
|
+
text += `### Enabled\n`;
|
|
151
|
+
for (const svc of enabled) {
|
|
152
|
+
text += `- ✅ **${svc.name}** [${svc.category}] — ${svc.description}\n`;
|
|
153
|
+
}
|
|
154
|
+
text += '\n';
|
|
155
|
+
}
|
|
156
|
+
if (disabled.length > 0) {
|
|
157
|
+
text += `### Available (not enabled)\n`;
|
|
158
|
+
for (const svc of disabled) {
|
|
159
|
+
text += `- ${svc.name} [${svc.category}] — ${svc.description}\n`;
|
|
160
|
+
}
|
|
161
|
+
text += '\n';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return text;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/tools/services.ts"],"names":[],"mappings":"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"}
|