thincms-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| THINCMS_API_KEY | Yes | Your ThinCMS API key (starts with tcms_) | |
| THINCMS_SITE_ID | Yes | Your ThinCMS site ID | |
| THINCMS_BASE_URL | Yes | The base URL of your ThinCMS instance (e.g., https://your-domain.com) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| thincms_list_postsA | List blog posts with optional filters. Returns posts without content by default (use includeContent=true for full HTML). Supports pagination. |
| thincms_get_postA | Get a single blog post by ID, including full HTML content, author, categories, and tags. |
| 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. |
| 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. |
| thincms_delete_postB | Permanently delete a blog post by ID. |
| 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. |
| 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. |
| thincms_list_pagesB | List static pages with optional status filter and pagination. |
| thincms_get_pageB | Get a single static page by ID, including full HTML content. |
| 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. |
| 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. |
| thincms_delete_pageB | Permanently delete a static page by ID. |
| thincms_list_categoriesB | List all categories with post counts and hierarchy information. |
| thincms_create_categoryB | Create a new category. Optionally nest it under a parent category for hierarchy. |
| thincms_update_categoryA | Update an existing category. Only provided fields are changed. |
| thincms_delete_categoryA | Delete a category by ID. Posts in this category will be uncategorized. |
| thincms_list_authorsB | List all authors with their bios, avatars, and post counts. |
| thincms_create_authorB | Create a new author profile with bio, avatar, and social links. |
| thincms_update_authorA | Update an existing author profile. Only provided fields are changed. |
| thincms_delete_authorC | Delete an author by ID. Posts by this author will have their author unset. |
| thincms_list_tagsA | List all tags with post counts. |
| thincms_create_tagB | Create a new tag. Note: tags are also auto-created when included in the tags array of a post. |
| thincms_get_tagB | Get a single tag by ID, including associated posts. |
| thincms_update_tagC | Update a tag's name, slug, or description. |
| thincms_delete_tagA | Delete a tag by ID. Removes the tag from all posts. |
| thincms_list_mediaA | List uploaded media files with pagination. Returns file metadata including paths, dimensions, and alt text. |
| thincms_get_mediaA | Get a single media item by ID with full metadata. The response includes a |
| 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 |
| thincms_update_mediaA | Update media metadata (alt text, caption, visibility). Does not change the file itself. |
| thincms_delete_mediaB | Delete a media item and remove the file from disk. |
| 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. |
| thincms_get_templateA | Get the site's template: stylesheet (CSS), pageFrame (HTML wrapper with template tags like {{content}}, {{nav:header}}), and customHeadHtml. |
| 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}}. |
| 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. |
| 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. |
| 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. |
| thincms_get_navigationA | Get the site's header and footer navigation arrays. Each nav item has a label, type (page/route/external), and target. |
| 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). |
| thincms_get_settingsA | Get site settings: name, tagline, description, domain, logo URL, favicon URL, footer HTML, and widget configuration. Read-only via API key. |
| 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. |
| thincms_list_scriptsB | List all script injections (analytics, chat widgets, tracking pixels, etc.). |
| thincms_create_scriptB | Create a script injection for the public site. Scripts can be placed in the or before . |
| thincms_update_scriptA | Update an existing script injection. Only provided fields are changed. |
| thincms_list_secretsA | List environment variable secrets. Returns key names and descriptions only — values are never returned for security. |
| thincms_create_secretB | Create a new environment variable secret. The value is stored securely and never returned in API responses. |
| thincms_list_formsB | List all forms and surveys with submission counts. |
| thincms_get_formB | Get a single form by ID with full field definitions and configuration. |
| 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. |
| thincms_update_formA | Update an existing form or survey. Only provided fields are changed. For large HTML content (>10KB), use htmlContentFile instead of htmlContent. |
| thincms_list_submissionsA | List form submissions with pagination. Returns submission data (field values) and timestamps. |
| thincms_export_submissions_csvB | Export all submissions for a form as CSV data. |
| thincms_delete_submissionB | Delete a form submission by ID. |
| thincms_searchC | Full-text search across published posts and pages. Searches titles, excerpts, and content. |
| 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. |
| 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. |
| thincms_get_social_linksB | Get the site's social media links. These render in the footer via the {{social:links}} template tag. |
| 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. |
| 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. |
| thincms_get_content_blockB | Get a single content block by ID. |
| thincms_create_content_blockA | Create a new reusable content block. For type='html' (default) the |
| thincms_update_content_blockA | Update an existing content block. Supports partial updates — only include fields you want to change. |
| thincms_delete_content_blockA | Delete a content block. Any {{block:slug}} references in templates or content will render as empty. |
| 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. |
| thincms_get_collectionA | Get a single collection by ID, including all its items. |
| 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. |
| thincms_update_collectionB | Update collection settings. Supports partial updates. |
| thincms_delete_collectionA | Delete a collection and all its items. Any {{collection:slug}} references will render as empty. |
| thincms_list_collection_itemsB | List all items in a collection, ordered by sortOrder. |
| 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. |
| thincms_update_collection_itemB | Update a collection item. Supports partial updates. |
| thincms_delete_collection_itemB | Delete an item from a collection. |
| thincms_reorder_collection_itemsB | Bulk reorder items in a collection. Pass an array of { id, sortOrder } pairs. |
| thincms_list_popupsB | List all popups/CTAs for the site with their linked form names. |
| thincms_get_popupA | Get a single popup by ID with full configuration. |
| 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. |
| thincms_update_popupB | Update an existing popup. Only provided fields are changed. |
| thincms_delete_popupB | Delete a popup by ID. |
| thincms_get_share_buttonsA | Get the site's share button configuration. Returns { enabled: boolean, platforms: string[] }. Platforms: 'twitter', 'linkedin', 'facebook', 'email', 'copy'. |
| 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. |
| thincms_list_redirectsB | List all URL redirects. Optionally filter by enabled status. |
| thincms_get_redirectA | Get a single redirect by ID. |
| thincms_create_redirectA | Create a URL redirect. Source path must start with /. Use /* suffix for wildcard matching. |
| thincms_update_redirectA | Update an existing redirect. Only provided fields are changed. |
| thincms_delete_redirectB | Delete a redirect by ID. |
| thincms_import_redirectsA | Bulk import redirects from a JSON array. Existing redirects with the same sourcePath are updated (upsert). |
| thincms_analytics_summaryA | Get analytics summary: total views, unique visitors, top page, views today. Period: 7d, 30d, or 90d. |
| thincms_analytics_top_pagesB | Get top pages by views for a given period. |
| thincms_analytics_referrersB | Get top referrer domains for a given period. |
| thincms_analytics_trendA | Get daily views and visitors trend for a given period. |
| thincms_list_sitesA | List all configured ThinCMS sites with preview URLs and status (preview/live). Shows which site is currently active. |
| thincms_switch_siteA | Switch the active ThinCMS site. All subsequent API calls will use this site's credentials. |
| 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. |
| 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. |
| 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. |
| 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. |
| thincms_list_coursesA | List courses with optional filters. Returns courses with module/enrollment counts. |
| thincms_get_courseA | Get a single course by ID, including its modules, lessons, and quizzes. |
| 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). |
| thincms_update_courseA | Update an existing course. Only provided fields are changed (partial update). |
| thincms_delete_courseA | Delete a course and all its modules, lessons, quizzes, and enrollments. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pmccarroll-fuel/thincms-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server