@skillsmith/mcp-server 0.1.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/.tsbuildinfo +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts +6 -0
- package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
- package/dist/src/__tests__/get-skill.test.js +88 -0
- package/dist/src/__tests__/get-skill.test.js.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
- package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/license.test.js +500 -0
- package/dist/src/__tests__/middleware/license.test.js.map +1 -0
- package/dist/src/__tests__/search.test.d.ts +6 -0
- package/dist/src/__tests__/search.test.d.ts.map +1 -0
- package/dist/src/__tests__/search.test.js +86 -0
- package/dist/src/__tests__/search.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +19 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +87 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/context/index.d.ts +19 -0
- package/dist/src/context/index.d.ts.map +1 -0
- package/dist/src/context/index.js +25 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/project-detector.d.ts +145 -0
- package/dist/src/context/project-detector.d.ts.map +1 -0
- package/dist/src/context/project-detector.js +321 -0
- package/dist/src/context/project-detector.js.map +1 -0
- package/dist/src/context.d.ts +100 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +157 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/core-shim.d.ts +7 -0
- package/dist/src/core-shim.d.ts.map +1 -0
- package/dist/src/core-shim.js +9 -0
- package/dist/src/core-shim.js.map +1 -0
- package/dist/src/health/healthCheck.d.ts +88 -0
- package/dist/src/health/healthCheck.d.ts.map +1 -0
- package/dist/src/health/healthCheck.js +117 -0
- package/dist/src/health/healthCheck.js.map +1 -0
- package/dist/src/health/index.d.ts +21 -0
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +21 -0
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/health/readinessCheck.d.ts +139 -0
- package/dist/src/health/readinessCheck.d.ts.map +1 -0
- package/dist/src/health/readinessCheck.js +266 -0
- package/dist/src/health/readinessCheck.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +178 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +2 -0
- package/dist/src/index.test.d.ts.map +1 -0
- package/dist/src/index.test.js +43 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +179 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.js +389 -0
- package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
- package/dist/src/middleware/csp.d.ts +87 -0
- package/dist/src/middleware/csp.d.ts.map +1 -0
- package/dist/src/middleware/csp.js +273 -0
- package/dist/src/middleware/csp.js.map +1 -0
- package/dist/src/middleware/degradation.d.ts +99 -0
- package/dist/src/middleware/degradation.d.ts.map +1 -0
- package/dist/src/middleware/degradation.js +315 -0
- package/dist/src/middleware/degradation.js.map +1 -0
- package/dist/src/middleware/errorFormatter.d.ts +119 -0
- package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.js +294 -0
- package/dist/src/middleware/errorFormatter.js.map +1 -0
- package/dist/src/middleware/index.d.ts +10 -0
- package/dist/src/middleware/index.d.ts.map +1 -0
- package/dist/src/middleware/index.js +14 -0
- package/dist/src/middleware/index.js.map +1 -0
- package/dist/src/middleware/license.d.ts +161 -0
- package/dist/src/middleware/license.d.ts.map +1 -0
- package/dist/src/middleware/license.js +281 -0
- package/dist/src/middleware/license.js.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.js +90 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
- package/dist/src/onboarding/first-run.d.ts +64 -0
- package/dist/src/onboarding/first-run.d.ts.map +1 -0
- package/dist/src/onboarding/first-run.js +77 -0
- package/dist/src/onboarding/first-run.js.map +1 -0
- package/dist/src/onboarding/index.d.ts +7 -0
- package/dist/src/onboarding/index.d.ts.map +1 -0
- package/dist/src/onboarding/index.js +7 -0
- package/dist/src/onboarding/index.js.map +1 -0
- package/dist/src/suggestions/index.d.ts +21 -0
- package/dist/src/suggestions/index.d.ts.map +1 -0
- package/dist/src/suggestions/index.js +20 -0
- package/dist/src/suggestions/index.js.map +1 -0
- package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
- package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
- package/dist/src/suggestions/suggestion-engine.js +352 -0
- package/dist/src/suggestions/suggestion-engine.js.map +1 -0
- package/dist/src/suggestions/types.d.ts +88 -0
- package/dist/src/suggestions/types.d.ts.map +1 -0
- package/dist/src/suggestions/types.js +21 -0
- package/dist/src/suggestions/types.js.map +1 -0
- package/dist/src/tools/analyze.d.ts +151 -0
- package/dist/src/tools/analyze.d.ts.map +1 -0
- package/dist/src/tools/analyze.js +205 -0
- package/dist/src/tools/analyze.js.map +1 -0
- package/dist/src/tools/compare.d.ts +149 -0
- package/dist/src/tools/compare.d.ts.map +1 -0
- package/dist/src/tools/compare.js +464 -0
- package/dist/src/tools/compare.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts +116 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -0
- package/dist/src/tools/get-skill.js +224 -0
- package/dist/src/tools/get-skill.js.map +1 -0
- package/dist/src/tools/index.d.ts +20 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +20 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/install.d.ts +122 -0
- package/dist/src/tools/install.d.ts.map +1 -0
- package/dist/src/tools/install.js +314 -0
- package/dist/src/tools/install.js.map +1 -0
- package/dist/src/tools/recommend.d.ts +171 -0
- package/dist/src/tools/recommend.d.ts.map +1 -0
- package/dist/src/tools/recommend.js +325 -0
- package/dist/src/tools/recommend.js.map +1 -0
- package/dist/src/tools/search.d.ts +121 -0
- package/dist/src/tools/search.d.ts.map +1 -0
- package/dist/src/tools/search.js +249 -0
- package/dist/src/tools/search.js.map +1 -0
- package/dist/src/tools/suggest.d.ts +181 -0
- package/dist/src/tools/suggest.d.ts.map +1 -0
- package/dist/src/tools/suggest.js +342 -0
- package/dist/src/tools/suggest.js.map +1 -0
- package/dist/src/tools/uninstall.d.ts +123 -0
- package/dist/src/tools/uninstall.d.ts.map +1 -0
- package/dist/src/tools/uninstall.js +250 -0
- package/dist/src/tools/uninstall.js.map +1 -0
- package/dist/src/tools/validate.d.ts +122 -0
- package/dist/src/tools/validate.d.ts.map +1 -0
- package/dist/src/tools/validate.js +497 -0
- package/dist/src/tools/validate.js.map +1 -0
- package/dist/src/utils/installed-skills.d.ts +101 -0
- package/dist/src/utils/installed-skills.d.ts.map +1 -0
- package/dist/src/utils/installed-skills.js +220 -0
- package/dist/src/utils/installed-skills.js.map +1 -0
- package/dist/src/utils/validation.d.ts +76 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +153 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +8 -0
- package/dist/src/webhooks/index.d.ts.map +1 -0
- package/dist/src/webhooks/index.js +9 -0
- package/dist/src/webhooks/index.js.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.js +339 -0
- package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
- package/dist/tests/compare.test.d.ts +6 -0
- package/dist/tests/compare.test.d.ts.map +1 -0
- package/dist/tests/compare.test.js +225 -0
- package/dist/tests/compare.test.js.map +1 -0
- package/dist/tests/context/project-detector.test.d.ts +6 -0
- package/dist/tests/context/project-detector.test.d.ts.map +1 -0
- package/dist/tests/context/project-detector.test.js +719 -0
- package/dist/tests/context/project-detector.test.js.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.js +286 -0
- package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
- package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.js +347 -0
- package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.js +347 -0
- package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.js +211 -0
- package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
- package/dist/tests/e2e/utils/index.d.ts +7 -0
- package/dist/tests/e2e/utils/index.d.ts.map +1 -0
- package/dist/tests/e2e/utils/index.js +7 -0
- package/dist/tests/e2e/utils/index.js.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.js +232 -0
- package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
- package/dist/tests/health.test.d.ts +9 -0
- package/dist/tests/health.test.d.ts.map +1 -0
- package/dist/tests/health.test.js +308 -0
- package/dist/tests/health.test.js.map +1 -0
- package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
- package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/analyze.integration.test.js +244 -0
- package/dist/tests/integration/analyze.integration.test.js.map +1 -0
- package/dist/tests/integration/compare.integration.test.d.ts +2 -0
- package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/compare.integration.test.js +120 -0
- package/dist/tests/integration/compare.integration.test.js.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.js +644 -0
- package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.js +203 -0
- package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
- package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
- package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/github-api.integration.test.js +190 -0
- package/dist/tests/integration/github-api.integration.test.js.map +1 -0
- package/dist/tests/integration/install.integration.test.d.ts +6 -0
- package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/install.integration.test.js +282 -0
- package/dist/tests/integration/install.integration.test.js.map +1 -0
- package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
- package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/recommend.integration.test.js +215 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -0
- package/dist/tests/integration/search.integration.test.d.ts +6 -0
- package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/search.integration.test.js +229 -0
- package/dist/tests/integration/search.integration.test.js.map +1 -0
- package/dist/tests/integration/setup.d.ts +71 -0
- package/dist/tests/integration/setup.d.ts.map +1 -0
- package/dist/tests/integration/setup.js +124 -0
- package/dist/tests/integration/setup.js.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.js +296 -0
- package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
- package/dist/tests/integration/validate.integration.test.d.ts +2 -0
- package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/validate.integration.test.js +181 -0
- package/dist/tests/integration/validate.integration.test.js.map +1 -0
- package/dist/tests/onboarding/first-run.test.d.ts +7 -0
- package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
- package/dist/tests/onboarding/first-run.test.js +258 -0
- package/dist/tests/onboarding/first-run.test.js.map +1 -0
- package/dist/tests/performance/search-performance.test.d.ts +10 -0
- package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
- package/dist/tests/performance/search-performance.test.js +218 -0
- package/dist/tests/performance/search-performance.test.js.map +1 -0
- package/dist/tests/recommend.test.d.ts +6 -0
- package/dist/tests/recommend.test.d.ts.map +1 -0
- package/dist/tests/recommend.test.js +208 -0
- package/dist/tests/recommend.test.js.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
- package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
- package/dist/tests/test-utils.d.ts +74 -0
- package/dist/tests/test-utils.d.ts.map +1 -0
- package/dist/tests/test-utils.js +98 -0
- package/dist/tests/test-utils.js.map +1 -0
- package/dist/tests/tools.test.d.ts +5 -0
- package/dist/tests/tools.test.d.ts.map +1 -0
- package/dist/tests/tools.test.js +138 -0
- package/dist/tests/tools.test.js.map +1 -0
- package/dist/tests/unit/installed-skills.test.d.ts +6 -0
- package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
- package/dist/tests/unit/installed-skills.test.js +285 -0
- package/dist/tests/unit/installed-skills.test.js.map +1 -0
- package/dist/tests/unit/logger.test.d.ts +6 -0
- package/dist/tests/unit/logger.test.d.ts.map +1 -0
- package/dist/tests/unit/logger.test.js +281 -0
- package/dist/tests/unit/logger.test.js.map +1 -0
- package/dist/tests/validate.test.d.ts +5 -0
- package/dist/tests/validate.test.d.ts.map +1 -0
- package/dist/tests/validate.test.js +303 -0
- package/dist/tests/validate.test.js.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
- package/dist/vitest.config.d.ts +6 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-740: Readiness Check with Dependency Checks
|
|
3
|
+
*
|
|
4
|
+
* Provides a comprehensive readiness check that verifies:
|
|
5
|
+
* - Database connectivity
|
|
6
|
+
* - Cache status
|
|
7
|
+
* - External service availability
|
|
8
|
+
*
|
|
9
|
+
* Returns 503 if any critical dependency fails.
|
|
10
|
+
*/
|
|
11
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
12
|
+
/**
|
|
13
|
+
* Dependency check result
|
|
14
|
+
*/
|
|
15
|
+
export interface DependencyCheck {
|
|
16
|
+
/** Dependency name */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Check status */
|
|
19
|
+
status: 'ok' | 'degraded' | 'unhealthy';
|
|
20
|
+
/** Response time in ms */
|
|
21
|
+
responseTime?: number;
|
|
22
|
+
/** Error message if unhealthy */
|
|
23
|
+
error?: string;
|
|
24
|
+
/** Additional details */
|
|
25
|
+
details?: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Readiness response
|
|
29
|
+
*/
|
|
30
|
+
export interface ReadinessResponse {
|
|
31
|
+
/** Overall readiness status */
|
|
32
|
+
ready: boolean;
|
|
33
|
+
/** HTTP status code to return */
|
|
34
|
+
statusCode: number;
|
|
35
|
+
/** Timestamp of the check */
|
|
36
|
+
timestamp: string;
|
|
37
|
+
/** Individual dependency check results */
|
|
38
|
+
checks: DependencyCheck[];
|
|
39
|
+
/** Total check duration in ms */
|
|
40
|
+
totalDuration: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Readiness check configuration
|
|
44
|
+
*/
|
|
45
|
+
export interface ReadinessCheckConfig {
|
|
46
|
+
/** Database instance for connectivity check */
|
|
47
|
+
database?: DatabaseType | null;
|
|
48
|
+
/** Cache check function */
|
|
49
|
+
cacheCheck?: () => Promise<boolean>;
|
|
50
|
+
/** Custom dependency checks */
|
|
51
|
+
customChecks?: Array<{
|
|
52
|
+
name: string;
|
|
53
|
+
check: () => Promise<{
|
|
54
|
+
ok: boolean;
|
|
55
|
+
details?: Record<string, unknown>;
|
|
56
|
+
}>;
|
|
57
|
+
critical?: boolean;
|
|
58
|
+
}>;
|
|
59
|
+
/** Timeout for each check in ms (default: 5000) */
|
|
60
|
+
checkTimeout?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Readiness Check Handler
|
|
64
|
+
*
|
|
65
|
+
* Performs deep health checks including database connectivity,
|
|
66
|
+
* cache status, and other dependencies.
|
|
67
|
+
*/
|
|
68
|
+
export declare class ReadinessCheck {
|
|
69
|
+
private database;
|
|
70
|
+
private cacheCheck;
|
|
71
|
+
private customChecks;
|
|
72
|
+
private checkTimeout;
|
|
73
|
+
constructor(config?: ReadinessCheckConfig);
|
|
74
|
+
/**
|
|
75
|
+
* Set the database instance
|
|
76
|
+
*/
|
|
77
|
+
setDatabase(db: DatabaseType | null): void;
|
|
78
|
+
/**
|
|
79
|
+
* Set the cache check function
|
|
80
|
+
*/
|
|
81
|
+
setCacheCheck(check: (() => Promise<boolean>) | null): void;
|
|
82
|
+
/**
|
|
83
|
+
* Add a custom dependency check
|
|
84
|
+
*/
|
|
85
|
+
addCheck(name: string, check: () => Promise<{
|
|
86
|
+
ok: boolean;
|
|
87
|
+
details?: Record<string, unknown>;
|
|
88
|
+
}>, critical?: boolean): void;
|
|
89
|
+
/**
|
|
90
|
+
* Perform full readiness check
|
|
91
|
+
*
|
|
92
|
+
* Checks all dependencies and returns overall readiness status.
|
|
93
|
+
*/
|
|
94
|
+
check(): Promise<ReadinessResponse>;
|
|
95
|
+
/**
|
|
96
|
+
* Check database connectivity
|
|
97
|
+
*/
|
|
98
|
+
private checkDatabase;
|
|
99
|
+
/**
|
|
100
|
+
* Check cache status
|
|
101
|
+
*/
|
|
102
|
+
private checkCache;
|
|
103
|
+
/**
|
|
104
|
+
* Run a custom check
|
|
105
|
+
*/
|
|
106
|
+
private runCustomCheck;
|
|
107
|
+
/**
|
|
108
|
+
* Execute a function with timeout
|
|
109
|
+
*/
|
|
110
|
+
private withTimeout;
|
|
111
|
+
/**
|
|
112
|
+
* Quick readiness check (boolean result)
|
|
113
|
+
*/
|
|
114
|
+
isReady(): Promise<boolean>;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the default readiness check instance
|
|
118
|
+
*/
|
|
119
|
+
export declare function getReadinessCheck(): ReadinessCheck;
|
|
120
|
+
/**
|
|
121
|
+
* Create a new readiness check instance with custom configuration
|
|
122
|
+
*/
|
|
123
|
+
export declare function createReadinessCheck(config: ReadinessCheckConfig): ReadinessCheck;
|
|
124
|
+
/**
|
|
125
|
+
* Perform a quick readiness check using the default instance
|
|
126
|
+
*/
|
|
127
|
+
export declare function checkReadiness(): Promise<ReadinessResponse>;
|
|
128
|
+
/**
|
|
129
|
+
* Configure the default readiness check
|
|
130
|
+
*/
|
|
131
|
+
export declare function configureReadinessCheck(config: Partial<ReadinessCheckConfig>): void;
|
|
132
|
+
/**
|
|
133
|
+
* Format readiness response for HTTP
|
|
134
|
+
*/
|
|
135
|
+
export declare function formatReadinessResponse(response: ReadinessResponse): {
|
|
136
|
+
statusCode: number;
|
|
137
|
+
body: ReadinessResponse;
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=readinessCheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readinessCheck.d.ts","sourceRoot":"","sources":["../../../src/health/readinessCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-740: Readiness Check with Dependency Checks
|
|
3
|
+
*
|
|
4
|
+
* Provides a comprehensive readiness check that verifies:
|
|
5
|
+
* - Database connectivity
|
|
6
|
+
* - Cache status
|
|
7
|
+
* - External service availability
|
|
8
|
+
*
|
|
9
|
+
* Returns 503 if any critical dependency fails.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Readiness Check Handler
|
|
13
|
+
*
|
|
14
|
+
* Performs deep health checks including database connectivity,
|
|
15
|
+
* cache status, and other dependencies.
|
|
16
|
+
*/
|
|
17
|
+
export class ReadinessCheck {
|
|
18
|
+
database;
|
|
19
|
+
cacheCheck;
|
|
20
|
+
customChecks;
|
|
21
|
+
checkTimeout;
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
this.database = config.database ?? null;
|
|
24
|
+
this.cacheCheck = config.cacheCheck ?? null;
|
|
25
|
+
this.customChecks = (config.customChecks ?? []).map((c) => ({
|
|
26
|
+
...c,
|
|
27
|
+
critical: c.critical ?? true,
|
|
28
|
+
}));
|
|
29
|
+
this.checkTimeout = config.checkTimeout ?? 5000;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Set the database instance
|
|
33
|
+
*/
|
|
34
|
+
setDatabase(db) {
|
|
35
|
+
this.database = db;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Set the cache check function
|
|
39
|
+
*/
|
|
40
|
+
setCacheCheck(check) {
|
|
41
|
+
this.cacheCheck = check;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Add a custom dependency check
|
|
45
|
+
*/
|
|
46
|
+
addCheck(name, check, critical = true) {
|
|
47
|
+
this.customChecks.push({ name, check, critical });
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Perform full readiness check
|
|
51
|
+
*
|
|
52
|
+
* Checks all dependencies and returns overall readiness status.
|
|
53
|
+
*/
|
|
54
|
+
async check() {
|
|
55
|
+
const startTime = performance.now();
|
|
56
|
+
const checks = [];
|
|
57
|
+
let allCriticalOk = true;
|
|
58
|
+
// Check database
|
|
59
|
+
const dbCheck = await this.checkDatabase();
|
|
60
|
+
checks.push(dbCheck);
|
|
61
|
+
if (dbCheck.status === 'unhealthy') {
|
|
62
|
+
allCriticalOk = false;
|
|
63
|
+
}
|
|
64
|
+
// Check cache
|
|
65
|
+
const cacheCheckResult = await this.checkCache();
|
|
66
|
+
checks.push(cacheCheckResult);
|
|
67
|
+
if (cacheCheckResult.status === 'unhealthy') {
|
|
68
|
+
allCriticalOk = false;
|
|
69
|
+
}
|
|
70
|
+
// Run custom checks
|
|
71
|
+
for (const customCheck of this.customChecks) {
|
|
72
|
+
const result = await this.runCustomCheck(customCheck);
|
|
73
|
+
checks.push(result);
|
|
74
|
+
if (result.status === 'unhealthy' && customCheck.critical) {
|
|
75
|
+
allCriticalOk = false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const totalDuration = performance.now() - startTime;
|
|
79
|
+
return {
|
|
80
|
+
ready: allCriticalOk,
|
|
81
|
+
statusCode: allCriticalOk ? 200 : 503,
|
|
82
|
+
timestamp: new Date().toISOString(),
|
|
83
|
+
checks,
|
|
84
|
+
totalDuration: Math.round(totalDuration * 100) / 100,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check database connectivity
|
|
89
|
+
*/
|
|
90
|
+
async checkDatabase() {
|
|
91
|
+
const startTime = performance.now();
|
|
92
|
+
if (!this.database) {
|
|
93
|
+
return {
|
|
94
|
+
name: 'database',
|
|
95
|
+
status: 'degraded',
|
|
96
|
+
details: { reason: 'Database not configured' },
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
// Perform a simple query to check connectivity
|
|
101
|
+
const result = await this.withTimeout(async () => {
|
|
102
|
+
// Use a simple query that should always work
|
|
103
|
+
const stmt = this.database.prepare('SELECT 1 as health_check');
|
|
104
|
+
return stmt.get();
|
|
105
|
+
}, this.checkTimeout);
|
|
106
|
+
const responseTime = performance.now() - startTime;
|
|
107
|
+
if (result) {
|
|
108
|
+
return {
|
|
109
|
+
name: 'database',
|
|
110
|
+
status: 'ok',
|
|
111
|
+
responseTime: Math.round(responseTime * 100) / 100,
|
|
112
|
+
details: { type: 'sqlite' },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
return {
|
|
117
|
+
name: 'database',
|
|
118
|
+
status: 'unhealthy',
|
|
119
|
+
responseTime: Math.round(responseTime * 100) / 100,
|
|
120
|
+
error: 'Query returned no result',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const responseTime = performance.now() - startTime;
|
|
126
|
+
return {
|
|
127
|
+
name: 'database',
|
|
128
|
+
status: 'unhealthy',
|
|
129
|
+
responseTime: Math.round(responseTime * 100) / 100,
|
|
130
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check cache status
|
|
136
|
+
*/
|
|
137
|
+
async checkCache() {
|
|
138
|
+
const startTime = performance.now();
|
|
139
|
+
if (!this.cacheCheck) {
|
|
140
|
+
return {
|
|
141
|
+
name: 'cache',
|
|
142
|
+
status: 'ok',
|
|
143
|
+
details: { reason: 'Cache check not configured, assuming healthy' },
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const result = await this.withTimeout(this.cacheCheck, this.checkTimeout);
|
|
148
|
+
const responseTime = performance.now() - startTime;
|
|
149
|
+
return {
|
|
150
|
+
name: 'cache',
|
|
151
|
+
status: result ? 'ok' : 'unhealthy',
|
|
152
|
+
responseTime: Math.round(responseTime * 100) / 100,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const responseTime = performance.now() - startTime;
|
|
157
|
+
return {
|
|
158
|
+
name: 'cache',
|
|
159
|
+
status: 'unhealthy',
|
|
160
|
+
responseTime: Math.round(responseTime * 100) / 100,
|
|
161
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Run a custom check
|
|
167
|
+
*/
|
|
168
|
+
async runCustomCheck(customCheck) {
|
|
169
|
+
const startTime = performance.now();
|
|
170
|
+
try {
|
|
171
|
+
const result = await this.withTimeout(customCheck.check, this.checkTimeout);
|
|
172
|
+
const responseTime = performance.now() - startTime;
|
|
173
|
+
return {
|
|
174
|
+
name: customCheck.name,
|
|
175
|
+
status: result.ok ? 'ok' : 'unhealthy',
|
|
176
|
+
responseTime: Math.round(responseTime * 100) / 100,
|
|
177
|
+
details: result.details,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const responseTime = performance.now() - startTime;
|
|
182
|
+
return {
|
|
183
|
+
name: customCheck.name,
|
|
184
|
+
status: 'unhealthy',
|
|
185
|
+
responseTime: Math.round(responseTime * 100) / 100,
|
|
186
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Execute a function with timeout
|
|
192
|
+
*/
|
|
193
|
+
async withTimeout(fn, timeoutMs) {
|
|
194
|
+
return new Promise((resolve, reject) => {
|
|
195
|
+
const timer = setTimeout(() => {
|
|
196
|
+
reject(new Error(`Check timed out after ${timeoutMs}ms`));
|
|
197
|
+
}, timeoutMs);
|
|
198
|
+
fn()
|
|
199
|
+
.then((result) => {
|
|
200
|
+
clearTimeout(timer);
|
|
201
|
+
resolve(result);
|
|
202
|
+
})
|
|
203
|
+
.catch((error) => {
|
|
204
|
+
clearTimeout(timer);
|
|
205
|
+
reject(error);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Quick readiness check (boolean result)
|
|
211
|
+
*/
|
|
212
|
+
async isReady() {
|
|
213
|
+
const result = await this.check();
|
|
214
|
+
return result.ready;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Default readiness check instance
|
|
218
|
+
let defaultReadinessCheck = null;
|
|
219
|
+
/**
|
|
220
|
+
* Get the default readiness check instance
|
|
221
|
+
*/
|
|
222
|
+
export function getReadinessCheck() {
|
|
223
|
+
if (!defaultReadinessCheck) {
|
|
224
|
+
defaultReadinessCheck = new ReadinessCheck();
|
|
225
|
+
}
|
|
226
|
+
return defaultReadinessCheck;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Create a new readiness check instance with custom configuration
|
|
230
|
+
*/
|
|
231
|
+
export function createReadinessCheck(config) {
|
|
232
|
+
return new ReadinessCheck(config);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Perform a quick readiness check using the default instance
|
|
236
|
+
*/
|
|
237
|
+
export async function checkReadiness() {
|
|
238
|
+
return getReadinessCheck().check();
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Configure the default readiness check
|
|
242
|
+
*/
|
|
243
|
+
export function configureReadinessCheck(config) {
|
|
244
|
+
const check = getReadinessCheck();
|
|
245
|
+
if (config.database !== undefined) {
|
|
246
|
+
check.setDatabase(config.database);
|
|
247
|
+
}
|
|
248
|
+
if (config.cacheCheck !== undefined) {
|
|
249
|
+
check.setCacheCheck(config.cacheCheck);
|
|
250
|
+
}
|
|
251
|
+
if (config.customChecks) {
|
|
252
|
+
for (const custom of config.customChecks) {
|
|
253
|
+
check.addCheck(custom.name, custom.check, custom.critical);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Format readiness response for HTTP
|
|
259
|
+
*/
|
|
260
|
+
export function formatReadinessResponse(response) {
|
|
261
|
+
return {
|
|
262
|
+
statusCode: response.statusCode,
|
|
263
|
+
body: response,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=readinessCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readinessCheck.js","sourceRoot":"","sources":["../../../src/health/readinessCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skillsmith MCP Server
|
|
3
|
+
* Provides skill discovery, installation, and management tools
|
|
4
|
+
*
|
|
5
|
+
* @see SMI-792: Database initialization with tool context
|
|
6
|
+
*/
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
10
|
+
import { getToolContext } from './context.js';
|
|
11
|
+
import { searchToolSchema, executeSearch } from './tools/search.js';
|
|
12
|
+
import { getSkillToolSchema, executeGetSkill } from './tools/get-skill.js';
|
|
13
|
+
import { installTool, installSkill, installInputSchema } from './tools/install.js';
|
|
14
|
+
import { uninstallTool, uninstallSkill, uninstallInputSchema } from './tools/uninstall.js';
|
|
15
|
+
import { recommendToolSchema, recommendInputSchema, executeRecommend } from './tools/recommend.js';
|
|
16
|
+
import { validateToolSchema, validateInputSchema, executeValidate } from './tools/validate.js';
|
|
17
|
+
import { compareToolSchema, compareInputSchema, executeCompare } from './tools/compare.js';
|
|
18
|
+
import { suggestToolSchema, suggestInputSchema, executeSuggest } from './tools/suggest.js';
|
|
19
|
+
// Initialize tool context with database connection
|
|
20
|
+
let toolContext;
|
|
21
|
+
// Tool definitions for MCP
|
|
22
|
+
const toolDefinitions = [
|
|
23
|
+
searchToolSchema,
|
|
24
|
+
getSkillToolSchema,
|
|
25
|
+
installTool,
|
|
26
|
+
uninstallTool,
|
|
27
|
+
recommendToolSchema,
|
|
28
|
+
validateToolSchema,
|
|
29
|
+
compareToolSchema,
|
|
30
|
+
suggestToolSchema,
|
|
31
|
+
];
|
|
32
|
+
// Create server
|
|
33
|
+
const server = new Server({
|
|
34
|
+
name: 'skillsmith',
|
|
35
|
+
version: '0.1.0',
|
|
36
|
+
}, {
|
|
37
|
+
capabilities: {
|
|
38
|
+
tools: {},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
// Handle list tools request
|
|
42
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
43
|
+
return {
|
|
44
|
+
tools: toolDefinitions.map((tool) => ({
|
|
45
|
+
name: tool.name,
|
|
46
|
+
description: tool.description,
|
|
47
|
+
inputSchema: tool.inputSchema,
|
|
48
|
+
})),
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
// Handle tool calls
|
|
52
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
53
|
+
const { name, arguments: args } = request.params;
|
|
54
|
+
try {
|
|
55
|
+
switch (name) {
|
|
56
|
+
case 'search': {
|
|
57
|
+
const input = (args ?? {});
|
|
58
|
+
const result = await executeSearch(input, toolContext);
|
|
59
|
+
return {
|
|
60
|
+
content: [
|
|
61
|
+
{
|
|
62
|
+
type: 'text',
|
|
63
|
+
text: JSON.stringify(result, null, 2),
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
case 'get_skill': {
|
|
69
|
+
const input = (args ?? {});
|
|
70
|
+
const result = await executeGetSkill(input, toolContext);
|
|
71
|
+
return {
|
|
72
|
+
content: [
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: JSON.stringify(result, null, 2),
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
case 'install_skill': {
|
|
81
|
+
const input = installInputSchema.parse(args);
|
|
82
|
+
const result = await installSkill(input, toolContext);
|
|
83
|
+
return {
|
|
84
|
+
content: [
|
|
85
|
+
{
|
|
86
|
+
type: 'text',
|
|
87
|
+
text: JSON.stringify(result, null, 2),
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
case 'uninstall_skill': {
|
|
93
|
+
const input = uninstallInputSchema.parse(args);
|
|
94
|
+
const result = await uninstallSkill(input, toolContext);
|
|
95
|
+
return {
|
|
96
|
+
content: [
|
|
97
|
+
{
|
|
98
|
+
type: 'text',
|
|
99
|
+
text: JSON.stringify(result, null, 2),
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
case 'skill_recommend': {
|
|
105
|
+
const input = recommendInputSchema.parse(args);
|
|
106
|
+
const result = await executeRecommend(input, toolContext);
|
|
107
|
+
return {
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: 'text',
|
|
111
|
+
text: JSON.stringify(result, null, 2),
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
case 'skill_validate': {
|
|
117
|
+
const input = validateInputSchema.parse(args);
|
|
118
|
+
const result = await executeValidate(input, toolContext);
|
|
119
|
+
return {
|
|
120
|
+
content: [
|
|
121
|
+
{
|
|
122
|
+
type: 'text',
|
|
123
|
+
text: JSON.stringify(result, null, 2),
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
case 'skill_compare': {
|
|
129
|
+
const input = compareInputSchema.parse(args);
|
|
130
|
+
const result = await executeCompare(input, toolContext);
|
|
131
|
+
return {
|
|
132
|
+
content: [
|
|
133
|
+
{
|
|
134
|
+
type: 'text',
|
|
135
|
+
text: JSON.stringify(result, null, 2),
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
case 'skill_suggest': {
|
|
141
|
+
const input = suggestInputSchema.parse(args);
|
|
142
|
+
const result = await executeSuggest(input, toolContext);
|
|
143
|
+
return {
|
|
144
|
+
content: [
|
|
145
|
+
{
|
|
146
|
+
type: 'text',
|
|
147
|
+
text: JSON.stringify(result, null, 2),
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
default:
|
|
153
|
+
throw new Error('Unknown tool: ' + name);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return {
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: 'text',
|
|
161
|
+
text: 'Error: ' + (error instanceof Error ? error.message : 'Unknown error'),
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
isError: true,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
// Start server
|
|
169
|
+
async function main() {
|
|
170
|
+
// Initialize database and services
|
|
171
|
+
toolContext = getToolContext();
|
|
172
|
+
console.error('Database initialized at:', process.env.SKILLSMITH_DB_PATH || '~/.skillsmith/skills.db');
|
|
173
|
+
const transport = new StdioServerTransport();
|
|
174
|
+
await server.connect(transport);
|
|
175
|
+
console.error('Skillsmith MCP server running');
|
|
176
|
+
}
|
|
177
|
+
main().catch(console.error);
|
|
178
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
// Basic tests - full MCP server testing requires more complex setup
|
|
3
|
+
describe('MCP Server Module', () => {
|
|
4
|
+
it('should define server constants', async () => {
|
|
5
|
+
// Test that the module can be imported without errors
|
|
6
|
+
// Note: Full testing requires mocking the MCP SDK transport
|
|
7
|
+
expect(true).toBe(true);
|
|
8
|
+
});
|
|
9
|
+
});
|
|
10
|
+
describe('Server Configuration', () => {
|
|
11
|
+
it('should have valid server name', () => {
|
|
12
|
+
const SERVER_NAME = 'skillsmith-mcp';
|
|
13
|
+
expect(SERVER_NAME).toBe('skillsmith-mcp');
|
|
14
|
+
expect(SERVER_NAME).toMatch(/^[a-z][a-z0-9-]*$/);
|
|
15
|
+
});
|
|
16
|
+
it('should have valid semver version', () => {
|
|
17
|
+
const SERVER_VERSION = '0.1.0';
|
|
18
|
+
expect(SERVER_VERSION).toMatch(/^\d+\.\d+\.\d+$/);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('Tool Definitions', () => {
|
|
22
|
+
it('should define ping tool schema', () => {
|
|
23
|
+
const pingSchema = {
|
|
24
|
+
type: 'object',
|
|
25
|
+
properties: {
|
|
26
|
+
message: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Optional message to include in response',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
expect(pingSchema.type).toBe('object');
|
|
33
|
+
expect(pingSchema.properties.message).toBeDefined();
|
|
34
|
+
});
|
|
35
|
+
it('should define server_info tool schema', () => {
|
|
36
|
+
const serverInfoSchema = {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {},
|
|
39
|
+
};
|
|
40
|
+
expect(serverInfoSchema.type).toBe('object');
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,oEAAoE;AACpE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,sDAAsD;QACtD,4DAA4D;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,WAAW,GAAG,gBAAgB,CAAA;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC1C,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,cAAc,GAAG,OAAO,CAAA;QAC9B,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG;YACjB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yCAAyC;iBACvD;aACF;SACF,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,gBAAgB,GAAG;YACvB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf,CAAA;QAED,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|