> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trysight.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP Setup

> Connect Cursor or Claude Desktop to Sight AI via OAuth

> [!NOTE]
>
> This page covers **Sight AI's outbound MCP server** — connecting external clients *to* Sight AI. To pull data *from* third-party apps *into* Sight AI Agent and Automations, see [MCP Connectors](https://docs.trysight.ai/integrations/mcp-connectors.md).

## Prerequisites

* Sight AI team owner or admin
* An MCP client that speaks Streamable HTTP and OAuth 2.1 with PKCE: Claude (web, desktop, mobile, Claude Code), ChatGPT, Cursor, VS Code, Windsurf, Gemini CLI and most others

## MCP server

Sight AI exposes a single MCP endpoint for every team:

```
https://app.trysight.ai/mcp
```

The server is stateless Streamable HTTP (JSON responses, no SSE stream) and speaks MCP protocol versions 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05.

## Connect from Claude

In Claude, open **Customize → Connectors**, choose **Add custom connector** and paste `https://app.trysight.ai/mcp`. Claude discovers OAuth on its own; sign in to Sight AI, pick the team and the sites, and approve. Claude Code: `claude mcp add --transport http sight https://app.trysight.ai/mcp`, then `/mcp` to sign in. Every tool shows under the connector's **Tool permissions** with its title; read tools run without asking and write tools ask first.

## Connect from ChatGPT

In ChatGPT, open **Settings → Connectors**, enable **Developer mode**, create a connector with `https://app.trysight.ai/mcp/chatgpt` and OAuth, then approve access on the Sight AI consent screen. ChatGPT reads the same read/write hints and confirms write actions before running them.

`/mcp/chatgpt` serves the same tools as `/mcp`, with the two things ChatGPT expects: the tool list can be read before you link your account (each tool says it needs OAuth to run), and a tool your connection lacks a permission for answers with a prompt to reconnect instead of a transport error. Use `/mcp` everywhere else.

## OAuth endpoints

| Resource | URL |
| - | - |
| Authorization server metadata (RFC 8414) | `https://app.trysight.ai/.well-known/oauth-authorization-server` |
| Protected resource metadata (RFC 9728) | `https://app.trysight.ai/.well-known/oauth-protected-resource/mcp` (also served at `/.well-known/oauth-protected-resource`); for the ChatGPT endpoint `https://app.trysight.ai/.well-known/oauth-protected-resource/mcp/chatgpt` |
| Authorize | `https://app.trysight.ai/oauth/authorize` |
| Token | `https://app.trysight.ai/oauth/token` |
| Dynamic client registration (RFC 7591) | `https://app.trysight.ai/oauth/register` |

An unauthenticated request to `/mcp` (or a tool call on `/mcp/chatgpt`) answers `401` with a `WWW-Authenticate: Bearer` challenge carrying `resource_metadata` and the `scope` the tools need, which is how clients find these endpoints without configuration. PKCE (`S256`) is required, the `resource` indicator (RFC 8707) is validated, and every authorization response carries `iss` (RFC 9207).

## Register a client

Nothing to do for most clients:

* **Client ID Metadata Documents** (the MCP spec's preferred mechanism): Claude and ChatGPT identify themselves with an HTTPS URL as their `client_id`; the server fetches that document, checks it and uses its redirect URIs. The consent screen names the domain the document came from.
* **Dynamic Client Registration** (RFC 7591): Cursor, Claude Desktop through `mcp-remote`, VS Code and others register a public client automatically when you connect.

You can also pre-register a public client from the dashboard if your MCP client requires a stable `client_id`:

1. Sign in as a team owner or admin.
2. Go to **Integrations → Sight AI API → OAuth apps**.
3. Click **Create OAuth client**, give it a recognizable name, and add a loopback redirect URI such as `http://127.0.0.1/oauth/callback` (or `cursor://anysphere.cursor-mcp/oauth/callback` for Cursor). Leave **Server-side app** unchecked — MCP clients are public clients that authenticate with PKCE only.
4. Copy the generated `client_id` if your MCP client requires a static client (see below).

A pre-registered client is usable by your own team right away; the [app review](https://docs.trysight.ai/developers/oauth-apps.md) step only applies to apps other Sight AI customers will connect to.

> [!NOTE]
>
> Loopback redirect URIs (`http://127.0.0.1/...`, `http://localhost/...`) match **any port** at runtime, per
> [RFC 8252 §7.3](https://www.rfc-editor.org/rfc/rfc8252#section-7.3). One registered loopback URI covers
> every Cursor/Claude Desktop session, even though each one picks a random callback port.

The MCP server URL itself (for pointing your client) lives on **Integrations → MCP**.

## Authorize

In Cursor, add an MCP server pointing at `https://app.trysight.ai/mcp`. Cursor will discover OAuth, register a client automatically, and open the Sight AI consent screen where you pick your team, sites, and scopes.

If your client does not support dynamic registration, supply a pre-registered `client_id` from the dashboard:

```json theme={null}
{
  "mcpServers": {
    "sight-ai": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://app.trysight.ai/mcp",
        "--static-oauth-client-info",
        "{\"client_id\":\"YOUR_CLIENT_ID\"}"
      ]
    }
  }
}
```

The client initiates OAuth 2.1 with PKCE, you'll be redirected to Sight AI to sign in, pick the team, and approve scopes, and the token is then returned to your MCP client.

## Available MCP tools (v1)

Sight AI MCP now mirrors most of the REST v1 Developer API. Tools are grouped by workflow.

### How the server behaves

* **Instructions.** `initialize` returns an `instructions` string your client gives the model: start with `list_sites`, which calls cost budget or credits, and that writes need the user's go-ahead.
* **Titles.** Every tool carries a `title` (for example `get_seo_rankings` is "Tracked rankings"), which clients show in their tool lists and permission screens.
* **Annotations.** Every tool in `tools/list` carries `readOnlyHint`, `destructiveHint`, `idempotentHint` and `openWorldHint`, so clients can run reads without asking and confirm writes. Paid lookups (`research_keywords`, `fetch_keyword_overview`, `explore_domain`, `suggest_seo_competitors`, and the AI recommendations `recommend_article_types` / `recommend_article_category`) are not marked read-only: an uncached call spends the site's daily lookup budget or the team's credits. Writes that overwrite, delete, cancel or send email are marked destructive, as is article generation (it spends credits); additive writes that cost nothing (create a draft, add keywords, submit for indexing) are not.
* **Permissions.** A tool the connection's scopes do not cover answers `403` with `WWW-Authenticate: Bearer error="insufficient_scope"` and the full scope list; clients that follow the MCP step-up flow (Claude does) re-run consent and retry the call.
* **Validation.** Arguments are checked against the tool's schema before it runs: a missing `siteId`, an `action` outside the enum or a value of the wrong kind returns `isError` with the argument named and `code: VALIDATION_ERROR`.
* **Errors.** A tool that fails returns a normal result with `isError: true` and text such as `The site's daily lookup budget is used up (code: BUDGET_EXHAUSTED)`, so the model can read the reason and tell the user. The codes match the [REST error codes](https://docs.trysight.ai/developers/errors.md). Unexpected server failures return `Internal error`. Calling a tool that does not exist is a JSON-RPC `-32602` error.
* **Image generation** is an app and agent feature; the MCP server does not offer `generate_article_image`. `set_article_main_image` sets a cover image from a URL.
* **Single-site access.** When the credential is limited to one site, `siteId` can be left out and that site is used.
* **Plans.** `tools/list` only lists the tools the team's plan includes.

### Sites & analytics (`analytics:read`)

* `list_sites` / `get_site`
* `get_search_overview` / `get_search_timeseries` / `get_search_queries` / `get_search_pages` / `get_search_article_performance`
* `get_ai_visibility_summary` / `get_ai_visibility_trends` / `get_ai_visibility_mentions` / `get_ai_visibility_citations` / `get_ai_visibility_competitors`

### SEO module (`analytics:read` / `seo:write`, requires the SEO module)

Every tool takes `siteId` and mirrors the [SEO REST endpoints](https://docs.trysight.ai/developers/api-reference/seo.md): the same filters, bodies, `action` and `kind` values apply, and the same `402 MODULE_REQUIRED` and `429 BUDGET_EXHAUSTED` errors come back. Reads use `analytics:read`; paid lookups and writes use `seo:write`. Requires re-authorization if MCP was connected before the `seo:write` scope was added.

Read (`analytics:read`), from stored snapshots, no paid lookups:

| Tool | Returns |
| - | - |
| `get_seo_overview` | Health tiles, ranked fix-next actions, striking-distance keywords, CTR opportunities |
| `get_seo_rankings` | Tracked keywords with position and 7/30-day change (`page`, `limit`) |
| `get_seo_organic_keywords` | Keywords the site ranks for (`sort` etv/position/volume) |
| `get_seo_backlinks` | Backlink summary and referring pages (`status` live/lost) |
| `get_seo_audit` | Latest site audit and page issues (`severity`) |
| `get_seo_ai_mode` | Google AI Mode citations per tracked prompt (`status` cited/not\_cited/lost/all) |
| `get_seo_status` | Module state for the site |
| `get_seo_keyword_workspace` | The scored keyword workspace with lists and summary (same filters as `GET keywords`) |
| `get_seo_keyword_detail` | One keyword in full: history, People also ask, Search Console, linked AI prompts, tracking overrides (`keywordId`, `days`) |
| `get_seo_keyword_history` | Position history (`keywordId`, `days`) |
| `get_keyword_overview` | The cached keyword overview (`keyword`); never spends |
| `get_seo_research_history` | Recent research searches |
| `get_seo_competitors` | Competitor list and comparison |
| `get_competitor_pages` | A competitor's top pages (`domain`, `limit`) |
| `get_competitor_keywords` | Competitor keyword opportunities (`view`, `kind`, `brand`, `offTopic`, `status`, `play`, `minVolume`, `maxDifficulty`, `search`) |
| `get_seo_keyword_topics` | Keyword topics (`search`) |
| `get_seo_content_health` | Decaying and cannibalizing pages (`kind` decay/cannibalization) |
| `get_seo_pages` | Page performance (`days`, `sort`, `section`, `search`) |
| `get_seo_page_detail` | One page (`url`, `days`) |
| `get_seo_alerts` | Alert feed or rules (`view`, `days`, `kind`, `severity`, `unread`) |
| `get_seo_annotations` | Annotations in a date range (`from`, `to`) |
| `get_seo_reports` | Report schedules and past reports with share links, or one report in full with `reportId` |
| `get_seo_forecast` | Traffic forecast (`weeks`) |
| `get_seo_what_if` | What-if computation for a target position (`keywordIds` or `keywords`, `targetPosition`) |
| `get_seo_traffic_value` | Traffic value of current rankings (`targetPosition`) |
| `get_seo_history` | Month-by-month history (`months`, up to 24) |
| `get_seo_search_console` | Search Console breakdown or history (`view`, `days`, `months`, `granularity`) |
| `get_seo_serp_features` | SERP feature ownership |
| `get_seo_search_ai` | Combined Search + AI performance (`days`) |
| `get_seo_visibility` | AI visibility over time (`days`) |
| `explain_search_change` | Why search traffic changed: Search Console deltas against the previous window, top moving queries and pages, and the likely causes (`days`, 7 to 90) |
| `get_seo_explore_recent` | Recent domain lookups and the remaining daily budget |
| `get_seo_link_prospects` | Link prospects (`status`, `source`, `search`) |
| `get_seo_indexing` | Index state per URL (`state`, `section`, `search`) |
| `get_seo_internal_links` | Internal link graph |
| `get_seo_audit_comparison` | Issues fixed, new or persisting since the previous crawl (`status`) |
| `propose_audit_fix` | A proposed fix for an audit issue (`issueId`); nothing is written |
| `get_seo_backlink_profile` | Backlink profile (`section` profile/anchors/referring\_domains/toxic/new/broken) |
| `get_seo_disavow_file` | The disavow file as text |

Paid lookups (`seo:write`), each spends the site's daily lookup budget unless cached:

| Tool | Does |
| - | - |
| `research_keywords` | Keyword research from a `seed` (`mode` suggestions/questions/ideas/related, omitted = the best mode the plan has; `refresh`), with the site's standing and an opportunity score on every row; filters `newOnly`, `notRanking`, `notTop10`, `excludeBranded`, `minVolume`, `maxDifficulty`, `intents`, `questionsOnly`, `include`, `exclude` and `sort` run before paging; cached 30 days |
| `fetch_keyword_overview` | Fetches a keyword overview (`keyword`, `refresh`); cached 7 days |
| `explore_domain` | Looks up any domain (`target`, `refresh`); cached 7 days, daily cap per site |
| `suggest_seo_competitors` | Suggests competitor domains |

Write (`seo:write`). On the REST API these take an `action` (or `kind` for `run_seo_check`) matching the body below; over MCP every operation is a tool of its own, listed after the table.

| Tool | Actions |
| - | - |
| `manage_seo_keywords` | `add`, `remove`, `refresh_metrics`, `track_in_ai`, `seed`, `create_list`, `rename_list`, `delete_list`, `move_to_list` |
| `update_keyword_tracking` | Sets `device`, `locationCode`, `languageCode` for one keyword |
| `manage_seo_competitors` | `set`, `add`, `remove` |
| `manage_competitor_keywords` | `refresh`, `add`, `add_many`, `dismiss`, `restore` |
| `manage_seo_alerts` | `update_rule`, `mark_read`, `mark_unread`, `send_test` |
| `manage_seo_annotations` | `add`, `remove` |
| `manage_seo_reports` | `generate`, `save_schedule`, `delete_schedule`, `send` |
| `manage_link_prospects` | `refresh`, `dismiss`, `reopen`, `add_to_outreach` |
| `manage_seo_indexing` | `inspect` (Google URL Inspection, up to 20 URLs), `resubmit` (IndexNow, up to 50 URLs) |
| `manage_seo_backlinks` | Sets a referring domain's review `status`: `none`, `reviewed`, `keep`, `disavow` |
| `apply_audit_fix` | Applies a proposal from `propose_audit_fix` (`issueId`, `proposal`) |
| `update_seo_settings` | Sets `locale` and `brandAliases` |
| `run_seo_check` | `kind`: `rank_check`, `site_audit`, `backlinks`, `ai_mode`, `competitor_pages`, `topics`, `link_prospects` (queued); `organic`, `domain_overview`, `history`, `competitor_snapshots` (inline, paid); `ctr_model` (free). Each kind needs the plan feature whose data it refreshes. Full refreshes follow the app's refresh gap for the plan (24 hours on Starter, 6 Pro, 2 Business, 1 Enterprise) and return `REFRESH_COOLDOWN` when called sooner; `rank_check` with `keywordIds` never waits |

Over MCP the action-based tools above are not listed. Each operation is its own tool with only that operation's arguments (the `action` / `kind` argument is gone); scopes, plan gating and rate limits are the registry tool's:

| REST tool and action | MCP tool |
| - | - |
| `manage_seo_keywords` `add`, `remove`, `refresh_metrics`, `track_in_ai`, `seed`, `create_list`, `rename_list`, `delete_list`, `move_to_list` | `add_seo_keywords`, `remove_seo_keywords`, `refresh_keyword_metrics`, `track_keyword_in_ai`, `seed_seo_keywords`, `create_keyword_list`, `rename_keyword_list`, `delete_keyword_list`, `move_keywords_to_list` |
| `manage_seo_competitors` `set`, `add`, `remove` | `set_seo_competitors`, `add_seo_competitor`, `remove_seo_competitor` |
| `manage_competitor_keywords` `refresh`, `add_many`, `dismiss`, `restore` | `refresh_competitor_keywords`, `add_competitor_keywords`, `dismiss_competitor_keyword`, `restore_competitor_keyword` |
| `manage_seo_alerts` `update_rule`, `mark_read`, `mark_unread`, `send_test` | `update_alert_rule`, `mark_alerts_read`, `mark_alerts_unread`, `send_test_alert` |
| `manage_seo_annotations` `add`, `remove` | `add_seo_annotation`, `remove_seo_annotation` |
| `manage_seo_reports` `generate`, `save_schedule`, `delete_schedule`, `send` | `generate_seo_report`, `save_report_schedule`, `delete_report_schedule`, `send_seo_report` |
| `manage_link_prospects` `refresh`, `dismiss`, `reopen`, `add_to_outreach` | `refresh_link_prospects`, `dismiss_link_prospects`, `reopen_link_prospects`, `add_prospects_to_outreach` |
| `manage_seo_indexing` `inspect`, `resubmit` | `inspect_urls`, `resubmit_urls` |
| `run_seo_check` by `kind` | `run_rank_check`, `run_site_audit`, `refresh_backlinks`, `run_ai_mode_check`, `refresh_organic_keywords`, `refresh_domain_overview`, `refresh_seo_history`, `refresh_competitor_snapshots`, `refresh_competitor_pages`, `refresh_keyword_topics`, `refit_ctr_model` |
| `manage_planner` writes | `update_planner_settings`, `update_scheduled_article`, `remove_scheduled_article`, `clear_scheduled_articles`, `plan_autopilot_articles`, `clear_autopilot_plan`; reads via `get_planner` (`view`) |
| `manage_keywords` `assign_group`, `remove` | `assign_keyword_group`, `remove_keywords`; reads via `check_keywords` and `list_keyword_groups` |
| `edit_article_section` `op` | `append_article_section`, `replace_article_section`, `rewrite_article_intro` |
| `run_agent` `agentKey` | `run_search_opportunity_agent`, `run_ai_opportunity_agent`, `run_article_boost_agent`, `run_interlinking_agent`, `run_site_performance_agent`, `run_outreach_agent` |

### Opportunities (`opportunities:read`)

* `list_opportunities` — filter by `source` (ai/search/all) and `status` (e.g. pending)
* `get_opportunities_readiness` — pipeline warmup status

### Articles

Read (`articles:read`):

* `list_articles` — filter by `status` (draft, generating, ready, failed)

* `get_article` — full article body, SEO fields, target keyword, and status

* `get_article_limits` — the team's AI credit balance and usage this billing period (there are no per-article quotas)

* `get_article_images` — list hero/thumbnail/inline images for an article

* `fetch_url_content` — crawl a public URL (title, headings, body) for rewrite workflows

* `get_writing_guide` — pipeline writing playbook for listicle / step-by-step / explainer / comparison + business context

* `recommend_article_types` — recommend an article type per keyword

* `recommend_article_category` — recommend a CMS category from keyword/title

* `list_article_authors` — list Webflow/WordPress authors for batch assignment

* `project_interlinks` — estimate interlink-automation output for a given cron + end date

Write (`articles:write`):

* `generate_article` — start async generation from a keyword (poll `get_article` until `ready`). Articles generated over MCP get no AI cover image: open the article in Sight AI (Content → Articles) and use Generate image there, or set one from a URL with `set_article_main_image`
* `create_draft_article` — create a blank draft to fill with `update_article` or `edit_article_section`
* `update_article` — edit title, HTML body, SEO fields, slug, and summary (status is not exposed)
* `edit_article_section` — surgical body edits: append/replace a section or rewrite the intro
* `refresh_seo_title` / `refresh_seo_meta` — AI SEO rewrites (rate-limited)
* `set_article_main_image` — set/clear the hero image from a URL
* `create_article_batch` — queue 1–100 articles through the full pipeline (author round-robin, categories, interlinking focus); each article spends AI credits. Like `generate_article`, no AI cover images over MCP

Authoring & batch workflows:

```
# Rewrite an existing page
fetch_url_content → get_writing_guide → create_draft_article → edit_article_section → update_article → sync_article

# Plan a batch
recommend_article_types → list_article_authors → create_article_batch
```

### Keywords (`keywords:read` / `keywords:write`)

Keyword pipeline tools for Autopilot and manual generation workflows.

Read (`keywords:read`):

* `list_keywords` — paginated list with pipeline status; filter `status: no_article` for generation candidates
* `get_keyword` — lookup by `keywordId`, exact `keyword` text, or `slug`
* `get_keywords_summary` — totals, counts by status, and planning recommendations
* `check_keywords` — exact coverage check for up to 50 candidates against the full keyword list and existing articles; call it before recommending a keyword
* `list_keyword_groups` — the site's keyword groups with ids and counts

Write (`keywords:write`):

* `add_keywords` — single keyword or bulk (comma/newline, max 100); dedupes existing slugs
* `manage_keywords` — `add` (same as `add_keywords`, with `groupName`/`groupId`), `assign_group` (group keywords that already exist; the group is created if missing) and `remove` (keyword ids, keyword texts, or every keyword a filter covers: `status` such as `no_article`, `groupId`/`groupName`, `source`, `search`; `dryRun: true` counts and samples first). Reads and writes are separate tools on the MCP server.

Smart workflow:

```
get_keywords_summary → list_keywords (status: no_article) → add_keywords
  → generate_article → get_article (poll) → update_article → sync_article
```

### Agents & Automations (`agents:read` / `agents:write`)

* `list_agents` / `list_agent_runs`
* `update_agent` — toggle or tune an agent
* `run_agent` — on-demand run (rate-limited, agent must be active). Over MCP this is one tool per agent: `run_search_opportunity_agent`, `run_ai_opportunity_agent`, `run_article_boost_agent`, `run_interlinking_agent`, `run_site_performance_agent`, `run_outreach_agent`

Agent keys: `article_creation`, `ai_prompt`, `article_boost`, `interlinking`, `site_performance`, `outreach`

> [!NOTE]
>
> Automations are included on Pro/Advanced and metered in AI credits. The v1 REST/MCP agent endpoints operate on the agent configuration store; custom automations from the UI are not yet exposed on the v1 API. See [Automations](https://docs.trysight.ai/automations/overview.md) for the full setup guide.

### CMS & integrations (`integrations:read` / `integrations:write`)

Requires re-authorization if MCP was connected before these scopes were added.

* `list_integrations` — connected CMS/platform integrations and which one is active
* `get_cms_status` — active CMS, sync eligibility, and manual-only integrations (Framer)
* `get_article_sync_status` — per-platform sync state for an article
* `sync_article` — push a **ready** article to the active CMS (WordPress, Webflow, Wix, Shopify, HubSpot, webhook)

### Planner (`planner:read` / `planner:write`)

* `get_planner` — read the planner: `view` is `settings`, `scheduled` (the CMS publish queue, each item with `origin` autopilot|manual), `generation` (upcoming Autopilot slots) or `autopilot` (health); `startDate`/`endDate` narrow the queue views
* `schedule_article` — queue ready articles for a future CMS publish date
* `manage_planner` — change the planner
  * Actions: `update_settings`, `update_scheduled`, `remove_scheduled`, `clear_scheduled`, `clear_generation`, `plan_generation`

### Indexing & setup health (`indexing:read` / `indexing:write`)

* `submit_sitemap_gsc` — submit the configured sitemap URL to Google Search Console
* `get_gsc_status` — GSC connection, property, and sync state
* `submit_article_indexnow` — submit one article URL to IndexNow (after CMS sync)
* `get_indexnow_status` — IndexNow verification + optional URL lookup
* `get_account_health` — composite setup troubleshooting (CMS, GSC, IndexNow, autopilot, blockers)

### Outreach inbox (`inbox:read` / `inbox:write`)

Requires Outreach Agent license. Contains contact PII (emails, names, message bodies).

* `list_inbox` — conversation list with latest preview; filter by `status` (`unread`, `open`, `awaiting_human`, etc.)
* `read_message` — full conversation thread + opportunity context + agent reasoning
* `get_inbox_unread_count` — unread thread/total counts
* `mark_conversation_read` — clear unread state on a thread
* `reply_to_message` — send a human reply (requires Outreach email setup)
* `update_conversation_status` — resolve, decline, reopen, pause, or resume AI
* `take_over_conversation` — hand `awaiting_human` threads to the Outreach Agent

### End-to-end content workflow

```
list_sites → get_keywords_summary → list_keywords (status: no_article)
  → add_keywords (optional) → get_article_limits → generate_article
  → get_article (poll) → update_article (optional)
  → refresh_seo_title (optional) → get_cms_status → sync_article
```

Or starting from opportunities:

```
list_sites → get_opportunities_readiness → list_opportunities
  → get_article_limits → generate_article → get_article (poll)
  → refresh_seo_title (optional) → get_cms_status → sync_article
```

Or with an automation (agent):

```
list_agents → run_search_opportunity_agent (MCP; `run_agent` on REST) → list_agent_runs → sync_article
```

> [!WARNING]
>
> Articles must be in **ready** status with a title and body before `sync_article` succeeds. Framer is manual-export only — use the Sight AI UI to export.

> [!NOTE]
>
> Rate limits: article generation (10/day per team), SEO refresh (20/hr), agent runs (5/hr per site), keyword adds (100/hr per site). AI credit affordability is enforced via the credits system when enforcement is on.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.