@defai.digital/ax-cli 3.2.0 → 3.4.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/.ax-cli/memory.json +8 -1
- package/README.md +118 -2
- package/config/models.yaml +13 -0
- package/config/settings.yaml +6 -0
- package/dist/agent/context-manager.d.ts +5 -5
- package/dist/agent/context-manager.js +19 -9
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/dependency-resolver.js +2 -1
- package/dist/agent/dependency-resolver.js.map +1 -1
- package/dist/agent/llm-agent.d.ts +3 -2
- package/dist/agent/llm-agent.js +64 -58
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/subagent.js +2 -1
- package/dist/agent/subagent.js.map +1 -1
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.d.ts +29 -0
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js +103 -0
- package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js.map +1 -0
- package/dist/analyzers/architecture/architecture-analyzer.d.ts +58 -0
- package/dist/analyzers/architecture/architecture-analyzer.js +276 -0
- package/dist/analyzers/architecture/architecture-analyzer.js.map +1 -0
- package/dist/analyzers/architecture/index.d.ts +12 -0
- package/dist/analyzers/architecture/index.js +14 -0
- package/dist/analyzers/architecture/index.js.map +1 -0
- package/dist/analyzers/architecture/pattern-detectors/base-detector.d.ts +27 -0
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js +31 -0
- package/dist/analyzers/architecture/pattern-detectors/base-detector.js.map +1 -0
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.d.ts +11 -0
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js +57 -0
- package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js.map +1 -0
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.d.ts +11 -0
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js +43 -0
- package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js.map +1 -0
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.d.ts +11 -0
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js +49 -0
- package/dist/analyzers/architecture/pattern-detectors/repository-detector.js.map +1 -0
- package/dist/analyzers/architecture/project-structure-scanner.d.ts +54 -0
- package/dist/analyzers/architecture/project-structure-scanner.js +200 -0
- package/dist/analyzers/architecture/project-structure-scanner.js.map +1 -0
- package/dist/analyzers/best-practices/base-rule.d.ts +45 -0
- package/dist/analyzers/best-practices/base-rule.js +45 -0
- package/dist/analyzers/best-practices/base-rule.js.map +1 -0
- package/dist/analyzers/best-practices/best-practice-validator.d.ts +35 -0
- package/dist/analyzers/best-practices/best-practice-validator.js +181 -0
- package/dist/analyzers/best-practices/best-practice-validator.js.map +1 -0
- package/dist/analyzers/best-practices/rules/index.d.ts +7 -0
- package/dist/analyzers/best-practices/rules/index.js +56 -0
- package/dist/analyzers/best-practices/rules/index.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.d.ts +17 -0
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js +41 -0
- package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.d.ts +27 -0
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js +76 -0
- package/dist/analyzers/best-practices/rules/typescript/function-complexity.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/index.d.ts +15 -0
- package/dist/analyzers/best-practices/rules/typescript/index.js +16 -0
- package/dist/analyzers/best-practices/rules/typescript/index.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.d.ts +18 -0
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js +25 -0
- package/dist/analyzers/best-practices/rules/typescript/max-file-length.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.d.ts +17 -0
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js +27 -0
- package/dist/analyzers/best-practices/rules/typescript/no-any-type.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.d.ts +18 -0
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js +39 -0
- package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.d.ts +17 -0
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +32 -0
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.d.ts +17 -0
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +36 -0
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.d.ts +17 -0
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +33 -0
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.d.ts +17 -0
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +34 -0
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.d.ts +17 -0
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js +27 -0
- package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js.map +1 -0
- package/dist/analyzers/best-practices/types.d.ts +86 -0
- package/dist/analyzers/best-practices/types.js +7 -0
- package/dist/analyzers/best-practices/types.js.map +1 -0
- package/dist/analyzers/cache/analysis-cache.d.ts +41 -0
- package/dist/analyzers/cache/analysis-cache.js +84 -0
- package/dist/analyzers/cache/analysis-cache.js.map +1 -0
- package/dist/analyzers/errors.d.ts +51 -0
- package/dist/analyzers/errors.js +79 -0
- package/dist/analyzers/errors.js.map +1 -0
- package/dist/commands/doctor.js +3 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/frontend.d.ts +9 -0
- package/dist/commands/frontend.js +645 -0
- package/dist/commands/frontend.js.map +1 -0
- package/dist/commands/mcp.js +652 -3
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/models.js +2 -2
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/setup.js +100 -41
- package/dist/commands/setup.js.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/hooks/use-enhanced-input.js +16 -3
- package/dist/hooks/use-enhanced-input.js.map +1 -1
- package/dist/hooks/use-input-handler.js +9 -4
- package/dist/hooks/use-input-handler.js.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/llm/client.d.ts +1 -0
- package/dist/llm/tools.js +86 -0
- package/dist/llm/tools.js.map +1 -1
- package/dist/llm/types.d.ts +49 -22
- package/dist/llm/types.js +12 -8
- package/dist/llm/types.js.map +1 -1
- package/dist/mcp/client.d.ts +5 -0
- package/dist/mcp/client.js +55 -0
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/config.d.ts +1 -1
- package/dist/mcp/config.js +2 -2
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/health.d.ts +120 -0
- package/dist/mcp/health.js +267 -0
- package/dist/mcp/health.js.map +1 -0
- package/dist/mcp/reconnection.d.ts +93 -0
- package/dist/mcp/reconnection.js +216 -0
- package/dist/mcp/reconnection.js.map +1 -0
- package/dist/mcp/registry.d.ts +71 -0
- package/dist/mcp/registry.js +257 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/resources.d.ts +53 -0
- package/dist/mcp/resources.js +135 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/templates.d.ts +52 -0
- package/dist/mcp/templates.js +624 -0
- package/dist/mcp/templates.js.map +1 -0
- package/dist/mcp/validation.d.ts +25 -0
- package/dist/mcp/validation.js +209 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/memory/context-generator.js +1 -2
- package/dist/memory/context-generator.js.map +1 -1
- package/dist/planner/types.d.ts +2 -2
- package/dist/schemas/api-schemas.d.ts +2 -1
- package/dist/schemas/api-schemas.js +6 -4
- package/dist/schemas/api-schemas.js.map +1 -1
- package/dist/schemas/index.d.ts +4 -4
- package/dist/schemas/tool-schemas.d.ts +2 -2
- package/dist/schemas/yaml-schemas.d.ts +15 -0
- package/dist/schemas/yaml-schemas.js +3 -0
- package/dist/schemas/yaml-schemas.js.map +1 -1
- package/dist/sdk/index.d.ts +138 -0
- package/dist/sdk/index.js +173 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/types.d.ts +53 -0
- package/dist/sdk/types.js +8 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/tools/analysis-tools/architecture-tool.d.ts +46 -0
- package/dist/tools/analysis-tools/architecture-tool.js +124 -0
- package/dist/tools/analysis-tools/architecture-tool.js.map +1 -0
- package/dist/tools/analysis-tools/validation-tool.d.ts +51 -0
- package/dist/tools/analysis-tools/validation-tool.js +121 -0
- package/dist/tools/analysis-tools/validation-tool.js.map +1 -0
- package/dist/tools/bash.js +25 -10
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/web-search/cache.d.ts +62 -0
- package/dist/tools/web-search/cache.js +105 -0
- package/dist/tools/web-search/cache.js.map +1 -0
- package/dist/tools/web-search/engines/brave.d.ts +16 -0
- package/dist/tools/web-search/engines/brave.js +99 -0
- package/dist/tools/web-search/engines/brave.js.map +1 -0
- package/dist/tools/web-search/engines/crates.d.ts +19 -0
- package/dist/tools/web-search/engines/crates.js +87 -0
- package/dist/tools/web-search/engines/crates.js.map +1 -0
- package/dist/tools/web-search/engines/npm.d.ts +18 -0
- package/dist/tools/web-search/engines/npm.js +86 -0
- package/dist/tools/web-search/engines/npm.js.map +1 -0
- package/dist/tools/web-search/engines/pypi.d.ts +18 -0
- package/dist/tools/web-search/engines/pypi.js +75 -0
- package/dist/tools/web-search/engines/pypi.js.map +1 -0
- package/dist/tools/web-search/engines/tavily.d.ts +17 -0
- package/dist/tools/web-search/engines/tavily.js +73 -0
- package/dist/tools/web-search/engines/tavily.js.map +1 -0
- package/dist/tools/web-search/index.d.ts +13 -0
- package/dist/tools/web-search/index.js +13 -0
- package/dist/tools/web-search/index.js.map +1 -0
- package/dist/tools/web-search/router.d.ts +36 -0
- package/dist/tools/web-search/router.js +280 -0
- package/dist/tools/web-search/router.js.map +1 -0
- package/dist/tools/web-search/types.d.ts +45 -0
- package/dist/tools/web-search/types.js +6 -0
- package/dist/tools/web-search/types.js.map +1 -0
- package/dist/tools/web-search/web-search-tool.d.ts +51 -0
- package/dist/tools/web-search/web-search-tool.js +256 -0
- package/dist/tools/web-search/web-search-tool.js.map +1 -0
- package/dist/types/analysis.d.ts +177 -0
- package/dist/types/analysis.js +8 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/ui/components/api-key-input.js +2 -2
- package/dist/ui/components/api-key-input.js.map +1 -1
- package/dist/ui/components/chat-history.js +14 -7
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-input.js +12 -7
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.js +75 -54
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/keyboard-hints.js +5 -4
- package/dist/ui/components/keyboard-hints.js.map +1 -1
- package/dist/ui/components/quick-actions.js +1 -0
- package/dist/ui/components/quick-actions.js.map +1 -1
- package/dist/ui/components/reasoning-display.js +14 -4
- package/dist/ui/components/reasoning-display.js.map +1 -1
- package/dist/ui/components/status-bar.d.ts +1 -0
- package/dist/ui/components/status-bar.js +37 -39
- package/dist/ui/components/status-bar.js.map +1 -1
- package/dist/ui/components/toast-notification.d.ts +29 -0
- package/dist/ui/components/toast-notification.js +17 -3
- package/dist/ui/components/toast-notification.js.map +1 -1
- package/dist/ui/components/welcome-panel.d.ts +1 -0
- package/dist/ui/components/welcome-panel.js +106 -4
- package/dist/ui/components/welcome-panel.js.map +1 -1
- package/dist/utils/analysis-logger.d.ts +47 -0
- package/dist/utils/analysis-logger.js +70 -0
- package/dist/utils/analysis-logger.js.map +1 -0
- package/dist/utils/automatosx-detector.d.ts +19 -0
- package/dist/utils/automatosx-detector.js +52 -0
- package/dist/utils/automatosx-detector.js.map +1 -0
- package/dist/utils/config-loader.d.ts +4 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/confirmation-service.js +1 -1
- package/dist/utils/confirmation-service.js.map +1 -1
- package/dist/utils/init-previewer.js +26 -4
- package/dist/utils/init-previewer.js.map +1 -1
- package/dist/utils/setup-validator.js +1 -0
- package/dist/utils/setup-validator.js.map +1 -1
- package/dist/utils/text-utils.d.ts +1 -0
- package/dist/utils/text-utils.js +12 -0
- package/dist/utils/text-utils.js.map +1 -1
- package/package.json +19 -4
- package/vitest.config.ts +1 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Registry Integration (Phase 5)
|
|
3
|
+
*
|
|
4
|
+
* Enables discovery and installation of MCP servers from the GitHub MCP Registry
|
|
5
|
+
* Provides one-command install and browsing capabilities
|
|
6
|
+
*/
|
|
7
|
+
import axios from 'axios';
|
|
8
|
+
/**
|
|
9
|
+
* Search the MCP server registry
|
|
10
|
+
*/
|
|
11
|
+
export async function searchRegistry(options = {}) {
|
|
12
|
+
const { query = '', category, transport, sortBy = 'stars', limit = 20 } = options;
|
|
13
|
+
try {
|
|
14
|
+
// Search GitHub for MCP servers
|
|
15
|
+
const searchQuery = buildGitHubSearchQuery(query, category, transport);
|
|
16
|
+
const sort = sortBy === 'stars' ? 'stars' : sortBy === 'updated' ? 'updated' : undefined;
|
|
17
|
+
const response = await axios.get('https://api.github.com/search/repositories', {
|
|
18
|
+
params: {
|
|
19
|
+
q: searchQuery,
|
|
20
|
+
sort,
|
|
21
|
+
order: 'desc',
|
|
22
|
+
per_page: Math.min(limit, 100)
|
|
23
|
+
},
|
|
24
|
+
headers: {
|
|
25
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
26
|
+
'User-Agent': 'ax-cli-mcp-registry'
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
// Parse and filter results
|
|
30
|
+
const servers = response.data.items
|
|
31
|
+
.map(parseGitHubRepo)
|
|
32
|
+
.filter((server) => server !== null);
|
|
33
|
+
return servers;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (axios.isAxiosError(error) && error.response?.status === 403) {
|
|
37
|
+
throw new Error('GitHub API rate limit exceeded. Please try again later or set GITHUB_TOKEN env var.');
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`Failed to search registry: ${error instanceof Error ? error.message : String(error)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get details for a specific server from the registry
|
|
44
|
+
*/
|
|
45
|
+
export async function getRegistryServer(nameOrPackage) {
|
|
46
|
+
try {
|
|
47
|
+
// Try to find by package name first
|
|
48
|
+
if (nameOrPackage.startsWith('@')) {
|
|
49
|
+
const results = await searchRegistry({ query: nameOrPackage, limit: 5 });
|
|
50
|
+
const match = results.find(s => s.packageName === nameOrPackage);
|
|
51
|
+
if (match)
|
|
52
|
+
return match;
|
|
53
|
+
}
|
|
54
|
+
// Try to find by repository name
|
|
55
|
+
const results = await searchRegistry({ query: nameOrPackage, limit: 10 });
|
|
56
|
+
const match = results.find(s => s.name.toLowerCase() === nameOrPackage.toLowerCase() ||
|
|
57
|
+
s.displayName.toLowerCase() === nameOrPackage.toLowerCase());
|
|
58
|
+
return match || null;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
throw new Error(`Failed to fetch server details: ${error instanceof Error ? error.message : String(error)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get popular/featured MCP servers
|
|
66
|
+
*/
|
|
67
|
+
export async function getPopularServers() {
|
|
68
|
+
return searchRegistry({
|
|
69
|
+
sortBy: 'stars',
|
|
70
|
+
limit: 20
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get servers by category
|
|
75
|
+
*/
|
|
76
|
+
export async function getServersByCategory(category) {
|
|
77
|
+
return searchRegistry({
|
|
78
|
+
category,
|
|
79
|
+
sortBy: 'stars',
|
|
80
|
+
limit: 20
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Generate MCP server configuration from registry entry
|
|
85
|
+
*/
|
|
86
|
+
export function generateConfigFromRegistry(server) {
|
|
87
|
+
const config = {
|
|
88
|
+
name: server.name,
|
|
89
|
+
transport: {
|
|
90
|
+
type: server.transport
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
// Configure based on transport type
|
|
94
|
+
if (server.transport === 'stdio' && server.packageName) {
|
|
95
|
+
config.transport = {
|
|
96
|
+
type: 'stdio',
|
|
97
|
+
command: 'npx',
|
|
98
|
+
args: ['-y', server.packageName]
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
else if (server.transport === 'http' || server.transport === 'sse') {
|
|
102
|
+
// For HTTP/SSE servers, we'd need the URL from the repo
|
|
103
|
+
// This would typically be in the README or package.json
|
|
104
|
+
config.transport = {
|
|
105
|
+
type: server.transport,
|
|
106
|
+
url: server.homepage || `https://${server.name}.com`
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return config;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Build GitHub search query
|
|
113
|
+
*/
|
|
114
|
+
function buildGitHubSearchQuery(query, category, transport) {
|
|
115
|
+
const parts = [];
|
|
116
|
+
// Base search terms
|
|
117
|
+
parts.push('mcp-server');
|
|
118
|
+
parts.push('OR');
|
|
119
|
+
parts.push('model-context-protocol');
|
|
120
|
+
// Add custom query
|
|
121
|
+
if (query) {
|
|
122
|
+
parts.push(query);
|
|
123
|
+
}
|
|
124
|
+
// Add topic filter
|
|
125
|
+
parts.push('topic:mcp');
|
|
126
|
+
// Add category filter
|
|
127
|
+
if (category) {
|
|
128
|
+
parts.push(`topic:${category}`);
|
|
129
|
+
}
|
|
130
|
+
// Add transport filter
|
|
131
|
+
if (transport) {
|
|
132
|
+
parts.push(`topic:${transport}`);
|
|
133
|
+
}
|
|
134
|
+
return parts.join(' ');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Parse GitHub repository into RegistryServer
|
|
138
|
+
*/
|
|
139
|
+
function parseGitHubRepo(repo) {
|
|
140
|
+
try {
|
|
141
|
+
// Extract package name from description or README
|
|
142
|
+
const packageName = extractPackageName(repo);
|
|
143
|
+
// Determine transport type from topics
|
|
144
|
+
const transport = determineTransport(repo.topics || []);
|
|
145
|
+
// Determine category from topics
|
|
146
|
+
const category = determineCategory(repo.topics || []);
|
|
147
|
+
// Check if verified (official modelcontextprotocol org)
|
|
148
|
+
const verified = repo.owner.login === 'modelcontextprotocol';
|
|
149
|
+
return {
|
|
150
|
+
name: extractServerName(repo.name),
|
|
151
|
+
displayName: repo.name.replace(/-/g, ' ').replace(/\bmcp\b/gi, 'MCP'),
|
|
152
|
+
description: repo.description || 'No description available',
|
|
153
|
+
repository: repo.html_url,
|
|
154
|
+
stars: repo.stargazers_count,
|
|
155
|
+
category,
|
|
156
|
+
transport,
|
|
157
|
+
packageName,
|
|
158
|
+
installCommand: packageName ? `npx ${packageName}` : 'See repository for installation',
|
|
159
|
+
verified,
|
|
160
|
+
author: repo.owner.login,
|
|
161
|
+
version: undefined, // Would need to query npm or GitHub releases
|
|
162
|
+
homepage: repo.homepage || repo.html_url
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.warn(`Failed to parse repository: ${repo.name}`, error);
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extract NPM package name from repo metadata
|
|
172
|
+
*/
|
|
173
|
+
function extractPackageName(repo) {
|
|
174
|
+
// Check if description mentions package name
|
|
175
|
+
const description = repo.description || '';
|
|
176
|
+
const packageMatch = description.match(/@[\w-]+\/[\w-]+/);
|
|
177
|
+
if (packageMatch) {
|
|
178
|
+
return packageMatch[0];
|
|
179
|
+
}
|
|
180
|
+
// For official servers, construct package name
|
|
181
|
+
if (repo.owner.login === 'modelcontextprotocol' && repo.name.startsWith('server-')) {
|
|
182
|
+
return `@modelcontextprotocol/${repo.name}`;
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Determine transport type from topics
|
|
188
|
+
*/
|
|
189
|
+
function determineTransport(topics) {
|
|
190
|
+
if (topics.includes('http') || topics.includes('rest'))
|
|
191
|
+
return 'http';
|
|
192
|
+
if (topics.includes('sse') || topics.includes('server-sent-events'))
|
|
193
|
+
return 'sse';
|
|
194
|
+
return 'stdio'; // Default
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Determine category from topics
|
|
198
|
+
*/
|
|
199
|
+
function determineCategory(topics) {
|
|
200
|
+
const categoryMap = {
|
|
201
|
+
'design': 'design',
|
|
202
|
+
'figma': 'design',
|
|
203
|
+
'deployment': 'deployment',
|
|
204
|
+
'vercel': 'deployment',
|
|
205
|
+
'database': 'database',
|
|
206
|
+
'postgres': 'database',
|
|
207
|
+
'mysql': 'database',
|
|
208
|
+
'testing': 'testing',
|
|
209
|
+
'api': 'api',
|
|
210
|
+
'file-system': 'filesystem',
|
|
211
|
+
'project-management': 'project-management',
|
|
212
|
+
'linear': 'project-management',
|
|
213
|
+
'github': 'version-control',
|
|
214
|
+
'git': 'version-control'
|
|
215
|
+
};
|
|
216
|
+
for (const topic of topics) {
|
|
217
|
+
if (categoryMap[topic]) {
|
|
218
|
+
return categoryMap[topic];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return 'other';
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Extract clean server name from repository name
|
|
225
|
+
*/
|
|
226
|
+
function extractServerName(repoName) {
|
|
227
|
+
// Remove common prefixes
|
|
228
|
+
let name = repoName
|
|
229
|
+
.replace(/^mcp-server-/i, '')
|
|
230
|
+
.replace(/^server-/i, '')
|
|
231
|
+
.replace(/^mcp-/i, '');
|
|
232
|
+
// Convert to lowercase with hyphens
|
|
233
|
+
name = name.toLowerCase();
|
|
234
|
+
return name;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Format registry server for display
|
|
238
|
+
*/
|
|
239
|
+
export function formatRegistryServer(server, compact = false) {
|
|
240
|
+
if (compact) {
|
|
241
|
+
const badge = server.verified ? '✓' : '';
|
|
242
|
+
return `${server.displayName} ${badge} ⭐ ${server.stars} - ${server.description}`;
|
|
243
|
+
}
|
|
244
|
+
const lines = [];
|
|
245
|
+
lines.push(`${server.displayName} ${server.verified ? '(verified)' : ''}`);
|
|
246
|
+
lines.push(` Description: ${server.description}`);
|
|
247
|
+
lines.push(` Category: ${server.category}`);
|
|
248
|
+
lines.push(` Transport: ${server.transport}`);
|
|
249
|
+
lines.push(` Stars: ${server.stars}`);
|
|
250
|
+
lines.push(` Repository: ${server.repository}`);
|
|
251
|
+
if (server.packageName) {
|
|
252
|
+
lines.push(` Package: ${server.packageName}`);
|
|
253
|
+
}
|
|
254
|
+
lines.push(` Install: ax-cli mcp install ${server.name}`);
|
|
255
|
+
return lines.join('\n');
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Resource Management (Phase 4)
|
|
3
|
+
*
|
|
4
|
+
* Enables users to reference MCP-exposed resources using @mcp: syntax
|
|
5
|
+
* Similar to file references, but for database tables, API endpoints, etc.
|
|
6
|
+
*/
|
|
7
|
+
import type { MCPManager } from './client.js';
|
|
8
|
+
export interface MCPResource {
|
|
9
|
+
/** Resource URI (e.g., database://users, api://endpoints/get-user) */
|
|
10
|
+
uri: string;
|
|
11
|
+
/** Human-readable name */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Resource description */
|
|
14
|
+
description?: string;
|
|
15
|
+
/** MIME type if applicable */
|
|
16
|
+
mimeType?: string;
|
|
17
|
+
/** Server that provides this resource */
|
|
18
|
+
serverName: string;
|
|
19
|
+
/** Full reference string for user input: @mcp:server/uri */
|
|
20
|
+
reference: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* List all resources from MCP servers
|
|
24
|
+
*/
|
|
25
|
+
export declare function listAllResources(mcpManager: MCPManager): Promise<MCPResource[]>;
|
|
26
|
+
/**
|
|
27
|
+
* List resources from a specific MCP server
|
|
28
|
+
*/
|
|
29
|
+
export declare function listServerResources(mcpManager: MCPManager, serverName: string): Promise<MCPResource[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get resource content from MCP server
|
|
32
|
+
*/
|
|
33
|
+
export declare function getResourceContent(mcpManager: MCPManager, serverName: string, uri: string): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Parse @mcp: reference
|
|
36
|
+
* Format: @mcp:server/uri
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseMCPReference(reference: string): {
|
|
39
|
+
serverName: string;
|
|
40
|
+
uri: string;
|
|
41
|
+
} | null;
|
|
42
|
+
/**
|
|
43
|
+
* Extract all MCP references from text
|
|
44
|
+
*/
|
|
45
|
+
export declare function extractMCPReferences(text: string): string[];
|
|
46
|
+
/**
|
|
47
|
+
* Replace MCP references in text with actual content
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveMCPReferences(text: string, mcpManager: MCPManager): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Search resources by name or URI
|
|
52
|
+
*/
|
|
53
|
+
export declare function searchResources(resources: MCPResource[], query: string): MCPResource[];
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Resource Management (Phase 4)
|
|
3
|
+
*
|
|
4
|
+
* Enables users to reference MCP-exposed resources using @mcp: syntax
|
|
5
|
+
* Similar to file references, but for database tables, API endpoints, etc.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* List all resources from MCP servers
|
|
9
|
+
*/
|
|
10
|
+
export async function listAllResources(mcpManager) {
|
|
11
|
+
const resources = [];
|
|
12
|
+
const servers = mcpManager.getServers();
|
|
13
|
+
for (const serverName of servers) {
|
|
14
|
+
try {
|
|
15
|
+
const serverResources = await listServerResources(mcpManager, serverName);
|
|
16
|
+
resources.push(...serverResources);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
// Silently skip servers that don't support resources
|
|
20
|
+
console.warn(`Server "${serverName}" does not support resources or failed to list them`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return resources;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* List resources from a specific MCP server
|
|
27
|
+
*/
|
|
28
|
+
export async function listServerResources(mcpManager, serverName) {
|
|
29
|
+
try {
|
|
30
|
+
// Get the client for this server
|
|
31
|
+
const client = mcpManager.clients.get(serverName);
|
|
32
|
+
if (!client) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
// Try to list resources
|
|
36
|
+
const result = await client.listResources();
|
|
37
|
+
// Convert to our resource format
|
|
38
|
+
return result.resources.map((resource) => ({
|
|
39
|
+
uri: resource.uri,
|
|
40
|
+
name: resource.name || resource.uri,
|
|
41
|
+
description: resource.description,
|
|
42
|
+
mimeType: resource.mimeType,
|
|
43
|
+
serverName,
|
|
44
|
+
reference: `@mcp:${serverName}/${resource.uri}`
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
// Server doesn't support resources
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get resource content from MCP server
|
|
54
|
+
*/
|
|
55
|
+
export async function getResourceContent(mcpManager, serverName, uri) {
|
|
56
|
+
try {
|
|
57
|
+
const client = mcpManager.clients.get(serverName);
|
|
58
|
+
if (!client) {
|
|
59
|
+
throw new Error(`Server "${serverName}" not connected`);
|
|
60
|
+
}
|
|
61
|
+
const result = await client.readResource({ uri });
|
|
62
|
+
// Extract text content
|
|
63
|
+
if (result.contents && result.contents.length > 0) {
|
|
64
|
+
const content = result.contents[0];
|
|
65
|
+
if (content.text) {
|
|
66
|
+
return content.text;
|
|
67
|
+
}
|
|
68
|
+
if (content.blob) {
|
|
69
|
+
// Handle base64 encoded content
|
|
70
|
+
return Buffer.from(content.blob, 'base64').toString('utf-8');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error(`Failed to read resource ${uri}: ${error instanceof Error ? error.message : String(error)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Parse @mcp: reference
|
|
81
|
+
* Format: @mcp:server/uri
|
|
82
|
+
*/
|
|
83
|
+
export function parseMCPReference(reference) {
|
|
84
|
+
if (!reference.startsWith('@mcp:')) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const withoutPrefix = reference.substring(5); // Remove '@mcp:'
|
|
88
|
+
const slashIndex = withoutPrefix.indexOf('/');
|
|
89
|
+
if (slashIndex === -1) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const serverName = withoutPrefix.substring(0, slashIndex);
|
|
93
|
+
const uri = withoutPrefix.substring(slashIndex + 1);
|
|
94
|
+
return { serverName, uri };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract all MCP references from text
|
|
98
|
+
*/
|
|
99
|
+
export function extractMCPReferences(text) {
|
|
100
|
+
const pattern = /@mcp:[a-z0-9_-]+\/[^\s]+/gi;
|
|
101
|
+
const matches = text.match(pattern);
|
|
102
|
+
return matches || [];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Replace MCP references in text with actual content
|
|
106
|
+
*/
|
|
107
|
+
export async function resolveMCPReferences(text, mcpManager) {
|
|
108
|
+
const references = extractMCPReferences(text);
|
|
109
|
+
let result = text;
|
|
110
|
+
for (const reference of references) {
|
|
111
|
+
const parsed = parseMCPReference(reference);
|
|
112
|
+
if (!parsed)
|
|
113
|
+
continue;
|
|
114
|
+
try {
|
|
115
|
+
const content = await getResourceContent(mcpManager, parsed.serverName, parsed.uri);
|
|
116
|
+
// Replace reference with content (with context)
|
|
117
|
+
result = result.replace(reference, `\n--- Resource: ${reference} ---\n${content}\n--- End Resource ---\n`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// Replace with error message
|
|
121
|
+
result = result.replace(reference, `[Error: Could not load resource ${reference}]`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Search resources by name or URI
|
|
128
|
+
*/
|
|
129
|
+
export function searchResources(resources, query) {
|
|
130
|
+
const lowerQuery = query.toLowerCase();
|
|
131
|
+
return resources.filter(resource => resource.name.toLowerCase().includes(lowerQuery) ||
|
|
132
|
+
resource.uri.toLowerCase().includes(lowerQuery) ||
|
|
133
|
+
(resource.description && resource.description.toLowerCase().includes(lowerQuery)));
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-configured MCP server templates for popular services
|
|
3
|
+
* Enables one-command setup: ax-cli mcp add <name> --template
|
|
4
|
+
*/
|
|
5
|
+
import { MCPServerConfig } from '../schemas/settings-schemas.js';
|
|
6
|
+
export interface MCPServerTemplate {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
category: 'design' | 'deployment' | 'testing' | 'monitoring' | 'backend' | 'version-control';
|
|
10
|
+
officialServer: boolean;
|
|
11
|
+
config: MCPServerConfig;
|
|
12
|
+
requiredEnv: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
url?: string;
|
|
16
|
+
}>;
|
|
17
|
+
setupInstructions: string;
|
|
18
|
+
usageExamples: string[];
|
|
19
|
+
troubleshooting: Array<{
|
|
20
|
+
issue: string;
|
|
21
|
+
solution: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pre-configured templates for popular MCP servers
|
|
26
|
+
* Focus on front-end development tools
|
|
27
|
+
*/
|
|
28
|
+
export declare const TEMPLATES: Record<string, MCPServerTemplate>;
|
|
29
|
+
/**
|
|
30
|
+
* Get all available template names
|
|
31
|
+
*/
|
|
32
|
+
export declare function getTemplateNames(): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Get template by name
|
|
35
|
+
*/
|
|
36
|
+
export declare function getTemplate(name: string): MCPServerTemplate | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Get templates by category
|
|
39
|
+
*/
|
|
40
|
+
export declare function getTemplatesByCategory(category: MCPServerTemplate['category']): MCPServerTemplate[];
|
|
41
|
+
/**
|
|
42
|
+
* Search templates by keyword
|
|
43
|
+
*/
|
|
44
|
+
export declare function searchTemplates(query: string): MCPServerTemplate[];
|
|
45
|
+
/**
|
|
46
|
+
* Check if a template exists
|
|
47
|
+
*/
|
|
48
|
+
export declare function hasTemplate(name: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Generate MCP config from template with environment variables
|
|
51
|
+
*/
|
|
52
|
+
export declare function generateConfigFromTemplate(templateName: string, envVars: Record<string, string>): MCPServerConfig;
|