@cloudcart/dev-mcp 0.1.5 → 0.2.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/data/embeddings.bin +0 -0
- package/data/embeddings.json +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/prompts/admin.d.ts +1 -1
- package/dist/prompts/admin.d.ts.map +1 -1
- package/dist/prompts/admin.js +70 -110
- package/dist/prompts/admin.js.map +1 -1
- package/dist/tools/introspect-schema.d.ts +2 -0
- package/dist/tools/introspect-schema.d.ts.map +1 -1
- package/dist/tools/introspect-schema.js +16 -3
- package/dist/tools/introspect-schema.js.map +1 -1
- package/dist/tools/learn-cloudcart-api.d.ts.map +1 -1
- package/dist/tools/learn-cloudcart-api.js +5 -0
- package/dist/tools/learn-cloudcart-api.js.map +1 -1
- package/dist/tools/semantic-search.d.ts +14 -0
- package/dist/tools/semantic-search.d.ts.map +1 -0
- package/dist/tools/semantic-search.js +312 -0
- package/dist/tools/semantic-search.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { pipeline } from "@huggingface/transformers";
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const MODEL_ID = "Xenova/multilingual-e5-large";
|
|
7
|
+
const EMBED_DIM = 1024;
|
|
8
|
+
const QUERY_PREFIX = "query: ";
|
|
9
|
+
// Lazy singletons — model load is heavy, reuse across calls.
|
|
10
|
+
let extractor = null;
|
|
11
|
+
let vectors = null;
|
|
12
|
+
let metadata = [];
|
|
13
|
+
let chunkCount = 0;
|
|
14
|
+
function dataPath(name) {
|
|
15
|
+
const candidates = [
|
|
16
|
+
join(__dirname, "../../data", name),
|
|
17
|
+
join(__dirname, "../../../data", name),
|
|
18
|
+
join(process.cwd(), "data", name),
|
|
19
|
+
];
|
|
20
|
+
for (const p of candidates)
|
|
21
|
+
if (existsSync(p))
|
|
22
|
+
return p;
|
|
23
|
+
throw new Error(`Cannot locate data/${name} — run 'npm run build-embeddings' first`);
|
|
24
|
+
}
|
|
25
|
+
function loadCorpus() {
|
|
26
|
+
if (vectors)
|
|
27
|
+
return;
|
|
28
|
+
const buf = readFileSync(dataPath("embeddings.bin"));
|
|
29
|
+
const n = buf.readUInt32LE(0);
|
|
30
|
+
const dim = buf.readUInt32LE(4);
|
|
31
|
+
if (dim !== EMBED_DIM) {
|
|
32
|
+
throw new Error(`embeddings.bin dimension ${dim} does not match model ${EMBED_DIM}`);
|
|
33
|
+
}
|
|
34
|
+
chunkCount = n;
|
|
35
|
+
const payload = buf.subarray(8);
|
|
36
|
+
vectors = new Float32Array(payload.buffer, payload.byteOffset, payload.byteLength / 4);
|
|
37
|
+
metadata = JSON.parse(readFileSync(dataPath("embeddings.json"), "utf8"));
|
|
38
|
+
if (metadata.length !== n) {
|
|
39
|
+
throw new Error(`metadata length ${metadata.length} != vector count ${n}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function ensureModel() {
|
|
43
|
+
if (extractor)
|
|
44
|
+
return extractor;
|
|
45
|
+
extractor = await pipeline("feature-extraction", MODEL_ID, { dtype: "q8" });
|
|
46
|
+
return extractor;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Fire-and-forget prewarm. Kicks off corpus load + model download/load so the
|
|
50
|
+
* first real semantic_search call doesn't eat a 30+ second cold start.
|
|
51
|
+
* Swallows errors — prewarm is best-effort and must never break the caller.
|
|
52
|
+
*/
|
|
53
|
+
let prewarmStarted = false;
|
|
54
|
+
export function prewarm() {
|
|
55
|
+
if (prewarmStarted)
|
|
56
|
+
return;
|
|
57
|
+
prewarmStarted = true;
|
|
58
|
+
void (async () => {
|
|
59
|
+
try {
|
|
60
|
+
loadCorpus();
|
|
61
|
+
}
|
|
62
|
+
catch { /* index not built yet — ignore */ }
|
|
63
|
+
try {
|
|
64
|
+
await ensureModel();
|
|
65
|
+
}
|
|
66
|
+
catch { /* offline / no cache yet — ignore */ }
|
|
67
|
+
})();
|
|
68
|
+
}
|
|
69
|
+
function dot(a, aOff, b, bOff, len) {
|
|
70
|
+
let s = 0;
|
|
71
|
+
for (let i = 0; i < len; i++)
|
|
72
|
+
s += a[aOff + i] * b[bOff + i];
|
|
73
|
+
return s;
|
|
74
|
+
}
|
|
75
|
+
const OP_ARG_PREVIEW = 8;
|
|
76
|
+
/**
|
|
77
|
+
* Shrink a fat operation signature like
|
|
78
|
+
* `customers(query: String, firstName: String, ..., total_spent: NumericFilter, first: Int! = 25, after: String): CustomerConnection!`
|
|
79
|
+
* into
|
|
80
|
+
* `customers(query, firstName, …, total_spent [+14 more]): CustomerConnection!`
|
|
81
|
+
*
|
|
82
|
+
* Keeps the agent aware of what args exist without bleeding 300 tokens of
|
|
83
|
+
* type annotations into every semantic result.
|
|
84
|
+
*/
|
|
85
|
+
function compactSignature(sig) {
|
|
86
|
+
if (!sig)
|
|
87
|
+
return sig;
|
|
88
|
+
const m = sig.match(/^([^(]+)\(([\s\S]*)\)\s*:\s*(.+)$/);
|
|
89
|
+
if (!m)
|
|
90
|
+
return sig;
|
|
91
|
+
const [, name, argsRaw, ret] = m;
|
|
92
|
+
const argChunks = splitTopLevelCommas(argsRaw);
|
|
93
|
+
if (argChunks.length <= OP_ARG_PREVIEW)
|
|
94
|
+
return sig;
|
|
95
|
+
const preview = argChunks
|
|
96
|
+
.slice(0, OP_ARG_PREVIEW)
|
|
97
|
+
.map((a) => a.trim().split(":")[0]?.trim())
|
|
98
|
+
.filter(Boolean);
|
|
99
|
+
const more = argChunks.length - OP_ARG_PREVIEW;
|
|
100
|
+
return `${name.trim()}(${preview.join(", ")} [+${more} more]): ${ret.trim()}`;
|
|
101
|
+
}
|
|
102
|
+
/** Split a comma-separated arg list, respecting nested parens/brackets. */
|
|
103
|
+
function splitTopLevelCommas(s) {
|
|
104
|
+
const out = [];
|
|
105
|
+
let depth = 0;
|
|
106
|
+
let buf = "";
|
|
107
|
+
for (const ch of s) {
|
|
108
|
+
if (ch === "(" || ch === "[" || ch === "{")
|
|
109
|
+
depth++;
|
|
110
|
+
else if (ch === ")" || ch === "]" || ch === "}")
|
|
111
|
+
depth--;
|
|
112
|
+
if (ch === "," && depth === 0) {
|
|
113
|
+
out.push(buf);
|
|
114
|
+
buf = "";
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
buf += ch;
|
|
118
|
+
}
|
|
119
|
+
if (buf.trim())
|
|
120
|
+
out.push(buf);
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Trim the `Arguments:` block inside an operation chunk to the first
|
|
125
|
+
* OP_ARG_PREVIEW entries, replacing the tail with a count marker.
|
|
126
|
+
* Leaves everything outside the block (description, Intent: line) intact.
|
|
127
|
+
*/
|
|
128
|
+
function compactOperationBody(body) {
|
|
129
|
+
// Strip the redundant "Signature: …" line — the compact signature is
|
|
130
|
+
// already rendered in the backtick line above this body.
|
|
131
|
+
const lines = body.split("\n").filter((l) => !l.trimStart().startsWith("Signature:"));
|
|
132
|
+
const argHeaderIdx = lines.findIndex((l) => l.trimStart().startsWith("Arguments:"));
|
|
133
|
+
if (argHeaderIdx < 0)
|
|
134
|
+
return lines.join("\n");
|
|
135
|
+
const before = lines.slice(0, argHeaderIdx + 1);
|
|
136
|
+
// Arg lines start with two-space indent + "- ".
|
|
137
|
+
const afterHeader = lines.slice(argHeaderIdx + 1);
|
|
138
|
+
const argLines = [];
|
|
139
|
+
let nonArgTail = [];
|
|
140
|
+
let inArgs = true;
|
|
141
|
+
for (const l of afterHeader) {
|
|
142
|
+
if (inArgs && /^\s+- /.test(l))
|
|
143
|
+
argLines.push(l);
|
|
144
|
+
else {
|
|
145
|
+
inArgs = false;
|
|
146
|
+
nonArgTail.push(l);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (argLines.length <= OP_ARG_PREVIEW)
|
|
150
|
+
return body;
|
|
151
|
+
const kept = argLines.slice(0, OP_ARG_PREVIEW);
|
|
152
|
+
const rest = argLines.length - OP_ARG_PREVIEW;
|
|
153
|
+
return [
|
|
154
|
+
...before,
|
|
155
|
+
...kept,
|
|
156
|
+
` (+${rest} more args — introspect the operation by exact name for full list)`,
|
|
157
|
+
...nonArgTail,
|
|
158
|
+
].join("\n");
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Extract lexical tokens from the user query for substring matching.
|
|
162
|
+
* Splits on whitespace and snake/camel boundaries, drops stop-ish short words,
|
|
163
|
+
* lowercases for case-insensitive match.
|
|
164
|
+
*/
|
|
165
|
+
function lexicalTokens(query) {
|
|
166
|
+
const raw = query
|
|
167
|
+
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
|
168
|
+
.replace(/[_.,;:!?()[\]{}'"`/\\-]+/g, " ")
|
|
169
|
+
.toLowerCase()
|
|
170
|
+
.split(/\s+/)
|
|
171
|
+
.filter(Boolean);
|
|
172
|
+
// Drop 1-char noise; keep 2+ char tokens. Avoid generic stop words.
|
|
173
|
+
const STOP = new Set(["the", "a", "an", "of", "on", "in", "to", "by", "for", "and", "or", "is", "are"]);
|
|
174
|
+
return raw.filter((t) => t.length >= 2 && !STOP.has(t));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* True when the query looks like a schema identifier (single token, no spaces,
|
|
178
|
+
* probably CamelCase or snake_case). For these queries we treat matches
|
|
179
|
+
* against the full query string as high-signal.
|
|
180
|
+
*/
|
|
181
|
+
function looksLikeSchemaName(query) {
|
|
182
|
+
return /^[A-Za-z][A-Za-z0-9_]*$/.test(query.trim());
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Tiny lexical tie-breaker. Semantic cosine drives ranking; this only nudges
|
|
186
|
+
* exact-name hits when the query IS a name (e.g. "Product", "createSegment")
|
|
187
|
+
* or the user's intent clearly references a specific type.
|
|
188
|
+
*
|
|
189
|
+
* Magnitudes are deliberately small (≤ 0.25 and only for exact name match on
|
|
190
|
+
* a schema-identifier-shaped query) so intent queries like "refund an order"
|
|
191
|
+
* stay semantic-ranked and don't collapse to every chunk whose name happens
|
|
192
|
+
* to contain "order".
|
|
193
|
+
*/
|
|
194
|
+
function lexicalScore(chunk, query, tokens) {
|
|
195
|
+
const name = chunk.name.toLowerCase();
|
|
196
|
+
const parent = (chunk.parent || "").toLowerCase();
|
|
197
|
+
const schemaish = looksLikeSchemaName(query);
|
|
198
|
+
const qLow = query.trim().toLowerCase();
|
|
199
|
+
// Whole-query exact match against name/parent — strongest signal. Only
|
|
200
|
+
// applied when the query looks like a schema identifier; for natural
|
|
201
|
+
// language queries this branch never fires.
|
|
202
|
+
if (schemaish) {
|
|
203
|
+
if (name === qLow)
|
|
204
|
+
return 0.25;
|
|
205
|
+
if (parent === qLow)
|
|
206
|
+
return 0.15;
|
|
207
|
+
// Substring on the full query (handles "createSegment" matching a chunk
|
|
208
|
+
// literally named "createSegment" even if we also have `createdAt` around).
|
|
209
|
+
if (name.includes(qLow))
|
|
210
|
+
return 0.10;
|
|
211
|
+
if (parent.includes(qLow))
|
|
212
|
+
return 0.05;
|
|
213
|
+
}
|
|
214
|
+
if (tokens.length === 0)
|
|
215
|
+
return 0;
|
|
216
|
+
const singleToken = tokens.length === 1;
|
|
217
|
+
let best = 0;
|
|
218
|
+
for (const t of tokens) {
|
|
219
|
+
if (name === t) {
|
|
220
|
+
best = Math.max(best, singleToken ? 0.15 : 0.04);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (parent === t) {
|
|
224
|
+
best = Math.max(best, singleToken ? 0.08 : 0.02);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (singleToken) {
|
|
228
|
+
if (name.includes(t)) {
|
|
229
|
+
best = Math.max(best, 0.05);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (parent.includes(t)) {
|
|
233
|
+
best = Math.max(best, 0.02);
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return best;
|
|
239
|
+
}
|
|
240
|
+
export async function semanticSearch(input) {
|
|
241
|
+
const query = (input.query ?? "").trim();
|
|
242
|
+
if (query === "") {
|
|
243
|
+
return {
|
|
244
|
+
content: [{
|
|
245
|
+
type: "text",
|
|
246
|
+
text: "Provide a search query describing what you want to find (e.g. \"customers who spent more than 100\", \"out of stock products\", \"create a segment for returning buyers\").",
|
|
247
|
+
}],
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
loadCorpus();
|
|
251
|
+
const model = await ensureModel();
|
|
252
|
+
const out = await model([QUERY_PREFIX + query], { pooling: "mean", normalize: true });
|
|
253
|
+
const qvec = out.data;
|
|
254
|
+
const limit = Math.min(Math.max(input.limit ?? 8, 1), 20);
|
|
255
|
+
const allowKinds = input.kinds && input.kinds.length ? new Set(input.kinds) : null;
|
|
256
|
+
const tokens = lexicalTokens(query);
|
|
257
|
+
// Hybrid scoring: semantic cosine + lexical name/parent-match boost.
|
|
258
|
+
// Widen the top-N during collection so a late lexical boost can still
|
|
259
|
+
// surface a result the pure-semantic heap would have discarded.
|
|
260
|
+
const pool = Math.max(limit * 4, 32);
|
|
261
|
+
const top = [];
|
|
262
|
+
for (let i = 0; i < chunkCount; i++) {
|
|
263
|
+
if (allowKinds && !allowKinds.has(metadata[i].kind))
|
|
264
|
+
continue;
|
|
265
|
+
const sem = dot(qvec, 0, vectors, i * EMBED_DIM, EMBED_DIM);
|
|
266
|
+
const lex = lexicalScore(metadata[i], query, tokens);
|
|
267
|
+
const score = sem + lex;
|
|
268
|
+
if (top.length < pool) {
|
|
269
|
+
top.push({ idx: i, sem, lex, score });
|
|
270
|
+
if (top.length === pool)
|
|
271
|
+
top.sort((a, b) => a.score - b.score);
|
|
272
|
+
}
|
|
273
|
+
else if (score > top[0].score) {
|
|
274
|
+
top[0] = { idx: i, sem, lex, score };
|
|
275
|
+
top.sort((a, b) => a.score - b.score);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
top.sort((a, b) => b.score - a.score);
|
|
279
|
+
top.length = Math.min(top.length, limit);
|
|
280
|
+
if (top.length === 0) {
|
|
281
|
+
return {
|
|
282
|
+
content: [{ type: "text", text: `No matches for "${query}".` }],
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
const lines = [
|
|
286
|
+
`## Top ${top.length} semantic matches for "${query}"`,
|
|
287
|
+
"",
|
|
288
|
+
];
|
|
289
|
+
for (const { idx, sem, lex, score } of top) {
|
|
290
|
+
const m = metadata[idx];
|
|
291
|
+
const lexNote = lex > 0 ? ` (sem ${sem.toFixed(3)} + lex ${lex.toFixed(2)})` : "";
|
|
292
|
+
lines.push(`### [${m.kind}] ${m.name}${m.parent ? ` (on ${m.parent})` : ""} — score ${score.toFixed(3)}${lexNote}`);
|
|
293
|
+
// Operation chunks carry the full list-query signature with all 20+ args
|
|
294
|
+
// inline — that's ~400 tokens of noise when only the first few matter.
|
|
295
|
+
// Truncate both the signature and the Arguments block to the 8 most
|
|
296
|
+
// relevant args; the agent can introspect the operation by exact name
|
|
297
|
+
// if they need the full list.
|
|
298
|
+
const sig = m.kind === "operation" ? compactSignature(m.signature) : m.signature;
|
|
299
|
+
if (sig)
|
|
300
|
+
lines.push(`\`${sig}\``);
|
|
301
|
+
const body = m.text.split("\n").slice(1).join("\n").trim();
|
|
302
|
+
const renderedBody = m.kind === "operation" ? compactOperationBody(body) : body;
|
|
303
|
+
if (renderedBody)
|
|
304
|
+
lines.push(renderedBody);
|
|
305
|
+
lines.push("");
|
|
306
|
+
}
|
|
307
|
+
lines.push("> NEXT: use introspect_graphql_schema with the exact type/field name for full details, then validate_graphql_codeblocks before executing.");
|
|
308
|
+
return {
|
|
309
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=semantic-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/tools/semantic-search.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudcart/dev-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for CloudCart GraphQL APIs
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "MCP server for CloudCart GraphQL APIs — helps AI assistants write correct queries and mutations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -11,13 +11,15 @@
|
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"dev": "tsc --watch",
|
|
13
13
|
"generate-schema": "tsx scripts/generate-schema.ts",
|
|
14
|
-
"start": "node dist/index.js"
|
|
14
|
+
"start": "node dist/index.js",
|
|
15
|
+
"build-embeddings": "tsx scripts/build-embeddings.ts"
|
|
15
16
|
},
|
|
16
17
|
"files": [
|
|
17
18
|
"dist",
|
|
18
19
|
"data"
|
|
19
20
|
],
|
|
20
21
|
"dependencies": {
|
|
22
|
+
"@huggingface/transformers": "^4.1.0",
|
|
21
23
|
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
22
24
|
"graphql": "^16.13.0",
|
|
23
25
|
"zod": "^3.24.0"
|