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,48 @@
1
+ /**
2
+ * Error Types
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 3
5
+ */
6
+ export class LexicApiError extends Error {
7
+ statusCode;
8
+ correlationId;
9
+ constructor(message, statusCode, correlationId) {
10
+ super(message);
11
+ this.statusCode = statusCode;
12
+ this.correlationId = correlationId;
13
+ this.name = 'LexicApiError';
14
+ }
15
+ }
16
+ export class AuthenticationError extends LexicApiError {
17
+ constructor(message, correlationId) {
18
+ super(message, 401, correlationId);
19
+ this.name = 'AuthenticationError';
20
+ }
21
+ }
22
+ export class AuthorizationError extends LexicApiError {
23
+ constructor(message, correlationId) {
24
+ super(message, 403, correlationId);
25
+ this.name = 'AuthorizationError';
26
+ }
27
+ }
28
+ export class NotFoundError extends LexicApiError {
29
+ constructor(message, correlationId) {
30
+ super(message, 404, correlationId);
31
+ this.name = 'NotFoundError';
32
+ }
33
+ }
34
+ export class RateLimitError extends LexicApiError {
35
+ retryAfter;
36
+ constructor(message, correlationId, retryAfter) {
37
+ super(message, 429, correlationId);
38
+ this.retryAfter = retryAfter;
39
+ this.name = 'RateLimitError';
40
+ }
41
+ }
42
+ export class ServerError extends LexicApiError {
43
+ constructor(message, statusCode, correlationId) {
44
+ super(message, statusCode, correlationId);
45
+ this.name = 'ServerError';
46
+ }
47
+ }
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAG7B;IACA;IAHT,YACE,OAAe,EACR,UAAkB,EAClB,aAAsB;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAQ;QAClB,kBAAa,GAAb,aAAa,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IACpD,YAAY,OAAe,EAAE,aAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACnD,YAAY,OAAe,EAAE,aAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAe,EAAE,aAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,aAAa;IAItC;IAHT,YACE,OAAe,EACf,aAAsB,EACf,UAAmB;QAE1B,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QAF5B,eAAU,GAAV,UAAU,CAAS;QAG1B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,aAAa;IAC5C,YAAY,OAAe,EAAE,UAAkB,EAAE,aAAsB;QACrE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Structured Logger
3
+ *
4
+ * Logs to stderr (MCP uses stdout for protocol)
5
+ */
6
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error';
7
+ declare class Logger {
8
+ private level;
9
+ setLevel(level: LogLevel): void;
10
+ getLevel(): LogLevel;
11
+ private shouldLog;
12
+ private format;
13
+ debug(message: string, data?: Record<string, unknown>): void;
14
+ info(message: string, data?: Record<string, unknown>): void;
15
+ warn(message: string, data?: Record<string, unknown>): void;
16
+ error(message: string, data?: Record<string, unknown>): void;
17
+ }
18
+ export declare const logger: Logger;
19
+ export {};
20
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AASpD,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAAoB;IAEjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAM/B,QAAQ,IAAI,QAAQ;IAIpB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,MAAM;IAiBd,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAK7D;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Structured Logger
3
+ *
4
+ * Logs to stderr (MCP uses stdout for protocol)
5
+ */
6
+ const LOG_LEVELS = {
7
+ debug: 0,
8
+ info: 1,
9
+ warn: 2,
10
+ error: 3
11
+ };
12
+ class Logger {
13
+ level = 'info';
14
+ setLevel(level) {
15
+ if (LOG_LEVELS[level] !== undefined) {
16
+ this.level = level;
17
+ }
18
+ }
19
+ getLevel() {
20
+ return this.level;
21
+ }
22
+ shouldLog(level) {
23
+ return LOG_LEVELS[level] >= LOG_LEVELS[this.level];
24
+ }
25
+ format(level, message, data) {
26
+ const timestamp = new Date().toISOString();
27
+ const base = `[${timestamp}] [${level.toUpperCase()}] ${message}`;
28
+ if (data) {
29
+ // Redact sensitive fields
30
+ const safeData = { ...data };
31
+ if ('pat' in safeData)
32
+ safeData.pat = '[REDACTED]';
33
+ if ('token' in safeData)
34
+ safeData.token = '[REDACTED]';
35
+ if ('authorization' in safeData)
36
+ safeData.authorization = '[REDACTED]';
37
+ return `${base} ${JSON.stringify(safeData)}`;
38
+ }
39
+ return base;
40
+ }
41
+ debug(message, data) {
42
+ if (this.shouldLog('debug')) {
43
+ console.error(this.format('debug', message, data));
44
+ }
45
+ }
46
+ info(message, data) {
47
+ if (this.shouldLog('info')) {
48
+ console.error(this.format('info', message, data));
49
+ }
50
+ }
51
+ warn(message, data) {
52
+ if (this.shouldLog('warn')) {
53
+ console.error(this.format('warn', message, data));
54
+ }
55
+ }
56
+ error(message, data) {
57
+ if (this.shouldLog('error')) {
58
+ console.error(this.format('error', message, data));
59
+ }
60
+ }
61
+ }
62
+ export const logger = new Logger();
63
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,MAAM;IACF,KAAK,GAAa,MAAM,CAAC;IAEjC,QAAQ,CAAC,KAAe;QACtB,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,SAAS,CAAC,KAAe;QAC/B,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;QAC7E,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QAElE,IAAI,IAAI,EAAE,CAAC;YACT,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC7B,IAAI,KAAK,IAAI,QAAQ;gBAAE,QAAQ,CAAC,GAAG,GAAG,YAAY,CAAC;YACnD,IAAI,OAAO,IAAI,QAAQ;gBAAE,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC;YACvD,IAAI,eAAe,IAAI,QAAQ;gBAAE,QAAQ,CAAC,aAAa,GAAG,YAAY,CAAC;YAEvE,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAA8B;QAClD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAA8B;QACnD,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "lexic-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server connecting Claude Code to Lexic knowledge management",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "lexic-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc && npm run build:domains",
12
+ "build:domains": "tsc -p domains/tsconfig.json",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/index.js",
15
+ "test": "vitest",
16
+ "test:unit": "vitest run tests/unit",
17
+ "test:integration": "vitest run tests/integration",
18
+ "lint": "eslint src --ext .ts",
19
+ "lint:fix": "eslint src --ext .ts --fix",
20
+ "format": "prettier --write \"src/**/*.ts\"",
21
+ "clean": "rimraf dist",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "lexic",
27
+ "claude",
28
+ "knowledge-management",
29
+ "ai-development"
30
+ ],
31
+ "author": "Parul Bhargava <parulb@lexic.io>",
32
+ "license": "MIT",
33
+ "dependencies": {
34
+ "@modelcontextprotocol/sdk": "^1.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^20.10.0",
38
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
39
+ "@typescript-eslint/parser": "^6.13.0",
40
+ "eslint": "^8.55.0",
41
+ "prettier": "^3.1.0",
42
+ "rimraf": "^5.0.0",
43
+ "typescript": "^5.3.0",
44
+ "vitest": "^4.0.17"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "files": [
50
+ "dist",
51
+ "templates"
52
+ ]
53
+ }
@@ -0,0 +1,12 @@
1
+ # Templates
2
+
3
+ This folder is empty. Templates now live within each domain:
4
+
5
+ ```
6
+ domains/
7
+ └── development/
8
+ └── templates/
9
+ └── decision.md
10
+ ```
11
+
12
+ Each domain is self-contained with its own templates.