---
name: gentic-content
description: "Give your AI agent your brand voice. Build a writing profile from your existing content, then generate on-brand drafts scored against it — stylometric fit, anti-slop, near-copy and factuality checks, with a scorecard and ship decision — all through the Model Context Protocol. Pay per result, no subscriptions."
license: MIT
metadata:
  author: gentic
  version: "1.0.0"
---

# Gentic Content

Give your AI agent your brand's voice. Feed it your existing writing, and the Content server builds a writing profile — a stylometric fingerprint, your brand lexicon, and an anti-slop calibration — then generates on-brand drafts from a brief, scored against that profile with a checkable scorecard. Learn the voice, build the profile, write the draft — all through the Model Context Protocol.

## When to apply

- User wants to generate marketing copy, a blog post, email, or newsletter that sounds like their brand.
- User wants to teach the system their brand voice from examples of their existing writing.
- User wants an objective, checkable measure of whether a draft is on-brand.
- User wants drafts screened for AI 'slop', near-duplicates of source material, or unsupported claims before shipping.
- User wants to rebuild or update the brand's writing profile as their voice evolves.
- User wants to feed on-brand drafts into a review, CMS, or publishing workflow.

## Tools

| Tool | Description | Cost |
|------|-------------|------|
| `add_content_sample` | Add a piece of the brand's existing writing to the content corpus (used to build the writing profile). Give it as `text` (paste) or a `url` to fetch — one of the two. For a URL, the page is fetched and the article text is extracted (boilerplate stripped); review the returned preview, then call approve_content_sample to make it eligible for profiling. Pasted text is stored as-is (still needs approval). Specify the content_type (blog, email, newsletter, ...). Free. | Free |
| `approve_content_sample` | Approve a captured content sample's extraction (from add_content_sample) so it becomes eligible to build a writing profile. Pass the sample_id add_content_sample returned. Free. | Free |
| `build_writing_profile` | Build (or rebuild) the brand's writing profile for one voice + content type — async. Runs anti-slop-first: filters the corpus to the slop-free subset, then computes the stylometric fingerprint + brand lexicon + on-voice calibration from that subset. Returns a job_id immediately; poll get_content_jobs, then read get_writing_profile. Requires approved brand content samples (add_content_sample) of that content_type first. Billed per build on completion. | 200¢ / result |
| `create_content` | Generate an on-brand draft from a brief, scored against the brand's writing profile — async. The writer generates candidates, ranks by stylometric fit, and gates on a two-family on-voice panel + anti-slop + near-copy + factuality. Returns a job_id; poll get_content_jobs for the draft + a checkable scorecard + a decision (auto_ship / needs_review / needs_profile_rebuild). Requires an approved writing profile (build_writing_profile) first. Billed per shipped draft. | 50¢ / result |
| `get_content_jobs` | Poll a Content job by id (profile build or content generation). Returns status (pending/complete/failed), timed_out, and — when complete — the result: for a profile build, the profile_version_id; for content generation, draft_ref + decision (auto_ship \| needs_review) + scorecard. Use this after build_writing_profile / create_content returns a job_id. Free. | Free |
| `get_writing_profile` | Get the brand's built writing profile (the objective scorer: stylometric fingerprint band + brand lexicon + on-voice judge threshold + anti-slop clean-subset provenance). By default returns the current APPROVED profile, or the latest draft if none is approved yet. Pass `version` or `id` to fetch a specific version, or `list=true` to list all versions. Free. | Free |
| `list_content_samples` | List the brand content samples in the corpus (from add_content_sample) — id, content_type, title, source, word_count, and whether each is eligible (approved) for profiling. Use it to find pending samples to approve. Free. | Free |

## Workflow

### 1. Build the corpus with `add_content_sample`

Add examples of the brand's real writing — pass `text` (paste) OR a `url` to fetch (the article text is extracted and boilerplate stripped; review the returned preview). Tag each with its `content_type` (blog, email, newsletter, …). Both pasted and fetched samples need approval next. `add_content_sample` is **free**. List what's in the corpus with `list_content_samples` (free).

### 2. Approve extractions with `approve_content_sample`

Approve each captured sample so it becomes eligible to build a profile. Only approved samples of a given `content_type` feed that type's profile — so approve deliberately, and keep off-voice or low-quality pieces out. `approve_content_sample` is **free**.

### 3. Build the profile with `build_writing_profile`

Build (or rebuild) the writing profile for one voice + content type — **async, billed per build on completion (200¢)**. It runs anti-slop-first: filters the corpus to the slop-free subset, then computes the stylometric fingerprint + brand lexicon + on-voice calibration from that subset. Requires approved samples of that content type first. Returns a `job_id` — poll `get_content_jobs`, then read the result with `get_writing_profile` (free).

### 4. Generate a draft with `create_content`

Give it a brief. **Async, billed per shipped draft on completion (50¢)**. The writer generates candidates, ranks by stylometric fit, and gates on a two-family on-voice panel + anti-slop + near-copy + factuality. Requires an approved writing profile first. Returns a `job_id` — poll `get_content_jobs` for the draft, a checkable scorecard, and a `decision` (`auto_ship` / `needs_review` / `needs_profile_rebuild`).

### 5. Poll async jobs with `get_content_jobs`

Both `build_writing_profile` and `create_content` return a `job_id` immediately and run in the background. Poll `get_content_jobs` by id for `status` (pending / complete / failed), a `timed_out` flag, and the result. `get_content_jobs` is **free** — poll freely; you're only billed when the underlying build or draft completes.

### 6. Act on the decision

Read the scorecard and `decision`. `auto_ship` — the draft cleared every gate; present it and its scores. `needs_review` — surface the specific gate(s) it's borderline on so the user can decide. `needs_profile_rebuild` — the profile no longer fits (voice drift or too thin a corpus); add more approved samples and rebuild before generating again. Never present a draft as 'on-brand' without its scorecard.

## Notes

- Two billable meters, everything else free: `build_writing_profile` is **200¢ per build** and `create_content` is **50¢ per shipped draft**, both charged on completion. `add_content_sample`, `approve_content_sample`, `list_content_samples`, `get_writing_profile`, and `get_content_jobs` are free.
- Order matters: add samples → approve them → build a profile → generate content. `build_writing_profile` needs approved samples of that content type; `create_content` needs an approved profile.
- Async: profile builds and draft generations return a `job_id` and run in the background. Poll `get_content_jobs`; you're billed only when the job completes.
- One profile per voice + content type. Build separate profiles for, say, blog vs. email — each is scored on its own corpus.
- The profile is the objective scorer: stylometric fingerprint band + brand lexicon + on-voice judge threshold, built from the anti-slop clean subset. That's what makes 'on-brand' checkable rather than a matter of taste.
- `get_writing_profile` returns the current approved profile by default; pass `version`/`id` for a specific one, or `list=true` to see all versions.

## Tool details

- `add_content_sample` — Add a piece of the brand's existing writing to the content corpus (used to build the writing profile). Give it as `text` (paste) or a `url` to fetch — one of the two. For a URL, the page is fetched and the article text is extracted (boilerplate stripped); review the returned preview, then call approve_content_sample to make it eligible for profiling. Pasted text is stored as-is (still needs approval). Specify the content_type (blog, email, newsletter, ...). Free.
  - `text` (string) — Paste the brand's writing directly. Provide this OR url, not both.
  - `url` (string) — A URL to fetch + extract the article text from. Provide this OR text.
  - `content_type` (string, required) — The sample's type: blog | newsletter | instagram_caption | tiktok_caption | youtube_description | youtube_title | x_post | linkedin_post | email | ad_copy | product_description | other.
  - `title` (string) — Optional title of the piece.
  - `author` (string) — Optional author.
  - `channel` (string) — Optional distribution channel.
  - `audience` (string) — Optional audience the piece was written for.
  - `purpose` (string) — Optional intent / funnel stage.
  - `published_at` (string) — Optional original publish date (ISO).
  - `approve` (boolean) — Approve the extraction immediately (skip the review step). Default false — the sample is captured but not eligible until approved.
- `approve_content_sample` — Approve a captured content sample's extraction (from add_content_sample) so it becomes eligible to build a writing profile. Pass the sample_id add_content_sample returned. Free.
  - `sample_id` (string, required) — The sample_id returned by add_content_sample.
- `build_writing_profile` — Build (or rebuild) the brand's writing profile for one voice + content type — async. Runs anti-slop-first: filters the corpus to the slop-free subset, then computes the stylometric fingerprint + brand lexicon + on-voice calibration from that subset. Returns a job_id immediately; poll get_content_jobs, then read get_writing_profile. Requires approved brand content samples (add_content_sample) of that content_type first. Billed per build on completion.
  - `voice` (string, required) — The scoping label for this profile (e.g. the brand/voice name). Stamped on every corpus doc — one profile = one voice.
  - `content_type` (string, required) — The single content type to profile (e.g. 'blog', 'email'). Only approved samples of this type feed the build.
  - `profile_key` (string) — Which profile lineage to (re)build (default 'default').
  - `min_docs` (integer) — Minimum clean docs before the profile is trusted (default 3). Below this after the anti-slop gate → a loud unfiltered-fallback warning; below it even unfiltered → the build fails.
  - `df_floor_frac` (number) — Document-frequency floor for the brand lexicon (default 0.2 = a word must appear in ≥20% of clean docs).
- `create_content` — Generate an on-brand draft from a brief, scored against the brand's writing profile — async. The writer generates candidates, ranks by stylometric fit, and gates on a two-family on-voice panel + anti-slop + near-copy + factuality. Returns a job_id; poll get_content_jobs for the draft + a checkable scorecard + a decision (auto_ship / needs_review / needs_profile_rebuild). Requires an approved writing profile (build_writing_profile) first. Billed per shipped draft.
  - `brief` (string, required) — What to write — the topic, angle, key points, audience, CTA. The more specific, the better the draft.
  - `profile_key` (string) — Which writing profile to write against (default 'default'). Uses the current-approved version.
  - `profile_version` (integer) — Pin a specific profile version instead of the current-approved one.
  - `source_facts` (array of string) — Approved facts/claims the draft may use — the factuality gate checks the draft's claims against these.
- `get_content_jobs` — Poll a Content job by id (profile build or content generation). Returns status (pending/complete/failed), timed_out, and — when complete — the result: for a profile build, the profile_version_id; for content generation, draft_ref + decision (auto_ship | needs_review) + scorecard. Use this after build_writing_profile / create_content returns a job_id. Free.
  - `job_id` (string, required) — The job id returned by build_writing_profile or create_content.
- `get_writing_profile` — Get the brand's built writing profile (the objective scorer: stylometric fingerprint band + brand lexicon + on-voice judge threshold + anti-slop clean-subset provenance). By default returns the current APPROVED profile, or the latest draft if none is approved yet. Pass `version` or `id` to fetch a specific version, or `list=true` to list all versions. Free.
  - `profile_key` (string) — Which profile lineage (default 'default'). Most orgs have one.
  - `version` (integer) — Fetch a specific built version. Omit for the current-approved (or latest draft).
  - `id` (string) — Fetch a specific version by its id (what generation pins). Overrides `version`.
  - `list` (boolean) — List all versions (id/version/status/model, no heavy JSON) instead of returning one profile.
- `list_content_samples` — List the brand content samples in the corpus (from add_content_sample) — id, content_type, title, source, word_count, and whether each is eligible (approved) for profiling. Use it to find pending samples to approve. Free.
  - `content_type` (string) — Filter to one content type.
  - `eligible_only` (boolean) — Only samples already eligible for profiling (approved, non-generated).
  - `limit` (integer) — Page size (default 50).
  - `cursor` (string) — Pagination cursor (the last id of the previous page).

---

_This SKILL.md is generated from the live Gentic MCP manifest. Tool names, descriptions, and pricing are always current. Connect Gentic Content at https://gentic.co/content._
