MCP server for NKS-Web CMS tenant management - manage pages, articles, news, redirects, users, and analytics via Claude Code
NKS-Web MCP has solid tool definitions with consistent naming conventions and comprehensive parameter descriptions. All 26 tools follow verb_noun patterns (list_, get_, create_, update_, delete_). Input schemas are present and properly typed. However, output schemas are not documented in the source code provided, descriptions vary in quality and length, and error handling guidance is absent. The server demonstrates good structural discipline but lacks the refinement needed for production grade (A range). Tool annotations (destructiveHint, idempotentHint) are reported as present, which is a positive signal for risk clarity.
Get breakdown by any analytics dimension. Returns ranked list of values with visit counts and percentages. Use for countries, browsers, devices, OS, UTM campaigns, cities, regions, or languages.
Get aggregated traffic stats: sessions, pageviews, unique users, pages/session, bounce rate (%), avg session duration (seconds). Defaults to last 30 days.
Top visited pages ranked by visit count. Returns page path, visit count, pageviews, traffic percentage, avg time on page, bounce rate.
Top traffic sources ranked by visitor count. Shows referrer domain/URL, visit count, and percentage of total traffic.
Create a new blog article. Requires name and url (slug). Use descriptionShort for listing excerpts and description for full HTML content. Link to categories via categoryIds array. Set status=1 to publish.
Output schemas not documented in source code. No visible definition of what fields are returned by any tool (e.g., nksweb_list_articles returns 'id, name, url, descriptionShort, status, lang, categoryIds, and timestamps' per description, but structured output spec is not in code). LLMs cannot reliably plan downstream calls without documented return shapes.
No error handling guidance in tool descriptions. Tools do not explain what errors may occur, whether they are retryable, or what the LLM should do next. For example, nksweb_create_article does not mention validation constraints on the 'url' field (must be unique, lowercase, no spaces), an LLM will fail with a 400 error and have no guidance on recovery. Descriptions mention constraints in passing ('must be unique, lowercase, no spaces') but do not provide actionable error messages or recovery steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 74 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Create a new article category. Set parentId to nest under an existing category, or omit for a root-level category.
Create a new news item. Requires name and url (slug). Set published=true to make it visible on the website immediately.
Permanently delete an article. Soft-deleted — won't appear in listings but exists in database.
Delete a category. Articles assigned to this category will lose the association.
Permanently delete a file and its physical storage. This removes the file from disk — any pages or articles referencing it will have broken links. Cannot be undone.
Permanently delete a contact message. Cannot be undone.
Permanently delete a news item by ID. This action cannot be undone.
Get full article details including HTML content, categories, SEO metadata, and timestamps.
Get category details including title, description, and parent category reference.
Get file metadata by ID including original name, stored filename, MIME type, file size in bytes, and upload timestamp.
Get full details of a contact message including sender name, email, phone, subject, message body, IP address, read status, and timestamps.
Get full details of a news item by ID including HTML content and publication status.
List blog/news articles for the current tenant. Returns id, name, url, descriptionShort, status, lang, categoryIds, and timestamps. Use this to see existing content before creating new articles.
List article categories. Categories use a nested tree structure — root categories have parent=null, subcategories reference their parent's ID. Use to discover category hierarchy before assigning articles.
List uploaded files/media assets. Returns id, name, fileName (stored name), mimeType, fileSize, and timestamps. Files are images, documents, or other media uploaded through the CMS admin.
List contact form submissions received from website visitors. Returns id, name, email, phone, subject, message body, isRead flag, and timestamps. Messages are sorted newest first. Use to monitor incoming inquiries.
List news/announcement items for the current tenant. Returns id, name, url, published status, and timestamps. News items are time-based content like announcements, updates, or press releases.
Mark a contact message as read or unread. Defaults to marking as read. Use to track which messages have been reviewed by an admin.
Update an existing article. Only send fields to change — omitted fields keep their current values. Use to publish drafts, update content, or reassign categories.
Update a category's title, description, or parent. Moving a category (changing parentId) restructures the tree.
Update a news item. Only send fields to change. Use to publish/unpublish (published flag) or update content.
Destructive tools (delete_*) lack confirmation or dry-run support. Three destructive tools (nksweb_delete_article, nksweb_delete_category, nksweb_delete_file, nksweb_delete_message, nksweb_delete_news) irreversibly remove data. Descriptions note 'Cannot be undone' but provide no mechanism for the agent to confirm intent or preview impact before execution. An agent miscalculation could wipe content.
Pagination limit constraints not enforced or validated in descriptions. Tools like nksweb_list_articles accept 'limit' with description '(default: 50)' but no explicit validation that limit must be 1-100 is stated. If an LLM passes limit=10000, the tool silently caps or errors without guidance. Descriptions should state min/max bounds explicitly.
Parameter descriptions for some delete operations are minimal. nksweb_delete_file description states 'Permanently delete a file and its physical storage. This removes the file from disk, any pages or articles referencing it will have broken links. Cannot be undone.', good side-effect warning. But nksweb_delete_article simply says 'Permanently delete an article. Soft-deleted, won't appear in listings but exists in database.' The distinction (soft-delete vs hard-delete) is important but not explained clearly enough for safe use.
nksweb_mark_message_read has a boolean 'read' parameter with description 'true = mark as read (default), false = mark as unread', the default is embedded in the description rather than declared in the schema. This is non-standard and may not be parsed correctly by all MCP clients. The description length (85 chars) is acceptable but the design is unclear.