@hydradb/mcp 1.2.2 → 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.
@@ -47,6 +47,14 @@ export interface HydraConfig {
47
47
  database: string;
48
48
  /** Collection scope (canonical name for the sub-tenant). */
49
49
  collection?: string;
50
+ /**
51
+ * Databases a per-call `database` override may name. Absent means any.
52
+ * Set from an OAuth grant the user confined to specific databases; the
53
+ * default `database` is always allowed.
54
+ */
55
+ allowedDatabases?: string[];
56
+ /** Collections a per-call `collection` override may name. Absent means any. */
57
+ allowedCollections?: string[];
50
58
  /** Optional base URL override; defaults to the SDK's environment. */
51
59
  baseUrl?: string;
52
60
  /**
@@ -177,16 +185,45 @@ type ScopeFields = {
177
185
  database: string;
178
186
  collection?: string;
179
187
  };
188
+ /**
189
+ * A per-call `database` named one the connection is not allowed to touch.
190
+ *
191
+ * Written for the agent that reads it as a tool error: it names what IS
192
+ * allowed and where the choice was made, so the agent can either use an
193
+ * allowed database or tell the user to reconnect with wider access, rather
194
+ * than retrying blindly.
195
+ */
196
+ export declare class ScopeNotAllowedError extends Error {
197
+ readonly kind: "database" | "collection";
198
+ readonly requested: string;
199
+ readonly allowed: readonly string[];
200
+ constructor(kind: "database" | "collection", requested: string, allowed: readonly string[]);
201
+ }
202
+ /** Kept for the name callers already import; the database case of the above. */
203
+ export declare const DatabaseNotAllowedError: typeof ScopeNotAllowedError;
204
+ /** Throws unless `database` is one the connection may use. */
205
+ export declare function assertDatabaseAllowed(database: string, allowed: readonly string[] | undefined): void;
206
+ /**
207
+ * Throws unless `collection` is one the connection may use.
208
+ *
209
+ * Separate from the database check because confinement has to cover both:
210
+ * a caller pinned to one database can otherwise step sideways into a
211
+ * collection the consent screen never showed, and `drop_collection` makes
212
+ * that destructive.
213
+ */
214
+ export declare function assertCollectionAllowed(collection: string, allowed: readonly string[] | undefined): void;
180
215
  declare abstract class Resource {
181
216
  protected readonly sdk: HydraDBClient;
182
217
  private readonly database;
183
218
  private readonly collection?;
184
- protected constructor(sdk: HydraDBClient, database: string, collection?: string | undefined);
219
+ private readonly allowedDatabases?;
220
+ private readonly allowedCollections?;
221
+ protected constructor(sdk: HydraDBClient, database: string, collection?: string | undefined, allowedDatabases?: readonly string[] | undefined, allowedCollections?: readonly string[] | undefined);
185
222
  protected scope(override?: string, dbOverride?: string): ScopeFields;
186
223
  protected call<T>(path: string, fn: () => Promise<unknown>): Promise<T>;
187
224
  }
188
225
  export declare class ContextResource extends Resource {
189
- constructor(sdk: HydraDBClient, database: string, collection?: string);
226
+ constructor(sdk: HydraDBClient, database: string, collection?: string, allowedDatabases?: readonly string[], allowedCollections?: readonly string[]);
190
227
  /**
191
228
  * The single retrieval entry point (SDK `client.query`).
192
229
  *
@@ -214,7 +251,7 @@ export declare class ContextResource extends Resource {
214
251
  delete(params: DeleteParams, opts?: RequestOptions): Promise<SDK.SourcesMemoryDeleteResponse>;
215
252
  }
216
253
  export declare class DatabasesResource extends Resource {
217
- constructor(sdk: HydraDBClient, database: string, collection?: string);
254
+ constructor(sdk: HydraDBClient, database: string, collection?: string, allowedDatabases?: readonly string[], allowedCollections?: readonly string[]);
218
255
  create(params: CreateDatabaseParams): Promise<SDK.TenantsTenantCreateAcceptedResponse>;
219
256
  delete(database: string): Promise<SDK.TenantsTenantDeleteResponse>;
220
257
  list(): Promise<SDK.TenantsTenantIdsResponse>;
@@ -231,6 +268,14 @@ export declare class DatabasesResource extends Resource {
231
268
  export declare class HydraDB {
232
269
  readonly context: ContextResource;
233
270
  readonly databases: DatabasesResource;
271
+ /** The default database every unscoped call uses. */
272
+ readonly database: string;
273
+ /** Databases a per-call override may name; undefined means any. */
274
+ readonly allowedDatabases?: readonly string[];
275
+ /** Collections a per-call override may name; undefined means any. */
276
+ readonly allowedCollections?: readonly string[];
277
+ /** The default collection every unscoped call uses. */
278
+ readonly collection?: string;
234
279
  /**
235
280
  * BYOG graph operations. Not backed by the SDK — see ./graph.ts for why —
236
281
  * but exposed here so callers reach every HydraDB surface through one object.
@@ -47,15 +47,64 @@ const STDERR_LOGGER = {
47
47
  function req(opts) {
48
48
  return opts?.signal ? { abortSignal: opts.signal } : undefined;
49
49
  }
50
+ /**
51
+ * A per-call `database` named one the connection is not allowed to touch.
52
+ *
53
+ * Written for the agent that reads it as a tool error: it names what IS
54
+ * allowed and where the choice was made, so the agent can either use an
55
+ * allowed database or tell the user to reconnect with wider access, rather
56
+ * than retrying blindly.
57
+ */
58
+ export class ScopeNotAllowedError extends Error {
59
+ constructor(kind, requested, allowed) {
60
+ super(`This connection is confined to ${kind} ${allowed.map((d) => `"${d}"`).join(", ")} ` +
61
+ `and cannot use ${kind} "${requested}". The user chose this when approving the ` +
62
+ `connection; to use another ${kind} they must reconnect and allow it.`);
63
+ this.kind = kind;
64
+ this.requested = requested;
65
+ this.allowed = allowed;
66
+ this.name = "ScopeNotAllowedError";
67
+ }
68
+ }
69
+ /** Kept for the name callers already import; the database case of the above. */
70
+ export const DatabaseNotAllowedError = ScopeNotAllowedError;
71
+ /** Throws unless `database` is one the connection may use. */
72
+ export function assertDatabaseAllowed(database, allowed) {
73
+ if (allowed && !allowed.includes(database)) {
74
+ throw new ScopeNotAllowedError("database", database, allowed);
75
+ }
76
+ }
77
+ /**
78
+ * Throws unless `collection` is one the connection may use.
79
+ *
80
+ * Separate from the database check because confinement has to cover both:
81
+ * a caller pinned to one database can otherwise step sideways into a
82
+ * collection the consent screen never showed, and `drop_collection` makes
83
+ * that destructive.
84
+ */
85
+ export function assertCollectionAllowed(collection, allowed) {
86
+ if (allowed && !allowed.includes(collection)) {
87
+ throw new ScopeNotAllowedError("collection", collection, allowed);
88
+ }
89
+ }
50
90
  class Resource {
51
- constructor(sdk, database, collection) {
91
+ constructor(sdk, database, collection, allowedDatabases, allowedCollections) {
52
92
  this.sdk = sdk;
53
93
  this.database = database;
54
94
  this.collection = collection;
95
+ this.allowedDatabases = allowedDatabases;
96
+ this.allowedCollections = allowedCollections;
55
97
  }
56
98
  scope(override, dbOverride) {
57
99
  const database = dbOverride?.trim() || this.database;
100
+ // Enforced HERE, on the one path every per-call scope takes, so no tool
101
+ // can forget to check. The configured defaults are always allowed.
102
+ if (database !== this.database)
103
+ assertDatabaseAllowed(database, this.allowedDatabases);
58
104
  const collection = override?.trim() || this.collection;
105
+ if (collection && collection !== this.collection) {
106
+ assertCollectionAllowed(collection, this.allowedCollections);
107
+ }
59
108
  return collection != null && collection !== ""
60
109
  ? { database, collection }
61
110
  : { database };
@@ -65,6 +114,10 @@ class Resource {
65
114
  return unwrap(await fn());
66
115
  }
67
116
  catch (err) {
117
+ // A refused database is a decision the user made, not a transport
118
+ // failure from `path`; it keeps its own type and message.
119
+ if (err instanceof ScopeNotAllowedError)
120
+ throw err;
68
121
  throw translateError(path, err);
69
122
  }
70
123
  }
@@ -73,8 +126,8 @@ export class ContextResource extends Resource {
73
126
  // The base constructor is `protected`, so this one is what makes the class
74
127
  // instantiable from outside the file. Removing it fails with TS2674.
75
128
  // biome-ignore lint/complexity/noUselessConstructor: widens visibility
76
- constructor(sdk, database, collection) {
77
- super(sdk, database, collection);
129
+ constructor(sdk, database, collection, allowedDatabases, allowedCollections) {
130
+ super(sdk, database, collection, allowedDatabases, allowedCollections);
78
131
  }
79
132
  /**
80
133
  * The single retrieval entry point (SDK `client.query`).
@@ -250,8 +303,8 @@ export class DatabasesResource extends Resource {
250
303
  // The base constructor is `protected`, so this one is what makes the class
251
304
  // instantiable from outside the file. Removing it fails with TS2674.
252
305
  // biome-ignore lint/complexity/noUselessConstructor: widens visibility
253
- constructor(sdk, database, collection) {
254
- super(sdk, database, collection);
306
+ constructor(sdk, database, collection, allowedDatabases, allowedCollections) {
307
+ super(sdk, database, collection, allowedDatabases, allowedCollections);
255
308
  }
256
309
  create(params) {
257
310
  return this.call("/databases", () => this.sdk.databases.create({
@@ -298,8 +351,12 @@ export class HydraDB {
298
351
  // overridden — level and silencing keep the SDK's own defaults.
299
352
  logging: { logger: STDERR_LOGGER },
300
353
  });
301
- this.context = new ContextResource(client, config.database, config.collection);
302
- this.databases = new DatabasesResource(client, config.database, config.collection);
354
+ this.database = config.database;
355
+ this.collection = config.collection;
356
+ this.allowedDatabases = config.allowedDatabases;
357
+ this.allowedCollections = config.allowedCollections;
358
+ this.context = new ContextResource(client, config.database, config.collection, config.allowedDatabases, config.allowedCollections);
359
+ this.databases = new DatabasesResource(client, config.database, config.collection, config.allowedDatabases, config.allowedCollections);
303
360
  this.graph = new GraphResource({
304
361
  token: config.token,
305
362
  ...(config.baseUrl != null ? { baseUrl: config.baseUrl } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/hydra/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/hydra/client.ts"],"names":[],"mappings":"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"}
@@ -10,4 +10,5 @@ export type { HydraConfig, ContextKind, RequestOptions, QueryKind, ConversationT
10
10
  export { GraphResource } from "./graph.js";
11
11
  export type { GraphConfig, GraphQueryParams, GraphScopeParams, GraphRow, } from "./graph.js";
12
12
  export { HydraWrapperError, responseError, translateError } from "./errors.js";
13
+ export { assertCollectionAllowed, assertDatabaseAllowed, DatabaseNotAllowedError, ScopeNotAllowedError, } from "./client.js";
13
14
  export { unwrap } from "./envelope.js";
@@ -8,5 +8,6 @@
8
8
  export { HydraDB, ContextResource, DatabasesResource, DEFAULT_TIMEOUT_SECONDS, DEFAULT_MAX_RETRIES, } from "./client.js";
9
9
  export { GraphResource } from "./graph.js";
10
10
  export { HydraWrapperError, responseError, translateError } from "./errors.js";
11
+ export { assertCollectionAllowed, assertDatabaseAllowed, DatabaseNotAllowedError, ScopeNotAllowedError, } from "./client.js";
11
12
  export { unwrap } from "./envelope.js";
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hydra/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAO3C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hydra/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAO3C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EACN,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * The OAuth 2.1 RESOURCE-SERVER half of MCP authorization (PRO-1790).
3
+ *
4
+ * This server never issues tokens and never talks to the user. It does three
5
+ * things the MCP authorization spec asks of a protected resource:
6
+ *
7
+ * 1. Advertise where its authorization server is, via an RFC 9728 Protected
8
+ * Resource Metadata document at `/.well-known/oauth-protected-resource`,
9
+ * and point at that document from every 401 (`WWW-Authenticate`).
10
+ * 2. Recognise an access token the authorization server issued and turn it
11
+ * into the same {@link RequestCredentials} an API key would produce, by
12
+ * asking the authorization server what the token stands for (RFC 7662
13
+ * introspection). The answer carries the API key the dashboard minted on
14
+ * the user's Approve click, so the tool layer keeps calling Hydra DB
15
+ * exactly as it does for a key: nothing downstream knows OAuth exists.
16
+ * 3. Refuse a token that was not issued for THIS server (audience binding,
17
+ * RFC 8707), so a token minted for another resource cannot be replayed
18
+ * here.
19
+ *
20
+ * All of it is additive and switched on only by configuration: with no
21
+ * `HYDRADB_OAUTH_ISSUER` the server behaves exactly as before.
22
+ */
23
+ /** Access tokens the dashboard issues carry this prefix; keys carry `sk_`. */
24
+ export declare const ACCESS_TOKEN_PREFIX = "hmat_";
25
+ /** The one scope this resource defines. Granularity is PRO-1789's problem. */
26
+ export declare const SCOPE = "hydradb";
27
+ export interface OAuthConfig {
28
+ /** The authorization server, e.g. `https://app.hydradb.com`. No trailing slash. */
29
+ issuer: string;
30
+ /** This server's canonical URL as clients know it, e.g. `https://mcp.hydradb.com`. */
31
+ resource: string;
32
+ /** Shared secret presented to the issuer's introspection endpoint. */
33
+ introspectionSecret: string;
34
+ /** Overrides for tests. */
35
+ fetchFn?: typeof fetch;
36
+ now?: () => number;
37
+ }
38
+ /** Everything an introspected token stands for. Mirrors the dashboard's response. */
39
+ export interface IntrospectedToken {
40
+ apiKey: string;
41
+ database?: string;
42
+ collection?: string;
43
+ /**
44
+ * Databases a per-call `database` argument may name. Absent means any (the
45
+ * user chose to let the app switch when asked); present means the user
46
+ * confined the app to exactly these on the consent screen, and this server
47
+ * is where that promise is kept, because the API key behind the token is
48
+ * org-wide and the key never leaves this process.
49
+ */
50
+ allowedDatabases?: string[];
51
+ /**
52
+ * Collections a per-call `collection` argument may name, on the same terms.
53
+ * Confinement has to cover both or it means nothing: a caller pinned to one
54
+ * database could still step sideways into a collection the consent screen
55
+ * never showed and, through `drop_collection`, delete it.
56
+ */
57
+ allowedCollections?: string[];
58
+ userId?: string;
59
+ clientId?: string;
60
+ clientName?: string;
61
+ /** Epoch seconds. */
62
+ expiresAt: number;
63
+ }
64
+ export type IntrospectionResult = {
65
+ ok: true;
66
+ token: IntrospectedToken;
67
+ } | {
68
+ ok: false;
69
+ reason: "invalid_token" | "wrong_audience" | "unavailable";
70
+ detail?: string;
71
+ };
72
+ /**
73
+ * Read the OAuth configuration, or `null` when the feature is off.
74
+ *
75
+ * All three values are needed: an issuer says where to send clients, a
76
+ * resource says which audience to accept, and the secret is what makes the
77
+ * introspection answer trustworthy. Half a configuration is treated as none,
78
+ * with a startup warning, rather than as a server that advertises an
79
+ * authorization flow it cannot complete.
80
+ */
81
+ export declare function resolveOAuthConfig(env?: Record<string, string | undefined>, warn?: (message: string) => void): OAuthConfig | null;
82
+ /** Where the Protected Resource Metadata document lives for this server. */
83
+ export declare function metadataUrl(config: OAuthConfig, mcpPath?: string): string;
84
+ /** The RFC 9728 document itself. */
85
+ export declare function protectedResourceMetadata(config: OAuthConfig): Record<string, unknown>;
86
+ /**
87
+ * The `WWW-Authenticate` value for a 401.
88
+ *
89
+ * `resource_metadata` is how a client that arrived with nothing learns where
90
+ * to log in (the MCP spec's first discovery step), and `scope` tells it what
91
+ * to ask for. `error` is included only when a token was PRESENTED and refused,
92
+ * so an anonymous first contact reads as "authenticate" rather than "your
93
+ * token is bad".
94
+ */
95
+ export declare function wwwAuthenticate(config: OAuthConfig, error?: "invalid_token" | "insufficient_scope", description?: string): string;
96
+ /** Whether a bearer value is one of OUR access tokens rather than an API key. */
97
+ export declare function isAccessToken(bearer: string | undefined): bearer is string;
98
+ /** Test-only. */
99
+ export declare function __resetIntrospectionCache(): void;
100
+ /**
101
+ * Ask the issuer what a token stands for.
102
+ *
103
+ * The response shape is the contract in PRO-1790: `active`, `aud`, `exp`,
104
+ * `api_key`, `database`, `collection`, `sub`, `client_id`, `client_name`.
105
+ * Audience is checked HERE, not trusted from the issuer's say-so: the issuer
106
+ * may legitimately serve several resources, and this server must only honour
107
+ * tokens minted for itself.
108
+ */
109
+ export declare function introspect(config: OAuthConfig, token: string): Promise<IntrospectionResult>;
package/dist/oauth.js ADDED
@@ -0,0 +1,228 @@
1
+ /**
2
+ * The OAuth 2.1 RESOURCE-SERVER half of MCP authorization (PRO-1790).
3
+ *
4
+ * This server never issues tokens and never talks to the user. It does three
5
+ * things the MCP authorization spec asks of a protected resource:
6
+ *
7
+ * 1. Advertise where its authorization server is, via an RFC 9728 Protected
8
+ * Resource Metadata document at `/.well-known/oauth-protected-resource`,
9
+ * and point at that document from every 401 (`WWW-Authenticate`).
10
+ * 2. Recognise an access token the authorization server issued and turn it
11
+ * into the same {@link RequestCredentials} an API key would produce, by
12
+ * asking the authorization server what the token stands for (RFC 7662
13
+ * introspection). The answer carries the API key the dashboard minted on
14
+ * the user's Approve click, so the tool layer keeps calling Hydra DB
15
+ * exactly as it does for a key: nothing downstream knows OAuth exists.
16
+ * 3. Refuse a token that was not issued for THIS server (audience binding,
17
+ * RFC 8707), so a token minted for another resource cannot be replayed
18
+ * here.
19
+ *
20
+ * All of it is additive and switched on only by configuration: with no
21
+ * `HYDRADB_OAUTH_ISSUER` the server behaves exactly as before.
22
+ */
23
+ import { createHash } from "node:crypto";
24
+ import { logger } from "./logger.js";
25
+ /** Access tokens the dashboard issues carry this prefix; keys carry `sk_`. */
26
+ export const ACCESS_TOKEN_PREFIX = "hmat_";
27
+ /** The one scope this resource defines. Granularity is PRO-1789's problem. */
28
+ export const SCOPE = "hydradb";
29
+ function stripSlash(url) {
30
+ return url.replace(/\/+$/, "");
31
+ }
32
+ /**
33
+ * Read the OAuth configuration, or `null` when the feature is off.
34
+ *
35
+ * All three values are needed: an issuer says where to send clients, a
36
+ * resource says which audience to accept, and the secret is what makes the
37
+ * introspection answer trustworthy. Half a configuration is treated as none,
38
+ * with a startup warning, rather than as a server that advertises an
39
+ * authorization flow it cannot complete.
40
+ */
41
+ export function resolveOAuthConfig(env = process.env, warn = (m) => console.error(`[hydradb-mcp] ${m}`)) {
42
+ const issuer = env.HYDRADB_OAUTH_ISSUER?.trim();
43
+ const resource = env.HYDRADB_MCP_PUBLIC_URL?.trim();
44
+ const introspectionSecret = env.HYDRADB_OAUTH_INTROSPECTION_SECRET?.trim();
45
+ if (!issuer && !resource && !introspectionSecret)
46
+ return null;
47
+ const missing = [
48
+ !issuer && "HYDRADB_OAUTH_ISSUER",
49
+ !resource && "HYDRADB_MCP_PUBLIC_URL",
50
+ !introspectionSecret && "HYDRADB_OAUTH_INTROSPECTION_SECRET",
51
+ ].filter(Boolean);
52
+ if (missing.length > 0) {
53
+ warn(`WARNING: OAuth is partially configured (missing ${missing.join(", ")}); ` +
54
+ "it stays OFF until all three are set.");
55
+ return null;
56
+ }
57
+ for (const [name, value] of [
58
+ ["HYDRADB_OAUTH_ISSUER", issuer],
59
+ ["HYDRADB_MCP_PUBLIC_URL", resource],
60
+ ]) {
61
+ if (!/^https?:\/\//i.test(value)) {
62
+ warn(`WARNING: ${name} must be an absolute http(s) URL; OAuth stays OFF.`);
63
+ return null;
64
+ }
65
+ }
66
+ return {
67
+ issuer: stripSlash(issuer),
68
+ resource: stripSlash(resource),
69
+ introspectionSecret: introspectionSecret,
70
+ };
71
+ }
72
+ /** Where the Protected Resource Metadata document lives for this server. */
73
+ export function metadataUrl(config, mcpPath = "") {
74
+ // RFC 9728 puts the well-known segment BEFORE the resource's path, so a
75
+ // server at /mcp advertises at /.well-known/oauth-protected-resource/mcp.
76
+ return `${config.resource}/.well-known/oauth-protected-resource${mcpPath}`;
77
+ }
78
+ /** The RFC 9728 document itself. */
79
+ export function protectedResourceMetadata(config) {
80
+ return {
81
+ resource: config.resource,
82
+ authorization_servers: [config.issuer],
83
+ scopes_supported: [SCOPE],
84
+ bearer_methods_supported: ["header"],
85
+ resource_name: "Hydra DB MCP",
86
+ resource_documentation: "https://docs.hydradb.com/mcp",
87
+ };
88
+ }
89
+ /**
90
+ * The `WWW-Authenticate` value for a 401.
91
+ *
92
+ * `resource_metadata` is how a client that arrived with nothing learns where
93
+ * to log in (the MCP spec's first discovery step), and `scope` tells it what
94
+ * to ask for. `error` is included only when a token was PRESENTED and refused,
95
+ * so an anonymous first contact reads as "authenticate" rather than "your
96
+ * token is bad".
97
+ */
98
+ export function wwwAuthenticate(config, error, description) {
99
+ const parts = [`Bearer realm="Hydra DB MCP"`];
100
+ if (error)
101
+ parts.push(`error="${error}"`);
102
+ if (description)
103
+ parts.push(`error_description="${description.replace(/"/g, "'")}"`);
104
+ parts.push(`resource_metadata="${metadataUrl(config)}"`);
105
+ parts.push(`scope="${SCOPE}"`);
106
+ return parts.join(", ");
107
+ }
108
+ /** Whether a bearer value is one of OUR access tokens rather than an API key. */
109
+ export function isAccessToken(bearer) {
110
+ return typeof bearer === "string" && bearer.startsWith(ACCESS_TOKEN_PREFIX);
111
+ }
112
+ // --- Introspection, with a bounded memo ---
113
+ /**
114
+ * Introspection answers are memoised per token so the hosted server, which
115
+ * builds a client per request, does not ask the dashboard on every tool call.
116
+ * Only successes are cached, for the shorter of the token's own expiry and
117
+ * this ceiling. The ceiling IS the revocation lag: measured end to end, a
118
+ * disconnect or a refresh-token reuse detection reaches this server exactly
119
+ * one ceiling later. Thirty seconds keeps an agent's burst of tool calls at
120
+ * one hop while keeping that lag short enough that a revoked token cannot do
121
+ * much with it.
122
+ */
123
+ const INTROSPECTION_CACHE_TTL_MS = 30000;
124
+ const INTROSPECTION_CACHE_MAX = 5000;
125
+ const INTROSPECTION_TIMEOUT_MS = 5000;
126
+ const cache = new Map();
127
+ /** Test-only. */
128
+ export function __resetIntrospectionCache() {
129
+ cache.clear();
130
+ }
131
+ function cacheKey(token) {
132
+ // Never keep the raw token as a Map key: it would sit in memory in the
133
+ // clear for as long as the entry lives.
134
+ return createHash("sha256").update(token).digest("hex");
135
+ }
136
+ /**
137
+ * Ask the issuer what a token stands for.
138
+ *
139
+ * The response shape is the contract in PRO-1790: `active`, `aud`, `exp`,
140
+ * `api_key`, `database`, `collection`, `sub`, `client_id`, `client_name`.
141
+ * Audience is checked HERE, not trusted from the issuer's say-so: the issuer
142
+ * may legitimately serve several resources, and this server must only honour
143
+ * tokens minted for itself.
144
+ */
145
+ export async function introspect(config, token) {
146
+ const now = config.now ?? Date.now;
147
+ const key = cacheKey(token);
148
+ const hit = cache.get(key);
149
+ if (hit && hit.expires > now())
150
+ return { ok: true, token: hit.token };
151
+ if (hit)
152
+ cache.delete(key);
153
+ const fetchFn = config.fetchFn ?? fetch;
154
+ const controller = new AbortController();
155
+ const timer = setTimeout(() => controller.abort(), INTROSPECTION_TIMEOUT_MS);
156
+ let body;
157
+ try {
158
+ const res = await fetchFn(`${config.issuer}/api/oauth/introspect`, {
159
+ method: "POST",
160
+ headers: {
161
+ "Content-Type": "application/x-www-form-urlencoded",
162
+ Accept: "application/json",
163
+ Authorization: `Bearer ${config.introspectionSecret}`,
164
+ },
165
+ body: new URLSearchParams({ token }).toString(),
166
+ signal: controller.signal,
167
+ });
168
+ if (res.status === 401 || res.status === 403) {
169
+ // Our secret was refused. That is an operator problem, not the
170
+ // caller's, and it must not read as "your token is invalid".
171
+ logger.error("introspection refused: HYDRADB_OAUTH_INTROSPECTION_SECRET is not accepted by the issuer");
172
+ return { ok: false, reason: "unavailable", detail: "introspection refused" };
173
+ }
174
+ if (!res.ok) {
175
+ return { ok: false, reason: "unavailable", detail: `introspection HTTP ${res.status}` };
176
+ }
177
+ body = (await res.json());
178
+ }
179
+ catch (err) {
180
+ return {
181
+ ok: false,
182
+ reason: "unavailable",
183
+ detail: err instanceof Error ? err.message : String(err),
184
+ };
185
+ }
186
+ finally {
187
+ clearTimeout(timer);
188
+ }
189
+ if (body.active !== true)
190
+ return { ok: false, reason: "invalid_token" };
191
+ const aud = body.aud;
192
+ const audiences = Array.isArray(aud) ? aud : typeof aud === "string" ? [aud] : [];
193
+ if (!audiences.some((a) => typeof a === "string" && stripSlash(a) === config.resource)) {
194
+ return { ok: false, reason: "wrong_audience" };
195
+ }
196
+ const apiKey = typeof body.api_key === "string" ? body.api_key : "";
197
+ const exp = typeof body.exp === "number" ? body.exp : 0;
198
+ if (!apiKey || exp <= Math.floor(now() / 1000)) {
199
+ return { ok: false, reason: "invalid_token" };
200
+ }
201
+ const stringList = (v) => Array.isArray(v)
202
+ ? v.filter((d) => typeof d === "string" && d.length > 0)
203
+ : undefined;
204
+ const allowed = stringList(body.databases);
205
+ const allowedCols = stringList(body.collections);
206
+ const resolved = {
207
+ apiKey,
208
+ ...(allowed ? { allowedDatabases: allowed } : {}),
209
+ ...(allowedCols ? { allowedCollections: allowedCols } : {}),
210
+ database: typeof body.database === "string" && body.database ? body.database : undefined,
211
+ collection: typeof body.collection === "string" && body.collection ? body.collection : undefined,
212
+ userId: typeof body.sub === "string" ? body.sub : undefined,
213
+ clientId: typeof body.client_id === "string" ? body.client_id : undefined,
214
+ clientName: typeof body.client_name === "string" ? body.client_name : undefined,
215
+ expiresAt: exp,
216
+ };
217
+ if (cache.size >= INTROSPECTION_CACHE_MAX) {
218
+ const oldest = cache.keys().next().value;
219
+ if (oldest != null)
220
+ cache.delete(oldest);
221
+ }
222
+ cache.set(key, {
223
+ token: resolved,
224
+ expires: Math.min(now() + INTROSPECTION_CACHE_TTL_MS, exp * 1000),
225
+ });
226
+ return { ok: true, token: resolved };
227
+ }
228
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -19,12 +19,20 @@ export declare function inFlightCount(): number;
19
19
  export declare function legacyToolsEnabled(env?: NodeJS.ProcessEnv): boolean;
20
20
  /** Test-only: reset the once-per-process alias warning dedupe. */
21
21
  export declare function __resetAliasWarnings(): void;
22
+ export interface ServerOptions {
23
+ /**
24
+ * Register the OAuth-connection tools (currently `hydradb_databases`).
25
+ * Set by the HTTP transport when the request authenticated with an OAuth
26
+ * token; never for API keys, so their tool list is unchanged.
27
+ */
28
+ oauthTools?: boolean;
29
+ }
22
30
  export declare function createHydraDBServer(hydraOverride?: HydraDB,
23
31
  /**
24
32
  * Graph scope/gating override, for tests and embedders. Without it the graph
25
33
  * config is read from the environment exactly as the rest of the config is.
26
34
  */
27
- graphOverride?: Partial<GraphConfig>): import("@modelcontextprotocol/sdk/server").Server<{
35
+ graphOverride?: Partial<GraphConfig>, options?: ServerOptions): import("@modelcontextprotocol/sdk/server").Server<{
28
36
  method: string;
29
37
  params?: {
30
38
  [x: string]: unknown;