A Model Context Protocol server for a bulletin board system (BBS) that exposes CRUD operations for topics, threads, and messages as MCP tools
The BBS MCP server has 9 well-intentioned tools for forum/BBS operations, but suffers from significant quality gaps. Tool naming is good (all verb-first: list_, create_, archive_, post_, edit_), but parameter descriptions are missing entirely from the JSON schemas, the schema shows only type/required but zero description text for any parameter. This violates the baseline (100% of A+ tools have param descriptions). Output schemas are not documented anywhere in the source provided. Error handling returns plain text messages with basic validation but no recovery guidance or error classification. The tool descriptions themselves are minimal (10-30 chars on average) and lack WHEN/WHY context that LLMs need for tool selection. No batch operations, no pagination guidance, no confirmation patterns for destructive writes (archive_topic, edit_message, post_message). Composition is sound, each tool has one responsibility and naming is consistent, but the parameter interface is opaque to LLMs because there are zero descriptions for arguments like 'topic', 'thread', 'content', etc. This forces LLMs to guess at what values are valid.
Archive or unarchive a topic
Create a new thread with initial message
Create a new topic
Edit an existing message
List messages in a thread
List threads in a topic
List all topics on the board
Post a message to a thread
All 9 tools lack parameter descriptions in their JSON schemas. Parameters like 'topic', 'thread', 'content', 'message_id', 'agent_name', 'archived', 'include_archived', 'sticky', 'subject', 'message' have zero description text. This violates the baseline that 100% of A+ tools have parameter descriptions and forces LLMs to guess at semantics and valid ranges.
Tool descriptions are extremely brief (10-40 characters) and lack context for LLM selection. E.g., 'List all topics on the board' and 'Create a new topic' do not explain WHEN to call this vs. related tools, what the prerequisites are, or what structure is returned. LLMs need 50-200 char descriptions with explicit guidance.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 45 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Pin or unpin a thread
No output schema documentation. The handleListTopics, handleListThreads, handleListMessages handlers return JSON-marshaled results, but there is no schema telling LLMs what fields to expect (e.g., does a topic object have 'id', 'name', 'description', 'archived', 'created_at'?). This forces LLMs to assume or guess at response structure.
Destructive/write operations (archive_topic, create_topic, post_message, edit_message) lack confirmation or dry-run patterns. An agent can accidentally mass-archive topics or spam a thread with no confirmation step. No confirm-before-execute pattern is implemented.
Error messages are plain text with no recovery guidance or error classification. E.g., handleListTopics returns 'invalid arguments: <error>' or 'failed to marshal response: <error>', no hint to the LLM about whether to retry, what valid arguments are, or what to try next. Violates error-classification and recovery-guide patterns.
No pagination support in list_topics, list_threads, or list_messages. If the BBS has hundreds of topics or threads, returning all of them will blow the context window. Baseline pattern requires limit/offset and a total count or next_cursor.
The 'agent_name' parameter in create_topic, create_thread, and post_message is optional and undescribed. It is unclear whether this is for audit/attribution, how it is validated, or what happens if omitted. Parameter relationship to identity tracking is undocumented.
The 'topic' and 'thread' parameters accept strings but no guidance on format: are they UUIDs, slug names, or numeric IDs? The internal code calls ResolveTopic(), implying flexible lookup, but this is not documented in the schema. LLMs will not know whether to pass 'general' or '550e8400-e29b-41d4-a716-446655440000'.