---
title: "MCP server documentation"
date: "2026-07-20T06:18:46+00:00"
summary: "Explore the Monsido MCP server: connection config, 13 Web Governance tools for accessibility, spelling, readability, and policy checks."
image:
type: "page"
url: "/web-governance/mcp-server-documentation"
id: "f158f9a5-90e4-4ccd-a548-c371bcc6acff"
---

Table of contents will be added

Introduction
------------

This document provides information about the Web Governance **Monsido MCP server**.

**Field**

**Value**

Endpoint

[https://api.monsido.com/mcp](https://app1.eu.monsido.com/mcp "https://app1.eu.monsido.com/mcp")

Protocol version

`2024-11-05`

Auth

Bearer token (JWT)

Connection configuration (OpenCode and Claude)
----------------------------------------------

`"monsido-mcp-server": {`  
 `"type": "remote",`  
 `"url": "https://api.monsido.com/mcp",`  
 `"headers": {`  
   `"Authorization": "Bearer <JWT token>"`  
 `},`  
 `"enabled": true`  
`}`

The server advertises support for the following: 

*   Tools (with listChanged)
    
*   Prompts (with listChanged)
    
*   Resources
    
*   Logging
    
*   UI extension (\`io.modelcontextprotocol/ui\`)
    

Tools
-----

In the Web Governance suite,13 tools are live. These are grouped by capability area as per the following:

Tool

Area

Input mode

`html_scans`

Accessibility + full scan

Raw HTML + encoded page

`render_by_url_with_guideline`

Accessibility

Live URL

`accessibility_remediation_source_code`

Accessibility remediation

HTML snippets

`spelling_text_snippet`

Spelling

Plain text

`spelling_url`

Spelling

Live URL

`spelling_page_id`

Spelling

Stored page (domain\_id + page\_id)

`readability_text_snippet`

Readability

Plain text

`readability_url`

Readability

Live URL

`readability_page`

Readability

Stored page (domain\_id + page\_id)

`run_policies_snippet`

Policy

Text or HTML snippet

`run_policies_url`

Policy

Live URL

`run_policies_page_id`

Policy

Stored page (domain\_id + page\_id)

`resolve_url_to_ids`

Utility

URL → domain\_id / page\_id

Note

**Input mode pattern:** Most capability areas offer three variants:

*   Live URL
*   Stored Web Governance page (through `domain_id` + `page_id`)
*   Raw text/HTML

Use `resolve_url_to_ids` to look up `domain_id`/`page_id` for any known URL.

Accessibility tools
-------------------

The following sections provide information about the accessibility tools.

### HTML scan

`html_scan`

*   Title: HTML Scan
*   Tags: `accessibility`, `html`, `scan`
*   Read-only: yes
*   Description: The system does a scan on the raw HTML and its page-processing-lib encoded\_page for accessibility, readability, SEO, and data-protection findings. Use this tool when you already have processed page data. Use `render_by_url_with_guideline` for live rendered URL accessibility checks.

#### Input

Parameter

Type

Required

Description

`html`

`string`

✅

This is the raw HTML markup to scan. It must match `encoded_page`.

`encoded_page`

`string`

✅

A page-processing-lib encoded page JSON. See [page-processing-lib](https://github.com/Acquia/page-processing-lib/ "https://github.com/Acquia/page-processing-lib/").

`accessibility`

`string | null`

❌

The WCAG guideline: `WCAG2-A/AA/AAA`, `WCAG21-A/AA/AAA`, `WCAG22-A/AA/AAA`. Omit this input if you want to skip accessibility checks.

`readability_test_min_words`

`integer | null`

❌

The minimum word count that is required for the system to be able to do a readability analysis.

#### Output

Field

Type

Description

`title`

`string`

The page title that the system extracted from the HTML.

`contents`

`object`

The general page content metadata.

`data`

`object`

Structured data that the system finds on the page.

`texts`

`object`

Text content that the system extracts from the page

`readability`

`number | null`

The readability score.

`readability_level`

`string | null`

The human-readable readability level.

`readability_reason`

`string | null`

An explanation of the readability score.

`links`

`array`

Links that the system finds on the page.

`accessibility_errors`

`array`

Accessibility violations (per selected WCAG level).

`seo_issues`

`array`

SEO issues that the system finds.

`data_protection_violations`

`array`

Data protection and privacy violations.

`data_protection_violations_truncated`

`boolean`

Indicates if the system truncated the data protection list.

#### Usage notes

*   Both `html` and `encoded_page` are required, and these must correspond to the same page.
    
*   Omit `accessibility` to get readability, SEO, and data protection results without a WCAG scan.
    

### Render by URL with guideline

`render_by_url_with_guideline`

*   Title: Render By URL With Guideline
    
*   Tags: `accessibility`, `scan`, `url`, `wcag`
    
*   Read-only: yes
    
*   Description: The system renders a live URL in a browser and checks accessibility against an optional WCAG guideline. Use this for public pages where the rendered DOM is needed. Returns rendered HTML, HTTP status, accessibility summary, and grouped errors.
    

#### Input

Parameter

Type

Required

Description

`url`

`string`

✅

The full URL, including protocol (for example, `https://example.com/page`). The page is rendered in a browser before the scan begins.

`accessibility_guideline`

`string | null`

❌

The WCAG conformance level. Use `WCAG22-AA` for most cases. If omitted, accessibility result fields may be null.

`accessibility_errors_only`

`boolean`

❌

If `true`, the system returns violations only. If `false`, the system may include warnings and review checks. The default setting is `false`.

`max_errors`

`integer | null`

❌

The maximum number of errors that the system will return. Omit for 1 error per unique check; `0` for summary only; `N` for first N errors grouped by check.

#### Output

This output includes rendered HTML, HTTP status, accessibility summary, and grouped errors (schema varies by guideline and the `max_errors` setting).

#### Usage notes

*   Preferred over `html_scans` when you only have a URL and no pre-processed page data.
    
*   JavaScript rendering is applied automatically. Use this for SPAs and dynamically-rendered pages.
    

### Accessibility remediation source code

`accessibility_remediation_source_code`

*   Title: Accessibility Remediation Source Code
    
*   Tags: `accessibility`, `remediation`, `source_code`
    
*   Read-only**:** no
    
*   Description: If there are one or more HTML snippets and an accessibility check identifier, the system returns each fixed snippet with a plain-language description that explains what changed and the reason for the change.
    

#### Input

Parameter

Type

Required

Description

`check_id`

`integer`

✅

The Web Governance accessibility check identifier (from `html_scans` or `render_by_url_with_guideline` results).

`source_codes`

`array<string>`

✅

One or more HTML source code snippets to remediate.

#### Output

This output returns a `result` array, one item per input snippet:

Field

Type

Description

`original`

`string`

The original snippet as provided.

`fixed`

`string`

The remediated snippet.

`description`

`string`

Plain-language explanation of what changed and why.

#### Usage notes

*   Multiple snippets can be sent in a single call; results are returned in the same order.
    
*   Always do a new scan after you apply fixes in order to confirm a clean resolution.
    

Spelling tools
--------------

The platform provides tree variants. Use the one that matches your available input. All of the variants require the **Spell Check (**`qa_spellcheck`**) plan feature**.

### Spellling text snippet

`spelling_text_snippet`

*   Title: Spelling Text Snippet
    
*   Tags: `check`, `content`, `spelling`
    
*   Read-only: yes
    
*   Description: The system checks for spelling errors in a plain text snippet. The system returns misspelled words and the language that they were checked against.
    

#### Input

Parameter

Type

Required

Description

`text`

`string`

✅

The text snippet that the system checks for spelling errors.

`language`

`string | null`

❌

ISO 639-1 language code (for example, `en`, `da`). The system defaults to English if this information is not provided.

#### Output

This output returns a `result` array of spelling errors with misspelled words and language context.

#### Usage notes

Best for targeted checks, such as:

*   A specific paragraph
    
*   A flagged term from a policy violation
    
*   A sentence that is under review
    

### Spelling URL

`spelling_url`

*   Title: Spelling URL
    
*   Tags: `check`, `content`, `spelling`
    
*   Read-only: yes
    
*   Description: The system checks for spelling errors on a live URL. The crawler does a scan on the page, detects the language of each text block, and returns misspelled words.
    

#### Input

Parameter

Type

Required

Description

`url`

`string`

✅

Full URL including protocol (for example, `https://example.com`)

`language`

`string | null`

❌

ISO 639-1 language override. If omitted, the system auto-detects the language from page content.

`enable_javascript`

`boolean`

❌

Enable JavaScript rendering when crawling. The default is: `false`.

#### Output

This output returns a `result` array of spelling errors across the page.

#### Usage notes

*   Use these for live site monitoring or pre-publish checks when you have a URL rather than raw HTML.
    
*   Enable `enable_javascript` for dynamically-rendered content.
    

### Spelling page ID

`spelling_page_id`

*   Title: Spelling Page ID
    
*   Tags: `check`, `content`, `spelling`
    
*   Read-only: yes
    
*   Description: The system checks for misspelled words on a stored Web Governance page using data from the last successful scan. This option is fast. The system does not do a live network request.
    

#### Input

Parameter

Type

Required

Description

`domain_id`

`integer`

✅

The ID of the domain that the page belongs to.

`page_id`

`integer`

✅

The ID of the page to check.

#### Output

This output returns a `result` array of spelling errors from the last crawl.

#### Usage notes

*   This is the fastest spelling option. The system returns stored results, it does not do a new crawl.
    
*   Use `resolve_url_to_ids` to get `domain_id` and `page_id` from a URL.
    

Readability tools
-----------------

Three variants. All variants return the same core output form.

### Readability text snippet

`readability_text_snippet`

*   Title: Readability Text Snippet
    
*   Tags:`content`, `readability`, `score`
    
*   Read-only: yes
    
*   Description: The system calculates readability by analyzing raw text directly.
    

#### Input

Parameter

Type

Required

Description

`text`

`string`

✅

Plain text to analyze.

`test_engine`

`string | null`

❌

`lix` for multilingual content; `flesch_kincaid_re` for English only.

#### Output

This output returns the following:

Field

Type

Description

`score`

`number`

The Readability score

`level`

`string`

Human-readable level (such as: `"Easy"`, `"Difficult"`, `"Legal / Technical"`)

`test_engine`

`string`

The algorithm that the system used.

`reason`

`string`

An explanation of the score.

#### Usage notes

*   Best for targeted analysis such as a specific paragraph, a policy-flagged passage, or a sentence flagged by `html_scans`.
    
*   `level == "Legal / Technical"` is a strong signal that complexity is intentiona. This is useful for policy triage.
    

### Readability URL

`readability_url`

*   Title: Readability URL
    
*   Tags: `check`, `content`, `readability`
    
*   Read-only: yes
    
*   Description: The system calculates the readability for a live public URL. Returns score, level, word count, analyzed text, and reason.
    

#### Input

Parameter

Type

Required

Description

`url`

`string`

✅

The full URL including protocol (for example, `https://example.com`).

`readability_test`

`string | null`

❌

`lix` or `flesch_kincaid_re`.

`enable_javascript`

`boolean`

❌

Enable JavaScript rendering. The default is `false`.

#### Output

This output returns the following:

Field

Type

Description

`score`

`number`

Readability score

`level`

`string`

Human-readable level

`word_count`

`integer`

Total words analyzed

`text`

`string`

The text that was analyzed

`reason`

`string`

Explanation of the score

### Readability page

`readability_page`

*   Title: Readability Page
    
*   Tags: `page`, `readability`, `score`
    
*   Read-only: yes
    
*   Description: The system retrieves readability for a page already stored in Web Governance. This option is fast. The system returns the results from the most recent successful scan, it does not do a new scan on the page.
    

#### Input

Parameter

Type

Required

Description

`domain_id`

`integer`

✅

Domain ID (must already be scanned in Web Governance).

`page_id`

`integer`

✅

Page ID (must exist within the scanned domain).

#### Output

Field

Type

Description

`score`

`number`

Readability score

`level`

`string`

Human-readable level

`test_engine`

`string`

Algorithm used

`reason`

`string`

Explanation of the score

#### Usage notes

*   Use `resolve_url_to_ids` to get `domain_id` and `page_id` from a URL.
    

Policy tools
------------

There are tree variants. All require the **Policies (**`policies_all`**) plan feature**. Each call evaluates **one policy at a time**. Loop over policy IDs to evaluate multiple rules.

### Run policy snippet

`run_policies_snippet`

*   Title: Run Policy (Snippet)
    
*   Tags: `check`, `content`, `governance`, `policies`, `snippet`
    
*   Read-only: yes
    
*   Description: The system evaluates one governance policy against draft text or HTML before it does the crawl. Use this option for body-copy, keyword, regex, `page_html`, and `page_text` checks.
    

Note

Do not use this option for rules that require a real page URL/title, stored metadata, link graph, readability, or image records. Use `run_policies_page_id` for those instead.

#### Input

Parameter

Type

Required

Description

`policy_id`

`integer`

✅

The ID of the policy to evaluate (one per call).

`content`

`string`

✅

The text or HTML content to evaluate.

`content_type`

`string`

✅

`text` for plain text, `html` for full or partial HTML markup.

#### Output

This output returns the following:

Field

Type

Description

`id`

`integer`

Policy ID

`name`

`string`

Policy name

`mode`

`string`

Policy mode

`priority`

`string`

Policy priority

`subject`

`string`

What the policy evaluates

`matches`

`array`

Content that matched/violated the policy

`ignored`

`array`

Matches that were ignored

`url`

`string | null`

Associated URL if applicable

### Run policy URL

`run_policies_url`

*   Title: Run Policy (URL)
    
*   Tags:`check`, `content`, `governance`, `policies`, `url`
    
*   Read-only: yes
    
*   Description: The system fetches a live URL and evaluates one governance policy against its fetched HTML, text, title, URL, and links. Use this option when freshness matters or the page has not been crawled in Web Governance.
    

Note

Do not use this option for rules that are derived from crawl/database data (such as incoming/external link counts, stored metadata, readability, or image records). No domain targeting check is performed.

#### Input

Parameter

Type

Required

Description

`url`

`string`

✅

The URL that the scan must fetch and evaluate.

`policy_id`

`integer`

✅

The ID of the policy to evaluate (one per call).

`enable_javascript`

`boolean`

❌

Enable JavaScript rendering when fetching. The default is `false`.

#### Output

This output has the same form as `run_policies_snippet`.

### Run policy page ID

`run_policies_page_id`

*   Title: Run Policy (Page ID)
    
*   Tags: `check`, `content`, `governance`, `policies`
    
*   Read-only: yes
    
*   Description: The system dvaluates one governance policy against a page that has been previously crawled by Web Governance, using the content from the most recent successful crawl. This option supports a full stored-page evaluation that includes domain targeting.
    

Note

This option is not a live fetch. Use `run_policies_url` for a fresh check or `run_policies_snippet` for draft content.

#### Input

Parameter

Type

Required

Description

`domain_id`

`integer`

✅

The ID of the domain that the page belongs to.

`page_id`

`integer`

✅

The ID of the page to evaluate.

`policy_id`

`integer`

✅

The ID of the policy to evaluate (one per call).

#### Output

This output has the same form as the `run_policies_snippet`.

Utility tool
------------

### Resolve URL to IDs

`resolve_url_to_ids`

*   Title: Resolve URL to IDs
    
*   Tags: `domains`, `ids`, `pages`, `resolve`
    
*   Read-only: yes
    
*   Description: Resolve a known URL to Web Governance `domain_id` / `page_id` values, needed by the `_page_id` and `_page` variants of spelling, readability, and policy tools.
    

#### Input

Parameter

Type

Required

Description

`url`

`string`

✅

The URL to resolve. Exact match by default; set `partial=true` for contains matching.

`partial`

`boolean`

❌

Use contains matching instead of exact URL matching.

`domain_ids`

`array<integer>`

❌

Limit the search to specific domain IDs. Required when `include_domain_group_ids` is `true`.

`max_per_domain`

`integer`

❌

Maximum pages to return per domain. If the cap is reached, `truncated=true` in the response.

`include_domain_group_ids`

`boolean`

❌

If `true`, stamps `domain_group_ids` on each page result. Requires `domain_ids` to be set.

#### Output

The system groups the results by domain, each domain contains matching pages with their `domain_id` and `page_id`. If `truncated=true`, retry with `domain_ids` and/or a more specific URL.

#### Usage notes

*   This is the entry point for any workflow that starts with a URL and needs to call a `_page_id` tool.
    
*   Use `partial=true` when you have a partial URL or want to find all pages under a path.
    

Resources and prompts
---------------------

The server currently exposes **no resources** and **no prompts**.

Example workflows
-----------------

### Accessibility check and fix from a URL

`1. render_by_url_with_guideline(url, accessibility_guideline="WCAG22-AA")`  
  `→ Collect: accessibility errors with check_ids and source snippets`  
`2. accessibility_remediation_source_code(check_id, source_codes)`  
  `→ Collect: fixed HTML snippets with descriptions`  
`3. Re-run render_by_url_with_guideline to confirm clean resolution`

### Full content quality check on a live URL

`1. render_by_url_with_guideline(url, accessibility_guideline="WCAG22-AA")`  
  `→ Accessibility errors`  
`2. spelling_url(url)`  
  `→ Spelling errors`  
`3. readability_url(url)`  
  `→ Readability score and flagged sentences`  
`4. run_policies_url(url, policy_id) [repeat per policy]`  
  `→ Policy violations`  
`5. accessibility_remediation_source_code for auto-fixable errors`

### Checking a draft before publish (no live URL yet)

`1. html_scans(html, encoded_page, accessibility="WCAG22-AA")`  
  `→ Full scan: accessibility, SEO, readability, data protection`  
`2. spelling_text_snippet(text)`  
  `→ Spelling errors in the draft body copy`  
`3. run_policies_snippet(policy_id, content=html, content_type="html") [repeat per policy]`  
  `→ Policy violations against draft HTML`  
`4. For any readability concerns: readability_text_snippet(text)`  
  `→ Targeted readability score on specific paragraphs`

### Bulk audit using stored Web Governance data

`1. resolve_url_to_ids(url)`  
  `→ Get domain_id and page_id`  
`2. spelling_page_id(domain_id, page_id)`  
  `→ Spelling errors from last crawl (fast, no network call)`  
`3. readability_page(domain_id, page_id)`  
  `→ Readability score from last crawl`  
`4. run_policies_page_id(domain_id, page_id, policy_id) [repeat per policy]`  
  `→ Policy violations from last crawl`