GrooveSeek

Semantic search over a Markdown knowledge base, served over MCP.

View the Project on GitHub alphabet-h/grooveseek

7. Rename the project to GrooveSeek, and let the command be groove

Context and Problem Statement

The project shipped twenty-five 0.x releases as kb-mcp. Two problems with that name only became blocking once a 1.0 was on the table.

The name is taken by a project that does the same thing. github.com/moikas-code/kb-mcp describes itself as a “cli tool and mcp server to help ai manage a knowledge base of your code projects”. Same category, same name. A user searching for either lands on both.

The name binds the product to a protocol. MCP is one of two ways this server is read. The other is a browser: a person opening /ui to search their own notes. -mcp names the machine-facing half and is silent about the human-facing half — and if MCP is displaced, the name outlives the thing it names.

Neither problem is new. What changed is that the name is about to become permanent. It is not only a label; it is written into the user’s filesystem:

.kb-mcp.db                   the index
kb-mcp.toml                  the config
.kb-mcpignore                the exclusion file
.kb-mcp-eval-history.json    the eval history
KB_MCP_CONFIG_HOME           the config-home override
<config_dir>/kb-mcp/<service>/   the service config home

Renaming after 1.0 means every existing install stops finding its own database, config, and registered service. Supporting both names would mean carrying a “look for the old name too” layer for the lifetime of the 1.x series. While the project is 0.x and explicitly beta, that layer is not needed at all. The window is now or never, and it closes at 1.0.0.

Decision Drivers

Considered Options

Around ninety candidates were probed against crates.io, npm and GitHub search. A probe that returned anything other than a clean 200 or 404 was recorded as UNKNOWN rather than guessed, so a failed request could not read as “available”.

Decision Outcome

The project is GrooveSeek. The crate is grooveseek; the command and every on-disk identifier is groove.

crate      grooveseek          crates.io + npm free, GitHub clear
command    groove              no standard command by that name
files      .groove.db  groove.toml  .grooveignore  .groove-eval-history.json
env        GROOVE_CONFIG_HOME  GROOVE_TRAY_LOG  GROOVE_BIN
satellites groove-svc  groove-tray   (crate name = binary name; neither is published)

The product name and the identifier are deliberately different. This follows the same shape as the ripgrep crate installing a command called rg. It buys two things: .grooveignore can be read at a glance where .grooveseekignore cannot, and if the product name ever changes again, nothing on a user’s disk has to move — the second rename would be free in exactly the way this one is not.

The MCP server keeps identifying itself as grooveseek, from CARGO_PKG_NAME. serverInfo.name is a product identifier reported to clients, not a path or something a user types, so it follows the product rather than the command.

Consequences