Quick Links
Project Structure
Detailed explanation of the codebase organization
Creating Tools
Guide for creating new accessibility tools
GitHub Repository
View the source code and open issues
Report Issues
Report bugs or request features
Requirements
Node.js ≥ 20
Check version in
.nvmrcpnpm
Package manager (v10.26.2+)
Chrome/Chromium
Automatically downloaded by Puppeteer
Getting Started
Available Scripts
| Script | Description |
|---|---|
pnpm build | Build the project with tsup |
pnpm dev | Watch mode - rebuilds on file changes |
pnpm start | Run the compiled MCP server |
pnpm typecheck | Run TypeScript type checking |
pnpm clean | Remove the dist folder |
pnpm format | Format code with Prettier |
pnpm format:check | Check code formatting |
pnpm test | Run tests once |
pnpm test:watch | Run tests in watch mode |
pnpm test:coverage | Run tests with coverage report |
pnpm inspect | Build and open MCP Inspector for debugging |
Development Workflow
Create a feature branch
feature/add-wcag-3-supportfix/contrast-calculation-bugdocs/improve-setup-guide
Make your changes
Follow the project conventions:
- Use TypeScript strict mode
- Follow existing code style
- Add tests for new functionality
- Update documentation
Debug with MCP Inspector
Commit your changes
feat:New featurefix:Bug fixdocs:Documentationrefactor:Code refactoringtest:Testschore:Build/tooling
Code Style
TypeScript
Naming Conventions
Folders
Folders
- Tool folders: PascalCase (
Axe,Pa11y,AnalyzeMixed) - Subfolders: lowercase (
adapters,normalizers,types,utils)
Files
Files
- Use kebab-case or toolname.category.ts pattern
- Examples:
main.ts,index.ts,pa11y.adapter.ts,axe.types.ts - Each subfolder must have
index.tsthat re-exports - JSON files: kebab-case (
wcag-criteria.json)
Variables and Functions
Variables and Functions
- Variables/functions: camelCase (
analyzeUrl,issueCount) - Constants: UPPER_SNAKE_CASE (
DEFAULT_TIMEOUT,MAX_RETRIES) - Interfaces/Types: PascalCase (
AnalysisResult,ToolConfig) - Enums: PascalCase for name, PascalCase for values
Formatting
Prettier handles formatting automatically:- 2 spaces indentation
- Single quotes
- Trailing commas
- Semicolons
Testing
Tests are located intests/, mirroring the src/ structure.
Running Tests
Writing Tests
Test Helpers
| Helper | Location | Purpose |
|---|---|---|
mock-server.ts | tests/helpers/ | Mock MCP server for tool testing |
mock-prompt-server.ts | tests/helpers/ | Mock server for prompt testing |
mock-resource-server.ts | tests/helpers/ | Mock server for resource testing |
html-fixtures.ts | tests/fixtures/ | HTML fixtures for testing |
axe-fixtures.ts | tests/fixtures/ | Mock axe-core results |
Debugging with MCP Inspector
The MCP Inspector is a powerful tool for testing your changes:Test tools
In the inspector:
- Select a tool from the dropdown
- Fill in the parameters (url, options, etc.)
- Click “Call Tool”
- View the response
Test prompts
- Select a prompt from the dropdown
- Fill in the arguments
- Click “Get Prompt”
- View the generated prompt text
Pull Request Guidelines
Before Submitting
Update documentation
If adding new features:
- Update relevant docs in
docs/ - Add JSDoc comments to public APIs
- Update CHANGELOG.md if applicable
PR Description Template
Review Process
- Automated checks run on PR creation (build, tests, linting)
- Code review by maintainers
- Testing by maintainers with MCP Inspector
- Merge once approved and checks pass
Project Structure
For detailed information about the codebase organization, see:Project Structure
Comprehensive guide to the project’s architecture and organization
Creating New Tools
For step-by-step instructions on creating new accessibility tools:Creating Tools
Guide for creating new tools following the project conventions
Questions?
If you have questions or need help:Open an Issue
Ask questions or report problems
Discussions
Join the community discussion
Code of Conduct
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Key principles:- Be respectful and inclusive
- Welcome newcomers
- Accept constructive criticism gracefully
- Focus on what is best for the community