ngx-oneforall-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/data.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Data layer for the MCP server.
3
+ *
4
+ * Reads the bundled docs.json (generated at build time by scripts/bundle-docs.mjs)
5
+ * to provide an indexed, searchable collection of all ngx-oneforall utilities.
6
+ */
7
+ export interface Utility {
8
+ name: string;
9
+ category: string;
10
+ categoryTitle: string;
11
+ dirName: string;
12
+ routePath: string;
13
+ importPath: string;
14
+ url: string;
15
+ description: string;
16
+ fullContent: string;
17
+ }
18
+ export interface UtilityIndex {
19
+ utilities: Utility[];
20
+ byCategory: Map<string, Utility[]>;
21
+ byName: Map<string, Utility>;
22
+ categories: string[];
23
+ llmsTxt: string;
24
+ }
25
+ /**
26
+ * Load and index all utility documentation from the bundled docs.json.
27
+ */
28
+ export declare function loadUtilities(): UtilityIndex;
package/dist/data.js ADDED
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Data layer for the MCP server.
3
+ *
4
+ * Reads the bundled docs.json (generated at build time by scripts/bundle-docs.mjs)
5
+ * to provide an indexed, searchable collection of all ngx-oneforall utilities.
6
+ */
7
+ import { readFileSync } from 'node:fs';
8
+ import { join, dirname } from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const CATEGORY_ORDER = [
12
+ ['getting-started', 'Getting Started'],
13
+ ['constants', 'Constants'],
14
+ ['decorators', 'Decorators'],
15
+ ['directives', 'Directives'],
16
+ ['guards', 'Guards'],
17
+ ['interceptors', 'Interceptors'],
18
+ ['pipes', 'Pipes'],
19
+ ['rxjs', 'RxJS'],
20
+ ['services', 'Services'],
21
+ ['signals', 'Signals'],
22
+ ['types', 'Types'],
23
+ ['utils', 'Utils'],
24
+ ['validators', 'Validators'],
25
+ ];
26
+ /**
27
+ * Load and index all utility documentation from the bundled docs.json.
28
+ */
29
+ export function loadUtilities() {
30
+ // Read from bundled data (relative to dist/ → ../data/docs.json)
31
+ const docsPath = join(__dirname, '..', 'data', 'docs.json');
32
+ const raw = readFileSync(docsPath, 'utf-8');
33
+ const { utilities } = JSON.parse(raw);
34
+ const byCategory = new Map();
35
+ const byName = new Map();
36
+ const categories = [];
37
+ for (const utility of utilities) {
38
+ // Group by category
39
+ if (!byCategory.has(utility.category)) {
40
+ byCategory.set(utility.category, []);
41
+ categories.push(utility.category);
42
+ }
43
+ byCategory.get(utility.category).push(utility);
44
+ // Index by name variants for lookup
45
+ byName.set(utility.name.toLowerCase(), utility);
46
+ byName.set(utility.dirName, utility);
47
+ }
48
+ // Build llms.txt content
49
+ const llmsLines = [
50
+ '# ngx-oneforall',
51
+ '',
52
+ '> A collection of 85+ high-quality Angular utilities.',
53
+ '> Tree-shakable, zero-dependency, SSR-ready, 100% test coverage.',
54
+ '',
55
+ ];
56
+ for (const [cat, pages] of byCategory) {
57
+ const catTitle = CATEGORY_ORDER.find(([d]) => d === cat)?.[1] || cat;
58
+ llmsLines.push(`## ${catTitle}`);
59
+ llmsLines.push('');
60
+ for (const p of pages) {
61
+ const desc = p.description ? `: ${p.description}` : '';
62
+ llmsLines.push(`- [${p.name}](${p.url})${desc}`);
63
+ }
64
+ llmsLines.push('');
65
+ }
66
+ return {
67
+ utilities,
68
+ byCategory,
69
+ byName,
70
+ categories,
71
+ llmsTxt: llmsLines.join('\n'),
72
+ };
73
+ }
74
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ngx-oneforall MCP Server
3
+ *
4
+ * Provides AI tools with native knowledge of all ngx-oneforall
5
+ * Angular utilities via the Model Context Protocol.
6
+ *
7
+ * Usage:
8
+ * npx @ngx-oneforall/mcp-server
9
+ *
10
+ * Or add to your MCP config:
11
+ * {
12
+ * "mcpServers": {
13
+ * "ngx-oneforall": {
14
+ * "command": "npx",
15
+ * "args": ["-y", "@ngx-oneforall/mcp-server"]
16
+ * }
17
+ * }
18
+ * }
19
+ */
20
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,99 @@
1
+ /**
2
+ * ngx-oneforall MCP Server
3
+ *
4
+ * Provides AI tools with native knowledge of all ngx-oneforall
5
+ * Angular utilities via the Model Context Protocol.
6
+ *
7
+ * Usage:
8
+ * npx @ngx-oneforall/mcp-server
9
+ *
10
+ * Or add to your MCP config:
11
+ * {
12
+ * "mcpServers": {
13
+ * "ngx-oneforall": {
14
+ * "command": "npx",
15
+ * "args": ["-y", "@ngx-oneforall/mcp-server"]
16
+ * }
17
+ * }
18
+ * }
19
+ */
20
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
21
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
22
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
23
+ import { loadUtilities } from './data.js';
24
+ import { registerTools } from './tools.js';
25
+ // Load documentation index
26
+ const index = loadUtilities();
27
+ // Create MCP server
28
+ const server = new McpServer({
29
+ name: 'ngx-oneforall',
30
+ version: '1.2.1',
31
+ });
32
+ // --- Register Tools ---
33
+ registerTools(server, index);
34
+ // --- Register Resources ---
35
+ // Static resource: llms.txt
36
+ server.registerResource('llms-txt', 'ngx-oneforall://llms.txt', {
37
+ title: 'ngx-oneforall LLMs.txt',
38
+ description: 'Structured index of all ngx-oneforall utilities with links and descriptions',
39
+ mimeType: 'text/plain',
40
+ }, async (uri) => ({
41
+ contents: [
42
+ {
43
+ uri: uri.href,
44
+ text: index.llmsTxt,
45
+ },
46
+ ],
47
+ }));
48
+ // Dynamic resource: per-utility docs
49
+ server.registerResource('utility-docs', new ResourceTemplate('ngx-oneforall://docs/{category}/{utility}', {
50
+ list: async () => ({
51
+ resources: index.utilities.map(u => ({
52
+ uri: `ngx-oneforall://docs/${u.category}/${u.dirName}`,
53
+ name: `${u.name} (${u.categoryTitle})`,
54
+ description: u.description,
55
+ mimeType: 'text/markdown',
56
+ })),
57
+ }),
58
+ }), {
59
+ title: 'Utility Documentation',
60
+ description: 'Full documentation for a specific ngx-oneforall utility',
61
+ mimeType: 'text/markdown',
62
+ }, async (uri, { category, utility }) => {
63
+ const cat = category;
64
+ const util = utility;
65
+ const utilities = index.byCategory.get(cat);
66
+ const found = utilities?.find(u => u.dirName === util);
67
+ if (!found) {
68
+ return {
69
+ contents: [
70
+ {
71
+ uri: uri.href,
72
+ text: `Utility not found: ${cat}/${util}`,
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ const header = [
78
+ `# ${found.name}`,
79
+ '',
80
+ `**Category**: ${found.categoryTitle}`,
81
+ `**Import**: \`${found.importPath}\``,
82
+ `**Docs**: ${found.url}`,
83
+ '',
84
+ '---',
85
+ '',
86
+ ].join('\n');
87
+ return {
88
+ contents: [
89
+ {
90
+ uri: uri.href,
91
+ text: header + found.fullContent,
92
+ },
93
+ ],
94
+ };
95
+ });
96
+ // --- Start Server ---
97
+ const transport = new StdioServerTransport();
98
+ await server.connect(transport);
99
+ //# 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,9 @@
1
+ /**
2
+ * MCP tool registrations for ngx-oneforall.
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { type UtilityIndex } from './data.js';
6
+ /**
7
+ * Register all MCP tools on the server.
8
+ */
9
+ export declare function registerTools(server: McpServer, index: UtilityIndex): void;
package/dist/tools.js ADDED
@@ -0,0 +1,247 @@
1
+ /**
2
+ * MCP tool registrations for ngx-oneforall.
3
+ */
4
+ import { z } from 'zod';
5
+ /**
6
+ * Simple text search across utility names, descriptions, and content.
7
+ */
8
+ function searchIndex(index, query) {
9
+ const q = query.toLowerCase();
10
+ const scored = [];
11
+ for (const utility of index.utilities) {
12
+ let score = 0;
13
+ // Exact name match is highest priority
14
+ if (utility.name.toLowerCase() === q) {
15
+ score += 100;
16
+ }
17
+ else if (utility.name.toLowerCase().includes(q)) {
18
+ score += 50;
19
+ }
20
+ // dir name match
21
+ if (utility.dirName.includes(q)) {
22
+ score += 40;
23
+ }
24
+ // Category match
25
+ if (utility.category.includes(q) ||
26
+ utility.categoryTitle.toLowerCase().includes(q)) {
27
+ score += 20;
28
+ }
29
+ // Description match
30
+ if (utility.description.toLowerCase().includes(q)) {
31
+ score += 30;
32
+ }
33
+ // Full content match
34
+ if (utility.fullContent.toLowerCase().includes(q)) {
35
+ score += 10;
36
+ }
37
+ if (score > 0) {
38
+ scored.push({ utility, score });
39
+ }
40
+ }
41
+ return scored.sort((a, b) => b.score - a.score).map(s => s.utility);
42
+ }
43
+ /**
44
+ * Find a utility by name (case-insensitive, supports partial matching).
45
+ */
46
+ function findUtility(index, name) {
47
+ const q = name.toLowerCase().trim();
48
+ // Exact match first
49
+ const exact = index.byName.get(q);
50
+ if (exact)
51
+ return exact;
52
+ // Try partial match
53
+ for (const utility of index.utilities) {
54
+ if (utility.name.toLowerCase() === q ||
55
+ utility.dirName === q ||
56
+ utility.dirName === q.replace(/\s+/g, '-')) {
57
+ return utility;
58
+ }
59
+ }
60
+ // Fuzzy: find closest match
61
+ const results = searchIndex(index, q);
62
+ return results.length > 0 ? results[0] : undefined;
63
+ }
64
+ /**
65
+ * Format a utility listing for display.
66
+ */
67
+ function formatUtilityListing(utility) {
68
+ return `- **${utility.name}** (\`${utility.importPath}\`): ${utility.description || 'No description available.'}`;
69
+ }
70
+ /**
71
+ * Register all MCP tools on the server.
72
+ */
73
+ export function registerTools(server, index) {
74
+ // --- get_utility_docs ---
75
+ server.registerTool('get_utility_docs', {
76
+ title: 'Get Utility Documentation',
77
+ description: 'Get the full documentation for a specific ngx-oneforall utility by name. Returns complete markdown docs including API reference, usage examples, and code snippets.',
78
+ inputSchema: z.object({
79
+ name: z
80
+ .string()
81
+ .describe('Name of the utility (e.g., "draggable", "cache", "time-ago", "debounced-signal")'),
82
+ }),
83
+ annotations: { readOnlyHint: true },
84
+ }, async ({ name }) => {
85
+ const utility = findUtility(index, name);
86
+ if (!utility) {
87
+ const suggestions = searchIndex(index, name).slice(0, 5);
88
+ const suggestionText = suggestions.length > 0
89
+ ? `\n\nDid you mean one of these?\n${suggestions.map(u => `- ${u.name} (${u.category})`).join('\n')}`
90
+ : '';
91
+ return {
92
+ content: [
93
+ {
94
+ type: 'text',
95
+ text: `Utility "${name}" not found.${suggestionText}`,
96
+ },
97
+ ],
98
+ };
99
+ }
100
+ const header = [
101
+ `# ${utility.name}`,
102
+ '',
103
+ `**Category**: ${utility.categoryTitle}`,
104
+ `**Import**: \`import { ... } from '${utility.importPath}';\``,
105
+ `**Docs**: ${utility.url}`,
106
+ '',
107
+ '---',
108
+ '',
109
+ ].join('\n');
110
+ return {
111
+ content: [
112
+ {
113
+ type: 'text',
114
+ text: header + (utility.fullContent || 'No documentation available.'),
115
+ },
116
+ ],
117
+ };
118
+ });
119
+ // --- search_utilities ---
120
+ server.registerTool('search_utilities', {
121
+ title: 'Search Utilities',
122
+ description: 'Search ngx-oneforall utilities by keyword. Searches across names, descriptions, and documentation content. Returns matching utilities with their import paths and descriptions.',
123
+ inputSchema: z.object({
124
+ query: z
125
+ .string()
126
+ .describe('Search term (e.g., "keyboard", "cache", "form validation", "signal")'),
127
+ }),
128
+ annotations: { readOnlyHint: true },
129
+ }, async ({ query }) => {
130
+ const results = searchIndex(index, query);
131
+ if (results.length === 0) {
132
+ return {
133
+ content: [
134
+ {
135
+ type: 'text',
136
+ text: `No utilities found matching "${query}".`,
137
+ },
138
+ ],
139
+ };
140
+ }
141
+ const lines = [
142
+ `# Search Results for "${query}"`,
143
+ '',
144
+ `Found ${results.length} matching utilities:`,
145
+ '',
146
+ ...results.map(u => formatUtilityListing(u)),
147
+ ];
148
+ return {
149
+ content: [{ type: 'text', text: lines.join('\n') }],
150
+ };
151
+ });
152
+ // --- list_utilities ---
153
+ server.registerTool('list_utilities', {
154
+ title: 'List Utilities',
155
+ description: 'List all ngx-oneforall utilities, optionally filtered by category. Returns utility names, import paths, and descriptions grouped by category.',
156
+ inputSchema: z.object({
157
+ category: z
158
+ .string()
159
+ .optional()
160
+ .describe('Optional category filter (e.g., "directives", "pipes", "signals", "validators")'),
161
+ }),
162
+ annotations: { readOnlyHint: true },
163
+ }, async ({ category }) => {
164
+ const lines = [];
165
+ if (category) {
166
+ const cat = category.toLowerCase();
167
+ const utilities = index.byCategory.get(cat);
168
+ if (!utilities) {
169
+ return {
170
+ content: [
171
+ {
172
+ type: 'text',
173
+ text: `Category "${category}" not found. Available categories: ${index.categories.join(', ')}`,
174
+ },
175
+ ],
176
+ };
177
+ }
178
+ const catTitle = utilities[0]?.categoryTitle || category;
179
+ lines.push(`# ${catTitle}`);
180
+ lines.push('');
181
+ lines.push(`${utilities.length} utilities:`);
182
+ lines.push('');
183
+ for (const u of utilities) {
184
+ lines.push(formatUtilityListing(u));
185
+ }
186
+ }
187
+ else {
188
+ lines.push('# All ngx-oneforall Utilities');
189
+ lines.push('');
190
+ lines.push(`${index.utilities.length} utilities across ${index.categories.length} categories:`);
191
+ lines.push('');
192
+ for (const [cat, utilities] of index.byCategory) {
193
+ const catTitle = utilities[0]?.categoryTitle || cat;
194
+ lines.push(`## ${catTitle} (${utilities.length})`);
195
+ lines.push('');
196
+ for (const u of utilities) {
197
+ lines.push(formatUtilityListing(u));
198
+ }
199
+ lines.push('');
200
+ }
201
+ }
202
+ return {
203
+ content: [{ type: 'text', text: lines.join('\n') }],
204
+ };
205
+ });
206
+ // --- get_import_path ---
207
+ server.registerTool('get_import_path', {
208
+ title: 'Get Import Path',
209
+ description: 'Get the exact TypeScript import statement for a specific ngx-oneforall utility. Returns the correct import path for use in Angular projects.',
210
+ inputSchema: z.object({
211
+ name: z
212
+ .string()
213
+ .describe('Name of the utility (e.g., "draggable", "time-ago", "cache")'),
214
+ }),
215
+ annotations: { readOnlyHint: true },
216
+ }, async ({ name }) => {
217
+ const utility = findUtility(index, name);
218
+ if (!utility) {
219
+ const suggestions = searchIndex(index, name).slice(0, 3);
220
+ const suggestionText = suggestions.length > 0
221
+ ? `\n\nDid you mean: ${suggestions.map(u => u.name).join(', ')}?`
222
+ : '';
223
+ return {
224
+ content: [
225
+ {
226
+ type: 'text',
227
+ text: `Utility "${name}" not found.${suggestionText}`,
228
+ },
229
+ ],
230
+ };
231
+ }
232
+ const text = [
233
+ `**${utility.name}**`,
234
+ '',
235
+ '```typescript',
236
+ `import { ... } from '${utility.importPath}';`,
237
+ '```',
238
+ '',
239
+ `**Category**: ${utility.categoryTitle}`,
240
+ `**Docs**: ${utility.url}`,
241
+ ].join('\n');
242
+ return {
243
+ content: [{ type: 'text', text }],
244
+ };
245
+ });
246
+ }
247
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "ngx-oneforall-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for ngx-oneforall Angular utility library — gives AI tools native knowledge of all utilities",
5
+ "type": "module",
6
+ "bin": {
7
+ "ngx-oneforall-mcp": "./bin/cli.mjs"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "files": [
11
+ "dist",
12
+ "bin",
13
+ "data"
14
+ ],
15
+ "scripts": {
16
+ "prebuild": "node scripts/bundle-docs.mjs",
17
+ "build": "tsc",
18
+ "start": "node bin/cli.mjs"
19
+ },
20
+ "keywords": [
21
+ "mcp",
22
+ "model-context-protocol",
23
+ "angular",
24
+ "ngx-oneforall",
25
+ "ai",
26
+ "llm"
27
+ ],
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/love1024/ngx-oneforall",
32
+ "directory": "projects/ngx-oneforall-mcp"
33
+ },
34
+ "homepage": "https://love1024.github.io/ngx-oneforall",
35
+ "dependencies": {
36
+ "@modelcontextprotocol/sdk": "^1.12.1",
37
+ "zod": "^3.25.67"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "~5.9.3"
41
+ }
42
+ }