thincms-mcp
This MCP server gives AI agents typed tool access to manage a ThinCMS site’s content, design, forms, data, SEO, analytics, and multi-site operations.
Manage blog posts: list, get, create, update, delete, bulk create, preview, schedule/publish, tags, categories, authors, SEO fields, and content gating.
Manage static pages: list, get, create, update, delete, preview content, render modes, and SEO metadata.
Manage categories, authors, and tags, including hierarchy, social links, descriptions, and post counts.
Manage media: list, get, upload from file/URL/base64, update metadata, delete, and generate WebP variants.
Manage site design and configuration: templates, CSS append/patch, navigation, settings, social links, share buttons, scripts, and secrets.
Manage forms, submissions, and popups/CTAs, including CSV export and submission deletion.
Manage reusable content blocks and collections/items, including display modes and reordering.
Manage redirects, search content, preview template/content changes, and run SEO audits, page analysis, and link checks.
Access analytics summaries, top pages, referrers, and daily trends.
Work across multiple sites with list/switch site tools and per-call siteId overrides, including go-live provisioning.
Manage courses and communities, including course metadata, access modes, pricing, and catalog visibility.
Support hosted OAuth or local API-key/stdio use, with production-write confirmation safeguards.
Provides tools for managing Google reviews ingested into ThinCMS, including syncing reviews, listing and filtering them, publishing or hiding them from the public reviews widget, editing internal notes, running sentiment analysis, and configuring Google Business Profile/Outscraper review settings.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@thincms-mcp create a new blog post titled 'My First Post'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Connect to the hosted server (recommended)
ThinCMS hosts this server at https://<admin host>/mcp. You sign in with your ThinCMS account (Google). No API keys needed.
A site admin enables MCP access for you in ThinCMS (Settings > Users > Edit) and picks a level per site: read-only, editor or admin.
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/mcpto sign in.
Ask for a site by name.
thincms_list_sitesshows your sites and access level; every tool'ssiteIdaccepts 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:httpThinCMS 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 |
|
Pages |
|
Categories |
|
Authors |
|
Tags |
|
Media |
|
Template |
|
Navigation |
|
Settings |
|
Scripts |
|
Secrets |
|
Forms |
|
Submissions |
|
Search |
|
Preview |
|
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_versionandthincms_restore_versionroll back any item;thincms_list_deletedfinds deleted ones.Releases are optional. Create one with
thincms_create_release, then pass its id asreleaseIdto the normal write tools to stage changes privately. Sharethincms_get_release_preview_linkfor review, thenthincms_publish_releaseorthincms_schedule_release. WithoutreleaseId, 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 toolsthincms_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_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_social_linksB
Get the site's social media links. These render in the footer via the {{social:links}} template tag.
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_searchC
Full-text search across published posts and pages. Searches titles, excerpts, and content.
Inputs: q (required), page, type, limit, +2 more.
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_seo_check_linksA
Scan published content for broken links. By default checks internal links only (fast). Set checkExternal=true to also verify external URLs via HEAD requests (slower, limited to 50 URLs). Optionally scope to a single post or page by providing type and id.
Inputs: id, type, siteId, checkExternal, +1 more.
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_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_social_linksA
Replace the site's social media links (max 20). Each link needs a platform and URL. Supported platforms: linkedin, twitter, youtube, facebook, instagram, tiktok, github, email, website, custom. Use {{social:links}} in the page frame template to render them.
Inputs: socialLinks (required), siteId, 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
Scored across 191 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server for building and testing AI agents with multi-model experimentation and insights.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server that lets AI agents use the Online Cyber Tools catalogue as a set of native MCP tools.10020 npm1MIT
- AlicenseBqualityCmaintenanceOpen-source MCP server that turns any CMS backend into an AI-agent-ready content management system. It provides tools for content CRUD, idea management, and publication tracking, with safety features requiring human approval for publishing.52MIT
- AlicenseNot gradedqualityCmaintenanceMCP tool server that gives any AI agent the ability to search, scrape, and analyze content across the internet.42MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides AI agents with direct read/write access to Sitecore CMS through 100+ tools across Item Service, GraphQL, and PowerShell APIs.167 npmApache 2.0