Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .mcp.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"mcpServers": {
"rac-guide": {
"lore": {
"command": "rac",
"args": ["mcp", "--root", "."]
}
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Lore

<!-- mcp-name: io.github.tcballard/lore -->

<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tcballard/requirements-as-code/main/rac/assets/images/lore-header-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/tcballard/requirements-as-code/main/rac/assets/images/lore-header-light.png">
Expand Down Expand Up @@ -39,15 +41,15 @@ pip install requirements-as-code
Claude Code (from your repo root):

```bash
claude mcp add rac-guide -- rac mcp
claude mcp add lore -- rac mcp
```

Claude Desktop / Cursor (`mcpServers` in the client config):

```json
{
"mcpServers": {
"rac-guide": { "command": "rac", "args": ["mcp", "--root", "/absolute/path/to/your/repo"] }
"lore": { "command": "rac", "args": ["mcp", "--root", "/absolute/path/to/your/repo"] }
}
}
```
Expand Down
8 changes: 4 additions & 4 deletions docs/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ path you would pass to `rac validate`.
**Command form** (adds the server to your Claude Code session):

```bash
claude mcp add rac-guide -- rac mcp --root /path/to/your/repo
claude mcp add lore -- rac mcp --root /path/to/your/repo
```

**`.mcp.json` form** — create or edit `.mcp.json` in your project root:

```json
{
"mcpServers": {
"rac-guide": {
"lore": {
"command": "rac",
"args": ["mcp", "--root", "/path/to/your/repo"]
}
Expand All @@ -51,7 +51,7 @@ Open `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/
```json
{
"mcpServers": {
"rac-guide": {
"lore": {
"command": "rac",
"args": ["mcp", "--root", "/path/to/your/repo"]
}
Expand All @@ -70,7 +70,7 @@ Create or edit `.cursor/mcp.json` in your project root:
```json
{
"mcpServers": {
"rac-guide": {
"lore": {
"command": "rac",
"args": ["mcp", "--root", "/path/to/your/repo"]
}
Expand Down
16 changes: 8 additions & 8 deletions examples/guide/demo.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,13 @@ obvious thing, not a trap.
If you have previously added it, remove it for this run:

```bash
claude mcp remove rac-guide
claude mcp remove lore
```

Confirm it is gone:

```bash
claude mcp list # rac-guide must not appear
claude mcp list # lore must not appear
```

**Run.** From `examples/guide/task/`, start Claude Code and paste the task
Expand Down Expand Up @@ -91,15 +91,15 @@ changes to the demo corpus.
**Command form:**

```bash
claude mcp add rac-guide -- rac mcp --root /absolute/path/to/examples/guide
claude mcp add lore -- rac mcp --root /absolute/path/to/examples/guide
```

**`.mcp.json` form** (in the project root):

```json
{
"mcpServers": {
"rac-guide": {
"lore": {
"command": "rac",
"args": ["mcp", "--root", "/absolute/path/to/examples/guide"]
}
Expand All @@ -110,17 +110,17 @@ claude mcp add rac-guide -- rac mcp --root /absolute/path/to/examples/guide
Confirm the server is connected before Run 2:

```bash
claude mcp list # rac-guide must appear
claude mcp list # lore must appear
```

In a Claude Code session, `/mcp` should list `rac-guide` with its four tools:
In a Claude Code session, `/mcp` should list `lore` with its four tools:
`get_summary`, `search_artifacts`, `get_artifact`, `get_related`.

---

## Run 2 — grounded (RAC Guide connected)

**Setup.** A fresh Claude Code session with `rac-guide` connected (above),
**Setup.** A fresh Claude Code session with `lore` connected (above),
started from `examples/guide/task/`.

**Run.** Paste the **same** task prompt. Do not change a word; do not mention
Expand Down Expand Up @@ -233,7 +233,7 @@ visible. Shot order per `rac/designs/guide-grounding-demo.md`:
2. **Ungrounded violation (compressed)** — Run 1: the agent produces the hard
`DELETE FROM users`. Trim the agent's thinking; keep the resulting diff
visible.
3. **The config block** — show adding `rac-guide` (the `claude mcp add` line or
3. **The config block** — show adding `lore` (the `claude mcp add` line or
the `.mcp.json` block), then `/mcp` listing the four tools.
4. **Grounded run** — Run 2: show the `search_artifacts` tool call and its
result, and the agent's response **citing `ADR-001` / `GUIDE-KTW9YBDWDBFM`**.
Expand Down
90 changes: 90 additions & 0 deletions rac/decisions/adr-039-lore-server-identity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
---
schema_version: 1
id: RAC-KTY0D0DFTCJA
type: decision
---
# ADR-039: Lore Server Identity

## Status

Accepted

## Category

Product

## Context

ADR-036 named Lore as the product and froze distribution names — the
PyPI package, the `rac` CLI, and the `rac mcp` command — reserving any
rename as a separate decision. It did not name the agent-facing server
identity: the label users type into client configuration, the name the
server reports in the MCP handshake, the namespace agents see on every
tool call, and the identity a registry listing carries.

That surface shipped as `rac-guide`, leaking the internal consumer
codename ("Guide", from ADR-029 through ADR-034) into the product's most
visible seam — the exact ad-hoc naming drift ADR-036 warns against. The
mismatch surfaced concretely when preparing the MCP registry submission:
registering `rac-guide` for a product launched as Lore.

The registry identity is a new surface, not a rename of a shipped one,
and the installed base is days old: the demo is unrecorded, client
configurations unverified, and no registry submission exists. The label
will never be cheaper to settle than now.

## Decision

The agent-facing server identity is `lore`.

- Client configuration label: `claude mcp add lore -- rac mcp`, and
`"lore"` as the `mcpServers` key in every documented config block.
- Server handshake name: the FastMCP server name is `lore`, so client
UIs and tool namespaces show `lore`.
- Registry identity: `io.github.tcballard/lore`, with the matching
`mcp-name` ownership marker in the package README.
- Unchanged, per ADR-036: the `rac mcp` command, the `rac` CLI, the
`requirements-as-code` package, all tool names, descriptions, and
response contracts. "Guide" remains the internal component name in
code, tests, and the corpus.
- `lore-guide` is not used anywhere: it would introduce a third name
when the problem being solved is having two.

## Consequences

### Positive

- One name on every surface an agent or user reads; the registry
listing, config blocks, and brand agree.
- The internal codename stays internal; engine and contract naming stay
stable (ADR-036 holds for everything it froze).

### Negative

- Documentation published with v0.10.3 shows `rac-guide`; anyone who
configured it keeps a working but differently-labelled server until
they re-add it.

### Risks

- Label drift recurs on future surfaces. Mitigated the same way as
ADR-036: this decision is the naming reference for agent-facing
surfaces.

## Alternatives Considered

### lore-guide

Rejected: carries the internal codename into public view and creates a
third name to explain alongside Lore and RAC.

### Keep rac-guide

Rejected: registers and advertises an internal codename for a product
launched as Lore, days before outreach, with nothing depending on the
old label.

## Related Decisions

- ADR-036
- ADR-029
2 changes: 1 addition & 1 deletion rac/prompts/rac-agent-session-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Before coding:

Do not implement until I approve the plan.

Grounding (when the `rac-guide` MCP tools are available in your session):
Grounding (when the `lore` MCP tools are available in your session):
- Call `get_summary` once at session start to learn what recorded
knowledge exists.
- Call `search_artifacts` before designing or implementing; recorded
Expand Down
20 changes: 20 additions & 0 deletions server.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
"name": "io.github.tcballard/lore",
"description": "Serve your repo's recorded product knowledge - requirements, decisions (ADRs), designs, roadmaps - to coding agents. Deterministic, read-only.",
"repository": {
"url": "https://github.com/tcballard/requirements-as-code",
"source": "github"
},
"version": "0.10.4",
"packages": [
{
"registryType": "pypi",
"identifier": "requirements-as-code",
"version": "0.10.4",
"transport": {
"type": "stdio"
}
}
]
}
2 changes: 1 addition & 1 deletion src/rac/mcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
search_index,
)

SERVER_NAME = "rac-guide"
SERVER_NAME = "lore"

# --- Verbatim tool descriptions (pinned by guide-tool-surface; ADR-030) ------
#
Expand Down
Loading