mcp-accessibility-scanner 1.0.7 → 1.0.8

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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 JustasM
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 JustasM
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/Readme.md CHANGED
@@ -1,137 +1,141 @@
1
- # MCP Accessibility Scanner 🔍
2
-
3
- A Model Context Protocol (MCP) server that provides automated web accessibility scanning using Playwright and Axe-core. This server enables LLMs to perform WCAG compliance checks, capture annotated screenshots, and generate detailed accessibility reports.
4
-
5
- ## Features
6
-
7
- Full WCAG 2.1/2.2 compliance checking
8
- 🖼️ Automatic screenshot capture with violation highlighting
9
- 📄 Detailed JSON reports with remediation guidance
10
-
11
- ## Installation
12
-
13
- You can install the package using any of these methods:
14
-
15
- Using npm:
16
- ```bash
17
- npm install -g mcp-accessibility-scanner
18
- ```
19
-
20
- ### Docker Installation
21
-
22
- The project includes a Dockerfile that sets up all necessary dependencies including Node.js v22 and Python 3.13.
23
-
24
- 1. Build the Docker image:
25
- ```bash
26
- docker build -t mcp-server .
27
- ```
28
-
29
- 2. Run the container:
30
- ```bash
31
- docker run -it -e MCP_PROXY_DEBUG=true mcp-server
32
- ```
33
-
34
- You can also run it in the background:
35
- ```bash
36
- docker run -d -p 3000:3000 mcp-server
37
- ```
38
-
39
- ### Installation in VS Code
40
-
41
- Install the Accessibility Scanner in VS Code using the VS Code CLI:
42
-
43
- For VS Code:
44
- ```bash
45
- code --add-mcp '{"name":"accessibility-scanner","command":"npx","args":["mcp-accessibility-scanner"]}'
46
- ```
47
-
48
- For VS Code Insiders:
49
- ```bash
50
- code-insiders --add-mcp '{"name":"accessibility-scanner","command":"npx","args":["mcp-accessibility-scanner"]}'
51
- ```
52
-
53
- ## Configuration
54
-
55
- Here's the Claude Desktop configuration:
56
-
57
- ```json
58
- {
59
- "mcpServers": {
60
- "accessibility-scanner": {
61
- "command": "npx",
62
- "args": ["-y", "mcp-accessibility-scanner"]
63
- }
64
- }
65
- }
66
- ```
67
-
68
- ## Usage
69
-
70
- The scanner exposes a single tool `scan_accessibility` that accepts:
71
-
72
- - `url`: The webpage URL to scan (required)
73
- - `violationsTag`: Array of accessibility violation tags to check (required)
74
- - `viewport`: Optional object to customize the viewport size
75
- - `width`: number (default: 1920)
76
- - `height`: number (default: 1080)
77
- - `shouldRunInHeadless`: Optional boolean to control headless mode (default: true)
78
-
79
- Example usage in Claude:
80
- ```
81
- Could you scan example.com for accessibility issues related to color contrast?
82
- ```
83
-
84
- Advanced example with custom options:
85
- ```
86
- Could you scan example.com for accessibility issues with a viewport of 1280x720 and show the browser window?
87
- ```
88
-
89
- ## Development
90
-
91
- Clone and set up the project:
92
- ```bash
93
- git clone https://github.com/JustasMonkev/mcp-accessibility-scanner.git
94
- cd mcp-accessibility-scanner
95
- npm install
96
- ```
97
-
98
- Start the TypeScript compiler in watch mode:
99
- ```bash
100
- npm run watch
101
- ```
102
-
103
- Test the MCP server locally:
104
- ```bash
105
- npm run inspector
106
- ```
107
-
108
- ### Docker Development
109
-
110
- For development using Docker:
111
-
112
- 1. Build the development image:
113
- ```bash
114
- docker build -t mcp-server-dev .
115
- ```
116
-
117
- 2. Run with volume mounting for live code changes:
118
- ```bash
119
- docker run -it -v $(pwd):/app -p 3000:3000 -e MCP_PROXY_DEBUG=true mcp-server-dev
120
- ```
121
-
122
- ## Project Structure
123
-
124
- ```
125
- ├── src/ # Source code
126
- │ ├── index.ts # MCP server setup and tool definitions
127
- │ └── scanner.ts # Core scanning functionality
128
- ├── build/ # Compiled JavaScript output
129
- ├── Dockerfile # Docker configuration for containerized setup
130
- ├── package.json # Project configuration and dependencies
131
- └── tsconfig.json # TypeScript configuration
132
- ```
133
-
134
- ## License
135
-
136
- MIT
137
-
1
+ [![MseeP.ai Security Assessment Badge](https://mseep.net/pr/justasmonkev-mcp-accessibility-scanner-badge.png)](https://mseep.ai/app/justasmonkev-mcp-accessibility-scanner)
2
+
3
+ # MCP Accessibility Scanner 🔍
4
+
5
+ A Model Context Protocol (MCP) server that provides automated web accessibility scanning using Playwright and Axe-core. This server enables LLMs to perform WCAG compliance checks, capture annotated screenshots, and generate detailed accessibility reports.
6
+
7
+ ## Features
8
+
9
+ Full WCAG 2.1/2.2 compliance checking
10
+ 🖼️ Automatic screenshot capture with violation highlighting
11
+ 📄 Detailed JSON reports with remediation guidance
12
+
13
+ ## Installation
14
+
15
+ You can install the package using any of these methods:
16
+
17
+ Using npm:
18
+ ```bash
19
+ npm install -g mcp-accessibility-scanner
20
+ ```
21
+
22
+ ### Docker Installation
23
+
24
+ The project includes a Dockerfile that sets up all necessary dependencies including Node.js v22 and Python 3.13.
25
+
26
+ 1. Build the Docker image:
27
+ ```bash
28
+ docker build -t mcp-server .
29
+ ```
30
+
31
+ 2. Run the container:
32
+ ```bash
33
+ docker run -it -e MCP_PROXY_DEBUG=true mcp-server
34
+ ```
35
+
36
+ You can also run it in the background:
37
+ ```bash
38
+ docker run -d -p 3000:3000 mcp-server
39
+ ```
40
+
41
+ ### Installation in VS Code
42
+
43
+ Install the Accessibility Scanner in VS Code using the VS Code CLI:
44
+
45
+ For VS Code:
46
+ ```bash
47
+ code --add-mcp '{"name":"accessibility-scanner","command":"npx","args":["mcp-accessibility-scanner"]}'
48
+ ```
49
+
50
+ For VS Code Insiders:
51
+ ```bash
52
+ code-insiders --add-mcp '{"name":"accessibility-scanner","command":"npx","args":["mcp-accessibility-scanner"]}'
53
+ ```
54
+
55
+ ## Configuration
56
+
57
+ Here's the Claude Desktop configuration:
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "accessibility-scanner": {
63
+ "command": "npx",
64
+ "args": ["-y", "mcp-accessibility-scanner"]
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ## Usage
71
+
72
+ The scanner exposes a single tool `scan_accessibility` that accepts:
73
+
74
+ - `url`: The webpage URL to scan (required)
75
+ - `violationsTag`: Array of accessibility violation tags to check (required)
76
+ - `viewport`: Optional object to customize the viewport size
77
+ - `width`: number (default: 1920)
78
+ - `height`: number (default: 1080)
79
+ - `shouldRunInHeadless`: Optional boolean to control headless mode (default: true)
80
+
81
+ **Note: When running a scan, an annotated screenshot highlighting any accessibility violations will be automatically saved to your downloads folder.**
82
+
83
+ Example usage in Claude:
84
+ ```
85
+ Could you scan example.com for accessibility issues related to color contrast?
86
+ ```
87
+
88
+ Advanced example with custom options:
89
+ ```
90
+ Could you scan example.com for accessibility issues with a viewport of 1280x720 and show the browser window?
91
+ ```
92
+
93
+ ## Development
94
+
95
+ Clone and set up the project:
96
+ ```bash
97
+ git clone https://github.com/JustasMonkev/mcp-accessibility-scanner.git
98
+ cd mcp-accessibility-scanner
99
+ npm install
100
+ ```
101
+
102
+ Start the TypeScript compiler in watch mode:
103
+ ```bash
104
+ npm run watch
105
+ ```
106
+
107
+ Test the MCP server locally:
108
+ ```bash
109
+ npm run inspector
110
+ ```
111
+
112
+ ### Docker Development
113
+
114
+ For development using Docker:
115
+
116
+ 1. Build the development image:
117
+ ```bash
118
+ docker build -t mcp-server-dev .
119
+ ```
120
+
121
+ 2. Run with volume mounting for live code changes:
122
+ ```bash
123
+ docker run -it -v $(pwd):/app -p 3000:3000 -e MCP_PROXY_DEBUG=true mcp-server-dev
124
+ ```
125
+
126
+ ## Project Structure
127
+
128
+ ```
129
+ ├── src/ # Source code
130
+ ├── index.ts # MCP server setup and tool definitions
131
+ └── scanner.ts # Core scanning functionality
132
+ ├── build/ # Compiled JavaScript output
133
+ ├── Dockerfile # Docker configuration for containerized setup
134
+ ├── package.json # Project configuration and dependencies
135
+ └── tsconfig.json # TypeScript configuration
136
+ ```
137
+
138
+ ## License
139
+
140
+ MIT
141
+
@@ -23,56 +23,55 @@ function scanViolations(url_1, violationsTag_1) {
23
23
  const browser = yield playwright_1.chromium.launch({
24
24
  headless: shouldRunInHeadless,
25
25
  args: [
26
- '--disable-blink-features=AutomationControlled',
27
- '--disable-dev-shm-usage',
28
- '--no-sandbox',
29
- '--disable-setuid-sandbox',
30
- ]
26
+ "--disable-blink-features=AutomationControlled",
27
+ "--disable-dev-shm-usage",
28
+ "--no-sandbox",
29
+ "--disable-setuid-sandbox",
30
+ ],
31
31
  });
32
32
  const context = yield browser.newContext({
33
33
  viewport,
34
- userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
34
+ userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
35
35
  });
36
36
  const page = yield context.newPage();
37
37
  yield page.goto(url);
38
38
  yield page.addStyleTag({
39
- content: `
40
- .a11y-violation {
41
- position: relative !important;
42
- outline: 4px solid #FF4444 !important;
43
- margin: 2px !important;
44
- }
45
- .violation-number {
46
- position: absolute !important;
47
- top: -12px !important;
48
- left: -12px !important;
49
- background: #FF4444;
50
- color: white !important;
51
- width: 25px;
52
- height: 25px;
53
- border-radius: 50%;
54
- display: flex !important;
55
- align-items: center;
56
- justify-content: center;
57
- font-weight: bold;
58
- font-size: 14px;
59
- z-index: 10000;
60
- }
61
- .a11y-violation-info {
62
- position: absolute !important;
63
- background: #333333 !important;
64
- color: white !important;
65
- padding: 12px !important;
66
- border-radius: 4px !important;
67
- font-size: 14px !important;
68
- max-width: 300px !important;
69
- z-index: 9999 !important;
70
- box-shadow: 0 2px 10px rgba(0,0,0,0.3);
71
- }
72
- `
39
+ content: `
40
+ .a11y-violation {
41
+ position: relative !important;
42
+ outline: 4px solid #FF4444 !important;
43
+ margin: 2px !important;
44
+ }
45
+ .violation-number {
46
+ position: absolute !important;
47
+ top: -12px !important;
48
+ left: -12px !important;
49
+ background: #FF4444;
50
+ color: white !important;
51
+ width: 25px;
52
+ height: 25px;
53
+ border-radius: 50%;
54
+ display: flex !important;
55
+ align-items: center;
56
+ justify-content: center;
57
+ font-weight: bold;
58
+ font-size: 14px;
59
+ z-index: 10000;
60
+ }
61
+ .a11y-violation-info {
62
+ position: absolute !important;
63
+ background: #333333 !important;
64
+ color: white !important;
65
+ padding: 12px !important;
66
+ border-radius: 4px !important;
67
+ font-size: 14px !important;
68
+ max-width: 300px !important;
69
+ z-index: 9999 !important;
70
+ box-shadow: 0 2px 10px rgba(0,0,0,0.3);
71
+ }
72
+ `,
73
73
  });
74
- const axe = new playwright_2.AxeBuilder({ page })
75
- .withTags(violationsTag);
74
+ const axe = new playwright_2.AxeBuilder({ page }).withTags(violationsTag);
76
75
  const results = yield axe.analyze();
77
76
  let violationCounter = 1;
78
77
  for (const violation of results.violations) {
@@ -80,28 +79,28 @@ function scanViolations(url_1, violationsTag_1) {
80
79
  try {
81
80
  const targetSelector = node.target[0];
82
81
  const selector = Array.isArray(targetSelector)
83
- ? targetSelector.join(' ')
82
+ ? targetSelector.join(" ")
84
83
  : targetSelector;
85
84
  yield page.evaluate(({ selector, violationData, counter }) => {
86
85
  const elements = document.querySelectorAll(selector);
87
- elements.forEach(element => {
86
+ elements.forEach((element) => {
88
87
  // Create number badge directly on the element
89
- const numberBadge = document.createElement('div');
90
- numberBadge.className = 'violation-number';
88
+ const numberBadge = document.createElement("div");
89
+ numberBadge.className = "violation-number";
91
90
  numberBadge.textContent = counter.toString();
92
91
  // Add violation styling
93
- element.classList.add('a11y-violation');
92
+ element.classList.add("a11y-violation");
94
93
  element.appendChild(numberBadge);
95
94
  // Create info box
96
- const listItem = document.createElement('div');
97
- listItem.style.marginBottom = '15px';
98
- listItem.innerHTML = `
99
- <div style="color: #FF4444; font-weight: bold;">
100
- Violation #${counter}: ${violationData.impact.toUpperCase()}
101
- </div>
102
- <div style="margin: 5px 0; font-size: 14px;">
103
- ${violationData.description}
104
- </div>
95
+ const listItem = document.createElement("div");
96
+ listItem.style.marginBottom = "15px";
97
+ listItem.innerHTML = `
98
+ <div style="color: #FF4444; font-weight: bold;">
99
+ Violation #${counter}: ${violationData.impact.toUpperCase()}
100
+ </div>
101
+ <div style="margin: 5px 0; font-size: 14px;">
102
+ ${violationData.description}
103
+ </div>
105
104
  `;
106
105
  // Position info box relative to element
107
106
  document.body.appendChild(listItem);
@@ -113,9 +112,9 @@ function scanViolations(url_1, violationsTag_1) {
113
112
  selector: selector,
114
113
  violationData: {
115
114
  impact: violation.impact,
116
- description: violation.description
115
+ description: violation.description,
117
116
  },
118
- counter: violationCounter
117
+ counter: violationCounter,
119
118
  });
120
119
  violationCounter++;
121
120
  }
@@ -133,16 +132,16 @@ function scanViolations(url_1, violationsTag_1) {
133
132
  element: node.target[0],
134
133
  impactLevel: violation.impact,
135
134
  description: violation.description,
136
- wcagCriteria: (_a = violation.tags) === null || _a === void 0 ? void 0 : _a.join(', '),
135
+ wcagCriteria: (_a = violation.tags) === null || _a === void 0 ? void 0 : _a.join(", "),
137
136
  });
138
137
  }
139
138
  }
140
- const filePath = node_path_1.default.join(node_path_1.default.join(node_os_1.default.homedir(), 'Downloads'), `a11y-report-${Date.now()}.png`);
139
+ const filePath = node_path_1.default.join(node_path_1.default.join(node_os_1.default.homedir(), "Downloads"), `a11y-report-${Date.now()}.png`);
141
140
  const screenshot = yield page.screenshot({
142
141
  path: filePath,
143
142
  fullPage: true,
144
143
  });
145
- const base64Screenshot = screenshot.toString('base64');
144
+ const base64Screenshot = screenshot.toString("base64");
146
145
  yield browser.close();
147
146
  return { report, base64Screenshot };
148
147
  });
package/build/index.js CHANGED
@@ -14,31 +14,33 @@ const accessibilityChecker_1 = require("./accessibilityChecker");
14
14
  const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
15
15
  const server = new mcp_js_1.McpServer({
16
16
  name: "Accessibility Information",
17
- version: "1.0.0"
17
+ version: "1.0.0",
18
18
  });
19
19
  server.tool("scan_accessibility", {
20
20
  url: zod_1.z.string().url(),
21
21
  violationsTag: zod_1.z.array(zod_1.z.string()),
22
- viewport: zod_1.z.object({
22
+ viewport: zod_1.z
23
+ .object({
23
24
  width: zod_1.z.number().default(1920),
24
- height: zod_1.z.number().default(1080)
25
- }).optional(),
26
- shouldRunInHeadless: zod_1.z.boolean().default(true)
25
+ height: zod_1.z.number().default(1080),
26
+ })
27
+ .optional(),
28
+ shouldRunInHeadless: zod_1.z.boolean().default(true),
27
29
  }, (_a) => __awaiter(void 0, [_a], void 0, function* ({ url, violationsTag, viewport, shouldRunInHeadless }) {
28
30
  const { report, base64Screenshot } = yield (0, accessibilityChecker_1.scanViolations)(url, violationsTag, viewport, shouldRunInHeadless);
29
31
  return {
30
32
  content: [
31
33
  {
32
34
  type: "text",
33
- text: JSON.stringify(Object.assign({ message: 'The image has been saved to your downloads.' }, report), null, 2)
35
+ text: JSON.stringify(Object.assign({ message: "The image has been saved to your downloads." }, report), null, 2),
34
36
  },
35
37
  {
36
38
  type: "image",
37
39
  data: base64Screenshot,
38
- mimeType: "image/png"
39
- }
40
+ mimeType: "image/png",
41
+ },
40
42
  ],
41
- isError: false
43
+ isError: false,
42
44
  };
43
45
  }));
44
46
  exports.default = server;
package/build/server.js CHANGED
@@ -20,23 +20,23 @@ function main() {
20
20
  const transport = new stdio_js_1.StdioServerTransport();
21
21
  yield index_1.default.connect(transport);
22
22
  try {
23
- console.error('Starting MCP Accessibility checker server...');
24
- console.error('MCP server connected successfully');
23
+ console.error("Starting MCP Accessibility checker server...");
24
+ console.error("MCP server connected successfully");
25
25
  }
26
26
  catch (error) {
27
- console.error('Error starting server:', error);
27
+ console.error("Error starting server:", error);
28
28
  if (error instanceof Error) {
29
- console.error('Error stack:', error.stack);
29
+ console.error("Error stack:", error.stack);
30
30
  }
31
31
  process.exit(1);
32
32
  }
33
33
  // Handle process events
34
- process.on('disconnect', () => {
35
- console.error('Process disconnected');
34
+ process.on("disconnect", () => {
35
+ console.error("Process disconnected");
36
36
  process.exit(0);
37
37
  });
38
- process.on('uncaughtException', (error) => {
39
- console.error('Uncaught exception:', error);
38
+ process.on("uncaughtException", (error) => {
39
+ console.error("Uncaught exception:", error);
40
40
  process.exit(1);
41
41
  });
42
42
  // Keep the process running
@@ -44,7 +44,7 @@ function main() {
44
44
  });
45
45
  }
46
46
  // Start the server
47
- main().catch(error => {
48
- console.error('Fatal error:', error);
47
+ main().catch((error) => {
48
+ console.error("Fatal error:", error);
49
49
  process.exit(1);
50
50
  });
package/package.json CHANGED
@@ -1,53 +1,54 @@
1
- {
2
- "name": "mcp-accessibility-scanner",
3
- "version": "1.0.7",
4
- "description": "A Model Context Protocol (MCP) server for performing automated accessibility scans of web pages using Playwright and Axe-core",
5
- "main": "build/index.js",
6
- "types": "build/index.d.ts",
7
- "bin": {
8
- "mcp-accessibility-scanner": "build/server.js"
9
- },
10
- "files": [
11
- "build/**/*",
12
- "README.md",
13
- "LICENSE"
14
- ],
15
- "scripts": {
16
- "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755') && require('fs').chmodSync('build/server.js', '755')\"",
17
- "prepare": "npm run build",
18
- "watch": "tsc --watch",
19
- "inspector": "npx @modelcontextprotocol/inspector build/index.js"
20
- },
21
- "dependencies": {
22
- "@axe-core/playwright": "^4.10.1",
23
- "@modelcontextprotocol/sdk": "^1.4.1",
24
- "@playwright/test": "^1.52.0"
25
- },
26
- "devDependencies": {
27
- "@types/node": "^22.10.7",
28
- "ts-node": "^10.9.2",
29
- "typescript": "^5.5.3"
30
- },
31
- "keywords": [
32
- "mcp",
33
- "accessibility",
34
- "a11y",
35
- "wcag",
36
- "axe-core",
37
- "playwright",
38
- "claude",
39
- "model-context-protocol"
40
- ],
41
- "author": "",
42
- "license": "MIT",
43
- "repository": {
44
- "type": "git",
45
- "url": "git+https://github.com/JustasMonkev/mcp-accessibility-scanner.git"
46
- },
47
- "engines": {
48
- "node": ">=16.0.0"
49
- },
50
- "publishConfig": {
51
- "access": "public"
52
- }
53
- }
1
+ {
2
+ "name": "mcp-accessibility-scanner",
3
+ "version": "1.0.8",
4
+ "description": "A Model Context Protocol (MCP) server for performing automated accessibility scans of web pages using Playwright and Axe-core",
5
+ "main": "build/index.js",
6
+ "types": "build/index.d.ts",
7
+ "bin": {
8
+ "mcp-accessibility-scanner": "build/server.js"
9
+ },
10
+ "files": [
11
+ "build/**/*",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755') && require('fs').chmodSync('build/server.js', '755')\"",
17
+ "prepare": "npm run build",
18
+ "watch": "tsc --watch",
19
+ "inspector": "npx @modelcontextprotocol/inspector build/index.js"
20
+ },
21
+ "dependencies": {
22
+ "@axe-core/playwright": "^4.10.2",
23
+ "@modelcontextprotocol/sdk": "^1.13.0",
24
+ "@playwright/test": "^1.53.1"
25
+ },
26
+ "devDependencies": {
27
+ "@biomejs/biome": "2.0.4",
28
+ "@types/node": "^24.0.3",
29
+ "ts-node": "^10.9.2",
30
+ "typescript": "^5.8.3"
31
+ },
32
+ "keywords": [
33
+ "mcp",
34
+ "accessibility",
35
+ "a11y",
36
+ "wcag",
37
+ "axe-core",
38
+ "playwright",
39
+ "claude",
40
+ "model-context-protocol"
41
+ ],
42
+ "author": "",
43
+ "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/JustasMonkev/mcp-accessibility-scanner.git"
47
+ },
48
+ "engines": {
49
+ "node": ">=16.0.0"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ }
54
+ }