Gentic Content — Documentation
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.
1. Getting Started
Sign Up & Get Your API Key
Before you can use Gentic Content, you need an API key to authenticate your requests.
- Go to gentic.co/content and create an account.
- Create an organization from your dashboard. API keys and billing are scoped to the organization.
- Generate an API key and use it as a Bearer token in your MCP client.
2. Connecting to the MCP Server
The server is available at https://mcp.gentic.co/content. For Claude Code:
claude mcp add gentic-content \
--transport http \
https://mcp.gentic.co/content \
--header "Authorization: Bearer YOUR_API_KEY"For Claude Web and ChatGPT you can also connect via OAuth — no API key needed. See the connect section on the landing page for other MCP clients (n8n, OpenClaw).
3. Agent Skill
For the best results, pair the MCP server with the Gentic Content agent skill. The MCP server gives your agent tool access; the skill teaches it the optimal workflow order. Both the raw SKILL.md and a ready-to-upload .skill bundle are generated on demand from the live manifest, so they always reflect the current tools and pricing.
Add the skill directly via URL:
https://gentic.co/content/SKILL.mdOr upload a .skill bundle to Claude Managed Agents:
https://gentic.co/content/gentic-content.skillDownload this file and upload it wherever Claude Managed Agents asks for a .skill file. It's a zip bundle generated on demand from the latest SKILL.md.
4. 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.
5. 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.
6. Tool Reference
7 tools, rendered live from the Gentic MCP manifest. Parameter tables come directly from each tool's JSON Schema.
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.
| Parameter | Type | Description |
|---|---|---|
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_typerequired | string | 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.
| Parameter | Type | Description |
|---|---|---|
sample_idrequired | string | 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.
| Parameter | Type | Description |
|---|---|---|
voicerequired | string | The scoping label for this profile (e.g. the brand/voice name). Stamped on every corpus doc — one profile = one voice. |
content_typerequired | string | 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. 1 – 9007199254740991 |
df_floor_frac | number | Document-frequency floor for the brand lexicon (default 0.2 = a word must appear in ≥20% of clean docs). 0 – 1 |
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.
| Parameter | Type | Description |
|---|---|---|
briefrequired | string | 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. 1 – 9007199254740991 |
source_facts | 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.
| Parameter | Type | Description |
|---|---|---|
job_idrequired | string | 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.
| Parameter | Type | Description |
|---|---|---|
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). 1 – 9007199254740991 |
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.
| Parameter | Type | Description |
|---|---|---|
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). 1 – 200 |
cursor | string | Pagination cursor (the last id of the previous page). |
7. Pricing
Pricing is pulled live from the Gentic MCP manifest. All prices are per call and deducted from your Gentic credits.
| Tool | Cost |
|---|---|
| add_content_sample | Free |
| approve_content_sample | Free |
| build_writing_profile | 200¢ / result |
| create_content | 50¢ / result |
| get_content_jobs | Free |
| get_writing_profile | Free |
| list_content_samples | Free |
8. 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.