Repo-native content governance for AI agents. Extract, review, and deliver UI text, docs, and structured content from Git.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http
verified
reported
listed in the official MCP registry counts 27 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
contentrain_apply
-
contentrain_branch_delete
-
contentrain_branch_list
-
contentrain_bulk
-
contentrain_content_delete
-
contentrain_content_list
-
contentrain_content_save
-
contentrain_describe
-
contentrain_describe_format
-
contentrain_doctor
-
contentrain_init
-
contentrain_media_delete
-
contentrain_media_get
-
contentrain_media_ingest
-
contentrain_media_list
-
contentrain_media_update
-
contentrain_merge
-
contentrain_model_delete
-
contentrain_model_save
-
contentrain_reconcile
-
contentrain_scaffold
-
contentrain_scan
-
contentrain_status
-
contentrain_submit
-
contentrain_validate
-
contentrain_vocabulary_delete
-
contentrain_vocabulary_save
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 66f1b7f · analyzer v33 · 22h ago
skills & prompt files 29
- agent-rules Contentrain-ai-66f1b7f/AGENTS.md
- agent-rules Contentrain-ai-66f1b7f/CLAUDE.md
- prompt-file Contentrain-ai-66f1b7f/packages/rules/prompts/common.md
- prompt-file Contentrain-ai-66f1b7f/packages/rules/prompts/generate-mode.md
- prompt-file Contentrain-ai-66f1b7f/packages/rules/prompts/normalize-mode.md
- prompt-file Contentrain-ai-66f1b7f/packages/rules/prompts/review-mode.md
- skill Contentrain-ai-66f1b7f/packages/sdk/js/skills/contentrain-query/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-bulk/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-content/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-diff/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-doctor/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-generate/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-init/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-model/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-normalize/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-quality/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-review/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-sdk/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-serve/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-translate/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain-validate-fix/SKILL.md
- skill Contentrain-ai-66f1b7f/packages/skills/skills/contentrain/SKILL.md
- skill Contentrain-ai-66f1b7f/plugins/contentrain/skills/contentrain-init/SKILL.md
- skill Contentrain-ai-66f1b7f/plugins/contentrain/skills/contentrain-model/SKILL.md
- skill Contentrain-ai-66f1b7f/plugins/contentrain/skills/contentrain-normalize/SKILL.md
- skill Contentrain-ai-66f1b7f/plugins/contentrain/skills/contentrain-review/SKILL.md
- skill Contentrain-ai-66f1b7f/plugins/contentrain/skills/contentrain-serve/SKILL.md
- skill Contentrain-ai-66f1b7f/plugins/contentrain/skills/contentrain-validate-fix/SKILL.md
- skill Contentrain-ai-66f1b7f/plugins/contentrain/skills/contentrain/SKILL.md
danger signals2
- suspicious endpoint 169.254.169.254 (cloud metadata) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/media.test.ts :152
arguments: { url: 'https://169.254.169.254/latest' }, - committed secret GitHub token Contentrain-ai-66f1b7f/packages/types/src/index.test.ts :964
ghp_16…(40 chars, redacted)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 454
filesystem 87
- fs (weak) Contentrain-ai-66f1b7f/docs/.vitepress/config.ts :1
import { readdirSync, readFileSync, writeFileSync } from 'node:fs' - fs Contentrain-ai-66f1b7f/packages/cli/src/commands/import.ts :3
import { createReadStream, existsSync } from 'node:fs' - fs Contentrain-ai-66f1b7f/packages/cli/src/commands/init.ts :14
import { writeFile, readFile, appendFile } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/cli/src/serve/server.ts :19
import { existsSync, readFileSync } from 'node:fs' - fs Contentrain-ai-66f1b7f/packages/cli/src/studio/auth/credential-store.ts :14
import { readFile, writeFile, unlink, stat, chmod, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/cli/src/utils/demo.ts :2
import { mkdtemp, rm } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/cli/src/utils/ide.ts :2
import { readFile, writeFile, appendFile } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/cli/src/utils/watch.ts :1
import { watch } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/cli/tests/commands/import.test.ts :2
import { mkdtemp, readFile, writeFile, mkdir, access } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/cli/tests/integration/init-command.integration.test.ts :3
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/cli/tests/integration/serve.integration.test.ts :2
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/cli/tests/integration/validate.integration.test.ts :3
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/cli/tests/studio/credential-store.test.ts :3
import { mkdtemp, rm, stat, chmod, writeFile, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/cli/tests/utils/ide.test.ts :2
import { mkdtemp, rm, mkdir, readFile, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/emitter-astro/src/runtime.test.ts :2
import { mkdir, rm, writeFile } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/core/content-manager.ts :4
import { rm } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/core/doctor.ts :3
import { readdir, stat } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/core/meta-manager.ts :3
import { rm } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/core/model-manager.ts :4
import { rm } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/core/ops/apply-to-worktree.ts :1
import { mkdir, rm, writeFile } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/core/scan-config.ts :1
import { readdir } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/core/validator/project.ts :4
import { rm } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/git/identity.ts :20
import { accessSync, constants } from 'node:fs' - fs Contentrain-ai-66f1b7f/packages/mcp/src/git/transaction.ts :4
import { rm as removeFile } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/providers/local/reader.ts :1
import { access, readdir, readFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/src/testing/conformance.ts :1
import { existsSync, readdirSync, readFileSync } from 'node:fs' - fs Contentrain-ai-66f1b7f/packages/mcp/src/tools/setup.ts :6
import { readFile, writeFile, appendFile } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/util/detect.ts :3
import { readdir } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/mcp/src/util/fs.ts :1
import { readFile, readdir, access, writeFile, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/conformance.test.ts :2
import { cp, mkdtemp, readdir, readFile, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/apply-guardrails.test.ts :5
import { mkdtemp, rm, writeFile, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/ast-scanner/benchmark.test.ts :3
import { appendFile, readdir, readFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/ast-scanner/integration.test.ts :2
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/ast-scanner/tsx-parser.test.ts :115
const code = `const fs = require('node:fs')` - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/content.test.ts :3
import { mkdtemp, rm, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/doctor.test.ts :2
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/model-manager.test.ts :3
import { mkdtemp, rm, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/scanner.test.ts :2
import { mkdir, writeFile, rm, mkdtemp } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/validator/leaked-schedule-fix.test.ts :3
import { mkdtemp, readFile, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/validator/legacy-field-names.test.ts :3
import { mkdtemp, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/validator/stray-meta-fix.test.ts :3
import { mkdtemp, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/core/validator/title-field-fix.test.ts :3
import { mkdtemp, readFile, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/docs-parity.test.ts :2
import { existsSync, readFileSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/fixtures/bare-remote.ts :1
import { mkdtemp } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/git/branch-lifecycle.test.ts :2
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/git/identity.test.ts :2
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/git/reconcile.test.ts :5
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/git/ref-reader.test.ts :5
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/git/remote-branches.test.ts :2
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/git/transaction.test.ts :5
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/model-field-order.test.ts :3
import { mkdtemp, readFile, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/providers/local/branch-ops.test.ts :2
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/providers/local/migration.test.ts :2
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/providers/local/reader.test.ts :2
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/registry-manifest.test.ts :2
import { readFileSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/server/http.test.ts :2
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/setup/trim-path.ts :1
import { accessSync, constants } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/support/project.ts :1
import { cp, mkdtemp } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/testing/conformance.test.ts :2
import { existsSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/apply.test.ts :5
import { mkdtemp, rm, writeFile, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/bulk.test.ts :5
import { rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/content-gate.test.ts :5
import { rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/content.test.ts :5
import { rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/context.test.ts :3
import { cp, mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/doctor.test.ts :2
import { mkdtemp, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/model.test.ts :4
import { mkdtemp, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/normalize.test.ts :5
import { mkdtemp, rm, writeFile, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/reconcile.test.ts :5
import { rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/setup.test.ts :5
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/workflow-remote.test.ts :5
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/tools/workflow.test.ts :5
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/util/detect.test.ts :3
import { mkdtemp, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/rules/tests/mcp-parity.test.ts :2
import { readFileSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/rules/tests/validate-rules.test.ts :2
import { existsSync, readFileSync } from 'node:fs' - fs Contentrain-ai-66f1b7f/packages/sdk/js/src/cli.ts :4
import { watch } from 'node:fs' - fs Contentrain-ai-66f1b7f/packages/sdk/js/src/generator/generate.ts :2
import { rm } from 'node:fs/promises' - fs Contentrain-ai-66f1b7f/packages/sdk/js/src/generator/utils.ts :1
import { readFile, readdir, writeFile, mkdir } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/sdk/js/tests/generator/config-reader.test.ts :4
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/sdk/js/tests/generator/data-emitter.test.ts :6
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/sdk/js/tests/generator/package-json.test.ts :3
import { readFileSync, writeFileSync, mkdirSync, rmSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/sdk/js/tests/integration/generate.test.ts :3
import { access, cp, mkdtemp, readFile, rm, unlink, writeFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/sdk/js/tests/integration/platform-proof.test.ts :2
import { access, cp, mkdtemp, readFile, rm } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/packages/skills/tests/mcp-parity.test.ts :2
import { readFileSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/packages/skills/tests/validate-skills.test.ts :2
import { existsSync, readFileSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/scripts/build-plugin.mjs :19
import { cpSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs' - fs (weak) Contentrain-ai-66f1b7f/scripts/release-check.mjs :1
import { readFile } from 'node:fs/promises' - fs (weak) Contentrain-ai-66f1b7f/scripts/release-pack.mjs :1
import { mkdir } from 'node:fs/promises'
shell / exec 4
- shell Contentrain-ai-66f1b7f/packages/cli/src/commands/serve.ts :177
import('node:child_process').then(({ exec }) => { - shell Contentrain-ai-66f1b7f/packages/cli/src/utils/browser.ts :5
const { exec } = await import('node:child_process') - shell (weak) Contentrain-ai-66f1b7f/packages/cli/tests/integration/validate.integration.test.ts :4
import { spawnSync } from 'node:child_process' - shell (weak) Contentrain-ai-66f1b7f/scripts/release-pack.mjs :3
import { execFileSync } from 'node:child_process'
network 18
- net Contentrain-ai-66f1b7f/.contentrain/client/data/docs-guides--frameworks.mjs :2
await useAsyncData('blog-posts', () => $fetch('/api/blog-posts'))\n</script>\n```\n\n### Dynamic routes\n\n```ts\n// server/api/blog-post/[slug].get.ts\nimport { document } from '#contentrain'\nimport - net Contentrain-ai-66f1b7f/packages/cli/src/serve-ui/src/composables/useApi.ts :4
const res = await fetch(`${BASE}${path}`, { - net Contentrain-ai-66f1b7f/packages/cli/src/serve/server.ts :12
import type { IncomingMessage } from 'node:http' - net Contentrain-ai-66f1b7f/packages/cli/src/studio/auth/oauth-server.ts :11
import { createServer, type Server } from 'node:http' - net Contentrain-ai-66f1b7f/packages/cli/src/studio/client.ts :76
const res = await globalThis.fetch(url.toString(), { - net Contentrain-ai-66f1b7f/packages/cli/src/studio/commands/login.ts :115
const verifyRes = await globalThis.fetch(`${studioUrl}/api/auth/verify`, { - net (weak) Contentrain-ai-66f1b7f/packages/cli/tests/studio/oauth-server.test.ts :52
await globalThis.fetch(callbackUrl) - net Contentrain-ai-66f1b7f/packages/mcp/src/git/branch-lifecycle.ts :503
await git.fetch(listed.remote, `+refs/heads/cr/*:refs/remotes/${listed.remote}/cr/*`) - net Contentrain-ai-66f1b7f/packages/mcp/src/git/reconcile.ts :101
net.fetch(remoteName, baseBranch).catch(() => {}), - net Contentrain-ai-66f1b7f/packages/mcp/src/git/transaction.ts :255
net.fetch(remoteName, baseBranch).catch(() => {}), - net Contentrain-ai-66f1b7f/packages/mcp/src/providers/github/reader.ts :42
if (!this.opts?.memoize) return fetch() - net Contentrain-ai-66f1b7f/packages/mcp/src/server/http/server.ts :1
import http from 'node:http' - net (weak) Contentrain-ai-66f1b7f/packages/mcp/tests/server/http.test.ts :114
const response = await fetch(outsideUrl, { method: 'POST' }) - net Contentrain-ai-66f1b7f/packages/sdk/js/src/cdn/conversation-client.ts :73
const res = await globalThis.fetch(url, { - net Contentrain-ai-66f1b7f/packages/sdk/js/src/cdn/forms-client.ts :51
const res = await globalThis.fetch(url, { headers }) - net Contentrain-ai-66f1b7f/packages/sdk/js/src/cdn/http-transport.ts :128
const res = await globalThis.fetch(url, { headers }) - net (weak) Contentrain-ai-66f1b7f/packages/sdk/js/tests/cdn/bundle-preload.test.ts :160
const primed = await transport.fetch('content/old/en.json') - net (weak) Contentrain-ai-66f1b7f/packages/sdk/js/tests/cdn/http-transport.test.ts :35
await transport.fetch('_manifest.json')
secrets 7
- secrets Contentrain-ai-66f1b7f/.contentrain/client/data/docs-guides--embedding-mcp.mjs :2
3333,\n host: '0.0.0.0',\n authToken: process.env.MCP_BEARER_TOKEN,\n})\n\n// handle.url — \"http://0.0.0.0:3333/mcp\"\n// handle.close() — shuts down when you're done\n```\n\nCLI equivalent: `conte - secrets Contentrain-ai-66f1b7f/.contentrain/client/data/docs-guides--http-transport.mjs :2
ovider({\n auth: { type: 'pat', token: process.env.GITHUB_TOKEN! },\n repo: { owner: 'acme', name: 'site' },\n})\n\nconst handle = await startHttpMcpServerWith({\n provider,\n port: 3333,\n host: - secrets Contentrain-ai-66f1b7f/.contentrain/client/data/docs-guides--providers.mjs :2
ovider({\n auth: { type: 'pat', token: process.env.GITHUB_TOKEN! },\n repo: { owner: 'acme', name: 'site' },\n})\n\nconst handle = await startHttpMcpServerWith({\n provider,\n port: 3333,\n authT - secrets Contentrain-ai-66f1b7f/packages/cli/src/commands/serve.ts :65
const authToken = args.authToken ?? process.env['CONTENTRAIN_AUTH_TOKEN'] - secrets Contentrain-ai-66f1b7f/packages/cli/src/studio/auth/credential-store.ts :48
const envToken = process.env['CONTENTRAIN_STUDIO_TOKEN'] - secrets Contentrain-ai-66f1b7f/packages/cli/src/studio/commands/cdn-init.ts :101
${pc.dim(' apiKey: process.env.CONTENTRAIN_CDN_KEY,')} - secrets (weak) Contentrain-ai-66f1b7f/packages/cli/tests/studio/credential-store.test.ts :16
originalToken = process.env['CONTENTRAIN_STUDIO_TOKEN']
tool registrations 27
- contentrain_bulk Contentrain-ai-66f1b7f/packages/mcp/src/tools/bulk.ts :22
- contentrain_content_save Contentrain-ai-66f1b7f/packages/mcp/src/tools/content.ts :23
- contentrain_content_delete Contentrain-ai-66f1b7f/packages/mcp/src/tools/content.ts :244
- contentrain_content_list Contentrain-ai-66f1b7f/packages/mcp/src/tools/content.ts :345
- contentrain_status Contentrain-ai-66f1b7f/packages/mcp/src/tools/context.ts :23
- contentrain_describe Contentrain-ai-66f1b7f/packages/mcp/src/tools/context.ts :171
- contentrain_describe_format Contentrain-ai-66f1b7f/packages/mcp/src/tools/context.ts :232
- contentrain_doctor Contentrain-ai-66f1b7f/packages/mcp/src/tools/doctor.ts :13
- contentrain_media_list Contentrain-ai-66f1b7f/packages/mcp/src/tools/media.ts :50
- contentrain_media_get Contentrain-ai-66f1b7f/packages/mcp/src/tools/media.ts :76
- contentrain_media_ingest Contentrain-ai-66f1b7f/packages/mcp/src/tools/media.ts :104
- contentrain_media_update Contentrain-ai-66f1b7f/packages/mcp/src/tools/media.ts :126
- contentrain_media_delete Contentrain-ai-66f1b7f/packages/mcp/src/tools/media.ts :149
- contentrain_model_save Contentrain-ai-66f1b7f/packages/mcp/src/tools/model.ts :24
- contentrain_model_delete Contentrain-ai-66f1b7f/packages/mcp/src/tools/model.ts :170
- contentrain_scan Contentrain-ai-66f1b7f/packages/mcp/src/tools/normalize.ts :19
- contentrain_apply Contentrain-ai-66f1b7f/packages/mcp/src/tools/normalize.ts :138
- contentrain_reconcile Contentrain-ai-66f1b7f/packages/mcp/src/tools/reconcile.ts :27
- contentrain_init Contentrain-ai-66f1b7f/packages/mcp/src/tools/setup.ts :27
- contentrain_scaffold Contentrain-ai-66f1b7f/packages/mcp/src/tools/setup.ts :189
- contentrain_vocabulary_save Contentrain-ai-66f1b7f/packages/mcp/src/tools/vocabulary.ts :28
- contentrain_vocabulary_delete Contentrain-ai-66f1b7f/packages/mcp/src/tools/vocabulary.ts :106
- contentrain_validate Contentrain-ai-66f1b7f/packages/mcp/src/tools/workflow.ts :68
- contentrain_submit Contentrain-ai-66f1b7f/packages/mcp/src/tools/workflow.ts :200
- contentrain_merge Contentrain-ai-66f1b7f/packages/mcp/src/tools/workflow.ts :368
- contentrain_branch_list Contentrain-ai-66f1b7f/packages/mcp/src/tools/workflow.ts :449
- contentrain_branch_delete Contentrain-ai-66f1b7f/packages/mcp/src/tools/workflow.ts :520
declared dependencies 4
- @changesets/cli@^2.29.6
- lefthook@^2.1.4
- oxlint@^1.54.0
- vitest@^3.0.0
clipboard 1
- navigator.clipboard Contentrain-ai-66f1b7f/packages/cli/src/serve-ui/src/composables/useFormatters.ts :57
await navigator.clipboard.writeText(text)
transport_posture 1
- binds all interfaces (0.0.0.0) Contentrain-ai-66f1b7f/packages/cli/tests/commands/serve.test.ts :117
host: '0.0.0.0',