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.
- package/README.md +152 -0
- package/dist/client/lexic-api.d.ts +65 -0
- package/dist/client/lexic-api.d.ts.map +1 -0
- package/dist/client/lexic-api.js +253 -0
- package/dist/client/lexic-api.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -0
- package/dist/core/admin.d.ts +74 -0
- package/dist/core/admin.d.ts.map +1 -0
- package/dist/core/admin.js +103 -0
- package/dist/core/admin.js.map +1 -0
- package/dist/core/context.d.ts +28 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +76 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +50 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/query.d.ts +47 -0
- package/dist/core/query.d.ts.map +1 -0
- package/dist/core/query.js +55 -0
- package/dist/core/query.js.map +1 -0
- package/dist/core/store.d.ts +35 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +55 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +57 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/domains/development/index.d.ts +8 -0
- package/dist/domains/development/index.d.ts.map +1 -0
- package/dist/domains/development/index.js +18 -0
- package/dist/domains/development/index.js.map +1 -0
- package/dist/domains/development/tools.d.ts +97 -0
- package/dist/domains/development/tools.d.ts.map +1 -0
- package/dist/domains/development/tools.js +140 -0
- package/dist/domains/development/tools.js.map +1 -0
- package/dist/domains/index.d.ts +9 -0
- package/dist/domains/index.d.ts.map +1 -0
- package/dist/domains/index.js +8 -0
- package/dist/domains/index.js.map +1 -0
- package/dist/domains/loader.d.ts +34 -0
- package/dist/domains/loader.d.ts.map +1 -0
- package/dist/domains/loader.js +74 -0
- package/dist/domains/loader.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +162 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +48 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +63 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +53 -0
- 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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|