lexic-mcp 0.1.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 (63) hide show
  1. package/README.md +152 -0
  2. package/dist/client/lexic-api.d.ts +65 -0
  3. package/dist/client/lexic-api.d.ts.map +1 -0
  4. package/dist/client/lexic-api.js +253 -0
  5. package/dist/client/lexic-api.js.map +1 -0
  6. package/dist/config.d.ts +14 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +30 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/core/admin.d.ts +74 -0
  11. package/dist/core/admin.d.ts.map +1 -0
  12. package/dist/core/admin.js +103 -0
  13. package/dist/core/admin.js.map +1 -0
  14. package/dist/core/context.d.ts +28 -0
  15. package/dist/core/context.d.ts.map +1 -0
  16. package/dist/core/context.js +76 -0
  17. package/dist/core/context.js.map +1 -0
  18. package/dist/core/index.d.ts +17 -0
  19. package/dist/core/index.d.ts.map +1 -0
  20. package/dist/core/index.js +50 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/core/query.d.ts +47 -0
  23. package/dist/core/query.d.ts.map +1 -0
  24. package/dist/core/query.js +55 -0
  25. package/dist/core/query.js.map +1 -0
  26. package/dist/core/store.d.ts +35 -0
  27. package/dist/core/store.d.ts.map +1 -0
  28. package/dist/core/store.js +55 -0
  29. package/dist/core/store.js.map +1 -0
  30. package/dist/core/types.d.ts +57 -0
  31. package/dist/core/types.d.ts.map +1 -0
  32. package/dist/core/types.js +7 -0
  33. package/dist/core/types.js.map +1 -0
  34. package/dist/domains/development/index.d.ts +8 -0
  35. package/dist/domains/development/index.d.ts.map +1 -0
  36. package/dist/domains/development/index.js +18 -0
  37. package/dist/domains/development/index.js.map +1 -0
  38. package/dist/domains/development/tools.d.ts +97 -0
  39. package/dist/domains/development/tools.d.ts.map +1 -0
  40. package/dist/domains/development/tools.js +140 -0
  41. package/dist/domains/development/tools.js.map +1 -0
  42. package/dist/domains/index.d.ts +9 -0
  43. package/dist/domains/index.d.ts.map +1 -0
  44. package/dist/domains/index.js +8 -0
  45. package/dist/domains/index.js.map +1 -0
  46. package/dist/domains/loader.d.ts +34 -0
  47. package/dist/domains/loader.d.ts.map +1 -0
  48. package/dist/domains/loader.js +74 -0
  49. package/dist/domains/loader.js.map +1 -0
  50. package/dist/index.d.ts +8 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +162 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/utils/errors.d.ts +27 -0
  55. package/dist/utils/errors.d.ts.map +1 -0
  56. package/dist/utils/errors.js +48 -0
  57. package/dist/utils/errors.js.map +1 -0
  58. package/dist/utils/logger.d.ts +20 -0
  59. package/dist/utils/logger.d.ts.map +1 -0
  60. package/dist/utils/logger.js +63 -0
  61. package/dist/utils/logger.js.map +1 -0
  62. package/package.json +53 -0
  63. package/templates/README.md +12 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Development Domain Tools
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 5
5
+ */
6
+ import type { LexicClient } from '../../client/lexic-api.js';
7
+ export interface LogDecisionParams {
8
+ feature: string;
9
+ decision: string;
10
+ rationale: string;
11
+ alternatives?: Array<{
12
+ option: string;
13
+ whyRejected: string;
14
+ }>;
15
+ revisitIf?: string;
16
+ }
17
+ export interface FeatureContextResult {
18
+ feature: string;
19
+ summary: string;
20
+ decisions: Array<{
21
+ title: string;
22
+ date: string;
23
+ excerpt: string;
24
+ }>;
25
+ architecture: Array<{
26
+ title: string;
27
+ excerpt: string;
28
+ }>;
29
+ recentActivity: Array<{
30
+ title: string;
31
+ date: string;
32
+ }>;
33
+ }
34
+ export declare function createLogDecisionTool(client: LexicClient): {
35
+ name: string;
36
+ description: string;
37
+ inputSchema: {
38
+ type: string;
39
+ properties: {
40
+ feature: {
41
+ type: string;
42
+ description: string;
43
+ };
44
+ decision: {
45
+ type: string;
46
+ description: string;
47
+ };
48
+ rationale: {
49
+ type: string;
50
+ description: string;
51
+ };
52
+ alternatives: {
53
+ type: string;
54
+ items: {
55
+ type: string;
56
+ properties: {
57
+ option: {
58
+ type: string;
59
+ };
60
+ whyRejected: {
61
+ type: string;
62
+ };
63
+ };
64
+ };
65
+ description: string;
66
+ };
67
+ revisitIf: {
68
+ type: string;
69
+ description: string;
70
+ };
71
+ };
72
+ required: string[];
73
+ };
74
+ handler: (params: LogDecisionParams) => Promise<{
75
+ success: boolean;
76
+ noteId: string | undefined;
77
+ message: string;
78
+ }>;
79
+ };
80
+ export declare function createGetFeatureContextTool(client: LexicClient): {
81
+ name: string;
82
+ description: string;
83
+ inputSchema: {
84
+ type: string;
85
+ properties: {
86
+ feature: {
87
+ type: string;
88
+ description: string;
89
+ };
90
+ };
91
+ required: string[];
92
+ };
93
+ handler: (params: {
94
+ feature: string;
95
+ }) => Promise<FeatureContextResult>;
96
+ };
97
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/domains/development/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,YAAY,EAAE,KAAK,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAqC7B,iBAAiB;;;;;EAiB5C;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,WAAW;;;;;;;;;;;;;sBAcnC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,oBAAoB,CAAC;EAqC9E"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Development Domain Tools
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 5
5
+ */
6
+ export function createLogDecisionTool(client) {
7
+ return {
8
+ name: 'dev_log_decision',
9
+ description: 'Log a development decision. Use this when making architectural choices, selecting libraries, or deciding on implementation approaches.',
10
+ inputSchema: {
11
+ type: 'object',
12
+ properties: {
13
+ feature: {
14
+ type: 'string',
15
+ description: 'The feature or component this decision relates to'
16
+ },
17
+ decision: {
18
+ type: 'string',
19
+ description: 'What was decided'
20
+ },
21
+ rationale: {
22
+ type: 'string',
23
+ description: 'Why this choice was made'
24
+ },
25
+ alternatives: {
26
+ type: 'array',
27
+ items: {
28
+ type: 'object',
29
+ properties: {
30
+ option: { type: 'string' },
31
+ whyRejected: { type: 'string' }
32
+ }
33
+ },
34
+ description: 'Other options considered and why they were rejected'
35
+ },
36
+ revisitIf: {
37
+ type: 'string',
38
+ description: 'Conditions that would trigger reconsidering this decision'
39
+ }
40
+ },
41
+ required: ['feature', 'decision', 'rationale']
42
+ },
43
+ handler: async (params) => {
44
+ const content = renderDecisionTemplate(params);
45
+ const title = `Decision: ${params.feature} - ${truncate(params.decision, 50)}`;
46
+ const result = await client.createNote(content, title);
47
+ if (!result.success) {
48
+ throw new Error(`Failed to log decision: ${result.error}`);
49
+ }
50
+ return {
51
+ success: true,
52
+ noteId: result.noteId,
53
+ message: `Decision logged for ${params.feature}`
54
+ };
55
+ }
56
+ };
57
+ }
58
+ export function createGetFeatureContextTool(client) {
59
+ return {
60
+ name: 'dev_get_feature_context',
61
+ description: 'Get development context for a feature. Returns decisions, current status, patterns, and related components.',
62
+ inputSchema: {
63
+ type: 'object',
64
+ properties: {
65
+ feature: {
66
+ type: 'string',
67
+ description: "The feature name (e.g., 'entity-system', 'billing', 'auth')"
68
+ }
69
+ },
70
+ required: ['feature']
71
+ },
72
+ handler: async (params) => {
73
+ const { feature } = params;
74
+ const results = await client.semanticSearch(`${feature} decision architecture implementation`, 10);
75
+ const decisions = results.filter(r => r.content.toLowerCase().includes('decision:') ||
76
+ r.title?.toLowerCase().includes('decision'));
77
+ const architecture = results.filter(r => r.content.toLowerCase().includes('architecture') ||
78
+ r.content.toLowerCase().includes('component'));
79
+ return {
80
+ feature,
81
+ summary: `Found ${results.length} relevant notes for ${feature}`,
82
+ decisions: decisions.slice(0, 5).map(d => ({
83
+ title: extractTitle(d.content) || d.title || 'Decision',
84
+ date: d.updatedAt,
85
+ excerpt: truncate(d.content, 200)
86
+ })),
87
+ architecture: architecture.slice(0, 3).map(a => ({
88
+ title: a.title || 'Architecture Note',
89
+ excerpt: truncate(a.content, 300)
90
+ })),
91
+ recentActivity: results.slice(0, 3).map(r => ({
92
+ title: r.title || 'Note',
93
+ date: r.updatedAt
94
+ }))
95
+ };
96
+ }
97
+ };
98
+ }
99
+ function renderDecisionTemplate(params) {
100
+ const date = new Date().toISOString().split('T')[0];
101
+ let content = `# Decision: ${params.decision}
102
+
103
+ **Date**: ${date}
104
+ **Feature**: ${params.feature}
105
+ **Status**: Approved
106
+
107
+ ## Decision
108
+ ${params.decision}
109
+
110
+ ## Rationale
111
+ ${params.rationale}
112
+ `;
113
+ if (params.alternatives && params.alternatives.length > 0) {
114
+ content += `
115
+ ## Alternatives Considered
116
+ ${params.alternatives.map(a => `- **${a.option}**: ${a.whyRejected}`).join('\n')}
117
+ `;
118
+ }
119
+ if (params.revisitIf) {
120
+ content += `
121
+ ## Revisit If
122
+ ${params.revisitIf}
123
+ `;
124
+ }
125
+ content += `
126
+ ---
127
+ Tags: decision, ${params.feature}
128
+ `;
129
+ return content;
130
+ }
131
+ function extractTitle(content) {
132
+ const match = content.match(/^#\s+(.+)$/m);
133
+ return match?.[1];
134
+ }
135
+ function truncate(text, maxLength) {
136
+ if (text.length <= maxLength)
137
+ return text;
138
+ return text.slice(0, maxLength - 3) + '...';
139
+ }
140
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/domains/development/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Domain System
3
+ *
4
+ * Exports the domain loader for dynamic domain loading.
5
+ * Domains live in the domains/ folder (outside src/).
6
+ */
7
+ export { loadDomains, registerDomainTools, buildSeederMap } from './loader.js';
8
+ export type { DomainModule, LoadedDomain } from './loader.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domains/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Domain System
3
+ *
4
+ * Exports the domain loader for dynamic domain loading.
5
+ * Domains live in the domains/ folder (outside src/).
6
+ */
7
+ export { loadDomains, registerDomainTools, buildSeederMap } from './loader.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domains/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Domain Loader
3
+ *
4
+ * Dynamically loads custom domains from the configured path.
5
+ * Domains are self-contained TypeScript modules in the domains/ folder.
6
+ */
7
+ import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import type { LexicClient } from '../client/lexic-api.js';
9
+ export interface DomainModule {
10
+ metadata: {
11
+ name: string;
12
+ description: string;
13
+ version: string;
14
+ };
15
+ registerTools(server: Server, client: LexicClient): void;
16
+ seedProject?(client: LexicClient, lexiconId: string): Promise<number>;
17
+ }
18
+ export interface LoadedDomain {
19
+ name: string;
20
+ module: DomainModule;
21
+ }
22
+ /**
23
+ * Load domains from the specified path
24
+ */
25
+ export declare function loadDomains(domainsPath: string, domainNames: string[]): Promise<LoadedDomain[]>;
26
+ /**
27
+ * Register all tools from loaded domains
28
+ */
29
+ export declare function registerDomainTools(domains: LoadedDomain[], server: Server, client: LexicClient): void;
30
+ /**
31
+ * Build a map of domain seeders for use by admin tools
32
+ */
33
+ export declare function buildSeederMap(domains: LoadedDomain[]): Map<string, (client: LexicClient, lexiconId: string) => Promise<number>>;
34
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/domains/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAO1D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAGzD,WAAW,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;CACtB;AAMD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiCzB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAClB,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EAAE,GACtB,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAW1E"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Domain Loader
3
+ *
4
+ * Dynamically loads custom domains from the configured path.
5
+ * Domains are self-contained TypeScript modules in the domains/ folder.
6
+ */
7
+ import { pathToFileURL } from 'url';
8
+ import path from 'path';
9
+ import { logger } from '../utils/logger.js';
10
+ // ============================================================================
11
+ // LOADER
12
+ // ============================================================================
13
+ /**
14
+ * Load domains from the specified path
15
+ */
16
+ export async function loadDomains(domainsPath, domainNames) {
17
+ const loaded = [];
18
+ for (const name of domainNames) {
19
+ try {
20
+ const domainPath = path.resolve(domainsPath, name, 'index.js');
21
+ const domainUrl = pathToFileURL(domainPath).href;
22
+ logger.debug('Loading domain', { name, path: domainPath });
23
+ const module = await import(domainUrl);
24
+ if (!module.metadata?.name) {
25
+ logger.warn('Domain missing metadata', { name });
26
+ continue;
27
+ }
28
+ loaded.push({ name, module });
29
+ logger.info('Loaded domain', {
30
+ name: module.metadata.name,
31
+ version: module.metadata.version,
32
+ hasSeeder: !!module.seedProject
33
+ });
34
+ }
35
+ catch (error) {
36
+ logger.error('Failed to load domain', {
37
+ name,
38
+ error: error instanceof Error ? error.message : String(error)
39
+ });
40
+ }
41
+ }
42
+ return loaded;
43
+ }
44
+ /**
45
+ * Register all tools from loaded domains
46
+ */
47
+ export function registerDomainTools(domains, server, client) {
48
+ for (const { name, module } of domains) {
49
+ try {
50
+ module.registerTools(server, client);
51
+ logger.debug('Registered tools for domain', { name });
52
+ }
53
+ catch (error) {
54
+ logger.error('Failed to register domain tools', {
55
+ name,
56
+ error: error instanceof Error ? error.message : String(error)
57
+ });
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Build a map of domain seeders for use by admin tools
63
+ */
64
+ export function buildSeederMap(domains) {
65
+ const seeders = new Map();
66
+ for (const { name, module } of domains) {
67
+ if (module.seedProject) {
68
+ seeders.set(name, module.seedProject.bind(module));
69
+ logger.debug('Registered seeder for domain', { name });
70
+ }
71
+ }
72
+ return seeders;
73
+ }
74
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/domains/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Lexic MCP Server Entry Point
4
+ *
5
+ * See .claude/specs/IMPLEMENTATION.md for full specification
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
package/dist/index.js ADDED
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Lexic MCP Server Entry Point
4
+ *
5
+ * See .claude/specs/IMPLEMENTATION.md for full specification
6
+ */
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
10
+ import { pathToFileURL } from 'url';
11
+ import path from 'path';
12
+ import { loadConfig } from './config.js';
13
+ import { createLexicClient } from './client/lexic-api.js';
14
+ import { createQueryTool } from './core/query.js';
15
+ import { createStoreTool } from './core/store.js';
16
+ import { createContextTool } from './core/context.js';
17
+ import { createCreateProjectTool, createListProjectsTool, createGetProjectInfoTool } from './core/admin.js';
18
+ import { loadDomains, buildSeederMap } from './domains/index.js';
19
+ import { logger } from './utils/logger.js';
20
+ // ============================================================================
21
+ // MAIN
22
+ // ============================================================================
23
+ async function main() {
24
+ // Load configuration
25
+ const config = loadConfig();
26
+ logger.setLevel(config.logLevel);
27
+ logger.info('Starting Lexic MCP Server', { domains: config.domains });
28
+ // Initialize Lexic client
29
+ const lexicClient = createLexicClient(config);
30
+ // Validate connection
31
+ const validation = await lexicClient.validateConnection();
32
+ if (!validation.valid) {
33
+ logger.error('Failed to connect to Lexic', { error: validation.error });
34
+ process.exit(1);
35
+ }
36
+ logger.info('Connected to Lexic', {
37
+ lexiconId: validation.lexiconId,
38
+ isUserScoped: validation.isUserScoped
39
+ });
40
+ // Create MCP server
41
+ const server = new Server({ name: 'lexic-mcp', version: '0.1.0' }, { capabilities: { tools: {} } });
42
+ // Build tool registry
43
+ const tools = new Map();
44
+ // Register core KOA tools
45
+ const queryTool = createQueryTool(lexicClient);
46
+ const storeTool = createStoreTool(lexicClient);
47
+ const contextTool = createContextTool(lexicClient);
48
+ tools.set(queryTool.name, queryTool);
49
+ tools.set(storeTool.name, storeTool);
50
+ tools.set(contextTool.name, contextTool);
51
+ logger.debug('Registered core KOA tools', {
52
+ tools: [queryTool.name, storeTool.name, contextTool.name]
53
+ });
54
+ // Load domains
55
+ const domains = await loadDomains(config.domainsPath, config.domains);
56
+ const seeders = buildSeederMap(domains);
57
+ logger.info('Loaded domains', {
58
+ count: domains.length,
59
+ names: domains.map(d => d.name)
60
+ });
61
+ // Register admin tools (only if PAT is user-scoped)
62
+ if (lexicClient.isUserScoped()) {
63
+ const createProjectTool = createCreateProjectTool(lexicClient, seeders);
64
+ const listProjectsTool = createListProjectsTool(lexicClient);
65
+ const getProjectInfoTool = createGetProjectInfoTool(lexicClient);
66
+ tools.set(createProjectTool.name, createProjectTool);
67
+ tools.set(listProjectsTool.name, listProjectsTool);
68
+ tools.set(getProjectInfoTool.name, getProjectInfoTool);
69
+ logger.debug('Registered admin tools', {
70
+ tools: [createProjectTool.name, listProjectsTool.name, getProjectInfoTool.name]
71
+ });
72
+ }
73
+ else {
74
+ logger.debug('Skipping admin tools (PAT is lexicon-scoped)');
75
+ }
76
+ // Register domain tools
77
+ for (const { name, module } of domains) {
78
+ try {
79
+ const domainTools = [];
80
+ // Directly import and register domain tools
81
+ if (typeof module.registerTools === 'function') {
82
+ // The domain registerTools expects to wire into the server
83
+ // We need to extract tools differently - let's directly import them
84
+ const toolsPath = path.resolve(config.domainsPath, name, 'tools.js');
85
+ const toolsUrl = pathToFileURL(toolsPath).href;
86
+ const domainToolCreators = await import(toolsUrl);
87
+ if (domainToolCreators.createLogDecisionTool) {
88
+ const logDecisionTool = domainToolCreators.createLogDecisionTool(lexicClient);
89
+ tools.set(logDecisionTool.name, logDecisionTool);
90
+ domainTools.push(logDecisionTool);
91
+ }
92
+ if (domainToolCreators.createGetFeatureContextTool) {
93
+ const getFeatureContextTool = domainToolCreators.createGetFeatureContextTool(lexicClient);
94
+ tools.set(getFeatureContextTool.name, getFeatureContextTool);
95
+ domainTools.push(getFeatureContextTool);
96
+ }
97
+ }
98
+ logger.debug('Registered domain tools', {
99
+ domain: name,
100
+ tools: domainTools.map(t => t.name)
101
+ });
102
+ }
103
+ catch (error) {
104
+ logger.error('Failed to register domain tools', {
105
+ domain: name,
106
+ error: error instanceof Error ? error.message : String(error)
107
+ });
108
+ }
109
+ }
110
+ // Register MCP handlers
111
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
112
+ return {
113
+ tools: Array.from(tools.values()).map(tool => ({
114
+ name: tool.name,
115
+ description: tool.description,
116
+ inputSchema: tool.inputSchema
117
+ }))
118
+ };
119
+ });
120
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
121
+ const { name, arguments: args } = request.params;
122
+ const tool = tools.get(name);
123
+ if (!tool) {
124
+ return {
125
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
126
+ isError: true
127
+ };
128
+ }
129
+ try {
130
+ logger.debug('Executing tool', { name, args });
131
+ const result = await tool.handler(args || {});
132
+ logger.debug('Tool executed successfully', { name });
133
+ return {
134
+ content: [{
135
+ type: 'text',
136
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2)
137
+ }]
138
+ };
139
+ }
140
+ catch (error) {
141
+ const errorMessage = error instanceof Error ? error.message : String(error);
142
+ logger.error('Tool execution failed', { name, error: errorMessage });
143
+ return {
144
+ content: [{ type: 'text', text: `Error: ${errorMessage}` }],
145
+ isError: true
146
+ };
147
+ }
148
+ });
149
+ // Start server
150
+ const transport = new StdioServerTransport();
151
+ await server.connect(transport);
152
+ logger.info('Lexic MCP Server running', {
153
+ toolCount: tools.size,
154
+ tools: Array.from(tools.keys())
155
+ });
156
+ }
157
+ // Run
158
+ main().catch((error) => {
159
+ logger.error('Fatal error', { error: error instanceof Error ? error.message : String(error) });
160
+ process.exit(1);
161
+ });
162
+ //# 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,27 @@
1
+ /**
2
+ * Error Types
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 3
5
+ */
6
+ export declare class LexicApiError extends Error {
7
+ statusCode: number;
8
+ correlationId?: string | undefined;
9
+ constructor(message: string, statusCode: number, correlationId?: string | undefined);
10
+ }
11
+ export declare class AuthenticationError extends LexicApiError {
12
+ constructor(message: string, correlationId?: string);
13
+ }
14
+ export declare class AuthorizationError extends LexicApiError {
15
+ constructor(message: string, correlationId?: string);
16
+ }
17
+ export declare class NotFoundError extends LexicApiError {
18
+ constructor(message: string, correlationId?: string);
19
+ }
20
+ export declare class RateLimitError extends LexicApiError {
21
+ retryAfter?: number | undefined;
22
+ constructor(message: string, correlationId?: string, retryAfter?: number | undefined);
23
+ }
24
+ export declare class ServerError extends LexicApiError {
25
+ constructor(message: string, statusCode: number, correlationId?: string);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,aAAc,SAAQ,KAAK;IAG7B,UAAU,EAAE,MAAM;IAClB,aAAa,CAAC,EAAE,MAAM;gBAF7B,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;CAIpD;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;CAIpD;AAED,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;CAIpD;AAED,qBAAa,cAAe,SAAQ,aAAa;IAItC,UAAU,CAAC,EAAE,MAAM;gBAF1B,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,YAAA;CAK7B;AAED,qBAAa,WAAY,SAAQ,aAAa;gBAChC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;CAIxE"}