@databasin/mcp-client 0.2.0-beta.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +30 -26
  2. package/dist/auth-schema.d.ts +23 -0
  3. package/dist/auth-schema.d.ts.map +1 -0
  4. package/dist/auth-schema.js +42 -0
  5. package/dist/auth-schema.js.map +1 -0
  6. package/dist/auth-tools.d.ts +10 -0
  7. package/dist/auth-tools.d.ts.map +1 -0
  8. package/dist/auth-tools.js +60 -0
  9. package/dist/auth-tools.js.map +1 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +2 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/mcp-endpoint.d.ts +5 -0
  18. package/dist/mcp-endpoint.d.ts.map +1 -0
  19. package/dist/mcp-endpoint.js +22 -0
  20. package/dist/mcp-endpoint.js.map +1 -0
  21. package/dist/proxy-tools.d.ts +5 -0
  22. package/dist/proxy-tools.d.ts.map +1 -0
  23. package/dist/proxy-tools.js +39 -0
  24. package/dist/proxy-tools.js.map +1 -0
  25. package/dist/remote-mcp.d.ts +27 -0
  26. package/dist/remote-mcp.d.ts.map +1 -0
  27. package/dist/remote-mcp.js +70 -0
  28. package/dist/remote-mcp.js.map +1 -0
  29. package/dist/server.d.ts +3 -3
  30. package/dist/server.d.ts.map +1 -1
  31. package/dist/server.js +16 -6
  32. package/dist/server.js.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.d.ts.map +1 -1
  35. package/dist/version.js +1 -1
  36. package/dist/version.js.map +1 -1
  37. package/package.json +3 -2
  38. package/dist/abort.d.ts +0 -5
  39. package/dist/abort.d.ts.map +0 -1
  40. package/dist/abort.js +0 -25
  41. package/dist/abort.js.map +0 -1
  42. package/dist/api-client.d.ts +0 -58
  43. package/dist/api-client.d.ts.map +0 -1
  44. package/dist/api-client.js +0 -151
  45. package/dist/api-client.js.map +0 -1
  46. package/dist/api-contract.d.ts +0 -59
  47. package/dist/api-contract.d.ts.map +0 -1
  48. package/dist/api-contract.js +0 -47
  49. package/dist/api-contract.js.map +0 -1
  50. package/dist/api-profile.d.ts +0 -5
  51. package/dist/api-profile.d.ts.map +0 -1
  52. package/dist/api-profile.js +0 -38
  53. package/dist/api-profile.js.map +0 -1
  54. package/dist/api-request.d.ts +0 -27
  55. package/dist/api-request.d.ts.map +0 -1
  56. package/dist/api-request.js +0 -147
  57. package/dist/api-request.js.map +0 -1
  58. package/dist/api-response.d.ts +0 -9
  59. package/dist/api-response.d.ts.map +0 -1
  60. package/dist/api-response.js +0 -206
  61. package/dist/api-response.js.map +0 -1
  62. package/dist/schemas.d.ts +0 -431
  63. package/dist/schemas.d.ts.map +0 -1
  64. package/dist/schemas.js +0 -289
  65. package/dist/schemas.js.map +0 -1
  66. package/dist/tools.d.ts +0 -28
  67. package/dist/tools.d.ts.map +0 -1
  68. package/dist/tools.js +0 -328
  69. package/dist/tools.js.map +0 -1
@@ -1,147 +0,0 @@
1
- import { abortableDelay, abortedRequest, throwIfAborted } from './abort.js';
2
- import { resolveMcpEndpoint } from './api-contract.js';
3
- import { errorCorrelationId, mapHttpError, parseRetryAfter, readJsonResponse, responseCorrelationId, validCorrelationId, withCorrelation } from './api-response.js';
4
- import { DataBasinError } from './errors.js';
5
- import { correlationId } from './safety.js';
6
- export async function executeFacadeRequest(options, request) {
7
- throwIfAborted(request.signal);
8
- const accessToken = await acquireAccessToken(options.getAccessToken, request.signal);
9
- throwIfAborted(request.signal);
10
- const requestCorrelationId = correlationId();
11
- const endpoint = resolveMcpEndpoint(request.endpoint, { runId: request.runId, queryId: request.queryId, query: request.query });
12
- for (let attempt = 0;; attempt += 1) {
13
- throwIfAborted(request.signal, requestCorrelationId);
14
- const result = await fetchAttempt(options, request, endpoint, accessToken, requestCorrelationId);
15
- const serverCorrelationId = responseCorrelationId(result.response);
16
- if (result.response.ok) {
17
- return parseSuccess(result, request.schema, serverCorrelationId, requestCorrelationId);
18
- }
19
- const effectiveId = serverCorrelationId ?? errorCorrelationId(result.payload) ?? requestCorrelationId;
20
- const retryAfter = parseRetryAfter(result.response.headers.get('retry-after'), options.now());
21
- if (!isRetryable(result.response.status, attempt, retryAfter)) {
22
- throw mapHttpError(result.response.status, result.payload, effectiveId, retryAfter);
23
- }
24
- await waitForRetry(options, retryAfter, request.signal, effectiveId);
25
- throwIfAborted(request.signal, effectiveId);
26
- }
27
- }
28
- export const defaultRetryDelay = abortableDelay;
29
- async function acquireAccessToken(getAccessToken, signal) {
30
- throwIfAborted(signal);
31
- let pending;
32
- try {
33
- pending = getAccessToken();
34
- }
35
- catch (error) {
36
- throwIfAborted(signal);
37
- throw error;
38
- }
39
- const accessToken = await settleWithAbort(pending, signal);
40
- throwIfAborted(signal);
41
- return accessToken;
42
- }
43
- async function settleWithAbort(pending, signal) {
44
- if (!signal)
45
- return pending;
46
- throwIfAborted(signal);
47
- return new Promise((resolve, reject) => {
48
- const cleanup = () => signal.removeEventListener('abort', abort);
49
- const abort = () => {
50
- cleanup();
51
- reject(abortedRequest());
52
- };
53
- signal.addEventListener('abort', abort, { once: true });
54
- pending.then((value) => {
55
- cleanup();
56
- resolve(value);
57
- }, (error) => {
58
- cleanup();
59
- reject(error);
60
- });
61
- if (signal.aborted)
62
- abort();
63
- });
64
- }
65
- async function fetchAttempt(options, request, endpoint, accessToken, requestCorrelationId) {
66
- const controller = new AbortController();
67
- let timedOut = false;
68
- const timeout = setTimeout(() => {
69
- timedOut = true;
70
- controller.abort();
71
- }, request.timeoutMs ?? options.timeoutMs);
72
- const abortCaller = () => controller.abort();
73
- request.signal?.addEventListener('abort', abortCaller, { once: true });
74
- let response;
75
- try {
76
- throwIfAborted(request.signal, requestCorrelationId);
77
- response = await (options.fetchImpl ?? globalThis.fetch)(`${options.baseUrl}${endpoint.path}`, requestInit(request, endpoint.method, accessToken, requestCorrelationId, controller.signal));
78
- if (response.redirected)
79
- throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned an unexpected redirect.');
80
- return { response, payload: await readJsonResponse(response, options.maxResponseBytes, controller.signal) };
81
- }
82
- catch (error) {
83
- throw normalizeAttemptError(error, response, request.signal, timedOut, requestCorrelationId);
84
- }
85
- finally {
86
- clearTimeout(timeout);
87
- request.signal?.removeEventListener('abort', abortCaller);
88
- }
89
- }
90
- function requestInit(request, method, accessToken, requestCorrelationId, signal) {
91
- return {
92
- method,
93
- signal,
94
- redirect: 'error',
95
- headers: {
96
- accept: 'application/json',
97
- // Caller headers are spread first so the reserved headers below always win.
98
- ...request.headers,
99
- ...(request.body === undefined ? {} : { 'content-type': 'application/json' }),
100
- authorization: `Bearer ${accessToken}`,
101
- 'x-correlation-id': requestCorrelationId
102
- },
103
- ...(request.body === undefined ? {} : { body: JSON.stringify(request.body) })
104
- };
105
- }
106
- function normalizeAttemptError(error, response, callerSignal, timedOut, requestCorrelationId) {
107
- const effectiveId = responseCorrelationIdIfPresent(response)
108
- ?? errorCorrelationIfPresent(error)
109
- ?? requestCorrelationId;
110
- if (callerSignal?.aborted)
111
- return abortedRequest(effectiveId);
112
- if (timedOut)
113
- return new DataBasinError('REQUEST_TIMEOUT', 'The DataBasin request timed out.', { correlationId: effectiveId });
114
- if (error instanceof DataBasinError)
115
- return withCorrelation(error, effectiveId);
116
- return new DataBasinError('DEPENDENCY_UNAVAILABLE', 'The DataBasin API could not be reached.', { correlationId: effectiveId });
117
- }
118
- function parseSuccess(result, schema, serverCorrelationId, requestCorrelationId) {
119
- if (!serverCorrelationId) {
120
- throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API omitted a valid correlation identifier.', { correlationId: requestCorrelationId });
121
- }
122
- const parsed = schema.safeParse(result.payload);
123
- if (!parsed.success || parsed.data.correlationId !== serverCorrelationId) {
124
- throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned an invalid success envelope.', { correlationId: serverCorrelationId });
125
- }
126
- return parsed.data;
127
- }
128
- async function waitForRetry(options, milliseconds, signal, correlation) {
129
- try {
130
- await options.sleepImpl(milliseconds, signal);
131
- }
132
- catch {
133
- if (signal?.aborted)
134
- throw abortedRequest(correlation);
135
- throw new DataBasinError('REQUEST_TIMEOUT', 'The DataBasin retry window expired.', { correlationId: correlation });
136
- }
137
- }
138
- function isRetryable(status, attempt, retryAfter) {
139
- return (status === 429 || status === 503) && attempt === 0 && retryAfter !== undefined;
140
- }
141
- function responseCorrelationIdIfPresent(response) {
142
- return response === undefined ? undefined : responseCorrelationId(response);
143
- }
144
- function errorCorrelationIfPresent(error) {
145
- return error instanceof DataBasinError ? validCorrelationId(error.details.correlationId) : undefined;
146
- }
147
- //# sourceMappingURL=api-request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-request.js","sourceRoot":"","sources":["../src/api-request.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { DataBasinError } from './errors.js';
2
- export { validCorrelationId } from './correlation.js';
3
- export declare function readJsonResponse(response: Response, maxBytes: number, signal: AbortSignal): Promise<unknown>;
4
- export declare function parseRetryAfter(value: string | null, nowMs: number, maximumMs?: number): number | undefined;
5
- export declare function mapHttpError(status: number, payload: unknown, correlationId: string, retryAfterMs: number | undefined): DataBasinError;
6
- export declare function responseCorrelationId(response: Response): string | undefined;
7
- export declare function errorCorrelationId(payload: unknown): string | undefined;
8
- export declare function withCorrelation(error: DataBasinError, correlationId: string): DataBasinError;
9
- //# sourceMappingURL=api-response.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-response.d.ts","sourceRoot":"","sources":["../src/api-response.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA+C,MAAM,aAAa,CAAC;AAE1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,SAAQ,GAChB,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,cAAc,CAShB;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAK5F"}
@@ -1,206 +0,0 @@
1
- import { validCorrelationId } from './correlation.js';
2
- import { DataBasinError, LoginRequiredError } from './errors.js';
3
- export { validCorrelationId } from './correlation.js';
4
- export async function readJsonResponse(response, maxBytes, signal) {
5
- assertJsonResponse(response, maxBytes);
6
- const reader = response.body.getReader();
7
- const chunks = await readBoundedChunks(reader, maxBytes, signal);
8
- try {
9
- return JSON.parse(new TextDecoder().decode(joinChunks(chunks)));
10
- }
11
- catch {
12
- throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned invalid JSON.');
13
- }
14
- }
15
- export function parseRetryAfter(value, nowMs, maximumMs = 5_000) {
16
- if (value === null)
17
- return undefined;
18
- const trimmed = value.trim();
19
- if (/^\d+$/u.test(trimmed))
20
- return Math.min(Number(trimmed) * 1_000, maximumMs);
21
- const date = Date.parse(trimmed);
22
- if (!Number.isFinite(date))
23
- return undefined;
24
- return Math.min(Math.max(0, date - nowMs), maximumMs);
25
- }
26
- export function mapHttpError(status, payload, correlationId, retryAfterMs) {
27
- const code = safeServerCode(payload) ?? statusCode(status);
28
- if (status === 401)
29
- return new LoginRequiredError('DataBasin', { correlationId });
30
- const reason = code === 'POLICY_DENIED' ? safeReason(payload) : undefined;
31
- return new DataBasinError(code, ERROR_MESSAGES[code], {
32
- correlationId,
33
- ...(retryAfterMs === undefined ? {} : { retryAfterMs }),
34
- ...(reason === undefined ? {} : { reason })
35
- });
36
- }
37
- export function responseCorrelationId(response) {
38
- return validCorrelationId(response.headers.get('x-correlation-id'));
39
- }
40
- export function errorCorrelationId(payload) {
41
- return validCorrelationId(asRecord(asRecord(payload).error).correlationId);
42
- }
43
- export function withCorrelation(error, correlationId) {
44
- return new DataBasinError(error.code, error.message, {
45
- ...error.details,
46
- correlationId
47
- });
48
- }
49
- function assertJsonResponse(response, maxBytes) {
50
- const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
51
- if (!contentType.includes('application/json') && !contentType.includes('+json')) {
52
- throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned a non-JSON response.');
53
- }
54
- const contentLength = Number(response.headers.get('content-length'));
55
- if (Number.isFinite(contentLength) && contentLength > maxBytes) {
56
- throw new DataBasinError('POLICY_DENIED', 'The DataBasin API response exceeded the size limit.');
57
- }
58
- if (!response.body)
59
- throw new DataBasinError('OPERATION_FAILED', 'The DataBasin API returned an empty response.');
60
- }
61
- async function readBoundedChunks(reader, maxBytes, signal) {
62
- const chunks = [];
63
- let total = 0;
64
- while (true) {
65
- const { done, value } = await readChunk(reader, signal);
66
- if (done)
67
- return chunks;
68
- total += value.byteLength;
69
- if (total > maxBytes) {
70
- cancelReaderBestEffort(reader);
71
- throw new DataBasinError('POLICY_DENIED', 'The DataBasin API response exceeded the size limit.');
72
- }
73
- chunks.push(value);
74
- }
75
- }
76
- async function readChunk(reader, signal) {
77
- if (signal.aborted) {
78
- cancelReaderBestEffort(reader);
79
- throw new Error('aborted');
80
- }
81
- return new Promise((resolve, reject) => {
82
- const abort = () => {
83
- cancelReaderBestEffort(reader);
84
- reject(new Error('aborted'));
85
- };
86
- signal.addEventListener('abort', abort, { once: true });
87
- reader.read().then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
88
- });
89
- }
90
- function joinChunks(chunks) {
91
- const total = chunks.reduce((size, chunk) => size + chunk.byteLength, 0);
92
- const bytes = new Uint8Array(total);
93
- let offset = 0;
94
- for (const chunk of chunks) {
95
- bytes.set(chunk, offset);
96
- offset += chunk.byteLength;
97
- }
98
- return bytes;
99
- }
100
- function cancelReaderBestEffort(reader) {
101
- try {
102
- void reader.cancel().catch(() => undefined);
103
- }
104
- catch {
105
- // Cleanup must never delay or replace the bounded failure.
106
- }
107
- }
108
- function statusCode(status) {
109
- if (status === 401)
110
- return 'UNAUTHENTICATED';
111
- if (status === 403)
112
- return 'POLICY_DENIED';
113
- if (status === 404)
114
- return 'NOT_FOUND';
115
- if (status === 408 || status === 504)
116
- return 'REQUEST_TIMEOUT';
117
- if (status === 429)
118
- return 'RATE_LIMITED';
119
- if (status >= 500)
120
- return 'DEPENDENCY_UNAVAILABLE';
121
- return 'OPERATION_FAILED';
122
- }
123
- function safeServerCode(payload) {
124
- const object = asRecord(payload);
125
- const nested = asRecord(object.error);
126
- const value = typeof object.code === 'string'
127
- ? object.code
128
- : typeof nested.code === 'string' ? nested.code : undefined;
129
- if (!value)
130
- return undefined;
131
- const normalized = value.toLowerCase();
132
- return SERVER_CODE_ALIASES[normalized]
133
- ?? (KNOWN_CODES.has(value) ? value : undefined);
134
- }
135
- // Populated only when the facade's "reason" is an EXACT match against this
136
- // client's own copy of the allowlist -- never trust the facade's message text
137
- // otherwise, and never substring/prefix match. This is additive to (never a
138
- // replacement for) the generic ERROR_MESSAGES text above.
139
- function safeReason(payload) {
140
- const object = asRecord(payload);
141
- const nested = asRecord(object.error);
142
- const value = typeof object.reason === 'string'
143
- ? object.reason
144
- : typeof nested.reason === 'string' ? nested.reason : undefined;
145
- return value !== undefined && POLICY_DENIED_REASONS.has(value) ? value : undefined;
146
- }
147
- function asRecord(value) {
148
- return value && typeof value === 'object' && !Array.isArray(value)
149
- ? value
150
- : {};
151
- }
152
- const SERVER_CODE_ALIASES = Object.freeze({
153
- invalid_argument: 'INVALID_ARGUMENT',
154
- invalid_request: 'INVALID_ARGUMENT',
155
- unauthorized: 'UNAUTHENTICATED',
156
- unauthenticated: 'UNAUTHENTICATED',
157
- not_found: 'NOT_FOUND',
158
- forbidden: 'POLICY_DENIED',
159
- policy_denied: 'POLICY_DENIED',
160
- rate_limited: 'RATE_LIMITED',
161
- request_timeout: 'REQUEST_TIMEOUT',
162
- dependency_unavailable: 'DEPENDENCY_UNAVAILABLE',
163
- operation_failed: 'OPERATION_FAILED',
164
- internal_error: 'INTERNAL_ERROR'
165
- });
166
- const ERROR_MESSAGES = Object.freeze({
167
- INVALID_ARGUMENT: 'The DataBasin request was invalid.',
168
- UNAUTHENTICATED: 'DataBasin login is required.',
169
- NOT_FOUND: 'The requested DataBasin resource was not found.',
170
- POLICY_DENIED: 'DataBasin denied access to this resource.',
171
- RATE_LIMITED: 'DataBasin temporarily rate-limited this request.',
172
- REQUEST_ABORTED: 'The DataBasin request was cancelled by the caller.',
173
- REQUEST_TIMEOUT: 'The DataBasin request timed out.',
174
- DEPENDENCY_UNAVAILABLE: 'The DataBasin API is temporarily unavailable.',
175
- OPERATION_FAILED: 'The DataBasin API rejected the request.',
176
- INTERNAL_ERROR: 'The DataBasin operation could not be completed.'
177
- });
178
- const KNOWN_CODES = new Set(Object.keys(ERROR_MESSAGES));
179
- // Exact-match allowlist of upstream DataBasin API denial literals that are safe
180
- // to surface verbatim. Sourced by reading (read-only) tpi-datalake-api's
181
- // controllers reachable from the facade's EDGE_PATHS/WORKER_PATHS
182
- // (/my/projects, /search, /databasin/catalogs|schemas|tables|columns,
183
- // /connector, /my/organizations):
184
- // - "You do not have access to this organization"
185
- // ControllerApiBase.requireOrgAccess (app/controllers/ControllerApiBase.scala)
186
- // and SearchController.search's own literal of the same text
187
- // - "You are not authorized to perform this action"
188
- // ControllerApiBase.unauthorizedMessage / processUnauthorized, reached via
189
- // ProjectsController.getProjectsForUser, UniversalQueryController's
190
- // withAuthorizedConnector, ConnectorsController.getConnector, and
191
- // OrganizationsController.getOrganizationsForUser
192
- // - "Invalid or missing authentication token"
193
- // SearchController.search
194
- // - "User not found"
195
- // SearchController.search
196
- // This is a second, independent copy of the facade's own allowlist (defense in
197
- // depth) -- the facade's "reason" field is never trusted blindly, even though
198
- // it is a first-party service. Do NOT add substring/regex matches here, and do
199
- // not add a literal unless it is reachable from one of the paths above.
200
- const POLICY_DENIED_REASONS = new Set([
201
- 'You do not have access to this organization',
202
- 'You are not authorized to perform this action',
203
- 'Invalid or missing authentication token',
204
- 'User not found'
205
- ]);
206
- //# sourceMappingURL=api-response.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-response.js","sourceRoot":"","sources":["../src/api-response.ts"],"names":[],"mappings":"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"}