Static source inference · medium confidence · detected: Logging
Deprecated protocol patterns detected
Summary
The server has 17 tools with consistent naming, explicit ToolAnnotations for risk classification, and structured output via _data(). However, descriptions are uniformly terse (10 - 30 characters), parameter descriptions are minimal or missing in most cases, and output schemas are documented only implicitly through json serialization. Error handling is absent, tools do not guide recovery or categorize failures. The implementation uses proper tool registration with @mcp.tool decorators and includes READ_ONLY/WRITE/DESTRUCTIVE annotations, which is good, but the LLM-facing definitions lack depth needed for reliable agent selection and error correction.
Tool descriptions are uniformly terse (10 - 35 characters), far below the 50 - 200 character LLM-optimized baseline. Descriptions like 'Get database statistics' and 'Get current settings for an index' lack context for when to call vs. similar tools, any prerequisites, and what structure is returned.
Parameter descriptions are missing or trivial. For example, 'update-settings' has a 'settings' parameter with description 'Settings to update', it does not explain what fields are valid, constraints, or expected structure. 'get-documents' offset/limit lack any mention of bounds or defaults.
Expand all tool descriptions to 50 - 150 characters. Include WHAT the tool does, WHEN to use it (vs. similar tools), and key prerequisites. Example: 'Create a new searchable index. Specify uid (unique identifier) and optionally primaryKey (field for document deduplication). Use this before adding documents. Returns uid, primaryKey, createdAt.'
Add detailed descriptions to every parameter. For numeric fields (offset, limit), state bounds: 'offset: pagination starting position, 0-based (default 0)' and 'limit: max results per call, 1-100 (default 20)'. For object fields (documents, settings), document structure: 'documents: array of objects; each must have a document ID matching primaryKey field or a default id field.' For enums (filter operators, sort direction), list valid options.
Wrap all tool implementations in try-catch blocks. Map exceptions to categorized errors: retryable (network timeout, rate limit), user-fixable (invalid index UID, duplicate key), or fatal (permission denied, malformed settings). Example: 'Index UID already exists. Available UIDs: products-v1, products-v2. Try a different UID or delete an old index first.'
Document output schemas for each tool. Example for 'get-version': 'Returns {version: string (semantic version), features: [string] (enabled features)}.' For paginated tools, return total count: 'Returns {documents: [...], total: number, hasMore: boolean}.'
Add pagination metadata to list/search tools. Return total item count and a next_cursor or has_more flag. Update descriptions to state result limits: 'Returns up to 20 indexes. Use offset to paginate.'
Spec posture evidence
Inferred effective spec: 2025-06-18+.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Score history
Overall score trend
↑ 17 points across a rubric change (v1 → v2)
60/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
C
60
2025-06-18+
v2
2026-03-09
F
43
-
v1
read onlyauthsource verified63/100
Get current settings for an index
get-statsread onlyauthsource verified62/100
Get database statistics
get-taskread onlyauthsource verified63/100
Get information about a specific task
get-tasksread onlyauthsource verified65/100
Get list of tasks with optional filters
get-versionread onlyauthsource verified63/100
Get Meilisearch version information
health-checkread onlyauthsource verified70/100
Check Meilisearch server health
list-indexesread onlyauthsource verified63/100
List all Meilisearch indexes
searchread onlyauthsource verified68/100
Search through Meilisearch indices. If indexUid is not provided, it will search across all indices.
No error handling or recovery guidance. Tools do not categorize failures as retryable, user-fixable, or fatal. If 'create-index' fails due to a duplicate UID, the tool does not tell the agent to try list-indexes or choose a different UID. Raw exceptions are not caught or translated into actionable messages.
Output schemas are implicit (relying on json_serializer and json.dumps). The _data() function flattens Meilisearch model objects, but the server does not document what fields to expect in responses. An LLM cannot plan downstream tool calls without knowing if 'create-index' returns uid, primaryKey, createdAt, etc.
Pagination support is incomplete. 'get-documents' and 'get-tasks' accept offset/limit but do not return a total count or next_cursor. The agent cannot know if there are more results or construct efficient pagination loops.
Destructive operations (delete-index, delete-tasks) lack confirmation or dry-run support. An agent in a retry loop could accidentally delete multiple indexes or tasks. No tool requires or warns of irreversible consequences.
'add-documents' and 'update-settings' accept free-form 'documents' and 'settings' objects with no schema, constraints, or examples. The parameter descriptions do not explain valid fields, required keys, or data types.
'search' filter parameter accepts a string with no description of syntax or allowed operators. LLMs cannot construct valid filter expressions without documentation.
search
Add dry-run support to destructive tools. Example: 'delete-index' could accept dry_run=true parameter. If true, return what would be deleted without actually deleting. Require confirmation=true for non-dry-run deletes.
Define schemas for complex object parameters. For 'add-documents' and 'update-settings', provide examples or JSON Schema constraints. Example: 'documents: [{id: string, title: string, body: string}, ...]. Each object must include id field (matches primaryKey or defaults to "id").' For 'search' filter, link to Meilisearch filter syntax documentation or provide common examples: 'status = "active", price > 100, tags IN ["new", "featured"]'.
Add toolAnnotations.idempotentHint=true to read-only and discovery tools (get-*, list-*, search, health-check) to signal they are safe to retry without side effects.
Validate inputs early and return structured error messages. Example: if 'create-index' receives uid with invalid characters, return '{error: "invalid_uid", message: "Index UID must be 1-32 alphanumeric characters or dashes. Got: \'my@index\'. Try \'my-index\'."}' instead of a raw exception.
Consider splitting compound operations. 'add-documents' implies the index exists; if it does not, the tool fails silently. Provide a flag like 'create_if_missing=false' with clear guidance on when to use it, or require the agent to call 'create-index' first.