vantage-peers-mcp 2.7.1 → 2.8.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/CHANGELOG.md +28 -0
- package/README.md +1 -1
- package/dist/server.js +1 -1
- package/dist/src/tools.js +117 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.8.0] — 2026-06-14 — Day 101 CRUD baseline PR-A: search_memories_by_keyword + search_memories_by_semantic (mission k575kc1ryps0n8br95jw3q7d0x88m2v9, task k1735qk9kx6agjjyt3e38rdvvh88mk0p)
|
|
4
|
+
|
|
5
|
+
Mission `mcp-crud-baseline-standard` PR-A under T2 `[CRUD-T2] Implémentation gaps VP MCP`. First of 4 sub-PRs aligning the MCP surface with the Day 101 doctrine `j57dhrmkzjerjtssnr0z9ba57n88n7q7` ("5 ops per entity: get / list / search_by_keyword / search_by_semantic / create-or-upsert"). PR-A handles the convention drift on the `memories` entity — the only entity that already had both keyword + semantic search wired, but under non-canonical names.
|
|
6
|
+
|
|
7
|
+
### Added (canonical names)
|
|
8
|
+
|
|
9
|
+
- **`search_memories_by_keyword`** — BM25 full-text search over memories, identical wire to `text_search`. Calls `search:textSearch` Convex action 1:1, same params (`query`, `namespace?`, `type?`, `limit?`, `fields?`), same `guardRead` namespace gate, same 20-item default limit + 200 cap, same `mcpConvexError` error surface (2.7.1 sweep). Annotations: `readOnlyHint=true`, `openWorldHint=false`, `destructiveHint=false`, title `"Search memories by keyword (BM25)"`.
|
|
10
|
+
- **`search_memories_by_semantic`** — semantic vector cosine search over memories, identical wire to `recall`. Calls `search:recall` Convex action 1:1, same params, same gate, same defaults. Annotations: `readOnlyHint=true`, `openWorldHint=false`, `destructiveHint=false`, title `"Search memories by semantic (vector cosine)"`.
|
|
11
|
+
|
|
12
|
+
### Deprecated (alias-only, one minor window)
|
|
13
|
+
|
|
14
|
+
- **`text_search`** — alias of `search_memories_by_keyword`. Description now leads with `DEPRECATED ALIAS`, source comment marks it for removal in `2.9.0`. Wire unchanged — existing callers continue to work for one minor.
|
|
15
|
+
- **`recall`** — alias of `search_memories_by_semantic`. Description now leads with `DEPRECATED ALIAS`, source comment marks it for removal in `2.9.0`. Wire unchanged.
|
|
16
|
+
|
|
17
|
+
### Why
|
|
18
|
+
|
|
19
|
+
Per mission `k575kc1r` brief + Pi arbitrage `jn77rpx2msfy2v174sdqyjzp6n88m9bw` Q4 (RENAME CLEAN, optional one-minor dual-emit buffer if Sigma judges useful): the legacy `text_search` / `recall` pair predates the Day 101 CRUD baseline naming convention. Other entities will gain `search_<entity>s_by_keyword` / `search_<entity>s_by_semantic` in PR-C (cluster of 13) and PR-D (vectorIndex add for briefing_notes + diary). Aligning the `memories` entity FIRST means PR-C/D ship into a fleet that already understands the new naming, and skill / plugin / docs propagation (T-SKILLS, T-PLUGIN, T-DOC) has a single canonical truth to follow.
|
|
20
|
+
|
|
21
|
+
`hybrid_search` is intentionally NOT renamed — it remains a cross-cutting RRF-fusion tool, not entity-scoped, per the audit `analysis/mcp-crud-baseline-vp-audit-2026-06-14.md` § 4.
|
|
22
|
+
|
|
23
|
+
### Refs
|
|
24
|
+
|
|
25
|
+
- Mission `k575kc1ryps0n8br95jw3q7d0x88m2v9` (MCP CRUD Baseline Standard, pilot Sigma + agents Sigma + Eta).
|
|
26
|
+
- Task T2 `k1735qk9kx6agjjyt3e38rdvvh88mk0p`.
|
|
27
|
+
- Audit T1 deliverable: `analysis/mcp-crud-baseline-vp-audit-2026-06-14.md` (140 lines, 53 table rows).
|
|
28
|
+
- Doctrine memory: `j57dhrmkzjerjtssnr0z9ba57n88n7q7` (5 ops per entity).
|
|
29
|
+
- Pi Q4 arbitrage: msg `jn77rpx2msfy2v174sdqyjzp6n88m9bw`.
|
|
30
|
+
|
|
3
31
|
## [2.7.1] — 2026-06-14 — Day 101 FIX-B mcpError() → mcpConvexError() sweep (task k1744wk2gfgqt2gdqh41d4r91h88n410)
|
|
4
32
|
|
|
5
33
|
Patch-level fix to make every tool wrapper surface structured ConvexError
|
package/README.md
CHANGED
package/dist/server.js
CHANGED
|
@@ -102,7 +102,7 @@ const convexUrl = loadConvexUrl();
|
|
|
102
102
|
const convex = new ConvexHttpClient(convexUrl);
|
|
103
103
|
const server = new McpServer({
|
|
104
104
|
name: "vantage-peers",
|
|
105
|
-
version: "2.
|
|
105
|
+
version: "2.8.0",
|
|
106
106
|
});
|
|
107
107
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
108
108
|
// Helper: structured error response for MCP tool handlers
|
package/dist/src/tools.js
CHANGED
|
@@ -916,8 +916,11 @@ export function registerTools(server, convex, oauthCtx) {
|
|
|
916
916
|
}
|
|
917
917
|
});
|
|
918
918
|
// ── recall ──────────────────────────────────────────────────────────────────
|
|
919
|
-
|
|
920
|
-
|
|
919
|
+
// DEPRECATED (Day 101 v2.8.0) — alias of search_memories_by_semantic. Retained
|
|
920
|
+
// for one minor version as a back-compat shim. New callers should use
|
|
921
|
+
// `search_memories_by_semantic`. To be removed in 2.9.0.
|
|
922
|
+
server.tool("recall", "DEPRECATED ALIAS of search_memories_by_semantic — semantic vector search over VantagePeers memories, ranked by cosine similarity. " +
|
|
923
|
+
"WHEN: use at session start or before decisions — prefer over text_search for intent-based queries. New callers: use search_memories_by_semantic. " +
|
|
921
924
|
"EXAMPLE: recall query='Pi feedback rules' namespace='global' type='feedback' limit=20.", {
|
|
922
925
|
query: z
|
|
923
926
|
.string()
|
|
@@ -971,8 +974,11 @@ export function registerTools(server, convex, oauthCtx) {
|
|
|
971
974
|
}
|
|
972
975
|
});
|
|
973
976
|
// ── text_search ─────────────────────────────────────────────────────────────
|
|
974
|
-
|
|
975
|
-
|
|
977
|
+
// DEPRECATED (Day 101 v2.8.0) — alias of search_memories_by_keyword. Retained
|
|
978
|
+
// for one minor version as a back-compat shim. New callers should use
|
|
979
|
+
// `search_memories_by_keyword`. To be removed in 2.9.0.
|
|
980
|
+
server.tool("text_search", "DEPRECATED ALIAS of search_memories_by_keyword — BM25 full-text keyword search over VantagePeers memories for exact term matching. " +
|
|
981
|
+
"WHEN: use when search_memories_by_semantic returns too-broad results and you need a specific exact phrase or ID. New callers: use search_memories_by_keyword. " +
|
|
976
982
|
"EXAMPLE: text_search query='Day 92 C3 descriptions' namespace='project/vantage-peers' limit=10.", {
|
|
977
983
|
query: z.string().describe("Search query text"),
|
|
978
984
|
namespace: z
|
|
@@ -1016,6 +1022,113 @@ export function registerTools(server, convex, oauthCtx) {
|
|
|
1016
1022
|
return mcpConvexError(error);
|
|
1017
1023
|
}
|
|
1018
1024
|
});
|
|
1025
|
+
// ── search_memories_by_keyword ─────────────────────────────────────────────
|
|
1026
|
+
// Day 101 v2.8.0 — canonical name under MCP CRUD baseline doctrine.
|
|
1027
|
+
// Mirrors text_search 1:1 (same Convex action `search:textSearch`).
|
|
1028
|
+
// text_search is retained as a deprecated alias until 2.9.0.
|
|
1029
|
+
server.tool("search_memories_by_keyword", "BM25 full-text keyword search over VantagePeers memories for exact term matching. " +
|
|
1030
|
+
"WHEN: use when search_memories_by_semantic returns too-broad results and you need a specific exact phrase or ID. " +
|
|
1031
|
+
"EXAMPLE: search_memories_by_keyword query='Day 92 C3 descriptions' namespace='project/vantage-peers' limit=10.", {
|
|
1032
|
+
query: z.string().describe("Search query text"),
|
|
1033
|
+
namespace: z
|
|
1034
|
+
.string()
|
|
1035
|
+
.optional()
|
|
1036
|
+
.describe("Namespace filter (e.g. 'global', 'project/my-project')"),
|
|
1037
|
+
type: memoryTypeSchema.optional().describe("Filter by memory type"),
|
|
1038
|
+
limit: z
|
|
1039
|
+
.number()
|
|
1040
|
+
.int()
|
|
1041
|
+
.min(1)
|
|
1042
|
+
.max(200)
|
|
1043
|
+
.optional()
|
|
1044
|
+
.describe("Max items to return. Default 20 (envelope-safe). Cap 200."),
|
|
1045
|
+
fields: z
|
|
1046
|
+
.enum(["lite", "full"])
|
|
1047
|
+
.optional()
|
|
1048
|
+
.describe("'lite' returns compact payload (less tokens), 'full' is default. v2.4.9+."),
|
|
1049
|
+
}, {
|
|
1050
|
+
readOnlyHint: true,
|
|
1051
|
+
openWorldHint: false,
|
|
1052
|
+
destructiveHint: false,
|
|
1053
|
+
title: "Search memories by keyword (BM25)",
|
|
1054
|
+
}, async ({ query, namespace, type, limit, fields }) => {
|
|
1055
|
+
try {
|
|
1056
|
+
const nsDenied = guardRead(namespace);
|
|
1057
|
+
if (nsDenied)
|
|
1058
|
+
return nsDenied;
|
|
1059
|
+
const results = await convex.action("search:textSearch", {
|
|
1060
|
+
query,
|
|
1061
|
+
namespace,
|
|
1062
|
+
type,
|
|
1063
|
+
limit: limit ?? 20,
|
|
1064
|
+
fields: fields ?? "lite",
|
|
1065
|
+
});
|
|
1066
|
+
return {
|
|
1067
|
+
content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
catch (error) {
|
|
1071
|
+
return mcpConvexError(error);
|
|
1072
|
+
}
|
|
1073
|
+
});
|
|
1074
|
+
// ── search_memories_by_semantic ────────────────────────────────────────────
|
|
1075
|
+
// Day 101 v2.8.0 — canonical name under MCP CRUD baseline doctrine.
|
|
1076
|
+
// Mirrors recall 1:1 (same Convex action `search:recall`).
|
|
1077
|
+
// recall is retained as a deprecated alias until 2.9.0.
|
|
1078
|
+
server.tool("search_memories_by_semantic", "Semantic vector search over VantagePeers memories, ranked by cosine similarity. " +
|
|
1079
|
+
"WHEN: use at session start or before decisions — prefer over search_memories_by_keyword for intent-based queries. " +
|
|
1080
|
+
"EXAMPLE: search_memories_by_semantic query='Pi feedback rules' namespace='global' type='feedback' limit=20.", {
|
|
1081
|
+
query: z
|
|
1082
|
+
.string()
|
|
1083
|
+
.describe("Natural language query to search for relevant memories"),
|
|
1084
|
+
namespace: z
|
|
1085
|
+
.string()
|
|
1086
|
+
.optional()
|
|
1087
|
+
.describe("Filter to a specific namespace — omit to search all"),
|
|
1088
|
+
type: memoryTypeSchema
|
|
1089
|
+
.optional()
|
|
1090
|
+
.describe("Filter to a specific memory type — omit to search all"),
|
|
1091
|
+
limit: z
|
|
1092
|
+
.number()
|
|
1093
|
+
.int()
|
|
1094
|
+
.min(1)
|
|
1095
|
+
.max(200)
|
|
1096
|
+
.optional()
|
|
1097
|
+
.describe("Max items to return. Default 20 (envelope-safe). Cap 200."),
|
|
1098
|
+
fields: z
|
|
1099
|
+
.enum(["lite", "full"])
|
|
1100
|
+
.optional()
|
|
1101
|
+
.describe("'lite' returns compact payload (less tokens), 'full' is default. v2.4.9+."),
|
|
1102
|
+
}, {
|
|
1103
|
+
readOnlyHint: true,
|
|
1104
|
+
openWorldHint: false,
|
|
1105
|
+
destructiveHint: false,
|
|
1106
|
+
title: "Search memories by semantic (vector cosine)",
|
|
1107
|
+
}, async ({ query, namespace, type, limit, fields }) => {
|
|
1108
|
+
try {
|
|
1109
|
+
const nsDenied = guardRead(namespace);
|
|
1110
|
+
if (nsDenied)
|
|
1111
|
+
return nsDenied;
|
|
1112
|
+
const results = await convex.action("search:recall", {
|
|
1113
|
+
query,
|
|
1114
|
+
namespace,
|
|
1115
|
+
type,
|
|
1116
|
+
limit: limit ?? 20,
|
|
1117
|
+
fields: fields ?? "lite",
|
|
1118
|
+
});
|
|
1119
|
+
return {
|
|
1120
|
+
content: [
|
|
1121
|
+
{
|
|
1122
|
+
type: "text",
|
|
1123
|
+
text: JSON.stringify(results, null, 2),
|
|
1124
|
+
},
|
|
1125
|
+
],
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
catch (error) {
|
|
1129
|
+
return mcpConvexError(error);
|
|
1130
|
+
}
|
|
1131
|
+
});
|
|
1019
1132
|
// ── hybrid_search ───────────────────────────────────────────────────────────
|
|
1020
1133
|
server.tool("hybrid_search", "Combined vector + BM25 search via Reciprocal Rank Fusion for best semantic and keyword coverage. " +
|
|
1021
1134
|
"WHEN: use when neither recall nor text_search alone yields good results — highest recall quality. " +
|
package/package.json
CHANGED