Context Blog MCP
The publishing engine for Context: agents draft, lint and publish blog posts, site pages and Instagram carousels on the user's own domain, with a person approving every piece before it goes live. Also drives the AEO/GEO loop — tracking AI-referral traffic, Search Console queries and an AI-visibility probe so the agent can see and improve how often assistants cite the site.
https://sites.onecontext.me/api/mcpConnect
claude-ai
Settings → Connectors → Add custom connector → name Context Blog, URL https://sites.onecontext.me/api/mcp
chatgpt
Settings → Connectors → Add → URL https://sites.onecontext.me/api/mcp
claude-code
claude mcp add --transport http context-blog https://sites.onecontext.me/api/mcpcursor
Add an HTTP MCP server with URL https://sites.onecontext.me/api/mcp
Skills that wrap this server
- rules base Operating rules every Context-connected agent follows: sources of truth, work units, credentials by key name, verification before completion.
- setup-context base Connect this harness to the Context MCP and verify the connection before any other Context or Context Blog work.
- grill-me base Interview protocol that stress-tests a plan or brief with numbered questions and a recommendation per question until nothing is assumed.
- wayfinder base Chart a piece of work as a Context epic plus gated issues after a grilling interview, then work the issues one at a time.
- daily-brief base Format and rules for the once-a-day headless brief a routine posts to the tenant's Context brief issue.
- rules-blog base Rules for every Context Blog workflow: approvals in Context, one tenant at a time, key names only, no publishing without an approval reference.
- blog-agent workflow Draft, review and publish one blog post for a Context Blog tenant, tracked as one Context issue with an approval gate before publishing.
- site-builder workflow STUB — build or update a tenant site (pages, navigation, theme) through Context Blog with approval gates in Context. Full protocol lands with the site content tools.
- instagram-drafter workflow STUB — draft Instagram captions and carousel copy for a tenant, attached to a Context issue for approval. Full protocol lands with the Instagram tools.
Tools 44
Skills & setup 5 · all
usage_guide read-only Read this first — what Context Blog is, how it relates to the Context MCP (approvals live there), tools, tiers and rules.
Usage guide
Read this first — what Context Blog is, how it relates to the Context MCP (approvals live there), tools, tiers and rules.
Parameters
No parameters.
Output
- ok · boolean ● required
- data · object
Show 1 fields
- guide · string ● required
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · object
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
get_capabilities read-only Machine-readable Context Blog contract: version, tools, workflows, harnesses, auth methods and limits.
Get capabilities
Machine-readable Context Blog contract: version, tools, workflows, harnesses, auth methods and limits.
Parameters
No parameters.
Output
- ok · boolean ● required
- data · object
Show 10 fields
- contractVersion · string ● required
- product · string ● required
- tools · string[] ● required
- workflows · string[] ● required
- harnesses · string[] ● required
- harnessSkills · string[] ● required
- skillChannel · string ● required
- features · object ● required
- auth · any ● required
- limits · string ● required
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
list_skill_catalog read-only Active skills on the shared skill channel (key, kind, version, name, description, depends, url).
List skill catalog
Active skills on the shared skill channel (key, kind, version, name, description, depends, url).
Parameters
No parameters.
Output
- ok · boolean ● required
- data · object
Show 1 fields
- skills · object[] ● required
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
get_skill read-only One skill revision (active by default) with its SKILL.md content, extra files and provenance.
Get skill
One skill revision (active by default) with its SKILL.md content, extra files and provenance.
Parameters
- key · string ● required
- version · integer
Output
- ok · boolean ● required
- data · object
Show 1 fields
- skill · object ● required
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
setup read-only CALL THIS FIRST when starting Context Blog work in a repo or chat.
Setup
CALL THIS FIRST when starting Context Blog work in a repo or chat. Resolves the workflow's skill (blog-agent / site-builder / instagram-drafter) plus `rules-blog` and dependencies; harness skills (rules, setup-context, wayfinder, grill-me, daily-brief) are included unless listed in `installedSkills`. Returns `mode:"files"` (paths per harness + an AGENTS.md block) or `mode:"chat"` (public skill links + inline protocol). Idempotent, no side effects.
Parameters
- harness · enum
- one of:
claude-code|codex|cursor|generic|chat - canWriteFiles · boolean
- workflow · enum ● required
- one of:
blog|site|instagram - installedSkills · string[]
Output
- ok · boolean ● required
- data · object
Show 2 fields
- mode · enum ● required
- one of:
chat|files - nextStep · string ● required
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · object
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
Checker 4 · all
preview_render Server-side render of a draft article or page into one self-contained HTML page with the tenant's design tokens as CSS variables.
Render preview
Server-side render of a draft article or page into one self-contained HTML page with the tenant's design tokens as CSS variables. Stores it for 7 days and returns a signed, expiring URL (GET /preview/<id>?sig=…) plus the HTML — attach the HTML to the Context issue as docKind "preview". Caller must be a member of tenant_slug (a tenant with no members yet accepts any signed-in caller).
Parameters
- tenant_slug · string ● required
- kind · enum ● required
- one of:
article|page - title · string ● required
- description · string ● required
- sections · object | object | object | object | object | object | object | object[] ● required
- faq · object[]
Item fields (2)
- q · string ● required
- a · any ● required
- seo · object
- answer · string
- slug · string
- canonical · any
- keywords · string[]
- design_tokens · object
Output
- ok · boolean ● required
- data · object
Show 4 fields
- preview_id · string ● required
- url · string ● required
- html · string ● required
- expires_at · string ● required
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · object
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
content_lint read-only The MACHINE half of the blog-checker playbook, no side effects: answer-first ≤ 60 words, each H2 followed by a 40–75-word paragraph, table/list for comparison·listicle·how-to, FAQ 3–5 × 80–150 words, inline HTML allowlist (em/strong/a), ≥ 2 outbound citations, ≥ 2 numeric statistics, ≥ 1 original artifact, hub assigned, localised slug/title/description vs master, style rotation vs recent_styles, banned phrases, first-person density.
Lint content
The MACHINE half of the blog-checker playbook, no side effects: answer-first ≤ 60 words, each H2 followed by a 40–75-word paragraph, table/list for comparison·listicle·how-to, FAQ 3–5 × 80–150 words, inline HTML allowlist (em/strong/a), ≥ 2 outbound citations, ≥ 2 numeric statistics, ≥ 1 original artifact, hub assigned, localised slug/title/description vs master, style rotation vs recent_styles, banned phrases, first-person density. Returns warnings [{code, message, path?, severity}] and stats {words, h2s, citations, numbers, faq, artifacts, urls}. severity "error" = playbook rule violated.
Parameters
- kind · enum ● required
- one of:
article|page - title · string ● required
- description · string ● required
- sections · object | object | object | object | object | object | object | object[] ● required
- faq · object[]
Item fields (2)
- q · string ● required
- a · any ● required
- seo · object
- answer · string
- slug · string
- canonical · any
- keywords · string[]
- design_tokens · object
- style · enum
- one of:
guide|how-to|comparison|listicle|explainer|opinion+2 more
news|case-study - hub · string
- locale · string
- master · object
- slug · string
- title · string
- description · string
- recent_styles · string[]
- brand · object
- banned_phrases · string[]
- own_hosts · string[]
Output
- ok · boolean ● required
- data · object
Show 2 fields
- warnings · object[] ● required
Item fields (4)
{ "type": "object", "properties": { "code": { "type": "string" }, "message": { "type": "string" }, "path": { "type": "string" }, "severity": { "type": "string", "enum": [ "error", "warn" ] } }, "required": [ "code", "message", "severity" ], "additionalProperties": false }- stats · object ● required
Show 4 fields
{ "type": "object", "properties": { "words": { "type": "number" }, "h2s": { "type": "number" }, "citations": { "type": "number" }, "numbers": { "type": "number" } }, "required": [ "words", "h2s", "citations", "numbers" ], "additionalProperties": true }
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · object
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
check_record Append one blog-checker verdict for a draft: tenant_slug, subject_kind (article | page | instagram), subject_ref (the Context issue id, or a draft id before one exists), round (1 = first check), verdict (pass | bounce | escalate), findings (the verdict document's checks, as JSON) and models ({maker, checker}).
Record checker verdict
Append one blog-checker verdict for a draft: tenant_slug, subject_kind (article | page | instagram), subject_ref (the Context issue id, or a draft id before one exists), round (1 = first check), verdict (pass | bounce | escalate), findings (the verdict document's checks, as JSON) and models ({maker, checker}). Returns check_id. Approvals still live in Context — this is the audit trail on the publishing side. Caller must be a member of tenant_slug.
Parameters
- tenant_slug · string ● required
- subject_kind · enum ● required
- one of:
article|page|instagram - subject_ref · string ● required
- round · integer ● required
- verdict · enum ● required
- one of:
pass|bounce|escalate - findings · object[] ● required
- models · object ● required
- maker · string
- checker · string
Output
- ok · boolean ● required
- data · object
Show 1 fields
- check_id · string ● required
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · object
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
check_list read-only Every recorded blog-checker verdict for a subject_ref (Context issue id or draft id), oldest round first — use it to know the current round before bouncing again (bounce ≤ 2 rounds, then escalate).
List checker verdicts
Every recorded blog-checker verdict for a subject_ref (Context issue id or draft id), oldest round first — use it to know the current round before bouncing again (bounce ≤ 2 rounds, then escalate). Only rows for tenants the caller is a member of are returned.
Parameters
- subject_ref · string ● required
Output
- ok · boolean ● required
- data · object
Show 1 fields
- checks · object[] ● required
Item fields (9)
{ "type": "object", "properties": { "check_id": { "type": "string" }, "tenant_slug": { "type": "string" }, "subject_kind": { "type": "string" }, "subject_ref": { "type": "string" }, "round": { "type": "number" }, "verdict": { "type": "string" }, "findings": {}, "models": {}, "created_at": { "type": "string" } }, "required": [ "check_id", "tenant_slug", "subject_kind", "subject_ref", "round", "verdict", "created_at" ], "additionalProperties": false }
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · object
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
Tenant & brand 8 · all
tenant_create Create a tenant (a site such as getmeetly.ai/blog).
Create tenant
Create a tenant (a site such as getmeetly.ai/blog). The creator becomes its owner member (blog.tenant_members); membership already granted for the slug is honoured. tier: artifact (drafts only) | review (checker gate) | hosted (renderer + domains + IndexNow on publish; analytics ids via tenant_update { tracking }, see tracking_setup_status). Returns the tenant.
Parameters
- slug · string ● required
- name · string ● required
- tier · enum ● required
- one of:
artifact|review|hosted - products · enum[]
- recurrence · object
- locales · string[]
- default_locale · any
- timezone · string
- mount_path · string
- primary_hostname · string
- context_epic_id · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
tenant_get read-only Tenant settings plus brand profile, audiences, hubs, domains and content counts.
Get tenant
Tenant settings plus brand profile, audiences, hubs, domains and content counts. Caller must be a member.
Parameters
- slug · string ● required
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
tenant_update Patch tenant settings (name, tier, products, recurrence, locales, default_locale, timezone, mount_path, primary_hostname, context_epic_id, context_epic_surface: phone | web — where the epic was created, so the settings page leads with context://tasks/<epic> or the web URL).
Update tenant
Patch tenant settings (name, tier, products, recurrence, locales, default_locale, timezone, mount_path, primary_hostname, context_epic_id, context_epic_surface: phone | web — where the epic was created, so the settings page leads with context://tasks/<epic> or the web URL). Omitted fields keep their value; pass null to clear primary_hostname / context_epic_id. `tracking` (E8) patches blog.tracking_config — the one source of truth for analytics: umami_website_id (the renderer injects the Umami script when UMAMI_SCRIPT_URL is set on the host), ga4_measurement_id (BYO, consent-gated), gsc_property, bing_site_url, indexnow_enabled, brand_aliases / owned_domains (probe detection), probe_markets. Ids only — API keys stay on the host by NAME.
Parameters
- slug · string ● required
- name · string
- tier · enum
- one of:
artifact|review|hosted - products · enum[]
- recurrence · object
- locales · string[]
- default_locale · any
- timezone · string
- mount_path · string
- primary_hostname · string | null
- context_epic_id · string | null
- context_epic_surface · enum
- one of:
phone|web - tracking · object
- umami_website_id · string | null
- ga4_measurement_id · string | null
- gsc_property · string | null
- bing_site_url · string | null
- indexnow_enabled · boolean
- brand_aliases · string[]
- owned_domains · any[]
- probe_markets · string[]
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
brand_upsert Replace the tenant's brand profile: voice (persona, banned_phrases[], …), byline (author name/url), design_tokens (blog-agent/templates/design-tokens.json shape — used by previews and the renderer), optional organization_ld / software_application_ld (JSON-LD).
Upsert brand profile
Replace the tenant's brand profile: voice (persona, banned_phrases[], …), byline (author name/url), design_tokens (blog-agent/templates/design-tokens.json shape — used by previews and the renderer), optional organization_ld / software_application_ld (JSON-LD). Bumps revision and keeps the previous state in blog.brand_profile_revisions.
Parameters
- tenant_slug · string ● required
- voice · object ● required
- byline · any ● required
- design_tokens · object ● required
- organization_ld · any
- software_application_ld · any
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
audiences_upsert Upsert audience segments by key (name, description, pains[], queries[]).
Upsert audiences
Upsert audience segments by key (name, description, pains[], queries[]). Existing keys are replaced; others untouched.
Parameters
- tenant_slug · string ● required
- items · object[] ● required
Item fields (5)
- key · string ● required
- name · string ● required
- description · string
- pains · string[]
- queries · string[]
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
hubs_upsert Upsert topic hubs by slug (title, description, pillar_article_id).
Upsert hubs
Upsert topic hubs by slug (title, description, pillar_article_id). Every article must belong to a hub (the lint's hub_missing rule).
Parameters
- tenant_slug · string ● required
- items · object[] ● required
Item fields (4)
- slug · string ● required
- title · string ● required
- description · string
- pillar_article_id · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
topics_upsert Create or update topics (the research backlog): hub_slug, title, target_query, fanout_queries[], status (idea | researched | drafting | published | retired), context_issue_id, source.
Upsert topics
Create or update topics (the research backlog): hub_slug, title, target_query, fanout_queries[], status (idea | researched | drafting | published | retired), context_issue_id, source. Pass id to update.
Parameters
- tenant_slug · string ● required
- items · object[] ● required
Item fields (8)
- id · string
- hub_slug · string
- title · string ● required
- target_query · string
- fanout_queries · string[]
- status · enum
- one of:
idea|researched|drafting|published|retired - context_issue_id · any
- source · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
topics_list read-only Topics of a tenant, newest first, optionally filtered by status.
List topics
Topics of a tenant, newest first, optionally filtered by status.
Parameters
- tenant_slug · string ● required
- status · enum
- one of:
idea|researched|drafting|published|retired
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
Content (articles/pages) 9 · all
article_upsert Create or update an article draft.
Upsert article
Create or update an article draft. Same body as content_lint / preview_render. Runs the playbook lint: severity-error findings REJECT the call (invalid_argument, details.warnings) unless dry_run; warnings are always returned. Unique per (tenant, locale, slug); pass id to update (status is kept). translation_group ties locale variants together (the default-locale row is the master used for the localisation check). context_issue_id is the Context issue's uuid. Returns { id, status, warnings[], preview_url, url }.
Parameters
- tenant_slug · string ● required
- id · string
- slug · string ● required
- locale · string ● required
- translation_group · string ● required
- title · string ● required
- description · string ● required
- sections · object | object | object | object | object | object | object | object[] ● required
- faq · object[]
Item fields (2)
- q · string ● required
- a · any ● required
- seo · object ● required
- answer · string
- slug · string
- canonical · any
- keywords · string[]
- style · enum
- one of:
guide|how-to|comparison|listicle|explainer|opinion+2 more
news|case-study - hub_slug · string ● required
- topic_id · any
- hero_asset_id · any
- faq_title · string
- tags · string[]
- category · string
- internal_links · string[]
- publish_at · string
- context_issue_id · any ● required
- dry_run · boolean
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
article_get read-only One article by id, or by slug + locale.
Get article
One article by id, or by slug + locale. Full body.
Parameters
- tenant_slug · string ● required
- id · string
- slug · string
- locale · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
article_list read-only Articles of a tenant, newest first, without bodies.
List articles
Articles of a tenant, newest first, without bodies. Filters: status, locale, hub_slug. Pagination: limit (default 20, max 100) and the opaque cursor from next_cursor.
Parameters
- tenant_slug · string ● required
- status · enum
- one of:
draft|in_review|approved|published|retired - locale · string
- hub_slug · string
- limit · integer
- cursor · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
article_set_status Move an article one step forward: draft → in_review → approved → published → retired (any other jump is `conflict`).
Set article status
Move an article one step forward: draft → in_review → approved → published → retired (any other jump is `conflict`). Reaching published requires the article's context_issue_id AND assert_context_done: true — your assertion that the Context issue carries the owner's approval; it is recorded on blog.publish_events. Prefer `publish` for the final step.
Parameters
- tenant_slug · string ● required
- id · string ● required
- status · enum ● required
- one of:
draft|in_review|approved|published|retired - assert_context_done · boolean
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
page_upsert Create or update a site page (about, pricing, landing).
Upsert page
Create or update a site page (about, pricing, landing). Same body as content_lint with kind page: the article-only rules (answer-first, FAQ shape, hub, citations, statistics, artifact) do not apply; HTML allowlist and banned phrases do. Severity-error findings reject unless dry_run. Unique per (tenant, locale, slug). Returns { id, status, warnings[], preview_url, url }.
Parameters
- tenant_slug · string ● required
- id · string
- slug · string ● required
- locale · string ● required
- title · string ● required
- description · string ● required
- sections · object | object | object | object | object | object | object | object[] ● required
- faq · object[]
Item fields (2)
- q · string ● required
- a · any ● required
- seo · object ● required
- answer · string
- slug · string
- canonical · any
- keywords · string[]
- design_overrides · object
- context_issue_id · any ● required
- dry_run · boolean
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
page_get read-only One page by id, or by slug + locale.
Get page
One page by id, or by slug + locale. Full body.
Parameters
- tenant_slug · string ● required
- id · string
- slug · string
- locale · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
page_list read-only Pages of a tenant, newest first, without bodies.
List pages
Pages of a tenant, newest first, without bodies. Filters: status, locale. Paginated like article_list.
Parameters
- tenant_slug · string ● required
- status · enum
- one of:
draft|in_review|approved|published|retired - locale · string
- limit · integer
- cursor · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
page_set_status Move a page one step forward (draft → in_review → approved → published → retired).
Set page status
Move a page one step forward (draft → in_review → approved → published → retired). published requires context_issue_id on the page and assert_context_done: true, recorded on blog.publish_events.
Parameters
- tenant_slug · string ● required
- id · string ● required
- status · enum ● required
- one of:
draft|in_review|approved|published|retired - assert_context_done · boolean
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
publish Publish exactly one of article_id | page_id | instagram_post_id.
Publish
Publish exactly one of article_id | page_id | instagram_post_id. Requires the row to be approved (→ action publish) or already published (→ refresh), context_issue_id (must match the row's when set) and assert_context_done: true — your assertion that the Context issue carries the owner's approval, recorded as asserted_done_by on blog.publish_events. Sets published + published_at, purges the renderer's cache, pings IndexNow for hosted tenants with a primary_hostname (INDEXNOW_KEY on the host; the outcome is in `indexnow` and never fails the publish) and returns { url, published_at, action, publish_event_id, indexnow }.
Parameters
- tenant_slug · string ● required
- article_id · string
- page_id · any
- instagram_post_id · any
- assert_context_done · boolean ● required
- context_issue_id · any ● required
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
Assets 2 · all
asset_upload Reserve an asset row and get a signed PUT URL into the Supabase Storage bucket blog-assets (valid 2 h).
Request asset upload
Reserve an asset row and get a signed PUT URL into the Supabase Storage bucket blog-assets (valid 2 h). content_type ∈ image/jpeg | image/png | image/webp | image/gif | image/avif | image/svg+xml | video/mp4; size ≤ 26214400 bytes; sha256 of the file. PUT the bytes to upload.url with upload.headers, then call asset_complete. Returns { asset_id, storage_path, public_url, upload }.
Parameters
- tenant_slug · string ● required
- filename · string ● required
- size · integer ● required
- sha256 · string ● required
- content_type · enum ● required
- one of:
image/jpeg|image/png|image/webp|image/gif|image/avif|image/svg+xml+1 more
video/mp4 - kind · enum
- one of:
image|video|file
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
asset_complete Mark an uploaded asset ready and record width / height / alt.
Complete asset upload
Mark an uploaded asset ready and record width / height / alt. Returns the asset with its public_url — use asset_id as hero_asset_id or an Instagram slide.
Parameters
- tenant_slug · string ● required
- asset_id · string ● required
- width · integer
- height · integer
- alt · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
Instagram 4 · all
instagram_post_upsert Create or update an Instagram carousel draft: caption (≤ 2200 chars), slides (asset ids of this tenant, 1–10, in order), publish_at, context_issue_id.
Upsert Instagram post
Create or update an Instagram carousel draft: caption (≤ 2200 chars), slides (asset ids of this tenant, 1–10, in order), publish_at, context_issue_id. Pass id to update (status kept). Scheduling through Postiz is a later slice; publish marks it published and records the event.
Parameters
- tenant_slug · string ● required
- id · string
- caption · string ● required
- slides · any[] ● required
- publish_at · string
- context_issue_id · any ● required
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
instagram_post_get read-only One Instagram post by id: caption, slides, status, context_issue_id, Postiz id and permalink once posted.
Get Instagram post
One Instagram post by id: caption, slides, status, context_issue_id, Postiz id and permalink once posted.
Parameters
- tenant_slug · string ● required
- id · string ● required
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
instagram_post_list read-only Instagram posts of a tenant, newest first.
List Instagram posts
Instagram posts of a tenant, newest first. Filter: status. Paginated like article_list.
Parameters
- tenant_slug · string ● required
- status · enum
- one of:
draft|in_review|approved|published|retired - limit · integer
- cursor · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
instagram_post_set_status Move an Instagram post one step forward: draft → in_review → approved → published → retired (any other jump is `conflict`).
Set Instagram post status
Move an Instagram post one step forward: draft → in_review → approved → published → retired (any other jump is `conflict`). Reaching published requires the post's context_issue_id AND assert_context_done: true — recorded on blog.publish_events with channel instagram. Prefer `publish` for the final step; it needs approved first, and this is how a draft gets there.
Parameters
- tenant_slug · string ● required
- id · string ● required
- status · enum ● required
- one of:
draft|in_review|approved|published|retired - assert_context_done · boolean
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
Domain 2 · all
domain_connect Record a hostname for the tenant and return the DNS / proxy instructions plus copy-paste snippets (vercel.json rewrites as getmeetly.ai uses them, next.config.js rewrites(), nginx location; the DNS record for cname).
Connect domain
Record a hostname for the tenant and return the DNS / proxy instructions plus copy-paste snippets (vercel.json rewrites as getmeetly.ai uses them, next.config.js rewrites(), nginx location; the DNS record for cname). The same form lives on the tenant's Domain card at /tenants/<slug>. mode: cname (DNS → Vercel), proxy (the tenant's existing site reverse-proxies mount_path to the platform), platform (<slug>.<platform host>). With VERCEL_DOMAINS_ENABLED=true the hostname is also attached to the Vercel project (default off; the operator does it in the dashboard). Nothing is verified here — call domain_status.
Parameters
- tenant_slug · string ● required
- hostname · string ● required
- mode · enum ● required
- one of:
proxy|cname|platform
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
domain_status Verify a connected hostname and store the result.
Domain status
Verify a connected hostname and store the result. proxy: GET https://<hostname><mount_path>/_health (5 s) — verified when the platform's JSON says tenant = this slug; the probe ({ ok, url, http_status, tenant, error, checked_at }) is returned and kept as probe_status. cname / platform: the Vercel Domains API decides when VERCEL_DOMAINS_ENABLED=true, otherwise the same probe. Same check as the Verify button on /tenants/<slug>.
Parameters
- tenant_slug · string ● required
- hostname · string ● required
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
Analytics 10 · all
stats_summary read-only How the blog is doing over a period (7d | 28d | 90d, default 28d, ending yesterday; or from/to): totals (pageviews, visitors, visits, bounces, time), the previous period for comparison, channel split with the AI-referral share and per-engine visitors, Search Console clicks/impressions/position when ingested, AI-visibility cited rate when a probe ran, top 5 posts.
Stats summary
How the blog is doing over a period (7d | 28d | 90d, default 28d, ending yesterday; or from/to): totals (pageviews, visitors, visits, bounces, time), the previous period for comparison, channel split with the AI-referral share and per-engine visitors, Search Console clicks/impressions/position when ingested, AI-visibility cited rate when a probe ran, top 5 posts. Every source that is not wired is listed in not_configured by NAME — numbers are never invented.
Parameters
- tenant_slug · string ● required
- period · enum
- one of:
7d|28d|90d - from · string
- to · any
- compare_previous · boolean
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
top_posts read-only Posts ranked by pageviews over the period (default 28d), joined to the article (title, url, locale) with AI-referral pageviews and Search Console clicks per post.
Top posts
Posts ranked by pageviews over the period (default 28d), joined to the article (title, url, locale) with AI-referral pageviews and Search Console clicks per post. Paths that are not a published article (hub, old URLs) are listed with article_id null.
Parameters
- tenant_slug · string ● required
- period · enum
- one of:
7d|28d|90d - from · string
- to · any
- limit · integer
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
post_stats read-only One article over the period (by article_id, or slug + locale): daily pageviews, AI-referral pageviews per engine, Search Console totals + top queries for its URL, and the probe results that cited it.
Post stats
One article over the period (by article_id, or slug + locale): daily pageviews, AI-referral pageviews per engine, Search Console totals + top queries for its URL, and the probe results that cited it. Sources not ingested come back null / empty, never estimated.
Parameters
- tenant_slug · string ● required
- article_id · string
- slug · string
- locale · string
- period · enum
- one of:
7d|28d|90d - from · string
- to · any
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
ai_referrals read-only Visitors and pageviews that arrived from AI assistants (chatgpt, perplexity, gemini, claude, copilot, grok, meta, you, google_aio) over the period: per engine, per day, and the landing pages.
AI referrals
Visitors and pageviews that arrived from AI assistants (chatgpt, perplexity, gemini, claude, copilot, grok, meta, you, google_aio) over the period: per engine, per day, and the landing pages. Referrer-based, so an under-count by design — pair with visibility_report.
Parameters
- tenant_slug · string ● required
- period · enum
- one of:
7d|28d|90d - from · string
- to · any
- engine · enum
- one of:
chatgpt|perplexity|gemini|claude|copilot|grok+3 more
meta|you|google_aio
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
search_queries read-only Search Console query × page rows over the period (ingested nightly when GSC_SERVICE_ACCOUNT_JSON and tracking.gsc_property are set): clicks, impressions, CTR, position, striking_distance (position 5–20 — a refresh candidate).
Search queries
Search Console query × page rows over the period (ingested nightly when GSC_SERVICE_ACCOUNT_JSON and tracking.gsc_property are set): clicks, impressions, CTR, position, striking_distance (position 5–20 — a refresh candidate). Filters: min_impressions, page_url, striking_distance_only. Empty with a reason when Search Console is not wired.
Parameters
- tenant_slug · string ● required
- period · enum
- one of:
7d|28d|90d - from · string
- to · any
- source · enum
- one of:
google|bing - min_impressions · integer
- page_url · string
- striking_distance_only · boolean
- limit · integer
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
visibility_report read-only Per query × engine: the latest probe status in the period (cited | mentioned | absent | error | no_ai_answer), citation rank and URL, and the status in the previous period (trend).
AI-visibility report
Per query × engine: the latest probe status in the period (cited | mentioned | absent | error | no_ai_answer), citation rank and URL, and the status in the previous period (trend). Plus cited rate per engine, overall, share of voice (most-cited domains, owned flagged) and the recent runs. Filters: engine, topic. Empty with a note when no run was ingested — the probe is agent-side (blog-assessment skill).
Parameters
- tenant_slug · string ● required
- period · enum
- one of:
7d|28d|90d - from · string
- to · any
- engine · string
- topic · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
visibility_queries_set Upsert the tenant's target queries for the AI-visibility probe (≈ 30; the blog-assessment skill probes the active ones weekly): query, topic, priority (1 = money query probed daily, 3 = weekly), article_id (the post that should be cited), active.
Set visibility queries
Upsert the tenant's target queries for the AI-visibility probe (≈ 30; the blog-assessment skill probes the active ones weekly): query, topic, priority (1 = money query probed daily, 3 = weekly), article_id (the post that should be cited), active. replace: true deactivates every query not in items. Returns the full active list.
Parameters
- tenant_slug · string ● required
- items · object[] ● required
Item fields (5)
- query · string ● required
- topic · string
- priority · integer
- article_id · string
- active · boolean
- replace · boolean
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
visibility_results_ingest Store one agent-side probe run (the blog-assessment skill: ~30 queries × engines, the owner's OPENROUTER_API_KEY etc.
Ingest visibility probe results
Store one agent-side probe run (the blog-assessment skill: ~30 queries × engines, the owner's OPENROUTER_API_KEY etc. stay on the host). Pass run { trigger, engines, cost_usd, started_at?, finished_at?, status?, notes? } and results [{ query, engine, model_slug?, market?, sample_no?, status?, answer_text?, citations [{ url, title?, rank? }], cost_usd?, raw_response?, probed_at? }]. The server decides cited (an owned domain among the citations: tracking.owned_domains + primary_hostname + connected domains) / mentioned (a brand alias in the answer) / absent unless status is error | no_ai_answer, maps cited URLs to articles, and creates unknown queries as active. Returns run_id and counts.
Parameters
- tenant_slug · string ● required
- run · object ● required
- trigger · enum ● required
- one of:
weekly|daily|manual - engines · string[]
- cost_usd · number
- started_at · string
- finished_at · string
- status · enum
- one of:
done|partial|failed - notes · string
- results · object[] ● required
Item fields (11)
- query · string ● required
- engine · string ● required
- model_slug · string
- market · string
- sample_no · integer
- status · enum
- one of:
cited|mentioned|absent|error|no_ai_answer - answer_text · string | null
- citations · object[]
Item fields (3)
- url · string ● required
- title · string
- rank · integer
- cost_usd · number
- raw_response · any
- probed_at · string
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
indexing_status read-only IndexNow submissions (publish pings to api.indexnow.org — 200/202 = accepted) and the recent publish events for the tenant, optionally for one URL.
Indexing status
IndexNow submissions (publish pings to api.indexnow.org — 200/202 = accepted) and the recent publish events for the tenant, optionally for one URL. Says by NAME what IndexNow still needs when it is not wired (INDEXNOW_KEY, primary_hostname, tracking.indexnow_enabled).
Parameters
- tenant_slug · string ● required
- url · string
- limit · integer
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required
tracking_setup_status read-only What is configured for this tenant's analytics and what is missing, by NAME: Umami (script slot + API for ingestion), GA4 (BYO, consent-gated), Search Console (property + service account), Bing, IndexNow, the probe query list, the nightly cron.
Tracking setup status
What is configured for this tenant's analytics and what is missing, by NAME: Umami (script slot + API for ingestion), GA4 (BYO, consent-gated), Search Console (property + service account), Bing, IndexNow, the probe query list, the nightly cron. Plus the latest ingested day per source. Never a value, only names and booleans.
Parameters
- tenant_slug · string ● required
Output
- ok · boolean ● required
- data · object
- error · object
Show 4 fields
- code · string ● required
- message · string ● required
- retryable · boolean ● required
- details · any
- meta · object ● required
Show 3 fields
- requestId · string ● required
- contractVersion · string ● required
- generatedAt · string ● required