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 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
@@ -242,7 +242,7 @@ Example:
242
242
  ### Session (1)
243
243
  `set_summary`
244
244
 
245
- ## Compact payloads and status aliases (v2.3.0)
245
+ ## Compact payloads and status aliases (v2.8.0 — feature since v2.3.0)
246
246
 
247
247
  ### `fields=lite` — reduced token payloads
248
248
 
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.5.0",
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
- server.tool("recall", "Semantic vector search over VantagePeers memories, ranked by cosine similarity. " +
920
- "WHEN: use at session start or before decisions prefer over text_search for intent-based queries. " +
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
- server.tool("text_search", "BM25 full-text keyword search over VantagePeers memories for exact term matching. " +
975
- "WHEN: use when recall returns too-broad results and you need a specific exact phrase or ID. " +
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vantage-peers-mcp",
3
- "version": "2.7.1",
3
+ "version": "2.8.0",
4
4
  "description": "MCP server for VantagePeers — shared memory, messaging, and task coordination for AI agent teams",
5
5
  "type": "module",
6
6
  "main": "./dist/server.js",