@hydradb/mcp 1.2.1 → 1.3.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 +141 -0
- package/README.md +185 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.js +40 -3
- package/dist/config.js.map +1 -1
- package/dist/cypher.d.ts +51 -0
- package/dist/cypher.js +145 -0
- package/dist/cypher.js.map +1 -0
- package/dist/descriptions.d.ts +60 -0
- package/dist/descriptions.js +159 -1
- package/dist/descriptions.js.map +1 -1
- package/dist/http-config.d.ts +190 -0
- package/dist/http-config.js +253 -0
- package/dist/http-config.js.map +1 -0
- package/dist/http.d.ts +31 -0
- package/dist/http.js +427 -0
- package/dist/http.js.map +1 -0
- package/dist/hydra/client.d.ts +69 -4
- package/dist/hydra/client.js +84 -19
- package/dist/hydra/client.js.map +1 -1
- package/dist/hydra/errors.d.ts +14 -0
- package/dist/hydra/errors.js +16 -0
- package/dist/hydra/errors.js.map +1 -1
- package/dist/hydra/graph.d.ts +82 -0
- package/dist/hydra/graph.js +217 -0
- package/dist/hydra/graph.js.map +1 -0
- package/dist/hydra/index.d.ts +4 -1
- package/dist/hydra/index.js +3 -1
- package/dist/hydra/index.js.map +1 -1
- package/dist/oauth.d.ts +109 -0
- package/dist/oauth.js +228 -0
- package/dist/oauth.js.map +1 -0
- package/dist/server.d.ts +15 -1
- package/dist/server.js +440 -12
- package/dist/server.js.map +1 -1
- package/dist/tool-names.d.ts +13 -0
- package/dist/tool-names.js +26 -0
- package/dist/tool-names.js.map +1 -1
- package/package.json +10 -2
package/dist/cypher.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rendering and local limits for the BYOG (Bring Your Own Graph) tool.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately contains NO Cypher analysis. An earlier version lexed the query
|
|
5
|
+
* to classify reads vs writes and to pre-reject constructs the server refuses,
|
|
6
|
+
* which meant a second, worse implementation of the server's own rules living
|
|
7
|
+
* in a client: it could only ever agree with the server or be wrong, and being
|
|
8
|
+
* wrong meant refusing a query HydraDB would have run.
|
|
9
|
+
*
|
|
10
|
+
* The server is the authority on what Cypher is valid and permitted. It rejects
|
|
11
|
+
* unsupported constructs before executing anything — verified: a query mixing
|
|
12
|
+
* CREATE with a procedure call leaves the node count unchanged — and its
|
|
13
|
+
* messages are more specific than the ones this file used to produce.
|
|
14
|
+
*
|
|
15
|
+
* What is left is the work a client genuinely owns: turning the server's row
|
|
16
|
+
* objects into something readable, and the two limits that are cheaper to check
|
|
17
|
+
* here than to discover from a remote error.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* The documented request-body ceiling for `POST /byog/query`.
|
|
21
|
+
*
|
|
22
|
+
* Enforced before the request goes out. The server answers an oversize body
|
|
23
|
+
* with 413 — but only after the whole thing has been uploaded, which on a bulk
|
|
24
|
+
* load is the slowest possible way to learn the batch was too big.
|
|
25
|
+
*/
|
|
26
|
+
export const MAX_BODY_BYTES = 256 * 1024;
|
|
27
|
+
/** Collection names the server accepts. Rejecting locally names the rule. */
|
|
28
|
+
export const COLLECTION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
|
|
29
|
+
// --- Result rendering ---
|
|
30
|
+
/**
|
|
31
|
+
* The renderer-added keys on a returned node or relationship.
|
|
32
|
+
*
|
|
33
|
+
* These are added by HydraDB's renderer, not stored by the user, so they are
|
|
34
|
+
* separated from the real properties when rendering. A stored property with one
|
|
35
|
+
* of these names is shadowed in the response — which is worth knowing but is
|
|
36
|
+
* the server's behaviour, not something this file can fix.
|
|
37
|
+
*/
|
|
38
|
+
const NODE_KEYS = ["id", "labels"];
|
|
39
|
+
const REL_KEYS = ["id", "relation", "source_node_id", "target_node_id"];
|
|
40
|
+
function isRecord(value) {
|
|
41
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
42
|
+
}
|
|
43
|
+
function isNode(value) {
|
|
44
|
+
return isRecord(value) && "labels" in value && "id" in value;
|
|
45
|
+
}
|
|
46
|
+
function isRelationship(value) {
|
|
47
|
+
return isRecord(value) && "relation" in value && "source_node_id" in value;
|
|
48
|
+
}
|
|
49
|
+
function isPath(value) {
|
|
50
|
+
return (isRecord(value) &&
|
|
51
|
+
Array.isArray(value.nodes) &&
|
|
52
|
+
Array.isArray(value.edges));
|
|
53
|
+
}
|
|
54
|
+
function properties(value, reserved) {
|
|
55
|
+
const out = {};
|
|
56
|
+
for (const [key, val] of Object.entries(value)) {
|
|
57
|
+
if (!reserved.includes(key))
|
|
58
|
+
out[key] = val;
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function inline(value) {
|
|
63
|
+
if (value === null)
|
|
64
|
+
return "null";
|
|
65
|
+
if (typeof value === "string")
|
|
66
|
+
return value;
|
|
67
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
68
|
+
return String(value);
|
|
69
|
+
try {
|
|
70
|
+
return JSON.stringify(value) ?? String(value);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return String(value);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function propsToString(props) {
|
|
77
|
+
const entries = Object.entries(props);
|
|
78
|
+
if (entries.length === 0)
|
|
79
|
+
return "";
|
|
80
|
+
return ` {${entries.map(([k, v]) => `${k}: ${inline(v)}`).join(", ")}}`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* One returned value, rendered the way a graph user reads it.
|
|
84
|
+
*
|
|
85
|
+
* A node comes back as a flat object mixing its properties with `id` and
|
|
86
|
+
* `labels`; dumping that as raw JSON makes the caller do the separating. This
|
|
87
|
+
* renders `(:Person {name: "Alice"})` instead, which is both shorter and the
|
|
88
|
+
* notation the query was written in.
|
|
89
|
+
*/
|
|
90
|
+
export function renderValue(value) {
|
|
91
|
+
if (isPath(value)) {
|
|
92
|
+
const nodes = value.nodes.map((n) => renderValue(n));
|
|
93
|
+
const edges = value.edges.map((e) => isRelationship(e) ? String(e.relation) : "?");
|
|
94
|
+
// Interleave nodes and edges in traversal order: (a)-[R]->(b)-[S]->(c).
|
|
95
|
+
const parts = [];
|
|
96
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
97
|
+
parts.push(nodes[i] ?? "");
|
|
98
|
+
if (i < edges.length)
|
|
99
|
+
parts.push(`-[:${edges[i]}]->`);
|
|
100
|
+
}
|
|
101
|
+
return parts.join("");
|
|
102
|
+
}
|
|
103
|
+
if (isNode(value)) {
|
|
104
|
+
const labels = Array.isArray(value.labels)
|
|
105
|
+
? value.labels.map((l) => `:${String(l)}`).join("")
|
|
106
|
+
: "";
|
|
107
|
+
return `(${labels}${propsToString(properties(value, NODE_KEYS))})`;
|
|
108
|
+
}
|
|
109
|
+
if (isRelationship(value)) {
|
|
110
|
+
return (`[${value.source_node_id}]-[:${value.relation}` +
|
|
111
|
+
`${propsToString(properties(value, REL_KEYS))}]->[${value.target_node_id}]`);
|
|
112
|
+
}
|
|
113
|
+
return inline(value);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Rows as a table, bounded.
|
|
117
|
+
*
|
|
118
|
+
* A traversal can return far more than the caller can use, and unlike the
|
|
119
|
+
* memory tools there is no server-side relevance ranking to lean on — the query
|
|
120
|
+
* asked for exactly this. So the ceiling is on the rendering, and what was
|
|
121
|
+
* dropped is stated rather than silently cut.
|
|
122
|
+
*/
|
|
123
|
+
export function renderRows(rows, opts = {}) {
|
|
124
|
+
const maxRows = opts.maxRows ?? 100;
|
|
125
|
+
const maxChars = opts.maxChars ?? 20000;
|
|
126
|
+
if (rows.length === 0)
|
|
127
|
+
return "(0 rows)";
|
|
128
|
+
const shown = rows.slice(0, maxRows);
|
|
129
|
+
const columns = [...new Set(shown.flatMap((row) => Object.keys(row)))];
|
|
130
|
+
const lines = [];
|
|
131
|
+
for (const [index, row] of shown.entries()) {
|
|
132
|
+
const cells = columns.map((col) => col in row ? `${col}: ${renderValue(row[col])}` : `${col}: —`);
|
|
133
|
+
lines.push(`${index + 1}. ${cells.join(" | ")}`);
|
|
134
|
+
}
|
|
135
|
+
let body = lines.join("\n");
|
|
136
|
+
if (body.length > maxChars) {
|
|
137
|
+
body = `${body.slice(0, maxChars)}\n[truncated: ${body.length} chars of rendered rows]`;
|
|
138
|
+
}
|
|
139
|
+
const omitted = rows.length - shown.length;
|
|
140
|
+
const footer = omitted > 0
|
|
141
|
+
? `\n\n[${omitted} more row(s) not shown — add SKIP/LIMIT to page through them]`
|
|
142
|
+
: "";
|
|
143
|
+
return `${body}${footer}`;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=cypher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypher.js","sourceRoot":"","sources":["../src/cypher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,CAAC;AAEzC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAErE,2BAA2B;AAE3B;;;;;;;GAOG;AACH,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAU,CAAC;AAC5C,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,CAAU,CAAC;AAIjF,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC7B,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC;AAC9D,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,IAAI,KAAK,IAAI,gBAAgB,IAAI,KAAK,CAAC;AAC5E,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC7B,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,OAAO,CAAE,KAAa,CAAC,KAAK,CAAC;QACnC,KAAK,CAAC,OAAO,CAAE,KAAa,CAAC,KAAK,CAAC,CACnC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAU,EAAE,QAA2B;IAC1D,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC7B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,KAAU;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACzE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAC5C,CAAC;QACF,wEAAwE;QACxE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACzC,CAAC,CAAE,KAAK,CAAC,MAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,CAAC,CAAC,EAAE,CAAC;QACN,OAAO,IAAI,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC;IACpE,CAAC;IAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CACN,IAAI,KAAK,CAAC,cAAc,OAAO,KAAK,CAAC,QAAQ,EAAE;YAC/C,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,cAAc,GAAG,CAC3E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACzB,IAAW,EACX,OAAgD,EAAE;IAElD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAM,CAAC;IAEzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAC7D,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB,IAAI,CAAC,MAAM,0BAA0B,CAAC;IACzF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,MAAM,MAAM,GACX,OAAO,GAAG,CAAC;QACV,CAAC,CAAC,QAAQ,OAAO,+DAA+D;QAChF,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAC3B,CAAC"}
|
package/dist/descriptions.d.ts
CHANGED
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
* replacement so the model prefers the new name.
|
|
8
8
|
*/
|
|
9
9
|
export declare const TOOL_DESCRIPTIONS: {
|
|
10
|
+
readonly hydradb_databases: {
|
|
11
|
+
readonly title: "List Hydra DB Databases";
|
|
12
|
+
readonly description: "List the databases this connection can address, with the default marked. Use it before passing `database` to another tool, when the user asks which databases exist, or when a call was refused for naming a database this connection is confined to. If the list has one entry, that is the only database this connection may use.";
|
|
13
|
+
readonly params: {};
|
|
14
|
+
};
|
|
10
15
|
readonly hydradb_query: {
|
|
11
16
|
readonly title: "Query Hydra DB";
|
|
12
17
|
readonly description: "Search Hydra DB for anything the user has stored: memories (facts, preferences, decisions, past conversations) and ingested knowledge sources (documents, files, playbooks). Returns matching chunks with their source id, a relevance score, and knowledge-graph context — the entity paths and relations that connect facts across separate sources.\n\nCALL THIS BEFORE ANSWERING whenever the answer could depend on the user's history, preferences, prior decisions, project details, or a document they have ingested — including when you are merely unsure. A query that returns nothing costs one call; answering from a blank slate costs the user a correction.\n\nSearches both families by default. Every result carries `[id: …]` — pass it to hydradb_inspect for the full source, or to hydradb_delete to remove it.\n\nExamples:\n {\"query\": \"how does the user prefer code review feedback\"}\n {\"query\": \"postgres connection pooling decision\", \"kind\": \"knowledge\"}\n {\"query\": \"deploy checklist\", \"mode\": \"fast\", \"max_results\": 5}";
|
|
@@ -21,6 +26,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
21
26
|
readonly source_ids: string;
|
|
22
27
|
readonly metadata_filters: string;
|
|
23
28
|
readonly num_related_chunks: string;
|
|
29
|
+
readonly database: string;
|
|
30
|
+
readonly collection: string;
|
|
24
31
|
};
|
|
25
32
|
};
|
|
26
33
|
readonly hydradb_ingest: {
|
|
@@ -38,6 +45,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
38
45
|
readonly observation_date: string;
|
|
39
46
|
readonly turns: string;
|
|
40
47
|
readonly user_name: string;
|
|
48
|
+
readonly database: string;
|
|
49
|
+
readonly collection: string;
|
|
41
50
|
};
|
|
42
51
|
};
|
|
43
52
|
readonly hydradb_list: {
|
|
@@ -48,6 +57,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
48
57
|
readonly source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.";
|
|
49
58
|
readonly page: string;
|
|
50
59
|
readonly page_size: string;
|
|
60
|
+
readonly database: string;
|
|
61
|
+
readonly collection: string;
|
|
51
62
|
};
|
|
52
63
|
};
|
|
53
64
|
readonly hydradb_inspect: {
|
|
@@ -59,6 +70,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
59
70
|
readonly offset: string;
|
|
60
71
|
readonly limit: string;
|
|
61
72
|
readonly expiry_seconds: string;
|
|
73
|
+
readonly database: string;
|
|
74
|
+
readonly collection: string;
|
|
62
75
|
};
|
|
63
76
|
};
|
|
64
77
|
readonly hydradb_delete: {
|
|
@@ -68,6 +81,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
68
81
|
readonly ids: string;
|
|
69
82
|
readonly id: "A single ID to delete. Prefer `ids` when removing more than one.";
|
|
70
83
|
readonly kind: "Which context family the ID belongs to: 'memory' or 'knowledge' (default: 'memory')";
|
|
84
|
+
readonly database: string;
|
|
85
|
+
readonly collection: string;
|
|
71
86
|
};
|
|
72
87
|
};
|
|
73
88
|
readonly hydradb_status: {
|
|
@@ -75,6 +90,35 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
75
90
|
readonly description: string;
|
|
76
91
|
readonly params: {
|
|
77
92
|
readonly ids: "The source IDs to check, as returned by hydradb_ingest.";
|
|
93
|
+
readonly database: string;
|
|
94
|
+
readonly collection: string;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
readonly hydradb_graph_query: {
|
|
98
|
+
readonly title: "Query Graph (Cypher)";
|
|
99
|
+
readonly description: string;
|
|
100
|
+
readonly params: {
|
|
101
|
+
readonly query: string;
|
|
102
|
+
readonly params: string;
|
|
103
|
+
readonly database: string;
|
|
104
|
+
readonly collection: string;
|
|
105
|
+
readonly max_rows: string;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
readonly hydradb_graph_collections: {
|
|
109
|
+
readonly title: "List Graph Collections";
|
|
110
|
+
readonly description: "List the graph collections in a graph database. Each collection is an independent graph with its own nodes, relationships and schema.\n\nUse it to discover what exists before querying, or to confirm a write created the collection you expected. Collections auto-create on first write, so a name missing here has simply never been written to.";
|
|
111
|
+
readonly params: {
|
|
112
|
+
readonly database: string;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
readonly hydradb_graph_admin: {
|
|
116
|
+
readonly title: "Manage Graph Databases";
|
|
117
|
+
readonly description: string;
|
|
118
|
+
readonly params: {
|
|
119
|
+
readonly action: string;
|
|
120
|
+
readonly database: string;
|
|
121
|
+
readonly collection: "The collection to drop. Required for \"drop_collection\" and ignored otherwise.";
|
|
78
122
|
};
|
|
79
123
|
};
|
|
80
124
|
readonly hydra_db_search: {
|
|
@@ -86,6 +130,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
86
130
|
readonly max_results: string;
|
|
87
131
|
readonly mode: string;
|
|
88
132
|
readonly graph_context: string;
|
|
133
|
+
readonly database: string;
|
|
134
|
+
readonly collection: string;
|
|
89
135
|
};
|
|
90
136
|
};
|
|
91
137
|
readonly hydra_db_store: {
|
|
@@ -100,6 +146,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
100
146
|
readonly infer: string;
|
|
101
147
|
readonly is_markdown: string;
|
|
102
148
|
readonly overwrite: string;
|
|
149
|
+
readonly database: string;
|
|
150
|
+
readonly collection: string;
|
|
103
151
|
};
|
|
104
152
|
};
|
|
105
153
|
readonly hydra_db_ingest_conversation: {
|
|
@@ -109,17 +157,25 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
109
157
|
readonly turns: "Array of conversation turns, each with a 'user' and 'assistant' field";
|
|
110
158
|
readonly source_id: "Source identifier to group all turns from the same session together";
|
|
111
159
|
readonly user_name: string;
|
|
160
|
+
readonly database: string;
|
|
161
|
+
readonly collection: string;
|
|
112
162
|
};
|
|
113
163
|
};
|
|
114
164
|
readonly hydra_db_list_memories: {
|
|
115
165
|
readonly title: "List Memories (deprecated)";
|
|
116
166
|
readonly description: string;
|
|
167
|
+
readonly params: {
|
|
168
|
+
readonly database: string;
|
|
169
|
+
readonly collection: string;
|
|
170
|
+
};
|
|
117
171
|
};
|
|
118
172
|
readonly hydra_db_list_sources: {
|
|
119
173
|
readonly title: "List Sources (deprecated)";
|
|
120
174
|
readonly description: string;
|
|
121
175
|
readonly params: {
|
|
122
176
|
readonly source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.";
|
|
177
|
+
readonly database: string;
|
|
178
|
+
readonly collection: string;
|
|
123
179
|
};
|
|
124
180
|
};
|
|
125
181
|
readonly hydra_db_fetch_content: {
|
|
@@ -130,6 +186,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
130
186
|
readonly mode: string;
|
|
131
187
|
readonly offset: string;
|
|
132
188
|
readonly limit: string;
|
|
189
|
+
readonly database: string;
|
|
190
|
+
readonly collection: string;
|
|
133
191
|
};
|
|
134
192
|
};
|
|
135
193
|
readonly hydra_db_delete_memory: {
|
|
@@ -137,6 +195,8 @@ export declare const TOOL_DESCRIPTIONS: {
|
|
|
137
195
|
readonly description: string;
|
|
138
196
|
readonly params: {
|
|
139
197
|
readonly memory_id: "The ID of the memory to delete";
|
|
198
|
+
readonly database: string;
|
|
199
|
+
readonly collection: string;
|
|
140
200
|
};
|
|
141
201
|
};
|
|
142
202
|
};
|
package/dist/descriptions.js
CHANGED
|
@@ -117,6 +117,39 @@ const PARAM = {
|
|
|
117
117
|
"were actually removed. This is irreversible.",
|
|
118
118
|
delete_kind: "Which context family the ID belongs to: 'memory' or 'knowledge' (default: 'memory')",
|
|
119
119
|
memory_id: "The ID of the memory to delete",
|
|
120
|
+
database: "Database (tenant) to target for this request. Defaults to the database this " +
|
|
121
|
+
"connection was set up with. Pass explicitly to work in another of the user's " +
|
|
122
|
+
"databases; hydradb_databases lists them. A connection the user confined to one " +
|
|
123
|
+
"database refuses any other name.",
|
|
124
|
+
collection: "Collection (sub-tenant) to target for this request. Defaults to the server's configured " +
|
|
125
|
+
"collection (or 'hydra-db-mcp'). Pass explicitly to switch collection scope per request.",
|
|
126
|
+
};
|
|
127
|
+
/** Parameter blurbs for the BYOG graph tools. */
|
|
128
|
+
const GRAPH_PARAM = {
|
|
129
|
+
query: "The Cypher to run — a read (MATCH/RETURN, traversal, aggregation) or a write " +
|
|
130
|
+
"(CREATE, MERGE, SET, DELETE, REMOVE, FOREACH, index statements). Write data as " +
|
|
131
|
+
"$parameters, not as string-concatenated literals, and alias every returned " +
|
|
132
|
+
"expression (`RETURN n.name AS name`). Prefer MERGE on a key you own over bare " +
|
|
133
|
+
"CREATE so a retry cannot duplicate. Deletes are irreversible.",
|
|
134
|
+
params: "Values referenced by $name in the query, as {name: value}. Always pass user data " +
|
|
135
|
+
"this way rather than building it into the query text: parameters are bound safely " +
|
|
136
|
+
"and keep query plans cacheable. Lists work too — `UNWIND $rows AS row` with " +
|
|
137
|
+
'{"rows": [...]} is the supported way to write many nodes in one call.',
|
|
138
|
+
database: "Graph database to run against. Defaults to the server's configured graph " +
|
|
139
|
+
"database. This is a DIFFERENT namespace from the memory/knowledge database — a " +
|
|
140
|
+
"query aimed at the wrong one reads an empty graph rather than failing.",
|
|
141
|
+
collection: "Graph collection to run against. Defaults to the server's configured graph " +
|
|
142
|
+
"collection. Each collection is an independent graph; a query sees exactly one " +
|
|
143
|
+
"and never another's data.",
|
|
144
|
+
max_rows: "Maximum rows to render in the response (default: 100). Caps what reaches the " +
|
|
145
|
+
"conversation, not what the query computes — to actually limit the work, put " +
|
|
146
|
+
"`LIMIT` in the Cypher.",
|
|
147
|
+
action: 'Which operation to perform: "create_database", "drop_collection", or ' +
|
|
148
|
+
'"drop_database". The two drops are irreversible.',
|
|
149
|
+
admin_database: "The graph database to create or drop, or the one containing the collection " +
|
|
150
|
+
"being dropped. Defaults to the server's configured graph database — pass it " +
|
|
151
|
+
"explicitly for any drop, so the target is stated rather than inherited.",
|
|
152
|
+
admin_collection: 'The collection to drop. Required for "drop_collection" and ignored otherwise.',
|
|
120
153
|
};
|
|
121
154
|
function deprecated(alias, body) {
|
|
122
155
|
return `DEPRECATED — use \`${ALIAS_REPLACEMENTS[alias]}\` instead. ${body}`;
|
|
@@ -161,8 +194,64 @@ const INSPECT_BODY = `Fetch the full original content of ONE stored item by its
|
|
|
161
194
|
The id is the value shown as \`[id: …]\` in hydradb_query results and in [brackets] in hydradb_list output. Ids are not guessable — take one from those tools rather than constructing it.
|
|
162
195
|
|
|
163
196
|
Long sources come back in slices; the response says where it stopped and what offset continues it. Binary sources are never inlined — you get their type and size, and \`mode: "url"\` returns a download link.`;
|
|
197
|
+
/**
|
|
198
|
+
* The dialect notes every graph tool needs to state.
|
|
199
|
+
*
|
|
200
|
+
* These are not general Cypher advice — each one is a construct that a model
|
|
201
|
+
* trained on Neo4j will reach for and that HydraDB REJECTS before running
|
|
202
|
+
* anything. A rejected query fails identically on retry, so the only way out is
|
|
203
|
+
* knowing the rule beforehand.
|
|
204
|
+
*/
|
|
205
|
+
const CYPHER_DIALECT = `HydraDB runs your Cypher verbatim and never rewrites it. Near-complete openCypher, with these differences from Neo4j:
|
|
206
|
+
- Procedure calls are rejected — no \`CALL db.*\`, no \`CALL apoc.*\`. \`CALL { ... }\` subqueries ARE supported. To learn a collection's structure, query it: \`MATCH (n) UNWIND labels(n) AS l RETURN l, count(*) AS c ORDER BY l\`.
|
|
207
|
+
- \`LOAD CSV\` is rejected. Pass data through \`params\`: \`UNWIND $rows AS row MERGE (n:Thing {id: row.id}) SET n += row\`.
|
|
208
|
+
- Existence checks are bare pattern predicates — \`WHERE (p)-[:KNOWS]->()\`. The \`EXISTS { ... }\` block and the \`exists()\` function are not accepted.
|
|
209
|
+
- \`shortestPath\` goes in RETURN or WITH (not \`MATCH p = ...\`) and the traversal must be directed.
|
|
210
|
+
- Do NOT use \`EXPLAIN\`/\`PROFILE\` to preview a query: they EXECUTE it rather than planning it.`;
|
|
211
|
+
const GRAPH_SCOPE = `Queries run against exactly ONE collection — collections never see each other's data, so \`MATCH (n) RETURN n\` returns that collection's nodes and nothing else. \`database\` and \`collection\` default to the server's configured graph scope; pass them to target another.`;
|
|
212
|
+
const GRAPH_QUERY_BODY = `Run Cypher against a HydraDB graph collection — reads and writes alike. This is the graph database product: property graphs you model and own end to end, entirely separate from the memory/knowledge corpora that ${TOOL_NAMES.QUERY} searches.
|
|
213
|
+
|
|
214
|
+
Reads are what a graph is for — multi-hop traversal, variable-length paths, neighbourhood expansion, shortest paths, aggregation over relationships:
|
|
215
|
+
MATCH (a:Person {name:$n})-[:KNOWS*1..4]->(reach) RETURN DISTINCT reach.name AS name
|
|
216
|
+
MATCH (p:Person {name:$n})-[r]-(nbr) RETURN type(r) AS rel, nbr.name AS neighbor
|
|
217
|
+
MATCH (a:Person {name:$x}),(b:Person {name:$y}) RETURN shortestPath((a)-[:KNOWS*..8]->(b)) AS path
|
|
218
|
+
|
|
219
|
+
Writes go through this same tool — CREATE, MERGE, SET, DELETE, REMOVE, FOREACH, and index management:
|
|
220
|
+
UNWIND $rows AS row MERGE (p:Person {ext_id: row.ext_id}) SET p += row
|
|
221
|
+
|
|
222
|
+
THIS TOOL CAN DESTROY DATA. \`MATCH (n:Person) DELETE n\` empties a label and \`DETACH DELETE\` also removes its relationships; neither can be undone and there is no trash. Confirm with the user before running anything destructive they did not explicitly ask for, and prefer MERGE on a key you own over bare CREATE — a retried CREATE duplicates nodes where a MERGE does not.
|
|
223
|
+
|
|
224
|
+
Always pass user data through \`params\` rather than building it into the query string: parameters are bound safely and keep query plans cacheable.
|
|
225
|
+
|
|
226
|
+
ALIAS EVERYTHING you intend to read — \`RETURN n.name AS name\`. Unaliased expressions are keyed by their raw expression text.
|
|
227
|
+
|
|
228
|
+
Large results are silently truncated server-side, so paginate anything that could be big: \`ORDER BY ... SKIP $offset LIMIT $limit\`. Without ORDER BY, the rows you lose are arbitrary.
|
|
229
|
+
|
|
230
|
+
Collections auto-create on first write, so there is no create-collection call. A write with no RETURN succeeds with zero rows — that is success, not failure. Requests are capped at 256 KiB, so batch bulk loads (~500 rows per call is a good start).
|
|
231
|
+
|
|
232
|
+
${GRAPH_SCOPE}
|
|
233
|
+
|
|
234
|
+
${CYPHER_DIALECT}`;
|
|
235
|
+
const GRAPH_COLLECTIONS_BODY = `List the graph collections in a graph database. Each collection is an independent graph with its own nodes, relationships and schema.
|
|
236
|
+
|
|
237
|
+
Use it to discover what exists before querying, or to confirm a write created the collection you expected. Collections auto-create on first write, so a name missing here has simply never been written to.`;
|
|
238
|
+
const GRAPH_ADMIN_BODY = `Manage graph databases and collections. Pick one \`action\`:
|
|
239
|
+
|
|
240
|
+
"create_database" — create a graph database. Ready immediately, no provisioning wait. Fails if the name already exists.
|
|
241
|
+
"drop_collection" — drop ONE collection and all its data. Idempotent: dropping a collection that does not exist succeeds.
|
|
242
|
+
"drop_database" — drop EVERY collection in the database, and the database itself if it was created as a graph database.
|
|
243
|
+
|
|
244
|
+
The two drops are IRREVERSIBLE and there is no trash. Confirm with the user before either, and never infer one from a vague instruction — "clean up my graph" authorises nothing until the user has seen ${TOOL_NAMES.GRAPH_COLLECTIONS} output and named what should go.
|
|
245
|
+
|
|
246
|
+
There is no create-collection action: collections come into existence on their first write via ${TOOL_NAMES.GRAPH_QUERY}.`;
|
|
247
|
+
const DATABASES_BODY = `List the databases this connection can address, with the default marked. Use it before passing \`database\` to another tool, when the user asks which databases exist, or when a call was refused for naming a database this connection is confined to. If the list has one entry, that is the only database this connection may use.`;
|
|
164
248
|
export const TOOL_DESCRIPTIONS = {
|
|
165
249
|
// --- Canonical tools (CONTRACT §3) ---
|
|
250
|
+
[TOOL_NAMES.DATABASES]: {
|
|
251
|
+
title: "List Hydra DB Databases",
|
|
252
|
+
description: DATABASES_BODY,
|
|
253
|
+
params: {},
|
|
254
|
+
},
|
|
166
255
|
[TOOL_NAMES.QUERY]: {
|
|
167
256
|
title: "Query Hydra DB",
|
|
168
257
|
description: SEARCH_BODY,
|
|
@@ -177,6 +266,8 @@ export const TOOL_DESCRIPTIONS = {
|
|
|
177
266
|
source_ids: PARAM.query_source_ids,
|
|
178
267
|
metadata_filters: PARAM.metadata_filters,
|
|
179
268
|
num_related_chunks: PARAM.num_related_chunks,
|
|
269
|
+
database: PARAM.database,
|
|
270
|
+
collection: PARAM.collection,
|
|
180
271
|
},
|
|
181
272
|
},
|
|
182
273
|
[TOOL_NAMES.INGEST]: {
|
|
@@ -201,6 +292,8 @@ export const TOOL_DESCRIPTIONS = {
|
|
|
201
292
|
"neither. Use this when the exchange itself is worth preserving; when only the " +
|
|
202
293
|
"conclusion matters, prefer `text` with the distilled fact.",
|
|
203
294
|
user_name: PARAM.user_name,
|
|
295
|
+
database: PARAM.database,
|
|
296
|
+
collection: PARAM.collection,
|
|
204
297
|
},
|
|
205
298
|
},
|
|
206
299
|
[TOOL_NAMES.LIST]: {
|
|
@@ -217,6 +310,8 @@ Memory rows come back as [id] content. Knowledge rows as [id] — title (type),
|
|
|
217
310
|
source_ids: PARAM.source_ids,
|
|
218
311
|
page: PARAM.page,
|
|
219
312
|
page_size: PARAM.page_size,
|
|
313
|
+
database: PARAM.database,
|
|
314
|
+
collection: PARAM.collection,
|
|
220
315
|
},
|
|
221
316
|
},
|
|
222
317
|
[TOOL_NAMES.INSPECT]: {
|
|
@@ -228,6 +323,8 @@ Memory rows come back as [id] content. Knowledge rows as [id] — title (type),
|
|
|
228
323
|
offset: PARAM.fetch_offset,
|
|
229
324
|
limit: PARAM.fetch_limit,
|
|
230
325
|
expiry_seconds: PARAM.expiry_seconds,
|
|
326
|
+
database: PARAM.database,
|
|
327
|
+
collection: PARAM.collection,
|
|
231
328
|
},
|
|
232
329
|
},
|
|
233
330
|
[TOOL_NAMES.DELETE]: {
|
|
@@ -241,6 +338,8 @@ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with
|
|
|
241
338
|
ids: PARAM.delete_ids,
|
|
242
339
|
id: PARAM.delete_id,
|
|
243
340
|
kind: PARAM.delete_kind,
|
|
341
|
+
database: PARAM.database,
|
|
342
|
+
collection: PARAM.collection,
|
|
244
343
|
},
|
|
245
344
|
},
|
|
246
345
|
[TOOL_NAMES.STATUS]: {
|
|
@@ -253,6 +352,36 @@ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with
|
|
|
253
352
|
"'still indexing', not 'the save failed'.",
|
|
254
353
|
params: {
|
|
255
354
|
ids: "The source IDs to check, as returned by hydradb_ingest.",
|
|
355
|
+
database: PARAM.database,
|
|
356
|
+
collection: PARAM.collection,
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
// --- BYOG graph tools (PRO-1681) ---
|
|
360
|
+
[TOOL_NAMES.GRAPH_QUERY]: {
|
|
361
|
+
title: "Query Graph (Cypher)",
|
|
362
|
+
description: GRAPH_QUERY_BODY,
|
|
363
|
+
params: {
|
|
364
|
+
query: GRAPH_PARAM.query,
|
|
365
|
+
params: GRAPH_PARAM.params,
|
|
366
|
+
database: GRAPH_PARAM.database,
|
|
367
|
+
collection: GRAPH_PARAM.collection,
|
|
368
|
+
max_rows: GRAPH_PARAM.max_rows,
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
[TOOL_NAMES.GRAPH_COLLECTIONS]: {
|
|
372
|
+
title: "List Graph Collections",
|
|
373
|
+
description: GRAPH_COLLECTIONS_BODY,
|
|
374
|
+
params: {
|
|
375
|
+
database: GRAPH_PARAM.database,
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
[TOOL_NAMES.GRAPH_ADMIN]: {
|
|
379
|
+
title: "Manage Graph Databases",
|
|
380
|
+
description: GRAPH_ADMIN_BODY,
|
|
381
|
+
params: {
|
|
382
|
+
action: GRAPH_PARAM.action,
|
|
383
|
+
database: GRAPH_PARAM.admin_database,
|
|
384
|
+
collection: GRAPH_PARAM.admin_collection,
|
|
256
385
|
},
|
|
257
386
|
},
|
|
258
387
|
// --- Deprecated aliases ---
|
|
@@ -265,6 +394,8 @@ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with
|
|
|
265
394
|
max_results: PARAM.max_results,
|
|
266
395
|
mode: PARAM.mode,
|
|
267
396
|
graph_context: PARAM.graph_context,
|
|
397
|
+
database: PARAM.database,
|
|
398
|
+
collection: PARAM.collection,
|
|
268
399
|
},
|
|
269
400
|
},
|
|
270
401
|
[TOOL_NAMES.STORE]: {
|
|
@@ -281,6 +412,8 @@ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with
|
|
|
281
412
|
infer: PARAM.infer,
|
|
282
413
|
is_markdown: PARAM.is_markdown,
|
|
283
414
|
overwrite: PARAM.overwrite,
|
|
415
|
+
database: PARAM.database,
|
|
416
|
+
collection: PARAM.collection,
|
|
284
417
|
},
|
|
285
418
|
},
|
|
286
419
|
[TOOL_NAMES.INGEST_CONVERSATION]: {
|
|
@@ -290,17 +423,25 @@ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with
|
|
|
290
423
|
turns: PARAM.turns,
|
|
291
424
|
source_id: "Source identifier to group all turns from the same session together",
|
|
292
425
|
user_name: PARAM.user_name,
|
|
426
|
+
database: PARAM.database,
|
|
427
|
+
collection: PARAM.collection,
|
|
293
428
|
},
|
|
294
429
|
},
|
|
295
430
|
[TOOL_NAMES.LIST_MEMORIES]: {
|
|
296
431
|
title: "List Memories (deprecated)",
|
|
297
432
|
description: deprecated(TOOL_NAMES.LIST_MEMORIES, LIST_MEMORIES_BODY),
|
|
433
|
+
params: {
|
|
434
|
+
database: PARAM.database,
|
|
435
|
+
collection: PARAM.collection,
|
|
436
|
+
},
|
|
298
437
|
},
|
|
299
438
|
[TOOL_NAMES.LIST_SOURCES]: {
|
|
300
439
|
title: "List Sources (deprecated)",
|
|
301
440
|
description: deprecated(TOOL_NAMES.LIST_SOURCES, LIST_SOURCES_BODY),
|
|
302
441
|
params: {
|
|
303
442
|
source_ids: PARAM.source_ids,
|
|
443
|
+
database: PARAM.database,
|
|
444
|
+
collection: PARAM.collection,
|
|
304
445
|
},
|
|
305
446
|
},
|
|
306
447
|
[TOOL_NAMES.FETCH_CONTENT]: {
|
|
@@ -311,6 +452,8 @@ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with
|
|
|
311
452
|
mode: PARAM.fetch_mode,
|
|
312
453
|
offset: PARAM.fetch_offset,
|
|
313
454
|
limit: PARAM.fetch_limit,
|
|
455
|
+
database: PARAM.database,
|
|
456
|
+
collection: PARAM.collection,
|
|
314
457
|
},
|
|
315
458
|
},
|
|
316
459
|
[TOOL_NAMES.DELETE_MEMORY]: {
|
|
@@ -318,6 +461,8 @@ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with
|
|
|
318
461
|
description: deprecated(TOOL_NAMES.DELETE_MEMORY, "Delete a specific user memory from Hydra DB by its memory ID. This action is irreversible."),
|
|
319
462
|
params: {
|
|
320
463
|
memory_id: PARAM.memory_id,
|
|
464
|
+
database: PARAM.database,
|
|
465
|
+
collection: PARAM.collection,
|
|
321
466
|
},
|
|
322
467
|
},
|
|
323
468
|
};
|
|
@@ -338,8 +483,21 @@ THE TOOLS
|
|
|
338
483
|
- ${TOOL_NAMES.INSPECT} — the complete original content of one source you already have an id for.
|
|
339
484
|
- ${TOOL_NAMES.DELETE} — irreversible removal of one item by id.
|
|
340
485
|
- ${TOOL_NAMES.STATUS} — whether an ingested source has finished indexing. Ingestion is asynchronous, so a query issued straight after a save can legitimately return nothing.
|
|
486
|
+
- ${TOOL_NAMES.DATABASES} — which databases this connection can address, with the default marked. Every tool takes an optional \`database\`; call this before naming one, or when a call was refused because the user confined this connection to a single database.
|
|
341
487
|
|
|
342
488
|
Ids flow between these: ${TOOL_NAMES.QUERY} and ${TOOL_NAMES.LIST} emit them, ${TOOL_NAMES.INSPECT}, ${TOOL_NAMES.DELETE} and ${TOOL_NAMES.STATUS} accept them. Never invent one.
|
|
343
489
|
|
|
344
|
-
|
|
490
|
+
THE GRAPH TOOLS (a separate product surface)
|
|
491
|
+
|
|
492
|
+
Hydra DB also runs property graphs the user models and owns end to end, queried in Cypher. These are NOT the same store as the memory and knowledge above, and nothing crosses between them: ${TOOL_NAMES.QUERY} cannot see graph data, and ${TOOL_NAMES.GRAPH_QUERY} cannot see memories.
|
|
493
|
+
|
|
494
|
+
- ${TOOL_NAMES.GRAPH_QUERY} — Cypher, reads and writes alike: traversal, paths, neighbourhoods, aggregation, CREATE/MERGE/SET/DELETE. It can destroy data, so confirm before running anything destructive the user did not ask for.
|
|
495
|
+
- ${TOOL_NAMES.GRAPH_COLLECTIONS} — which graphs exist in a graph database.
|
|
496
|
+
- ${TOOL_NAMES.GRAPH_ADMIN} — create a graph database, drop a collection, drop a database. Irreversible; confirm first.
|
|
497
|
+
|
|
498
|
+
Choose by the question, not the vocabulary: "what has the user told me about X" is ${TOOL_NAMES.QUERY}; "how is X connected to Y in my graph" is ${TOOL_NAMES.GRAPH_QUERY}. If the user has written Cypher, or speaks of nodes, labels, relationships and traversals they themselves created, they mean the graph tools.
|
|
499
|
+
|
|
500
|
+
Working against an unfamiliar collection, discover its structure by querying it — \`MATCH (n) UNWIND labels(n) AS l RETURN l, count(*) AS c ORDER BY l\` — rather than guessing labels, which yields empty results that look like missing data.
|
|
501
|
+
|
|
502
|
+
All tools require HYDRADB_API_KEY and HYDRADB_DATABASE in the environment. The graph tools additionally read HYDRADB_GRAPH_DATABASE and HYDRADB_GRAPH_COLLECTION for their default scope, and can be disabled with HYDRADB_MCP_GRAPH_TOOLS=0.`;
|
|
345
503
|
//# sourceMappingURL=descriptions.js.map
|
package/dist/descriptions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEjE,4EAA4E;AAC5E,MAAM,KAAK,GAAG;IACb,KAAK,EACJ,oFAAoF;QACpF,mFAAmF;QACnF,kFAAkF;QAClF,uCAAuC;IACxC,UAAU,EACT,qEAAqE;QACrE,oEAAoE;QACpE,mFAAmF;IACpF,WAAW,EACV,8EAA8E;QAC9E,kFAAkF;QAClF,+EAA+E;QAC/E,WAAW;IACZ,IAAI,EACH,8EAA8E;QAC9E,iFAAiF;QACjF,mFAAmF;QACnF,kFAAkF;QAClF,mCAAmC;IACpC,gBAAgB,EACf,uEAAuE;QACvE,+EAA+E;QAC/E,8EAA8E;IAC/E,gBAAgB,EACf,gFAAgF;QAChF,+EAA+E;QAC/E,uDAAuD;IACxD,kBAAkB,EACjB,gFAAgF;QAChF,2EAA2E;QAC3E,6EAA6E;IAC9E,QAAQ,EACP,2EAA2E;QAC3E,gFAAgF;QAChF,wEAAwE;QACxE,0EAA0E;QAC1E,gFAAgF;QAChF,+EAA+E;QAC/E,0EAA0E;QAC1E,8CAA8C;IAC/C,cAAc,EACb,2EAA2E;QAC3E,0CAA0C;IAC3C,aAAa,EACZ,kFAAkF;QAClF,mFAAmF;QACnF,mFAAmF;QACnF,8CAA8C;IAC/C,IAAI,EACH,+EAA+E;QAC/E,kFAAkF;QAClF,mFAAmF;QACnF,wDAAwD;IACzD,WAAW,EACV,0EAA0E;QAC1E,wEAAwE;QACxE,+EAA+E;QAC/E,0DAA0D;IAC3D,KAAK,EACJ,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,6EAA6E;IAC9E,SAAS,EACR,iFAAiF;QACjF,sFAAsF;QACtF,uFAAuF;QACvF,0FAA0F;IAC3F,SAAS,EACR,gFAAgF;QAChF,4EAA4E;QAC5E,4DAA4D;IAC7D,QAAQ,EACP,8EAA8E;QAC9E,iFAAiF;QACjF,qFAAqF;IACtF,6EAA6E;IAC7E,8DAA8D;IAC9D,8EAA8E;IAC9E,gBAAgB,EACf,8EAA8E;QAC9E,gFAAgF;QAChF,mFAAmF;QACnF,mFAAmF;QACnF,qBAAqB;IACtB,KAAK,EACJ,4EAA4E;QAC5E,iFAAiF;QACjF,oFAAoF;QACpF,+EAA+E;QAC/E,wBAAwB;IACzB,WAAW,EACV,oFAAoF;QACpF,sEAAsE;IACvE,KAAK,EAAE,uEAAuE;IAC9E,SAAS,EACR,kFAAkF;QAClF,8EAA8E;QAC9E,sEAAsE;IACvE,IAAI,EACH,4EAA4E;QAC5E,gFAAgF;QAChF,gEAAgE;IACjE,UAAU,EACT,oFAAoF;IACrF,IAAI,EACH,oFAAoF;QACpF,mFAAmF;QACnF,+BAA+B;IAChC,SAAS,EACR,iFAAiF;QACjF,oEAAoE;IACrE,MAAM,EACL,4EAA4E;QAC5E,gFAAgF;QAChF,+EAA+E;QAC/E,iFAAiF;QACjF,gFAAgF;IACjF,eAAe,EAAE,oCAAoC;IACrD,UAAU,EACT,iFAAiF;QACjF,iFAAiF;QACjF,iEAAiE;IAClE,YAAY,EACX,iFAAiF;QACjF,6EAA6E;IAC9E,WAAW,EACV,mFAAmF;QACnF,iDAAiD;IAClD,SAAS,EAAE,kEAAkE;IAC7E,UAAU,EACT,8EAA8E;QAC9E,+EAA+E;QAC/E,8CAA8C;IAC/C,WAAW,EACV,qFAAqF;IACtF,SAAS,EAAE,gCAAgC;
|
|
1
|
+
{"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"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"}
|