A modern blog CMS built with Next.js, Supabase, and TailwindCSS
This server exposes 33 tools with significant quality gaps. Most tools have basic descriptions (10-50 chars) that lack actionable context for LLM selection. Input schemas are present but minimal, many parameters lack type constraints, enums, or validation guidance. No output schemas are documented. Critical security issue: tools accept 'apiKey' as a parameter (tools 17-20), violating secret-injection pattern. Tool naming is inconsistent (publishPost vs getBooks vs can). Error handling is absent, no recovery guidance or categorization. Composition issues: tools like sendMessage and generateBlogPost duplicate LLM interaction logic. No pagination support on list tools (getBooks, getChats, getMessages). Per-tool average: 38/100.
Adds a new message to a chat
Checks if a role has a specific permission
Checks if a role has all specified permissions
Checks if a role has any of the specified permissions
Creates a new API key for a user
Creates a new AI book record with extracted PDF text
Creates a new AI chat session for a book
Permanently deletes an API key
API keys exposed as tool parameters (tools 17-20: sendMessage, generateChatTitle, generateBlogPost, generateBlogPostHeadless all accept 'apiKey' parameter). Violates secret-injection pattern, credentials in params leak into logs and LLM context.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields. Example: getBooks returns unknown structure, agent cannot know if it includes book_id for deleteBook.
Descriptions are too brief (10-40 chars) and lack actionable context. Example: 'Retrieves all books for a specific user' (40 chars) does not explain when to call vs getBookById, what fields are returned, or pagination behavior.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 31 | 2026-07-28+ | v2 |
Deletes a book and all its associated chats via cascade
Deletes a chat and all its associated messages
Deletes a blog post by ID
Extracts text content from a PDF file buffer
Generates a complete blog post from chat messages and extracted book text
Generates a blog post from topic and context without chat history
Generates a title for a chat based on the first user message
Generates a unique URL slug for a post title
Retrieves a specific book by ID
Retrieves all books for a specific user
Retrieves a specific chat by ID
Retrieves recent chats for a user, ordered by last_message_at descending
Retrieves and decrypts an LLM API key for the current user
Retrieves and decrypts an LLM API key for a specific user
Retrieves all messages for a specific chat
Hashes an API key for rate limiting purposes
Lists all API keys for a user
Publishes a blog post by ID
Resolves a category name to its ID, creating it if needed
Resolves tag names to their IDs, creating new tags if needed
Revokes an API key by marking it as revoked
Sends a message to an LLM provider and streams the response
Unpublishes a blog post by ID
Updates the last_message_at timestamp for a chat
Updates the title of a chat
No error handling or recovery guidance. Tools provide no indication of retryable vs fatal errors, missing resource alternatives, or actionable error messages. Example: deletePost fails silently with no guidance.
List tools (getBooks, getChats, getMessages) lack pagination parameters (limit, offset, cursor). Returning unbounded results risks context window exhaustion and token waste.