@trimble-oss/moduswebcomponents-mcp 1.0.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/dist/index.d.ts +2 -0
- package/dist/index.js +337 -0
- package/package.json +39 -0
- package/versions/1.0.0/component-docs/_all_components.json +56 -0
- package/versions/1.0.0/component-docs/modus-wc-autocomplete.json +415 -0
- package/versions/1.0.0/component-docs/modus-wc-date.json +227 -0
- package/versions/1.0.0/component-docs/modus-wc-dropdown-menu.json +164 -0
- package/versions/1.0.0/component-docs/modus-wc-logo.json +61 -0
- package/versions/1.0.0/component-docs/modus-wc-menu-item.json +165 -0
- package/versions/1.0.0/component-docs/modus-wc-menu.json +106 -0
- package/versions/1.0.0/component-docs/modus-wc-navbar.json +290 -0
- package/versions/1.0.0/component-docs/modus-wc-profile-menu.json +64 -0
- package/versions/1.0.0/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/1.0.0/component-docs/modus-wc-table.json +202 -0
- package/versions/1.0.0/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.0.0/component-docs/modus-wc-typography.json +78 -0
- package/versions/1.0.0/docs/_all_docs.json +15 -0
- package/versions/1.0.0/docs/angular.mdx +374 -0
- package/versions/1.0.0/docs/getting-started.mdx +131 -0
- package/versions/1.0.7/component-docs/_all_components.json +55 -0
- package/versions/1.0.7/component-docs/modus-wc-autocomplete.json +405 -0
- package/versions/1.0.7/component-docs/modus-wc-table.json +202 -0
- package/versions/1.0.7/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.0.7/docs/_all_docs.json +15 -0
- package/versions/1.0.7/docs/angular.mdx +374 -0
- package/versions/1.1.0/component-docs/_all_components.json +56 -0
- package/versions/1.1.0/component-docs/modus-wc-autocomplete.json +405 -0
- package/versions/1.1.0/component-docs/modus-wc-navbar.json +290 -0
- package/versions/1.1.0/component-docs/modus-wc-profile-menu.json +64 -0
- package/versions/1.1.0/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/1.1.0/component-docs/modus-wc-table.json +202 -0
- package/versions/1.1.0/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.1.0/component-docs/modus-wc-typography.json +78 -0
- package/versions/1.1.0/docs/_all_docs.json +15 -0
- package/versions/1.1.0/docs/angular.mdx +374 -0
- package/versions/1.1.0/docs/getting-started.mdx +131 -0
- package/versions/1.1.1/component-docs/_all_components.json +56 -0
- package/versions/1.1.1/component-docs/modus-wc-autocomplete.json +405 -0
- package/versions/1.1.1/component-docs/modus-wc-navbar.json +290 -0
- package/versions/1.1.1/component-docs/modus-wc-profile-menu.json +64 -0
- package/versions/1.1.1/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/1.1.1/component-docs/modus-wc-table.json +202 -0
- package/versions/1.1.1/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.1.1/component-docs/modus-wc-typography.json +78 -0
- package/versions/1.1.1/docs/_all_docs.json +15 -0
- package/versions/1.1.1/docs/angular.mdx +374 -0
- package/versions/1.1.1/docs/getting-started.mdx +131 -0
- package/versions/base/component-docs/_all_components.json +55 -0
- package/versions/base/component-docs/modus-wc-accordion.json +48 -0
- package/versions/base/component-docs/modus-wc-alert.json +112 -0
- package/versions/base/component-docs/modus-wc-autocomplete.json +397 -0
- package/versions/base/component-docs/modus-wc-avatar.json +83 -0
- package/versions/base/component-docs/modus-wc-badge.json +68 -0
- package/versions/base/component-docs/modus-wc-breadcrumbs.json +63 -0
- package/versions/base/component-docs/modus-wc-button-group.json +100 -0
- package/versions/base/component-docs/modus-wc-button.json +130 -0
- package/versions/base/component-docs/modus-wc-card.json +98 -0
- package/versions/base/component-docs/modus-wc-checkbox.json +149 -0
- package/versions/base/component-docs/modus-wc-chip.json +132 -0
- package/versions/base/component-docs/modus-wc-collapse.json +90 -0
- package/versions/base/component-docs/modus-wc-date.json +227 -0
- package/versions/base/component-docs/modus-wc-divider.json +85 -0
- package/versions/base/component-docs/modus-wc-dropdown-menu.json +154 -0
- package/versions/base/component-docs/modus-wc-file-dropzone.json +155 -0
- package/versions/base/component-docs/modus-wc-handle.json +135 -0
- package/versions/base/component-docs/modus-wc-icon.json +722 -0
- package/versions/base/component-docs/modus-wc-input-feedback.json +71 -0
- package/versions/base/component-docs/modus-wc-input-label.json +84 -0
- package/versions/base/component-docs/modus-wc-loader.json +65 -0
- package/versions/base/component-docs/modus-wc-logo.json +61 -0
- package/versions/base/component-docs/modus-wc-menu-item.json +173 -0
- package/versions/base/component-docs/modus-wc-menu.json +86 -0
- package/versions/base/component-docs/modus-wc-modal.json +108 -0
- package/versions/base/component-docs/modus-wc-navbar.json +280 -0
- package/versions/base/component-docs/modus-wc-number-input.json +219 -0
- package/versions/base/component-docs/modus-wc-pagination.json +103 -0
- package/versions/base/component-docs/modus-wc-panel.json +76 -0
- package/versions/base/component-docs/modus-wc-progress.json +86 -0
- package/versions/base/component-docs/modus-wc-radio.json +139 -0
- package/versions/base/component-docs/modus-wc-rating.json +117 -0
- package/versions/base/component-docs/modus-wc-select.json +159 -0
- package/versions/base/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/base/component-docs/modus-wc-skeleton.json +65 -0
- package/versions/base/component-docs/modus-wc-slider.json +163 -0
- package/versions/base/component-docs/modus-wc-stepper.json +47 -0
- package/versions/base/component-docs/modus-wc-switch.json +149 -0
- package/versions/base/component-docs/modus-wc-table.json +202 -0
- package/versions/base/component-docs/modus-wc-tabs.json +86 -0
- package/versions/base/component-docs/modus-wc-text-input.json +278 -0
- package/versions/base/component-docs/modus-wc-textarea.json +215 -0
- package/versions/base/component-docs/modus-wc-theme-switcher.json +49 -0
- package/versions/base/component-docs/modus-wc-time-input.json +211 -0
- package/versions/base/component-docs/modus-wc-toast.json +56 -0
- package/versions/base/component-docs/modus-wc-toolbar.json +44 -0
- package/versions/base/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/base/component-docs/modus-wc-typography.json +73 -0
- package/versions/base/component-docs/modus-wc-utility-panel.json +86 -0
- package/versions/base/docs/_all_docs.json +15 -0
- package/versions/base/docs/accessibility.mdx +32 -0
- package/versions/base/docs/angular.mdx +346 -0
- package/versions/base/docs/form-inputs.mdx +86 -0
- package/versions/base/docs/getting-started.mdx +91 -0
- package/versions/base/docs/modus-figma-mcp-integration-guide.mdx +254 -0
- package/versions/base/docs/modus-icon-usage.mdx +210 -0
- package/versions/base/docs/react.mdx +129 -0
- package/versions/base/docs/styling.mdx +107 -0
- package/versions/base/docs/testing.mdx +18 -0
- package/versions/base/docs/vue.mdx +159 -0
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { readFileSync, readdirSync, existsSync } from "fs";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const VERSIONS_DIR = join(__dirname, "..", "versions");
|
|
10
|
+
const BASE_DIR = join(VERSIONS_DIR, "base");
|
|
11
|
+
// To change the base version (e.g. when dropping support for older versions):
|
|
12
|
+
// 1. Replace mcp/versions/base/ with the new base version's full data
|
|
13
|
+
// 2. Update BASE_VERSION below
|
|
14
|
+
// 3. Delete version folders older than the new base
|
|
15
|
+
// 4. Recompute deltas for remaining versions (diff each against new base,
|
|
16
|
+
// keep only changed files + _all_components.json)
|
|
17
|
+
// 5. Update the minimum version in both tool description strings
|
|
18
|
+
// See mcp/scripts/backfill.sh for automation helpers.
|
|
19
|
+
const BASE_VERSION = "1.0.6";
|
|
20
|
+
const SAFE_NAME = /^[a-z0-9_-]+$/;
|
|
21
|
+
const SAFE_VERSION = /^\d+\.\d+\.\d+$/;
|
|
22
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Version resolution helpers
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function compareSemver(a, b) {
|
|
27
|
+
const pa = a.split(".").map(Number);
|
|
28
|
+
const pb = b.split(".").map(Number);
|
|
29
|
+
for (let i = 0; i < 3; i++) {
|
|
30
|
+
if ((pa[i] ?? 0) !== (pb[i] ?? 0))
|
|
31
|
+
return (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
32
|
+
}
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
function getAvailableVersions() {
|
|
36
|
+
if (!existsSync(VERSIONS_DIR))
|
|
37
|
+
return [];
|
|
38
|
+
const versions = readdirSync(VERSIONS_DIR)
|
|
39
|
+
.filter((d) => SAFE_VERSION.test(d))
|
|
40
|
+
.sort(compareSemver);
|
|
41
|
+
if (!versions.includes(BASE_VERSION) && existsSync(BASE_DIR)) {
|
|
42
|
+
versions.push(BASE_VERSION);
|
|
43
|
+
versions.sort(compareSemver);
|
|
44
|
+
}
|
|
45
|
+
return versions;
|
|
46
|
+
}
|
|
47
|
+
function getLatestVersion() {
|
|
48
|
+
const versions = getAvailableVersions();
|
|
49
|
+
return versions[versions.length - 1];
|
|
50
|
+
}
|
|
51
|
+
function resolveVersion(requested) {
|
|
52
|
+
if (!SAFE_VERSION.test(requested))
|
|
53
|
+
return undefined;
|
|
54
|
+
const available = getAvailableVersions();
|
|
55
|
+
if (available.includes(requested)) {
|
|
56
|
+
return { resolved: requested, exact: true };
|
|
57
|
+
}
|
|
58
|
+
// Auto-fallback: try the MINOR baseline (X.Y.0)
|
|
59
|
+
const parts = requested.split(".");
|
|
60
|
+
const minorBase = `${parts[0]}.${parts[1]}.0`;
|
|
61
|
+
if (minorBase !== requested && available.includes(minorBase)) {
|
|
62
|
+
return { resolved: minorBase, exact: false };
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Delta-based doc helpers (version folder -> base fallback)
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
function findDoc(name, version) {
|
|
70
|
+
if (!SAFE_NAME.test(name))
|
|
71
|
+
return undefined;
|
|
72
|
+
// Gatekeeper: if this doc is not in the version's docs catalog, do not fall
|
|
73
|
+
// back to base (prevents serving removed docs from older base data).
|
|
74
|
+
const docsCatalog = getDocsCatalog(version);
|
|
75
|
+
if (docsCatalog && !docsCatalog.docs.includes(name))
|
|
76
|
+
return undefined;
|
|
77
|
+
if (version !== BASE_VERSION) {
|
|
78
|
+
const versionPath = join(VERSIONS_DIR, version, "docs", `${name}.mdx`);
|
|
79
|
+
if (existsSync(versionPath))
|
|
80
|
+
return versionPath;
|
|
81
|
+
}
|
|
82
|
+
const basePath = join(BASE_DIR, "docs", `${name}.mdx`);
|
|
83
|
+
if (existsSync(basePath))
|
|
84
|
+
return basePath;
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
function listAvailableDocs(version) {
|
|
88
|
+
const docsCatalog = getDocsCatalog(version);
|
|
89
|
+
if (docsCatalog)
|
|
90
|
+
return docsCatalog.docs;
|
|
91
|
+
// Fallback for robustness if _all_docs.json is missing.
|
|
92
|
+
const docs = new Set();
|
|
93
|
+
const baseDocsDir = join(BASE_DIR, "docs");
|
|
94
|
+
if (existsSync(baseDocsDir)) {
|
|
95
|
+
for (const f of readdirSync(baseDocsDir)) {
|
|
96
|
+
if (f.endsWith(".mdx"))
|
|
97
|
+
docs.add(f.replace(".mdx", ""));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (version !== BASE_VERSION) {
|
|
101
|
+
const versionDocsDir = join(VERSIONS_DIR, version, "docs");
|
|
102
|
+
if (existsSync(versionDocsDir)) {
|
|
103
|
+
for (const f of readdirSync(versionDocsDir)) {
|
|
104
|
+
if (f.endsWith(".mdx"))
|
|
105
|
+
docs.add(f.replace(".mdx", ""));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return [...docs];
|
|
110
|
+
}
|
|
111
|
+
function getDocsCatalog(version) {
|
|
112
|
+
const docsCatalogPath = version === BASE_VERSION
|
|
113
|
+
? join(BASE_DIR, "docs", "_all_docs.json")
|
|
114
|
+
: join(VERSIONS_DIR, version, "docs", "_all_docs.json");
|
|
115
|
+
if (!existsSync(docsCatalogPath))
|
|
116
|
+
return null;
|
|
117
|
+
return JSON.parse(readFileSync(docsCatalogPath, "utf-8"));
|
|
118
|
+
}
|
|
119
|
+
function getCatalog(version) {
|
|
120
|
+
const catalogPath = version === BASE_VERSION
|
|
121
|
+
? join(BASE_DIR, "component-docs", "_all_components.json")
|
|
122
|
+
: join(VERSIONS_DIR, version, "component-docs", "_all_components.json");
|
|
123
|
+
if (!existsSync(catalogPath))
|
|
124
|
+
return null;
|
|
125
|
+
return JSON.parse(readFileSync(catalogPath, "utf-8"));
|
|
126
|
+
}
|
|
127
|
+
function findComponentDoc(componentName, version) {
|
|
128
|
+
if (componentName === "_all_components") {
|
|
129
|
+
if (version !== BASE_VERSION) {
|
|
130
|
+
const versionPath = join(VERSIONS_DIR, version, "component-docs", "_all_components.json");
|
|
131
|
+
if (existsSync(versionPath))
|
|
132
|
+
return versionPath;
|
|
133
|
+
}
|
|
134
|
+
const basePath = join(BASE_DIR, "component-docs", "_all_components.json");
|
|
135
|
+
if (existsSync(basePath))
|
|
136
|
+
return basePath;
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
// Gatekeeper: only return data if the component exists in this version's catalog
|
|
140
|
+
const catalog = getCatalog(version);
|
|
141
|
+
if (catalog && !catalog.components.includes(componentName))
|
|
142
|
+
return null;
|
|
143
|
+
if (version !== BASE_VERSION) {
|
|
144
|
+
const versionPath = join(VERSIONS_DIR, version, "component-docs", `${componentName}.json`);
|
|
145
|
+
if (existsSync(versionPath))
|
|
146
|
+
return versionPath;
|
|
147
|
+
}
|
|
148
|
+
const basePath = join(BASE_DIR, "component-docs", `${componentName}.json`);
|
|
149
|
+
if (existsSync(basePath))
|
|
150
|
+
return basePath;
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Shared version resolution logic for tool handlers
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
function resolveVersionOrError(requestedVersion) {
|
|
157
|
+
const available = getAvailableVersions();
|
|
158
|
+
if (!requestedVersion) {
|
|
159
|
+
const latest = getLatestVersion();
|
|
160
|
+
if (!latest) {
|
|
161
|
+
return {
|
|
162
|
+
error: "No versioned documentation is available yet.",
|
|
163
|
+
available_versions: [],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return { version: latest };
|
|
167
|
+
}
|
|
168
|
+
const result = resolveVersion(requestedVersion);
|
|
169
|
+
if (!result) {
|
|
170
|
+
return {
|
|
171
|
+
error: `Version '${requestedVersion}' is not available. Minimum supported version is ${available[0] ?? "unknown"}.`,
|
|
172
|
+
available_versions: available,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const warning = result.exact
|
|
176
|
+
? undefined
|
|
177
|
+
: `Exact version '${requestedVersion}' not found; using '${result.resolved}' (nearest MINOR baseline).`;
|
|
178
|
+
return { version: result.resolved, warning };
|
|
179
|
+
}
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// MCP server
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
const server = new McpServer({
|
|
184
|
+
name: "Modus Docs MCP Server",
|
|
185
|
+
version: pkg.version,
|
|
186
|
+
});
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
// Tool: get_modus_implementation_data
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
server.tool("get_modus_implementation_data", `Looks up and parses documentation from the Modus Web Components documentation repository.
|
|
191
|
+
|
|
192
|
+
Retrieves framework integration guides, getting started guides, and general documentation.
|
|
193
|
+
|
|
194
|
+
IMPORTANT: Before calling this tool, check the user's project package.json for the
|
|
195
|
+
@trimble-oss/moduswebcomponents dependency version. Pass that version as the 'version'
|
|
196
|
+
parameter to receive documentation matching their installed version. If their version is
|
|
197
|
+
below 1.0.6 (minimum supported), advise them to update their dependency.
|
|
198
|
+
|
|
199
|
+
Available documents:
|
|
200
|
+
- Framework Integration: "angular", "react", "vue"
|
|
201
|
+
- Guides: "getting-started", "accessibility", "form-inputs", "modus-icon-usage", "styling", "testing"`, {
|
|
202
|
+
docs_name: z.string().describe("The name of the document to retrieve (without .mdx extension). Examples: 'angular', 'react', 'vue', 'getting-started'"),
|
|
203
|
+
version: z.string().optional().describe("The version of @trimble-oss/moduswebcomponents installed in the user's project (e.g. '1.1.1'). " +
|
|
204
|
+
"Check the user's package.json before calling. Defaults to the latest available version."),
|
|
205
|
+
}, ({ docs_name, version }) => {
|
|
206
|
+
const versionResult = resolveVersionOrError(version);
|
|
207
|
+
if ("error" in versionResult) {
|
|
208
|
+
return {
|
|
209
|
+
content: [
|
|
210
|
+
{
|
|
211
|
+
type: "text",
|
|
212
|
+
text: JSON.stringify(versionResult, null, 2),
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const { version: resolvedVersion, warning } = versionResult;
|
|
218
|
+
const docPath = findDoc(docs_name, resolvedVersion);
|
|
219
|
+
if (!docPath) {
|
|
220
|
+
return {
|
|
221
|
+
content: [
|
|
222
|
+
{
|
|
223
|
+
type: "text",
|
|
224
|
+
text: JSON.stringify({
|
|
225
|
+
error: `Document '${docs_name}' not found in version ${resolvedVersion}`,
|
|
226
|
+
available_documents: listAvailableDocs(resolvedVersion),
|
|
227
|
+
requested: docs_name,
|
|
228
|
+
version: resolvedVersion,
|
|
229
|
+
...(warning ? { warning } : {}),
|
|
230
|
+
}, null, 2),
|
|
231
|
+
},
|
|
232
|
+
],
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const content = readFileSync(docPath, "utf-8");
|
|
236
|
+
return {
|
|
237
|
+
content: [
|
|
238
|
+
{
|
|
239
|
+
type: "text",
|
|
240
|
+
text: JSON.stringify({
|
|
241
|
+
document_name: docs_name,
|
|
242
|
+
content,
|
|
243
|
+
type: "implementation_guide",
|
|
244
|
+
format: "mdx",
|
|
245
|
+
version: resolvedVersion,
|
|
246
|
+
...(warning ? { warning } : {}),
|
|
247
|
+
}, null, 2),
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
// Tool: get_modus_component_data
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
server.tool("get_modus_component_data", `Looks up and parses component documentation for Modus Web Components.
|
|
256
|
+
|
|
257
|
+
Retrieves component properties, events, methods, slots, usage examples, and story documentation.
|
|
258
|
+
|
|
259
|
+
IMPORTANT: Before calling this tool, check the user's project package.json for the
|
|
260
|
+
@trimble-oss/moduswebcomponents dependency version. Pass that version as the 'version'
|
|
261
|
+
parameter to receive documentation matching their installed version. If their version is
|
|
262
|
+
below 1.0.6 (minimum supported), advise them to update their dependency.
|
|
263
|
+
|
|
264
|
+
Special component names:
|
|
265
|
+
- "_all_components" - Returns catalog of all available components
|
|
266
|
+
|
|
267
|
+
Component naming format: "modus-wc-{component-name}"
|
|
268
|
+
Examples: "modus-wc-table", "modus-wc-button", "modus-wc-alert"`, {
|
|
269
|
+
component_name: z.string().describe("The name of the Modus component (e.g., 'modus-wc-table') or '_all_components' for the full catalog"),
|
|
270
|
+
version: z.string().optional().describe("The version of @trimble-oss/moduswebcomponents installed in the user's project (e.g. '1.1.1'). " +
|
|
271
|
+
"Check the user's package.json before calling. Defaults to the latest available version."),
|
|
272
|
+
}, ({ component_name, version }) => {
|
|
273
|
+
if (!SAFE_NAME.test(component_name)) {
|
|
274
|
+
return {
|
|
275
|
+
content: [{ type: "text", text: JSON.stringify({ error: "Invalid component name" }, null, 2) }],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
const versionResult = resolveVersionOrError(version);
|
|
279
|
+
if ("error" in versionResult) {
|
|
280
|
+
return {
|
|
281
|
+
content: [
|
|
282
|
+
{
|
|
283
|
+
type: "text",
|
|
284
|
+
text: JSON.stringify(versionResult, null, 2),
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const { version: resolvedVersion, warning } = versionResult;
|
|
290
|
+
const docPath = findComponentDoc(component_name, resolvedVersion);
|
|
291
|
+
if (!docPath) {
|
|
292
|
+
const catalog = getCatalog(resolvedVersion);
|
|
293
|
+
const available = catalog?.components ?? [];
|
|
294
|
+
return {
|
|
295
|
+
content: [
|
|
296
|
+
{
|
|
297
|
+
type: "text",
|
|
298
|
+
text: JSON.stringify({
|
|
299
|
+
error: `Component '${component_name}' not found in version ${resolvedVersion}`,
|
|
300
|
+
available_components: available,
|
|
301
|
+
requested: component_name,
|
|
302
|
+
version: resolvedVersion,
|
|
303
|
+
...(warning ? { warning } : {}),
|
|
304
|
+
}, null, 2),
|
|
305
|
+
},
|
|
306
|
+
],
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
const content = JSON.parse(readFileSync(docPath, "utf-8"));
|
|
310
|
+
return {
|
|
311
|
+
content: [
|
|
312
|
+
{
|
|
313
|
+
type: "text",
|
|
314
|
+
text: JSON.stringify({
|
|
315
|
+
component_name,
|
|
316
|
+
data: content,
|
|
317
|
+
type: "component_documentation",
|
|
318
|
+
format: "json",
|
|
319
|
+
version: resolvedVersion,
|
|
320
|
+
...(warning ? { warning } : {}),
|
|
321
|
+
}, null, 2),
|
|
322
|
+
},
|
|
323
|
+
],
|
|
324
|
+
};
|
|
325
|
+
});
|
|
326
|
+
// ---------------------------------------------------------------------------
|
|
327
|
+
// Entry point
|
|
328
|
+
// ---------------------------------------------------------------------------
|
|
329
|
+
async function main() {
|
|
330
|
+
const transport = new StdioServerTransport();
|
|
331
|
+
await server.connect(transport);
|
|
332
|
+
process.stderr.write("Modus Docs MCP Server running on stdio\n");
|
|
333
|
+
}
|
|
334
|
+
main().catch((err) => {
|
|
335
|
+
process.stderr.write(`Fatal error: ${err}\n`);
|
|
336
|
+
process.exit(1);
|
|
337
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@trimble-oss/moduswebcomponents-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Modus Web Components documentation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"moduswebcomponents-mcp": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"versions"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"extract-docs": "tsx scripts/extract-docs.ts",
|
|
18
|
+
"start": "node dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.10.2"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^25.5.0",
|
|
25
|
+
"tsx": "^4.21.0",
|
|
26
|
+
"typescript": "^5.0.0"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"modus",
|
|
34
|
+
"trimble",
|
|
35
|
+
"web-components",
|
|
36
|
+
"documentation"
|
|
37
|
+
],
|
|
38
|
+
"license": "MIT"
|
|
39
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"total": 50,
|
|
3
|
+
"components": [
|
|
4
|
+
"modus-wc-accordion",
|
|
5
|
+
"modus-wc-alert",
|
|
6
|
+
"modus-wc-autocomplete",
|
|
7
|
+
"modus-wc-avatar",
|
|
8
|
+
"modus-wc-badge",
|
|
9
|
+
"modus-wc-breadcrumbs",
|
|
10
|
+
"modus-wc-button",
|
|
11
|
+
"modus-wc-button-group",
|
|
12
|
+
"modus-wc-card",
|
|
13
|
+
"modus-wc-checkbox",
|
|
14
|
+
"modus-wc-chip",
|
|
15
|
+
"modus-wc-collapse",
|
|
16
|
+
"modus-wc-date",
|
|
17
|
+
"modus-wc-divider",
|
|
18
|
+
"modus-wc-dropdown-menu",
|
|
19
|
+
"modus-wc-file-dropzone",
|
|
20
|
+
"modus-wc-handle",
|
|
21
|
+
"modus-wc-icon",
|
|
22
|
+
"modus-wc-input-feedback",
|
|
23
|
+
"modus-wc-input-label",
|
|
24
|
+
"modus-wc-loader",
|
|
25
|
+
"modus-wc-logo",
|
|
26
|
+
"modus-wc-menu",
|
|
27
|
+
"modus-wc-menu-item",
|
|
28
|
+
"modus-wc-modal",
|
|
29
|
+
"modus-wc-navbar",
|
|
30
|
+
"modus-wc-number-input",
|
|
31
|
+
"modus-wc-pagination",
|
|
32
|
+
"modus-wc-panel",
|
|
33
|
+
"modus-wc-profile-menu",
|
|
34
|
+
"modus-wc-progress",
|
|
35
|
+
"modus-wc-radio",
|
|
36
|
+
"modus-wc-rating",
|
|
37
|
+
"modus-wc-select",
|
|
38
|
+
"modus-wc-side-navigation",
|
|
39
|
+
"modus-wc-skeleton",
|
|
40
|
+
"modus-wc-slider",
|
|
41
|
+
"modus-wc-stepper",
|
|
42
|
+
"modus-wc-switch",
|
|
43
|
+
"modus-wc-table",
|
|
44
|
+
"modus-wc-tabs",
|
|
45
|
+
"modus-wc-text-input",
|
|
46
|
+
"modus-wc-textarea",
|
|
47
|
+
"modus-wc-theme-switcher",
|
|
48
|
+
"modus-wc-time-input",
|
|
49
|
+
"modus-wc-toast",
|
|
50
|
+
"modus-wc-toolbar",
|
|
51
|
+
"modus-wc-tooltip",
|
|
52
|
+
"modus-wc-typography",
|
|
53
|
+
"modus-wc-utility-panel"
|
|
54
|
+
],
|
|
55
|
+
"last_updated": "1774600205.807"
|
|
56
|
+
}
|