mcp-server-contentgate
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-server-contentgatecheck my draft for keyword coverage, translation drift, and internal links"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
contentgate
Pre-deploy guards for content sites. Python CLI and an MCP server, sharing one test suite.
These checks exist because each of them was written the day after the thing it checks for went live and cost something.
negative tests
keywords
[ok] expected block got block primary keyword appears once, threshold is three
[ok] expected block got block spaced variant must not satisfy the unspaced keyword
...
36 passed, 0 failed
checks
[ ok ] keywords choosing-a-cms (1200/1200 volume covered)
[FAIL] keywords headless-vs-monolith (300/750 volume covered)
missing keyword 'headless cms' (volume 450): found 2 time(s), needs 3
[ ok ] i18n fr: 19 document(s)
[ ok ] lastmod 19 page(s), 0 genuinely changed
[FAIL] 1 check(s) failed. Deploy blocked.The one design rule
A guard that has never been shown to fail is decoration.
Every check ships negative tests: inputs it is required to reject. The suite runs
before any verdict is reported, and a failing suite exits 2 without saying
anything about your content. A checker that cannot prove it still catches a
known-bad input does not get to tell you your site is fine.
This is not theoretical. Guards written for this project have included: one that read its keyword out of the site-wide footer and therefore passed every page ever; one that ran after the step that regenerated the file it was checking; and one whose exit code was discarded by the shell pipeline it lived in, so it printed "deploy blocked" while the deploy proceeded. All three looked fine. All three were found by asking them to fail on purpose.
Related MCP server: SEO Screaming Toad MCP Server
The checks
Check | What it catches |
| The page covers the topic and never contains the term people search for. |
| A translation that is no longer structurally the same document: dropped table row, changed price, internal link that lost its locale prefix. |
| A guide that ranks, gets read, and sends nobody anywhere, because its only commercial link lives in site-wide boilerplate. |
| Affirmative performance claims in regulated copy, without firing on the disclaimer that names them. |
| A sitemap that stamps today's date on every URL every build and trains crawlers to ignore the field. |
Three details that look fussy and are not:
Whitespace is never normalised in keyword matching. web hosting and
webhosting are different strings with different search volumes, and in
languages that do not put spaces between words the gap between the two forms can
be an order of magnitude. Letting one satisfy the other is how a guard passes a
page that targets neither. This was found twice, on two pages, after publication.
Boilerplate is excluded from every body check. A call-to-action block present
on every page will otherwise satisfy keywords and internal_links everywhere,
which means both checks pass always.
Ties are not broken by dictionary order. Every keyword at the highest volume is primary. The alternative, taking the first maximum, makes the verdict depend on the order of keys in a JSON file, which is stable right up until someone reorders the table.
Install
Python 3.8+, standard library only, no dependencies.
git clone https://github.com/adsandcode/contentgate
cd contentgate
python -m contentgate init # writes contentgate.json
python -m contentgate checkExit codes are the contract:
Code | Meaning |
| everything passed |
| a guard failed on your content |
| the guards' own negative tests failed, so no verdict was given |
Wire it in front of your deploy and honour the exit code:
python -m contentgate check || exit 1
npx wrangler pages deploy siteConfiguration
contentgate.json, next to your project:
{
"root": ".",
"scope": ["article", "post"],
"exclude_classes": ["cta"],
"guards": {
"keywords": {
"enabled": true,
"table": "content/keywords.json",
"page_for_slug": "site/blog/{slug}/index.html",
"primary_min_hits": 3
},
"internal_links": {
"enabled": true,
"pages": "site/blog/*/index.html",
"money_paths": ["/products/", "/plans/"],
"require_figure": true
},
"translation": {
"enabled": true,
"source_dir": "content/blog",
"locales": ["de", "fr", "ja"],
"same_script_locales": [],
"native": "content/blog/_native.json"
},
"lastmod": {
"enabled": true,
"pages": "site/**/index.html",
"state": ".contentgate-lastmod.json",
"strip_classes": [],
"bulk_change_threshold": 0.3
}
}
}scope is the element that holds the real content, as [tag, class].
exclude_classes is your boilerplate. Both matter more than they look.
same_script_locales is for targets that legitimately share the source script,
such as Simplified Chinese from a Traditional Chinese source. Without it, the
leftover-characters check fails every document in that locale forever.
bulk_change_threshold stops a run that moves more than that share of lastmod
dates at once. Adding a block to every page changes every hash, which moves every
date, which is the lie the check exists to prevent. It looks identical to a
legitimate mass edit, so the run stops and asks rather than writing silently.
content/keywords.json maps a page to its terms and their real monthly volumes:
{
"choosing-a-cms": { "headless cms": 450, "cms comparison": 200 }
}Use numbers from a tool. A guard fed invented volumes enforces invented priorities.
MCP server
The same checks as tools an assistant can call while it is writing a page, rather than after the page is deployed.
npx mcp-server-contentgate{
"mcpServers": {
"contentgate": { "command": "npx", "args": ["-y", "mcp-server-contentgate"] }
}
}Tools: check_keywords, check_translation, check_internal_links,
check_claims, sitemap_lastmod, content_hash.
Every tool is pure: content in, verdict out. No filesystem access, no network access, nothing written. The server runs its negative tests at startup and refuses to start if they fail.
Why there are two implementations
The Python CLI runs in a deploy pipeline. The MCP server runs inside an assistant while the content is being written. Neither replaces the other.
They share fixtures/cases.json, and both are required to produce identical
verdicts on every case in it. If they disagree, one has drifted and CI fails.
python -m contentgate selftest # 36 passed, 0 failed
cd mcp && npm run build && npm run selftestContributing
A pull request that adds a check must add its negative tests to
fixtures/cases.json and implement it on both sides. That is the whole bar.
If you found a way to make a guard pass something it should have caught, that is the most useful issue you can file.
Licence
MIT.
Available Tools
6 toolscheck_claimsA
Scan copy for affirmative performance claims of the kind that get finance, gambling and health advertising rejected: guaranteed profit, stated win rates, promised returns. Sentences that exist to disclaim or prohibit those phrases are not flagged.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Plain text or HTML. HTML tags are ignored. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It clearly states that disclaimers/prohibitions are not flagged, which is a meaningful behavioral nuance. It also notes that HTML tags are ignored, which is a useful input-handling detail. It does not disclose output format or whether the tool returns matches, counts, or a pass/fail, but the core behavior is transparent enough for a scanning tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the key scoping information is front-loaded. The first sentence defines the target precisely; the second sentence clarifies an important exclusion. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter scanning tool with no output schema, the description is nearly complete. It tells the agent what to scan for, what not to flag, and how the input is handled. The only missing piece is what the tool returns (e.g., list of flagged phrases, boolean, count), but that is not required by the rubric since there is no output schema. Still, a brief note on return format would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter 'text' is described as 'Plain text or HTML. HTML tags are ignored.' The description adds context about what kind of text is relevant (copy with performance claims) and the exclusion of disclaimers, which goes beyond the schema. Since there is only one parameter and the schema already covers it, the description's additional context earns a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('scan'), a specific resource ('copy'), and a precise target ('affirmative performance claims' in finance, gambling, and health advertising). It also explicitly excludes disclaimers/prohibitions, which distinguishes it from a generic keyword checker. This is a clear, specific purpose that an agent can act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need to detect affirmative performance claims in copy, especially in regulated advertising contexts. It does not explicitly name alternatives or state when not to use it, but the sibling list (check_keywords, check_translation, etc.) and the specific claim-focused language make the intended use clear. A small gap: no explicit 'use check_keywords for simple keyword matching' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_internal_linksA
Check that a content page links to at least one commercial page from its body, and optionally that it states a concrete figure. Links inside excluded boilerplate do not count, because a site-wide call-to-action block would otherwise satisfy this on every page and the check would guard nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| html | Yes | ||
| scope | No | Element to look inside, as [tag, class], e.g. ["article","post"]. Omit to read the whole document. | |
| money_paths | Yes | Path prefixes that count as commercial, e.g. ["/pricing/","/services/"]. | |
| extra_evidence | No | Literal strings that satisfy require_figure on their own, such as named product modules. | |
| require_figure | No | Also require a concrete price or quantity in the body. "Contact us for a quote" is not an offer. | |
| exclude_classes | No | Classes whose subtree is ignored. Use this for site-wide call-to-action blocks, otherwise they satisfy the check on every page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses a key behavioral trait: links inside excluded boilerplate do not count, and explains why. It also clarifies that 'Contact us for a quote' is not an offer, which is a useful semantic behavior. It doesn't mention return format or side effects, but for a read-only check tool this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main purpose, and the second sentence earns its place by explaining a non-obvious behavioral rule. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only validation tool with 6 parameters and no output schema, the description covers the main behavioral nuance (boilerplate exclusion) and the optional figure requirement. It doesn't describe the return value, but that's often acceptable for a check tool. The main gap is not stating what the tool returns (e.g., boolean, list of failures), but the description is otherwise complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents most parameters. The description adds meaning by explaining the purpose of exclude_classes (site-wide CTA blocks) and the semantic of require_figure ('Contact us for a quote' is not an offer). This goes beyond the schema's literal descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Check') and resource ('content page links to at least one commercial page from its body'), and adds a concrete optional condition ('states a concrete figure'). It clearly distinguishes itself from sibling tools like check_keywords or check_claims by focusing on internal link structure and commercial intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the core use case and the rationale for excluding boilerplate, which implies when to use it (content pages) and why exclude_classes matters. It doesn't explicitly name alternatives or say when not to use it, but the context is clear enough for an agent to select it over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_keywordsA
Verify that target keywords actually appear in a rendered page. Every term tied at the highest search volume must appear at least primary_min_hits times; every other term at least once. Matching is literal and case-insensitive: whitespace is never normalised, because 'web hosting' and 'webhosting' are different terms with different search volumes.
| Name | Required | Description | Default |
|---|---|---|---|
| html | Yes | Rendered HTML of the page. | |
| scope | No | Element to look inside, as [tag, class], e.g. ["article","post"]. Omit to read the whole document. | |
| keywords | Yes | Map of keyword to monthly search volume, taken from real tool data. | |
| exclude_classes | No | Classes whose subtree is ignored. Use this for site-wide call-to-action blocks, otherwise they satisfy the check on every page. | |
| primary_min_hits | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full transparency burden. It discloses important behavioral nuances: literal case-insensitive matching, whitespace not normalized, and the special rule for highest-search-volume terms. It stops short of describing the return value, but the core verification behavior is clearly explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver purpose, threshold behavior, and matching semantics with no filler. The most important action is front-loaded, and every sentence adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Input semantics are well covered, but there is no output schema and the description does not state what the tool returns (boolean, counts, missing keywords, etc.). Minor edge cases like empty keyword maps or invalid HTML are also unaddressed, leaving some uncertainty for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds real meaning beyond the schema by explaining how keyword search volumes determine which terms require primary_min_hits. It also clarifies that term matching is literal and case-insensitive, which directly informs how the keywords map is interpreted. Other parameters rely on the schema, but schema coverage is already high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a clear verb and resource: 'Verify that target keywords actually appear in a rendered page.' It is easily distinguished from siblings such as check_translation, check_internal_links, and check_claims, which address different page qualities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: call this tool when you need to confirm keyword presence in rendered HTML. However, the description never explicitly says when to prefer it over alternatives or when not to use it, so routing guidance is weak.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_translationA
Compare a translation against its source document for structural drift: heading sequence, HTML tag sequence, table row count, internal link paths, price tokens, locale prefix on internal links, leftover source-script characters, introduced em dashes and emoji. This checks structure, not meaning: it cannot tell you a translation is good, only that it is no longer the same document.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | Yes | Locale code of the translation, e.g. "es". Internal links are expected to carry it as a prefix. | |
| source | Yes | The source-language markdown. | |
| translation | Yes | The translated markdown. | |
| check_locale_prefix | No | ||
| forbid_source_script | No | Set false when the target legitimately shares the source script, e.g. Simplified Chinese from a Traditional Chinese source. | |
| require_front_matter | No | Require line 1 to be an H1 and line 2 to be a summary blockquote. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It details the specific checks performed and explicitly states what the tool does not do, which is valuable transparency. It stops short of describing the output format or any error conditions, but for a read-only comparison tool this is substantial coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence front-loads the core purpose and then lists the concrete checks, while the second sentence immediately clarifies the tool's limitation. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is strong on scope and limits, but because there is no output schema, it does not explain the return value or how the agent should interpret the results. An agent invoking this tool would not know whether it returns a boolean, a list of mismatches, or a detailed report, which is a meaningful gap for a tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, and the schema already documents parameters like locale, forbid_source_script, and require_front_matter well. The description adds context around what 'structural drift' means and references locale prefixes and source-script characters, mildly reinforcing parameter intent, but it does not add significant new semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Compare') and resource ('a translation against its source document') and enumerates the exact structural dimensions checked. It also explicitly distinguishes this from meaning-based evaluation, which helps separate it from the sibling check_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the tool's scope ('structural drift') and its limitation ('cannot tell you a translation is good'), which gives a strong when-to-use signal. It does not explicitly name alternative tools, but the 'not meaning' exclusion effectively guides the agent away from using it for semantic checking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
content_hashA
Hash the meaningful content of a page, with volatile blocks and scripts removed. Use it to tell a real edit from a rebuild.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| strip_classes | No | ||
| strip_patterns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It does disclose a key trait: volatile blocks and scripts are removed before hashing. However, it does not state whether the hash is deterministic, what algorithm is used, what the return value looks like, or whether the operation has side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The operation is first, the use case second. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although the tool's concept is simple, the missing parameter explanations and lack of any return-value description leave an agent under-informed. For a tool with no annotations and no output schema, the description should at least connect strip_classes/strip_patterns to the stripping behavior and indicate the type of result produced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description mentions none of the three parameters by name. 'body' is only indirectly implied by 'content of a page', and 'strip_classes' and 'strip_patterns' — which presumably customize the volatile-block removal — are completely unexplained, forcing the agent to guess their meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Hash the meaningful content of a page') with a defining behavioral qualifier ('with volatile blocks and scripts removed'). It also gives the outcome ('tell a real edit from a rebuild'), which clearly differentiates it from the sibling check_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use it to tell a real edit from a rebuild' gives a concrete, actionable scenario for when this tool is appropriate. It does not explicitly name alternatives or exclusions, but the use case is specific enough that an agent can judge when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sitemap_lastmodA
Decide a sitemap lastmod date honestly. Hash the meaningful content of a page, compare it against the stored hash, and move the date only when the content genuinely changed. Stamping today's date on every URL every build teaches crawlers that the field carries no information.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Current HTML of the page. | |
| today | Yes | Today's date, ISO format. | |
| previous_hash | No | Stored hash from the last run, or null for a page seen for the first time. | |
| strip_classes | No | Classes to remove before hashing: visitor counters, build ids, anything that changes on its own. | |
| strip_patterns | No | Regular expressions to remove before hashing. | |
| previous_lastmod | No | Stored lastmod, ISO date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It does transparently reveal the core decision logic — content is hashed, compared to the stored hash, and the date advances only on real change — which is the tool's essential behavioral trait. But it omits the return value format, first-seen behavior when previous_hash is null, and failure modes for malformed strip_patterns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the purpose front-loaded in the first, the mechanism in the second, and a brief rationale in the third that explains why the behavior matters. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters, no annotations, and no output schema, so the description must disclose the return contract — but it never states what the function returns (a date string? a boolean? a full update?) or how it handles first-run cases (null previous_hash / null previous_lastmod). These are essential for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, putting the baseline at 3. The description's narrative adds an interaction model beyond the individual schema entries: body is hashed after stripping, compared against previous_hash, and previous_lastmod advances to today only on genuine change. This workflow-level meaning connects the parameters in a way the schema alone does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair — 'Decide a sitemap lastmod date honestly' — and explains the mechanism (hash content, compare with stored hash, move the date only on genuine change). This clearly differentiates the tool from sibling check_* tools and content_hash: the siblings inspect content or compute hashes, while this one decides a date.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied — computing honest lastmod dates during sitemap builds — and the anti-pattern ('Stamping today's date on every URL every build') is described well. However, the description never explicitly names an alternative or states when not to use this tool (e.g., when only a raw hash is needed, use content_hash), leaving the routing guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
check_claims - First observed
check_internal_links - First observed
check_keywords - First observed
check_translation - First observed
content_hash - First observed
sitemap_lastmod
TDQS
Scored across 6 tools
Each tool targets a distinct content-quality dimension: keyword presence, translation structure, internal linking, advertising claims, sitemap lastmod dating, and hashing. Even the two hashing-related tools are cleanly separated as utility versus policy. No tool appears to duplicate another.
Four tools follow a clear check_<object> pattern, but sitemap_lastmod and content_hash break the verb-first convention and read as nouns. The mixed style is still readable and predictable enough for moderate coherence.
Six tools is well-scoped for a content-gate server, covering distinct compliance checks plus hashing support. Each tool earns its place, and the count is comfortably in the ideal range.
The tool surface covers the main content-gate checks and provides hashing support for honest lastmod decisions. Broader content QA checks like metadata validation or broken-link detection are absent, but those are outside the server's apparent specialization.
Related MCP Connectors
GEO scores and content-rewrite suggestions for any web page, as MCP tools.
100+ MCP tools for AI agents: content metadata, trade intelligence, business-expertise analysis.
AI Visibility and Content Intelligence tools for Claude and MCP-compatible agents.
MCP tools for AI agents: render URLs to image/PDF, check link health, convert HTML/CSV/JSON.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to capture screenshots, run visual diffs, accessibility audits, and batch sweep plans for web pages via MCP tools.14 npm2MIT
- AlicenseNot gradedqualityBmaintenanceProvides 23 bounded MCP tools for AI agents to perform technical SEO audits, including crawl setup, page analysis, issue detection, and report exports, all while keeping data local.6MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to interact with WordPress sites over MCP, providing read-only tools for AEO/GEO readiness, AI visibility, traffic, request logs, bot identification, page checks, and schema/markdown previews, plus opt-in write tools to draft, edit, and publish posts with permission checks and auditing.1GPL 2.0
- AlicenseAqualityAmaintenanceProvides on-page SEO analysis via MCP tools, including page audits, schema extraction, robots.txt checks, sitemap parsing, and link analysis. No API keys required; works with any MCP-compatible client.519 npmMIT