Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

profiles.json

$MEMO_HOME/profiles.json changes ranking constants without rebuilding the binary. It is read at start-up by memo-mcp serve and memo-mcp ui. A missing file is fine. A malformed file stops the process with the path and the JSON error.

Note. In v1.4, the CLI search, explain and eval commands do not read profiles.json. They only see the built-in profiles. Test an override through the UI, which uses the same pipeline as the server, or by running the server.

Shape

The file is a JSON object mapping a profile name to the fields to change. Only fields that are present are applied.

  • An existing name, such as default, is modified in place.
  • A new name creates a profile. It starts from base, or from default when base is absent.
{
  "default": {
    "weights": { "exact": 0.4 }
  },
  "team-docs": {
    "base": "precise",
    "weights": { "semantic": 0.6, "keyword": 0.4 },
    "cutoff_gap": 0.4,
    "recency_kinds": [],
    "derivation": "Docs-heavy KB: favour meaning over wording; no recency."
  }
}

Select it with MEMO_PROFILE=team-docs in the server’s environment.

Fields

FieldTypeMeaningShipped default
basestringProfile to copy for a new namedefault
weightsmap of arm to numberArm weights; arms: semantic, keyword, exact, fact, entity, graph. Merged into the base’s weights; 0 disables an arm0.5 / 0.5 / 0.3 / 0.4 / 0.4 / 0.5
rrf_kintegerRRF damping constant60
fusion"rrf" or "minmax"Rank fusion, or min-max score fusionrrf
fetch_depthintegerCandidates per arm before fusion100
half_life_daysnumberRecency half-life90
recency_floornumber 0–1Fraction of score the oldest item keeps0.8
recency_kindslist of kindsKinds that age; [] turns recency off["note","conversation"]
cutoff_gapnumber 0–1Stop before a drop larger than this fraction0.5
min_resultsintegerNever gap-cut below this many results3
semantic_floornumberDrop semantic-only candidates below this cosine0.30
bands[strong, moderate, weak]Relevance bands for the generic profile; exactly three numbers[0.60, 0.45, 0.30]
derivationstringYour reason, shown by profiles show—

The reranker switch, its depth and graph routing are not overridable. Use the precise profile as a base to get reranking. A model’s own relevance bands, set in the model registry, take precedence over bands.

Checking an override

memo-mcp profiles show team-docs   # built-in profiles only in v1.4; see the note above
memo-mcp ui                        # search there with MEMO_PROFILE=team-docs set; the trace shows the profile

Before adopting an override, measure it. See Measuring a change.