Skip to main content
Glama

ThinCMS MCP Server

MCP (Model Context Protocol) server for ThinCMS. Gives AI agents typed tool access to your ThinCMS site — no HTTP boilerplate, no header construction, no JSON encoding.

What it does

Wraps the ThinCMS REST API as 45 typed tools that any MCP-compatible AI client can call directly. Instead of constructing HTTP requests, agents call tools like thincms_create_post(title, content, status) and get structured responses back.

Related MCP server: Agentic CMS

ThinCMS hosts this server at https://<admin host>/mcp. You sign in with your ThinCMS account (Google). No API keys needed.

  1. A site admin enables MCP access for you in ThinCMS (Settings > Users > Edit) and picks a level per site: read-only, editor or admin.

  2. Add the server:

    • Claude (web / desktop): Settings → Connectors → Add custom connector → paste the URL → Connect.

    • Claude Code: claude mcp add --transport http thincms https://<admin host>/mcp, then /mcp to sign in.

  3. Ask for a site by name. thincms_list_sites shows your sites and access level; every tool's siteId accepts a site ID or name.

The hosted server can't access your filesystem: use url or base64 for uploads instead of filePath; exports are returned in the response.

Running the hosted server

npm run build
MCP_PUBLIC_URL=https://app.thincms.ai/mcp THINCMS_INTERNAL_URL=http://127.0.0.1:3000 PORT=3100 npm run start:http

ThinCMS acts as the OAuth authorization server. This process validates bearer tokens via GET /api/v1/mcp/me and forwards them to the REST API, which enforces each user's MCP permissions. In production it runs as the thincms-mcp PM2 app (see ../thincms/ecosystem.config.js) behind nginx (../thincms/deploy/nginx-mcp.conf). Deploy with bash deploy.sh.

Local / self-hosted (stdio)

Requirements

  • Node.js 18+

  • A running ThinCMS instance

  • An API key from ThinCMS (Admin > API Keys)

  • An MCP-compatible client (Claude Desktop, Claude Code, VS Code, etc.)

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "thincms": {
      "command": "npx",
      "args": ["tsx", "/path/to/thincms-mcp/src/index.ts"],
      "env": {
        "THINCMS_BASE_URL": "https://your-domain.com",
        "THINCMS_API_KEY": "tcms_your_key_here",
        "THINCMS_SITE_ID": "your_site_id_here"
      }
    }
  }
}

Claude Code

Same configuration in .claude/settings.json or global Claude Code settings.

Available tools

Group

Tools

Posts

list_posts, get_post, create_post, update_post, delete_post, bulk_create_posts

Pages

list_pages, get_page, create_page, update_page, delete_page

Categories

list_categories, create_category, update_category, delete_category

Authors

list_authors, create_author, update_author, delete_author

Tags

list_tags, create_tag

Media

list_media, get_media, upload_media, update_media, delete_media

Template

get_template, update_template

Navigation

get_navigation, update_navigation

Settings

get_settings (read-only)

Scripts

list_scripts, create_script, update_script

Secrets

list_secrets, create_secret

Forms

list_forms, get_form, create_form, update_form

Submissions

list_submissions, export_submissions_csv

Search

search

Preview

create_preview, get_preview_url

All tool names are prefixed with thincms_ (e.g., thincms_list_posts).

Releases and version history

  • Version history is automatic: every change to pages, posts, the template, navigation, content blocks and collections is recorded. thincms_list_versions, thincms_diff_version and thincms_restore_version roll back any item; thincms_list_deleted finds deleted ones.

  • Releases are optional. Create one with thincms_create_release, then pass its id as releaseId to the normal write tools to stage changes privately. Share thincms_get_release_preview_link for review, then thincms_publish_release or thincms_schedule_release. Without releaseId, writes go live as usual.

See thincms-mcp.md in the ThinCMS repo for the full workflow.

Permissions

Hosted: each user's MCP level per site (read-only / editor / admin), capped by their normal site role and checked live on every call.

Local: uses the same API key auth as the REST API. API keys grant editor-level access — full CRUD on content, forms, templates, navigation, scripts, and secrets. Cannot change site settings, manage users, or run imports/backups.

Development

npm install
npm run build     # Compile TypeScript
npm run dev       # Run stdio server with tsx (for development)
npm run dev:http  # Run hosted server with tsx (needs MCP_PUBLIC_URL)
npx tsx tests/hosted-e2e.ts   # End-to-end OAuth + hosted MCP test (needs both servers running locally)

License

MIT

Available Tools

191 tools
thincms_add_quiz_questionC

Add a question to a quiz. Each question has 2-5 answer options and one correct answer identified by index (0-based).

Inputs: quizId (required), options (required), correctIndex (required), questionText (required), +4 more.

thincms_add_sequence_stepC

Add a step to a sequence.

Inputs: subject (required), sequenceId (required), htmlContent (required), siteId, +2 more.

thincms_analytics_referrersB

Get top referrer domains for a given period.

Inputs: limit, period, siteId, confirmProductionWrite.

thincms_analytics_summaryA

Get analytics summary: total views, unique visitors, top page, views today. Period: 7d, 30d, or 90d.

Inputs: period, siteId, confirmProductionWrite.

thincms_analytics_top_pagesB

Get top pages by views for a given period.

Inputs: limit, period, siteId, confirmProductionWrite.

thincms_analytics_trendA

Get daily views and visitors trend for a given period.

Inputs: period, siteId, confirmProductionWrite.

thincms_append_cssA

Append CSS to the end of the site's existing stylesheet without replacing it. Useful for adding new rules without re-sending the entire stylesheet.

Inputs: css, dryRun, siteId, cssFile, +1 more.

thincms_bulk_create_postsA

Create up to 100 blog posts in a single request. Each post follows the same schema as thincms_create_post. Validation errors are reported per-item without failing the batch.

Inputs: posts (required), siteId, confirmProductionWrite.

thincms_campaign_statsC

Get campaign performance statistics (sent, opens, clicks, unsubscribes).

Inputs: id (required), siteId, confirmProductionWrite.

thincms_capabilitiesA

Inspect the running MCP wrapper: version, count of registered tools, and the live tool list. Use to detect when your MCP host has cached a stale tool surface — if the count or list doesn't match what you expect for the current wrapper version, restart your host (Claude Desktop / Claude Code / VS Code) so it re-handshakes with the wrapper.

Inputs: no named parameters.

thincms_clear_review_driftA

Clear the drift flag on a review after the editor has reconciled the edit (e.g. they're satisfied the new text is fine). Resets driftFlag to 'none' and clears driftNotes; if the review was held as drift_pending, that hold is also cleared (so a previously published review re-appears on the widget).

Inputs: id (required), siteId, confirmProductionWrite.

thincms_create_authorB

Create a new author profile with bio, avatar, and social links.

Inputs: name (required), bio, slug, email, +5 more.

thincms_create_campaignA

Create a campaign record in ThinCMS. This stores the email content; it does NOT push to the connected mail platform (e.g. ActiveCampaign) or deliver to recipients. Use thincms_send_campaign as the second step.

Inputs: name (required), subject (required), htmlContent (required), listId, +5 more.

thincms_create_categoryB

Create a new category. Optionally nest it under a parent category for hierarchy.

Inputs: name (required), slug, siteId, parentId, +3 more.

thincms_create_collectionA

Create a new collection. Display modes: 'cards' (grid), 'carousel' (horizontal scroll), 'banner' (full-width rotating), 'list' (vertical stack), 'compact' (smaller grid). Embed with {{collection:slug}} in page frame or content.

Inputs: name (required), slug, siteId, columns, +14 more.

thincms_create_collection_itemA

Add an item to a collection. The 'body' field is required (main content, can be HTML). Other fields are optional and visibility depends on the collection's show* settings.

Inputs: body (required), collectionId (required), title, rating, +8 more.

thincms_create_content_blockA

Create a new reusable content block. For type='html' (default) the content field holds raw HTML inserted wherever {{block:slug}} appears. For type='reviews-widget', the block renders the published Google reviews widget server-side with config options (maxReviews, displayMode, minRating, showDate, showAvatar). Edit once, updates everywhere.

Inputs: name (required), slug, type, config, +5 more.

thincms_create_courseA

Create a new course or community. Courses start as draft by default. Set courseType to 'community' for ongoing recording libraries (modules become topics, lessons become recordings, content sorts newest-first). Set accessMode to control enrollment: 'free' (open), 'invite' (admin enrolls learners), or 'purchase' (Stripe payment required).

Inputs: title (required), slug, siteId, status, +10 more.

thincms_create_enrollmentA

Enroll a learner in a course. The user must already exist — specify by email or userId. This bypasses payment requirements, effectively creating a free/invite enrollment.

Inputs: courseId (required), email, siteId, source, +3 more.

thincms_create_formA

Create a new form or survey. Use renderMode 'fields' for standard forms (with field definitions) or 'html' for custom HTML surveys served at /s/:slug. Use preset 'contact' or 'newsletter' for pre-configured field sets. For large HTML content (>10KB), use htmlContentFile instead of htmlContent to pass a local file path.

Inputs: name (required), slug, fields, preset, +11 more.

thincms_create_integrationA

Configure a new email platform integration (one per site). Platform: activecampaign, kit, mailchimp, gohighlevel.

Inputs: name (required), config (required), platform (required), siteId, +1 more.

thincms_create_lead_magnetB

Create a new lead magnet. A lead magnet is a downloadable resource offered in exchange for a form submission (e.g., newsletter signup).

Inputs: title (required), slug, siteId, ctaText, +8 more.

thincms_create_lessonA

Create a new lesson within a module. Content is raw HTML. Lessons are auto-ordered within their module. For large content (>10KB), use contentFile instead of content.

Inputs: title (required), moduleId (required), slug, isFree, +10 more.

thincms_create_moduleA

Create a new module within a course. Modules are auto-ordered by creation sequence.

Inputs: title (required), courseId (required), siteId, description, +1 more.

thincms_create_pageA

Create a new static page. Content should be raw HTML. Use renderMode 'wrapped' for pages that use the site template, or 'standalone' for full custom HTML. For large content (>10KB), use contentFile instead of content to pass a local file path.

Inputs: title (required), slug, jsonLd, siteId, +10 more.

thincms_create_popupA

Create a new popup/CTA. Each popup is linked to an existing form (by formId) which handles the actual data collection. The popup provides the presentation container, trigger logic, and targeting rules. Display types: 'overlay' (centered modal), 'sticky-top'/'sticky-bottom' (fixed bars), 'slide-in' (bottom-right card). On mobile, overlay auto-downgrades to sticky-bottom to avoid Google's interstitial penalty.

Inputs: name (required), formId (required), slug, siteId, +14 more.

thincms_create_postA

Create a blog post. Content should be raw HTML. Tags are auto-created if they don't exist. For large content (>10KB), use contentFile instead of content. Posts with status="published" and a publishedAt in the past appear on the public site immediately; a future publishedAt is auto-scheduling — they appear when the timestamp passes (no worker required, the public site filters by date). Posts with status="draft" never appear publicly regardless of dates. Use scheduledFor="immediate" to publish now, or scheduledFor=<ISO timestamp at least 60 min in the future> to schedule.

Inputs: title (required), slug, tags, jsonLd, +23 more.

thincms_create_previewA

Create a preview session with draft template or content overrides. Returns a token-based preview URL (valid for 2 hours). Use this to preview CSS/template changes or draft content without publishing.

Inputs: siteId, pageFrame, stylesheet, customHeadHtml, +2 more.

thincms_create_quizA

Create a new quiz within a module. Quizzes share sort order with lessons — use thincms_reorder_module_items to position them. Two feedback modes: 'show_answer' reveals correct answers after submission, 'retry' shows only the score.

Inputs: title (required), moduleId (required), slug, siteId, +3 more.

thincms_create_redirectA

Create a URL redirect. Source path must start with /. Use /* suffix for wildcard matching.

Inputs: targetUrl (required), sourcePath (required), note, siteId, +3 more.

thincms_create_scriptB

Create a script injection for the public site. Scripts can be placed in the or before .

Inputs: code (required), name (required), siteId, enabled, +3 more.

thincms_create_secretB

Create a new environment variable secret. The value is stored securely and never returned in API responses.

Inputs: key (required), value (required), siteId, description, +1 more.

thincms_create_sequenceC

Create a new email sequence.

Inputs: name (required), siteId, triggerFormSlug, confirmProductionWrite.

thincms_create_tagB

Create a new tag. Note: tags are also auto-created when included in the tags array of a post.

Inputs: name (required), slug, siteId, description, +1 more.

thincms_create_toolA

Create a new Tool. html is the raw HTML/JS payload that renders inside a sandboxed iframe with a window.thinCMS runtime injected. Set authRequired to 'password' | 'google' | 'either' to gate access; 'none' makes the tool public. Set systemPrompt to prepend a persona to /ai/chat calls. For large HTML payloads (>10KB), use htmlFile with a local file path.

Inputs: name (required), html, slug, siteId, +10 more.

thincms_create_workbookA

Create a workbook inside a module. Workbooks are fillable forms that live alongside lessons and quizzes — use thincms_reorder_module_items to position them. The fields array defines the form spec. For large specs (>10KB), use fieldsFile instead.

Inputs: title (required), moduleId (required), slug, fields, +10 more.

thincms_delete_authorC

Delete an author by ID. Posts by this author will have their author unset.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_campaignC

Delete a campaign.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_categoryA

Delete a category by ID. Posts in this category will be uncategorized.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_collectionA

Delete a collection and all its items. Any {{collection:slug}} references will render as empty.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_collection_itemB

Delete an item from a collection.

Inputs: itemId (required), collectionId (required), siteId, confirmProductionWrite.

thincms_delete_content_blockA

Delete a content block. Any {{block:slug}} references in templates or content will render as empty.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_courseA

Delete a course and all its modules, lessons, quizzes, and enrollments.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_enrollmentC

Delete an enrollment permanently.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_lead_magnetB

Delete a lead magnet by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_lessonA

Delete a lesson and its attachments.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_lesson_attachmentB

Delete a file attachment from a lesson.

Inputs: lessonId (required), attachmentId (required), siteId, confirmProductionWrite.

thincms_delete_mediaB

Delete a media item and remove the file from disk.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_moduleB

Delete a module and all its lessons and quizzes.

Inputs: courseId (required), moduleId (required), siteId, confirmProductionWrite.

thincms_delete_pageB

Permanently delete a static page by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_popupB

Delete a popup by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_postB

Permanently delete a blog post by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_quizA

Delete a quiz and all its questions and attempts.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_quiz_questionB

Delete a question from a quiz.

Inputs: quizId (required), questionId (required), siteId, confirmProductionWrite.

thincms_delete_redirectB

Delete a redirect by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_sequenceB

Delete a sequence and all its steps.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_sequence_stepB

Delete a step from a sequence.

Inputs: stepId (required), sequenceId (required), siteId, confirmProductionWrite.

thincms_delete_submissionB

Delete a form submission by ID.

Inputs: formId (required), submissionId (required), siteId, confirmProductionWrite.

thincms_delete_subscriberB

Delete a subscriber by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_tagA

Delete a tag by ID. Removes the tag from all posts.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_toolA

Permanently delete a Tool. Cascades to all ToolData rows, ToolAiUsage rows, and end-user sessions scoped to it.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_delete_tool_dataA

Delete a single data key. Deletes only the caller's scope — with subscriberId, the per-user value; without, the tool-global value.

Inputs: id (required), key (required), siteId, subscriberId, +1 more.

thincms_delete_workbookA

Delete a workbook and all its learner responses. This is destructive — there is no soft delete.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_export_course_portfolioB

Export a learner's full course portfolio (every workbook in module order) as PDF or Markdown. Pass outputPath for PDF (required) or to save the Markdown to disk.

Inputs: format (required), userId (required), courseId (required), siteId, +2 more.

thincms_export_submissions_csvB

Export all submissions for a form as CSV data.

Inputs: formId (required), siteId, confirmProductionWrite.

thincms_export_subscribers_csvB

Export all subscribers as CSV data.

Inputs: siteId, confirmProductionWrite.

thincms_export_workbook_responseA

Export a single learner's workbook response as PDF or Markdown. Pass outputPath to write the file to disk (required for PDF; recommended for Markdown). Without outputPath, Markdown is returned inline.

Inputs: format (required), userId (required), workbookId (required), siteId, +2 more.

thincms_export_workbook_responses_csvA

Export every learner response for a workbook as CSV (admin). Pass outputPath to save to disk; otherwise the CSV body is returned inline.

Inputs: workbookId (required), siteId, outputPath, confirmProductionWrite.

thincms_generate_media_variantsA

Generate optimized WebP image variants for all images in the media library that don't have them yet. Creates thumbnail (400px), medium (800px), and large (1200px) WebP versions. Admin-only.

Inputs: siteId, confirmProductionWrite.

thincms_get_campaignB

Get a campaign by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_collectionA

Get a single collection by ID, including all its items.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_content_blockB

Get a single content block by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_courseA

Get a single course by ID, including its modules, lessons, and quizzes.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_formB

Get a single form by ID with full field definitions and configuration.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_integrationB

Get the site's email platform integration configuration.

Inputs: siteId, confirmProductionWrite.

thincms_get_lead_magnetC

Get a single lead magnet by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_lessonB

Get a single lesson by ID, including its attachments.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_lesson_attachment_urlA

Get the download URL for a lesson attachment. Returns the URL path — append to your base URL to download.

Inputs: lessonId (required), attachmentId (required), siteId, confirmProductionWrite.

thincms_get_mediaA

Get a single media item by ID with full metadata. The response includes a variants field with optimized WebP versions (thumbnail 400px, medium 800px, large 1200px) when available.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_navigationA

Get the site's header and footer navigation arrays. Each nav item has a label, type (page/route/external), and target.

Inputs: siteId, confirmProductionWrite.

thincms_get_pageB

Get a single static page by ID, including full HTML content.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_popupA

Get a single popup by ID with full configuration.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_postA

Get a single blog post by ID, including full HTML content, author, categories, and tags.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_post_preview_urlA

Get a signed preview URL for a blog post. Works for any status (draft, scheduled, future-dated, published). The URL is valid for 72 hours and requires no authentication to view. Use this after creating or updating a post to verify how it looks on the live site.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_preview_urlA

Get the full preview URL for a preview token. The URL can be opened in a browser to view the preview — no authentication required.

Inputs: token (required), siteId, confirmProductionWrite.

thincms_get_quizA

Get a single quiz by ID, including its questions with correct answers.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_redirectA

Get a single redirect by ID.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_reviewA

Get a single review by ID, including full text, sentiment fields, and drift notes if drift was detected.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_reviews_settingsA

Get the current reviews + AI configuration for the active site, plus recipient list and last-sync status. Admin-only. Secrets are echoed only as has*Key booleans, never as plaintext.

Inputs: siteId, confirmProductionWrite.

thincms_get_sequenceA

Get a sequence by ID, including its steps.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_settingsA

Get site settings: name, tagline, description, domain, logo URL, favicon URL, footer HTML, and widget configuration. Read-only via API key.

Inputs: siteId, confirmProductionWrite.

thincms_get_share_buttonsA

Get the site's share button configuration. Returns { enabled: boolean, platforms: string[] }. Platforms: 'twitter', 'linkedin', 'facebook', 'email', 'copy'.

Inputs: siteId, confirmProductionWrite.

thincms_get_tagB

Get a single tag by ID, including associated posts.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_templateA

Get the site's template: stylesheet (CSS), pageFrame (HTML wrapper with template tags like {{content}}, {{nav:header}}), and customHeadHtml.

Inputs: siteId, confirmProductionWrite.

thincms_get_toolA

Get a single Tool by ID or slug, including the full HTML payload and config.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_get_tool_dataA

Read a single Tool data value. If subscriberId is provided, prefers the per-user value at that scope; otherwise reads tool-global. Falls back to tool-global if no per-user value exists.

Inputs: id (required), key (required), siteId, subscriberId, +1 more.

thincms_get_workbookC

Get a workbook by ID. Returns the workbook with its full field spec (already JSON-parsed).

Inputs: id (required), siteId, confirmProductionWrite.

thincms_go_liveA

Take a site live by provisioning SSL for the production domain and transitioning from 'preview' to 'live' status. Requires the production domain's DNS to be pointed to the server first. This calls the go-live endpoint which provisions Nginx config + SSL certificate.

Inputs: siteId (required).

thincms_import_redirectsA

Bulk import redirects from a JSON array. Existing redirects with the same sourcePath are updated (upsert).

Inputs: redirects (required), siteId, confirmProductionWrite.

thincms_list_authorsB

List all authors with their bios, avatars, and post counts.

Inputs: siteId, confirmProductionWrite.

thincms_list_campaignsC

List email campaigns with optional status filter and pagination.

Inputs: page, limit, siteId, status, +1 more.

thincms_list_categoriesB

List all categories with post counts and hierarchy information.

Inputs: siteId, confirmProductionWrite.

thincms_list_collection_itemsB

List all items in a collection, ordered by sortOrder.

Inputs: collectionId (required), siteId, enabled, confirmProductionWrite.

thincms_list_collectionsA

List all collections for the site. Collections are structured data lists (testimonials, reviews, products, team members) that render via {{collection:slug}} template tag in multiple display modes: cards, carousel, banner, list, compact.

Inputs: siteId, enabled, confirmProductionWrite.

thincms_list_content_blocksB

List all reusable content blocks for the site. Optional enabled filter. Content blocks are HTML fragments insertable via {{block:slug}} template tags in the page frame or page/post content.

Inputs: siteId, enabled, confirmProductionWrite.

thincms_list_coursesA

List courses with optional filters. Returns courses with module/enrollment counts.

Inputs: page, limit, siteId, status, +1 more.

thincms_list_enrollmentsA

List course enrollments with optional filters. Returns enrollments with user and course details.

Inputs: page, limit, siteId, status, +2 more.

thincms_list_formsB

List all forms and surveys with submission counts.

Inputs: siteId, confirmProductionWrite.

thincms_list_integration_listsB

List all mailing lists from the connected email platform.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_list_integration_tagsB

List all tags from the connected email platform.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_list_lead_magnetsB

List all lead magnets for the site.

Inputs: siteId, confirmProductionWrite.

thincms_list_mediaA

List uploaded media files with pagination. Returns file metadata including paths, dimensions, and alt text.

Inputs: page, limit, siteId, visibility, +1 more.

thincms_list_pagesB

List static pages with optional status filter and pagination.

Inputs: page, limit, siteId, status, +1 more.

thincms_list_popupsB

List all popups/CTAs for the site with their linked form names.

Inputs: siteId, confirmProductionWrite.

thincms_list_postsA

List blog posts with optional filters. Returns posts without content by default (use includeContent=true for full HTML). Supports pagination.

Inputs: tag, page, limit, series, +9 more.

thincms_list_redirectsB

List all URL redirects. Optionally filter by enabled status.

Inputs: siteId, enabled, confirmProductionWrite.

thincms_list_reviewsA

List Google reviews ingested for the active site (Reviews Module v1). Filterable by post status, rating, sentiment, hold reason, and drift flag. Reviews are pulled from Outscraper on a daily cron schedule; sentiment is run via the configured AI provider. Use postStatus=posted to see what's currently on the public widget.

Inputs: page, limit, rating, siteId, +6 more.

thincms_list_scriptsB

List all script injections (analytics, chat widgets, tracking pixels, etc.).

Inputs: siteId, confirmProductionWrite.

thincms_list_secretsA

List environment variable secrets. Returns key names and descriptions only — values are never returned for security.

Inputs: siteId, confirmProductionWrite.

thincms_list_sequencesB

List email sequences (drip campaigns) with their steps.

Inputs: siteId, confirmProductionWrite.

thincms_list_sitesA

List all configured ThinCMS sites with preview URLs and status (preview/live). Shows which site is currently active.

Inputs: no named parameters.

thincms_list_snapshotsA

List all snapshots taken in the current MCP wrapper session. Useful for finding the right snapshotId to restore, or auditing what test writes have been made.

Inputs: no named parameters.

thincms_list_submissionsA

List form submissions with pagination. Returns submission data (field values) and timestamps.

Inputs: formId (required), page, limit, siteId, +1 more.

thincms_list_subscribersC

List subscribers/members with optional search and pagination.

Inputs: page, limit, search, siteId, +1 more.

thincms_list_tagsA

List all tags with post counts.

Inputs: siteId, confirmProductionWrite.

thincms_list_tool_dataA

List all data keys visible to the caller — merges per-user (when subscriberId is supplied) with tool-global. Per-user values shadow global at the same key. Returns each key with its value, scope ('user' or 'global'), and updatedAt.

Inputs: id (required), siteId, subscriberId, confirmProductionWrite.

thincms_list_tool_end_usersA

List end-user Subscribers who have interacted with a Tool (have data rows or AI usage on it), sorted by most-recent activity. Returns id, email, name, emailVerified, lastLoginAt, and lastActiveOnTool.

Inputs: id (required), page, limit, siteId, +1 more.

thincms_list_toolsA

List publishable Tools (mini-apps) with optional status/enabled filters and pagination. Tools render at /tools/:slug and can be authenticated (Google or password), store per-user JSON data, and call AI via /ai/chat and /ai/complete.

Inputs: page, limit, siteId, status, +2 more.

thincms_list_workbooksB

List workbooks across the site, optionally filtered by course or module. Each result includes module info and a response count.

Inputs: siteId, courseId, moduleId, confirmProductionWrite.

thincms_patch_cssA

Replace a named section of the stylesheet between comment markers. The stylesheet must contain /* START: / and / END: */ markers. Only the content between these markers is replaced.

IMPORTANT — what to send: pass ONLY the body to insert between the markers, not a full stylesheet. If your input contains its own START: and END: markers matching the same section name, the API will auto-extract the body for you. If it contains markers for a DIFFERENT section, the call is rejected to prevent silent doubling. Use dryRun=true on large patches to verify the size delta before committing.

Inputs: section (required), css, dryRun, siteId, +2 more.

thincms_pause_sequenceB

Pause a published sequence automation.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_publish_reviewA

Mark a review as posted to the public reviews widget. Sets postStatus='posted' and clears any holdReason. Subject to the production-write guard if the site is in THINCMS_PRODUCTION_SITE_IDS — pass confirmProductionWrite=true to acknowledge.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_publish_sequenceC

Publish a sequence as an automation in the email platform.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_re_analyze_review_sentimentA

Re-run sentiment analysis for a single review (id) or all reviews on the site (all=true). Useful after switching the AI provider in Settings. Does NOT change postStatus — only sentiment fields. Admin-only.

Inputs: id, all, siteId, confirmProductionWrite.

thincms_reorder_collection_itemsB

Bulk reorder items in a collection. Pass an array of { id, sortOrder } pairs.

Inputs: items (required), collectionId (required), siteId, confirmProductionWrite.

thincms_reorder_module_itemsA

Reorder lessons, quizzes, and workbooks within a module. All three types share a single sort order space — pass all items in the desired order with their type.

Inputs: items (required), moduleId (required), siteId, confirmProductionWrite.

thincms_reorder_modulesA

Reorder modules within a course. Pass all module IDs in the desired order.

Inputs: courseId (required), moduleIds (required), siteId, confirmProductionWrite.

thincms_reorder_sequence_stepsC

Reorder steps in a sequence.

Inputs: stepIds (required), sequenceId (required), siteId, confirmProductionWrite.

thincms_restore_snapshotA

Write a previously-captured snapshot back to its original resource. Reverts the resource to the exact bytes captured at snapshot time. Fails if the snapshot has expired (24h) or the resource has been deleted. Use as the cleanup step after any test write.

Inputs: snapshotId (required).

thincms_send_campaignA

Push the campaign to the connected mail platform (e.g. ActiveCampaign) and request delivery. If scheduledFor is "immediate" (or the legacy scheduledAt is empty), the platform begins sending right away. If scheduledFor is a future timestamp (or scheduledAt is set), the platform queues it for that time. Returns success when the platform accepts the queue request — actual recipient delivery is asynchronous and reported via thincms_campaign_stats. Optionally pass scheduledFor here to override the stored schedule in the same call. WARNING — the platform locks the schedule at first send. To reschedule a campaign you have already sent, delete it and recreate it; a /send with a changed schedule against an already-queued campaign returns 409.

Inputs: id (required), siteId, scheduledFor, confirmProductionWrite.

thincms_send_verify_emailA

Send (or re-send) the email-verification email to a subscriber. Generates a fresh 24-hour verify token, invalidating any prior pending token. Rejected if the subscriber's email is already verified.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_seo_analyzeB

Analyze a single post or page for SEO signals. Returns word count, heading structure, image count (with missing alt detection), internal/external link counts, meta field lengths, and actionable suggestions.

Inputs: id (required), type (required), siteId, confirmProductionWrite.

thincms_seo_auditC

Run an SEO audit across all published posts and pages. Reports missing meta descriptions, missing meta titles, title length issues, missing OG images, thin content, missing excerpts, and duplicate titles. Returns a summary with score and a list of issues per item.

Inputs: siteId, confirmProductionWrite.

thincms_set_review_editor_notesA

Set free-text editor notes on a review (internal-only; not shown publicly). Useful for tracking why something was unpublished or what to do about a flagged drift event.

Inputs: id (required), editorNotes (required), siteId, confirmProductionWrite.

thincms_set_subscriber_passwordA

Set a password for a subscriber. Admin action for bulk-provisioning end-users of Tools (mini-apps); skips the signup email flow. Password must meet strength rules (8+ chars, upper, lower, digit). Existing sessions for the subscriber are revoked so the new password takes effect everywhere.

Inputs: id (required), password (required), siteId, confirmProductionWrite.

thincms_set_tool_dataA

Write a Tool data value. Without subscriberId, writes tool-global (visible to every user of the tool). With subscriberId, writes per-user data — the workhorse for AI agents updating a specific user's personalized dashboard, Kanban board, or state file. value accepts any JSON: object, array, string, number, boolean, or null.

Inputs: id (required), key (required), value, siteId, +2 more.

thincms_snapshotA

Capture the current state of a site resource so it can be restored byte-for-byte later. Use BEFORE any test write against a customer site — restore returns the resource to the exact pre-test state regardless of what the test write does (null, substitute, partial update, etc.). Snapshots live in MCP wrapper memory for 24 hours; they survive across tool calls within a session but are lost on host restart. Supports scope='settings', 'template', 'page' (requires resourceId), 'post' (requires resourceId), and 'review' (requires resourceId).

Inputs: scope (required), siteId, resourceId.

thincms_switch_siteA

Switch the active ThinCMS site. All subsequent API calls will use this site's credentials.

Inputs: name (required).

thincms_sync_integrationB

Bulk sync all subscribers to the email platform. Creates tags for lead magnets and pushes all subscribers.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_sync_reviewsA

Manually trigger a reviews poll for the active site (same code path the cron uses). Fetches from the configured provider, runs sentiment on new reviews, applies the auto-post rule, and detects drift. Subject to the production-write guard. Optional backfillDaysOverride lets you re-run with a longer history window.

Inputs: siteId, backfillDaysOverride, confirmProductionWrite.

thincms_template_statusA

Get the current template's stats (hash, byte size, line count) for each field. Optionally compare against local files to verify a push landed correctly. Returns match/mismatch with size and line differences.

Inputs: siteId, comparePageFrameFile, compareStylesheetFile, confirmProductionWrite, +1 more.

thincms_test_ai_connectionA

Round-trip a 1-token prompt to the configured AI provider to confirm the key + model combination works. Returns provider, model, and a tiny sample reply. Admin-only.

Inputs: siteId, confirmProductionWrite.

thincms_test_integrationC

Test the email platform connection.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_unpublish_reviewA

Hide a review from the public widget. Sets postStatus='not_posted' and holdReason='editor_unpublished'. Subject to the production-write guard.

Inputs: id (required), siteId, confirmProductionWrite.

thincms_update_authorA

Update an existing author profile. Only provided fields are changed.

Inputs: id (required), bio, name, slug, +6 more.

thincms_update_campaignB

Update a draft or scheduled campaign.

Inputs: id (required), name, listId, siteId, +6 more.

thincms_update_categoryA

Update an existing category. Only provided fields are changed.

Inputs: id (required), name, slug, siteId, +4 more.

thincms_update_collectionB

Update collection settings. Supports partial updates.

Inputs: id (required), name, slug, siteId, +15 more.

thincms_update_collection_itemB

Update a collection item. Supports partial updates.

Inputs: itemId (required), collectionId (required), body, title, +9 more.

thincms_update_content_blockA

Update an existing content block. Supports partial updates — only include fields you want to change.

Inputs: id (required), name, slug, type, +6 more.

thincms_update_courseA

Update an existing course. Only provided fields are changed (partial update).

Inputs: id (required), slug, title, siteId, +11 more.

thincms_update_enrollmentA

Update an enrollment status. Use to approve pending enrollments or revoke access.

Inputs: id (required), status (required), siteId, confirmProductionWrite.

thincms_update_formA

Update an existing form or survey. Only provided fields are changed. For large HTML content (>10KB), use htmlContentFile instead of htmlContent.

Inputs: id (required), name, slug, fields, +11 more.

thincms_update_integrationB

Update the email platform integration config.

Inputs: id (required), name, config, siteId, +2 more.

thincms_update_lead_magnetB

Update an existing lead magnet. Supports partial updates.

Inputs: id (required), slug, title, siteId, +9 more.

thincms_update_lessonB

Update an existing lesson. Only provided fields are changed (partial update). For large content (>10KB), use contentFile.

Inputs: id (required), slug, title, isFree, +10 more.

thincms_update_mediaA

Update media metadata (alt text, caption, visibility). Does not change the file itself.

Inputs: id (required), siteId, altText, caption, +2 more.

thincms_update_moduleC

Update a module's title or description.

Inputs: courseId (required), moduleId (required), title, siteId, +2 more.

thincms_update_navigationA

Update header and/or footer navigation. Each is a full replacement array (max 20 items). Item types: 'page' (target = page slug, must exist and be published), 'route' (target = CMS path like /blog or /search), 'external' (target = full URL).

Inputs: siteId, footerNav, headerNav, confirmProductionWrite.

thincms_update_pageA

Update an existing static page. Only provided fields are changed (partial update). Content should be raw HTML. For large content (>10KB), use contentFile instead of content. Changing slug auto-creates a 301 redirect from the old URL.

Inputs: id (required), slug, title, jsonLd, +11 more.

thincms_update_popupB

Update an existing popup. Only provided fields are changed.

Inputs: id (required), name, slug, formId, +15 more.

thincms_update_postA

Update an existing blog post. Only provided fields are changed (partial update). Content should be raw HTML. For large content (>10KB), use contentFile instead of content. Changing slug auto-creates a 301 redirect from the old URL.

Inputs: id (required), slug, tags, title, +24 more.

thincms_update_quizC

Update a quiz. Only provided fields are changed.

Inputs: id (required), slug, title, siteId, +3 more.

thincms_update_quiz_questionA

Update a quiz question. Only provided fields are changed.

Inputs: quizId (required), questionId (required), siteId, options, +5 more.

thincms_update_redirectA

Update an existing redirect. Only provided fields are changed.

Inputs: id (required), note, siteId, enabled, +4 more.

thincms_update_reviews_settingsA

Update reviews module + AI provider configuration. Partial-update — only provided fields change. Pass an empty string to a key field (e.g. reviews.outscraperApiKey='') to clear that secret. Admin-only; subject to production-write guard.

Inputs: ai, siteId, reviews, recipientUserIds, +1 more.

thincms_update_scriptA

Update an existing script injection. Only provided fields are changed.

Inputs: id (required), code, name, siteId, +4 more.

thincms_update_sequenceC

Update a sequence's name or trigger form.

Inputs: id (required), name, siteId, triggerFormSlug, +1 more.

thincms_update_sequence_stepC

Update a sequence step.

Inputs: stepId (required), sequenceId (required), siteId, subject, +3 more.

thincms_update_settingsB

Update site settings. Supports partial updates — only provided fields are changed. Sensitive fields (SMTP, Stripe keys, API keys, billing) remain admin-only.

Inputs: locale, siteId, aiBrief, logoUrl, +13 more.

thincms_update_share_buttonsA

Update the site's share button configuration. Share buttons appear on blog posts and let readers share via social platforms or copy the link. Only provided fields are changed.

Inputs: siteId, enabled, platforms, confirmProductionWrite.

thincms_update_tagC

Update a tag's name, slug, or description.

Inputs: id (required), name, slug, siteId, +2 more.

thincms_update_templateA

Update the site's template. Only provided fields are changed. The pageFrame must contain {{content}} if provided. For large files (>10KB), use the File variants instead of inlining content. Available template tags: {{content}}, {{nav:header}}, {{nav:footer}}, {{site:name}}, {{site:tagline}}, {{site:logo}}, {{year}}, {{search:form}}.

Inputs: siteId, pageFrame, stylesheet, pageFrameFile, +4 more.

thincms_update_toolA

Update an existing Tool. Only supplied fields change. For large HTML payloads (>10KB), use htmlFile instead of html.

Inputs: id (required), html, name, slug, +11 more.

thincms_update_workbookA

Update a workbook (partial — only provided fields change). If fields is provided and differs from the current spec, the workbook's version is incremented and any removed-field values in existing responses are archived (not deleted).

Inputs: id (required), slug, title, fields, +11 more.

thincms_upload_lesson_attachmentC

Upload a file attachment to a lesson. Provide a local file path, a URL to download from, or base64-encoded content.

Inputs: lessonId (required), url, base64, siteId, +3 more.

thincms_upload_mediaA

Upload an image or file to the media library. Provide exactly one source: filePath (local file), url (download from URL), or base64 (encoded content with filename). For images, optimized WebP variants (thumbnail 400px, medium 800px, large 1200px) are automatically generated and returned in the variants field.

Inputs: url, base64, siteId, altText, +5 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 191 tools

    Disambiguation3/5

    Most tools have distinct purposes, but with 191 tools, there is some overlap (e.g., thincms_get_post_preview_url vs thincms_create_preview both deal with previews, and multiple tools related to reviews and courses have similar boundaries). Some tools like thincms_bulk_create_posts could be confused with thincms_create_post.

    Naming Consistency4/5

    All tools follow a thincms_verb_noun pattern, which is consistent. However, there are minor deviations: 'add' vs 'create' (thincms_add_quiz_question vs thincms_create_quiz), 'set' vs 'update', and some tools use 'get' vs 'list' inconsistently. Overall, the naming is predictable.

    Tool Count2/5

    191 tools is far beyond typical MCP server sizes. While the server covers a broad CMS platform, this number will overwhelm agents and cause slow tool selection. A more focused set (e.g., 30-50 tools) would be more appropriate for the domain, with deeper nesting or sub-resources.

    Completeness3/5

    The tool surface is extensive, covering posts, pages, courses, quizzes, workbooks, emails, reviews, SEO, analytics, and integrations. However, some areas like user management (beyond subscribers) are limited, and there are no tools for comments or multi-user roles. The snapshot/restore feature is unique but incomplete for full CRUD on all resources.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers