aiBLOCK
Repo-native content governance for AI agents. Extract, review, and deliver UI text, docs, and structured content from Git.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://www.npmjs.com/package/@contentrain/mcp) [](https://www.npmjs.com/package/contentrain) [](https://www.npmjs.com/package/@contentrain/query) [](https://agentskills.io) [](https://ai.contentrain.io) [](LICENSE)
Website · Docs · Discord · Twitter · LinkedIn
Extract, govern, and ship structured content from your codebase.
Contentrain helps teams turn hardcoded UI text, docs, and structured content into a governed, reviewable content layer. Agents can extract, create, translate, and update content, while Contentrain enforces schema, Git review, and portable file output.
Agent extracts or updates content → Contentrain standardizes → Human reviews → Any platform consumes
Try it in 30 seconds
npx contentrain init # create .contentrain/ workspace npx contentrain serve # open the local review UI
That's it. You now have a governed content workspace with models, validation, review branches, and a local UI — no account, no cloud, no proprietary content format.
Start here:
What Contentrain is for
- Rescuing hardcoded strings from existing apps and turning them into struc
680a73720388OBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add mcp -- npx -y @contentrain/[email protected]
Exposed tools (104)
73 read · 25 write · 6 destructive. Blast radius: 6 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
.NET | read | Microsoft .NET platform |
Ada | read | Writes things. |
Analog | read | Angular meta-framework |
Angular | read | Platform for web applications |
Astro | read | Content-first web framework |
Django | read | Python web framework |
Electron | read | Cross-platform desktop apps |
Eleventy | read | JavaScript static site generator |
Expo | read | React Native toolchain |
Express | read | Minimal Node.js web framework |
Fastify | read | Fast Node.js web framework |
Flutter | read | Cross-platform UI toolkit (Dart) |
Go | read | Go programming language |
Hello | write | A post |
Hugo | read | Go-based static site generator |
Jekyll | read | Ruby-based static site generator |
Laravel | read | PHP web framework |
NestJS | read | Progressive Node.js framework |
Next.js | read | React framework with SSR/SSG |
Node.js | read | Server-side JavaScript runtime |
Nuxt | read | Vue meta-framework with SSR/SSG |
Other | read | Unknown or unsupported framework |
Rails | read | Ruby web framework |
React | read | UI library for web and native |
Remix | read | Full-stack React framework |
Rust | read | Rust programming language |
Solid | read | Reactive UI library |
Svelte | read | Compile-time UI framework |
SvelteKit | read | Svelte meta-framework |
Tauri | read | Lightweight desktop apps (Rust) |
Vue | read | Progressive JavaScript framework |
activity | read | Show recent activity from Studio |
branches | read | Manage content branches on Studio |
cdn-build | write | Trigger a CDN rebuild |
cdn-init | write | Set up CDN for content delivery |
connect | read | Connect this repository to a Contentrain Studio project |
contentrain | read | Contentrain CMS architecture, content formats, and MCP tool usage |
contentrain-bulk | read | Batch operations on content entries |
contentrain-content | write | Create and manage content entries for existing models |
contentrain-diff | read | View content diffs between branches |
contentrain-doctor | read | Diagnose project health issues |
contentrain-generate | read | Generate the typed SDK client from models |
contentrain-init | read | Initialize a new Contentrain project |
contentrain-migrate-wordpress | write | Import a WordPress site into a .contentrain store and wire it to a framework |
contentrain-model | write | Design and save model definitions |
contentrain-normalize | write | Two-phase normalize: extract hardcoded strings and patch source files |
contentrain-quality | read | Content quality, SEO, accessibility, and media rules |
contentrain-review | read | Review content changes before publishing |
contentrain-sdk | read | Query SDK usage: #contentrain imports, QueryBuilder, type-safe content access |
contentrain-serve | write | Start the local review and normalize UI |
contentrain-translate | read | Translate content across supported locales |
contentrain-validate-fix | read | Validate content and auto-fix structural issues |
contentrain_apply | write | Apply normalize operations. Two modes: |
contentrain_branch_delete | destructive | Delete a pending contentrain (cr/*) branch that will not be merged — e.g. a branch left behind by a failed operation, or a superseded draft. Only cr/* branches can be deleted; the contentrain branch is protected. This is destructive: the branch and its unmerged commits are removed. |
contentrain_branch_list | write | List pending contentrain (cr/*) branches with their merge status against the contentrain branch. Use this to discover branch names for contentrain_merge / contentrain_branch_delete, and to monitor branch-health limits (warning at 50, blocked at 80 unmerged). |
contentrain_bulk | read | Batch operations on content entries. All operations are auto-committed to git. |
contentrain_content_delete | destructive | Delete content entries. For dictionaries, use |
contentrain_content_list | read | List content entries (read-only). Returns data from .contentrain/ — do NOT manually create or modify content files. |
contentrain_content_save | write | Save content entries. Entry format varies by model kind: DICTIONARY — provide |
contentrain_describe | write | Get full schema of a single model (read-only). Do NOT manually create content files — use contentrain_content_save instead. |
contentrain_describe_format | read | Describes the Contentrain content file format for any language/platform. Returns a comprehensive specification of the file structure, JSON formats, markdown conventions, meta files, and locale strategies. |
contentrain_doctor | read | Project health report (read-only). Returns structured checks: git, node, .contentrain/ structure, model parse, orphan content, branch pressure, SDK freshness. Pass |
contentrain_init | read | Initialize .contentrain/ structure. Changes are auto-committed to git — do NOT manually create .contentrain/ files. |
contentrain_media_delete | destructive | Delete a media asset from the media stack. Content entries referencing its path are NOT rewritten — check references before deleting. |
contentrain_media_get | read | Get a single media asset by id, including its storage path, delivery URL, and metadata. |
contentrain_media_ingest | read | Ingest a media asset from a source URL. The provider fetches the URL server-side under its own SSRF/MIME/size policy and stores the asset in the media stack. Returns the stored asset with its media/... path. |
contentrain_media_list | read | List media assets from the provider media stack. Returns storage paths (media/...) usable in media/image/file fields via contentrain_content_save, plus delivery URLs when available. Supports search, tag filter, and cursor pagination. |
contentrain_media_update | write | Update metadata (alt text, tags, filename) of an existing media asset. Does not touch the binary. |
contentrain_merge | write | Merge a review-mode branch into contentrain. Local git operation — no external platform needed. Merges the feature branch into the contentrain branch, advances the base branch via update-ref, selectively syncs .contentrain/ files to the working tree, and prunes the merged branch. Target by exact |
contentrain_model_delete | destructive | Delete a model and its content/meta. Changes are auto-committed to git — do NOT manually edit .contentrain/ files. |
contentrain_model_save | write | Create or update a model definition. Changes are auto-committed to git — do NOT manually edit .contentrain/ files after calling this tool. |
contentrain_reconcile | read | Reconcile a diverged contentrain ↔ base-branch pair with a content-aware three-way merge. |
contentrain_scaffold | read | Template-based project setup. Available templates: ${listTemplates().join( |
contentrain_scan | read | Scan project source code for content strings. Three modes: |
contentrain_status | read | Get full project status (read-only). Returns config, models, context. Do NOT manually edit .contentrain/ based on this output. |
contentrain_submit | write | Push contentrain/* branches to remote. MCP is push-only — PR creation is handled by the platform. Do NOT manually push or create PRs. |
contentrain_validate | read | |
contentrain_vocabulary_delete | destructive | Remove canonical vocabulary terms by slug. Content already using a term is not touched — the vocabulary only advises. Changes are auto-committed to git. |
contentrain_vocabulary_save | write | Add or update canonical vocabulary terms. Terms nest as { |
delta | write | Plan a WordPress source delta against the store (dry run only; applying goes through review) |
describe | write | Show the schema, stats, and import snippet for a model |
describe-format | read | Print the Contentrain content-format specification |
diff | read | Review pending contentrain branches |
doctor | read | Check project health and environment |
generate | read | Generate typed SDK client from models |
import | write | Import a WordPress site (WXR export file or REST URL) into a .contentrain content store |
init | read | Initialize Contentrain in your project |
login | read | Authenticate with Contentrain Studio |
logout | read | Log out from Contentrain Studio |
merge | write | Merge one contentrain feature branch into the content branch |
prune | destructive | Delete merged cr/* branches locally and on the remote |
reconcile | write | Merge a diverged base branch back into the content branch, content-aware |
record_answers | read | Record the answers for every item. |
scaffold | write | Apply a Contentrain template (models + sample content + vocabulary) |
serve | write | Start the local content viewer or the MCP server (stdio for IDE agents, --mcpHttp for Studio / CI / remote drivers) |
setup | read | Configure MCP server and AI rules for your IDE |
skills | write | Install, update, or list Contentrain AI skills and rules for your IDE |
status | read | Show project status overview |
studio | read | Interact with Contentrain Studio |
submissions | read | Manage form submissions on Studio |
usage | read | Show workspace usage metrics |
validate | read | Validate project content against schemas |
webhooks | read | Manage webhooks on Studio |
whoami | read | Show current Studio authentication status |
Trust audit
BLOCKgrade F · trust 51/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (6 observation(s))
- Shell
- declared (5 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
exec(`${cmd} ${url}`)exec(command, () => {allowlist.ts
const callbackUrl = `http://127.0.0.1:${port}/callback`const url = new URL(req.url, `http://127.0.0.1:${port}`)export const TOKEN = 'test-token-not-a-real-secret'
token: 'ghs_mockInstallationToken',
entries: [{ locale: 'en', data: { name: 'API', token: 'sk_live_abc123secret' } }],expect(detectSecrets('API-KEY: "q7x2m9v4k1p8z3w6h5j0"')).toHaveLength(1)const SECRET = 'GOLDEN-ACF-PASSWORD-SECRET'
['a GitHub token', 'ghp_16C7e42F292c6912E7710c838347Ae178B4a'],
- **Private keys**: `-----BEGIN RSA PRIVATE KEY-----`, `-----BEGIN OPENSSH PRIVATE KEY-----`, `-----BEGIN PGP PRIVATE KEY BLOCK-----`, or similar PEM blocks
- **Private keys**: `-----BEGIN RSA PRIVATE KEY-----`, `-----BEGIN OPENSSH PRIVATE KEY-----`, `-----BEGIN PGP PRIVATE KEY BLOCK-----`, or similar PEM blocks
['a private key block', '-----BEGIN RSA PRIVATE KEY-----'],
- **Private keys**: `-----BEGIN RSA PRIVATE KEY-----`, `-----BEGIN OPENSSH PRIVATE KEY-----`, `-----BEGIN PGP PRIVATE KEY BLOCK-----`, or similar PEM blocks
['a Stripe secret key', 'sk_live_51H8xY2abcdefghij'],
contentrain_branch_delete, contentrain_content_delete, contentrain_media_delete, contentrain_model_delete, contentrain_vocabulary_delete, prune
.oxlintrc.json
const run = () => new Function(script)()
const paths = new Function('data0', 'data1', `${fn}; return getStaticPaths()`)return new Function(`${config.slice(start, end)}\nreturn ${filter}`)() as Filterexport const hexId = (s: string): string => createHash('sha1').update(s).digest('hex').slice(0, 24)import { installLocalSdk } from '../../../scripts/local-sdk.mjs'import Component from '../../components/kit/${c.id}/${main}'import BaseLayout from '../../layouts/BaseLayout.astro'
Gates applied: no_behavioural_pass.
680a73720388full audit observations/trust-audit/mcp-server/contentrain__ai.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | 680a73720388 | BLOCK | F | 51 | first audit |
Questions
What is the ai MCP server?
Repo-native content governance for AI agents. Extract, review, and deliver UI text, docs, and structured content from Git.
What tools does ai expose?
104 in total: 73 read-only, 25 that write, and 6 that can delete or overwrite (contentrain_branch_delete, contentrain_content_delete, contentrain_media_delete, contentrain_model_delete, contentrain_vocabulary_delete). Every one is listed on this page with its risk.
Is ai safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (51/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 6 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does ai need?
It reads CONTENTRAIN_AUTHOR_EMAIL, CONTENTRAIN_AUTHOR_NAME, CONTENTRAIN_CDN_KEY, CONTENTRAIN_WP_APP_PASSWORD, CONTENTRAIN_WP_AUTH, GH_TOKEN, GITHUB_APP_PRIVATE_KEY, GITHUB_TOKEN and MCP_BEARER_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does ai run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as contentrain-astro-starter at 0.0.0.
How current is this page?
The grade is for one exact copy of the source (680a73720388), read on 2026-10-11. The repository is watched and re-audited when it changes.