@echomem/mcp 1.4.25 → 1.4.26
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/dist/index.js +19 -5
- package/dist/package-metadata.js +2 -1
- package/dist/setup.js +3 -3
- package/dist/v1-contract.js +5 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -18,9 +18,13 @@ import { checkLatestUpdateStatus, formatUpdateNotice, formatUpdateStatusText, st
|
|
|
18
18
|
const ECHO_API_BASE_URL = process.env.ECHO_API_BASE_URL || "https://echo-mem-chrome.vercel.app";
|
|
19
19
|
const ECHO_PRICING_URL = process.env.ECHO_PRICING_URL || "https://echoknows.com/account";
|
|
20
20
|
const ECHO_MEMORY_WEB_URL = (process.env.ECHO_MEMORY_WEB_URL || "https://echoknows.com/company/memories").replace(/\/$/, "");
|
|
21
|
+
const ECHO_PERSONAL_MEMORY_WEB_URL = (process.env.ECHO_PERSONAL_MEMORY_WEB_URL || "https://echoknows.com/memories/timeline").replace(/\/$/, "");
|
|
21
22
|
function memoryWebUrl(memoryId) {
|
|
22
23
|
return `${ECHO_MEMORY_WEB_URL}?memoryId=${encodeURIComponent(memoryId)}`;
|
|
23
24
|
}
|
|
25
|
+
function personalMemoryWebUrl(memoryId) {
|
|
26
|
+
return `${ECHO_PERSONAL_MEMORY_WEB_URL}?memoryId=${encodeURIComponent(memoryId)}`;
|
|
27
|
+
}
|
|
24
28
|
/** Thrown when no API token is present yet — the model gets a "run login" nudge, not a hard error. */
|
|
25
29
|
class NoTokenError extends Error {
|
|
26
30
|
}
|
|
@@ -1404,8 +1408,11 @@ class EchoMemMCPServer {
|
|
|
1404
1408
|
: m.details == null
|
|
1405
1409
|
? ""
|
|
1406
1410
|
: String(m.details).trim();
|
|
1411
|
+
const memoryId = readString(m, "id");
|
|
1407
1412
|
return [
|
|
1408
1413
|
`[${idx + 1}] ${key}${typeof score === "number" ? ` (score ${score.toFixed(3)})` : ""}`,
|
|
1414
|
+
memoryId ? `Memory ID: ${memoryId}` : "",
|
|
1415
|
+
memoryId ? `Open private memory: ${personalMemoryWebUrl(memoryId)}` : "",
|
|
1409
1416
|
meta,
|
|
1410
1417
|
`Description: ${description}`,
|
|
1411
1418
|
details ? `Details: ${details}` : "",
|
|
@@ -1423,6 +1430,7 @@ class EchoMemMCPServer {
|
|
|
1423
1430
|
}
|
|
1424
1431
|
const formattedResults = memories
|
|
1425
1432
|
.map((m, idx) => `[Result ${idx + 1}] Memory ID: ${m.id || "unknown"} (Similarity: ${m.similarity_score?.toFixed(3) || "N/A"})
|
|
1433
|
+
Open private memory: ${personalMemoryWebUrl(String(m.id || "unknown"))}
|
|
1426
1434
|
Time: ${m.time} | Location: ${m.location}
|
|
1427
1435
|
Category: ${m.category} | Object: ${m.object} | Emotion: ${m.emotion}
|
|
1428
1436
|
Description: ${m.description}
|
|
@@ -1500,7 +1508,9 @@ Details: ${m.details || "N/A"}`)
|
|
|
1500
1508
|
};
|
|
1501
1509
|
}
|
|
1502
1510
|
const formattedResults = memories
|
|
1503
|
-
.map((m, idx) => `[${idx + 1}]
|
|
1511
|
+
.map((m, idx) => `[${idx + 1}] Memory ID: ${m.id || "unknown"}
|
|
1512
|
+
Open private memory: ${personalMemoryWebUrl(String(m.id || "unknown"))}
|
|
1513
|
+
Time: ${m.time} | Location: ${m.location}
|
|
1504
1514
|
Category: ${m.category} | Object: ${m.object} | Emotion: ${m.emotion}
|
|
1505
1515
|
Description: ${m.description}
|
|
1506
1516
|
Details: ${m.details || "N/A"}`)
|
|
@@ -1526,6 +1536,7 @@ Details: ${m.details || "N/A"}`)
|
|
|
1526
1536
|
}
|
|
1527
1537
|
const formattedResults = memories
|
|
1528
1538
|
.map((m, idx) => `[${idx + 1}] ${m.keys || "Saved memory"}${m.id ? ` · id ${m.id}` : ""}
|
|
1539
|
+
${m.id ? `Open private memory: ${personalMemoryWebUrl(String(m.id))}` : ""}
|
|
1529
1540
|
Time: ${m.time} | Category: ${m.category} | Object: ${m.object} | Emotion: ${m.emotion}
|
|
1530
1541
|
Description: ${m.description}
|
|
1531
1542
|
Details: ${m.details || "N/A"}`)
|
|
@@ -1604,7 +1615,9 @@ Details: ${m.details || "N/A"}`)
|
|
|
1604
1615
|
};
|
|
1605
1616
|
}
|
|
1606
1617
|
const formattedResults = memories
|
|
1607
|
-
.map((m, idx) => `[${idx + 1}]
|
|
1618
|
+
.map((m, idx) => `[${idx + 1}] Memory ID: ${m.id || "unknown"}
|
|
1619
|
+
Open private memory: ${personalMemoryWebUrl(String(m.id || "unknown"))}
|
|
1620
|
+
Time: ${m.time} | Keys: ${m.keys || "N/A"}
|
|
1608
1621
|
Location: ${m.location} | Category: ${m.category} | Object: ${m.object}
|
|
1609
1622
|
Description: ${m.description}
|
|
1610
1623
|
Details: ${m.details || "N/A"}`)
|
|
@@ -1911,7 +1924,7 @@ Details: ${m.details || "N/A"}`;
|
|
|
1911
1924
|
: null;
|
|
1912
1925
|
return [
|
|
1913
1926
|
`[${index + 1}] Memory ID: ${readString(candidate, "memoryId") ?? "unknown"}`,
|
|
1914
|
-
`Open memory: ${
|
|
1927
|
+
`Open private memory: ${personalMemoryWebUrl(readString(candidate, "memoryId") ?? "unknown")}`,
|
|
1915
1928
|
`Created: ${readString(candidate, "createdAt") ?? "unknown"}`,
|
|
1916
1929
|
`Category: ${readString(candidate, "category") ?? "unknown"}`,
|
|
1917
1930
|
`Description: ${readString(candidate, "description") ?? ""}`,
|
|
@@ -1938,9 +1951,9 @@ Details: ${m.details || "N/A"}`;
|
|
|
1938
1951
|
formatted,
|
|
1939
1952
|
"",
|
|
1940
1953
|
flaggedIds.length
|
|
1941
|
-
? `Extra attention required: ${flaggedIds.length} candidate(s) are flagged (${flaggedIds.join(", ")}). Show them in a separate warning and
|
|
1954
|
+
? `Extra attention required: ${flaggedIds.length} candidate(s) are flagged (${flaggedIds.join(", ")}). Nothing has been published. Show them in a separate warning and offer to exclude them, review them separately, or first search for and mark similar sensitive owned memories for publication attention. Never auto-flag based on inference. Require separate explicit acknowledgement before including their exact IDs in acknowledgedFlaggedMemoryIds.`
|
|
1942
1955
|
: "",
|
|
1943
|
-
"Select exact memory IDs matching the user's instruction. From memory evidence, draft a concise title and responsibility summary. Show the profile proposal and memory preview together, then ask for explicit confirmation. After confirmation, call update_group_profile and complete_group_publication.",
|
|
1956
|
+
"Select exact memory IDs matching the user's instruction. From memory evidence, draft a concise title and responsibility summary. If an unflagged candidate appears sensitive, proactively ask whether the user wants to mark its exact ID for publication attention first. Explain that marking does not publish or change encryption; it means you will call it out and ask for detailed confirmation whenever a later publication includes it. Never auto-flag. Show the profile proposal and memory preview together, then ask for explicit confirmation. After confirmation, call update_group_profile and complete_group_publication.",
|
|
1944
1957
|
].join("\n"),
|
|
1945
1958
|
}],
|
|
1946
1959
|
};
|
|
@@ -1958,6 +1971,7 @@ Details: ${m.details || "N/A"}`;
|
|
|
1958
1971
|
`Flagged ${payload?.flaggedCount ?? parsed.memoryIds.length} memories for publication attention.`,
|
|
1959
1972
|
`Label: ${parsed.label}`,
|
|
1960
1973
|
`Memory IDs: ${parsed.memoryIds.join(", ")}`,
|
|
1974
|
+
`Private review links:\n${parsed.memoryIds.map((memoryId) => `- ${memoryId}: ${personalMemoryWebUrl(memoryId)}`).join("\n")}`,
|
|
1961
1975
|
"No memory was published, decrypted, or made globally public.",
|
|
1962
1976
|
alreadyPublished > 0
|
|
1963
1977
|
? `Attention: ${alreadyPublished} flagged memories already have group snapshots. This flag does not retract those existing snapshots.`
|
package/dist/package-metadata.js
CHANGED
|
@@ -30,8 +30,9 @@ export const MCP_SERVER_INSTRUCTIONS = [
|
|
|
30
30
|
"Do not auto-update on every MCP startup; this bridge is intentionally stable between explicit updates.",
|
|
31
31
|
"For company-group sharing, use get_group_context for orientation; create_memory_group/create_group_invite/join_memory_group for membership; and prepare_group_publication as a no-publication preview.",
|
|
32
32
|
"After joining or when profile fields are missing, use candidate memory evidence to propose a title and responsibility summary. Ask the user to confirm that proposal together with the publication preview, then call update_group_profile and complete_group_publication.",
|
|
33
|
+
"Use owner-only /memories/timeline?memoryId=... links for the user's private search, flag, and publication-preview evidence. Use /company/memories?memoryId=... only for already-published group evidence.",
|
|
33
34
|
"Each group-search result is one memory: preserve its Memory ID and direct echoknows.com link when citing it.",
|
|
34
|
-
"For sensitive-topic flags, search and preview exact owned memories before confirmed flag_memories_for_publication_attention.
|
|
35
|
+
"During a publication preview, if an unflagged candidate appears sensitive, proactively ask whether the user wants to mark its exact ID for publication attention first. Explain that marking does not publish or change encryption; it means the agent will call it out and ask for detailed confirmation whenever a later publication includes it. Never auto-flag inferred sensitivity. For sensitive-topic flags, search and preview exact owned memories before confirmed flag_memories_for_publication_attention. Separate already-flagged candidates, state that nothing has been published yet, and offer to exclude them, review them separately, or first search for and mark similar sensitive owned memories.",
|
|
35
36
|
"Never save an inferred group profile or complete a group publication without explicit confirmation, and never store or log an echo_grp_ invite code.",
|
|
36
37
|
].join(" ");
|
|
37
38
|
export function withMcpVersion(description) {
|
package/dist/setup.js
CHANGED
|
@@ -399,9 +399,9 @@ function echomemGuidanceBlock() {
|
|
|
399
399
|
"- If a user supplies an `echo_grp_...` code and explicitly asks to join, call `join_memory_group`. Joining never authorizes publishing by itself and must not move a user out of another group. After joining, continue into the profile-and-publication preview instead of leaving title or responsibility blank.",
|
|
400
400
|
"- For requests such as “prepare my recent work memories,” “upload work from this ticket,” or “publish work since my last sync,” call `prepare_group_publication` first. This is a no-publication preview. For encrypted accounts, tell the user to run `echomem-mcp unlock` locally if the tool reports that the key is required.",
|
|
401
401
|
"- After preparing, select only exact candidate memory IDs that match the user's stated scope and exclude already-published or exact-content duplicates. Use the candidate evidence to draft a concise title and responsibility summary for the current member, but label both as proposals rather than facts.",
|
|
402
|
-
"-
|
|
403
|
-
"- If the user asks to flag memories about a sensitive topic, search their own memories first, show the exact matches, and ask them to confirm. Only then call `flag_memories_for_publication_attention`; flagging does not publish, decrypt, change visibility, or retract an existing group snapshot.",
|
|
404
|
-
"- Present the proposed title/responsibility and the memory publication preview together and ask for explicit confirmation. Never save an inferred profile or publish memories before confirmation. Show flagged candidates in a separate warning.",
|
|
402
|
+
"- Use two distinct evidence links. For the user's own source memories during search, flag review, or publication preview, preserve the Memory ID and use `https://echoknows.com/memories/timeline?memoryId=...`; this is an owner-only personal link and may require Vault unlock. For already-published results from `search_others_memories`, use `https://echoknows.com/company/memories?memoryId=...`, which requires current group access.",
|
|
403
|
+
"- If the user asks to flag memories about a sensitive topic, search their own memories first, show the exact matches with owner-only personal links, and ask them to confirm. Only then call `flag_memories_for_publication_attention`; flagging does not publish, decrypt, change visibility, or retract an existing group snapshot.",
|
|
404
|
+
"- Present the proposed title/responsibility and the memory publication preview together and ask for explicit confirmation. Never save an inferred profile or publish memories before confirmation. If an unflagged candidate appears sensitive, proactively ask whether the user wants to mark its exact ID for publication attention first. Explain naturally: marking does not publish or change encryption; it means you will call it out and ask for detailed confirmation whenever a later publication includes it. Never auto-flag based on agent inference. Show already-flagged candidates in a separate warning, state that nothing has been published yet, and offer three choices: exclude them, review them separately, or first search for and mark similar sensitive owned memories for publication attention.",
|
|
405
405
|
"- On confirmation, call `update_group_profile` with the confirmed title, responsibility summary, and `confirmed: true`, then call `complete_group_publication` with the exact `scanId`, selected memory IDs, and `confirmed: true`. If a flagged memory is selected, require separate explicit acknowledgement and pass its exact ID in `acknowledgedFlaggedMemoryIds`. If the user edits either proposal, use their wording. An explicit request to join and upload still requires this preview and confirmation.",
|
|
406
406
|
"- If the user asks to show, reopen, restart, or bring back the EchoMem HUD (the context-health overlay), run the shell command `echomem-hud app --client auto`.",
|
|
407
407
|
"- If the user wants the HUD to come back after a computer restart, run the shell command `echomem-hud autostart on --client auto`.",
|
package/dist/v1-contract.js
CHANGED
|
@@ -492,7 +492,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
492
492
|
},
|
|
493
493
|
{
|
|
494
494
|
name: canonicalToolNames.prepareGroupPublication,
|
|
495
|
-
description: "Prepare a no-publication preview of up to 50 owned memories for group publication. For encrypted accounts the local bridge must be unlocked. The host agent selects exact work-related memory ids, drafts a concise title and responsibility summary from memory evidence, and asks the user to confirm both the profile and publication selection together.
|
|
495
|
+
description: "Prepare a no-publication preview of up to 50 owned memories for group publication. For encrypted accounts the local bridge must be unlocked. The host agent selects exact work-related memory ids, gives each candidate an owner-only https://echoknows.com/memories/timeline?memoryId=... review link, drafts a concise title and responsibility summary from memory evidence, and asks the user to confirm both the profile and publication selection together. If an unflagged candidate appears sensitive, proactively ask whether the user wants to mark its exact ID for publication attention first. Explain that marking does not publish or change encryption; it means the agent will call it out and ask for detailed confirmation whenever a later publication includes it. Never auto-flag inferred sensitivity. Already-flagged memories are identified separately and require extra attention before publication. This tool never publishes.",
|
|
496
496
|
inputSchema: {
|
|
497
497
|
type: "object",
|
|
498
498
|
properties: {
|
|
@@ -508,7 +508,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
508
508
|
},
|
|
509
509
|
{
|
|
510
510
|
name: canonicalToolNames.flagPublicationAttention,
|
|
511
|
-
description: "Mark exact owned memories for extra attention during future group publication. First search the user's own memories, show the matching memory IDs and
|
|
511
|
+
description: "Mark exact owned memories for extra attention during future group publication. First search the user's own memories, show the matching memory IDs, summaries, and owner-only https://echoknows.com/memories/timeline?memoryId=... review links, and obtain explicit confirmation. This only records a safety flag; it does not publish, decrypt, change visibility, or retract an existing group snapshot.",
|
|
512
512
|
inputSchema: {
|
|
513
513
|
type: "object",
|
|
514
514
|
properties: {
|
|
@@ -548,7 +548,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
548
548
|
},
|
|
549
549
|
{
|
|
550
550
|
name: canonicalToolNames.completeGroupPublication,
|
|
551
|
-
description: "Publish only the exact memory ids from a prepared scan after the user explicitly confirms the preview. confirmed must be true. Any flagged memories must be called out separately and
|
|
551
|
+
description: "Publish only the exact memory ids from a prepared scan after the user explicitly confirms the preview. confirmed must be true. Any flagged memories must be called out separately; state that nothing has been published yet and offer to exclude them, review them separately, or first search for and mark similar sensitive owned memories. Never auto-flag inferred sensitivity. Publish flagged memories only after extra user acknowledgement with their exact IDs in acknowledgedFlaggedMemoryIds. Completing an empty selection safely advances the scan cursor without publishing.",
|
|
552
552
|
inputSchema: {
|
|
553
553
|
type: "object",
|
|
554
554
|
properties: {
|
|
@@ -568,7 +568,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
568
568
|
},
|
|
569
569
|
{
|
|
570
570
|
name: canonicalToolNames.publishToGroup,
|
|
571
|
-
description: "Publish one exact memory snapshot to your current company group without changing the memory's global is_public or encryption state. Call only after the user explicitly asks to publish or push that memory. If it is flagged,
|
|
571
|
+
description: "Publish one exact memory snapshot to your current company group without changing the memory's global is_public or encryption state. Call only after the user explicitly asks to publish or push that memory. If it is flagged, state that nothing has been published yet and offer to exclude it, review it separately, or first search for and mark similar sensitive owned memories. Never auto-flag inferred sensitivity. Pass its ID in acknowledgedFlaggedMemoryIds only after extra user acknowledgement. The operation is idempotent.",
|
|
572
572
|
inputSchema: {
|
|
573
573
|
type: "object",
|
|
574
574
|
properties: {
|
|
@@ -593,7 +593,7 @@ export function listToolSpecs(opts = {}) {
|
|
|
593
593
|
},
|
|
594
594
|
{
|
|
595
595
|
name: canonicalToolNames.publishBatchToGroup,
|
|
596
|
-
description: "Publish up to 50 exact memory snapshots to your current company group without changing global is_public or the encrypted originals. For a session request, first call get_memories_by_context, select the exact ids that match the user's instruction, then pass those ids with the same contextId. Call only after explicit group-publication intent; report what was selected when the user delegates work-related filtering. Flagged memories must be called out separately and
|
|
596
|
+
description: "Publish up to 50 exact memory snapshots to your current company group without changing global is_public or the encrypted originals. For a session request, first call get_memories_by_context, select the exact ids that match the user's instruction, then pass those ids with the same contextId. Call only after explicit group-publication intent; report what was selected when the user delegates work-related filtering. Flagged memories must be called out separately; state that nothing has been published yet and offer exclusion, separate review, or a confirmed search-and-flag pass for similar sensitive owned memories. Never auto-flag inferred sensitivity. Publish flagged memories only after exact-ID acknowledgement.",
|
|
597
597
|
inputSchema: {
|
|
598
598
|
type: "object",
|
|
599
599
|
properties: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@echomem/mcp",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.26",
|
|
4
4
|
"description": "EchoMem MCP bridge: cloud-first memory tools, local context HUD, and the Agent Doctor workspace forensics report (cost ledger + 3D repo city)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|