Context Blog MCP

44 toolscontract blog-1.3.0catalog source eb4d5c4

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/mcp
tools.jsonraw catalogauth: oauth2 · Googlesay: Call the Context Blog tool `setup` with workflow 'blog' and follow its nextStep.

Connect

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/mcp

cursor

Add an HTTP MCP server with URL https://sites.onecontext.me/api/mcp

Skills that wrap this server

Tools 44

tap a group or a tool to fold it

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

#usage_guide

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

#get_capabilities

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

#list_skill_catalog

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

#get_skill

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

#setup

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

#preview_render

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 morenews | 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

#content_lint

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_record

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

#check_list

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_create

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_get

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

#tenant_update

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

#brand_upsert

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

#audiences_upsert

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

#hubs_upsert

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_upsert

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

#topics_list

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 morenews | 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_upsert

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_get

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_list

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

#article_set_status

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_upsert

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_get

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_list

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

#page_set_status

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

#publish

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 morevideo/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_upload

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

#asset_complete

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_upsert

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_get

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_list

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

#instagram_post_set_status

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_connect

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

#domain_status

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

#stats_summary

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

#top_posts

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

#post_stats

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 moremeta | 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

#ai_referrals

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

#search_queries

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_report

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_queries_set

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

#visibility_results_ingest

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

#indexing_status

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

#tracking_setup_status