Pre-deploy checks for content sites: keywords, translations, links, claims, page SEO/GEO audit.
MCPpedia last refreshed this data
io.github.adsandcode/contentgate is an MCP server that pre-deploy checks for content sites: keywords, translations, links, claims, page SEO/GEO audit. Its tool list has not been published yet over stdio and sse, requires no API key, and scores 58/100 on MCPpedia's security, maintenance and efficiency rubric.
Config is the same across clients - only the file and path differ.
{
"mcpServers": {
"io-github-adsandcode-contentgate": {
"args": [
"-y",
"mcp-server-contentgate"
],
"command": "npx"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Pre-deploy checks for content sites: keywords, translations, links, claims, page SEO/GEO audit.
This server supports HTTP transport. Be the first to test it - help the community know if it works.
Five weighted categories - click any category to see the underlying evidence.
No known CVEs.
Checked mcp-server-contentgate against OSV.dev.
Be the first to review
Have you used this server?
Share your experience - it helps other developers decide.
Sign in to write a review.
Others in writing / devops
MCP server for using the GitLab API
MCP server for discovering, reading, and changing ZenML resources with compact generic tools
Scrape, crawl, and map websites to Markdown or JSON via local CLI.
MCP server for Dynatrace Managed to access logs, events, and metrics.
MCP Security Weekly
Get CVE alerts and security updates for io.github.adsandcode/contentgate and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
Pre-deploy guards for content sites. Python CLI and an MCP server, sharing one test suite.
Documentation and background: adsandcode.com/en/open-source/contentgate
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
...
160 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.
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.
| Check | What it catches |
|---|---|
keywords | The page covers the topic and never contains the term people search for. |
translation | A translation that is no longer structurally the same document: dropped table row, changed price, internal link that lost its locale prefix. |
internal_links | A guide that ranks, gets read, and sends nobody anywhere, because its only commercial link lives in site-wide boilerplate or points at another site. |
claims | Affirmative performance claims in regulated copy, without firing on the disclaimer that negates them. |
lastmod | 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.
Two more that changed in 0.2.0:
A commercial link has to point at your own site. A relative link counts. An
absolute link counts only when its host is in site_hosts or a subdomain of
one, compared on label boundaries and read the way a browser reads it;
without site_hosts, absolute links never count. A link to
https://competitor.example/pricing/ ends in /pricing/ and sells someone
else's product. The money path is matched against the path, not the query
string, so /blog/?next=/pricing/ is not a pricing link.
A disclaimer has to negate the claim itself. A negation anywhere in the sentence used to be