@khanglvm/jira-mcp 1.3.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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +126 -0
  3. package/dist/client.d.ts +287 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +235 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config-fetcher.d.ts +30 -0
  8. package/dist/config-fetcher.d.ts.map +1 -0
  9. package/dist/config-fetcher.js +279 -0
  10. package/dist/config-fetcher.js.map +1 -0
  11. package/dist/config.d.ts +54 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +66 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +12 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +228 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp-registry.d.ts +106 -0
  20. package/dist/mcp-registry.d.ts.map +1 -0
  21. package/dist/mcp-registry.js +168 -0
  22. package/dist/mcp-registry.js.map +1 -0
  23. package/dist/setup.d.ts +41 -0
  24. package/dist/setup.d.ts.map +1 -0
  25. package/dist/setup.js +263 -0
  26. package/dist/setup.js.map +1 -0
  27. package/dist/tools/index.d.ts +10 -0
  28. package/dist/tools/index.d.ts.map +1 -0
  29. package/dist/tools/index.js +10 -0
  30. package/dist/tools/index.js.map +1 -0
  31. package/dist/tools/issues.d.ts +364 -0
  32. package/dist/tools/issues.d.ts.map +1 -0
  33. package/dist/tools/issues.js +392 -0
  34. package/dist/tools/issues.js.map +1 -0
  35. package/dist/tools/projects.d.ts +70 -0
  36. package/dist/tools/projects.d.ts.map +1 -0
  37. package/dist/tools/projects.js +101 -0
  38. package/dist/tools/projects.js.map +1 -0
  39. package/dist/tools/search.d.ts +76 -0
  40. package/dist/tools/search.d.ts.map +1 -0
  41. package/dist/tools/search.js +111 -0
  42. package/dist/tools/search.js.map +1 -0
  43. package/dist/tools/transitions.d.ts +99 -0
  44. package/dist/tools/transitions.d.ts.map +1 -0
  45. package/dist/tools/transitions.js +121 -0
  46. package/dist/tools/transitions.js.map +1 -0
  47. package/dist/tools/users.d.ts +70 -0
  48. package/dist/tools/users.d.ts.map +1 -0
  49. package/dist/tools/users.js +96 -0
  50. package/dist/tools/users.js.map +1 -0
  51. package/dist/types/mcp-config.d.ts +154 -0
  52. package/dist/types/mcp-config.d.ts.map +1 -0
  53. package/dist/types/mcp-config.js +7 -0
  54. package/dist/types/mcp-config.js.map +1 -0
  55. package/dist/utils/path-resolver.d.ts +16 -0
  56. package/dist/utils/path-resolver.d.ts.map +1 -0
  57. package/dist/utils/path-resolver.js +37 -0
  58. package/dist/utils/path-resolver.js.map +1 -0
  59. package/package.json +61 -0
package/dist/index.js ADDED
@@ -0,0 +1,228 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @file index.ts
4
+ * @description Main entry point for the Jira MCP server.
5
+ * Supports two modes:
6
+ * 1. MCP Server mode (default) - Runs as stdio MCP server for AI tools
7
+ * 2. Setup mode - Injects MCP configuration into AI tool config files
8
+ */
9
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
10
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
11
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
12
+ import { loadConfig } from './config.js';
13
+ import { JiraClient, JiraApiError } from './client.js';
14
+ // Export MCP registry types for external use
15
+ export * from './types/mcp-config.js';
16
+ export { createRegistry, createRegistryFromConfig, McpRegistry } from './mcp-registry.js';
17
+ export { fetchMcpConfig, clearCache, getCacheStatus } from './config-fetcher.js';
18
+ import { createIssueTools, issueToolDefinitions, createSearchTools, searchToolDefinitions, createProjectTools, projectToolDefinitions, createTransitionTools, transitionToolDefinitions, createUserTools, userToolDefinitions, } from './tools/index.js';
19
+ import { parseSetupArgs, injectMcpConfig, printSetupHelp, printSupportedClis, } from './setup.js';
20
+ /**
21
+ * Package information for server identification.
22
+ */
23
+ const SERVER_INFO = {
24
+ name: '@khanglvm/jira-mcp',
25
+ version: '1.0.0',
26
+ };
27
+ /**
28
+ * Prints general help message.
29
+ */
30
+ function printHelp() {
31
+ console.log(`
32
+ @khanglvm/jira-mcp - Jira MCP Server for Legacy Jira Server (Basic Auth)
33
+
34
+ MODES:
35
+
36
+ 1. MCP Server Mode (default)
37
+ Run as an MCP server for AI tools to connect to.
38
+
39
+ Required Environment Variables:
40
+ JIRA_BASE_URL - Jira server URL (e.g., https://jira.example.com)
41
+ JIRA_USERNAME - Username for basic auth
42
+ JIRA_PASSWORD - Password for basic auth
43
+
44
+ Usage:
45
+ npx @khanglvm/jira-mcp
46
+
47
+ 2. Setup Mode
48
+ Inject MCP configuration into AI tool config files.
49
+
50
+ Usage:
51
+ npx @khanglvm/jira-mcp setup -c <cli> -b <url> -u <user> -p <pass> [-s <scope>]
52
+
53
+ Run 'npx @khanglvm/jira-mcp setup --help' for more details.
54
+
55
+ COMMANDS:
56
+ setup Configure MCP in AI tool config files
57
+ list-clis List supported AI CLI tools
58
+ --help Show this help message
59
+ --version Show version
60
+
61
+ EXAMPLES:
62
+ # Run as MCP server
63
+ JIRA_BASE_URL=https://jira.example.com JIRA_USERNAME=admin JIRA_PASSWORD=secret npx @khanglvm/jira-mcp
64
+
65
+ # Setup for Claude Code
66
+ npx @khanglvm/jira-mcp setup -c claude-code -b https://jira.example.com -u admin -p secret
67
+
68
+ # Setup for Cursor (project scope)
69
+ npx @khanglvm/jira-mcp setup -c cursor -b https://jira.example.com -u admin -p secret -s project
70
+ `);
71
+ }
72
+ /**
73
+ * Handles CLI commands and arguments.
74
+ * @returns true if handled as CLI command, false to continue as MCP server
75
+ */
76
+ async function handleCliCommands() {
77
+ const args = process.argv.slice(2);
78
+ if (args.length === 0) {
79
+ return false; // No args, run as MCP server
80
+ }
81
+ const command = args[0];
82
+ switch (command) {
83
+ case '--help':
84
+ case '-h':
85
+ case 'help':
86
+ printHelp();
87
+ return true;
88
+ case '--version':
89
+ case '-v':
90
+ console.log(SERVER_INFO.version);
91
+ return true;
92
+ case 'list-clis':
93
+ printSupportedClis();
94
+ return true;
95
+ case 'setup': {
96
+ const setupArgs = args.slice(1);
97
+ if (setupArgs.length === 0 || setupArgs.includes('--help') || setupArgs.includes('-h')) {
98
+ printSetupHelp();
99
+ return true;
100
+ }
101
+ const options = parseSetupArgs(setupArgs);
102
+ if (!options) {
103
+ console.error('Error: Invalid arguments. Run with --help for usage.\n');
104
+ printSetupHelp();
105
+ process.exit(1);
106
+ }
107
+ const result = await injectMcpConfig(options);
108
+ console.log(result.message);
109
+ if (!result.success) {
110
+ process.exit(1);
111
+ }
112
+ return true;
113
+ }
114
+ default:
115
+ // Unknown command, check if it looks like MCP server mode
116
+ if (command.startsWith('-')) {
117
+ console.error(`Unknown option: ${command}`);
118
+ printHelp();
119
+ process.exit(1);
120
+ }
121
+ return false;
122
+ }
123
+ }
124
+ /**
125
+ * Main function to initialize and run the MCP server.
126
+ */
127
+ async function runMcpServer() {
128
+ // Load and validate configuration from environment
129
+ let config;
130
+ try {
131
+ config = loadConfig();
132
+ }
133
+ catch (error) {
134
+ console.error(error.message);
135
+ process.exit(1);
136
+ }
137
+ // Initialize Jira client
138
+ const jiraClient = new JiraClient(config);
139
+ // Create tool handlers
140
+ const issueTools = createIssueTools(jiraClient);
141
+ const searchTools = createSearchTools(jiraClient);
142
+ const projectTools = createProjectTools(jiraClient);
143
+ const transitionTools = createTransitionTools(jiraClient);
144
+ const userTools = createUserTools(jiraClient);
145
+ // Combine all tool handlers with type assertion
146
+ // Individual handlers have stricter param types, but we know the SDK will provide correct args
147
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
148
+ const allToolHandlers = {
149
+ ...issueTools,
150
+ ...searchTools,
151
+ ...projectTools,
152
+ ...transitionTools,
153
+ ...userTools,
154
+ };
155
+ // Combine all tool definitions
156
+ const allToolDefinitions = [
157
+ ...issueToolDefinitions,
158
+ ...searchToolDefinitions,
159
+ ...projectToolDefinitions,
160
+ ...transitionToolDefinitions,
161
+ ...userToolDefinitions,
162
+ ];
163
+ // Create MCP server
164
+ const server = new Server(SERVER_INFO, {
165
+ capabilities: {
166
+ tools: {},
167
+ },
168
+ });
169
+ // Register list_tools handler
170
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
171
+ return {
172
+ tools: allToolDefinitions,
173
+ };
174
+ });
175
+ // Register call_tool handler
176
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
177
+ const { name, arguments: args } = request.params;
178
+ const handler = allToolHandlers[name];
179
+ if (!handler) {
180
+ throw new Error(`Unknown tool: ${name}`);
181
+ }
182
+ try {
183
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
184
+ return await handler(args);
185
+ }
186
+ catch (error) {
187
+ // Handle Jira API errors gracefully
188
+ if (error instanceof JiraApiError) {
189
+ return {
190
+ content: [
191
+ {
192
+ type: 'text',
193
+ text: JSON.stringify({
194
+ error: true,
195
+ message: error.message,
196
+ statusCode: error.statusCode,
197
+ details: error.body,
198
+ }, null, 2),
199
+ },
200
+ ],
201
+ isError: true,
202
+ };
203
+ }
204
+ // Re-throw unexpected errors
205
+ throw error;
206
+ }
207
+ });
208
+ // Create stdio transport and connect
209
+ const transport = new StdioServerTransport();
210
+ await server.connect(transport);
211
+ // Log successful startup to stderr (not stdout, to avoid interfering with MCP protocol)
212
+ console.error(`Jira MCP server started - connected to ${config.JIRA_BASE_URL}`);
213
+ }
214
+ // Main entry point
215
+ (async () => {
216
+ if (await handleCliCommands()) {
217
+ // CLI command handled, exit normally
218
+ process.exit(0);
219
+ }
220
+ else {
221
+ // Run as MCP server
222
+ runMcpServer().catch((error) => {
223
+ console.error('Fatal error:', error);
224
+ process.exit(1);
225
+ });
226
+ }
227
+ })();
228
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @file mcp-registry.ts
3
+ * @description MCP client registry for dynamic tool configuration.
4
+ * Provides query methods for accessing MCP client configs by scope/platform.
5
+ */
6
+ import type { McpConfigSchema, McpClientConfig, ConfigScope, TransportType, WrapperKey } from './types/mcp-config.js';
7
+ /**
8
+ * MCP Registry class for querying client configurations.
9
+ * Caches config data and provides filtering methods.
10
+ */
11
+ export declare class McpRegistry {
12
+ private config;
13
+ private clients;
14
+ constructor(config: McpConfigSchema);
15
+ /**
16
+ * Gets all client configurations.
17
+ */
18
+ getAllClients(): McpClientConfig[];
19
+ /**
20
+ * Gets a specific client by name.
21
+ * Returns null if client not found.
22
+ */
23
+ getClient(name: string): McpClientConfig | null;
24
+ /**
25
+ * Gets clients filtered by scope capability.
26
+ * Returns clients that support the given scope.
27
+ */
28
+ getClientsByScope(scope: ConfigScope): McpClientConfig[];
29
+ /**
30
+ * Gets clients that have detectable config paths for the platform.
31
+ */
32
+ getDetectableClients(platform: NodeJS.Platform): McpClientConfig[];
33
+ /**
34
+ * Gets config file paths for a client on the current platform.
35
+ */
36
+ getConfigPaths(clientName: string, platform: NodeJS.Platform): string[];
37
+ /**
38
+ * Gets scopes supported by a client.
39
+ */
40
+ getScopesForClient(name: string): ConfigScope[];
41
+ /**
42
+ * Checks if a client supports a specific scope.
43
+ */
44
+ supportsScope(name: string, scope: ConfigScope): boolean;
45
+ /**
46
+ * Gets transport types supported by a client.
47
+ */
48
+ getTransportsForClient(name: string): TransportType[];
49
+ /**
50
+ * Gets wrapper key for a client (mcpServers, mcp, servers, etc.).
51
+ */
52
+ getWrapperKey(name: string): WrapperKey | null;
53
+ /**
54
+ * Gets clients filtered by wrapper key.
55
+ * Useful for grouping clients by config format.
56
+ */
57
+ getClientsByWrapperKey(wrapperKey: WrapperKey): McpClientConfig[];
58
+ /**
59
+ * Gets clients that support a specific transport type.
60
+ */
61
+ getClientsByTransport(transport: TransportType): McpClientConfig[];
62
+ /**
63
+ * Gets CLI commands for a client (if available).
64
+ */
65
+ getCliCommands(name: string): McpClientConfig['cli'];
66
+ /**
67
+ * Checks if a client has CLI management support.
68
+ */
69
+ hasCliSupport(name: string): boolean;
70
+ /**
71
+ * Gets config format type for a client (json, yaml, toml).
72
+ */
73
+ getConfigFormat(name: string): string;
74
+ /**
75
+ * Gets all client names.
76
+ */
77
+ getClientNames(): string[];
78
+ /**
79
+ * Searches clients by name (case-insensitive partial match).
80
+ */
81
+ searchClients(query: string): McpClientConfig[];
82
+ /**
83
+ * Gets registry metadata.
84
+ */
85
+ getMetadata(): {
86
+ version: string;
87
+ lastUpdated: string;
88
+ clientCount: number;
89
+ };
90
+ }
91
+ /**
92
+ * Creates an MCP registry instance by fetching config.
93
+ * This is the main entry point for using the registry.
94
+ *
95
+ * @param options - Fetch options for getting config
96
+ * @returns Initialized MCP registry
97
+ */
98
+ export declare function createRegistry(options?: {
99
+ forceRefresh?: boolean;
100
+ }): Promise<McpRegistry>;
101
+ /**
102
+ * Creates a registry from existing config data.
103
+ * Useful for testing or using cached config.
104
+ */
105
+ export declare function createRegistryFromConfig(config: McpConfigSchema): McpRegistry;
106
+ //# sourceMappingURL=mcp-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.d.ts","sourceRoot":"","sources":["../src/mcp-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACR,eAAe,EACf,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,EACb,MAAM,uBAAuB,CAAC;AAI/B;;;GAGG;AACH,qBAAa,WAAW;IAGR,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,OAAO,CAA+B;gBAE1B,MAAM,EAAE,eAAe;IAI3C;;OAEG;IACH,aAAa,IAAI,eAAe,EAAE;IAIlC;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAI/C;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,EAAE;IAMxD;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,eAAe,EAAE;IAQlE;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,EAAE;IAgBvE;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE;IAK/C;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO;IAIxD;;OAEG;IACH,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAKrD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAK9C;;;OAGG;IACH,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,eAAe,EAAE;IAMjE;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,aAAa,GAAG,eAAe,EAAE;IAMlE;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC;IAKpD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKpC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKrC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;IAQ/C;;OAEG;IACH,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;CAO/E;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAG/F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CAE7E"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * @file mcp-registry.ts
3
+ * @description MCP client registry for dynamic tool configuration.
4
+ * Provides query methods for accessing MCP client configs by scope/platform.
5
+ */
6
+ import { fetchMcpConfig } from './config-fetcher.js';
7
+ import { mapPlatform } from './utils/path-resolver.js';
8
+ /**
9
+ * MCP Registry class for querying client configurations.
10
+ * Caches config data and provides filtering methods.
11
+ */
12
+ export class McpRegistry {
13
+ config;
14
+ clients;
15
+ constructor(config) {
16
+ this.config = config;
17
+ this.clients = new Map(Object.entries(config.clients));
18
+ }
19
+ /**
20
+ * Gets all client configurations.
21
+ */
22
+ getAllClients() {
23
+ return Array.from(this.clients.values());
24
+ }
25
+ /**
26
+ * Gets a specific client by name.
27
+ * Returns null if client not found.
28
+ */
29
+ getClient(name) {
30
+ return this.clients.get(name) || null;
31
+ }
32
+ /**
33
+ * Gets clients filtered by scope capability.
34
+ * Returns clients that support the given scope.
35
+ */
36
+ getClientsByScope(scope) {
37
+ return this.getAllClients().filter(client => client.scopes.includes(scope));
38
+ }
39
+ /**
40
+ * Gets clients that have detectable config paths for the platform.
41
+ */
42
+ getDetectableClients(platform) {
43
+ const platformKey = mapPlatform(platform);
44
+ return this.getAllClients().filter(client => {
45
+ const platformLocations = client.configLocations[platformKey];
46
+ return platformLocations && Object.keys(platformLocations).length > 0;
47
+ });
48
+ }
49
+ /**
50
+ * Gets config file paths for a client on the current platform.
51
+ */
52
+ getConfigPaths(clientName, platform) {
53
+ const client = this.getClient(clientName);
54
+ if (!client) {
55
+ return [];
56
+ }
57
+ const platformKey = mapPlatform(platform);
58
+ const platformLocations = client.configLocations[platformKey];
59
+ if (!platformLocations) {
60
+ return [];
61
+ }
62
+ return Object.values(platformLocations).filter(p => typeof p === 'string' && p.length > 0);
63
+ }
64
+ /**
65
+ * Gets scopes supported by a client.
66
+ */
67
+ getScopesForClient(name) {
68
+ const client = this.getClient(name);
69
+ return client?.scopes || [];
70
+ }
71
+ /**
72
+ * Checks if a client supports a specific scope.
73
+ */
74
+ supportsScope(name, scope) {
75
+ return this.getScopesForClient(name).includes(scope);
76
+ }
77
+ /**
78
+ * Gets transport types supported by a client.
79
+ */
80
+ getTransportsForClient(name) {
81
+ const client = this.getClient(name);
82
+ return client?.transportSupport || [];
83
+ }
84
+ /**
85
+ * Gets wrapper key for a client (mcpServers, mcp, servers, etc.).
86
+ */
87
+ getWrapperKey(name) {
88
+ const client = this.getClient(name);
89
+ return client?.configFormat.wrapperKey || null;
90
+ }
91
+ /**
92
+ * Gets clients filtered by wrapper key.
93
+ * Useful for grouping clients by config format.
94
+ */
95
+ getClientsByWrapperKey(wrapperKey) {
96
+ return this.getAllClients().filter(client => client.configFormat.wrapperKey === wrapperKey);
97
+ }
98
+ /**
99
+ * Gets clients that support a specific transport type.
100
+ */
101
+ getClientsByTransport(transport) {
102
+ return this.getAllClients().filter(client => client.transportSupport.includes(transport));
103
+ }
104
+ /**
105
+ * Gets CLI commands for a client (if available).
106
+ */
107
+ getCliCommands(name) {
108
+ const client = this.getClient(name);
109
+ return client?.cli;
110
+ }
111
+ /**
112
+ * Checks if a client has CLI management support.
113
+ */
114
+ hasCliSupport(name) {
115
+ const commands = this.getCliCommands(name);
116
+ return commands !== undefined && Object.keys(commands).length > 0;
117
+ }
118
+ /**
119
+ * Gets config format type for a client (json, yaml, toml).
120
+ */
121
+ getConfigFormat(name) {
122
+ const client = this.getClient(name);
123
+ return client?.configFormat.format || 'json';
124
+ }
125
+ /**
126
+ * Gets all client names.
127
+ */
128
+ getClientNames() {
129
+ return Array.from(this.clients.keys());
130
+ }
131
+ /**
132
+ * Searches clients by name (case-insensitive partial match).
133
+ */
134
+ searchClients(query) {
135
+ const lowerQuery = query.toLowerCase();
136
+ return this.getAllClients().filter(client => client.name.toLowerCase().includes(lowerQuery) ||
137
+ client.vendor?.toLowerCase().includes(lowerQuery));
138
+ }
139
+ /**
140
+ * Gets registry metadata.
141
+ */
142
+ getMetadata() {
143
+ return {
144
+ version: this.config.version,
145
+ lastUpdated: this.config.lastUpdated,
146
+ clientCount: this.clients.size,
147
+ };
148
+ }
149
+ }
150
+ /**
151
+ * Creates an MCP registry instance by fetching config.
152
+ * This is the main entry point for using the registry.
153
+ *
154
+ * @param options - Fetch options for getting config
155
+ * @returns Initialized MCP registry
156
+ */
157
+ export async function createRegistry(options) {
158
+ const config = await fetchMcpConfig(options);
159
+ return new McpRegistry(config);
160
+ }
161
+ /**
162
+ * Creates a registry from existing config data.
163
+ * Useful for testing or using cached config.
164
+ */
165
+ export function createRegistryFromConfig(config) {
166
+ return new McpRegistry(config);
167
+ }
168
+ //# sourceMappingURL=mcp-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.js","sourceRoot":"","sources":["../src/mcp-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @file setup.ts
3
+ * @description CLI setup command for injecting MCP configuration into various AI tools.
4
+ * Dynamically supports all MCP clients from the registry (14 tools).
5
+ */
6
+ /** Supported CLI tools for MCP configuration - all 14 tools from registry */
7
+ export type SupportedCli = 'claude-code' | 'claude-desktop' | 'github-copilot' | 'cursor' | 'windsurf' | 'roo-code' | 'zed' | 'factory-droid' | 'antigravity' | 'gemini-cli' | 'opencode' | 'vscode-copilot' | 'jetbrains-copilot' | 'codex-cli';
8
+ /** Configuration scope - user-level or project-level */
9
+ export type ConfigScope = 'user' | 'project';
10
+ /** Setup options from CLI arguments */
11
+ export interface SetupOptions {
12
+ cli: SupportedCli;
13
+ baseUrl: string;
14
+ username: string;
15
+ password: string;
16
+ scope: ConfigScope;
17
+ }
18
+ /**
19
+ * Injects MCP configuration into the target CLI tool's config file.
20
+ * @param options - Setup options
21
+ * @returns Result message
22
+ */
23
+ export declare function injectMcpConfig(options: SetupOptions): Promise<{
24
+ success: boolean;
25
+ message: string;
26
+ }>;
27
+ /**
28
+ * Parses CLI arguments for setup command.
29
+ * @param args - Command line arguments
30
+ * @returns Parsed options or null if invalid
31
+ */
32
+ export declare function parseSetupArgs(args: string[]): SetupOptions | null;
33
+ /**
34
+ * Prints setup help message.
35
+ */
36
+ export declare function printSetupHelp(): void;
37
+ /**
38
+ * Lists all supported CLI tools.
39
+ */
40
+ export declare function printSupportedClis(): void;
41
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAClB,aAAa,GACb,gBAAgB,GAChB,gBAAgB,GAChB,QAAQ,GACR,UAAU,GACV,UAAU,GACV,KAAK,GACL,eAAe,GACf,aAAa,GACb,YAAY,GACZ,UAAU,GACV,gBAAgB,GAChB,mBAAmB,GACnB,WAAW,CAAC;AAElB,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7C,uCAAuC;AACvC,MAAM,WAAW,YAAY;IACzB,GAAG,EAAE,YAAY,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;CACtB;AA+HD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2C3G;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CAyDlE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CA6BrC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAkBzC"}