A production-grade MCP server for enterprise agents with multi-tenant support, governance, reliability, and observability built-in.
Atlas-MCP demonstrates solid foundational quality with consistent naming patterns, readable descriptions, and explicit schemas across all six tools. All tools follow verb_noun naming conventions (build_context, semantic_search, hybrid_search, query, search, search). Descriptions are present and reasonably detailed (ranging 56-112 chars), explaining what each tool does and when to use it. Input schemas are visible with typed parameters and descriptions. However, there are notable gaps: (1) output schemas are not documented, LLMs cannot know what fields to expect from search results, database queries, or vector operations; (2) no pagination guidance despite tools accepting top_k parameters that could return large result sets; (3) missing error guidance, no indication of retryability, user-fixable vs fatal errors, or recovery paths; (4) no security annotations (readOnlyHint present in manifest but not mapped to tool definitions); (5) parameter constraints are mentioned in descriptions but not enforced as enum/pattern in schemas (e.g., top_k 'max 20' stated in description but not in schema type definition). The codebase shows production-grade infrastructure (circuit breakers, rate limiting, audit logging, OpenTelemetry tracing) but tool definitions themselves lack the completeness expected for A-grade quality. Strengths: all tools are READ_ONLY with clear risk classification, parameters are well-named with type suffixes (customer_id, collection name), descriptions avoid example values. Weaknesses: output structure undocumented, error handling opaque, result limits mentioned but not schema-enforced.
A single fan-out workflow tool that builds customer context
Atomic Elasticsearch search tool
Hybrid search combining semantic and keyword search
Atomic PostgreSQL query tool for direct database access
Semantic search for open-ended documentation lookups
Vector/semantic search tool for finding similar embeddings
Output schemas are not documented. LLMs cannot know what fields search_result, query_result, or vector_match objects contain, forcing them to guess at downstream field names and risking broken tool chains.
Parameter constraints stated only in descriptions ('max 20'), not in JSON Schema. Schema has no maxLength, maximum, enum, or pattern for top_k. LLMs cannot programmatically validate constraints and may pass invalid values (e.g., top_k=1000).
No error handling guidance. Descriptions do not indicate which errors are retryable (e.g., network timeout) vs user-fixable (e.g., invalid collection name) vs fatal. Agents cannot distinguish whether to retry, ask the user, or give up.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
postgres.query tool exposes raw SQL parameter. While description claims 'SELECT only', SQL injection risk remains if LLM is tricked into passing a crafted payload (e.g., 'SELECT * FROM users; DROP TABLE users;--'). Should validate SQL syntax server-side or use prepared statement templates.
No pagination or result-limiting guidance in tool descriptions. Tools accept top_k parameters but do not state: (1) what happens if top_k exceeds limits, (2) whether results are sorted (e.g., by relevance score), (3) whether next_cursor or pagination tokens are supported. Large result sets risk context window exhaustion.
Tool descriptions lack dependency hints and discovery guidance. E.g., customer.build_context does not explain: What fields are returned? What is 'context', a document, a user profile, transaction history? When should this be called before other tools?
elasticsearch.search accepts a generic 'query' parameter of type object with description 'Elasticsearch query DSL'. This is opaque to LLMs, they cannot construct valid Elasticsearch DSL queries without examples or a schema. Should either: (1) constrain to common query patterns (term, match, range) with documented fields, or (2) offer higher-level parameters (search_term, filters, date_range) that the tool translates to DSL internally.