LotsBlog
Publish and run a blog on your own domain from any AI agent, with hosting and technical SEO built in.
Hosted MCP Server
npx add-mcp 'https://api.lots.blog/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Ask your agent, for example.
Once LotsBlog is connected, plain requests like these work.
- “Draft a 1,200-word post on this topic and send me the preview link.”
- “Schedule the approved draft for Tuesday 10am.”
- “Which posts got the most views this month?”
Connect in two minutes.
Claude
Settings → Connectors → Add custom connector. Paste the URL, connect, and sign in with your Lots account.
ChatGPT
Settings → Apps & Connectors → Advanced → turn on Developer mode, then Create a connector with the URL and sign in.
Claude Code
claude mcp add --transport http lots-blog https://api.lots.blog/mcp
Codex
codex mcp add lots-blog --url https://api.lots.blog/mcp
Cursor, Windsurf and others
{
"mcpServers": {
"lots-blog": {
"url": "https://api.lots.blog/mcp"
}
}
}
Cloud agents without MCP
Give the agent https://api.lots.blog/docs.md and an API key from lotstech.com/api. It calls the REST API with Authorization: Bearer <key>.
Every server uses OAuth: your agent acts as you, inside your own roles and workspaces. You can disconnect it at any time from the app.
30 tools, also REST endpoints.
Each tool is available over MCP and as a REST endpoint under https://api.lots.blog/api/v1/lotsblog.
Check Domain
Check the owned blog's custom domain (DNS verification and HTTPS certificate) and, when one is set up, its subdirectory (fetches example.com/blog/__lotsblog/subdirectory-check through the user's rewrite). Returns exact records or setup rules and a plain-language next step. Does not change the user's DNS or site.
Check product funding
Check plan coverage, credit funding and current capacity rates. Plan coverage is used first; capacity beyond it is paid from the owner's credits automatically, charged daily (free credits first, then plan credits, then purchased). If credits run low, give the returned settings_url so the owner can top up or choose a plan.
Complete Image Upload
Verify the uploaded image size and magic bytes before using it in an article. Call after PUT to the URL returned by create_image_upload. Return a public CDN URL.
Connect Domain
Connect the blog to the owner's own address. Without path: connect a custom hostname (such as blog.example.com) and return the exact required CNAME and optional TXT DNS records; ask the user to set them, then call check_domain. With path (such as /blog): serve the blog at example.com/blog through one rewrite on the user's own site; returns the proxy target, the private proxy secret and copy-ready rules for Cloudflare Workers, Vercel, Next.js, Netlify and Nginx. The rules never contain the secret: they read it from a Worker secret or environment variable named LOTSBLOG_PROXY_SECRET (Nginx: an include file), and each rule's secret_storage says where the user puts it. Give the secret only to the owner for server-side settings, never in code or a committed file. Ask the user to add one rule, then call check_domain. Owner-only; requires an active plan or credits. Never changes DNS or the user's site automatically and never replaces an existing different domain. remove_subdirectory removes a path setup.
Create Blog
Create a hosted blog. A plan covers its included blogs; each extra blog costs that plan's own per-blog rate, and without a plan each blog is $9 a month. Capacity is paid from the owner's credits automatically, charged daily. Use get_funding_status for current rates and balance. If credits are insufficient, return the owner settings link so they can top up or choose a plan. Returns the blog and hosting URL.
Create Blog Post
Create an article with Markdown content, metadata, topics and optional matching supplemental JSON-LD such as FAQPage. Defaults to a private draft. Return preview_url to the user; sign-in is required for draft preview. Publish or schedule only under explicit user instructions. Use list_topics to choose topic_ids.
Create Image Upload
Prepare a local image upload without passing base64 through MCP. Return a 15-minute presigned PUT URL, headers and file_key. PUT the local bytes then call complete_image_upload. JPEG, PNG, WebP or GIF, at most 25 MB. Requires the blog owner plan and create permission. Uploaded images are public.
Create Topic
Create an article topic/category in the selected blog. An explicit slug is preserved and must be unique within that blog; omit it to generate from the name. Returns the numeric topic ID for topic_ids in article create/update.
Delete Blog Post
Move a post to Trash under user instructions. It leaves the public site, sitemap, RSS and search at once, and search engines are told it is gone. Nothing is deleted: restore_blog_post returns it to its previous status, and only the blog owner or an admin can delete it forever from the dashboard Trash. Owners and admins can trash any post; editors and authors only their own.
Delete Media
Permanently delete an unused image belonging to this blog, only under the user instruction. Images referenced by article content, covers or blog appearance cannot be deleted.
Delete Topic
Delete a topic/category under user instructions. Articles remain intact; their association with this topic is removed. Topics with children must be handled first. Select the numeric topic_id from list_topics.
Get Blog Analytics
Retrieves traffic and engagement analytics for a blog. IMPORTANT: Requires blog_id — call list_blogs first to get the blog UUID.
Get Blog Details
Read the blog, current user role, hosting URL and private Markdown blog_guide. Call list_blogs first to select the blog. Read the guide before writing; it is optional and must not be copied into public articles. subdirectory shows a path setup on the owner's site (example.com/blog): host, path, url, status pending or verified, and the last check and error; it is null when there is none. ga_measurement_id is the blog's GA4 Measurement ID, or null.
Get Blog Post
Read the saved article and metadata by blog_id and post_id. Call list_blog_posts to find post IDs. Use this to verify saved content and publication status before retrying an uncertain write.
Get Post Analytics
Read traffic and engagement analytics for an article. Select blog_id from list_blogs and post_id from list_blog_posts. Traffic is not a ranking or AI-citation measurement.
Get Topic
Retrieves details for a specific blog topic. IMPORTANT: Requires blog_id and topic_id — call list_blogs to get the blog UUID, then list_topics to get the topic_id.
Independent Article Review
Optional paid article quality check requested by the user. Charges the blog owner token-based LotsTech Credits for model input and output; cost varies with article length and usage. Set authorize_charge=true for a requested paid quality check; no separate resource funding consent is required. Never guarantees rankings or gates publication. Maximum 45000 characters; unchanged-revision retries reuse execution.
List Blog Posts
List the blog's posts, newest first, with optional filters by type, status and topic, and pagination. Posts in Trash are left out unless status is trashed.
List Blogs
Retrieves all blogs where the authenticated user is an owner or active member. Returns blogs with the user's role in each blog (owner, admin, editor, author, user). This is useful for displaying a blog selector in the UI or for determining which blogs the user can manage. Only active blog memberships are included (status='active' in blog_users table). Blogs are returned with their access URLs (either custom domain or subdomain URL).
List Media
List a bounded page of image keys and CDN URLs for this blog. Use next_cursor to continue. Images uploaded through MCP are publicly accessible.
List Topics
Lists all topics/categories for a blog. IMPORTANT: Requires blog_id — call list_blogs first to get the blog UUID.
Publish Post
Publish the saved post now, only when the user instructs publication. Select blog_id from list_blogs and post_id from list_blog_posts. Returns the saved publication status.
Remove Subdirectory
Stop serving the blog at a path on the owner's own site (example.com/blog), under the owner's explicit instruction. Canonical URLs, the sitemap and RSS return to the verified custom domain or the lots.blog address, which stop redirecting to the path. Ask the user to remove the rewrite from their site afterwards. Removes only the path setup; custom domains are removed in the dashboard. Owner-only. Requires confirm=true. get_blog shows the current path setup.
Restore Post
Restore a post from Trash to the status it had before (draft, scheduled, published or archived). A schedule that has already passed comes back as a draft. Restoring a published or scheduled post needs publish or schedule permission and active funding. Use list_blog_posts with status trashed to find posts in Trash.
Schedule Post
Schedule the saved post under the user instructions. Use an ISO 8601 timestamp with timezone, at least five minutes in the future. Select post_id from list_blog_posts. A scheduled status is not confirmation that the article is already live.
Unpublish Post
Move a published or scheduled article back to a private draft under user instructions. Clears publication time and any pending schedule. The public URL stops serving the article.
Update Blog Post
Update the existing article content, metadata, topics or publication status. Omitted fields are preserved; topic_ids=[] clears topics. Returns preview_url. Use the existing post_id rather than creating a duplicate. Publish or schedule only under user instructions.
Update Blog Settings
Update the owned blog name, title, privacy or private Markdown blog guide. Only supplied fields change. Use connect_domain/check_domain for custom domains; appearance and team setup use the dashboard. Also sets robots.txt (robots_txt; "" restores the default) and the Google Analytics 4 Measurement ID (ga_measurement_id; "" removes it).
Update Topic
Update the topic name, description, slug or metadata. Omitted fields are preserved. Supplied slugs are kept and must be unique within the blog. Select topic_id from list_topics.
Upload Blog Image
Upload an image from a public/signed image_url or small image_base64. For a local screenshot or larger image, prefer create_image_upload then complete_image_upload. Return the public CDN URL for featured_image in create_blog_post/update_blog_post or article Markdown. Requires the blog owner active plan and content-create permission; image URLs are public even for private blogs.
Questions, answered.
What is the LotsBlog MCP server URL?
https://api.lots.blog/mcp. Add it as a remote MCP server (custom connector) in your AI agent and sign in with your Lots account.
Which agents work with LotsBlog?
Claude, ChatGPT (developer mode), Claude Code, Codex, Cursor, Windsurf and any other client that supports remote MCP with OAuth. Agents without MCP use the REST API with an API key.
Where are the LotsBlog API docs?
https://api.lots.blog/docs.md: Markdown written so an AI agent can read it. Requests go to https://api.lots.blog/api/v1/lotsblog with Authorization: Bearer <your key>.
How do I get a LotsBlog API key?
Use Generate key on this page or at lotstech.com/api. Sign in with your LotsTech account, name the key and copy it once. You can revoke it there at any time.
Does MCP or API access cost extra?
No. It is included with LotsBlog. You pay only for LotsBlog's own plan or usage, and your AI provider bills its own usage.