Local-first knowledge base for LLM conversations — import, search, and manage Claude/ChatGPT/Gemini chats as Markdown files
AnticLaw demonstrates solid definition quality with reasonable descriptions and input schemas across 12 tools. Strengths: all tools have descriptions and documented parameters; parameter types are present; risk classifications are clear. Weaknesses: descriptions are uneven in clarity and actionability; output schemas are not explicitly documented for any tool; some parameter descriptions lack actionable constraints (enums, ranges, formats); error handling guidance is minimal; no tool annotations (readOnlyHint, destructiveHint). The aw_remember tool has a particularly strong description with explicit guidance about when to call it. However, tools like aw_ping, aw_graph_stats, and aw_projects have generic descriptions that don't explain WHEN or WHY an LLM should use them vs alternatives. Naming is consistently strong (verb_noun pattern: get, load, inspect, chunk, search, list) and avoids generic terms.
Split a stored context into numbered chunks for incremental reading. Strategies: - auto: Detect best strategy (headings > paragraphs > lines) - lines: N lines per chunk (chunk_size = number of lines) - paragraphs: N paragraphs per chunk - headings: Split on markdown heading level
Remove an insight by ID. Use with caution — this cannot be undone.
Read stored context content, or a specific line range. Lines are 1-indexed. Omit start_line and end_line to read the full content. Example: start_line=10, end_line=20 reads lines 10 through 20.
Get global statistics about the knowledge graph. Returns total node and edge counts, graph density, and breakdown by type.
Show metadata and preview of a stored context without loading full content. Returns: name, type, size, line count, token estimate, chunk info, and first 5 lines.
Store large content as a named variable on disk. The content is saved and only metadata is returned (name, size, token count). Use aw_get_context to read the content later, or aw_chunk_context to split it. Useful for storing large files, logs, or code that would consume too much context window.
Output schemas not documented. No tool specifies what fields are returned or their types. LLMs cannot plan downstream tool calls without knowing the response structure. Examples: aw_recall returns 'insights' but structure is not defined; aw_search returns 'ranked results' but field names are vague.
Parameter descriptions lack actionable constraints. aw_recall accepts 'category' and 'importance' but the description lists options (decision/finding/preference/fact/question) as prose instead of enums. Constraint format should be: 'One of: decision, finding, preference, fact, question' or use JSON Schema enum. LLMs may hallucinate unlisted values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Health check. Returns server status, project count, chat count, insight count.
List all projects with metadata: id, name, description, chat count, last activity.
Retrieve insights from the knowledge base. Filters by keyword query, project, category (decision/finding/preference/fact/question), and importance (low/medium/high/critical).
Find related insights and chats using the knowledge graph. Given a node ID (chat or insight), traverse the graph to find semantically or explicitly linked content. Returns the queried node plus all related nodes within specified edge_type and depth.
Save an insight or decision to the knowledge base. You MUST call this tool before ending any session where you made decisions, discovered important information, or learned something that should be preserved for future sessions. Failing to do so means losing valuable context. Categories: decision, finding, preference, fact, question. Importance: low, medium, high, critical.
Search across all chats in the knowledge base. Uses full-text search across titles, summaries, message content, and tags. Returns ranked results with text snippets highlighting matches. Use --exact for phrase matching, --project to scope to a project.
Generic descriptions fail to explain WHEN to use each tool. aw_ping description says 'Health check' but does not explain when an LLM should call it instead of assuming the server is healthy. aw_graph_stats is described as 'Get global statistics' but provides no context for when this insight is useful. aw_projects lists metadata but does not explain why an LLM would need projects vs searching directly.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). aw_forget is DESTRUCTIVE and irreversible but lacks a destructiveHint annotation. aw_remember and aw_forget both modify state but the tool definitions do not use protocol-level hints to signal this to the client.
Error handling is not documented. No tool description includes recovery guidance (e.g. 'If search returns no results, try aw_recall with fewer filters' or 'If aw_get_context fails with out-of-bounds lines, call aw_inspect_context first to see available lines'). Agents have no guidance on what to do if a tool call fails.
Parameter descriptions for line-based operations lack format clarity. aw_get_context says 'Starting line number (1-indexed, optional)' but does not specify what happens if start_line > end_line, if start_line is 0 or negative, or what range is valid (1 to max_line). LLMs will guess.
aw_forget has only a description and no explicit confirmation step or dry-run mode documented. It is marked DESTRUCTIVE and irreversible ('cannot be undone') but the tool definition does not show a confirmation pattern to prevent accidental deletion.
Result limits not documented. aw_search specifies max_results=20 (good) but aw_recall, aw_related, and aw_chunk_context do not make clear whether results are unbounded. If aw_related can return thousands of nodes, the LLM may be surprised by large responses that blow context.