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.
- package/README.md +18 -4
- package/dist/index.js +14 -2
- 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 |
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
382
|
-
|
|
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.
|
|
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": [
|
|
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": [
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/index.js",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
13
22
|
"engines": {
|
|
14
23
|
"node": ">=20"
|
|
15
24
|
},
|