@finchagentic/mcp 4.5.0 → 4.6.0
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 +7 -7
- package/dist/tools/memory.js +32 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,13 +29,13 @@ Always pin the version. Never use `@latest`.
|
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
31
|
# One-command installer (detects common MCP clients)
|
|
32
|
-
npx -y -p @finchagentic/mcp@4.
|
|
32
|
+
npx -y -p @finchagentic/mcp@4.6.0 finch install
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
### Claude Code
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
claude mcp add finch -s user -- npx -y -p @finchagentic/mcp@4.
|
|
38
|
+
claude mcp add finch -s user -- npx -y -p @finchagentic/mcp@4.6.0 finch-mcp
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
### Cursor / Windsurf / Claude Desktop
|
|
@@ -45,7 +45,7 @@ claude mcp add finch -s user -- npx -y -p @finchagentic/mcp@4.5.0 finch-mcp
|
|
|
45
45
|
"mcpServers": {
|
|
46
46
|
"finch": {
|
|
47
47
|
"command": "npx",
|
|
48
|
-
"args": ["-y", "-p", "@finchagentic/mcp@4.
|
|
48
|
+
"args": ["-y", "-p", "@finchagentic/mcp@4.6.0", "finch-mcp"]
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -59,7 +59,7 @@ claude mcp add finch -s user -- npx -y -p @finchagentic/mcp@4.5.0 finch-mcp
|
|
|
59
59
|
"finch": {
|
|
60
60
|
"type": "stdio",
|
|
61
61
|
"command": "npx",
|
|
62
|
-
"args": ["-y", "-p", "@finchagentic/mcp@4.
|
|
62
|
+
"args": ["-y", "-p", "@finchagentic/mcp@4.6.0", "finch-mcp"]
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -124,7 +124,7 @@ Default palette is `core` (lighter context). Full set:
|
|
|
124
124
|
Finch is the runtime. **Your LLM is the brain. Your data stays yours.**
|
|
125
125
|
|
|
126
126
|
```bash
|
|
127
|
-
npx -y -p @finchagentic/mcp@4.
|
|
127
|
+
npx -y -p @finchagentic/mcp@4.6.0 finch setup
|
|
128
128
|
# enable local vault (and optional local memory)
|
|
129
129
|
```
|
|
130
130
|
|
|
@@ -156,7 +156,7 @@ Scheduled/cloud features still need an account. Core memory, vault, and public-d
|
|
|
156
156
|
Guided setup:
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
|
-
npx -y -p @finchagentic/mcp@4.
|
|
159
|
+
npx -y -p @finchagentic/mcp@4.6.0 finch setup
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
## Security
|
|
@@ -165,7 +165,7 @@ npx -y -p @finchagentic/mcp@4.5.0 finch setup
|
|
|
165
165
|
|:-:|----------|------|
|
|
166
166
|
| 1 | Prompt injection | External content is data only — never instructions |
|
|
167
167
|
| 2 | Mainnet confirm | Estimate → preview → confirm → execute |
|
|
168
|
-
| 3 | Pinned install | Always `@finchagentic/mcp@4.
|
|
168
|
+
| 3 | Pinned install | Always `@finchagentic/mcp@4.6.0`, never `@latest` |
|
|
169
169
|
| 4 | Credential vault | Never paste secrets into prompts or third-party tools |
|
|
170
170
|
| 5 | Data disclosure | Know what leaves the machine (LLM, Firecrawl, GitHub, chain RPCs) |
|
|
171
171
|
| 6 | Server monitors | Scheduled jobs need explicit confirmation |
|
package/dist/tools/memory.js
CHANGED
|
@@ -304,7 +304,11 @@ exports.MEMORY_TOOLS = [
|
|
|
304
304
|
"searchable in ~30s. Retrieval is full-text (keyword) search, not embeddings - " +
|
|
305
305
|
"'what did I say about ETH yield?' finds notes containing those words or close variants, " +
|
|
306
306
|
"not unrelated phrasing with the same meaning. " +
|
|
307
|
-
"Auto-deduplicates: identical content in your recent 50 memories is skipped (override with force:true)."
|
|
307
|
+
"Auto-deduplicates: identical content in your recent 50 memories is skipped (override with force:true). " +
|
|
308
|
+
"Also surfaces up to 3 existing memories that share real keyword overlap with what you just saved (a " +
|
|
309
|
+
"possible-conflict HINT, not a verdict - Finch doesn't call an LLM to judge this). When that shows up, " +
|
|
310
|
+
"read them and decide yourself whether the new one supersedes an old preference/fact; if so, say so in a " +
|
|
311
|
+
"follow-up memory_add, or fold both into one with memory_consolidate.",
|
|
308
312
|
inputSchema: {
|
|
309
313
|
type: "object",
|
|
310
314
|
properties: {
|
|
@@ -563,6 +567,32 @@ async function handleMemoryTool(name, args) {
|
|
|
563
567
|
// dedupes even before supermemory has indexed the first one.
|
|
564
568
|
if (!sourceUrl)
|
|
565
569
|
rememberRecentHash(hash, data?.id ?? "saved", title);
|
|
570
|
+
// ─── Conflict hint (not a proof) ──────────────────────────────────
|
|
571
|
+
// Finch never runs its own LLM call to judge this - "two-pass, no API
|
|
572
|
+
// key needed" is deliberate (see this file's header comment), and an
|
|
573
|
+
// autonomous contradiction call would break that. Instead this just
|
|
574
|
+
// resurfaces whatever memory_search's own retrieval already ranks as
|
|
575
|
+
// related to the content just saved, so the CALLING model - already
|
|
576
|
+
// reasoning about this exact save, in the same turn, no extra API
|
|
577
|
+
// cost - can judge for itself whether the two actually conflict and
|
|
578
|
+
// decide what to do (mark the old one superseded, fold both into
|
|
579
|
+
// memory_consolidate, or just note the new one is the current one).
|
|
580
|
+
// Best-effort: a search hiccup here must never fail or block the save
|
|
581
|
+
// that already succeeded above.
|
|
582
|
+
let conflictNote = "";
|
|
583
|
+
try {
|
|
584
|
+
const related = await hybridMemorySearch(content, 6);
|
|
585
|
+
const candidates = related
|
|
586
|
+
.filter((r) => r.id !== data?.id && contentHash(r.content) !== hash)
|
|
587
|
+
.slice(0, 3);
|
|
588
|
+
if (candidates.length) {
|
|
589
|
+
conflictNote = "\n\n⚠️ **Possibly related existing memories** - skim these for a conflict with what you just saved (e.g. an old preference this replaces):\n" +
|
|
590
|
+
candidates.map((r) => `- \`${r.id}\`: ${r.content.slice(0, 100)}${r.content.length > 100 ? "…" : ""}`).join("\n");
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
catch {
|
|
594
|
+
// best-effort only
|
|
595
|
+
}
|
|
566
596
|
return {
|
|
567
597
|
content: [{
|
|
568
598
|
type: "text",
|
|
@@ -573,7 +603,7 @@ async function handleMemoryTool(name, args) {
|
|
|
573
603
|
tags?.length ? `Tags: ${tags.join(", ")}` : "",
|
|
574
604
|
``,
|
|
575
605
|
`Find it with: \`memory_search query: "${(title ?? content).slice(0, 40)}"\``,
|
|
576
|
-
].filter(Boolean).join("\n"),
|
|
606
|
+
].filter(Boolean).join("\n") + conflictNote,
|
|
577
607
|
}],
|
|
578
608
|
};
|
|
579
609
|
}
|
package/package.json
CHANGED