A Rails-based MCP server for knowledge graph operations, entity management, graph traversal, maintenance reviews, and telemetry dashboards
GraphMem MCP server demonstrates above-average definition quality with comprehensive descriptions, explicit input schemas, and clear error handling patterns. All 6 tools have detailed descriptions (range 150-400 chars, well above 10-char minimum). Input schemas are properly defined with typed parameters. However, output schemas are not documented in the tool definitions, parameter descriptions lack detailed constraints (min/max, formats, enums), and some tools have ambiguous scope boundaries that could lead to incorrect LLM selection. The server excels at documenting prerequisites and 'do not use for' anti-patterns, which is excellent for preventing misuse. Risk classifications (DESTRUCTIVE, WRITE, REVERSIBLE) are helpfully explicit but not part of MCP schema. Fast-MCP framework provides HTTP transport with proper JSON-RPC 2.0 structure.
Apply a queued maintenance-review row (merge, relationship proposal, orphan parent, or relation integrity). Pass required `item_id` (string UUID); optional `report_type` (string, default compaction_review), `dry_run` (bool, default false), `action_params` (hash). Do not use without a queue item_id; use `list_maintenance_review` first. Do not use to skip, ignore, or restore without applying; use `dismiss_maintenance_review` instead. Do not use to merge two known entity ids outside the queue; use `graph_delete` instead.
Atomically batch-create entities, observations, and relations (max 50 operations; rolls back on error). Pass optional `entities`, `observations`, `relations` arrays, or `operations` (type-discriminated items with type create_entity, create_observation, or create_relation). At least one operation is required. Create-only. Do not use for a single create; use `graph_write`, `graph_write`, or `graph_write` instead. Do not use to update, delete, or merge; use `graph_edit`, `graph_edit`, `graph_delete`, `graph_delete`, `graph_delete`, or `graph_delete` instead.
Remove this MCP client's active project context so searches are unscoped across all projects; does not delete entities. Takes no arguments. Do not use to inspect the current scope; use `get_context` instead. Do not use to switch to a project; use `set_context` instead. Do not use to delete a project or other entity; use `graph_delete` instead.
Create a single new entity node. Pass required `name` (string) and `entity_type` (string); optional `observations` (array of strings), `aliases` (pipe-separated string), `description` (string). Alias `entityType` maps to `entity_type`. Types are canonicalized; cosine distance < 0.25 returns a warning instead of creating. Do not use until you have searched for an existing node; use `search` first. Do not use to add facts to a known entity; use `graph_write` instead. Do not use to change metadata on an existing node; use `graph_edit` instead. Do not use for an atomic batch of up to 50 creates; use `graph_write` instead.
Output schemas not documented. Tool descriptions lack return type specifications. LLMs cannot plan downstream tool chains when response structure is unknown. E.g., does create_entity return just the ID, or full entity object with metadata?
bulk_update tool name suggests 'atomic batch operations' but description is verbose and confusing, mixes three different operation types (create_entity, create_observation, create_relation) under one tool. The phrase 'Do not use for a single create; use graph_write, graph_write, or graph_write instead' repeats the same tool name three times, indicating unclear composition. This tool may be doing too much.
Parameter 'action_params' in apply_maintenance_review is typed as generic 'object' with no schema, format, or example structure documented. LLMs cannot infer what keys/values are valid. Should have a detailed description or explicit object schema with typed sub-fields.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 68 | 2025-06-18+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
Add a new fact to an existing entity and generate an embedding. Pass required `entity_id` (integer; also accepts entity name) and `text_content` (string); optional `confidence` (float 0-1), `source` (string), `valid_from` (ISO 8601 string), `valid_until` (ISO 8601 string), `tags` (array of strings). Aliases `content`/`contents` map to `text_content`. Do not use to edit or supersede an existing observation; use `graph_edit` instead. Do not use to mark a fact obsolete; use `graph_delete` instead. Do not use to create a new node; use `graph_write` instead. Do not use for a batch of up to 50 creates; use `graph_write` instead.
Add one directed edge between two existing entities. Pass required `from_entity_id` (integer or name; aliases `from_entity`, `from`), `to_entity_id` (integer or name; aliases `to_entity`, `to`), and `relation_type` (string, canonicalized); optional `weight` (float >=0), `confidence` (float 0-1), `properties` (hash). Do not use to create nodes; use `graph_write` instead. Do not use to batch-create relations; use `graph_write` instead. Do not use to query existing 1-hop edges; use `traverse_graph` instead. Do not use for a multi-hop neighborhood; use `traverse_graph` instead. Do not use to remove an edge; use `graph_delete` instead.
create_entity parameter 'entity_type' lacks enum constraint. Description says 'Types are canonicalized; cosine distance < 0.25 returns a warning' but doesn't specify which entity types are valid or what 'canonicalization' means. LLMs will hallucinate arbitrary type names.
No pagination parameters documented in tools that may return large result sets (e.g., list_maintenance_review referenced in apply_maintenance_review description). If list_maintenance_review exists but is not shown, or if other list/search tools are missing, agent cannot handle unbounded results.
ToolError class defines detailed error envelopes (category, retriable, next_move, message, tool) but tool definitions do not indicate which tools may encounter which error categories. Agents rely on tool descriptions to know what errors are possible and how to recover. Missing error declarations.
dry_run parameter in apply_maintenance_review is not clearly documented in all related tools. If dry_run is a general pattern, it should be present in bulk_update and other write tools to support confirmation workflows.
create_observation accepts 'entity_id' as integer but description says 'also accepts entity name'. Parameter schema shows only integer type, union types or overloaded param handling not visible. This flexibility is good (matches natural-identifiers pattern) but schema doesn't reflect it.