@schemyx/mcp 0.1.0 → 0.1.2

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 (106) hide show
  1. package/README.md +79 -2
  2. package/dist/backend-client.d.ts +1 -17
  3. package/dist/backend-client.js +15 -91
  4. package/dist/backend-client.js.map +1 -1
  5. package/dist/client/backend-client.d.ts +17 -0
  6. package/dist/client/backend-client.js +97 -0
  7. package/dist/client/backend-client.js.map +1 -0
  8. package/dist/client/local-theme-source.d.ts +19 -0
  9. package/dist/client/local-theme-source.js +737 -0
  10. package/dist/client/local-theme-source.js.map +1 -0
  11. package/dist/client/mcp-client.d.ts +15 -0
  12. package/dist/client/mcp-client.js +46 -0
  13. package/dist/client/mcp-client.js.map +1 -0
  14. package/dist/codebase-scanner/backend.d.ts +12 -0
  15. package/dist/codebase-scanner/backend.js +814 -0
  16. package/dist/codebase-scanner/backend.js.map +1 -0
  17. package/dist/codebase-scanner/bundle.d.ts +315 -0
  18. package/dist/codebase-scanner/bundle.js +5195 -0
  19. package/dist/codebase-scanner/bundle.js.map +1 -0
  20. package/dist/codebase-scanner/constants.d.ts +26 -0
  21. package/dist/codebase-scanner/constants.js +231 -0
  22. package/dist/codebase-scanner/constants.js.map +1 -0
  23. package/dist/codebase-scanner/database.d.ts +8 -0
  24. package/dist/codebase-scanner/database.js +1252 -0
  25. package/dist/codebase-scanner/database.js.map +1 -0
  26. package/dist/codebase-scanner/extractors.d.ts +241 -0
  27. package/dist/codebase-scanner/extractors.js +3513 -0
  28. package/dist/codebase-scanner/extractors.js.map +1 -0
  29. package/dist/codebase-scanner/files.d.ts +16 -0
  30. package/dist/codebase-scanner/files.js +250 -0
  31. package/dist/codebase-scanner/files.js.map +1 -0
  32. package/dist/codebase-scanner/index.d.ts +217 -0
  33. package/dist/codebase-scanner/index.js +387 -0
  34. package/dist/codebase-scanner/index.js.map +1 -0
  35. package/dist/codebase-scanner/recipes.d.ts +74 -0
  36. package/dist/codebase-scanner/recipes.js +743 -0
  37. package/dist/codebase-scanner/recipes.js.map +1 -0
  38. package/dist/codebase-scanner/storage.d.ts +19 -0
  39. package/dist/codebase-scanner/storage.js +103 -0
  40. package/dist/codebase-scanner/storage.js.map +1 -0
  41. package/dist/codebase-scanner/types.d.ts +743 -0
  42. package/dist/codebase-scanner/types.js +3 -0
  43. package/dist/codebase-scanner/types.js.map +1 -0
  44. package/dist/codebase-scanner/utils.d.ts +37 -0
  45. package/dist/codebase-scanner/utils.js +259 -0
  46. package/dist/codebase-scanner/utils.js.map +1 -0
  47. package/dist/codebase-scanner.d.ts +1 -0
  48. package/dist/codebase-scanner.js +18 -0
  49. package/dist/codebase-scanner.js.map +1 -0
  50. package/dist/config.d.ts +1 -2
  51. package/dist/config.js +15 -37
  52. package/dist/config.js.map +1 -1
  53. package/dist/local-theme-source.d.ts +1 -0
  54. package/dist/local-theme-source.js +18 -0
  55. package/dist/local-theme-source.js.map +1 -0
  56. package/dist/main.js +3 -3
  57. package/dist/main.js.map +1 -1
  58. package/dist/mcp-client.d.ts +1 -0
  59. package/dist/mcp-client.js +18 -0
  60. package/dist/mcp-client.js.map +1 -0
  61. package/dist/prompts.d.ts +1 -7
  62. package/dist/prompts.js +15 -52
  63. package/dist/prompts.js.map +1 -1
  64. package/dist/server/index.d.ts +4 -0
  65. package/dist/server/index.js +163 -0
  66. package/dist/server/index.js.map +1 -0
  67. package/dist/server/prompts.d.ts +7 -0
  68. package/dist/server/prompts.js +55 -0
  69. package/dist/server/prompts.js.map +1 -0
  70. package/dist/server/tool-definitions.d.ts +22 -0
  71. package/dist/server/tool-definitions.js +531 -0
  72. package/dist/server/tool-definitions.js.map +1 -0
  73. package/dist/server.d.ts +3 -3
  74. package/dist/server.js +33 -0
  75. package/dist/server.js.map +1 -1
  76. package/dist/shared/config.d.ts +2 -0
  77. package/dist/shared/config.js +54 -0
  78. package/dist/shared/config.js.map +1 -0
  79. package/dist/shared/text.d.ts +14 -0
  80. package/dist/shared/text.js +33 -0
  81. package/dist/shared/text.js.map +1 -0
  82. package/dist/shared/types.d.ts +118 -0
  83. package/dist/shared/types.js +3 -0
  84. package/dist/shared/types.js.map +1 -0
  85. package/dist/shared/uri.d.ts +6 -0
  86. package/dist/shared/uri.js +24 -0
  87. package/dist/shared/uri.js.map +1 -0
  88. package/dist/style-recipes.d.ts +1 -0
  89. package/dist/style-recipes.js +18 -0
  90. package/dist/style-recipes.js.map +1 -0
  91. package/dist/text.d.ts +1 -14
  92. package/dist/text.js +15 -30
  93. package/dist/text.js.map +1 -1
  94. package/dist/theme/style-recipes.d.ts +26 -0
  95. package/dist/theme/style-recipes.js +129 -0
  96. package/dist/theme/style-recipes.js.map +1 -0
  97. package/dist/tool-definitions.d.ts +1 -11
  98. package/dist/tool-definitions.js +15 -127
  99. package/dist/tool-definitions.js.map +1 -1
  100. package/dist/types.d.ts +1 -106
  101. package/dist/types.js +15 -0
  102. package/dist/types.js.map +1 -1
  103. package/dist/uri.d.ts +1 -6
  104. package/dist/uri.js +15 -21
  105. package/dist/uri.js.map +1 -1
  106. package/package.json +5 -2
package/README.md CHANGED
@@ -2,8 +2,19 @@
2
2
 
3
3
  Local stdio MCP server for reading Schemyx project configs, Theme Forge artifacts, target-stack guidance, and implementation notes.
4
4
 
5
+ The server supports both local theme files and hosted Schemyx configs. By default it checks for local files first, then falls back to the hosted Schemyx API.
6
+
5
7
  ## Usage
6
8
 
9
+ Local files only:
10
+
11
+ ```bash
12
+ # From a repo that contains ./schemyx-ui-theme/themeforge.json
13
+ npx -y @schemyx/mcp
14
+ ```
15
+
16
+ Hosted Schemyx:
17
+
7
18
  ```bash
8
19
  SCHEMYX_API_KEY=skx_live_replace_me npx -y @schemyx/mcp
9
20
  ```
@@ -26,11 +37,77 @@ MCP client config:
26
37
 
27
38
  ## Environment
28
39
 
29
- - `SCHEMYX_API_KEY`: required Schemyx API key with `mcp:read` or `configs:read`
40
+ - `SCHEMYX_API_KEY`: Schemyx API key with `mcp:read` or `configs:read`; required only when using hosted configs
30
41
  - `SCHEMYX_API_URL`: optional API base URL, defaults to `https://api.schemyx.com`
31
42
  - `SCHEMYX_PROJECT_ID`: optional project filter
32
43
  - `SCHEMYX_CONFIG_ID`: optional config filter
33
44
  - `SCHEMYX_MCP_CACHE_TTL_MS`: optional discovery cache TTL, defaults to `10000`
45
+ - `SCHEMYX_MCP_SOURCE`: optional source mode, `auto`, `local`, or `remote`; defaults to `auto`
46
+ - `SCHEMYX_THEME_DIR`: optional local theme directory containing `themeforge.json`
47
+ - `SCHEMYX_MCP_CWD`: optional cwd used for local theme discovery
48
+
49
+ ## Local Theme Discovery
50
+
51
+ In `auto` mode, the MCP server searches upward from the current working directory and uses the first local theme it finds:
52
+
53
+ 1. `./schemyx-ui-theme/themeforge.json`
54
+ 2. `./.schemyx/theme/themeforge.json`
55
+ 3. `./themeforge.json`
56
+
57
+ If none exists, it uses the hosted API.
58
+
59
+ Local discovery exposes the compact style index (`agent-style-index.json`), agent style contract (`agent-style-contract.json`), standard Theme Forge files, all current target-stack artifacts (`tailwind-theme.css`, `shadcn-globals.css`, `mui-theme.ts`, `chakra-system.ts`, `mantine-theme.ts`, `styled-theme.ts`, `theme.scss`, `tokens.json`, `react-native-theme.ts`), stack helper files placed next to `themeforge.json` such as `components.json` or `tailwind.config.ts`, and any extra safe relative paths listed in `schemyx-theme-bundle.manifest.json`.
60
+
61
+ For targeted lookup, use `schemyx_list_style_recipes` and `schemyx_get_style_recipe`. Example: `schemyx_get_style_recipe` with `{ "key": "ui.input" }` returns only the input recipe and direct dependencies.
62
+
63
+ ## Local Codebase Scan
64
+
65
+ The MCP package can also build local-only codebase configs for agents. This does **not** upload source files to Schemyx. The MCP server reads files from the customer's machine and writes compact generated files back into the repo:
66
+
67
+ ```text
68
+ .schemyx/codebase/
69
+ manifest.json
70
+ codebase-guide.md
71
+ graph/
72
+ nodes.jsonl
73
+ edges.jsonl
74
+ index/
75
+ aliases.json
76
+ terms.json
77
+ groups.json
78
+ recipes/
79
+ component.jsonl
80
+ route.jsonl
81
+ api.jsonl
82
+ service.jsonl
83
+ database.jsonl
84
+ model.jsonl
85
+ style.jsonl
86
+ cluster.jsonl
87
+ rule.jsonl
88
+ review/
89
+ items.json
90
+ ```
91
+
92
+ Use `schemyx_scan_codebase` with an explicit scope:
93
+
94
+ ```json
95
+ {
96
+ "projectType": "frontend",
97
+ "includePaths": ["src/app", "src/components", "package.json"]
98
+ }
99
+ ```
100
+
101
+ Supported `projectType` values:
102
+
103
+ - `frontend`: routes, UI components, hooks, styles, template UI elements, and frontend config
104
+ - `backend`: controllers, services, modules, API routes, Prisma/SQL/ORM models, and backend config
105
+ - `full`: scans the repo with safe ignores like `node_modules`, `.next`, `dist`, and `.git`
106
+ - `custom`: scans only `includePaths`; use this when the user picked exact files
107
+
108
+ The output is a segmented universal graph plus grouped keyed recipes. The scanner produces broad baseline coverage for TypeScript/JavaScript, React, Next.js, NestJS, Prisma, CSS/Tailwind, raw HTML/templates, PHP/Laravel-style apps, SQL schemas, docs, tests, configs, and common package manifests. After scanning, use `schemyx_search_codebase`, `schemyx_get_codebase_recipe`, `schemyx_get_context_pack`, `schemyx_get_codebase_graph`, `schemyx_list_review_items`, `schemyx_check_context_freshness`, and `schemyx_read_codebase_file`.
109
+
110
+ Frontend UI recipes expose the canonical `uiContract` + `relationships` shape. `uiContract` contains identity, semantics, visual classes, layout classes, responsive variants, interaction variants, safety rules, and source evidence. `relationships` contains parent context, child structure, compound structure, and graph keys.
34
111
 
35
112
  ## Development
36
113
 
@@ -38,7 +115,7 @@ From the backend repo root:
38
115
 
39
116
  ```bash
40
117
  npm run build:mcp
41
- SCHEMYX_API_URL=http://localhost:4000 \
118
+ SCHEMYX_API_URL=http://localhost:3001 \
42
119
  SCHEMYX_API_KEY=skx_test_replace_me \
43
120
  npm run mcp:local
44
121
  ```
@@ -1,17 +1 @@
1
- import { BackendConfigManifest, BackendResourceContent, BackendToolResult, DiscoveredConfig, LocalMcpConfig, McpConfigResponse, McpContextResponse } from './types';
2
- export declare class SchemyxBackendClient {
3
- private readonly config;
4
- private contextCache;
5
- private manifestCache;
6
- constructor(config: LocalMcpConfig);
7
- getContext(): Promise<McpContextResponse>;
8
- listConfigs(): Promise<McpConfigResponse[]>;
9
- discoverConfigs(): Promise<DiscoveredConfig[]>;
10
- getManifest(configId: string): Promise<BackendConfigManifest>;
11
- getLatestConfig(configId: string): Promise<McpConfigResponse>;
12
- readResource(configId: string, resourceId: string): Promise<BackendResourceContent>;
13
- executeTool(configId: string, toolName: string, args: Record<string, unknown>): Promise<BackendToolResult>;
14
- resolveConfigId(configId: string | undefined): Promise<string>;
15
- private request;
16
- private cacheEntry;
17
- }
1
+ export * from './client/backend-client';
@@ -1,94 +1,18 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SchemyxBackendClient = void 0;
4
- class SchemyxBackendClient {
5
- config;
6
- contextCache = null;
7
- manifestCache = new Map();
8
- constructor(config) {
9
- this.config = config;
10
- }
11
- async getContext() {
12
- const cached = this.contextCache;
13
- if (cached && cached.expiresAt > Date.now()) {
14
- return cached.value;
15
- }
16
- const value = await this.request('/mcp/context');
17
- this.contextCache = this.cacheEntry(value);
18
- return value;
19
- }
20
- async listConfigs() {
21
- const context = await this.getContext();
22
- const configs = context.projects
23
- .filter((project) => !this.config.projectId || project.id === this.config.projectId)
24
- .flatMap((project) => project.configs);
25
- if (this.config.configId) {
26
- return configs.filter((config) => config.id === this.config.configId);
27
- }
28
- return configs;
29
- }
30
- async discoverConfigs() {
31
- const configs = await this.listConfigs();
32
- return Promise.all(configs.map(async (config) => ({
33
- config,
34
- manifest: await this.getManifest(config.id),
35
- })));
36
- }
37
- async getManifest(configId) {
38
- const cached = this.manifestCache.get(configId);
39
- if (cached && cached.expiresAt > Date.now()) {
40
- return cached.value;
41
- }
42
- const value = await this.request(`/mcp/configs/${configId}/manifest`);
43
- this.manifestCache.set(configId, this.cacheEntry(value));
44
- return value;
45
- }
46
- async getLatestConfig(configId) {
47
- return this.request(`/mcp/configs/${configId}/latest`);
48
- }
49
- async readResource(configId, resourceId) {
50
- return this.request(`/mcp/configs/${configId}/resources/${encodeURIComponent(resourceId)}`);
51
- }
52
- async executeTool(configId, toolName, args) {
53
- return this.request(`/mcp/configs/${configId}/tools/${encodeURIComponent(toolName)}`, {
54
- method: 'POST',
55
- body: JSON.stringify({ arguments: args }),
56
- });
57
- }
58
- async resolveConfigId(configId) {
59
- if (configId) {
60
- return configId;
61
- }
62
- const configs = await this.listConfigs();
63
- if (configs.length === 1) {
64
- return configs[0].id;
65
- }
66
- if (configs.length === 0) {
67
- throw new Error('No Schemyx configs are available for this API key.');
68
- }
69
- throw new Error('Multiple configs are available. Pass configId to choose one.');
70
- }
71
- async request(path, init) {
72
- const response = await fetch(`${this.config.apiUrl}${path}`, {
73
- ...init,
74
- headers: {
75
- Accept: 'application/json',
76
- Authorization: `Bearer ${this.config.apiKey}`,
77
- ...(init?.body ? { 'Content-Type': 'application/json' } : {}),
78
- ...init?.headers,
79
- },
80
- });
81
- if (!response.ok) {
82
- throw new Error(`Schemyx API request failed: ${response.status} ${response.statusText} ${await response.text()}`);
83
- }
84
- return (await response.json());
85
- }
86
- cacheEntry(value) {
87
- return {
88
- expiresAt: Date.now() + this.config.cacheTtlMs,
89
- value,
90
- };
91
- }
92
- }
93
- exports.SchemyxBackendClient = SchemyxBackendClient;
17
+ __exportStar(require("./client/backend-client"), exports);
94
18
  //# sourceMappingURL=backend-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend-client.js","sourceRoot":"","sources":["../src/backend-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend-client.js","sourceRoot":"","sources":["../src/backend-client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC"}
@@ -0,0 +1,17 @@
1
+ import { BackendConfigManifest, BackendResourceContent, BackendToolResult, DiscoveredConfig, LocalMcpConfig, McpConfigResponse, McpContextResponse, SchemyxMcpSource } from '../shared/types';
2
+ export declare class SchemyxBackendClient implements SchemyxMcpSource {
3
+ private readonly config;
4
+ private contextCache;
5
+ private manifestCache;
6
+ constructor(config: LocalMcpConfig);
7
+ getContext(): Promise<McpContextResponse>;
8
+ listConfigs(): Promise<McpConfigResponse[]>;
9
+ discoverConfigs(): Promise<DiscoveredConfig[]>;
10
+ getManifest(configId: string): Promise<BackendConfigManifest>;
11
+ getLatestConfig(configId: string): Promise<McpConfigResponse>;
12
+ readResource(configId: string, resourceId: string): Promise<BackendResourceContent>;
13
+ executeTool(configId: string, toolName: string, args: Record<string, unknown>): Promise<BackendToolResult>;
14
+ resolveConfigId(configId: string | undefined): Promise<string>;
15
+ private request;
16
+ private cacheEntry;
17
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchemyxBackendClient = void 0;
4
+ class SchemyxBackendClient {
5
+ config;
6
+ contextCache = null;
7
+ manifestCache = new Map();
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ async getContext() {
12
+ const cached = this.contextCache;
13
+ if (cached && cached.expiresAt > Date.now()) {
14
+ return cached.value;
15
+ }
16
+ const value = await this.request('/mcp/context');
17
+ this.contextCache = this.cacheEntry(value);
18
+ return value;
19
+ }
20
+ async listConfigs() {
21
+ const context = await this.getContext();
22
+ const configs = context.projects
23
+ .filter((project) => !this.config.projectId || project.id === this.config.projectId)
24
+ .flatMap((project) => project.configs);
25
+ if (this.config.configId) {
26
+ return configs.filter((config) => config.id === this.config.configId);
27
+ }
28
+ return configs;
29
+ }
30
+ async discoverConfigs() {
31
+ const configs = await this.listConfigs();
32
+ return Promise.all(configs.map(async (config) => ({
33
+ config,
34
+ manifest: await this.getManifest(config.id),
35
+ })));
36
+ }
37
+ async getManifest(configId) {
38
+ const cached = this.manifestCache.get(configId);
39
+ if (cached && cached.expiresAt > Date.now()) {
40
+ return cached.value;
41
+ }
42
+ const value = await this.request(`/mcp/configs/${configId}/manifest`);
43
+ this.manifestCache.set(configId, this.cacheEntry(value));
44
+ return value;
45
+ }
46
+ async getLatestConfig(configId) {
47
+ return this.request(`/mcp/configs/${configId}/latest`);
48
+ }
49
+ async readResource(configId, resourceId) {
50
+ return this.request(`/mcp/configs/${configId}/resources/${encodeURIComponent(resourceId)}`);
51
+ }
52
+ async executeTool(configId, toolName, args) {
53
+ return this.request(`/mcp/configs/${configId}/tools/${encodeURIComponent(toolName)}`, {
54
+ method: 'POST',
55
+ body: JSON.stringify({ arguments: args }),
56
+ });
57
+ }
58
+ async resolveConfigId(configId) {
59
+ if (configId) {
60
+ return configId;
61
+ }
62
+ const configs = await this.listConfigs();
63
+ if (configs.length === 1) {
64
+ return configs[0].id;
65
+ }
66
+ if (configs.length === 0) {
67
+ throw new Error('No Schemyx configs are available for this API key.');
68
+ }
69
+ throw new Error('Multiple configs are available. Pass configId to choose one.');
70
+ }
71
+ async request(path, init) {
72
+ if (!this.config.apiKey) {
73
+ throw new Error('SCHEMYX_API_KEY is required when no local Schemyx theme files are available.');
74
+ }
75
+ const response = await fetch(`${this.config.apiUrl}${path}`, {
76
+ ...init,
77
+ headers: {
78
+ Accept: 'application/json',
79
+ Authorization: `Bearer ${this.config.apiKey}`,
80
+ ...(init?.body ? { 'Content-Type': 'application/json' } : {}),
81
+ ...init?.headers,
82
+ },
83
+ });
84
+ if (!response.ok) {
85
+ throw new Error(`Schemyx API request failed: ${response.status} ${response.statusText} ${await response.text()}`);
86
+ }
87
+ return (await response.json());
88
+ }
89
+ cacheEntry(value) {
90
+ return {
91
+ expiresAt: Date.now() + this.config.cacheTtlMs,
92
+ value,
93
+ };
94
+ }
95
+ }
96
+ exports.SchemyxBackendClient = SchemyxBackendClient;
97
+ //# sourceMappingURL=backend-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-client.js","sourceRoot":"","sources":["../../src/client/backend-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { BackendConfigManifest, BackendResourceContent, BackendToolResult, DiscoveredConfig, LocalMcpConfig, McpConfigResponse, SchemyxMcpSource } from '../shared/types';
2
+ export declare function createLocalThemeSourceIfAvailable(config: LocalMcpConfig): Promise<LocalThemeSource | null>;
3
+ export declare class LocalThemeSource implements SchemyxMcpSource {
4
+ private readonly themeDir;
5
+ private bundleCache;
6
+ private configCache;
7
+ constructor(themeDir: string);
8
+ listConfigs(): Promise<McpConfigResponse[]>;
9
+ discoverConfigs(): Promise<DiscoveredConfig[]>;
10
+ getManifest(configId: string): Promise<BackendConfigManifest>;
11
+ getLatestConfig(configId: string): Promise<McpConfigResponse>;
12
+ readResource(configId: string, resourceId: string): Promise<BackendResourceContent>;
13
+ executeTool(configId: string, toolName: string, args: Record<string, unknown>): Promise<BackendToolResult>;
14
+ resolveConfigId(configId: string | undefined): Promise<string>;
15
+ private getBundle;
16
+ private getLocalConfig;
17
+ private createLocalConfig;
18
+ private assertLocalConfig;
19
+ }