Semantic + structural code intelligence for AI agents, as a local MCP server: find code by meaning, jump to definitions, see who-calls-what, with auto-fresh indexing and notes anchored to symbols. Offline-capable, no API key.
semkeep demonstrates solid tool design with 16 well-named, verb-led tools covering semantic search, code navigation, and operational memory. All tools have descriptions (avg 120 chars) and input schemas with typed parameters. However, output schemas are not documented in the source, parameter descriptions lack depth (many under 50 chars), and error handling guidance is minimal. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Naming is strong (search, define, callers, remember, mark) but some tools like 'greenlight_run' and 'greenlight_lint' could be clearer about their purpose.
Find call/usage sites of a symbol (identifier-aware heuristic from call sites, import-ranked).
Find where a symbol is defined: file:line, kind, and signature.
Delete a stored note by id.
Statically analyze a greenlight spec for shallow gates (checks that would pass without proving anything). Runs nothing.
Run a definition-of-done gate: execute a JSON spec's checks and assert their results. Returns GREEN only if all required checks pass. Provide an inline `spec` or a `spec_path`.
Show what a file imports (out) and/or which files import it (in).
Index a directory or file for semantic search. Skips unchanged files unless force is set.
Output schemas not documented. Tools return free-text strings (e.g., search returns formatted snippet blocks, define returns file:line text). LLMs cannot parse structured results or chain downstream calls without knowing field names and types.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications. Tools like 'forget', 'unmark', 'mark' are destructive/write operations but lack annotations to guide agent planning.
Parameter descriptions are sparse. Many params lack format/constraint guidance (e.g., 'path' in index_path doesn't specify absolute vs relative; 'k' in search has no min/max bounds; 'mode' enum values not explained).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Record a typed, per-project operational marker: a verified recipe (command+exitCode), a gotcha, a dead-end, or a note. Upserts by (kind, title). Recipes with exitCode 0 are stamped verified.
Recall this project's operational markers (recipes/gotchas/dead-ends/notes), grouped and STALE-flagged. Filter by kind or a substring query.
List the symbols (functions/classes/methods/types) defined in a file or directory, with line ranges.
Semantic search over your stored notes.
Force the index to re-scan its roots now: index new/changed files, prune deleted.
Store a durable working note. Optionally anchor it to a symbol/file so it surfaces in define/outline. Semantic dedup avoids near-duplicates.
Semantic search over indexed code & docs. Returns ranked file:line results. Use when you don't know the exact identifier; scope with pathPrefix/ext.
Show index stats, the active embedding backend, and the usage protocol.
Delete an operational marker by id.
Error handling lacks recovery guidance. Tools return success/failure strings but do not guide LLM on next steps (e.g., 'No matches' in search doesn't suggest widening query or checking index status).
greenlight_run and greenlight_lint tool names are domain-specific jargon. LLMs may not infer that these are 'run_verification_gate' and 'lint_verification_spec' equivalents. Consider renaming to 'run_gate' or 'verify_spec_run'.