Skip to main content
Glama
README.md
# aria-mcp

A Model Context Protocol (MCP) server providing comprehensive access to the W3C WAI-ARIA specification. Designed for accessibility professionals, developers, and AI agents to query ARIA roles, states, properties, and accessibility requirements.

## Quick Start

Add to your MCP client configuration:

```json
{
  "mcpServers": {
    "aria": {
      "command": "npx",
      "args": ["-y", "aria-mcp"]
    }
  }
}
```

That's it! No cloning, no building - just add the config and start querying ARIA.

## Features

- **Complete ARIA 1.3 Specification Data**: Roles, states, properties, and their relationships
- **Role Validation**: Check attribute validity for specific roles
- **Accessibility Guidance**: Name requirements, landmarks, live regions
- **Smart Suggestions**: Get role recommendations based on UI component descriptions
- **Works Locally & Remotely**: stdio transport for local use, Netlify Functions for remote deployment

## Available Tools

| Tool | Description |
|------|-------------|
| **Role Information** | |
| `get-role` | Get detailed information about a specific ARIA role |
| `list-roles` | List all ARIA roles, optionally filtered by category |
| `search-roles` | Search for roles by keyword in name or description |
| `get-role-hierarchy` | Get the inheritance hierarchy for a role |
| **States & Properties** | |
| `get-attribute` | Get details about an ARIA state or property |
| `list-states` | List all ARIA states with descriptions |
| `list-properties` | List all ARIA properties, optionally global only |
| `get-global-attributes` | List all global ARIA states and properties |
| **Validation** | |
| `validate-role-attributes` | Validate if attributes are allowed for a role |
| `get-required-attributes` | Get required attributes for a role |
| `get-prohibited-attributes` | Get prohibited attributes for a role |
| **Role Relationships** | |
| `get-required-context` | Get required parent context for a role |
| `get-required-owned` | Get required child elements for a role |
| **Accessible Name** | |
| `check-name-requirements` | Check accessible name requirements for a role |
| `get-roles-requiring-name` | List all roles that require an accessible name |
| **Specialized Queries** | |
| `list-landmarks` | List all ARIA landmark roles with usage guidance |
| `list-widget-roles` | List interactive widget roles |
| `list-live-regions` | List live region roles with politeness levels |
| **Guidance** | |
| `suggest-role` | Get role suggestions based on UI component description |
| `get-aria-version` | Get ARIA specification version and statistics |
| `get-server-info` | Get information about this MCP server |

## Installation

```bash
npm install
```

### Configure Claude Desktop

Add this to your Claude Desktop MCP settings (`~/Library/Application Support/Claude/claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "aria-mcp": {
      "command": "node",
      "args": ["/path/to/aria-mcp/src/index.js"]
    }
  }
}
```

### Configure Cursor

Add to your Cursor MCP settings:

```json
{
  "mcpServers": {
    "aria-mcp": {
      "command": "node",
      "args": ["/path/to/aria-mcp/src/index.js"]
    }
  }
}
```

## Usage Examples

### Query a Role

```
get-role button
```

Returns complete information about the button role including:
- Description and purpose
- Category (widget, landmark, etc.)
- Required/supported/prohibited attributes
- Name requirements
- Parent/child role requirements

### Validate Attributes

```
validate-role-attributes role=button attributes=["aria-pressed","aria-expanded","aria-label"]
```

Checks if each attribute is valid, required, or prohibited for the role.

### Get Role Suggestions

```
suggest-role "dropdown menu with autocomplete"
```

Returns suggested roles (combobox, listbox) with usage guidance.

### List Landmarks

```
list-landmarks
```

Lists all ARIA landmark roles with best practices for page structure.

## Data Source

This MCP server uses data parsed directly from the [W3C ARIA repository](https://github.com/w3c/aria), which is included as a Git submodule.

### Updating the Data

To update to the latest ARIA specification:

```bash
npm run update-submodule
```

This will:
1. Pull the latest changes from the W3C ARIA repository
2. Re-parse the specification to regenerate `data/aria-data.json`

### Manual Parsing

To regenerate the data without updating the submodule:

```bash
npm run parse
```

## Project Structure

```
aria-mcp/
├── src/
│   ├── index.js          # MCP server with stdio transport
│   └── tools.js          # Tool definitions and handlers
├── scripts/
│   └── parse-aria-spec.js # Parser for W3C ARIA HTML specs
├── data/
│   ├── aria/             # W3C ARIA repo (Git submodule)
│   └── aria-data.json    # Parsed specification data
├── netlify/
│   └── functions/
│       └── api.js        # Netlify Function for remote use
└── netlify.toml          # Netlify configuration
```

## Deployment to Netlify

This project is configured for Netlify deployment.

### Deploy via GitHub

1. Push this repository to GitHub
2. Connect to Netlify via the dashboard
3. Netlify will automatically build and deploy

### Using the Remote Server

Once deployed, configure your MCP client:

```json
{
  "mcpServers": {
    "aria-mcp": {
      "command": "npx",
      "args": ["mcp-remote@next", "https://your-site.netlify.app/mcp"]
    }
  }
}
```

## Use Cases

### For Accessibility Professionals

- **Quick Reference**: Look up role requirements without leaving your IDE
- **Validation**: Verify ARIA usage in code reviews
- **Training**: Help team members understand ARIA semantics

### For Developers

- **Real-time Guidance**: Get role suggestions while building components
- **Attribute Validation**: Catch invalid ARIA usage early
- **Documentation**: Access spec details without browser context switching

### For AI Agents

- **Code Generation**: Generate accessible components with correct ARIA
- **Code Review**: Validate ARIA usage in pull requests
- **Accessibility Audits**: Check for missing or incorrect attributes

## ARIA Specification Coverage

- **100 Roles**: All roles from WAI-ARIA 1.3
- **10 States**: Dynamic values that change with user interaction
- **43 Properties**: Static or rarely-changing characteristics
- **Role Categories**: widget, composite, document, landmark, liveRegion, window, abstract

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Run `npm run parse` if modifying the parser
5. Submit a pull request

## License

MIT

## Resources

- [WAI-ARIA Specification](https://w3c.github.io/aria/)
- [ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/)
- [Model Context Protocol](https://modelcontextprotocol.io/)

TDQS

A3.6/5.0

Scored across 21 tools

Disambiguation5/5

Every tool has a clearly distinct purpose focused on specific aspects of ARIA (roles, attributes, validation, etc.). There is no overlap in functionality, with tools like get-role, get-attribute, and validate-role-attributes each serving unique but complementary purposes. The descriptions further clarify boundaries, making misselection unlikely.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern throughout, using hyphens as separators (e.g., get-role, list-roles, validate-role-attributes). The verbs are predictable (get, list, check, search, suggest), and the nouns clearly indicate the target resource (role, attribute, landmarks). There are no deviations in naming conventions.

Tool Count4/5

With 21 tools, the count is slightly high but reasonable for the comprehensive scope of ARIA accessibility, covering roles, attributes, validation, and guidance. Each tool earns its place by addressing specific queries, though some consolidation might be possible (e.g., multiple list-* tools). It supports thorough exploration without being overwhelming.

Completeness5/5

The toolset provides complete coverage of the ARIA domain, including CRUD-like operations (get, list, validate), hierarchical relationships (get-role-hierarchy), requirements (required attributes, context), and practical utilities (suggest-role, check-name-requirements). There are no obvious gaps; agents can handle all common ARIA-related tasks without dead ends.

Maintenance

ActivityActive
ResponsivenessNo issues