Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
CMSKITE_API_URLNoDefaults to https://api.cmskite.com.https://api.cmskite.com
CMSKITE_PROJECT_IDNoOptional. The project content tools default to, so projectId can be left off.
CMSKITE_AGENT_TOKENYesRequired. Starts with cka_. A csk_ value is a project API key: read-only, one project, and rejected here.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
whoamiA

The account this token acts as and the workspaces it can see. Call this first in a new conversation: it confirms the token works and names the workspace everything else happens in. agentGrants is what THIS TOKEN may do; permissions is what its owner may do. A tool works only when both allow it, so read agentGrants to know which tools will succeed. mcp says which version of this server is running and whether it is out of date; if mcp.outdated is true, tell the person before reporting any bug, because it may already be fixed.

create_workspaceA

Creates a workspace with a first project, owned by this token's account. IMPORTANT: the response carries agentToken, a NEW token for the new workspace — this token cannot act in it. Show that value to the person and tell them to save it; it is returned once and cannot be retrieved again. Requires the workspace.create grant.

list_projectsA

Every project in this token's workspace, with the prj_... ids the content tools take.

get_projectC

One project: what it is, which site it serves, and its settings.

create_projectB

A new site inside this workspace. Requires the project.write grant. The description and website fields are what make a list of projects readable later.

update_projectA

Change a project's name, description, website, or allowed origins. Only the fields passed change. allowedOrigins REPLACES the list: pass every origin, like ["https://example.com", "https://www.example.com"] — scheme and host, no path. It decides which websites may use the project key from a browser. Requires the project.write grant.

get_project_summaryA

Content counts, key count, database mode and recent traffic for one project, in one call. Use this rather than listing everything to answer "what is in here".

list_categoriesA

The category tree, ordered so a parent always precedes its children; depth is how far to indent. Pass include="counts" to get how many posts sit in each.

create_categoryA

A section of the blog, or a subsection of one when you pass parentId. Three levels deep at most. Requires the content.write grant.

update_categoryA

Renames a category, or moves it under a different parent — which moves everything beneath it too. A category cannot be moved inside one of its own subcategories.

delete_categoryA

Posts filed under it are NOT deleted; they simply stop having a category. Its subcategories keep their path. Confirm with the person first.

list_tagsB

Tags in a project, with how many posts use each.

create_tagA

Usually unnecessary: create_post and update_post create tags they do not find. Use this when a tag needs a description, or to set one up before writing.

list_authorsB

The bylines available in this project, with the ids create_post takes.

create_authorA

A byline. This does NOT create an account or invite anybody — an author is content, and giving somebody access to the workspace is a separate thing a person does in the dashboard.

list_postsA

Posts in a project, newest published first. Paginate with cursor from the previous response — there is no page number, by design. Filter before paginating.

get_postB

One post with its full body, by id or by slug.

search_postsA

Full-text search across titles and bodies, ranked. Use this to find something; use list_posts to enumerate. May require a paid capability on the workspace.

create_postA

Writes a new post. It is a draft unless you say otherwise, which is usually what you want: publishing is a decision the person should make. Requires the content.write grant, and content.publish as well if you send status "published".

update_postA

Changes only the fields you send; anything omitted is left alone. This is how a post is published: send status "published", which needs the content.publish grant on top of content.write. Pass expectedRevision (the revision from get_post) so that an edit made against an old copy is refused with REVISION_CONFLICT instead of overwriting a newer save; on that error, read the post again and reapply the change.

delete_postA

Soft-deletes a post: it stops being served and its slug becomes free again. Confirm with the person first. Requires the content.delete grant.

list_api_keysA

The read-only keys a website uses to read this project. Names, creation dates and the last four characters only — a whole key is shown once, when it is created, and never again. Requires the apikey.read grant.

create_api_keyA

Mints the credential a website reads this project with. IMPORTANT: the response carries the whole key exactly once. Show it to the person and tell them to put it in their environment — it cannot be retrieved afterwards. The key is read-only and returns published content only, so it is safe in a server environment; it is NOT safe in browser code unless the project has an allowed-origins list configured. Prefer this over handing a site the agent token, which can write and delete. Requires the apikey.write grant.

get_integration_guideA

The official way to connect a project to CMSKite. For JavaScript and TypeScript that is the cmskite package; for PHP, WordPress, Laravel, Python or a plain HTML site it is the raw HTTP calls, which need no dependency at all. Returns what to install if anything, the files to write, and which key belongs on the server versus in the browser. Call this BEFORE writing any integration code by hand: hand-rolled fetch wrappers miss view tracking entirely, so the customer gets a working site with no analytics and no indication that anything is missing. Finish by calling check_integration, which is the only thing that can tell a working integration from one that silently reports nothing. Does not read or change anything in CMSKite.

check_integrationA

Checks whether a project is really connected to a website: does it have a key, has a site ever used it, and are views arriving from the pages that render the content. Each check comes back with the one action that fixes it. ALWAYS call this after wiring up an integration, and always when somebody says views or analytics are zero — a site can fetch content perfectly and report nothing, and this is the only thing that tells the difference. Requires the project.read grant.

get_content_analyticsA

What readers did with a project’s posts over a date range: totals, a daily series, and the posts that were actually read. Read from rollups, so the answer is the same size whatever the traffic was. If everything is zero, call check_integration — that is a tracking problem far more often than it is a traffic problem. Requires the analytics.read grant.

get_post_analyticsA

Views, unique readers and clicks for one post, per day. The way to check that a specific post's view landed after wiring up tracking: open the post in a real browser (headless browsers are not counted), wait about a minute for the rollup, then call this. A reader counts once per post per day. Requires the analytics.read grant.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.6/5.0

Scored across 27 tools

Disambiguation5/5

Each tool has a clearly distinct purpose, with resource+action pairs that do not overlap. Even potentially similar tools like get_project vs get_project_summary, list_posts vs search_posts, and get_content_analytics vs get_post_analytics are explicitly differentiated in their descriptions. No ambiguity that would cause misselection.

Naming Consistency4/5

Almost every tool follows a consistent snake_case verb_noun pattern (list_projects, create_post, update_category, delete_post, etc.). The single outlier is whoami, which breaks the pattern but is a widely understood command. Overall highly predictable with one minor deviation.

Tool Count4/5

27 tools is on the heavy side, but the server covers a broad domain (projects, categories, tags, authors, posts, API keys, integration, analytics), so each tool earns its place. The count is slightly over the ideal 3-15 range but reasonable for the scope.

Completeness3/5

Posts have full CRUD, and categories have list/create/update/delete, but several resources lack lifecycle operations: tags and authors have only list/create (no update/delete), projects lack delete, API keys lack revoke/delete, and workspaces lack delete. These are notable gaps for a CMS agent, though core content workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues