evrex-mcp 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +18 -4
  2. package/dist/index.js +14 -2
  3. package/package.json +12 -3
package/README.md CHANGED
@@ -49,13 +49,27 @@ Reload Cursor afterwards so it picks up the new server.
49
49
  | Variable | Required | Purpose |
50
50
  |---|---|---|
51
51
  | `EVREX_TOKEN` | **yes** | Your evrex API token. The server exits at startup with instructions if it's missing. |
52
- | `ANTHROPIC_API_KEY` | no | Synthesizes retrieved evidence into a direct answer. Without it, tools return ranked evidence excerpts and say why they're unsummarized — a working server, just a quieter one. |
52
+ | `ANTHROPIC_API_KEY` | no | Only used when `EVREX_SYNTHESIZE` is on. Not needed otherwise. |
53
+ | `EVREX_SYNTHESIZE` | no | Set to `1` to have the server summarize evidence into a prose answer before returning it. **Off by default** — see below. |
53
54
  | `EVREX_API_BASE_URL` | no | Point at a self-hosted evrex backend. Defaults to the hosted one. |
54
55
  | `ANTHROPIC_MODEL` | no | Defaults to `claude-opus-5`. |
55
56
 
56
- Answer synthesis runs **on your machine with your own key**. The evrex backend
57
- holds no model-provider credential, so your transcripts are never sent through
58
- someone else's API account.
57
+ ## No API credits needed to query
58
+
59
+ The tools return the recorded context — constraints, rejected approaches, prior
60
+ decisions, and ranked evidence — and let *your agent* reason over it. Your agent
61
+ is already a model reading this output, so summarizing it first would spend a
62
+ model call and latency to hand it *less* to work with.
63
+
64
+ That means `evrex_why` and friends cost nothing per call. The one place a model
65
+ runs is extraction, once per session when a repo is indexed, on the machine
66
+ that has the transcript — and already-extracted sessions are skipped, so
67
+ re-indexing is nearly free.
68
+
69
+ Set `EVREX_SYNTHESIZE=1` if you're consuming these tools from something with no
70
+ model of its own — a dashboard, a CI bot. That path uses your own key. The
71
+ evrex backend never holds a model-provider credential either way, so your
72
+ transcripts are never sent through someone else's API account.
59
73
 
60
74
  ## What it does not do
61
75
 
package/dist/index.js CHANGED
@@ -218,6 +218,10 @@ var client = createAnthropicKeyClient();
218
218
  function createAnthropicKeyClient() {
219
219
  return createAnthropicClient(ANTHROPIC_API_KEY);
220
220
  }
221
+ function synthesisEnabled() {
222
+ const flag = process.env.EVREX_SYNTHESIZE;
223
+ return flag === "1" || flag?.toLowerCase() === "true";
224
+ }
221
225
  function toSynthesisEvidence(evidence) {
222
226
  return evidence.map((e) => ({
223
227
  kind: e.kind,
@@ -378,8 +382,16 @@ async function evrexWhy(filePath, question) {
378
382
  "NOTE: the blocks above were extracted by cue-phrase matching, not by a model reading the conversation \u2014 they may be incomplete or miss context."
379
383
  );
380
384
  }
381
- const answer = await synthesize(text, evidence);
382
- parts.push(answer.sentences ? `ANSWER: ${answer.sentences.join(" ")}` : `ANSWER: ${answer.reason}`);
385
+ if (synthesisEnabled()) {
386
+ const answer = await synthesize(text, evidence);
387
+ parts.push(
388
+ answer.sentences ? `ANSWER: ${answer.sentences.join(" ")}` : `ANSWER: ${answer.reason}`
389
+ );
390
+ } else {
391
+ parts.push(
392
+ "HOW TO USE THIS: treat the constraints and rejected approaches above as binding \u2014 they are what this team already decided, not suggestions. Do not re-propose a rejected approach unless you have new information that specifically invalidates the stated reason, and say so if you do. Answer the user from the evidence below; if it does not actually cover their question, say that rather than inferring."
393
+ );
394
+ }
383
395
  const evidenceLines = evidence.slice(0, MAX_ITEMS).map((e) => {
384
396
  const conf = e.provenance.status === "verified" ? "verified" : `${Math.round((e.provenance.confidence ?? 0) * 100)}%`;
385
397
  return `- [${e.kind} ${conf}] ${truncate(e.excerpt, MAX_EXCERPT)}`;
package/package.json CHANGED
@@ -1,15 +1,24 @@
1
1
  {
2
2
  "name": "evrex-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "MCP server that gives coding agents the recorded reasoning behind a repo: prior decisions, hard constraints, and approaches already rejected.",
5
- "keywords": ["mcp", "claude", "cursor", "evrex", "code-context"],
5
+ "keywords": [
6
+ "mcp",
7
+ "claude",
8
+ "cursor",
9
+ "evrex",
10
+ "code-context"
11
+ ],
6
12
  "license": "MIT",
7
13
  "type": "module",
8
14
  "main": "./dist/index.js",
9
15
  "bin": {
10
16
  "evrex-mcp": "dist/index.js"
11
17
  },
12
- "files": ["dist/index.js", "README.md"],
18
+ "files": [
19
+ "dist/index.js",
20
+ "README.md"
21
+ ],
13
22
  "engines": {
14
23
  "node": ">=20"
15
24
  },