@spartan-ng/mcp 0.0.1-alpha.707

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 (44) hide show
  1. package/README.md +149 -0
  2. package/package.json +40 -0
  3. package/src/index.d.ts +1 -0
  4. package/src/index.js +2 -0
  5. package/src/index.js.map +1 -0
  6. package/src/server.d.ts +2 -0
  7. package/src/server.js +32 -0
  8. package/src/server.js.map +1 -0
  9. package/src/tools/analysis.d.ts +2 -0
  10. package/src/tools/analysis.js +269 -0
  11. package/src/tools/analysis.js.map +1 -0
  12. package/src/tools/blocks.d.ts +2 -0
  13. package/src/tools/blocks.js +173 -0
  14. package/src/tools/blocks.js.map +1 -0
  15. package/src/tools/cache-tools.d.ts +2 -0
  16. package/src/tools/cache-tools.js +175 -0
  17. package/src/tools/cache-tools.js.map +1 -0
  18. package/src/tools/cache-warmup.d.ts +40 -0
  19. package/src/tools/cache-warmup.js +156 -0
  20. package/src/tools/cache-warmup.js.map +1 -0
  21. package/src/tools/cache.d.ts +99 -0
  22. package/src/tools/cache.js +361 -0
  23. package/src/tools/cache.js.map +1 -0
  24. package/src/tools/components.d.ts +2 -0
  25. package/src/tools/components.js +126 -0
  26. package/src/tools/components.js.map +1 -0
  27. package/src/tools/docs.d.ts +2 -0
  28. package/src/tools/docs.js +91 -0
  29. package/src/tools/docs.js.map +1 -0
  30. package/src/tools/health.d.ts +2 -0
  31. package/src/tools/health.js +103 -0
  32. package/src/tools/health.js.map +1 -0
  33. package/src/tools/meta.d.ts +2 -0
  34. package/src/tools/meta.js +47 -0
  35. package/src/tools/meta.js.map +1 -0
  36. package/src/tools/prompts.d.ts +2 -0
  37. package/src/tools/prompts.js +299 -0
  38. package/src/tools/prompts.js.map +1 -0
  39. package/src/tools/resources.d.ts +2 -0
  40. package/src/tools/resources.js +178 -0
  41. package/src/tools/resources.js.map +1 -0
  42. package/src/tools/utils.d.ts +84 -0
  43. package/src/tools/utils.js +581 -0
  44. package/src/tools/utils.js.map +1 -0
@@ -0,0 +1,99 @@
1
+ import type { APIInfo, CodeBlock } from './utils.js';
2
+ interface ComponentFullData {
3
+ html: string;
4
+ api: APIInfo;
5
+ examples: CodeBlock[];
6
+ url: string;
7
+ }
8
+ interface ComponentCacheEntry {
9
+ componentName: string;
10
+ version: string;
11
+ cachedAt: string;
12
+ html: string;
13
+ api: APIInfo;
14
+ examples: CodeBlock[];
15
+ full: ComponentFullData;
16
+ }
17
+ interface BlockCacheEntry {
18
+ blockName: string;
19
+ version: string;
20
+ cachedAt: string;
21
+ html: string;
22
+ text?: string;
23
+ code: CodeBlock[];
24
+ full: {
25
+ html: string;
26
+ code: CodeBlock[];
27
+ url: string;
28
+ };
29
+ }
30
+ interface CacheResult<T> {
31
+ data: T | null;
32
+ cached: boolean;
33
+ stale: boolean;
34
+ cachedAt: string | null;
35
+ version: string | null;
36
+ }
37
+ interface ClearResult {
38
+ success: boolean;
39
+ message: string;
40
+ version?: string;
41
+ versions?: string[];
42
+ }
43
+ interface StatsResult {
44
+ currentVersion: string | null;
45
+ totalVersions: number;
46
+ versions: Array<{
47
+ version: string;
48
+ componentCount: number;
49
+ docsCount: number;
50
+ blockCount: number;
51
+ createdAt: string;
52
+ lastUpdated: string;
53
+ isCurrent: boolean;
54
+ }>;
55
+ error?: string;
56
+ }
57
+ interface VersionInfo {
58
+ version: string;
59
+ path: string;
60
+ isCurrent: boolean;
61
+ }
62
+ /**
63
+ * Version-aware cache manager for Spartan UI documentation
64
+ * Stores cached data in cache/{version}/ directory structure
65
+ */
66
+ export declare class CacheManager {
67
+ private readonly _cacheDir;
68
+ currentVersion: string | null;
69
+ private _cacheMetadata;
70
+ constructor();
71
+ initialize(spartanVersion?: string): Promise<string>;
72
+ ensureCacheDir(): Promise<void>;
73
+ loadMetadata(): Promise<void>;
74
+ saveMetadata(): Promise<void>;
75
+ getComponent(componentName: string, dataType?: string): Promise<CacheResult<ComponentCacheEntry | ComponentFullData | string | APIInfo | CodeBlock[] | string[]>>;
76
+ setComponent(componentName: string, data: Partial<ComponentCacheEntry>): Promise<void>;
77
+ getDocs(topic: string): Promise<CacheResult<string | null>>;
78
+ setDocs(topic: string, content: string): Promise<void>;
79
+ getBlock(blockName: string): Promise<CacheResult<unknown>>;
80
+ setBlock(blockName: string, data: Partial<BlockCacheEntry>): Promise<void>;
81
+ clearVersion(): Promise<ClearResult>;
82
+ clearAll(): Promise<ClearResult>;
83
+ getStats(): Promise<StatsResult>;
84
+ listVersions(): Promise<VersionInfo[]>;
85
+ private validateVersion;
86
+ /**
87
+ * Guard cache keys that become filenames. Callers may pass user-supplied
88
+ * names, so reject anything containing path separators or traversal segments
89
+ * to keep writes/reads inside the cache directory.
90
+ */
91
+ private safeKey;
92
+ switchVersion(version: string): Promise<{
93
+ success: boolean;
94
+ version: string;
95
+ message: string;
96
+ }>;
97
+ }
98
+ export declare const cacheManager: CacheManager;
99
+ export {};
@@ -0,0 +1,361 @@
1
+ import fs from 'fs/promises';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ /**
5
+ * Resolve a writable base directory for the on-disk cache.
6
+ *
7
+ * Priority: explicit override -> XDG cache home -> OS user cache directory.
8
+ * Avoids writing inside the installed package, which is often read-only for
9
+ * global/npx installs.
10
+ */
11
+ function resolveCacheDir() {
12
+ if (process.env.SPARTAN_MCP_CACHE_DIR) {
13
+ return path.resolve(process.env.SPARTAN_MCP_CACHE_DIR);
14
+ }
15
+ if (process.env.XDG_CACHE_HOME) {
16
+ return path.join(path.resolve(process.env.XDG_CACHE_HOME), 'spartan-mcp');
17
+ }
18
+ return path.join(os.homedir(), '.cache', 'spartan-mcp');
19
+ }
20
+ /**
21
+ * Version-aware cache manager for Spartan UI documentation
22
+ * Stores cached data in cache/{version}/ directory structure
23
+ */
24
+ export class CacheManager {
25
+ _cacheDir;
26
+ currentVersion;
27
+ _cacheMetadata;
28
+ constructor() {
29
+ this._cacheDir = resolveCacheDir();
30
+ this.currentVersion = null;
31
+ this._cacheMetadata = null;
32
+ }
33
+ async initialize(spartanVersion) {
34
+ this.currentVersion = spartanVersion ? this.validateVersion(spartanVersion) : 'latest';
35
+ await this.ensureCacheDir();
36
+ await this.loadMetadata();
37
+ return this.currentVersion;
38
+ }
39
+ async ensureCacheDir() {
40
+ const versionDir = path.join(this._cacheDir, this.currentVersion);
41
+ const componentsDir = path.join(versionDir, 'components');
42
+ const docsDir = path.join(versionDir, 'docs');
43
+ const blocksDir = path.join(versionDir, 'blocks');
44
+ await fs.mkdir(componentsDir, { recursive: true });
45
+ await fs.mkdir(docsDir, { recursive: true });
46
+ await fs.mkdir(blocksDir, { recursive: true });
47
+ }
48
+ async loadMetadata() {
49
+ const metadataPath = path.join(this._cacheDir, this.currentVersion, 'metadata.json');
50
+ try {
51
+ const data = await fs.readFile(metadataPath, 'utf-8');
52
+ this._cacheMetadata = JSON.parse(data);
53
+ }
54
+ catch {
55
+ this._cacheMetadata = {
56
+ version: this.currentVersion,
57
+ createdAt: new Date().toISOString(),
58
+ lastUpdated: new Date().toISOString(),
59
+ components: {},
60
+ docs: {},
61
+ blocks: {},
62
+ };
63
+ await this.saveMetadata();
64
+ }
65
+ }
66
+ async saveMetadata() {
67
+ const metadataPath = path.join(this._cacheDir, this.currentVersion, 'metadata.json');
68
+ await fs.writeFile(metadataPath, JSON.stringify(this._cacheMetadata, null, 2), 'utf-8');
69
+ }
70
+ async getComponent(componentName, dataType = 'full') {
71
+ const componentFile = path.join(this._cacheDir, this.currentVersion, 'components', `${this.safeKey(componentName)}.json`);
72
+ try {
73
+ const data = await fs.readFile(componentFile, 'utf-8');
74
+ const componentData = JSON.parse(data);
75
+ const ttlHours = Number(process.env.SPARTAN_CACHE_TTL_HOURS || 24);
76
+ const cacheAge = Date.now() - new Date(componentData.cachedAt).getTime();
77
+ const isStale = cacheAge > ttlHours * 60 * 60 * 1000;
78
+ let selectedData;
79
+ switch (dataType) {
80
+ case 'html':
81
+ selectedData = componentData.html;
82
+ break;
83
+ case 'api':
84
+ selectedData = componentData.api;
85
+ break;
86
+ case 'examples':
87
+ selectedData = componentData.examples;
88
+ break;
89
+ case 'full':
90
+ default:
91
+ selectedData = componentData.full;
92
+ break;
93
+ }
94
+ return {
95
+ data: selectedData,
96
+ cached: true,
97
+ stale: isStale,
98
+ cachedAt: componentData.cachedAt,
99
+ version: this.currentVersion,
100
+ };
101
+ }
102
+ catch {
103
+ return {
104
+ data: null,
105
+ cached: false,
106
+ stale: false,
107
+ cachedAt: null,
108
+ version: this.currentVersion,
109
+ };
110
+ }
111
+ }
112
+ async setComponent(componentName, data) {
113
+ const componentFile = path.join(this._cacheDir, this.currentVersion, 'components', `${this.safeKey(componentName)}.json`);
114
+ const cacheEntry = {
115
+ ...data,
116
+ componentName,
117
+ version: this.currentVersion,
118
+ cachedAt: new Date().toISOString(),
119
+ };
120
+ await fs.writeFile(componentFile, JSON.stringify(cacheEntry, null, 2), 'utf-8');
121
+ this._cacheMetadata.components[componentName] = {
122
+ cachedAt: cacheEntry.cachedAt,
123
+ size: JSON.stringify(cacheEntry).length,
124
+ };
125
+ this._cacheMetadata.lastUpdated = new Date().toISOString();
126
+ await this.saveMetadata();
127
+ }
128
+ async getDocs(topic) {
129
+ const docsFile = path.join(this._cacheDir, this.currentVersion, 'docs', `${this.safeKey(topic)}.json`);
130
+ try {
131
+ const data = await fs.readFile(docsFile, 'utf-8');
132
+ const docsData = JSON.parse(data);
133
+ const ttlHours = Number(process.env.SPARTAN_CACHE_TTL_HOURS || 24);
134
+ const cacheAge = Date.now() - new Date(docsData.cachedAt).getTime();
135
+ const isStale = cacheAge > ttlHours * 60 * 60 * 1000;
136
+ return {
137
+ data: docsData.content,
138
+ cached: true,
139
+ stale: isStale,
140
+ cachedAt: docsData.cachedAt,
141
+ version: this.currentVersion,
142
+ };
143
+ }
144
+ catch {
145
+ return {
146
+ data: null,
147
+ cached: false,
148
+ stale: false,
149
+ cachedAt: null,
150
+ version: this.currentVersion,
151
+ };
152
+ }
153
+ }
154
+ async setDocs(topic, content) {
155
+ const docsFile = path.join(this._cacheDir, this.currentVersion, 'docs', `${this.safeKey(topic)}.json`);
156
+ const cacheEntry = {
157
+ topic,
158
+ content,
159
+ version: this.currentVersion,
160
+ cachedAt: new Date().toISOString(),
161
+ };
162
+ await fs.writeFile(docsFile, JSON.stringify(cacheEntry, null, 2), 'utf-8');
163
+ this._cacheMetadata.docs[topic] = {
164
+ cachedAt: cacheEntry.cachedAt,
165
+ size: JSON.stringify(cacheEntry).length,
166
+ };
167
+ this._cacheMetadata.lastUpdated = new Date().toISOString();
168
+ await this.saveMetadata();
169
+ }
170
+ async getBlock(blockName) {
171
+ const blockFile = path.join(this._cacheDir, this.currentVersion, 'blocks', `${this.safeKey(blockName)}.json`);
172
+ try {
173
+ const data = await fs.readFile(blockFile, 'utf-8');
174
+ const blockData = JSON.parse(data);
175
+ const ttlHours = Number(process.env.SPARTAN_CACHE_TTL_HOURS || 24);
176
+ const cacheAge = Date.now() - new Date(blockData.cachedAt).getTime();
177
+ const isStale = cacheAge > ttlHours * 60 * 60 * 1000;
178
+ return {
179
+ data: blockData,
180
+ cached: true,
181
+ stale: isStale,
182
+ cachedAt: blockData.cachedAt,
183
+ version: this.currentVersion,
184
+ };
185
+ }
186
+ catch {
187
+ return {
188
+ data: null,
189
+ cached: false,
190
+ stale: false,
191
+ cachedAt: null,
192
+ version: this.currentVersion,
193
+ };
194
+ }
195
+ }
196
+ async setBlock(blockName, data) {
197
+ const blockFile = path.join(this._cacheDir, this.currentVersion, 'blocks', `${this.safeKey(blockName)}.json`);
198
+ const cacheEntry = {
199
+ ...data,
200
+ blockName,
201
+ version: this.currentVersion,
202
+ cachedAt: new Date().toISOString(),
203
+ };
204
+ await fs.writeFile(blockFile, JSON.stringify(cacheEntry, null, 2), 'utf-8');
205
+ // `blocks` is optional and may be absent in metadata written by older versions.
206
+ this._cacheMetadata.blocks ??= {};
207
+ this._cacheMetadata.blocks[blockName] = {
208
+ cachedAt: cacheEntry.cachedAt,
209
+ size: JSON.stringify(cacheEntry).length,
210
+ };
211
+ this._cacheMetadata.lastUpdated = new Date().toISOString();
212
+ await this.saveMetadata();
213
+ }
214
+ async clearVersion() {
215
+ const versionDir = path.join(this._cacheDir, this.currentVersion);
216
+ try {
217
+ await fs.rm(versionDir, { recursive: true, force: true });
218
+ await this.ensureCacheDir();
219
+ await this.loadMetadata();
220
+ return {
221
+ success: true,
222
+ message: `Cleared cache for version ${this.currentVersion}`,
223
+ version: this.currentVersion,
224
+ };
225
+ }
226
+ catch (error) {
227
+ return {
228
+ success: false,
229
+ message: `Failed to clear cache: ${error.message}`,
230
+ version: this.currentVersion,
231
+ };
232
+ }
233
+ }
234
+ async clearAll() {
235
+ try {
236
+ const versions = await fs.readdir(this._cacheDir);
237
+ const clearedVersions = [];
238
+ for (const version of versions) {
239
+ const versionPath = path.join(this._cacheDir, version);
240
+ const stats = await fs.stat(versionPath);
241
+ if (stats.isDirectory()) {
242
+ await fs.rm(versionPath, { recursive: true, force: true });
243
+ clearedVersions.push(version);
244
+ }
245
+ }
246
+ await this.ensureCacheDir();
247
+ await this.loadMetadata();
248
+ return {
249
+ success: true,
250
+ message: `Cleared cache for ${clearedVersions.length} version(s)`,
251
+ versions: clearedVersions,
252
+ };
253
+ }
254
+ catch (error) {
255
+ return {
256
+ success: false,
257
+ message: `Failed to clear all cache: ${error.message}`,
258
+ versions: [],
259
+ };
260
+ }
261
+ }
262
+ async getStats() {
263
+ try {
264
+ const versions = await fs.readdir(this._cacheDir);
265
+ const versionStats = [];
266
+ for (const version of versions) {
267
+ const versionPath = path.join(this._cacheDir, version);
268
+ const stats = await fs.stat(versionPath);
269
+ if (stats.isDirectory()) {
270
+ const metadataPath = path.join(versionPath, 'metadata.json');
271
+ try {
272
+ const metadataContent = await fs.readFile(metadataPath, 'utf-8');
273
+ const metadata = JSON.parse(metadataContent);
274
+ const componentCount = Object.keys(metadata.components || {}).length;
275
+ const docsCount = Object.keys(metadata.docs || {}).length;
276
+ const blockCount = Object.keys(metadata.blocks || {}).length;
277
+ versionStats.push({
278
+ version,
279
+ componentCount,
280
+ docsCount,
281
+ blockCount,
282
+ createdAt: metadata.createdAt,
283
+ lastUpdated: metadata.lastUpdated,
284
+ isCurrent: version === this.currentVersion,
285
+ });
286
+ }
287
+ catch {
288
+ // Skip invalid directories
289
+ }
290
+ }
291
+ }
292
+ return {
293
+ currentVersion: this.currentVersion,
294
+ totalVersions: versionStats.length,
295
+ versions: versionStats,
296
+ };
297
+ }
298
+ catch (error) {
299
+ return {
300
+ currentVersion: this.currentVersion,
301
+ totalVersions: 0,
302
+ versions: [],
303
+ error: error.message,
304
+ };
305
+ }
306
+ }
307
+ async listVersions() {
308
+ try {
309
+ const versions = await fs.readdir(this._cacheDir);
310
+ const validVersions = [];
311
+ for (const version of versions) {
312
+ const versionPath = path.join(this._cacheDir, version);
313
+ const stats = await fs.stat(versionPath);
314
+ if (stats.isDirectory()) {
315
+ validVersions.push({
316
+ version,
317
+ path: versionPath,
318
+ isCurrent: version === this.currentVersion,
319
+ });
320
+ }
321
+ }
322
+ return validVersions;
323
+ }
324
+ catch {
325
+ return [];
326
+ }
327
+ }
328
+ validateVersion(version) {
329
+ if (!version || version === '.' || version === '..') {
330
+ throw new Error(`Invalid version: "${version}". Version cannot be empty, '.', or '..'.`);
331
+ }
332
+ if (!/^[\w.-]+$/.test(version)) {
333
+ throw new Error(`Invalid version: "${version}". Only alphanumeric, dash, underscore, and dot characters are allowed.`);
334
+ }
335
+ return version;
336
+ }
337
+ /**
338
+ * Guard cache keys that become filenames. Callers may pass user-supplied
339
+ * names, so reject anything containing path separators or traversal segments
340
+ * to keep writes/reads inside the cache directory.
341
+ */
342
+ safeKey(key) {
343
+ if (!key || key === '.' || key === '..' || !/^[\w.-]+$/.test(key)) {
344
+ throw new Error(`Invalid cache key: "${key}". Only alphanumeric, dash, underscore, and dot characters are allowed.`);
345
+ }
346
+ return key;
347
+ }
348
+ async switchVersion(version) {
349
+ this.currentVersion = this.validateVersion(version);
350
+ await this.ensureCacheDir();
351
+ await this.loadMetadata();
352
+ return {
353
+ success: true,
354
+ version: this.currentVersion,
355
+ message: `Switched to version ${version}`,
356
+ };
357
+ }
358
+ }
359
+ // Export singleton instance
360
+ export const cacheManager = new CacheManager();
361
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../../libs/mcp/src/tools/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerComponentTools(server: McpServer): void;
@@ -0,0 +1,126 @@
1
+ import { z } from 'zod';
2
+ import { cacheManager } from './cache.js';
3
+ import { KNOWN_COMPONENTS, SPARTAN_COMPONENTS_BASE, extractAPIInfo, extractCodeBlocks, fetchContent, } from './utils.js';
4
+ function isComponentSnapshot(value) {
5
+ if (!value || typeof value !== 'object') {
6
+ return false;
7
+ }
8
+ const candidate = value;
9
+ return (typeof candidate.html === 'string' &&
10
+ Array.isArray(candidate.examples) &&
11
+ typeof candidate.url === 'string' &&
12
+ candidate.api !== undefined);
13
+ }
14
+ export function registerComponentTools(server) {
15
+ server.registerTool('spartan_components_list', {
16
+ title: 'List Spartan UI components',
17
+ description: 'Returns a list of known Spartan Angular UI components with their documentation URLs. ' +
18
+ 'Use this to discover available components, then call spartan_components_get with specific component names to get detailed API documentation.',
19
+ inputSchema: {},
20
+ }, async () => {
21
+ const items = KNOWN_COMPONENTS.map((name) => ({
22
+ name,
23
+ url: `${SPARTAN_COMPONENTS_BASE}/${name}`,
24
+ }));
25
+ const responseText = JSON.stringify({ components: items }, null, 2) +
26
+ '\n\nPROCESSING INSTRUCTIONS:\n' +
27
+ '- This list contains all available Spartan UI components\n' +
28
+ '- Use spartan_components_get with any component name to get detailed API documentation\n' +
29
+ '- Each component has Brain API (Brn*) and Helm API (Hlm*) variants\n' +
30
+ '- Always present component options and APIs when helping users';
31
+ return {
32
+ content: [
33
+ {
34
+ type: 'text',
35
+ text: responseText,
36
+ },
37
+ ],
38
+ };
39
+ });
40
+ server.registerTool('spartan_components_get', {
41
+ title: 'Get component documentation',
42
+ description: "Fetch the Spartan UI documentation page for a given component (e.g., 'accordion'). " +
43
+ 'IMPORTANT: The response contains comprehensive API information including Brain API (Brn*) and Helm API (Hlm*) components with their inputs, outputs, selectors, and examples. ' +
44
+ 'Always parse and present the API tables, code examples, and component specifications from the response. ' +
45
+ "Look for structured sections like 'Brain API', 'Helm API', and 'Examples' in the response.",
46
+ inputSchema: {
47
+ name: z.string().min(1, 'name is required').describe("Component name (kebab-case), e.g., 'accordion'."),
48
+ extract: z
49
+ .enum(['code', 'api'])
50
+ .default('code')
51
+ .describe("Extraction: 'code' for code blocks, 'api' for structured API information."),
52
+ noCache: z.boolean().default(false).describe('Bypass cache when true.'),
53
+ spartanVersion: z
54
+ .string()
55
+ .optional()
56
+ .describe("Spartan UI version to use for caching (e.g., '1.2.3'). If not provided, defaults to 'latest'."),
57
+ },
58
+ }, async (args) => {
59
+ const name = String(args.name || '')
60
+ .trim()
61
+ .toLowerCase();
62
+ if (!name)
63
+ throw new Error('Missing component name');
64
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
65
+ throw new Error(`Invalid component name: "${name}". Use a kebab-case name, e.g. 'accordion'.`);
66
+ }
67
+ await cacheManager.initialize(args.spartanVersion);
68
+ const url = `${SPARTAN_COMPONENTS_BASE}/${encodeURIComponent(name)}`;
69
+ const extract = args.extract || 'code';
70
+ const noCache = Boolean(args.noCache);
71
+ let snapshot;
72
+ let cacheInfo = '';
73
+ if (!noCache) {
74
+ const cached = await cacheManager.getComponent(name, 'full');
75
+ if (cached.cached && !cached.stale && isComponentSnapshot(cached.data)) {
76
+ snapshot = cached.data;
77
+ cacheInfo = `\n[CACHED DATA - Version: ${cached.version}, Cached at: ${cached.cachedAt}]`;
78
+ }
79
+ else {
80
+ const html = await fetchContent(url, 'html', true);
81
+ const api = extractAPIInfo(html);
82
+ const examples = extractCodeBlocks(html);
83
+ snapshot = { html, api, examples, url };
84
+ await cacheManager.setComponent(name, {
85
+ html,
86
+ api,
87
+ examples,
88
+ full: snapshot,
89
+ });
90
+ cacheInfo = cached.cached
91
+ ? `\n[CACHE REFRESHED - Version: ${cacheManager.currentVersion}]`
92
+ : `\n[NEWLY CACHED - Version: ${cacheManager.currentVersion}]`;
93
+ }
94
+ }
95
+ else {
96
+ const html = await fetchContent(url, 'html', true);
97
+ snapshot = {
98
+ html,
99
+ api: extractAPIInfo(html),
100
+ examples: extractCodeBlocks(html),
101
+ url,
102
+ };
103
+ cacheInfo = '\n[LIVE FETCH - Cache bypassed]';
104
+ }
105
+ let extracted;
106
+ if (extract === 'code')
107
+ extracted = snapshot.examples;
108
+ else if (extract === 'api')
109
+ extracted = [snapshot.api];
110
+ else
111
+ extracted = [];
112
+ const payload = {
113
+ url,
114
+ extract,
115
+ count: Array.isArray(extracted) ? extracted.length : 0,
116
+ data: extracted,
117
+ cacheInfo: cacheInfo.trim(),
118
+ version: cacheManager.currentVersion,
119
+ processingInstructions: 'Always parse and present the API information, code examples, and component specifications from this data.',
120
+ };
121
+ return {
122
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
123
+ };
124
+ });
125
+ }
126
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../../../libs/mcp/src/tools/components.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerDocsTools(server: McpServer): void;