AI assistants and MCP
Inclusify runs an MCP server, so an AI assistant can read your scans and check your own pages while you talk to it. Ask whether your checkout works with a keyboard, or what a screen reader makes of a product page, and get an answer about your site rather than a general explanation of WCAG.
Sizing it up rather than setting it up? Inclusify for AI agents covers what an assistant can do here, including the parts that need no MCP client at all.
Quick start
One endpoint, and OAuth sign-in in the browser. Nothing to register, no key to paste.
https://app.inclusifyapp.com/api/mcp/customerOpens Cursor, fills in the server for you, and asks you to sign in with Inclusify. Cursor has to be installed on this machine for the link to do anything.
Using something else? Setup for Claude, Claude Code, ChatGPT, Codex, VS Code, Devin Desktop and Antigravity.
Set it up in your client
Any client that speaks MCP over HTTP with OAuth works: point it at the endpoint and it discovers where to sign in on its own. The transport is streamable HTTP, and the server is stateless, so a client may reconnect whenever it likes.
Claude web and desktop
Customize → Connectors → Add custom connector, then paste the endpoint. A window opens asking you to sign in to Inclusify and approve access; after that the tools appear in the attachments menu of a new chat. Custom connectors are available on Free, Pro, Max, Team and Enterprise, with Free limited to one. On Team and Enterprise an Owner has to add the connector under Organization settings → Connectors before anyone else can connect it. Claude reaches this endpoint from Anthropic's cloud rather than from your browser.
https://app.inclusifyapp.com/api/mcp/customerClaude Code
Run this in your project, then approve the sign-in in the browser window it opens. --scope takes local (the default), project or user; user is the one that makes it available in every project instead of the current one. claude mcp login inclusify runs the sign-in again from the shell without starting a session, and claude mcp logout inclusify clears it.
claude mcp add --transport http inclusify https://app.inclusifyapp.com/api/mcp/customerCursor
Use the install link above, or add the server by hand in Settings → MCP → Add new MCP server. Cursor stores it in ~/.cursor/mcp.json for every project, or .cursor/mcp.json inside one project.
{
"mcpServers": {
"inclusify": {
"url": "https://app.inclusifyapp.com/api/mcp/customer"
}
}
}ChatGPT
Turn on developer mode in settings, then add the endpoint as a custom connector and choose OAuth as the authentication method. Developer mode and a paid plan are both needed; on a free account the option is not shown. Every tool on this server is usable: the old rule that a connector could only expose search and fetch has been lifted. ChatGPT fixes the tool list at the moment you approve the connector, so tools added later need a re-review before they show up.
https://app.inclusifyapp.com/api/mcp/customerOpenAI Codex
The first command writes the server into ~/.codex/config.toml, as an [mcp_servers.inclusify] section with a url key; the second opens the browser sign-in. Authentication is OAuth by default and the login command holds the token, so nothing secret goes in the file. Use .codex/config.toml inside a project to scope it there instead. The ChatGPT desktop app, the Codex CLI and the IDE extension read the same configuration, so this one setup covers all three.
codex mcp add inclusify --url https://app.inclusifyapp.com/api/mcp/customer
codex mcp login inclusifyVS Code
One command adds it to your user profile, then pick the Agent role in chat.
code --add-mcp '{"name":"inclusify","type":"http","url":"https://app.inclusifyapp.com/api/mcp/customer"}'Devin Desktop (formerly Windsurf)
Windsurf became Devin Desktop in June 2026. New tabs use the Devin Local agent, which takes its MCP servers from the Devin CLI, so these two commands are the whole setup: sign-in is OAuth 2.1 with dynamic client registration, and there is no client id or secret to paste. The server lands in .devin/mcp_config.local.json, which is gitignored; write it to .devin/mcp_config.json to share it with the project, or ~/.config/devin/mcp_config.json to have it everywhere. A remote server needs only url, and transport defaults to http for streamable HTTP, which is what this endpoint speaks. If a server answers with a 4xx the CLI retries as sse on the same URL.
devin mcp add inclusify https://app.inclusifyapp.com/api/mcp/customer
devin mcp login inclusifyCascade, which the documentation now labels the legacy agent, is configured separately: the MCP settings under Settings → Cascade → MCP servers apply to Cascade alone, and the Devin Local agent above is the default for new tabs. On Cascade, add a custom server with either a serverUrl or a url field. Cascade also caps the tools it can reach at 100 at any one time across every server it has, which is worth knowing before adding a fourth or fifth server alongside this one.
{
"mcpServers": {
"inclusify": {
"serverUrl": "https://app.inclusifyapp.com/api/mcp/customer"
}
}
}Antigravity
Edit the configuration file, or open the interactive MCP manager with /mcp in the CLI. The IDE, the CLI and the SDK all read the same file: the global one below, or .agents/mcp_config.json to scope the server to one workspace. The field is serverUrl; url and httpUrl are not supported here.
{
"mcpServers": {
"inclusify": {
"serverUrl": "https://app.inclusifyapp.com/api/mcp/customer"
}
}
}Antigravity CLI replaced Gemini CLI on 18 June 2026 for Google AI Pro and Ultra and for free Gemini Code Assist individuals. Organisations on a Gemini Code Assist Standard or Enterprise licence keep Gemini CLI, and it is still supported for them. There the file and the field are the old ones:
{
"mcpServers": {
"inclusify": {
"httpUrl": "https://app.inclusifyapp.com/api/mcp/customer"
}
}
}Anything else
Clients converge on the same shape. If yours takes a JSON configuration, the block below is almost always what it wants. Check its own documentation for the file it lives in and whether the field is called url, serverUrl or httpUrl.
{
"mcpServers": {
"inclusify": {
"url": "https://app.inclusifyapp.com/api/mcp/customer"
}
}
}What the first connection looks like
The client registers itself
You sign in, or create an account
You approve what the client gets
The tools appear
Only members of the organisation that owns a website can ask about it. Removing someone takes effect on their next question rather than whenever their token happens to expire.
What you can ask
- “Where do we stand on example.com, and is anything stopping the scans from running?”
- “Is the checkout on example.com usable with a keyboard only?”
- “Read me the product page the way a screen reader would, and tell me what is confusing.”
- “What breaks on our homepage at 400% zoom?”
- “Which images on example.com have alt text that says nothing, and what should they say?”
- “Give me the fix list for example.com, and tell me which of our templates to search for each one.”
- “Here is the markup I am about to deploy for that contrast failure. Does it actually fix it?”
- “Has the score on our category page moved since last month, and which scan did it move on?”
Before it can answer any of them
- The website has to be in your account
- An assistant only sees websites in the workspace you sign in with, and every question names one. Asking about a domain you have not added returns “no website by that name here” rather than scanning a stranger’s site.
- The plan gate is per website, and per tool
- Connecting works on any plan, and every tool is listed whatever the website is on, because one account can hold sites on different plans and the same tool can work for one website and not another. A call the plan does not cover comes back naming the plan it needs rather than failing. Where the site stands, what the plan is, and whether the widget is on answer on every plan including Free. Monitored pages and their history need Starter. Everything that says what is actually wrong with a site, every check that loads a page, and the full-site crawl need Pro. Of the four account-wide tools, org_rollup and org_findings need Enterprise, while list_websites and add_website need no plan at all, because finding out what the account holds and putting the first website into it are the two things every account has to be able to do.
- There is no API key to paste into an assistant
- You sign in with Inclusify once, in the browser, and the client holds the authorization from then on. A build pipeline is the exception, because it has no browser to sign in with: it uses a service credential created in the panel under Integrations and sent as an Authorization header. Those are issued read-only or read-write, and can be pinned to a single website.
- A never-scanned site has no score
- That is different from a good score, and the tools say which of the two you are looking at. The first monitoring pass usually lands within a day of adding pages.
The 36 tools
32 answer about one website, 4 answer across every website in the account. 32 read only; the four that write — add_monitored_pages, start_crawl, set_widget_enabled, add_website — are named as such. You do not pick between them, you ask the question and the assistant chooses. Open a row for what it knows and what it deliberately does not.
Understand where you stand
Broad questions, answered from what is already on record. None of these loads a page. Most work on every plan including Free - compliance_status and widget_usage need Pro, and score_history needs Starter.
What to do next on a website, in the order it actually matters next_steps
An ordered, ranked list of concrete next actions, each naming the tool or panel page that does it, why it sits where it does, and whether anything below it is blocked until it is done. The order is by what BLOCKS, not by impact: a widget that has never reported in outranks a failed payment, which outranks a blocked or failed scan, which outranks reading findings, which outranks upgrading a plan. A step that needs a higher plan is listed with the plan named rather than dropped, so the list never quietly turns into a description of the current plan. It performs none of the steps itself — nothing is scanned, changed or installed — and it names no individual violation; list_violations and the other finding tools own those. Composed from site_overview, so it costs about what that call costs.
The whole current position for one website site_overview
Plan, the headline score and when it was measured, how many pages are checked automatically against how many the plan includes, this month's visitor count against the allowance, whether an accessibility statement is published, whether the widget is switched on, and whether anything is currently stopping scans from running. It reports counts, never individual issues, so start here and then ask for detail. A site that has never been scanned comes back with no score rather than a good one.
The evidence Inclusify holds for a website compliance_status
The accessibility statement — which of the three shapes it is, what compliance status it claims and who attested to it, the standards it names, how the site was assessed, the non-accessible content it lists in its three separate categories, when it was last reviewed and whether that is overdue, where it is published, and the contact details on it — plus the scanning record behind it and an explicit list of the gaps in that record. It answers “what could we show if we were asked”. It reports what is on record and what is missing, and it does not tell you whether a site is legally compliant.
Recorded use of the accessibility widget widget_usage
How many times each widget feature was switched on over a window of days, on how many separate days, and this month's visitor count for context. A zero is reported together with its cause, which matters here: the widget build currently served to sites reports visitors only and does not report which features were switched on, so on most sites a zero means the measurement does not exist rather than that visitors were offered the tools and declined them.
Whether the widget is actually installed, not just switched on widget_status
Two facts that are commonly mistaken for one, kept separate: whether widget serving is enabled in the Inclusify account — a switch that defaults to on for every account before anything has been pasted, and proves nothing by itself — and whether anything has EVER actually arrived from the site, which is the only real evidence that the embed is there. When nothing has ever reported in, it returns the exact script tag to paste before the closing </body> tag, or, on a Shopify store, explains that the widget is a theme app embed switched on from Online Store > Themes > Customize > App embeds in the Shopify admin, a step no assistant can do. It does not fetch or check the site itself, so a just-installed embed nobody has visited yet looks identical to one that was never added.
What plans exist, and what this site would actually get from moving plan_options
Every plan's price, monthly visitor allowance, audited-page allowance and feature list, read live from Inclusify's own configuration rather than recalled — so an assistant is never left guessing a number about somebody's bill — alongside where the current plan's allowances actually stand today. "Should we upgrade" is not answerable from a price list alone: a site using a fraction of what it already pays for usually should not, and that comparison is in the answer rather than left for the reader to work out. Respects who owns billing: an invoice-managed website has no self-serve upgrade at all, and this says so instead of handing over a link that would not work for it. It changes nothing and returns no URL — billing_link is the tool that hands over the link.
The link a human opens to actually change the plan billing_link
The correct billing page for this website's billing owner: Shopify's managed-pricing page inside the merchant's own Shopify admin for a Shopify-billed store, the website's page in the Inclusify panel for one billed through Inclusify directly, or, for an invoice-managed website, no link at all and who to email instead. This composes a URL from data already on hand and never calls the checkout endpoint itself — nothing here creates a checkout session, touches a card or changes a plan. Completing a change needs a human, signed in, in their own browser, and the response says so rather than implying the upgrade has been arranged.
The score day by day score_history
One point per day from the scheduled monitoring scans, with the direction of travel and the change across the window worked out. Pass a URL to follow a single page instead of the site. Full-site crawls are left out, because a crawl is a dated snapshot rather than a series. It knows nothing newer than the last monitoring scan, so it cannot confirm a fix you deployed minutes ago.
Find and fix
The fix loop. Reading findings and checking your markup both cost no browser run, so iterating here is cheap. These need Pro, except page_history, which needs Starter.
The fix list for a website, with what to search for list_violations
One entry per rule rather than per page, worst impact first, each with the impact, the rule id, the WCAG criterion, the help text and its documentation, the failing HTML from one named example page, the computed foreground, background and ratio for a contrast failure, and every page the rule fails on. Each entry also carries the strings taken from the failing elements across all those pages (ids, distinctive classes, visible text, image filenames) that are likely to appear verbatim in your own source, so the assistant can find the template. CSS selectors describe the rendered page and will not appear in any source file.
Check a fix before you deploy it validate_fix
Send the markup you are about to ship, with the rule it targets, and get back resolved, not resolved, masked, or not decidable from markup. “masked” is the answer worth having: deleting the element, adding aria-hidden, hiding it with display:none, dropping the visible text or turning a button into a div all make a scanner go quiet while leaving the barrier in place. It reads markup only, so anything that depends on how the page renders (contrast, focus indicators, forced colours, reduced motion, tap-target size, reflow at zoom, keyboard traps and reading order) comes back not decidable from markup and names the tool that can answer it.
One page's scans over time page_history
Every recorded monitoring scan of a single URL, newest first: score, violations by impact, and how many issue types were fixed and newly introduced since that page's previous scan. This is the tool for “did my fix work” and “when did this page break”, because it names the scan where the score fell. Counts are rule-level, so fixing forty instances of one rule reads as one fixed issue type.
The alt-text findings already on record list_alt_findings
Images with missing, filename-like, vague or inaccurate alt text from the most recent scan, each with the element, the current value, why it was flagged, a suggested replacement and a confidence score.
Unclear wording and structure in your own content list_content_findings
Problems in the text of a Shopify store's own content, meaning product descriptions, pages, articles and collections: link text that does not say where it goes, controls with no label, headings that do not describe what follows, and tables used for layout. Each finding carries the item it is in, the current text, why it was flagged, a suggested replacement where there is one, and an admin link to the exact place to edit. Only Shopify-connected stores have this data, and an empty result says whether a content review has ever run, because “never reviewed” and “reviewed and clean” are different answers.
Check a live page
These load the page in a real browser, so they see the current state of the site and count against the check allowance below. All of them need Pro, which is also the first plan with any browser-check allowance to spend.
What a screen reader announces, in order screen_reader_transcript
The linear reading order, plus the headings, landmarks, links and form-control lists a screen-reader user actually navigates by. Also reports structural problems: reading order that contradicts the visual order, controls whose accessible name does not match their visible label, unlabelled graphics and repeated link names. It is a model of screen-reader output derived from the browser's accessibility tree, not NVDA or VoiceOver output.
Tab through a page and report what breaks keyboard_walk
Focus traps, focus that disappears, missing focus indicators, focus hidden behind sticky headers, tab order that disagrees with the visual or DOM order, interactive elements no keyboard can reach, and custom controls that ignore Enter and Space. Focus indicators are judged by comparing rendered pixels rather than CSS, because an indicator can come from an outline, a shadow, a border or a background. Pierces shadow roots.
Render under a disabling condition simulate_condition
Windows High Contrast (forced colours), 400% zoom at a 320px viewport, reduced motion and phone-sized tap targets. Reports computed failures, such as elements that vanish, text that overflows and animation that keeps running, rather than screenshots to interpret. A condition that could not be applied is reported as skipped rather than passing quietly.
Check the alt text on a page check_page_alt_text
A missing alt attribute (not the same as an empty one), a filename used as alt, a redundant “image of” opener, alt too long to hear in one breath, alt that merely repeats the caption, and an image that is the only content of a link and leaves it with no name. Images correctly marked decorative are counted and deliberately not reported. It can draft replacement text for the images that have none, which is off unless you ask for it because it costs a vision call per image against the site's AI budget.
Collect a check that was still running get_job
Browser-driven checks run on a worker. If one is still going when the call returns, it hands back a job id to collect the result with. Collecting a result costs nothing, because the check itself was already counted.
Coverage
How much of the site is actually being looked at, which is what an empty finding list usually turns out to mean. crawl_summary needs Pro; list_monitored_pages needs Starter.
The most recent full-site crawl crawl_summary
Status, the URL it started from, how many pages it found against how many it scanned, the average score, totals by impact, when it ran, and the worst-scoring pages. Read found against scanned before quoting the average: a crawl audits at most the plan's page allowance, so on a large site the average describes a sample and the tool says so. It returns the most recent crawl whatever its state, including a failed or still-running one, so the numbers can be partial.
Which pages are watched, and whether watching is working list_monitored_pages
The URLs under monitoring, which are paused, when each was last scanned, its last score, and which are failing, unreachable, throttled or overdue. Worth calling before trusting an empty score history: a page that fails every night, or a storefront behind a password, produces no data and reads exactly like a site with nothing wrong. Also reports how many of the plan's audited-page slots are in use.
Widen what is being checked
These two write, and both only add. They change your Inclusify settings, never your website, and neither removes, pauses or edits anything. start_crawl needs Pro; add_monitored_pages needs Starter, the plan that buys the daily scans behind it.
Put more pages on the daily rotation add_monitored_pages
Adds URLs to the set of pages scanned automatically, up to 20 in one call and all on your own domains. A page already on the list is reported back as such rather than added twice or treated as an error. It is all or nothing against the plan's page allowance: if the batch would not fit, nothing is added and the answer says what would. New pages are picked up by the scan queue rather than instantly, so for an answer now, use a crawl or one of the live checks. It never removes or pauses a page, which stays a decision a person makes in the panel.
Queue a full-site crawl start_crawl
Discovers pages from the website's own domain and audits up to the plan's page allowance. It returns straight away with a job id rather than waiting, so the assistant can carry on and collect the outcome later with crawl_summary, then read the findings with list_violations. Safe to ask for twice: if a crawl is already running it hands back the running one instead of starting a second. Asking for more pages than the plan allows is capped, and the answer says it was capped. At most three crawls per website can be started in a day.
Change what visitors see
The one write on this server whose effect a real visitor of the site can see, not just something in your Inclusify account. Treated with more caution than anything above. Works on every plan, because a Free site has a widget too.
Turn the accessibility widget on or off for a website set_widget_enabled
Sets whether the widget bundle served to this site renders the widget or does nothing, purging the edge cache as part of the change so it takes effect within about a minute. The two directions are not treated the same. Turning it ON is immediate and needs no confirmation — the worst case is a widget on a site that did not want one, visible at once and one click to switch off. Turning it OFF removes a live accessibility feature from that site's real visitors, so it REQUIRES CONFIRMATION: call once without "confirm" to get a preview and a single-use token, show the preview to the user, and only call again with that token once they have agreed. On top of the confirmation, the account owner is emailed a record of the change with a link to revert it — so somebody with account access cannot switch it off unnoticed by whoever owns the account. Idempotent: asking for the state it is already in writes nothing, purges no cache and sends no email. Never touches the site's code or theme — on a Shopify store, turning this off does not remove the app embed, it only stops the embed from having anything to render.
In a build pipeline
One call, one verdict, for CI. Needs Enterprise, in the same sense the account-wide tools do: the account has to hold at least one Enterprise website, and the website being judged has to be on Pro or above.
Pass or fail a build on accessibility ci_gate
Turns the last recorded scan into a single pass or fail against your thresholds: a minimum score, a maximum number of critical issues, a maximum number of serious ones, in any combination. With none given it uses a minimum score of 80 and says so. A failure comes back as an ordinary answer rather than an error, so a pipeline reads the verdict instead of retrying. A website with no scan on record fails, because unmeasured is not the same as passing, and every verdict says how many pages the scan it judged actually covered. It reads the record only: nothing is scanned by asking.
Across every site in the account
No website argument, because these answer or act for the whole organisation. org_rollup and org_findings need Enterprise — they are the aggregate view for somebody managing twenty sites. list_websites and add_website need no plan at all: one is how a caller finds out what the account holds, the other is how a website gets into it, and gating either behind a plan the account does not have yet would lock people out of their own starting point.
Register a new domain in the account add_website
Adds a domain as a website in the account on the free plan, and starts nothing: no scan runs, no widget is installed, nothing is charged and no plan changes. Unlike every other tool here it takes no "website" argument, because the point is that the website does not exist in Inclusify yet. REQUIRES CONFIRMATION — call once without "confirm" to see the exact domain that would be registered, then call again with the token once that is confirmed — because a domain can belong to one Inclusify account only, and claiming it takes it from anyone else who might. Idempotent: a domain already in the account comes back as a no-op, not a second website and not an error. Refuses rather than guessing when the account holds more than one workspace, since a website lands in exactly one of them and picking wrong hides it from whoever added it. Capped at 50 websites added this way per account; the Inclusify panel has no such limit.
Every website in the account list_websites
Each site with its plan, its last recorded score and when that scan ran. This is how the assistant finds out which domains exist before asking about one of them.
Scores and finding counts across the account org_rollup
The last recorded score for every website, the average across the ones that have been scanned, open violations by impact, which sites have never been scanned, and the worst sites first. One call instead of one per site.
The worst findings across every website org_findings
Findings from the last recorded scan of every website, worst impact first and grouped by the pattern behind them, so one template fault across forty pages reads as one problem rather than forty. For deciding what to fix once and have fixed everywhere.
Allowances
Two limits per website, both visible in the panel under Integrations.
- Checks run today
- Every check that loads a page counts, including repeats of the same page. Reads of findings already on record have their own, much larger, daily ceiling.
- Pages checked this month
- How many different pages an assistant may check. Equal in size to the plan’s audited-page allowance and separate from it, so a check here never uses up a monitoring slot. Re-checking a page already counted this month is free and unlimited, so verifying a fix always works even at the limit.
A page counts once however you write its URL: a trailing slash, a fragment, a tracking parameter and a differently-cased host are all the same page. When a limit is reached the tool says so in plain words and names the website. It is a final answer for the period rather than an error to retry.
What it cannot do
No tool changes your pages, your product catalogue, your theme or your billing, and none can reach a website outside the workspace you signed in with. Alt text and rewritten copy come back to you as suggestions; nothing is written to your store. Markup you send for checking is read and answered on, not deployed. The one exception to “nothing here touches your website” is set_widget_enabled, below — it never edits code or a theme, but it does change whether the widget renders for real visitors.
Four tools write, and they are not all one shape. add_monitored_pages adds pages to the monitoring rotation, start_crawl queues a crawl, and add_website registers a new domain in the account — all three are add-only: nothing is removed, paused or edited, and none of it is visible to the website’s own visitors. set_widget_enabled is different. Turning the widget on is as harmless as the three tools above. Turning it OFF removes a live accessibility feature from that site’s real visitors, within about a minute, which is why it is the only tool here that requires both a confirm round trip and an email to the account owner with a link to undo it. Removing a monitored page, and any other undo not covered by that revert link, stays in the panel, where a person has to do it.
- Checking a fix reads markup only
- Anything that depends on how the page renders comes back as not decidable from markup, naming the live check that can answer it. So contrast, focus, forced colours, reduced motion, tap-target size, reflow at zoom, keyboard traps and reading order still need the page loaded after you deploy.
- Widget usage cannot report which features visitors switched on
- The widget build currently served to sites reports visitors only, so a zero there is a missing measurement rather than evidence that the tools went unused.
Nothing here states that a website is compliant or certified. The tools report what is on record and what is missing from it, which is the input to that judgement rather than the judgement.
When something is wrong
- The client connects but lists no tools
- Almost always the sign-in did not finish. Disconnect, reconnect, and watch for the browser tab.
- Every answer says you need a plan
- The gate is per website, not per account. Check which plan the website you are asking about is on.
- Copilot shows no Inclusify tools
- Switch Copilot Chat from Ask to Agent mode. Tools are unavailable in Ask mode even when the server is connected.
- An answer looks older than the site
- Most tools read the last recorded scan rather than loading the page. Ask for a live check, or validate the markup of a fix before you deploy it.
Next
- Set it up from your panel for the same URL plus which of your websites it can check.
- What the checks map to in WCAG