@stacksfinder/mcp-server 1.2.1 → 1.3.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 (72) hide show
  1. package/LICENSE +16 -16
  2. package/README.md +126 -65
  3. package/dist/__tests__/mcp-tools.test.d.ts +8 -0
  4. package/dist/__tests__/mcp-tools.test.d.ts.map +1 -0
  5. package/dist/__tests__/mcp-tools.test.js +345 -0
  6. package/dist/__tests__/mcp-tools.test.js.map +1 -0
  7. package/dist/annotations.d.ts +63 -0
  8. package/dist/annotations.d.ts.map +1 -0
  9. package/dist/annotations.js +215 -0
  10. package/dist/annotations.js.map +1 -0
  11. package/dist/server.d.ts.map +1 -1
  12. package/dist/server.js +93 -22
  13. package/dist/server.js.map +1 -1
  14. package/dist/tools/audit.d.ts +4 -4
  15. package/dist/tools/audit.js +42 -42
  16. package/dist/tools/audit.js.map +1 -1
  17. package/dist/tools/check-compatibility.d.ts +1 -1
  18. package/dist/tools/check-compatibility.d.ts.map +1 -1
  19. package/dist/tools/check-compatibility.js +17 -17
  20. package/dist/tools/check-compatibility.js.map +1 -1
  21. package/dist/tools/estimator.d.ts +85 -0
  22. package/dist/tools/estimator.d.ts.map +1 -0
  23. package/dist/tools/estimator.js +326 -0
  24. package/dist/tools/estimator.js.map +1 -0
  25. package/dist/tools/project-kit/analyze-repo.js +12 -12
  26. package/dist/tools/project-kit/analyze-repo.js.map +1 -1
  27. package/package.json +4 -8
  28. package/dist/compatibility/index.d.ts +0 -11
  29. package/dist/compatibility/index.d.ts.map +0 -1
  30. package/dist/compatibility/index.js +0 -13
  31. package/dist/compatibility/index.js.map +0 -1
  32. package/dist/compatibility/rules.d.ts +0 -29
  33. package/dist/compatibility/rules.d.ts.map +0 -1
  34. package/dist/compatibility/rules.js +0 -419
  35. package/dist/compatibility/rules.js.map +0 -1
  36. package/dist/compatibility/scoring.d.ts +0 -54
  37. package/dist/compatibility/scoring.d.ts.map +0 -1
  38. package/dist/compatibility/scoring.js +0 -209
  39. package/dist/compatibility/scoring.js.map +0 -1
  40. package/dist/compatibility/types.d.ts +0 -176
  41. package/dist/compatibility/types.d.ts.map +0 -1
  42. package/dist/compatibility/types.js +0 -26
  43. package/dist/compatibility/types.js.map +0 -1
  44. package/dist/compatibility/utils.d.ts +0 -82
  45. package/dist/compatibility/utils.d.ts.map +0 -1
  46. package/dist/compatibility/utils.js +0 -269
  47. package/dist/compatibility/utils.js.map +0 -1
  48. package/dist/data/357/200/242/357/200/212cp H:bac_/303/240_guigui_v2stack_finderpackagesmcp-serversrcdatacompatibility_matrix.json H:bac_/303/240_guigui_v2stack_finderpackagesmcp-serverdistdata/357/200/242" +0 -226
  49. package/dist/http.d.ts +0 -7
  50. package/dist/http.d.ts.map +0 -1
  51. package/dist/http.js +0 -69
  52. package/dist/http.js.map +0 -1
  53. package/dist/lib/mcp-compatibility/index.d.ts +0 -33
  54. package/dist/lib/mcp-compatibility/index.d.ts.map +0 -1
  55. package/dist/lib/mcp-compatibility/index.js +0 -35
  56. package/dist/lib/mcp-compatibility/index.js.map +0 -1
  57. package/dist/lib/mcp-compatibility/rules.d.ts +0 -29
  58. package/dist/lib/mcp-compatibility/rules.d.ts.map +0 -1
  59. package/dist/lib/mcp-compatibility/rules.js +0 -419
  60. package/dist/lib/mcp-compatibility/rules.js.map +0 -1
  61. package/dist/lib/mcp-compatibility/scoring.d.ts +0 -54
  62. package/dist/lib/mcp-compatibility/scoring.d.ts.map +0 -1
  63. package/dist/lib/mcp-compatibility/scoring.js +0 -209
  64. package/dist/lib/mcp-compatibility/scoring.js.map +0 -1
  65. package/dist/lib/mcp-compatibility/types.d.ts +0 -176
  66. package/dist/lib/mcp-compatibility/types.d.ts.map +0 -1
  67. package/dist/lib/mcp-compatibility/types.js +0 -26
  68. package/dist/lib/mcp-compatibility/types.js.map +0 -1
  69. package/dist/lib/mcp-compatibility/utils.d.ts +0 -82
  70. package/dist/lib/mcp-compatibility/utils.d.ts.map +0 -1
  71. package/dist/lib/mcp-compatibility/utils.js +0 -269
  72. package/dist/lib/mcp-compatibility/utils.js.map +0 -1
@@ -0,0 +1,345 @@
1
+ /**
2
+ * MCP Server Integration Tests
3
+ *
4
+ * Tests all 21 MCP tools to ensure they are functional.
5
+ * Run with: npm test or vitest
6
+ */
7
+ import { describe, test, expect, beforeAll } from 'vitest';
8
+ import { createServer } from '../server.js';
9
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
10
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
11
+ import { ListToolsResultSchema } from '@modelcontextprotocol/sdk/types.js';
12
+ // ============================================================================
13
+ // TEST SETUP
14
+ // ============================================================================
15
+ // Helper to extract text from tool result
16
+ function getResultText(result) {
17
+ const content = result.content;
18
+ const textContent = content.find((c) => c.type === 'text');
19
+ return textContent?.text || '';
20
+ }
21
+ let client;
22
+ let server;
23
+ beforeAll(async () => {
24
+ server = createServer();
25
+ client = new Client({ name: 'test-client', version: '1.0.0' });
26
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
27
+ await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]);
28
+ });
29
+ // ============================================================================
30
+ // TOOL DISCOVERY TESTS
31
+ // ============================================================================
32
+ describe('MCP Server Tool Discovery', () => {
33
+ test('should list all 21 registered tools', async () => {
34
+ const result = await client.request({ method: 'tools/list' }, ListToolsResultSchema);
35
+ expect(result.tools).toBeDefined();
36
+ expect(result.tools.length).toBe(21);
37
+ const toolNames = result.tools.map((t) => t.name);
38
+ expect(toolNames).toContain('list_technologies');
39
+ expect(toolNames).toContain('analyze_tech');
40
+ expect(toolNames).toContain('compare_techs');
41
+ expect(toolNames).toContain('recommend_stack_demo');
42
+ expect(toolNames).toContain('recommend_stack');
43
+ expect(toolNames).toContain('get_blueprint');
44
+ expect(toolNames).toContain('create_blueprint');
45
+ expect(toolNames).toContain('setup_api_key');
46
+ expect(toolNames).toContain('list_api_keys');
47
+ expect(toolNames).toContain('revoke_api_key');
48
+ expect(toolNames).toContain('create_audit');
49
+ expect(toolNames).toContain('get_audit');
50
+ expect(toolNames).toContain('list_audits');
51
+ expect(toolNames).toContain('compare_audits');
52
+ expect(toolNames).toContain('get_audit_quota');
53
+ expect(toolNames).toContain('get_migration_recommendation');
54
+ expect(toolNames).toContain('generate_mcp_kit');
55
+ expect(toolNames).toContain('analyze_repo_mcps');
56
+ expect(toolNames).toContain('prepare_mcp_installation');
57
+ expect(toolNames).toContain('execute_mcp_installation');
58
+ expect(toolNames).toContain('check_mcp_compatibility');
59
+ });
60
+ test('all tools should have annotations', async () => {
61
+ const result = await client.request({ method: 'tools/list' }, ListToolsResultSchema);
62
+ for (const tool of result.tools) {
63
+ expect(tool.annotations).toBeDefined();
64
+ expect(tool.annotations?.readOnlyHint).toBeDefined();
65
+ expect(tool.annotations?.openWorldHint).toBeDefined();
66
+ }
67
+ });
68
+ test('local tools should have openWorldHint=false', async () => {
69
+ const result = await client.request({ method: 'tools/list' }, ListToolsResultSchema);
70
+ const localTools = [
71
+ 'list_technologies',
72
+ 'analyze_tech',
73
+ 'compare_techs',
74
+ 'recommend_stack_demo',
75
+ 'generate_mcp_kit',
76
+ 'check_mcp_compatibility',
77
+ 'analyze_repo_mcps',
78
+ 'execute_mcp_installation'
79
+ ];
80
+ for (const toolName of localTools) {
81
+ const tool = result.tools.find((t) => t.name === toolName);
82
+ expect(tool).toBeDefined();
83
+ expect(tool?.annotations?.openWorldHint).toBe(false);
84
+ }
85
+ });
86
+ test('API tools should have openWorldHint=true', async () => {
87
+ const result = await client.request({ method: 'tools/list' }, ListToolsResultSchema);
88
+ const apiTools = [
89
+ 'recommend_stack',
90
+ 'get_blueprint',
91
+ 'create_blueprint',
92
+ 'setup_api_key',
93
+ 'list_api_keys',
94
+ 'revoke_api_key',
95
+ 'create_audit',
96
+ 'get_audit',
97
+ 'list_audits',
98
+ 'compare_audits',
99
+ 'get_audit_quota',
100
+ 'get_migration_recommendation'
101
+ ];
102
+ for (const toolName of apiTools) {
103
+ const tool = result.tools.find((t) => t.name === toolName);
104
+ expect(tool).toBeDefined();
105
+ expect(tool?.annotations?.openWorldHint).toBe(true);
106
+ }
107
+ });
108
+ });
109
+ // ============================================================================
110
+ // LOCAL TOOL TESTS (no API key required)
111
+ // ============================================================================
112
+ describe('Local Tools (No API Key)', () => {
113
+ test('list_technologies should return technologies', async () => {
114
+ const result = (await client.callTool({
115
+ name: 'list_technologies',
116
+ arguments: {}
117
+ }));
118
+ expect(result.content).toBeDefined();
119
+ const text = getResultText(result);
120
+ expect(text).toContain('Technologies');
121
+ expect(text).toContain('frontend');
122
+ });
123
+ test('list_technologies should filter by category', async () => {
124
+ const result = (await client.callTool({
125
+ name: 'list_technologies',
126
+ arguments: { category: 'database' }
127
+ }));
128
+ const text = getResultText(result);
129
+ expect(text).toContain('database');
130
+ });
131
+ test('analyze_tech should analyze nextjs', async () => {
132
+ const result = (await client.callTool({
133
+ name: 'analyze_tech',
134
+ arguments: { technology: 'nextjs' }
135
+ }));
136
+ const text = getResultText(result);
137
+ expect(text).toContain('Next.js');
138
+ expect(text).toContain('Score');
139
+ });
140
+ test('analyze_tech should return error for unknown tech', async () => {
141
+ const result = (await client.callTool({
142
+ name: 'analyze_tech',
143
+ arguments: { technology: 'unknown-tech-xyz' }
144
+ }));
145
+ expect(result.isError).toBe(true);
146
+ const text = getResultText(result);
147
+ expect(text).toContain('not found');
148
+ });
149
+ test('compare_techs should compare frameworks', async () => {
150
+ const result = (await client.callTool({
151
+ name: 'compare_techs',
152
+ arguments: { technologies: ['nextjs', 'sveltekit'] }
153
+ }));
154
+ const text = getResultText(result);
155
+ expect(text).toContain('Comparison');
156
+ expect(text).toContain('Next.js');
157
+ expect(text).toContain('SvelteKit');
158
+ });
159
+ test('compare_techs should handle different contexts', async () => {
160
+ const result = (await client.callTool({
161
+ name: 'compare_techs',
162
+ arguments: { technologies: ['postgresql', 'mysql'], context: 'enterprise' }
163
+ }));
164
+ const text = getResultText(result);
165
+ expect(text).toContain('enterprise');
166
+ });
167
+ test('recommend_stack_demo should return recommendations', async () => {
168
+ const result = (await client.callTool({
169
+ name: 'recommend_stack_demo',
170
+ arguments: { projectType: 'saas' }
171
+ }));
172
+ // May return rate limit error, that's fine
173
+ const text = getResultText(result);
174
+ expect(text.length).toBeGreaterThan(0);
175
+ });
176
+ test('generate_mcp_kit should generate recommendations', async () => {
177
+ const result = (await client.callTool({
178
+ name: 'generate_mcp_kit',
179
+ arguments: {
180
+ projectDescription: 'A SaaS application for managing customer subscriptions with Stripe payments, PostgreSQL database, and Next.js frontend'
181
+ }
182
+ }));
183
+ const text = getResultText(result);
184
+ const parsed = JSON.parse(text);
185
+ expect(parsed).toHaveProperty('detectedTechnologies');
186
+ expect(parsed).toHaveProperty('recommendedMcps');
187
+ });
188
+ test('check_mcp_compatibility should detect conflicts', async () => {
189
+ const result = (await client.callTool({
190
+ name: 'check_mcp_compatibility',
191
+ arguments: { mcps: ['supabase-mcp', 'neon-mcp'] }
192
+ }));
193
+ const text = getResultText(result);
194
+ expect(text.toLowerCase()).toContain('conflict');
195
+ });
196
+ test('check_mcp_compatibility should detect synergies', async () => {
197
+ const result = (await client.callTool({
198
+ name: 'check_mcp_compatibility',
199
+ arguments: { mcps: ['stripe-mcp', 'resend-mcp'] }
200
+ }));
201
+ const text = getResultText(result);
202
+ expect(text.toLowerCase()).toContain('synerg');
203
+ });
204
+ });
205
+ // ============================================================================
206
+ // API TOOL TESTS (require API key - test error handling)
207
+ // ============================================================================
208
+ describe('API Tools (Error Handling Without API Key)', () => {
209
+ test('recommend_stack should require API key', async () => {
210
+ const result = (await client.callTool({
211
+ name: 'recommend_stack',
212
+ arguments: { projectType: 'saas' }
213
+ }));
214
+ // Should fail without API key
215
+ expect(result.isError).toBe(true);
216
+ const text = getResultText(result);
217
+ expect(text.toLowerCase()).toMatch(/api.?key|auth|unauthorized/i);
218
+ });
219
+ test('get_blueprint should handle invalid UUID', async () => {
220
+ // This tests input validation
221
+ try {
222
+ await client.callTool({
223
+ name: 'get_blueprint',
224
+ arguments: { blueprintId: 'not-a-uuid' }
225
+ });
226
+ }
227
+ catch (error) {
228
+ // Expected to fail validation
229
+ expect(error).toBeDefined();
230
+ }
231
+ });
232
+ test('list_api_keys should require API key', async () => {
233
+ const result = (await client.callTool({
234
+ name: 'list_api_keys',
235
+ arguments: {}
236
+ }));
237
+ expect(result.isError).toBe(true);
238
+ });
239
+ test('get_audit_quota should require API key', async () => {
240
+ const result = (await client.callTool({
241
+ name: 'get_audit_quota',
242
+ arguments: {}
243
+ }));
244
+ expect(result.isError).toBe(true);
245
+ });
246
+ test('create_audit should require API key', async () => {
247
+ const result = (await client.callTool({
248
+ name: 'create_audit',
249
+ arguments: {
250
+ name: 'Test Audit',
251
+ technologies: [{ name: 'React', version: '18.0.0' }]
252
+ }
253
+ }));
254
+ expect(result.isError).toBe(true);
255
+ });
256
+ });
257
+ // ============================================================================
258
+ // INPUT VALIDATION TESTS
259
+ // ============================================================================
260
+ describe('Input Validation', () => {
261
+ test('analyze_tech should require technology parameter', async () => {
262
+ try {
263
+ await client.callTool({
264
+ name: 'analyze_tech',
265
+ arguments: {}
266
+ });
267
+ expect(true).toBe(false); // Should not reach here
268
+ }
269
+ catch (error) {
270
+ expect(error).toBeDefined();
271
+ }
272
+ });
273
+ test('compare_techs should require at least 2 technologies', async () => {
274
+ try {
275
+ await client.callTool({
276
+ name: 'compare_techs',
277
+ arguments: { technologies: ['nextjs'] }
278
+ });
279
+ expect(true).toBe(false);
280
+ }
281
+ catch (error) {
282
+ expect(error).toBeDefined();
283
+ }
284
+ });
285
+ test('compare_techs should reject more than 4 technologies', async () => {
286
+ try {
287
+ await client.callTool({
288
+ name: 'compare_techs',
289
+ arguments: { technologies: ['nextjs', 'sveltekit', 'remix', 'nuxt', 'astro'] }
290
+ });
291
+ expect(true).toBe(false);
292
+ }
293
+ catch (error) {
294
+ expect(error).toBeDefined();
295
+ }
296
+ });
297
+ test('generate_mcp_kit should require minimum description length', async () => {
298
+ try {
299
+ await client.callTool({
300
+ name: 'generate_mcp_kit',
301
+ arguments: { projectDescription: 'Too short' }
302
+ });
303
+ expect(true).toBe(false);
304
+ }
305
+ catch (error) {
306
+ expect(error).toBeDefined();
307
+ }
308
+ });
309
+ test('check_mcp_compatibility should require at least 1 MCP', async () => {
310
+ try {
311
+ await client.callTool({
312
+ name: 'check_mcp_compatibility',
313
+ arguments: { mcps: [] }
314
+ });
315
+ expect(true).toBe(false);
316
+ }
317
+ catch (error) {
318
+ expect(error).toBeDefined();
319
+ }
320
+ });
321
+ });
322
+ // ============================================================================
323
+ // PROJECT-KIT TOOL TESTS
324
+ // ============================================================================
325
+ describe('Project-Kit Tools', () => {
326
+ test('analyze_repo_mcps should work without workspace', async () => {
327
+ const result = (await client.callTool({
328
+ name: 'analyze_repo_mcps',
329
+ arguments: { workspaceRoot: '/nonexistent/path' }
330
+ }));
331
+ // Should return empty analysis, not error
332
+ const text = getResultText(result);
333
+ expect(text).toContain('Repository Analysis');
334
+ });
335
+ test('execute_mcp_installation should handle missing .env-mcp', async () => {
336
+ const result = (await client.callTool({
337
+ name: 'execute_mcp_installation',
338
+ arguments: { envMcpPath: '/nonexistent/.env-mcp' }
339
+ }));
340
+ const text = getResultText(result);
341
+ // Should handle gracefully
342
+ expect(text.length).toBeGreaterThan(0);
343
+ });
344
+ });
345
+ //# sourceMappingURL=mcp-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * MCP Tool Annotations
3
+ *
4
+ * These annotations help MCP clients (VS Code, Cursor, etc.) understand
5
+ * the behavior of each tool and make informed decisions about enabling them.
6
+ *
7
+ * @see https://modelcontextprotocol.io/specification/2025-06-18/server/tools
8
+ */
9
+ import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';
10
+ /**
11
+ * Tool behavior hints:
12
+ * - readOnlyHint: true = tool doesn't modify anything (safe)
13
+ * - destructiveHint: true = tool can delete/destroy data
14
+ * - idempotentHint: true = calling multiple times = same result
15
+ * - openWorldHint: true = interacts with external APIs/services
16
+ */
17
+ /** List technologies - local lookup, read-only */
18
+ export declare const listTechnologiesAnnotations: ToolAnnotations;
19
+ /** Analyze technology - local scoring, read-only */
20
+ export declare const analyzeTechAnnotations: ToolAnnotations;
21
+ /** Compare technologies - local scoring, read-only */
22
+ export declare const compareTechsAnnotations: ToolAnnotations;
23
+ /** Recommend stack demo - local scoring with rate limit, read-only */
24
+ export declare const recommendStackDemoAnnotations: ToolAnnotations;
25
+ /** Generate MCP kit - local analysis, read-only */
26
+ export declare const generateMcpKitAnnotations: ToolAnnotations;
27
+ /** Check MCP compatibility - local rule checking, read-only */
28
+ export declare const checkCompatibilityAnnotations: ToolAnnotations;
29
+ /** Analyze repo MCPs - reads local files, no modifications */
30
+ export declare const analyzeRepoMcpsAnnotations: ToolAnnotations;
31
+ /** Prepare MCP installation - creates .env-mcp file */
32
+ export declare const prepareMcpInstallationAnnotations: ToolAnnotations;
33
+ /** Execute MCP installation - generates commands only, no execution */
34
+ export declare const executeMcpInstallationAnnotations: ToolAnnotations;
35
+ /** Recommend stack - calls StacksFinder API */
36
+ export declare const recommendStackAnnotations: ToolAnnotations;
37
+ /** Get blueprint - fetches from API */
38
+ export declare const getBlueprintAnnotations: ToolAnnotations;
39
+ /** Create blueprint - creates resource via API */
40
+ export declare const createBlueprintAnnotations: ToolAnnotations;
41
+ /** Setup API key - authenticates and creates key */
42
+ export declare const setupApiKeyAnnotations: ToolAnnotations;
43
+ /** List API keys - fetches from API */
44
+ export declare const listApiKeysAnnotations: ToolAnnotations;
45
+ /** Revoke API key - deletes resource */
46
+ export declare const revokeApiKeyAnnotations: ToolAnnotations;
47
+ /** Create audit - creates resource */
48
+ export declare const createAuditAnnotations: ToolAnnotations;
49
+ /** Get audit - fetches from API */
50
+ export declare const getAuditAnnotations: ToolAnnotations;
51
+ /** List audits - fetches from API */
52
+ export declare const listAuditsAnnotations: ToolAnnotations;
53
+ /** Compare audits - fetches and compares */
54
+ export declare const compareAuditsAnnotations: ToolAnnotations;
55
+ /** Get audit quota - fetches from API */
56
+ export declare const getAuditQuotaAnnotations: ToolAnnotations;
57
+ /** Get migration recommendation - analyzes audit */
58
+ export declare const getMigrationRecommendationAnnotations: ToolAnnotations;
59
+ /** Estimate project - creates estimate via LLM + optional market analysis */
60
+ export declare const estimateProjectAnnotations: ToolAnnotations;
61
+ /** Get estimate quota - fetches quota status */
62
+ export declare const getEstimateQuotaAnnotations: ToolAnnotations;
63
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E;;;;;;GAMG;AAMH,kDAAkD;AAClD,eAAO,MAAM,2BAA2B,EAAE,eAMzC,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,EAAE,eAMpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,6BAA6B,EAAE,eAM3C,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,yBAAyB,EAAE,eAMvC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,6BAA6B,EAAE,eAM3C,CAAC;AAMF,8DAA8D;AAC9D,eAAO,MAAM,0BAA0B,EAAE,eAMxC,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,iCAAiC,EAAE,eAM/C,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,iCAAiC,EAAE,eAM/C,CAAC;AAMF,+CAA+C;AAC/C,eAAO,MAAM,yBAAyB,EAAE,eAMvC,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,0BAA0B,EAAE,eAMxC,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,EAAE,eAMpC,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,sBAAsB,EAAE,eAMpC,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,uBAAuB,EAAE,eAMrC,CAAC;AAMF,sCAAsC;AACtC,eAAO,MAAM,sBAAsB,EAAE,eAMpC,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,mBAAmB,EAAE,eAMjC,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,qBAAqB,EAAE,eAMnC,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,wBAAwB,EAAE,eAMtC,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,wBAAwB,EAAE,eAMtC,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,qCAAqC,EAAE,eAMnD,CAAC;AAMF,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,EAAE,eAMxC,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,2BAA2B,EAAE,eAMzC,CAAC"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * MCP Tool Annotations
3
+ *
4
+ * These annotations help MCP clients (VS Code, Cursor, etc.) understand
5
+ * the behavior of each tool and make informed decisions about enabling them.
6
+ *
7
+ * @see https://modelcontextprotocol.io/specification/2025-06-18/server/tools
8
+ */
9
+ /**
10
+ * Tool behavior hints:
11
+ * - readOnlyHint: true = tool doesn't modify anything (safe)
12
+ * - destructiveHint: true = tool can delete/destroy data
13
+ * - idempotentHint: true = calling multiple times = same result
14
+ * - openWorldHint: true = interacts with external APIs/services
15
+ */
16
+ // ============================================================================
17
+ // LOCAL TOOLS (no API calls, fully offline)
18
+ // ============================================================================
19
+ /** List technologies - local lookup, read-only */
20
+ export const listTechnologiesAnnotations = {
21
+ title: 'List Technologies',
22
+ readOnlyHint: true,
23
+ destructiveHint: false,
24
+ idempotentHint: true,
25
+ openWorldHint: false
26
+ };
27
+ /** Analyze technology - local scoring, read-only */
28
+ export const analyzeTechAnnotations = {
29
+ title: 'Analyze Technology',
30
+ readOnlyHint: true,
31
+ destructiveHint: false,
32
+ idempotentHint: true,
33
+ openWorldHint: false
34
+ };
35
+ /** Compare technologies - local scoring, read-only */
36
+ export const compareTechsAnnotations = {
37
+ title: 'Compare Technologies',
38
+ readOnlyHint: true,
39
+ destructiveHint: false,
40
+ idempotentHint: true,
41
+ openWorldHint: false
42
+ };
43
+ /** Recommend stack demo - local scoring with rate limit, read-only */
44
+ export const recommendStackDemoAnnotations = {
45
+ title: 'Recommend Stack (Demo)',
46
+ readOnlyHint: true,
47
+ destructiveHint: false,
48
+ idempotentHint: true,
49
+ openWorldHint: false
50
+ };
51
+ /** Generate MCP kit - local analysis, read-only */
52
+ export const generateMcpKitAnnotations = {
53
+ title: 'Generate MCP Kit',
54
+ readOnlyHint: true,
55
+ destructiveHint: false,
56
+ idempotentHint: true,
57
+ openWorldHint: false
58
+ };
59
+ /** Check MCP compatibility - local rule checking, read-only */
60
+ export const checkCompatibilityAnnotations = {
61
+ title: 'Check MCP Compatibility',
62
+ readOnlyHint: true,
63
+ destructiveHint: false,
64
+ idempotentHint: true,
65
+ openWorldHint: false
66
+ };
67
+ // ============================================================================
68
+ // LOCAL TOOLS WITH FILE SYSTEM ACCESS
69
+ // ============================================================================
70
+ /** Analyze repo MCPs - reads local files, no modifications */
71
+ export const analyzeRepoMcpsAnnotations = {
72
+ title: 'Analyze Repository MCPs',
73
+ readOnlyHint: true,
74
+ destructiveHint: false,
75
+ idempotentHint: true,
76
+ openWorldHint: false
77
+ };
78
+ /** Prepare MCP installation - creates .env-mcp file */
79
+ export const prepareMcpInstallationAnnotations = {
80
+ title: 'Prepare MCP Installation',
81
+ readOnlyHint: false, // Creates files
82
+ destructiveHint: false, // Doesn't delete anything
83
+ idempotentHint: true, // Same input = same file
84
+ openWorldHint: false
85
+ };
86
+ /** Execute MCP installation - generates commands only, no execution */
87
+ export const executeMcpInstallationAnnotations = {
88
+ title: 'Execute MCP Installation',
89
+ readOnlyHint: true, // Only generates commands, doesn't execute
90
+ destructiveHint: false,
91
+ idempotentHint: true,
92
+ openWorldHint: false
93
+ };
94
+ // ============================================================================
95
+ // API-BASED TOOLS (require network access)
96
+ // ============================================================================
97
+ /** Recommend stack - calls StacksFinder API */
98
+ export const recommendStackAnnotations = {
99
+ title: 'Recommend Stack',
100
+ readOnlyHint: true, // API is read-only
101
+ destructiveHint: false,
102
+ idempotentHint: true, // Same request = same response
103
+ openWorldHint: true // External API call
104
+ };
105
+ /** Get blueprint - fetches from API */
106
+ export const getBlueprintAnnotations = {
107
+ title: 'Get Blueprint',
108
+ readOnlyHint: true,
109
+ destructiveHint: false,
110
+ idempotentHint: true,
111
+ openWorldHint: true
112
+ };
113
+ /** Create blueprint - creates resource via API */
114
+ export const createBlueprintAnnotations = {
115
+ title: 'Create Blueprint',
116
+ readOnlyHint: false, // Creates a resource
117
+ destructiveHint: false,
118
+ idempotentHint: false, // Creates new resource each time
119
+ openWorldHint: true
120
+ };
121
+ /** Setup API key - authenticates and creates key */
122
+ export const setupApiKeyAnnotations = {
123
+ title: 'Setup API Key',
124
+ readOnlyHint: false, // Creates API key
125
+ destructiveHint: false,
126
+ idempotentHint: false, // Creates new key each time
127
+ openWorldHint: true
128
+ };
129
+ /** List API keys - fetches from API */
130
+ export const listApiKeysAnnotations = {
131
+ title: 'List API Keys',
132
+ readOnlyHint: true,
133
+ destructiveHint: false,
134
+ idempotentHint: true,
135
+ openWorldHint: true
136
+ };
137
+ /** Revoke API key - deletes resource */
138
+ export const revokeApiKeyAnnotations = {
139
+ title: 'Revoke API Key',
140
+ readOnlyHint: false,
141
+ destructiveHint: true, // Permanently revokes key
142
+ idempotentHint: true, // Revoking twice = same result
143
+ openWorldHint: true
144
+ };
145
+ // ============================================================================
146
+ // AUDIT TOOLS (API-based)
147
+ // ============================================================================
148
+ /** Create audit - creates resource */
149
+ export const createAuditAnnotations = {
150
+ title: 'Create Technical Debt Audit',
151
+ readOnlyHint: false,
152
+ destructiveHint: false,
153
+ idempotentHint: false, // Creates new audit each time
154
+ openWorldHint: true
155
+ };
156
+ /** Get audit - fetches from API */
157
+ export const getAuditAnnotations = {
158
+ title: 'Get Audit Report',
159
+ readOnlyHint: true,
160
+ destructiveHint: false,
161
+ idempotentHint: true,
162
+ openWorldHint: true
163
+ };
164
+ /** List audits - fetches from API */
165
+ export const listAuditsAnnotations = {
166
+ title: 'List Audit Reports',
167
+ readOnlyHint: true,
168
+ destructiveHint: false,
169
+ idempotentHint: true,
170
+ openWorldHint: true
171
+ };
172
+ /** Compare audits - fetches and compares */
173
+ export const compareAuditsAnnotations = {
174
+ title: 'Compare Audit Reports',
175
+ readOnlyHint: true,
176
+ destructiveHint: false,
177
+ idempotentHint: true,
178
+ openWorldHint: true
179
+ };
180
+ /** Get audit quota - fetches from API */
181
+ export const getAuditQuotaAnnotations = {
182
+ title: 'Get Audit Quota',
183
+ readOnlyHint: true,
184
+ destructiveHint: false,
185
+ idempotentHint: true,
186
+ openWorldHint: true
187
+ };
188
+ /** Get migration recommendation - analyzes audit */
189
+ export const getMigrationRecommendationAnnotations = {
190
+ title: 'Get Migration Recommendation',
191
+ readOnlyHint: true,
192
+ destructiveHint: false,
193
+ idempotentHint: true,
194
+ openWorldHint: true
195
+ };
196
+ // ============================================================================
197
+ // ESTIMATOR TOOLS (API-based, LLM + Perplexity)
198
+ // ============================================================================
199
+ /** Estimate project - creates estimate via LLM + optional market analysis */
200
+ export const estimateProjectAnnotations = {
201
+ title: 'Estimate Project',
202
+ readOnlyHint: false, // Creates estimate, consumes quota
203
+ destructiveHint: false,
204
+ idempotentHint: false, // LLM responses can vary
205
+ openWorldHint: true // Calls Claude + optional Perplexity
206
+ };
207
+ /** Get estimate quota - fetches quota status */
208
+ export const getEstimateQuotaAnnotations = {
209
+ title: 'Get Estimate Quota',
210
+ readOnlyHint: true,
211
+ destructiveHint: false,
212
+ idempotentHint: true,
213
+ openWorldHint: true
214
+ };
215
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiFpE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAsjBxC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiHpE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAsoBxC"}