@hydradb/mcp 1.1.0 → 1.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.
@@ -9,70 +9,97 @@
9
9
  export declare const TOOL_DESCRIPTIONS: {
10
10
  readonly hydradb_query: {
11
11
  readonly title: "Query Hydra DB";
12
- readonly description: string;
12
+ 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}";
13
13
  readonly params: {
14
- readonly query: "The search query to find relevant memories";
15
- readonly max_results: "Maximum number of memory chunks to return (1-50, default: 10)";
16
- readonly mode: "Recall mode: 'fast' for quick semantic search, 'thinking' for deeper personalised recall with graph traversal (default: 'thinking')";
17
- readonly graph_context: "Whether to include knowledge graph relations in results (default: true)";
14
+ readonly query: string;
15
+ readonly kind: string;
16
+ readonly max_results: string;
17
+ readonly mode: string;
18
+ readonly graph_context: string;
19
+ readonly detail: string;
20
+ readonly operator: string;
21
+ readonly source_ids: string;
22
+ readonly metadata_filters: string;
23
+ readonly num_related_chunks: string;
18
24
  };
19
25
  };
20
26
  readonly hydradb_ingest: {
21
27
  readonly title: "Ingest into Hydra DB";
22
- readonly description: string;
28
+ readonly description: "Save information to Hydra DB so it outlives this session. Hydra DB extracts insights, preferences and knowledge-graph entities from what you store.\n\nProvide EXACTLY ONE of:\n `text` — a note, fact, decision, or document body\n `turns` — user/assistant pairs from a conversation\nPassing both is an error; passing neither is an error.\n\nSave proactively: when the user states a preference, makes a decision, corrects you, or reveals a durable fact about themselves or their work, store it without being asked. Store the distilled fact rather than the raw exchange, and always set `title` — it is the only label shown next to this entry in later search results. Before saving something you suspect is already stored, query for it first rather than adding a near-duplicate.\n\nNever store secrets, credentials, or anything the user asked you not to keep.\n\nExamples:\n {\"text\": \"Prefers tabs over spaces in every language; rejected two prettier configs that used spaces.\", \"title\": \"Indentation preference\"}\n {\"turns\": [{\"user\": \"let's go with Postgres\", \"assistant\": \"Agreed, I'll set up the schema.\"}], \"title\": \"Datastore decision\"}\n {\"text\": \"# Runbook\\n\\nRestart order: api, worker, scheduler.\", \"kind\": \"knowledge\", \"title\": \"Restart runbook\"}";
23
29
  readonly params: {
24
- readonly text: "The information to store in memory";
25
- readonly title: "Optional title for the memory entry (default: 'MCP Memory')";
30
+ readonly text: string;
31
+ readonly kind: string;
32
+ readonly title: string;
26
33
  readonly source_id: string;
27
- readonly infer: "Whether Hydra DB should extract insights and build knowledge graph from this text (default: true)";
28
- readonly is_markdown: "Whether the text is in markdown format (default: false)";
29
- readonly turns: "Optional conversation turns to ingest instead of `text`; each has a 'user' and 'assistant' field";
30
- readonly user_name: "Optional name of the user for personalisation (default: 'User')";
34
+ readonly infer: string;
35
+ readonly is_markdown: string;
36
+ readonly overwrite: string;
37
+ readonly metadata: string;
38
+ readonly observation_date: string;
39
+ readonly turns: string;
40
+ readonly user_name: string;
31
41
  };
32
42
  };
33
43
  readonly hydradb_list: {
34
44
  readonly title: "List Hydra DB Context";
35
- readonly description: string;
45
+ readonly description: "Enumerate what is stored in Hydra DB — every memory (kind: \"memory\") or every knowledge source (kind: \"knowledge\"). These are SEPARATE corpora and this tool returns one at a time: listing memories tells you nothing about which knowledge sources exist, and vice versa. Call it twice to see everything.\n\nUse it for inventory questions (\"what do you remember about me?\", \"which documents are indexed?\") and to obtain ids. For \"what do you know about X\", use hydradb_query instead — listing everything and reading it is far more expensive and loses relevance ranking.\n\nResults are paginated. The response says how many of the total it showed and how to reach the rest; do not treat the first page as the whole store.\n\nMemory rows come back as [id] content. Knowledge rows as [id] — title (type), with no content — pass an id to hydradb_inspect for the text.";
36
46
  readonly params: {
37
- readonly kind: "Which context family to list: 'memory' or 'knowledge' (default: 'memory')";
47
+ readonly kind: string;
38
48
  readonly source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.";
49
+ readonly page: string;
50
+ readonly page_size: string;
39
51
  };
40
52
  };
41
53
  readonly hydradb_inspect: {
42
54
  readonly title: "Inspect Hydra DB Source";
43
- readonly description: string;
55
+ readonly description: "Fetch the full original content of ONE stored item by its id. Use it after hydradb_query or hydradb_list when a truncated chunk or listing row is not enough and you need the whole document.\n\nThe 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.\n\nLong 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.";
44
56
  readonly params: {
45
57
  readonly source_id: "The source ID to fetch content for";
46
- readonly mode: "Fetch mode: 'content' for text, 'url' for presigned URL, 'both' for both (default: 'content')";
58
+ readonly mode: string;
59
+ readonly offset: string;
60
+ readonly limit: string;
61
+ readonly expiry_seconds: string;
47
62
  };
48
63
  };
49
64
  readonly hydradb_delete: {
50
65
  readonly title: "Delete from Hydra DB";
51
- readonly description: string;
66
+ readonly description: "Permanently remove one memory or one knowledge source from Hydra DB by id. This cannot be undone; there is no trash.\n\nTake the id from hydradb_query or hydradb_list — never guess one. Confirm with the user before deleting anything they did not name: \"forget that I use vim\" authorises deleting that memory; \"clean up my memories\" authorises nothing until they have seen the list.\n\n`kind` must match the family the id belongs to. A knowledge source id passed with kind \"memory\" reports that nothing was deleted while the source is still there.";
52
67
  readonly params: {
53
- readonly id: "The ID of the item to delete";
68
+ readonly ids: string;
69
+ readonly id: "A single ID to delete. Prefer `ids` when removing more than one.";
54
70
  readonly kind: "Which context family the ID belongs to: 'memory' or 'knowledge' (default: 'memory')";
55
71
  };
56
72
  };
73
+ readonly hydradb_status: {
74
+ readonly title: "Check Hydra DB Indexing Status";
75
+ readonly description: string;
76
+ readonly params: {
77
+ readonly ids: "The source IDs to check, as returned by hydradb_ingest.";
78
+ };
79
+ };
57
80
  readonly hydra_db_search: {
58
81
  readonly title: "Search Hydra DB Memory (deprecated)";
59
82
  readonly description: string;
60
83
  readonly params: {
61
- readonly query: "The search query to find relevant memories";
62
- readonly max_results: "Maximum number of memory chunks to return (1-50, default: 10)";
63
- readonly mode: "Recall mode: 'fast' for quick semantic search, 'thinking' for deeper personalised recall with graph traversal (default: 'thinking')";
64
- readonly graph_context: "Whether to include knowledge graph relations in results (default: true)";
84
+ readonly query: string;
85
+ readonly kind: string;
86
+ readonly max_results: string;
87
+ readonly mode: string;
88
+ readonly graph_context: string;
65
89
  };
66
90
  };
67
91
  readonly hydra_db_store: {
68
92
  readonly title: "Store to Hydra DB Memory (deprecated)";
69
93
  readonly description: string;
70
94
  readonly params: {
71
- readonly text: "The information to store in memory";
72
- readonly title: "Optional title for the memory entry (default: 'MCP Memory')";
95
+ readonly text: string;
96
+ readonly title: string;
73
97
  readonly source_id: string;
74
- readonly infer: "Whether Hydra DB should extract insights and build knowledge graph from this text (default: true)";
75
- readonly is_markdown: "Whether the text is in markdown format (default: false)";
98
+ readonly metadata: string;
99
+ readonly observation_date: string;
100
+ readonly infer: string;
101
+ readonly is_markdown: string;
102
+ readonly overwrite: string;
76
103
  };
77
104
  };
78
105
  readonly hydra_db_ingest_conversation: {
@@ -81,7 +108,7 @@ export declare const TOOL_DESCRIPTIONS: {
81
108
  readonly params: {
82
109
  readonly turns: "Array of conversation turns, each with a 'user' and 'assistant' field";
83
110
  readonly source_id: "Source identifier to group all turns from the same session together";
84
- readonly user_name: "Optional name of the user for personalisation (default: 'User')";
111
+ readonly user_name: string;
85
112
  };
86
113
  };
87
114
  readonly hydra_db_list_memories: {
@@ -100,7 +127,9 @@ export declare const TOOL_DESCRIPTIONS: {
100
127
  readonly description: string;
101
128
  readonly params: {
102
129
  readonly source_id: "The source ID to fetch content for";
103
- readonly mode: "Fetch mode: 'content' for text, 'url' for presigned URL, 'both' for both (default: 'content')";
130
+ readonly mode: string;
131
+ readonly offset: string;
132
+ readonly limit: string;
104
133
  };
105
134
  };
106
135
  readonly hydra_db_delete_memory: {
@@ -9,38 +9,133 @@
9
9
  import { ALIAS_REPLACEMENTS, TOOL_NAMES } from "./tool-names.js";
10
10
  // Shared parameter blurbs, reused across canonical tools and their aliases.
11
11
  const PARAM = {
12
- query: "The search query to find relevant memories",
13
- max_results: "Maximum number of memory chunks to return (1-50, default: 10)",
14
- mode: "Recall mode: 'fast' for quick semantic search, 'thinking' for deeper personalised recall with graph traversal (default: 'thinking')",
15
- graph_context: "Whether to include knowledge graph relations in results (default: true)",
16
- text: "The information to store in memory",
17
- title: "Optional title for the memory entry (default: 'MCP Memory')",
18
- source_id: "Optional source identifier to group related memories together. You can use this as " +
19
- "your session ID or any other unique identifier for a conversation",
20
- infer: "Whether Hydra DB should extract insights and build knowledge graph from this text (default: true)",
21
- is_markdown: "Whether the text is in markdown format (default: false)",
12
+ query: "What you want to know, as a natural-language question or topic — this is semantic " +
13
+ "search, so a full question beats keywords. Search for the CONCEPT, not the words " +
14
+ "the user used: 'database migration decisions' will find a memory written as 'we " +
15
+ "settled on Atlas for schema changes'.",
16
+ query_kind: "Which context family to search: 'memory' for stored user memories, " +
17
+ "'knowledge' for ingested documents and sources, or 'all' for both " +
18
+ "(default: 'all'). Leave unset unless you specifically want to exclude one family.",
19
+ max_results: "Maximum CHUNKS to return (1-50, default: 10). Chunks, not whole memories or " +
20
+ "documents several chunks often come from one source. Raise to 20-30 for broad " +
21
+ "coverage of a topic; drop to 3-5 when you want one specific fact and a small " +
22
+ "response.",
23
+ mode: "'thinking' (default) runs graph traversal and personalised reranking: a few " +
24
+ "seconds, best recall — use it when the answer matters or the question is about " +
25
+ "the user. 'fast' is plain semantic search and is markedly quicker — use it for a " +
26
+ "lookup you expect to hit, or when issuing several queries in a row. 'auto' lets " +
27
+ "Hydra DB pick based on the query.",
28
+ query_source_ids: "Restrict the search to these source IDs, taken from hydradb_query or " +
29
+ "hydradb_list. Turns a search into 'search inside these documents'. This is a " +
30
+ "hard filter: if none of them match, the result is empty rather than widened.",
31
+ metadata_filters: "Exact-match filters over stored metadata, as {key: value}. Exact match only — " +
32
+ "no ranges, no partial matches, no dates-since. Only useful for keys you know " +
33
+ "exist, typically because you set them when ingesting.",
34
+ num_related_chunks: "Adjacent chunks to attach to each match for surrounding context (default: 0). " +
35
+ "Each one multiplies the response size, so use 1-2 only when snippets are " +
36
+ "arriving mid-sentence; prefer hydradb_inspect when you want a whole source.",
37
+ operator: "How to combine the terms in your query: 'or' (default) matches any, 'and' " +
38
+ "requires all, 'phrase' matches the words together in order. Reach for 'phrase' " +
39
+ "when looking up an exact string such as an error message or a config key.",
40
+ expiry_seconds: "How long the download link stays valid, in seconds. Only meaningful with " +
41
+ "mode 'url' or 'both'; ignored otherwise.",
42
+ graph_context: "Include knowledge-graph relations (default: true). These are the entity paths — " +
43
+ "(Alice)-[prefers]->(Tea) — that connect facts across separate memories, and they " +
44
+ "often carry the answer the matching text alone does not. Set false only when you " +
45
+ "want the raw matching text and nothing else.",
46
+ text: "The information to store. Provide EXACTLY ONE of `text` or `turns` — passing " +
47
+ "both is an error, and so is passing neither. Write it standalone: it must still " +
48
+ "make sense months from now with no surrounding conversation, so resolve pronouns " +
49
+ "and relative dates ('in March 2026', not 'last week').",
50
+ ingest_kind: "What to write: 'memory' for a personal fact, preference or conversation " +
51
+ "(default), or 'knowledge' to store a document as a searchable source. " +
52
+ "Memory-only options (turns, source_id, infer, is_markdown, user_name) do not " +
53
+ "apply to knowledge and are rejected rather than ignored.",
54
+ title: "A short, specific label — always set it. This is the ONLY label shown next to " +
55
+ "this entry in later hydradb_query results, so 'Deployment rollback policy' is " +
56
+ "useful where a generic one tells you nothing. If omitted, a title is derived " +
57
+ "from the first line of the text, which is rarely as good as one you choose.",
58
+ source_id: "Optional identifier for this entry. Ingesting again with an existing source_id " +
59
+ "REPLACES everything previously stored under it — it does not add to it. Use a fresh " +
60
+ "id (or leave it unset) for each new fact, and reuse an id only when you deliberately " +
61
+ "mean to overwrite, such as correcting a memory you saved earlier. Leave unset if unsure.",
62
+ overwrite: "Whether ingesting with an existing source_id may replace what is stored there " +
63
+ "(default: true). Set false to have the server reject the write instead of " +
64
+ "overwriting, when you expect to be creating something new.",
65
+ metadata: "Key/value metadata to store with this entry, as {key: value}. These are the " +
66
+ "keys hydradb_query's metadata_filters can match on later, so set them when you " +
67
+ "expect to narrow by them — e.g. {\"project\": \"hydradb\", \"kind\": \"decision\"}.",
68
+ observation_date: "When the fact was true, as an RFC3339 date — distinct from when you stored it. " +
69
+ "Use it when saving something historical, so recency reflects the fact rather " +
70
+ "than the write.",
71
+ infer: "Let Hydra DB extract insights and knowledge-graph entities from this text " +
72
+ "(default: true). Keep it true for anything about the user or their work — that " +
73
+ "extraction is what makes the content findable by concept later. Set false only to " +
74
+ "store text verbatim with no interpretation (a config snippet, an exact error " +
75
+ "string, a code block).",
76
+ is_markdown: "Set true when `text` contains markdown (headings, lists, code fences) so Hydra DB " +
77
+ "chunks on structure instead of splitting mid-section. Default false.",
22
78
  turns: "Array of conversation turns, each with a 'user' and 'assistant' field",
23
- user_name: "Optional name of the user for personalisation (default: 'User')",
24
- kind: "Which context family to list: 'memory' or 'knowledge' (default: 'memory')",
79
+ user_name: "What to call the user in the stored conversation (default: 'User'). Set it when " +
80
+ "you know their actual name, so extracted facts read as being about a person " +
81
+ "rather than about an anonymous participant. Applies to `turns` only.",
82
+ kind: "Which family to list: 'memory' (stored memories) or 'knowledge' (ingested " +
83
+ "sources). REQUIRED — these are separate corpora with different output, and no " +
84
+ "single listing covers both. Call this twice to see everything.",
25
85
  source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.",
86
+ page: "Which page of results to return, 1-indexed (default: 1). The response reports how " +
87
+ "many of the total it showed; pass the next page to continue rather than assuming " +
88
+ "the first page is everything.",
89
+ page_size: "How many items to return per page (1-100). Defaults to the server's page size. " +
90
+ "Raise it to see more at once; lower it to keep the response small.",
91
+ detail: "How much of each matching chunk to return. 'compact' (default) trims each " +
92
+ "chunk to its first ~600 characters and omits the surrounding-context blocks — " +
93
+ "enough to judge relevance and pick a source to inspect. 'full' returns every " +
94
+ "chunk whole; use it when the snippets are being cut off mid-answer. Either way " +
95
+ "the response is capped, and hydradb_inspect returns any single source in full.",
26
96
  fetch_source_id: "The source ID to fetch content for",
27
- fetch_mode: "Fetch mode: 'content' for text, 'url' for presigned URL, 'both' for both (default: 'content')",
28
- delete_id: "The ID of the item to delete",
97
+ fetch_mode: "'content' (default) returns the text normally what you want. 'url' returns a " +
98
+ "short-lived presigned download link INSTEAD of the text, for binary sources or " +
99
+ "when handing the user a download. 'both' returns text and link.",
100
+ fetch_offset: "Character offset to start reading from (default: 0). Long sources are returned " +
101
+ "in slices; the response says where it stopped and what offset to pass next.",
102
+ fetch_limit: "Maximum characters of text to return (default and maximum: 20000). Lower it when " +
103
+ "you only need the beginning of a long document.",
104
+ delete_id: "A single ID to delete. Prefer `ids` when removing more than one.",
105
+ delete_ids: "The IDs to delete. Accepts several at once — cleaning up N stale entries is " +
106
+ "one call, not N. Each is reported separately, and the response says how many " +
107
+ "were actually removed. This is irreversible.",
29
108
  delete_kind: "Which context family the ID belongs to: 'memory' or 'knowledge' (default: 'memory')",
30
109
  memory_id: "The ID of the memory to delete",
31
110
  };
32
111
  function deprecated(alias, body) {
33
112
  return `DEPRECATED — use \`${ALIAS_REPLACEMENTS[alias]}\` instead. ${body}`;
34
113
  }
35
- const SEARCH_BODY = "Search through Hydra DB State-of-the-art agentic memories. Returns relevant chunks with " +
36
- "graph-enriched context including entity paths and knowledge graph relations. " +
37
- "Use this to find previously stored information, past conversations, user preferences, " +
38
- "or any knowledge that has been ingested into Hydra DB memory. " +
39
- "Supports both fast semantic search and deeper thinking mode with graph traversal.";
40
- const STORE_BODY = "Save important information to Hydra DB State-of-the-art agentic memory. Use this to persist " +
41
- "facts, preferences, decisions, notes, or any text the user wants remembered across " +
42
- "sessions. Hydra DB automatically extracts insights, preferences, and builds a knowledge " +
43
- "graph from the stored content. Supports plain text and markdown.";
114
+ const SEARCH_BODY = `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.
115
+
116
+ CALL 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.
117
+
118
+ Searches both families by default. Every result carries \`[id: …]\` pass it to hydradb_inspect for the full source, or to hydradb_delete to remove it.
119
+
120
+ Examples:
121
+ {"query": "how does the user prefer code review feedback"}
122
+ {"query": "postgres connection pooling decision", "kind": "knowledge"}
123
+ {"query": "deploy checklist", "mode": "fast", "max_results": 5}`;
124
+ const STORE_BODY = `Save information to Hydra DB so it outlives this session. Hydra DB extracts insights, preferences and knowledge-graph entities from what you store.
125
+
126
+ Provide EXACTLY ONE of:
127
+ \`text\` — a note, fact, decision, or document body
128
+ \`turns\` — user/assistant pairs from a conversation
129
+ Passing both is an error; passing neither is an error.
130
+
131
+ Save proactively: when the user states a preference, makes a decision, corrects you, or reveals a durable fact about themselves or their work, store it without being asked. Store the distilled fact rather than the raw exchange, and always set \`title\` — it is the only label shown next to this entry in later search results. Before saving something you suspect is already stored, query for it first rather than adding a near-duplicate.
132
+
133
+ Never store secrets, credentials, or anything the user asked you not to keep.
134
+
135
+ Examples:
136
+ {"text": "Prefers tabs over spaces in every language; rejected two prettier configs that used spaces.", "title": "Indentation preference"}
137
+ {"turns": [{"user": "let's go with Postgres", "assistant": "Agreed, I'll set up the schema."}], "title": "Datastore decision"}
138
+ {"text": "# Runbook\\n\\nRestart order: api, worker, scheduler.", "kind": "knowledge", "title": "Restart runbook"}`;
44
139
  const CONVERSATION_BODY = "Ingest one or more user-assistant conversation turns into Hydra DB memory. " +
45
140
  "Hydra DB will extract insights, preferences, and knowledge graph entities from the " +
46
141
  "conversation. Use this to store conversation history so it can be recalled later. " +
@@ -51,9 +146,11 @@ const LIST_MEMORIES_BODY = "List all stored user memories in Hydra DB. Returns m
51
146
  const LIST_SOURCES_BODY = "List all ingested sources in Hydra DB memory. Returns source IDs, titles, types, " +
52
147
  "and metadata. Use this to see what data sources have been ingested and to find " +
53
148
  "source IDs for fetching content.";
54
- const INSPECT_BODY = "Fetch the full content of a specific source by its source ID from Hydra DB. " +
55
- "Returns the original text content that was ingested. Use this to retrieve " +
56
- "the complete content of a previously stored source.";
149
+ const INSPECT_BODY = `Fetch the full original content of ONE stored item by its id. Use it after hydradb_query or hydradb_list when a truncated chunk or listing row is not enough and you need the whole document.
150
+
151
+ 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.
152
+
153
+ 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.`;
57
154
  export const TOOL_DESCRIPTIONS = {
58
155
  // --- Canonical tools (CONTRACT §3) ---
59
156
  [TOOL_NAMES.QUERY]: {
@@ -61,33 +158,55 @@ export const TOOL_DESCRIPTIONS = {
61
158
  description: SEARCH_BODY,
62
159
  params: {
63
160
  query: PARAM.query,
161
+ kind: PARAM.query_kind,
64
162
  max_results: PARAM.max_results,
65
163
  mode: PARAM.mode,
66
164
  graph_context: PARAM.graph_context,
165
+ detail: PARAM.detail,
166
+ operator: PARAM.operator,
167
+ source_ids: PARAM.query_source_ids,
168
+ metadata_filters: PARAM.metadata_filters,
169
+ num_related_chunks: PARAM.num_related_chunks,
67
170
  },
68
171
  },
69
172
  [TOOL_NAMES.INGEST]: {
70
173
  title: "Ingest into Hydra DB",
71
- description: STORE_BODY +
72
- " To ingest a conversation instead of a single note, provide `turns` " +
73
- "(user/assistant pairs) rather than `text`.",
174
+ // STORE_BODY already states the text/turns rule as "exactly one of". The
175
+ // sentence that used to be appended here said "provide `turns` rather
176
+ // than `text`", which reads as a preference between two allowed options
177
+ // and contradicts it.
178
+ description: STORE_BODY,
74
179
  params: {
75
180
  text: PARAM.text,
181
+ kind: PARAM.ingest_kind,
76
182
  title: PARAM.title,
77
183
  source_id: PARAM.source_id,
78
184
  infer: PARAM.infer,
79
185
  is_markdown: PARAM.is_markdown,
80
- turns: "Optional conversation turns to ingest instead of `text`; each has a 'user' and 'assistant' field",
186
+ overwrite: PARAM.overwrite,
187
+ metadata: PARAM.metadata,
188
+ observation_date: PARAM.observation_date,
189
+ turns: "The conversation to ingest, oldest first, as [{user, assistant}, ...]. Provide " +
190
+ "EXACTLY ONE of `text` or `turns` — passing both is an error, and so is passing " +
191
+ "neither. Use this when the exchange itself is worth preserving; when only the " +
192
+ "conclusion matters, prefer `text` with the distilled fact.",
81
193
  user_name: PARAM.user_name,
82
194
  },
83
195
  },
84
196
  [TOOL_NAMES.LIST]: {
85
197
  title: "List Hydra DB Context",
86
- description: "List stored memories or ingested knowledge sources in Hydra DB. " +
87
- "Use `kind` to choose which family to browse.",
198
+ description: `Enumerate what is stored in Hydra DB — every memory (kind: "memory") or every knowledge source (kind: "knowledge"). These are SEPARATE corpora and this tool returns one at a time: listing memories tells you nothing about which knowledge sources exist, and vice versa. Call it twice to see everything.
199
+
200
+ Use it for inventory questions ("what do you remember about me?", "which documents are indexed?") and to obtain ids. For "what do you know about X", use hydradb_query instead — listing everything and reading it is far more expensive and loses relevance ranking.
201
+
202
+ Results are paginated. The response says how many of the total it showed and how to reach the rest; do not treat the first page as the whole store.
203
+
204
+ Memory rows come back as [id] content. Knowledge rows as [id] — title (type), with no content — pass an id to hydradb_inspect for the text.`,
88
205
  params: {
89
206
  kind: PARAM.kind,
90
207
  source_ids: PARAM.source_ids,
208
+ page: PARAM.page,
209
+ page_size: PARAM.page_size,
91
210
  },
92
211
  },
93
212
  [TOOL_NAMES.INSPECT]: {
@@ -96,23 +215,43 @@ export const TOOL_DESCRIPTIONS = {
96
215
  params: {
97
216
  source_id: PARAM.fetch_source_id,
98
217
  mode: PARAM.fetch_mode,
218
+ offset: PARAM.fetch_offset,
219
+ limit: PARAM.fetch_limit,
220
+ expiry_seconds: PARAM.expiry_seconds,
99
221
  },
100
222
  },
101
223
  [TOOL_NAMES.DELETE]: {
102
224
  title: "Delete from Hydra DB",
103
- description: "Delete a memory or knowledge source from Hydra DB by its ID. " +
104
- "Use `kind` to select which family the ID belongs to. This action is irreversible.",
225
+ description: `Permanently remove one memory or one knowledge source from Hydra DB by id. This cannot be undone; there is no trash.
226
+
227
+ Take the id from hydradb_query or hydradb_list — never guess one. Confirm with the user before deleting anything they did not name: "forget that I use vim" authorises deleting that memory; "clean up my memories" authorises nothing until they have seen the list.
228
+
229
+ \`kind\` must match the family the id belongs to. A knowledge source id passed with kind "memory" reports that nothing was deleted while the source is still there.`,
105
230
  params: {
231
+ ids: PARAM.delete_ids,
106
232
  id: PARAM.delete_id,
107
233
  kind: PARAM.delete_kind,
108
234
  },
109
235
  },
236
+ [TOOL_NAMES.STATUS]: {
237
+ title: "Check Hydra DB Indexing Status",
238
+ description: "Check whether ingested sources have finished indexing. Ingestion is " +
239
+ "asynchronous: hydradb_ingest returns as soon as the source is queued, and " +
240
+ "the content is not searchable until indexing reaches a terminal state. " +
241
+ "Use this after ingesting when you need to confirm the write landed — " +
242
+ "an empty hydradb_query result shortly after an ingest usually means " +
243
+ "'still indexing', not 'the save failed'.",
244
+ params: {
245
+ ids: "The source IDs to check, as returned by hydradb_ingest.",
246
+ },
247
+ },
110
248
  // --- Deprecated aliases ---
111
249
  [TOOL_NAMES.SEARCH]: {
112
250
  title: "Search Hydra DB Memory (deprecated)",
113
251
  description: deprecated(TOOL_NAMES.SEARCH, SEARCH_BODY),
114
252
  params: {
115
253
  query: PARAM.query,
254
+ kind: PARAM.query_kind,
116
255
  max_results: PARAM.max_results,
117
256
  mode: PARAM.mode,
118
257
  graph_context: PARAM.graph_context,
@@ -125,8 +264,15 @@ export const TOOL_DESCRIPTIONS = {
125
264
  text: PARAM.text,
126
265
  title: PARAM.title,
127
266
  source_id: PARAM.source_id,
267
+ metadata: "Key/value metadata to store with this entry, as {key: value}. These are the " +
268
+ "keys hydradb_query's metadata_filters can match on later, so set them when you " +
269
+ "expect to narrow by them — e.g. {\"project\": \"hydradb\", \"kind\": \"decision\"}.",
270
+ observation_date: "When the fact was true, as an RFC3339 date — distinct from when you stored it. " +
271
+ "Use it when saving something historical, so recency reflects the fact rather " +
272
+ "than the write.",
128
273
  infer: PARAM.infer,
129
274
  is_markdown: PARAM.is_markdown,
275
+ overwrite: PARAM.overwrite,
130
276
  },
131
277
  },
132
278
  [TOOL_NAMES.INGEST_CONVERSATION]: {
@@ -155,6 +301,8 @@ export const TOOL_DESCRIPTIONS = {
155
301
  params: {
156
302
  source_id: PARAM.fetch_source_id,
157
303
  mode: PARAM.fetch_mode,
304
+ offset: PARAM.fetch_offset,
305
+ limit: PARAM.fetch_limit,
158
306
  },
159
307
  },
160
308
  [TOOL_NAMES.DELETE_MEMORY]: {
@@ -165,19 +313,25 @@ export const TOOL_DESCRIPTIONS = {
165
313
  },
166
314
  },
167
315
  };
168
- export const SERVER_INSTRUCTIONS = "Hydra DB MCP server for State-of-the-art agentic memory management. " +
169
- `Use ${TOOL_NAMES.QUERY} to find relevant memories and knowledge graph context. ` +
170
- `Use ${TOOL_NAMES.INGEST} to save information (a note via 'text', or a conversation via 'turns'). ` +
171
- `Use ${TOOL_NAMES.LIST} to browse stored memories or knowledge sources. ` +
172
- `Use ${TOOL_NAMES.INSPECT} to retrieve the full content of a source. ` +
173
- `Use ${TOOL_NAMES.DELETE} to remove a memory or knowledge source. ` +
174
- "Deprecated aliases remain available for backward compatibility but should not be used in new integrations: " +
175
- `${TOOL_NAMES.SEARCH} ${TOOL_NAMES.QUERY}, ` +
176
- `${TOOL_NAMES.STORE} → ${TOOL_NAMES.INGEST}, ` +
177
- `${TOOL_NAMES.INGEST_CONVERSATION} → ${TOOL_NAMES.INGEST}, ` +
178
- `${TOOL_NAMES.LIST_MEMORIES} → ${TOOL_NAMES.LIST}, ` +
179
- `${TOOL_NAMES.LIST_SOURCES} ${TOOL_NAMES.LIST}, ` +
180
- `${TOOL_NAMES.FETCH_CONTENT} ${TOOL_NAMES.INSPECT}, ` +
181
- `${TOOL_NAMES.DELETE_MEMORY} ${TOOL_NAMES.DELETE}. ` +
182
- "All tools require a valid Hydra DB API key and tenant ID configured via environment variables.";
316
+ export const SERVER_INSTRUCTIONS = `Hydra DB is the user's persistent memory across sessions. It holds two separate families: memory (facts, preferences, decisions, past conversations) and knowledge (ingested documents and sources). ${TOOL_NAMES.QUERY} searches both together.
317
+
318
+ WHEN TO USE IT
319
+
320
+ - Before answering anything that could depend on the user's history, preferences, prior decisions, project details, or a document they have ingested, call ${TOOL_NAMES.QUERY} FIRST including when you are merely unsure. One query at the start of a task is cheap; answering from a blank slate costs the user a correction. Never ask the user to repeat something Hydra DB may already hold.
321
+ - After the user states a preference, makes a decision, corrects you, or reveals a durable fact about themselves or their work, call ${TOOL_NAMES.INGEST} to save it without being asked. Save the distilled fact, not the transcript: "prefers pnpm over npm in every repo", not "user said maybe we should try pnpm".
322
+ - Never store secrets, credentials, one-off task chatter, or anything the user asked you not to keep.
323
+ - "Remember this" maps to ${TOOL_NAMES.INGEST}, "forget that" to ${TOOL_NAMES.DELETE}, and "what do you know about me" to ${TOOL_NAMES.QUERY} — do not answer that last one from the current conversation alone.
324
+
325
+ THE TOOLS
326
+
327
+ - ${TOOL_NAMES.QUERY} semantic search across memory and knowledge, with knowledge-graph context. Your default read. Every result carries an id.
328
+ - ${TOOL_NAMES.INGEST} write. A note or document via 'text', or a conversation via 'turns' (exactly one of the two).
329
+ - ${TOOL_NAMES.LIST} the full inventory of ONE family. Use it for "what do you have?"; for "what do you know about X" use ${TOOL_NAMES.QUERY} instead.
330
+ - ${TOOL_NAMES.INSPECT} the complete original content of one source you already have an id for.
331
+ - ${TOOL_NAMES.DELETE} — irreversible removal of one item by id.
332
+ - ${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.
333
+
334
+ 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.
335
+
336
+ All tools require HYDRADB_API_KEY and HYDRADB_DATABASE in the environment.`;
183
337
  //# sourceMappingURL=descriptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"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"}