@hydradb/mcp 0.0.1 → 1.1.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/README.md CHANGED
@@ -4,61 +4,106 @@ MCP (Model Context Protocol) server for [Hydra DB](https://hydradb.com), the sta
4
4
 
5
5
  ## Available Tools
6
6
 
7
- ### **hydra_db_search**
7
+ The tool names follow the canonical HydraDB vocabulary. Every previous name still
8
+ works as a **deprecated alias** (marked as such in its description) so existing
9
+ `mcp.json` files keep working — but new integrations should use the canonical
10
+ names below.
11
+
12
+ | Canonical tool | Deprecated alias(es) |
13
+ |---|---|
14
+ | `hydradb_query` | `hydra_db_search` |
15
+ | `hydradb_ingest` | `hydra_db_store`, `hydra_db_ingest_conversation` |
16
+ | `hydradb_list` | `hydra_db_list_memories`, `hydra_db_list_sources` |
17
+ | `hydradb_inspect` | `hydra_db_fetch_content` |
18
+ | `hydradb_delete` | `hydra_db_delete_memory` |
19
+
20
+ ### **hydradb_query**
8
21
 
9
22
  Search through Hydra DB memories. Returns relevant chunks with graph-enriched context including entity paths and knowledge graph relations.
10
23
 
11
- ### **hydra_db_store**
24
+ | Parameter | Type | Required | Description |
25
+ |-----------|------|----------|-------------|
26
+ | `query` | string | Yes | The search query to find relevant memories |
27
+ | `max_results` | number | No | Maximum number of memory chunks to return (1-50, default: 10) |
28
+ | `mode` | string | No | Recall mode: `fast` for quick semantic search, `thinking` for deeper personalised recall with graph traversal (default: `thinking`) |
29
+ | `graph_context` | boolean | No | Whether to include knowledge graph relations in results (default: true) |
12
30
 
13
- Save important information to Hydra DB memory. Hydra DB automatically extracts insights, preferences, and builds a knowledge graph from the stored content.
31
+ ### **hydradb_ingest**
14
32
 
15
- ### **hydra_db_ingest_conversation**
33
+ Save information to Hydra DB memory. Hydra DB automatically extracts insights, preferences, and builds a knowledge graph from the stored content. Provide `text` to store a note/document, or `turns` to ingest a conversation.
16
34
 
17
- Ingest user-assistant conversation turns into Hydra DB memory. Hydra DB extracts insights, preferences, and knowledge graph entities from the conversation.
35
+ | Parameter | Type | Required | Description |
36
+ |-----------|------|----------|-------------|
37
+ | `text` | string | No\* | The information to store in memory |
38
+ | `title` | string | No | Title for the memory entry (default: `MCP Memory`) |
39
+ | `source_id` | string | No | Source identifier to group related memories together (e.g. session ID) |
40
+ | `infer` | boolean | No | Whether Hydra DB should extract insights and build knowledge graph (default: true) |
41
+ | `is_markdown` | boolean | No | Whether the text is in markdown format (default: false) |
42
+ | `turns` | array | No\* | Conversation turns (each with a `user` and `assistant` field) to ingest instead of `text` |
43
+ | `user_name` | string | No | Name of the user for personalisation, used with `turns` (default: `User`) |
18
44
 
19
- ### **hydra_db_list_memories**
45
+ \* Provide exactly one of `text` or `turns`.
20
46
 
21
- List all stored user memories in Hydra DB. Returns memory IDs and their content.
47
+ ### **hydradb_list**
22
48
 
23
- ### **hydra_db_delete_memory**
49
+ List stored memories or ingested knowledge sources in Hydra DB.
24
50
 
25
- Delete a specific user memory from Hydra DB by its memory ID.
51
+ | Parameter | Type | Required | Description |
52
+ |-----------|------|----------|-------------|
53
+ | `kind` | string | No | Which family to list: `memory` or `knowledge` (default: `memory`) |
54
+ | `source_ids` | array | No | For `knowledge`, an array of specific source IDs to filter by. If omitted, lists all |
26
55
 
27
- ### **hydra_db_fetch_content**
56
+ ### **hydradb_inspect**
28
57
 
29
58
  Fetch the full content of a specific source by its source ID.
30
59
 
31
- ### **hydra_db_list_sources**
60
+ | Parameter | Type | Required | Description |
61
+ |-----------|------|----------|-------------|
62
+ | `source_id` | string | Yes | The source ID to fetch content for |
63
+ | `mode` | string | No | Fetch mode: `content` for text, `url` for presigned URL, `both` for both (default: `content`) |
64
+
65
+ ### **hydradb_delete**
66
+
67
+ Delete a memory or knowledge source from Hydra DB by its ID. This action is irreversible.
32
68
 
33
- List all ingested sources in Hydra DB memory.
69
+ | Parameter | Type | Required | Description |
70
+ |-----------|------|----------|-------------|
71
+ | `id` | string | Yes | The ID of the item to delete |
72
+ | `kind` | string | No | Which family the ID belongs to: `memory` or `knowledge` (default: `memory`) |
34
73
 
35
74
  ## Configuration
36
75
 
37
76
  ### Get Your Credentials
38
77
 
39
78
  1. Get your Hydra DB API Key from [Hydra DB](https://app.hydradb.com)
40
- 2. Get your Tenant ID from the Hydra DB dashboard
79
+ 2. Get your database name from the Hydra DB dashboard
41
80
 
42
81
  ### Environment Variables
43
82
 
44
- | Variable | Description | Default |
45
- | ------------------------ | ----------------------------------- | -------------- |
46
- | `HYDRA_DB_API_KEY` | Your Hydra-DB API key | *Required* |
47
- | `HYDRA_DB_TENANT_ID` | Your Hydra-DB tenant identifier | *Required* |
48
- | `HYDRA_DB_SUB_TENANT_ID` | Sub-tenant for data partitioning | `hydra-db-mcp` |
49
- | `HYDRA_DB_LOG_LEVEL` | Log level: DEBUG, INFO, WARN, ERROR | `ERROR` |
83
+ | Variable | Description | Default |
84
+ | -------------------- | ------------------------------------ | ------------------------- |
85
+ | `HYDRADB_API_KEY` | Your Hydra DB API key | *Required* |
86
+ | `HYDRADB_DATABASE` | Your Hydra DB database (tenant scope) | *Required* |
87
+ | `HYDRADB_COLLECTION` | Collection (sub-tenant) for partitioning | `hydra-db-mcp` |
88
+ | `HYDRADB_BASE_URL` | Base URL override | `https://api.hydradb.com` |
89
+ | `HYDRADB_LOG_LEVEL` | Log level: DEBUG, INFO, WARN, ERROR | `ERROR` |
90
+
91
+ The legacy `HYDRA_DB_*` names — `HYDRA_DB_API_KEY`, `HYDRA_DB_TENANT_ID`,
92
+ `HYDRA_DB_SUB_TENANT_ID`, `HYDRA_DB_BASE_URL`, `HYDRA_DB_LOG_LEVEL` — remain
93
+ honoured as **deprecated aliases** (canonical wins when both are set; using an
94
+ alias prints a one-time warning naming its replacement).
50
95
 
51
96
  ### Claude Desktop
52
97
 
53
98
  ```json
54
99
  {
55
100
  "mcpServers": {
56
- "hydradb": {
101
+ "hydradb": {
57
102
  "command": "npx",
58
- "args": ["-y", "@hydra_db/mcp@0.1.1"],
103
+ "args": ["-y", "@hydradb/mcp@latest"],
59
104
  "env": {
60
- "HYDRA_DB_API_KEY": "your-api-key",
61
- "HYDRA_DB_TENANT_ID": "your-tenant-id"
105
+ "HYDRADB_API_KEY": "your-api-key",
106
+ "HYDRADB_DATABASE": "your-database"
62
107
  }
63
108
  }
64
109
  }
@@ -75,12 +120,12 @@ List all ingested sources in Hydra DB memory.
75
120
  ```json
76
121
  {
77
122
  "mcpServers": {
78
- "hydradb": {
123
+ "hydradb": {
79
124
  "command": "npx",
80
- "args": ["-y", "@hydra_db/mcp@0.1.1"],
125
+ "args": ["-y", "@hydradb/mcp@latest"],
81
126
  "env": {
82
- "HYDRA_DB_API_KEY": "your-api-key",
83
- "HYDRA_DB_TENANT_ID": "your-tenant-id"
127
+ "HYDRADB_API_KEY": "your-api-key",
128
+ "HYDRADB_DATABASE": "your-database"
84
129
  }
85
130
  }
86
131
  }
@@ -94,13 +139,13 @@ Add to `.vscode/mcp.json`:
94
139
  ```json
95
140
  {
96
141
  "servers": {
97
- "hydradb": {
142
+ "hydradb": {
98
143
  "type": "stdio",
99
144
  "command": "npx",
100
- "args": ["-y", "@hydra_db/mcp@0.1.1"],
145
+ "args": ["-y", "@hydradb/mcp@latest"],
101
146
  "env": {
102
- "HYDRA_DB_API_KEY": "your-api-key",
103
- "HYDRA_DB_TENANT_ID": "your-tenant-id"
147
+ "HYDRADB_API_KEY": "your-api-key",
148
+ "HYDRADB_DATABASE": "your-database"
104
149
  }
105
150
  }
106
151
  }
@@ -109,18 +154,18 @@ Add to `.vscode/mcp.json`:
109
154
 
110
155
  ### Custom Sub-Tenant
111
156
 
112
- To partition data, set the `HYDRA_DB_SUB_TENANT_ID` environment variable:
157
+ To partition data, set the `HYDRADB_COLLECTION` environment variable:
113
158
 
114
159
  ```json
115
160
  {
116
161
  "mcpServers": {
117
- "hydradb": {
162
+ "hydradb": {
118
163
  "command": "npx",
119
- "args": ["-y", "@hydra_db/mcp@0.1.1"],
164
+ "args": ["-y", "@hydradb/mcp@latest"],
120
165
  "env": {
121
- "HYDRA_DB_API_KEY": "your-api-key",
122
- "HYDRA_DB_TENANT_ID": "your-tenant-id",
123
- "HYDRA_DB_SUB_TENANT_ID": "my-project"
166
+ "HYDRADB_API_KEY": "your-api-key",
167
+ "HYDRADB_DATABASE": "your-database",
168
+ "HYDRADB_COLLECTION": "my-project"
124
169
  }
125
170
  }
126
171
  }
@@ -129,43 +174,50 @@ To partition data, set the `HYDRA_DB_SUB_TENANT_ID` environment variable:
129
174
 
130
175
  ## How It Works
131
176
 
132
- - **hydra_db_search** queries `/recall/recall_preferences` for relevant memories and returns graph-enriched context (entity paths, chunk relations, extra context).
133
- - **hydra_db_store** sends text to `/memories/add_memory` with `infer: true` and `upsert: true`. Hydra-DB extracts insights and builds a knowledge graph automatically.
134
- - **hydra_db_ingest_conversation** sends user-assistant pairs to `/memories/add_memory` as conversation turns, grouped by `source_id`.
135
- - **hydra_db_list_memories** and **hydra_db_list_sources** query `/list/data` to browse stored data.
136
- - **hydra_db_delete_memory** calls `DELETE /memories/delete_memory` to remove a specific memory.
137
- - **hydra_db_fetch_content** calls `/fetch/content` to retrieve the original ingested content.
177
+ The server talks to Hydra DB through the generated [`@hydradb/sdk`](https://www.npmjs.com/package/@hydradb/sdk)
178
+ (pinned exactly), behind a thin hand-owned wrapper in `src/hydra`. The wrapper
179
+ owns scope injection, envelope unwrapping and error translation; the tools call
180
+ it and render the results.
181
+
182
+ - **hydradb_query** retrieves relevant memories and returns graph-enriched context (entity paths, chunk relations, extra context). Supports `fast` and `thinking` recall modes.
183
+ - **hydradb_ingest** stores a note (`text`) or a conversation (`turns`) as a memory, with configurable `infer`, `is_markdown`, `title`, and `source_id`. Hydra DB extracts insights and builds a knowledge graph automatically.
184
+ - **hydradb_list** browses stored memories (`kind: memory`) or ingested knowledge sources (`kind: knowledge`, with an optional `source_ids` filter).
185
+ - **hydradb_inspect** retrieves the original ingested content of a source, with mode options (`content`, `url`, or `both`).
186
+ - **hydradb_delete** removes a memory or knowledge source by ID.
138
187
 
139
188
  ## Development
140
189
 
141
190
  ```bash
142
- npm install
191
+ npm ci
143
192
  npm run build
144
- HYDRA_DB_API_KEY=your-key HYDRA_DB_TENANT_ID=your-tenant npm start
193
+ HYDRADB_API_KEY=your-key HYDRADB_DATABASE=your-database npm start
145
194
  ```
146
195
 
147
196
  For development with auto-reload:
148
197
 
149
198
  ```bash
150
- HYDRA_DB_API_KEY=your-key HYDRA_DB_TENANT_ID=your-tenant npm run dev
199
+ HYDRADB_API_KEY=your-key HYDRADB_DATABASE=your-database npm run dev
151
200
  ```
152
201
 
153
202
  ## Testing
154
203
 
155
204
  ```bash
156
- # unit tests (mocked HTTP)
205
+ # unit + conformance tests (wrapper driven against a mocked SDK transport)
157
206
  npm test
158
207
 
159
- # live integration test against Hydra DB
160
- RUN_LIVE_TESTS=true HYDRA_DB_API_KEY=your-key HYDRA_DB_TENANT_ID=your-tenant npm run test:integration
208
+ # just the shared conformance vectors
209
+ npm run test:conformance
210
+
211
+ # live integration test against Hydra DB (drives the wrapper end to end)
212
+ RUN_LIVE_TESTS=true HYDRADB_API_KEY=your-key HYDRADB_DATABASE=your-database npm run test:integration
161
213
  ```
162
214
 
163
215
  ## Troubleshooting
164
216
 
165
- - **API Key Issues**: Ensure `HYDRA_DB_API_KEY` is set correctly
217
+ - **API Key Issues**: Ensure `HYDRADB_API_KEY` is set correctly
166
218
  - **Connection Errors**: Check your internet connection and API key validity
167
219
  - **Tool Not Found**: Make sure the package is installed and the command path is correct
168
- - **Debug Logging**: Set `HYDRA_DB_LOG_LEVEL=DEBUG` for verbose output
220
+ - **Debug Logging**: Set `HYDRADB_LOG_LEVEL=DEBUG` for verbose output
169
221
 
170
222
  ## Contributing / Developer Setup
171
223
 
@@ -187,4 +239,3 @@ make check-types # Type-check without emitting
187
239
  ```
188
240
 
189
241
  Run `make help` to see all available targets.
190
-
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Adapters from the SDK's (camelCase) response payloads back into the legacy
3
+ * snake_case shapes this server already renders.
4
+ *
5
+ * These live in the MCP layer — NOT the portable wrapper — because they exist
6
+ * only to keep `src/context.ts` (the high-value, byte-identical recall
7
+ * renderer) and the existing tool output strings unchanged across the v1 → SDK
8
+ * migration. The wrapper returns SDK-native `.data`; the server adapts it here.
9
+ *
10
+ * Note: with `skipValidation`, the SDK transforms known fields to camelCase but
11
+ * leaves the untyped triplet innards (`relation`/`source`/`target`) as raw
12
+ * snake_case — which is exactly what `formatTriplet` reads — so triplets pass
13
+ * through untouched.
14
+ */
15
+ import type { HydraDB as SDK } from "@hydradb/sdk";
16
+ import type { AddMemoryResponse, RecallResponse } from "./types.js";
17
+ /** SDK retrieval result → the legacy `RecallResponse` fed to `buildRecalledContext`. */
18
+ export declare function toRecallResponse(data: SDK.SearchV2RetrievalResult): RecallResponse;
19
+ /** SDK ingest result → the legacy `AddMemoryResponse` (success/failed counts). */
20
+ export declare function toAddMemoryResponse(data: SDK.IngestionV2SourceUploadResponse): AddMemoryResponse;
21
+ export interface MemoryListItem {
22
+ memory_id: string;
23
+ memory_content: string;
24
+ }
25
+ /** SDK list result → memory rows. Field names vary across v2 records, so read defensively. */
26
+ export declare function toMemoryList(data: SDK.ListV2SourceListResponse): MemoryListItem[];
27
+ export interface SourceListItem {
28
+ id: string;
29
+ title?: string;
30
+ type?: string;
31
+ }
32
+ export interface SourceList {
33
+ sources: SourceListItem[];
34
+ total: number;
35
+ }
36
+ /** SDK list result → knowledge source rows + total. */
37
+ export declare function toSourceList(data: SDK.ListV2SourceListResponse): SourceList;
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Adapters from the SDK's (camelCase) response payloads back into the legacy
3
+ * snake_case shapes this server already renders.
4
+ *
5
+ * These live in the MCP layer — NOT the portable wrapper — because they exist
6
+ * only to keep `src/context.ts` (the high-value, byte-identical recall
7
+ * renderer) and the existing tool output strings unchanged across the v1 → SDK
8
+ * migration. The wrapper returns SDK-native `.data`; the server adapts it here.
9
+ *
10
+ * Note: with `skipValidation`, the SDK transforms known fields to camelCase but
11
+ * leaves the untyped triplet innards (`relation`/`source`/`target`) as raw
12
+ * snake_case — which is exactly what `formatTriplet` reads — so triplets pass
13
+ * through untouched.
14
+ */
15
+ function toScoredPath(path) {
16
+ return {
17
+ // Triplet innards are already raw snake_case (untyped in the SDK schema).
18
+ triplets: (path.triplets ?? []),
19
+ relevancy_score: path.relevancyScore ?? 0,
20
+ combined_context: path.combinedContext ?? null,
21
+ group_id: path.groupId ?? null,
22
+ };
23
+ }
24
+ function toVectorChunk(chunk) {
25
+ return {
26
+ chunk_uuid: chunk.chunkUuid ?? "",
27
+ source_id: chunk.id ?? "",
28
+ chunk_content: chunk.chunkContent ?? "",
29
+ source_title: chunk.sourceTitle,
30
+ source_type: chunk.sourceType,
31
+ source_upload_time: chunk.sourceUploadTime,
32
+ source_last_updated_time: chunk.sourceLastUpdatedTime,
33
+ relevancy_score: chunk.relevancyScore ?? null,
34
+ document_metadata: chunk.additionalMetadata ?? null,
35
+ tenant_metadata: chunk.metadata ?? null,
36
+ extra_context_ids: chunk.extraContextIds ?? null,
37
+ layout: chunk.layout ?? null,
38
+ };
39
+ }
40
+ /** SDK retrieval result → the legacy `RecallResponse` fed to `buildRecalledContext`. */
41
+ export function toRecallResponse(data) {
42
+ const graph = data.graphContext;
43
+ const additional = {};
44
+ for (const [id, chunk] of Object.entries(data.additionalContext ?? {})) {
45
+ additional[id] = toVectorChunk(chunk);
46
+ }
47
+ return {
48
+ chunks: (data.chunks ?? []).map(toVectorChunk),
49
+ graph_context: graph
50
+ ? {
51
+ query_paths: (graph.queryPaths ?? []).map(toScoredPath),
52
+ chunk_relations: (graph.chunkRelations ?? []).map(toScoredPath),
53
+ chunk_id_to_group_ids: graph.chunkIdToGroupIds ?? {},
54
+ }
55
+ : undefined,
56
+ additional_context: additional,
57
+ };
58
+ }
59
+ /** SDK ingest result → the legacy `AddMemoryResponse` (success/failed counts). */
60
+ export function toAddMemoryResponse(data) {
61
+ return {
62
+ success: data.success ?? false,
63
+ message: data.message ?? "",
64
+ results: [],
65
+ success_count: data.successCount ?? 0,
66
+ failed_count: data.failedCount ?? 0,
67
+ };
68
+ }
69
+ function str(record, ...keys) {
70
+ for (const key of keys) {
71
+ const value = record[key];
72
+ if (typeof value === "string")
73
+ return value;
74
+ }
75
+ return undefined;
76
+ }
77
+ function asRecords(value) {
78
+ return Array.isArray(value)
79
+ ? value
80
+ : undefined;
81
+ }
82
+ /** SDK list result → memory rows. Field names vary across v2 records, so read defensively. */
83
+ export function toMemoryList(data) {
84
+ // Memory listings surface at top-level `user_memories` — not under an
85
+ // `.inner` wrapper, and not under `sources` (that is the knowledge shape).
86
+ const d = data;
87
+ const records = asRecords(d.user_memories) ??
88
+ asRecords(d.inner?.user_memories) ??
89
+ [];
90
+ return records.map((record) => ({
91
+ memory_id: str(record, "memory_id", "id", "source_id") ?? "",
92
+ memory_content: str(record, "memory_content", "content", "text", "memory", "title") ?? "",
93
+ }));
94
+ }
95
+ /** SDK list result → knowledge source rows + total. */
96
+ export function toSourceList(data) {
97
+ // Knowledge listings surface at top-level `sources`, not under `.inner`.
98
+ const d = data;
99
+ const records = asRecords(d.sources) ??
100
+ asRecords(d.inner?.sources) ??
101
+ [];
102
+ const sources = records.map((record) => ({
103
+ id: str(record, "id", "source_id") ?? "",
104
+ title: str(record, "title"),
105
+ type: str(record, "type", "source_type"),
106
+ }));
107
+ const total = d.total ?? d.inner?.total;
108
+ return {
109
+ sources,
110
+ total: typeof total === "number" ? total : sources.length,
111
+ };
112
+ }
113
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Server configuration from the environment.
3
+ *
4
+ * Adopts the canonical `HYDRADB_*` names (CONTRACT §1) as PRIMARY, while still
5
+ * honouring the legacy `HYDRA_DB_*` names as deprecated aliases so existing
6
+ * setups keep working. The canonical name wins when both are set; using a
7
+ * deprecated alias emits exactly one stderr warning per process naming the
8
+ * canonical replacement.
9
+ */
10
+ export interface HydraDBConfig {
11
+ apiKey: string;
12
+ database: string;
13
+ collection: string;
14
+ baseUrl?: string;
15
+ }
16
+ export type EnvSource = Record<string, string | undefined>;
17
+ export type WarnFn = (message: string) => void;
18
+ /**
19
+ * Read a canonical `HYDRADB_*` variable, falling back to the legacy `HYDRA_DB_*`
20
+ * spelling with a once-per-process warning. Exported so every variable this
21
+ * server reads goes through the same rule - `HYDRADB_LOG_LEVEL` is resolved by
22
+ * the logger, which owns its own module state but must not invent a second
23
+ * deprecation policy.
24
+ */
25
+ export declare function readEnv(env: EnvSource, canonical: string, deprecated: string, warn?: WarnFn): string | undefined;
26
+ export declare function resolveConfig(env?: EnvSource, warn?: WarnFn): HydraDBConfig;
package/dist/config.js ADDED
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Server configuration from the environment.
3
+ *
4
+ * Adopts the canonical `HYDRADB_*` names (CONTRACT §1) as PRIMARY, while still
5
+ * honouring the legacy `HYDRA_DB_*` names as deprecated aliases so existing
6
+ * setups keep working. The canonical name wins when both are set; using a
7
+ * deprecated alias emits exactly one stderr warning per process naming the
8
+ * canonical replacement.
9
+ */
10
+ const DEFAULT_COLLECTION = "hydra-db-mcp";
11
+ // Process-lifetime dedupe so each deprecated alias warns at most once.
12
+ const warnedOnce = new Set();
13
+ function defaultWarn(message) {
14
+ console.error(message);
15
+ }
16
+ function warnOnce(message, warn) {
17
+ if (warnedOnce.has(message))
18
+ return;
19
+ warnedOnce.add(message);
20
+ warn(message);
21
+ }
22
+ /**
23
+ * Read a canonical `HYDRADB_*` variable, falling back to the legacy `HYDRA_DB_*`
24
+ * spelling with a once-per-process warning. Exported so every variable this
25
+ * server reads goes through the same rule - `HYDRADB_LOG_LEVEL` is resolved by
26
+ * the logger, which owns its own module state but must not invent a second
27
+ * deprecation policy.
28
+ */
29
+ export function readEnv(env, canonical, deprecated, warn = defaultWarn) {
30
+ const canonicalValue = env[canonical];
31
+ if (canonicalValue != null && canonicalValue !== "") {
32
+ return canonicalValue;
33
+ }
34
+ const deprecatedValue = env[deprecated];
35
+ if (deprecatedValue != null && deprecatedValue !== "") {
36
+ warnOnce(`[hydradb-mcp] Environment variable ${deprecated} is deprecated; use ${canonical} instead.`, warn);
37
+ return deprecatedValue;
38
+ }
39
+ return undefined;
40
+ }
41
+ export function resolveConfig(env = process.env, warn = defaultWarn) {
42
+ const apiKey = readEnv(env, "HYDRADB_API_KEY", "HYDRA_DB_API_KEY", warn);
43
+ if (!apiKey) {
44
+ throw new Error("HYDRADB_API_KEY (or its deprecated alias HYDRA_DB_API_KEY) environment variable is required");
45
+ }
46
+ const database = readEnv(env, "HYDRADB_DATABASE", "HYDRA_DB_TENANT_ID", warn);
47
+ if (!database) {
48
+ throw new Error("HYDRADB_DATABASE (or its deprecated alias HYDRA_DB_TENANT_ID) environment variable is required");
49
+ }
50
+ const collection = readEnv(env, "HYDRADB_COLLECTION", "HYDRA_DB_SUB_TENANT_ID", warn) ??
51
+ DEFAULT_COLLECTION;
52
+ const baseUrl = readEnv(env, "HYDRADB_BASE_URL", "HYDRA_DB_BASE_URL", warn);
53
+ return { apiKey, database, collection, baseUrl };
54
+ }
55
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,uEAAuE;AACvE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AACrC,SAAS,WAAW,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AACD,SAAS,QAAQ,CAAC,OAAe,EAAE,IAAY;IAC9C,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO;IACpC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CACtB,GAAc,EACd,SAAiB,EACjB,UAAkB,EAClB,OAAe,WAAW;IAE1B,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC;IACvB,CAAC;IACD,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,eAAe,IAAI,IAAI,IAAI,eAAe,KAAK,EAAE,EAAE,CAAC;QACvD,QAAQ,CACP,sCAAsC,UAAU,uBAAuB,SAAS,WAAW,EAC3F,IAAI,CACJ,CAAC;QACF,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAC5B,MAAiB,OAAO,CAAC,GAAG,EAC5B,OAAe,WAAW;IAE1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,6FAA6F,CAC7F,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACd,gGAAgG,CAChG,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GACf,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,IAAI,CAAC;QAClE,kBAAkB,CAAC;IAEpB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAE5E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RecallResponse } from "./types.js";
2
+ export declare function buildRecalledContext(response: RecallResponse, opts?: {
3
+ maxGroupOccurrences?: number;
4
+ minEvidenceScore?: number;
5
+ }): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Tool descriptions for the Hydra DB MCP server.
3
+ * Kept in a separate file for easy editing and localisation.
4
+ *
5
+ * Every canonical tool (CONTRACT §3) and every deprecated alias has an entry.
6
+ * Alias descriptions are prefixed with a DEPRECATED notice naming the canonical
7
+ * replacement so the model prefers the new name.
8
+ */
9
+ export declare const TOOL_DESCRIPTIONS: {
10
+ readonly hydradb_query: {
11
+ readonly title: "Query Hydra DB";
12
+ readonly description: string;
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)";
18
+ };
19
+ };
20
+ readonly hydradb_ingest: {
21
+ readonly title: "Ingest into Hydra DB";
22
+ readonly description: string;
23
+ readonly params: {
24
+ readonly text: "The information to store in memory";
25
+ readonly title: "Optional title for the memory entry (default: 'MCP Memory')";
26
+ 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')";
31
+ };
32
+ };
33
+ readonly hydradb_list: {
34
+ readonly title: "List Hydra DB Context";
35
+ readonly description: string;
36
+ readonly params: {
37
+ readonly kind: "Which context family to list: 'memory' or 'knowledge' (default: 'memory')";
38
+ readonly source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.";
39
+ };
40
+ };
41
+ readonly hydradb_inspect: {
42
+ readonly title: "Inspect Hydra DB Source";
43
+ readonly description: string;
44
+ readonly params: {
45
+ 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')";
47
+ };
48
+ };
49
+ readonly hydradb_delete: {
50
+ readonly title: "Delete from Hydra DB";
51
+ readonly description: string;
52
+ readonly params: {
53
+ readonly id: "The ID of the item to delete";
54
+ readonly kind: "Which context family the ID belongs to: 'memory' or 'knowledge' (default: 'memory')";
55
+ };
56
+ };
57
+ readonly hydra_db_search: {
58
+ readonly title: "Search Hydra DB Memory (deprecated)";
59
+ readonly description: string;
60
+ 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)";
65
+ };
66
+ };
67
+ readonly hydra_db_store: {
68
+ readonly title: "Store to Hydra DB Memory (deprecated)";
69
+ readonly description: string;
70
+ readonly params: {
71
+ readonly text: "The information to store in memory";
72
+ readonly title: "Optional title for the memory entry (default: 'MCP Memory')";
73
+ 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)";
76
+ };
77
+ };
78
+ readonly hydra_db_ingest_conversation: {
79
+ readonly title: "Ingest Conversation (deprecated)";
80
+ readonly description: string;
81
+ readonly params: {
82
+ readonly turns: "Array of conversation turns, each with a 'user' and 'assistant' field";
83
+ 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')";
85
+ };
86
+ };
87
+ readonly hydra_db_list_memories: {
88
+ readonly title: "List Memories (deprecated)";
89
+ readonly description: string;
90
+ };
91
+ readonly hydra_db_list_sources: {
92
+ readonly title: "List Sources (deprecated)";
93
+ readonly description: string;
94
+ readonly params: {
95
+ readonly source_ids: "Optional array of specific source IDs to filter by. If omitted, lists all sources.";
96
+ };
97
+ };
98
+ readonly hydra_db_fetch_content: {
99
+ readonly title: "Fetch Source Content (deprecated)";
100
+ readonly description: string;
101
+ readonly params: {
102
+ 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')";
104
+ };
105
+ };
106
+ readonly hydra_db_delete_memory: {
107
+ readonly title: "Delete Memory (deprecated)";
108
+ readonly description: string;
109
+ readonly params: {
110
+ readonly memory_id: "The ID of the memory to delete";
111
+ };
112
+ };
113
+ };
114
+ export declare const SERVER_INSTRUCTIONS: string;