Semantic code-search + knowledge store MCP server over indexed codebases. Provides hybrid search, call graph analysis, import graph traversal, and persistent knowledge notes/glossary.
gogol demonstrates strong naming conventions (verb-first: query, explore, calls, affected, get, list, add_note, add_term, set_scope) and comprehensive parameter descriptions. All 9 tools have clear, detailed descriptions (100-300 chars) explaining WHAT, WHEN, and HOW. Input schemas are fully visible with typed parameters and descriptions. However, output schemas are NOT documented, the code shows tool registration but no return type specifications. Error handling guidance is absent; tools do not indicate what failures look like or how to recover. The 'result' parameter in get() and explore() relies on implicit session state (result cursor caching), which is undocumented. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear read/write semantics. add_note and add_term are marked WRITE but lack confirmation/dry-run patterns for safety.
Store a memory note in an index's knowledge store (embedded so it's searchable). Use to persist a durable finding, decision, or gotcha so it isn't lost. Works on any index regardless of its read/write mode.
Add a glossary term (term -> expansion) to an index. Expansions enrich both indexing and query, so abbreviations resolve to their concept. Works on any index regardless of mode.
Find the blast radius of a change: all files that transitively depend on the given files via the import graph. Use `filter` to narrow to e.g. test files; `depth` bounds the traversal.
AST-extracted call graph for a function — trace execution flow across files without reading them. Shows callers above and callees below; `depth` walks a recursive tree, `direction` restricts to one side.
One-call deep dive on a TOP-LEVEL function or type you can name: source snippet, file imports, callers, callees (project-only), and related symbols in a single ~2KB result. Replaces a query + get + calls sequence. For a doc/markdown entry it shows the reference graph instead. Matches top-level symbols by name — for a method, local, or concept, use `query` first, then explore/get the result. Use when you know the name.
Output schemas not documented. Tool registry shows input schemas but no return type specifications. LLMs cannot plan downstream calls or extract required fields (e.g., does query() return file paths, line numbers, both?). This violates pattern:tool and pattern:response-shaper.
No error handling guidance. Tools do not document failure modes, recovery steps, or error categories (retryable vs. fatal). A query that finds nothing, a file that doesn't exist, or a permission denial all lack actionable error messages. Violates pattern:recovery-guide and pattern:error-classification.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Retrieve an entry's content by exact location. Use after query/list finds the right entry. A doc path may carry a `:line` suffix; `lines` limits how many lines are returned. Alternatively pass `result` (a 0-based index into the last query/calls/explore result set) to retrieve a hit without re-specifying type/index/path.
With an `index`: enumerate its entries (optionally filtered by type) — use to see what docs/notes/terms exist before querying. With NO index: returns an overview of all available indexes and their entry counts (a good first call to discover what's indexed).
Semantic + keyword hybrid search. Find code by concept or meaning when you don't know the exact string. Returns ranked entries (leading type token + location) that are copy-pasteable into `get`/`explore`. If a query finds the right location, retrieve it — don't re-query with different terms (two queries max, then switch strategy).
OPTIONAL convenience: set a session default index/type so you can omit `index` on later calls. Only worth it for a long run against ONE index — otherwise just pass `index` inline (one field, no extra call). Omitted fields are left unchanged; returns the current scope.
Session state (result cursor) is implicit and undocumented. The 'result' parameter in get() and explore() relies on caching the last query/calls/explore result set, but this stateful behavior is not declared in the tool description or schema. Agents cannot know if result indices persist across tool calls or reset. Violates stateless request handling (current MCP spec).
No tool annotations. add_note and add_term are marked WRITE (destructive) but lack readOnlyHint/destructiveHint/idempotentHint annotations. Agents cannot distinguish safe (read-only) tools from risky ones without parsing descriptions. Violates current MCP spec (tool annotations are standard since 2025-Q2).
No confirmation/dry-run for destructive operations. add_note and add_term modify persistent state but lack a confirmation step or dry-run mode. An agent error could corrupt the knowledge store. Violates pattern:confirmation-request.