accessibility-server-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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +762 -0
  3. package/config/wcag-rules.json +252 -0
  4. package/dist/index.d.ts +59 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +437 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/test-manual.d.ts +6 -0
  9. package/dist/test-manual.d.ts.map +1 -0
  10. package/dist/test-manual.js +66 -0
  11. package/dist/test-manual.js.map +1 -0
  12. package/dist/tools/accessibility-tester.d.ts +56 -0
  13. package/dist/tools/accessibility-tester.d.ts.map +1 -0
  14. package/dist/tools/accessibility-tester.js +317 -0
  15. package/dist/tools/accessibility-tester.js.map +1 -0
  16. package/dist/tools/color-contrast.d.ts +49 -0
  17. package/dist/tools/color-contrast.d.ts.map +1 -0
  18. package/dist/tools/color-contrast.js +237 -0
  19. package/dist/tools/color-contrast.js.map +1 -0
  20. package/dist/tools/wcag-validator.d.ts +43 -0
  21. package/dist/tools/wcag-validator.d.ts.map +1 -0
  22. package/dist/tools/wcag-validator.js +249 -0
  23. package/dist/tools/wcag-validator.js.map +1 -0
  24. package/dist/tools/website-accessibility-tester.d.ts +103 -0
  25. package/dist/tools/website-accessibility-tester.d.ts.map +1 -0
  26. package/dist/tools/website-accessibility-tester.js +228 -0
  27. package/dist/tools/website-accessibility-tester.js.map +1 -0
  28. package/dist/types/accessibility.d.ts +172 -0
  29. package/dist/types/accessibility.d.ts.map +1 -0
  30. package/dist/types/accessibility.js +5 -0
  31. package/dist/types/accessibility.js.map +1 -0
  32. package/dist/types/index.d.ts +6 -0
  33. package/dist/types/index.d.ts.map +1 -0
  34. package/dist/types/index.js +8 -0
  35. package/dist/types/index.js.map +1 -0
  36. package/dist/types/mcp.d.ts +70 -0
  37. package/dist/types/mcp.d.ts.map +1 -0
  38. package/dist/types/mcp.js +5 -0
  39. package/dist/types/mcp.js.map +1 -0
  40. package/dist/utils/browser-manager.d.ts +83 -0
  41. package/dist/utils/browser-manager.d.ts.map +1 -0
  42. package/dist/utils/browser-manager.js +292 -0
  43. package/dist/utils/browser-manager.js.map +1 -0
  44. package/dist/utils/index.d.ts +8 -0
  45. package/dist/utils/index.d.ts.map +1 -0
  46. package/dist/utils/index.js +8 -0
  47. package/dist/utils/index.js.map +1 -0
  48. package/dist/utils/logger.d.ts +36 -0
  49. package/dist/utils/logger.d.ts.map +1 -0
  50. package/dist/utils/logger.js +107 -0
  51. package/dist/utils/logger.js.map +1 -0
  52. package/dist/utils/report-generator.d.ts +31 -0
  53. package/dist/utils/report-generator.d.ts.map +1 -0
  54. package/dist/utils/report-generator.js +252 -0
  55. package/dist/utils/report-generator.js.map +1 -0
  56. package/dist/utils/website-crawler.d.ts +66 -0
  57. package/dist/utils/website-crawler.d.ts.map +1 -0
  58. package/dist/utils/website-crawler.js +306 -0
  59. package/dist/utils/website-crawler.js.map +1 -0
  60. package/package.json +80 -0
package/dist/index.js ADDED
@@ -0,0 +1,437 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { z } from 'zod';
6
+ // Import tools
7
+ import { AccessibilityTester } from './tools/accessibility-tester.js';
8
+ import { ColorContrastTester } from './tools/color-contrast.js';
9
+ import { WCAGValidator } from './tools/wcag-validator.js';
10
+ import { WebsiteAccessibilityTester } from './tools/website-accessibility-tester.js';
11
+ // Import utilities
12
+ import { Logger, BrowserManager } from './utils/index.js';
13
+ // Simplified validation schemas
14
+ const TestAccessibilitySchema = z.object({
15
+ target: z.string().min(1, 'Target URL or HTML is required'),
16
+ type: z.enum(['url', 'html']).default('url'),
17
+ level: z.enum(['basic', 'full']).default('basic'),
18
+ wcagLevel: z.enum(['A', 'AA', 'AAA']).default('AA')
19
+ });
20
+ const ColorContrastSchema = z.object({
21
+ foreground: z.string().min(1, 'Foreground color is required'),
22
+ background: z.string().min(1, 'Background color is required'),
23
+ fontSize: z.number().min(1).default(16),
24
+ isBold: z.boolean().default(false)
25
+ });
26
+ const GetWCAGRulesSchema = z.object({
27
+ wcagLevel: z.enum(['A', 'AA', 'AAA']).optional(),
28
+ category: z.string().optional(),
29
+ search: z.string().optional(),
30
+ limit: z.number().min(1).max(50).default(20)
31
+ });
32
+ const TestWebsiteSchema = z.object({
33
+ baseUrl: z.string().url('Must be a valid URL'),
34
+ wcagLevel: z.enum(['A', 'AA', 'AAA']).default('AA'),
35
+ fullAnalysis: z.boolean().default(false),
36
+ maxPages: z.number().min(1).max(100).default(20),
37
+ maxDepth: z.number().min(1).max(5).default(3),
38
+ concurrency: z.number().min(1).max(5).default(3),
39
+ excludePatterns: z.array(z.string()).default([]),
40
+ includePatterns: z.array(z.string()).default([]),
41
+ continueOnError: z.boolean().default(true),
42
+ respectRobots: z.boolean().default(true),
43
+ delay: z.number().min(0).max(10000).default(1000)
44
+ });
45
+ /**
46
+ * Unified MCP server class for accessibility testing
47
+ * Supports both simple and full modes
48
+ */
49
+ export class AccessibilityMCPServer {
50
+ server;
51
+ logger;
52
+ browserManager;
53
+ config;
54
+ // Tool instances (lazy-loaded)
55
+ accessibilityTester;
56
+ colorContrastTester;
57
+ wcagValidator;
58
+ websiteAccessibilityTester;
59
+ constructor(config = { mode: 'full', enableLogging: true }) {
60
+ this.config = config;
61
+ this.logger = config.enableLogging
62
+ ? new Logger().child({ component: 'AccessibilityMCPServer' })
63
+ : { info: () => { }, debug: () => { }, warn: () => { }, error: () => { } };
64
+ this.browserManager = new BrowserManager();
65
+ this.server = new Server({
66
+ name: 'accessibility-mcp-server',
67
+ version: '1.0.0',
68
+ }, {
69
+ capabilities: {
70
+ tools: {},
71
+ },
72
+ });
73
+ this.setupHandlers();
74
+ this.setupGracefulShutdown();
75
+ }
76
+ /**
77
+ * Get or create accessibility tester (lazy loading)
78
+ */
79
+ getAccessibilityTester() {
80
+ if (!this.accessibilityTester) {
81
+ this.accessibilityTester = new AccessibilityTester(this.browserManager);
82
+ }
83
+ return this.accessibilityTester;
84
+ }
85
+ /**
86
+ * Get or create color contrast tester (lazy loading)
87
+ */
88
+ getColorContrastTester() {
89
+ if (!this.colorContrastTester) {
90
+ this.colorContrastTester = new ColorContrastTester();
91
+ }
92
+ return this.colorContrastTester;
93
+ }
94
+ /**
95
+ * Get or create WCAG validator (lazy loading)
96
+ */
97
+ getWCAGValidator() {
98
+ if (!this.wcagValidator) {
99
+ this.wcagValidator = new WCAGValidator();
100
+ }
101
+ return this.wcagValidator;
102
+ }
103
+ /**
104
+ * Get or create website accessibility tester (lazy loading)
105
+ */
106
+ getWebsiteAccessibilityTester() {
107
+ if (!this.websiteAccessibilityTester) {
108
+ this.websiteAccessibilityTester = new WebsiteAccessibilityTester(this.browserManager);
109
+ }
110
+ return this.websiteAccessibilityTester;
111
+ }
112
+ /**
113
+ * Centralized error handling for all operations
114
+ */
115
+ async executeWithErrorHandling(operation, context) {
116
+ const startTime = Date.now();
117
+ try {
118
+ const result = await operation();
119
+ const processingTime = Date.now() - startTime;
120
+ this.logger.info(`${context} completed successfully`, { processingTime });
121
+ return {
122
+ success: true,
123
+ data: result,
124
+ processingTime,
125
+ timestamp: new Date().toISOString()
126
+ };
127
+ }
128
+ catch (error) {
129
+ const processingTime = Date.now() - startTime;
130
+ this.logger.error(`${context} failed`, error instanceof Error ? error : new Error(String(error)));
131
+ if (error instanceof z.ZodError) {
132
+ throw new McpError(ErrorCode.InvalidParams, `Invalid parameters: ${error.issues.map(i => i.message).join(', ')}`);
133
+ }
134
+ if (error instanceof McpError) {
135
+ throw error;
136
+ }
137
+ const errorResponse = {
138
+ success: false,
139
+ error: {
140
+ type: 'internal',
141
+ message: error instanceof Error ? error.message : 'Unknown error occurred',
142
+ details: error instanceof Error ? { name: error.name } : undefined
143
+ },
144
+ processingTime,
145
+ timestamp: new Date().toISOString()
146
+ };
147
+ return errorResponse;
148
+ }
149
+ }
150
+ /**
151
+ * Set up MCP request handlers
152
+ */
153
+ setupHandlers() {
154
+ // List available tools based on server mode
155
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
156
+ const basicTools = [
157
+ {
158
+ name: 'test_accessibility',
159
+ description: 'Test URL or HTML content for accessibility issues',
160
+ inputSchema: {
161
+ type: 'object',
162
+ properties: {
163
+ target: {
164
+ type: 'string',
165
+ description: 'URL to test or HTML content to analyze'
166
+ },
167
+ type: {
168
+ type: 'string',
169
+ enum: ['url', 'html'],
170
+ default: 'url',
171
+ description: 'Type of content to test'
172
+ },
173
+ level: {
174
+ type: 'string',
175
+ enum: ['basic', 'full'],
176
+ default: 'basic',
177
+ description: 'Testing depth level'
178
+ },
179
+ wcagLevel: {
180
+ type: 'string',
181
+ enum: ['A', 'AA', 'AAA'],
182
+ default: 'AA',
183
+ description: 'WCAG compliance level'
184
+ }
185
+ },
186
+ required: ['target']
187
+ }
188
+ },
189
+ {
190
+ name: 'test_website_accessibility',
191
+ description: 'Test accessibility for an entire website by crawling and testing multiple pages',
192
+ inputSchema: {
193
+ type: 'object',
194
+ properties: {
195
+ baseUrl: {
196
+ type: 'string',
197
+ description: 'Base URL of the website to test'
198
+ },
199
+ wcagLevel: {
200
+ type: 'string',
201
+ enum: ['A', 'AA', 'AAA'],
202
+ default: 'AA',
203
+ description: 'WCAG compliance level'
204
+ },
205
+ fullAnalysis: {
206
+ type: 'boolean',
207
+ default: false,
208
+ description: 'Whether to perform full accessibility analysis'
209
+ },
210
+ maxPages: {
211
+ type: 'number',
212
+ minimum: 1,
213
+ maximum: 100,
214
+ default: 20,
215
+ description: 'Maximum number of pages to test'
216
+ },
217
+ maxDepth: {
218
+ type: 'number',
219
+ minimum: 1,
220
+ maximum: 5,
221
+ default: 3,
222
+ description: 'Maximum crawl depth'
223
+ },
224
+ concurrency: {
225
+ type: 'number',
226
+ minimum: 1,
227
+ maximum: 5,
228
+ default: 3,
229
+ description: 'Number of pages to test simultaneously'
230
+ },
231
+ excludePatterns: {
232
+ type: 'array',
233
+ items: { type: 'string' },
234
+ description: 'URL patterns to exclude from testing'
235
+ },
236
+ includePatterns: {
237
+ type: 'array',
238
+ items: { type: 'string' },
239
+ description: 'URL patterns to include (if specified, only these will be tested)'
240
+ },
241
+ continueOnError: {
242
+ type: 'boolean',
243
+ default: true,
244
+ description: 'Whether to continue testing if individual pages fail'
245
+ },
246
+ delay: {
247
+ type: 'number',
248
+ minimum: 0,
249
+ maximum: 10000,
250
+ default: 1000,
251
+ description: 'Delay between page requests in milliseconds'
252
+ }
253
+ },
254
+ required: ['baseUrl']
255
+ }
256
+ },
257
+ {
258
+ name: 'check_color_contrast',
259
+ description: 'Check color combinations for WCAG compliance',
260
+ inputSchema: {
261
+ type: 'object',
262
+ properties: {
263
+ foreground: {
264
+ type: 'string',
265
+ description: 'Foreground color (hex, rgb, hsl, or color name)'
266
+ },
267
+ background: {
268
+ type: 'string',
269
+ description: 'Background color (hex, rgb, hsl, or color name)'
270
+ },
271
+ fontSize: {
272
+ type: 'number',
273
+ minimum: 1,
274
+ default: 16,
275
+ description: 'Font size in pixels'
276
+ },
277
+ isBold: {
278
+ type: 'boolean',
279
+ default: false,
280
+ description: 'Whether the text is bold'
281
+ }
282
+ },
283
+ required: ['foreground', 'background']
284
+ }
285
+ }
286
+ ];
287
+ const fullTools = [
288
+ ...basicTools,
289
+ {
290
+ name: 'get_wcag_rules',
291
+ description: 'Get information about WCAG accessibility rules',
292
+ inputSchema: {
293
+ type: 'object',
294
+ properties: {
295
+ wcagLevel: {
296
+ type: 'string',
297
+ enum: ['A', 'AA', 'AAA'],
298
+ description: 'Filter rules by WCAG level'
299
+ },
300
+ category: {
301
+ type: 'string',
302
+ description: 'Filter rules by category'
303
+ },
304
+ search: {
305
+ type: 'string',
306
+ description: 'Search term for rule titles/descriptions'
307
+ },
308
+ limit: {
309
+ type: 'number',
310
+ minimum: 1,
311
+ maximum: 50,
312
+ default: 20,
313
+ description: 'Maximum number of rules to return'
314
+ }
315
+ }
316
+ }
317
+ }
318
+ ];
319
+ return {
320
+ tools: this.config.mode === 'simple' ? basicTools : fullTools
321
+ };
322
+ });
323
+ // Handle tool calls with centralized error handling
324
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
325
+ const { name, arguments: args } = request.params;
326
+ this.logger.info(`Executing tool: ${name}`, { args });
327
+ let result;
328
+ switch (name) {
329
+ case 'test_accessibility': {
330
+ const params = TestAccessibilitySchema.parse(args);
331
+ result = await this.executeWithErrorHandling(() => this.getAccessibilityTester().testTarget(params), 'Accessibility test');
332
+ break;
333
+ }
334
+ case 'check_color_contrast': {
335
+ const params = ColorContrastSchema.parse(args);
336
+ result = await this.executeWithErrorHandling(() => this.getColorContrastTester().checkContrast(params), 'Color contrast check');
337
+ break;
338
+ }
339
+ case 'test_website_accessibility': {
340
+ const params = TestWebsiteSchema.parse(args);
341
+ result = await this.executeWithErrorHandling(() => this.getWebsiteAccessibilityTester().testWebsite(params.baseUrl, params), 'Website accessibility test');
342
+ break;
343
+ }
344
+ case 'get_wcag_rules': {
345
+ if (this.config.mode === 'simple') {
346
+ throw new McpError(ErrorCode.MethodNotFound, 'WCAG rules not available in simple mode');
347
+ }
348
+ const params = GetWCAGRulesSchema.parse(args || {});
349
+ result = await this.executeWithErrorHandling(() => this.getWCAGValidator().getRules(params), 'WCAG rules retrieval');
350
+ break;
351
+ }
352
+ default:
353
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
354
+ }
355
+ return {
356
+ content: [
357
+ {
358
+ type: 'text',
359
+ text: JSON.stringify(result, null, 2)
360
+ }
361
+ ]
362
+ };
363
+ });
364
+ }
365
+ /**
366
+ * Set up graceful shutdown handling
367
+ */
368
+ setupGracefulShutdown() {
369
+ const shutdown = async (signal) => {
370
+ this.logger.info(`Received ${signal}, shutting down gracefully...`);
371
+ try {
372
+ await this.cleanup();
373
+ this.logger.info('Graceful shutdown completed');
374
+ process.exit(0);
375
+ }
376
+ catch (error) {
377
+ this.logger.error('Error during shutdown', error instanceof Error ? error : new Error(String(error)));
378
+ process.exit(1);
379
+ }
380
+ };
381
+ process.on('SIGINT', () => shutdown('SIGINT'));
382
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
383
+ process.on('uncaughtException', (error) => {
384
+ this.logger.error('Uncaught exception', error);
385
+ shutdown('uncaughtException').catch(() => process.exit(1));
386
+ });
387
+ process.on('unhandledRejection', (reason) => {
388
+ this.logger.error('Unhandled rejection', reason instanceof Error ? reason : new Error(String(reason)));
389
+ shutdown('unhandledRejection').catch(() => process.exit(1));
390
+ });
391
+ }
392
+ /**
393
+ * Start the MCP server
394
+ */
395
+ async run() {
396
+ try {
397
+ const transport = new StdioServerTransport();
398
+ await this.server.connect(transport);
399
+ this.logger.info('Accessibility MCP Server started successfully on stdio');
400
+ }
401
+ catch (error) {
402
+ this.logger.error('Failed to start server', error instanceof Error ? error : new Error(String(error)));
403
+ throw error;
404
+ }
405
+ }
406
+ /**
407
+ * Clean up resources
408
+ */
409
+ async cleanup() {
410
+ try {
411
+ await this.browserManager.cleanup();
412
+ this.logger.info('Cleanup completed successfully');
413
+ }
414
+ catch (error) {
415
+ this.logger.error('Error during cleanup', error instanceof Error ? error : new Error(String(error)));
416
+ throw error;
417
+ }
418
+ }
419
+ }
420
+ // Start the server if this file is run directly
421
+ import { pathToFileURL } from 'url';
422
+ const scriptPath = process.argv[1];
423
+ if (scriptPath && import.meta.url === pathToFileURL(scriptPath).href) {
424
+ // Set MCP mode environment variable when running as MCP server
425
+ process.env.MCP_MODE = 'true';
426
+ // Determine server mode from environment or command line
427
+ const mode = process.env.ACCESSIBILITY_MCP_MODE ||
428
+ (process.argv.includes('--simple') ? 'simple' : 'full');
429
+ // Set MCP mode to disable console logging when running as MCP server
430
+ const enableLogging = !process.env.MCP_MODE;
431
+ const server = new AccessibilityMCPServer({ mode, enableLogging });
432
+ server.run().catch(error => {
433
+ process.stderr.write(`Failed to start accessibility MCP server: ${error}\n`);
434
+ process.exit(1);
435
+ });
436
+ }
437
+ //# 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,6 @@
1
+ /**
2
+ * Manual test script for website accessibility testing
3
+ * Run with: node --loader=tsx/esm src/test-manual.ts
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=test-manual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-manual.d.ts","sourceRoot":"","sources":["../src/test-manual.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Manual test script for website accessibility testing
3
+ * Run with: node --loader=tsx/esm src/test-manual.ts
4
+ */
5
+ import { WebsiteAccessibilityTester } from './tools/website-accessibility-tester.js';
6
+ import { BrowserManager } from './utils/browser-manager.js';
7
+ async function testWebsiteAccessibility() {
8
+ console.log('๐Ÿš€ Starting website accessibility testing demo...\n');
9
+ const browserManager = new BrowserManager({ headless: 'new' });
10
+ const websiteTester = new WebsiteAccessibilityTester(browserManager);
11
+ try {
12
+ // Test a simple, well-known website
13
+ console.log('๐Ÿ“Š Testing website: https://example.com');
14
+ console.log('โš™๏ธ Configuration: maxPages=2, maxDepth=1, wcagLevel=AA\n');
15
+ const result = await websiteTester.testWebsite('https://example.com', {
16
+ maxPages: 2,
17
+ maxDepth: 1,
18
+ concurrency: 1,
19
+ delay: 2000,
20
+ wcagLevel: 'AA',
21
+ fullAnalysis: false,
22
+ continueOnError: true
23
+ });
24
+ console.log('โœ… Test completed successfully!\n');
25
+ console.log('๐Ÿ“ˆ Results Summary:');
26
+ console.log(` โ€ข Pages discovered: ${result.crawlResult.urls.length}`);
27
+ console.log(` โ€ข Pages tested successfully: ${result.summary.totalPages}`);
28
+ console.log(` โ€ข Pages failed: ${result.summary.failedPages}`);
29
+ console.log(` โ€ข Total violations found: ${result.summary.totalViolations}`);
30
+ console.log(` โ€ข Overall accessibility score: ${result.summary.overallScore}/100`);
31
+ console.log(` โ€ข WCAG AA compliance: ${result.summary.compliance.AA ? 'โœ… Pass' : 'โŒ Fail'}`);
32
+ console.log(` โ€ข Crawl time: ${result.summary.performance.crawlTime}ms`);
33
+ console.log(` โ€ข Average page test time: ${Math.round(result.summary.performance.averagePageTestTime)}ms\n`);
34
+ if (result.summary.commonViolations.length > 0) {
35
+ console.log('๐Ÿ” Most common violations:');
36
+ result.summary.commonViolations.slice(0, 3).forEach((violation, index) => {
37
+ console.log(` ${index + 1}. ${violation.description} (${violation.count} occurrences on ${violation.affectedPages} pages)`);
38
+ });
39
+ }
40
+ else {
41
+ console.log('๐ŸŽ‰ No common violations found across pages!');
42
+ }
43
+ console.log('\n๐Ÿ“‹ Page-by-page results:');
44
+ result.pageResults.forEach((pageResult, index) => {
45
+ if (pageResult.success && pageResult.result) {
46
+ console.log(` ${index + 1}. ${pageResult.url}`);
47
+ console.log(` Score: ${pageResult.result.summary.score}/100`);
48
+ console.log(` Violations: ${pageResult.result.violations.length}`);
49
+ console.log(` Test time: ${pageResult.duration}ms`);
50
+ }
51
+ else {
52
+ console.log(` ${index + 1}. ${pageResult.url} - FAILED: ${pageResult.error}`);
53
+ }
54
+ });
55
+ }
56
+ catch (error) {
57
+ console.error('โŒ Test failed:', error instanceof Error ? error.message : String(error));
58
+ }
59
+ finally {
60
+ await browserManager.cleanup();
61
+ console.log('\n๐Ÿงน Cleanup completed. Test finished.');
62
+ }
63
+ }
64
+ // Run the test
65
+ testWebsiteAccessibility().catch(console.error);
66
+ //# sourceMappingURL=test-manual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-manual.js","sourceRoot":"","sources":["../src/test-manual.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { BrowserManager } from '../utils/index.js';
2
+ import { AccessibilityTestResult } from '../types/index.js';
3
+ import type { TestAccessibilityInput } from '../types/mcp.js';
4
+ /**
5
+ * Unified accessibility tester for both URLs and HTML content
6
+ */
7
+ export declare class AccessibilityTester {
8
+ private readonly logger;
9
+ private readonly browserManager;
10
+ constructor(browserManager: BrowserManager);
11
+ /**
12
+ * Test accessibility for either URL or HTML content
13
+ */
14
+ testTarget(input: TestAccessibilityInput): Promise<AccessibilityTestResult>;
15
+ /**
16
+ * Test URL accessibility using Puppeteer and axe-core
17
+ */
18
+ private testURL;
19
+ /**
20
+ * Test HTML content using JSDOM and axe-core
21
+ */
22
+ private testHTML;
23
+ /**
24
+ * Inject axe-core into a Puppeteer page
25
+ */
26
+ private injectAxeCore;
27
+ /**
28
+ * Get axe-core source code for JSDOM injection
29
+ */
30
+ private getAxeSource;
31
+ /**
32
+ * Build axe configuration
33
+ */
34
+ private buildAxeConfig;
35
+ /**
36
+ * Run axe accessibility scan on a page
37
+ */
38
+ private runAxeScan;
39
+ /**
40
+ * Get page metadata
41
+ */
42
+ private getPageMetadata;
43
+ /**
44
+ * Transform axe results to our format
45
+ */
46
+ private transformAxeResults;
47
+ /**
48
+ * Transform axe node to our format
49
+ */
50
+ private transformNode;
51
+ /**
52
+ * Extract WCAG level from tags
53
+ */
54
+ private getWcagLevelFromTags;
55
+ }
56
+ //# sourceMappingURL=accessibility-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessibility-tester.d.ts","sourceRoot":"","sources":["../../src/tools/accessibility-tester.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAA2B,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,uBAAuB,EAMxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,iBAAiB,CAAC;AAI5E;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAEpC,cAAc,EAAE,cAAc;IAK1C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiCjF;;OAEG;YACW,OAAO;IA+CrB;;OAEG;YACW,QAAQ;IAyDtB;;OAEG;YACW,aAAa;IAoC3B;;OAEG;YACW,YAAY;IAS1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAgCtB;;OAEG;YACW,UAAU;IAQxB;;OAEG;YACW,eAAe;IAa7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmD3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAK7B"}