github TypeScript re-analysis due

Contentrain/ai

github

Repo-native content governance for AI agents. Extract, review, and deliver UI text, docs, and structured content from Git.

maintainer
Contentrain
license
MIT
first seen
2026-06-03
last seen
2026-09-04
releases · 30d
75
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 27 tools
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
skills & danger signals github-tarball
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

danger signals2

code evidence v@contentrain/skills@0.8.1 · github-tarball
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',