@dobbyai/mcp-external 1.0.1 → 1.0.2
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/__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 +207 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +49 -0
- package/dist/tools/index.js.map +1 -1
- 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,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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"}
|