@novorb/mcp-core 2.1.2 → 3.0.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 (240) hide show
  1. package/README.md +77 -163
  2. package/bin/mcp-core-jest.mjs +112 -0
  3. package/dist/auth.d.ts +57 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +74 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/bootstrap.d.ts +129 -0
  8. package/dist/bootstrap.d.ts.map +1 -0
  9. package/dist/bootstrap.js +206 -0
  10. package/dist/bootstrap.js.map +1 -0
  11. package/dist/client-input.d.ts +72 -0
  12. package/dist/client-input.d.ts.map +1 -0
  13. package/dist/client-input.js +109 -0
  14. package/dist/client-input.js.map +1 -0
  15. package/dist/credential-checks.d.ts +80 -0
  16. package/dist/credential-checks.d.ts.map +1 -0
  17. package/dist/credential-checks.js +189 -0
  18. package/dist/credential-checks.js.map +1 -0
  19. package/dist/credential-health.d.ts +12 -0
  20. package/dist/credential-health.d.ts.map +1 -0
  21. package/dist/credential-health.js +12 -0
  22. package/dist/credential-health.js.map +1 -0
  23. package/dist/credential-report.d.ts +46 -0
  24. package/dist/credential-report.d.ts.map +1 -0
  25. package/dist/credential-report.js +135 -0
  26. package/dist/credential-report.js.map +1 -0
  27. package/dist/credential-status-tool.d.ts +20 -0
  28. package/dist/credential-status-tool.d.ts.map +1 -0
  29. package/dist/credential-status-tool.js +33 -0
  30. package/dist/credential-status-tool.js.map +1 -0
  31. package/dist/credentials.d.ts +288 -0
  32. package/dist/credentials.d.ts.map +1 -0
  33. package/dist/credentials.js +652 -0
  34. package/dist/credentials.js.map +1 -0
  35. package/dist/express-peers.d.ts +29 -0
  36. package/dist/express-peers.d.ts.map +1 -0
  37. package/dist/express-peers.js +36 -0
  38. package/dist/express-peers.js.map +1 -0
  39. package/dist/express.d.ts +74 -0
  40. package/dist/express.d.ts.map +1 -0
  41. package/dist/express.js +164 -0
  42. package/dist/express.js.map +1 -0
  43. package/dist/http-client.d.ts +277 -42
  44. package/dist/http-client.d.ts.map +1 -1
  45. package/dist/http-client.js +620 -180
  46. package/dist/http-client.js.map +1 -1
  47. package/dist/index.d.ts +27 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +47 -8
  50. package/dist/index.js.map +1 -1
  51. package/dist/limits.d.ts +28 -0
  52. package/dist/limits.d.ts.map +1 -0
  53. package/dist/limits.js +37 -0
  54. package/dist/limits.js.map +1 -0
  55. package/dist/list-pagination.d.ts +41 -0
  56. package/dist/list-pagination.d.ts.map +1 -0
  57. package/dist/list-pagination.js +104 -0
  58. package/dist/list-pagination.js.map +1 -0
  59. package/dist/net.d.ts +112 -0
  60. package/dist/net.d.ts.map +1 -0
  61. package/dist/net.js +490 -0
  62. package/dist/net.js.map +1 -0
  63. package/dist/notifications.d.ts +78 -0
  64. package/dist/notifications.d.ts.map +1 -0
  65. package/dist/notifications.js +173 -0
  66. package/dist/notifications.js.map +1 -0
  67. package/dist/pagination.d.ts +236 -5
  68. package/dist/pagination.d.ts.map +1 -1
  69. package/dist/pagination.js +393 -6
  70. package/dist/pagination.js.map +1 -1
  71. package/dist/prompts.d.ts +70 -0
  72. package/dist/prompts.d.ts.map +1 -0
  73. package/dist/prompts.js +109 -0
  74. package/dist/prompts.js.map +1 -0
  75. package/dist/protocol-errors.d.ts +15 -0
  76. package/dist/protocol-errors.d.ts.map +1 -0
  77. package/dist/protocol-errors.js +28 -0
  78. package/dist/protocol-errors.js.map +1 -0
  79. package/dist/protocol-logging.d.ts +37 -0
  80. package/dist/protocol-logging.d.ts.map +1 -0
  81. package/dist/protocol-logging.js +77 -0
  82. package/dist/protocol-logging.js.map +1 -0
  83. package/dist/rate-limiter.d.ts +36 -0
  84. package/dist/rate-limiter.d.ts.map +1 -0
  85. package/dist/rate-limiter.js +79 -0
  86. package/dist/rate-limiter.js.map +1 -0
  87. package/dist/request-state.d.ts +74 -0
  88. package/dist/request-state.d.ts.map +1 -0
  89. package/dist/request-state.js +190 -0
  90. package/dist/request-state.js.map +1 -0
  91. package/dist/resources.d.ts +181 -0
  92. package/dist/resources.d.ts.map +1 -0
  93. package/dist/resources.js +302 -0
  94. package/dist/resources.js.map +1 -0
  95. package/dist/result-limits.d.ts +80 -0
  96. package/dist/result-limits.d.ts.map +1 -0
  97. package/dist/result-limits.js +248 -0
  98. package/dist/result-limits.js.map +1 -0
  99. package/dist/retry.d.ts +79 -23
  100. package/dist/retry.d.ts.map +1 -1
  101. package/dist/retry.js +170 -57
  102. package/dist/retry.js.map +1 -1
  103. package/dist/sdk/client-stdio.d.ts +6 -0
  104. package/dist/sdk/client-stdio.d.ts.map +1 -0
  105. package/dist/sdk/client-stdio.js +6 -0
  106. package/dist/sdk/client-stdio.js.map +1 -0
  107. package/dist/sdk/client.d.ts +6 -0
  108. package/dist/sdk/client.d.ts.map +1 -0
  109. package/dist/sdk/client.js +6 -0
  110. package/dist/sdk/client.js.map +1 -0
  111. package/dist/sdk/express.d.ts +3 -0
  112. package/dist/sdk/express.d.ts.map +1 -0
  113. package/dist/sdk/express.js +11 -0
  114. package/dist/sdk/express.js.map +1 -0
  115. package/dist/sdk/node.d.ts +6 -0
  116. package/dist/sdk/node.d.ts.map +1 -0
  117. package/dist/sdk/node.js +6 -0
  118. package/dist/sdk/node.js.map +1 -0
  119. package/dist/sdk/server-stdio.d.ts +6 -0
  120. package/dist/sdk/server-stdio.d.ts.map +1 -0
  121. package/dist/sdk/server-stdio.js +6 -0
  122. package/dist/sdk/server-stdio.js.map +1 -0
  123. package/dist/sdk/server.d.ts +6 -0
  124. package/dist/sdk/server.d.ts.map +1 -0
  125. package/dist/sdk/server.js +6 -0
  126. package/dist/sdk/server.js.map +1 -0
  127. package/dist/server.d.ts +88 -35
  128. package/dist/server.d.ts.map +1 -1
  129. package/dist/server.js +98 -44
  130. package/dist/server.js.map +1 -1
  131. package/dist/task-request.d.ts +20 -0
  132. package/dist/task-request.d.ts.map +1 -0
  133. package/dist/task-request.js +43 -0
  134. package/dist/task-request.js.map +1 -0
  135. package/dist/task-store.d.ts +230 -0
  136. package/dist/task-store.d.ts.map +1 -0
  137. package/dist/task-store.js +459 -0
  138. package/dist/task-store.js.map +1 -0
  139. package/dist/task-tools.d.ts +115 -0
  140. package/dist/task-tools.d.ts.map +1 -0
  141. package/dist/task-tools.js +397 -0
  142. package/dist/task-tools.js.map +1 -0
  143. package/dist/testing/client.d.ts +25 -0
  144. package/dist/testing/client.d.ts.map +1 -0
  145. package/dist/testing/client.js +11 -0
  146. package/dist/testing/client.js.map +1 -0
  147. package/dist/testing/in-memory.d.ts +26 -0
  148. package/dist/testing/in-memory.d.ts.map +1 -0
  149. package/dist/testing/in-memory.js +41 -0
  150. package/dist/testing/in-memory.js.map +1 -0
  151. package/dist/testing/index.d.ts +20 -0
  152. package/dist/testing/index.d.ts.map +1 -0
  153. package/dist/testing/index.js +20 -0
  154. package/dist/testing/index.js.map +1 -0
  155. package/dist/testing/isolated-dirs.d.ts +27 -0
  156. package/dist/testing/isolated-dirs.d.ts.map +1 -0
  157. package/dist/testing/isolated-dirs.js +67 -0
  158. package/dist/testing/isolated-dirs.js.map +1 -0
  159. package/dist/testing/logs.d.ts +61 -0
  160. package/dist/testing/logs.d.ts.map +1 -0
  161. package/dist/testing/logs.js +113 -0
  162. package/dist/testing/logs.js.map +1 -0
  163. package/dist/testing/raw-http.d.ts +25 -0
  164. package/dist/testing/raw-http.d.ts.map +1 -0
  165. package/dist/testing/raw-http.js +41 -0
  166. package/dist/testing/raw-http.js.map +1 -0
  167. package/dist/testing/raw-peer.d.ts +43 -0
  168. package/dist/testing/raw-peer.d.ts.map +1 -0
  169. package/dist/testing/raw-peer.js +101 -0
  170. package/dist/testing/raw-peer.js.map +1 -0
  171. package/dist/testing/recording-server.d.ts +38 -0
  172. package/dist/testing/recording-server.d.ts.map +1 -0
  173. package/dist/testing/recording-server.js +38 -0
  174. package/dist/testing/recording-server.js.map +1 -0
  175. package/dist/testing/server-process.d.ts +76 -0
  176. package/dist/testing/server-process.d.ts.map +1 -0
  177. package/dist/testing/server-process.js +241 -0
  178. package/dist/testing/server-process.js.map +1 -0
  179. package/dist/testing/tools.d.ts +53 -0
  180. package/dist/testing/tools.d.ts.map +1 -0
  181. package/dist/testing/tools.js +98 -0
  182. package/dist/testing/tools.js.map +1 -0
  183. package/dist/testing/unit.d.ts +52 -0
  184. package/dist/testing/unit.d.ts.map +1 -0
  185. package/dist/testing/unit.js +95 -0
  186. package/dist/testing/unit.js.map +1 -0
  187. package/dist/tools.d.ts +205 -0
  188. package/dist/tools.d.ts.map +1 -0
  189. package/dist/tools.js +370 -0
  190. package/dist/tools.js.map +1 -0
  191. package/dist/transport.d.ts +143 -52
  192. package/dist/transport.d.ts.map +1 -1
  193. package/dist/transport.js +292 -123
  194. package/dist/transport.js.map +1 -1
  195. package/dist/url-path.d.ts +49 -0
  196. package/dist/url-path.d.ts.map +1 -0
  197. package/dist/url-path.js +165 -0
  198. package/dist/url-path.js.map +1 -0
  199. package/dist/utils/dataStore.d.ts +143 -0
  200. package/dist/utils/dataStore.d.ts.map +1 -0
  201. package/dist/utils/dataStore.js +429 -0
  202. package/dist/utils/dataStore.js.map +1 -0
  203. package/dist/utils/envLoader.d.ts +129 -0
  204. package/dist/utils/envLoader.d.ts.map +1 -0
  205. package/dist/utils/envLoader.js +399 -0
  206. package/dist/utils/envLoader.js.map +1 -0
  207. package/dist/utils/logger.d.ts +181 -0
  208. package/dist/utils/logger.d.ts.map +1 -0
  209. package/dist/utils/logger.js +664 -0
  210. package/dist/utils/logger.js.map +1 -0
  211. package/dist/utils/redact.d.ts +50 -0
  212. package/dist/utils/redact.d.ts.map +1 -0
  213. package/dist/utils/redact.js +318 -0
  214. package/dist/utils/redact.js.map +1 -0
  215. package/docs/api-reference.md +29 -0
  216. package/docs/building-a-server.md +63 -0
  217. package/docs/credentials.md +131 -0
  218. package/docs/data-store.md +37 -0
  219. package/docs/env.md +38 -0
  220. package/docs/features.md +28 -0
  221. package/docs/http-client.md +116 -0
  222. package/docs/logger.md +100 -0
  223. package/docs/migrating-to-v3.md +45 -0
  224. package/docs/outbound-urls.md +104 -0
  225. package/docs/pagination.md +45 -0
  226. package/docs/protocol-features.md +62 -0
  227. package/docs/resources-prompts-tasks.md +95 -0
  228. package/docs/sdk.md +33 -0
  229. package/docs/server.md +68 -0
  230. package/docs/testing-harness.md +139 -0
  231. package/docs/testing.md +151 -0
  232. package/docs/tools.md +88 -0
  233. package/docs/transport.md +85 -0
  234. package/examples/testing/tools.integration.test.example.ts +312 -0
  235. package/examples/testing/tools.unit.test.example.ts +149 -0
  236. package/package.json +130 -17
  237. package/dist/logger.d.ts +0 -80
  238. package/dist/logger.d.ts.map +0 -1
  239. package/dist/logger.js +0 -237
  240. package/dist/logger.js.map +0 -1
@@ -1,69 +1,304 @@
1
1
  /**
2
- * @novorb/mcp-core — HTTP Client Factory
2
+ * @novorb/mcp-core - HTTP client
3
3
  *
4
- * Creates pre-configured axios instances with retry logic and logging.
4
+ * One hardened HTTP client for every MCP server, built on axios with one in-house retry loop:
5
+ * - per-request options: headers, query, timeout, signal, responseType (json/text/arraybuffer/stream),
6
+ * response size cap, validateStatus, retry overrides, idempotency key
7
+ * - auth configured once: bearer, basic, custom header, query-param key, async token provider (a 401
8
+ * triggers one forced refresh and one replay)
9
+ * - base URL joining that never doubles a segment; absolute URLs (next-links) are used as-is but only
10
+ * toward the base URL's origin or an explicitly allowed one, so credentials never leave
11
+ * - TLS options through an ESM `node:https` Agent (custom CA, or rejectUnauthorized=false for a
12
+ * self-signed test instance)
13
+ * - `mapError` hook so each service keeps its own error wording; a client-side token bucket
14
+ * - security: maxRedirects 0, request/response size caps (streams included), errors carry only
15
+ * status/statusText/code/method/path (never the raw response, config or headers), secrets masked
16
+ * - logging through the mcp-core logger only: method, host, path template, status, duration, attempt;
17
+ * never query values, headers, bodies or response content
5
18
  */
6
19
  import { type AxiosInstance } from 'axios';
7
- import { type Logger } from './logger.js';
20
+ import { type AuthChallenge, type CredentialRecorder } from './credentials.js';
21
+ import { type PageIterator, type PaginateOptions, type PaginationStrategy } from './pagination.js';
22
+ import { TokenBucket, type TokenBucketOptions } from './rate-limiter.js';
23
+ import { type Logger } from './utils/logger.js';
24
+ export type HttpMethod = 'GET' | 'HEAD' | 'OPTIONS' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
25
+ export type HttpResponseType = 'json' | 'text' | 'arraybuffer' | 'stream';
26
+ export type QueryScalar = string | number | boolean;
27
+ export type QueryValue = QueryScalar | null | undefined | ReadonlyArray<QueryScalar>;
28
+ export type QueryParams = Record<string, QueryValue>;
29
+ /** How array query values are written: `a=1&a=2` (repeat), `a[]=1&a[]=2` (brackets), `a=1,2` (comma). */
30
+ export type ArrayFormat = 'repeat' | 'brackets' | 'comma';
31
+ export interface TokenProviderContext {
32
+ /** True after a 401: the provider must bypass its cache and fetch a fresh token. */
33
+ forceRefresh: boolean;
34
+ signal?: AbortSignal;
35
+ }
36
+ export type HttpAuth = {
37
+ type: 'bearer';
38
+ token: string;
39
+ } | {
40
+ type: 'basic';
41
+ username: string;
42
+ password: string;
43
+ }
44
+ /** A custom header, e.g. `PRIVATE-TOKEN` (GitLab), `X-Api-Key` (Dependency-Track), `sso-key`. */
45
+ | {
46
+ type: 'header';
47
+ name: string;
48
+ value: string;
49
+ }
50
+ /** Query-parameter credentials, e.g. Trello `key` + `token`; masked in every log line and error. */
51
+ | {
52
+ type: 'query';
53
+ params: Record<string, string>;
54
+ }
55
+ /** An async provider (refreshing OAuth tokens, e.g. Microsoft Graph). */
56
+ | {
57
+ type: 'tokenProvider';
58
+ getToken: (context: TokenProviderContext) => Promise<string>;
59
+ /** Header name (default `Authorization`). */
60
+ headerName?: string;
61
+ /** Scheme prefix (default `Bearer`; empty string sends the raw token). */
62
+ scheme?: string;
63
+ };
64
+ export interface HttpRetryInfo {
65
+ attempt: number;
66
+ delayMs: number;
67
+ fromRetryAfter: boolean;
68
+ status?: number;
69
+ code?: string;
70
+ method: HttpMethod;
71
+ path: string;
72
+ }
73
+ export interface HttpRetryPolicy {
74
+ /** Retries after the first attempt (default 3; 0 disables). */
75
+ retries?: number;
76
+ initialDelayMs?: number;
77
+ maxDelayMs?: number;
78
+ backoffMultiplier?: number;
79
+ /** Cap on a server-sent Retry-After (default 30000 ms). */
80
+ maxRetryAfterMs?: number;
81
+ /** Also replay non-idempotent methods (POST/PATCH). Off by default. */
82
+ unsafe?: boolean;
83
+ /** Called before each retry wait. */
84
+ onRetry?: (info: HttpRetryInfo) => void;
85
+ /** Random source for the jitter (tests). */
86
+ random?: () => number;
87
+ }
88
+ export interface TlsOptions {
89
+ /** Extra trusted CA certificate(s), PEM. */
90
+ ca?: string | Buffer | Array<string | Buffer>;
91
+ /** false accepts self-signed / invalid certificates (test instances only). Default true. */
92
+ rejectUnauthorized?: boolean;
93
+ }
94
+ /** What `mapError` receives: safe facts only, never headers, config or the raw body. */
95
+ export interface HttpErrorInfo {
96
+ method: HttpMethod;
97
+ host: string;
98
+ /** Route template (`templatePath`: dynamic segments are `:id`), or the request's `logPath`. */
99
+ path: string;
100
+ status?: number;
101
+ statusText?: string;
102
+ /** Network code (`ECONNRESET`, `ETIMEDOUT`, ...), or the upstream error code, or `HTTP_<status>`. */
103
+ code?: string;
104
+ /** The upstream error message (masked, max 300 chars) when the body carried one. */
105
+ upstreamMessage?: string;
106
+ /** The upstream error code (e.g. Graph `InvalidAuthenticationToken`). */
107
+ upstreamCode?: string;
108
+ /** The upstream OAuth-style `error_description` (masked, max 300 chars) when it differs from the message. */
109
+ upstreamDescription?: string;
110
+ /** The `WWW-Authenticate` `error` / `error_description` parameters (masked), when present. */
111
+ challenge?: AuthChallenge;
112
+ retryAfterMs?: number;
113
+ }
114
+ export interface MappedHttpError {
115
+ message: string;
116
+ code?: string;
117
+ }
8
118
  export interface HttpClientConfig {
9
- /** Base URL for all requests */
119
+ /** Base URL for relative paths (e.g. `https://gitlab.com/api/v4`). */
10
120
  baseURL: string;
11
- /** Request timeout in milliseconds (default: 30000) */
121
+ /** Default request timeout in milliseconds (default 30000). */
12
122
  timeout?: number;
13
- /** Default headers to include on every request */
123
+ /** Default headers for every request. */
14
124
  headers?: Record<string, string>;
15
- /** Number of retries on retryable failures (default: 3) */
16
- retries?: number;
17
- /** Logger instance (default: singleton from getLogger) */
125
+ /** Credentials, applied to every request. */
126
+ auth?: HttpAuth;
127
+ /** Default retry policy. */
128
+ retry?: HttpRetryPolicy;
129
+ /** TLS options (an https Agent is created only when set). */
130
+ tls?: TlsOptions;
131
+ /** Token bucket shared by every request of this client. */
132
+ rateLimit?: TokenBucketOptions | TokenBucket;
133
+ /** Response size cap in bytes (default 25 MiB), streams included. */
134
+ maxResponseBytes?: number;
135
+ /** Request body size cap in bytes (default 25 MiB). */
136
+ maxRequestBytes?: number;
137
+ /** Extra origins absolute URLs may target (credentials are sent there). The base origin is implied. */
138
+ allowedOrigins?: string[];
139
+ /** Header carrying a request's idempotency key (default `Idempotency-Key`). */
140
+ idempotencyKeyHeader?: string;
141
+ /** Array query format (default `repeat`). */
142
+ arrayFormat?: ArrayFormat;
143
+ /** Maps a failure to the service's own wording and code. */
144
+ mapError?: (info: HttpErrorInfo) => MappedHttpError;
145
+ /** Logger instance (default: the mcp-core singleton). */
18
146
  logger?: Logger;
19
- /** Component name for log messages (default: 'HttpClient') */
147
+ /** Log context (default `HttpClient`). */
20
148
  logContext?: string;
21
- }
22
- export interface PaginatedResponse<T> {
23
- data: T[];
24
- totalCount: number;
25
- }
26
- /**
27
- * MCP HTTP client wrapping axios with retry, logging, and pagination support.
28
- */
29
- export declare class McpHttpClient {
30
- private client;
31
- private logger;
32
- private logContext;
33
- constructor(config: HttpClientConfig);
34
- /**
35
- * Perform a GET request.
36
- */
37
- get<T>(path: string, params?: Record<string, unknown>): Promise<T>;
38
149
  /**
39
- * Perform a GET request with pagination.
40
- * Reads total count from the X-Total-Count response header.
150
+ * Where a request's `credential` outcome is recorded when no tool call is in progress (default the
151
+ * process credential registry). Inside a `registerTools` call it always goes to that call's scope.
41
152
  */
42
- getPaginated<T>(path: string, params?: Record<string, unknown>): Promise<PaginatedResponse<T>>;
153
+ credentials?: CredentialRecorder;
43
154
  /**
44
- * Perform a POST request.
155
+ * Route templates relative to the base URL (`/projects/:id/repository/tags/:tag`) logged with their
156
+ * literal words when a request path matches one; any other path logs `:id` for every segment but a
157
+ * leading API prefix (see `templatePath`).
45
158
  */
46
- post<T>(path: string, data?: unknown, params?: Record<string, unknown>): Promise<T>;
47
- /**
48
- * Perform a PUT request.
49
- */
50
- put<T>(path: string, data?: unknown, params?: Record<string, unknown>): Promise<T>;
159
+ routes?: readonly string[];
160
+ }
161
+ export interface RequestOptions {
162
+ method?: HttpMethod;
163
+ /** Path joined once onto the base URL, or an absolute URL (next-link) used as-is. */
164
+ path: string;
165
+ query?: QueryParams;
166
+ body?: unknown;
167
+ headers?: Record<string, string>;
168
+ timeout?: number;
169
+ /** Cancellation (e.g. the MCP handler's `ctx.signal`); also stops retries. */
170
+ signal?: AbortSignal;
171
+ responseType?: HttpResponseType;
172
+ /** Response size cap override in bytes. */
173
+ maxResponseBytes?: number;
174
+ /** Status acceptance override (default 2xx). `() => true` returns every response. */
175
+ validateStatus?: (status: number) => boolean;
176
+ /** Retry overrides, or false to disable retries for this request. */
177
+ retry?: HttpRetryPolicy | false;
178
+ /** Sent in the idempotency header; makes a POST/PATCH replayable. */
179
+ idempotencyKey?: string;
180
+ /** Path to log instead of the derived template (e.g. `/projects/:id/branches`). */
181
+ logPath?: string;
51
182
  /**
52
- * Perform a PATCH request.
183
+ * The key NAME of the credential this request authenticates with (for example a pool member picked
184
+ * with `ctx.credentials.pick(...)`). Its outcome is recorded automatically: 2xx ok, 401/403 invalid,
185
+ * an expiry signal expired, 402/429/quota degraded; anything else leaves the status alone.
53
186
  */
54
- patch<T>(path: string, data?: unknown, params?: Record<string, unknown>): Promise<T>;
187
+ credential?: string;
188
+ }
189
+ /** Per-request options of the verb helpers. */
190
+ export type RequestConfig = Omit<RequestOptions, 'method' | 'path' | 'body'>;
191
+ export interface HttpResponse<T> {
192
+ status: number;
193
+ statusText: string;
194
+ /** Lower-cased header names; multi-value headers joined with `, `. */
195
+ headers: Record<string, string>;
196
+ data: T;
197
+ }
198
+ /** The normalized error every failure becomes. Carries no response, config or headers. */
199
+ export declare class HttpError extends Error {
200
+ readonly status?: number;
201
+ readonly statusText?: string;
202
+ readonly code?: string;
203
+ readonly method: HttpMethod;
204
+ readonly path: string;
205
+ readonly retryAfterMs?: number;
206
+ /** The upstream OAuth `error_description` (masked), for the credential mapping. */
207
+ readonly description?: string;
208
+ /** The parsed `WWW-Authenticate` `error` / `error_description` (masked); never the raw header. */
209
+ readonly challenge?: AuthChallenge;
210
+ constructor(fields: {
211
+ message: string;
212
+ method: HttpMethod;
213
+ path: string;
214
+ status?: number;
215
+ statusText?: string;
216
+ code?: string;
217
+ retryAfterMs?: number;
218
+ description?: string;
219
+ challenge?: AuthChallenge;
220
+ });
221
+ }
222
+ /**
223
+ * Joins a path onto a base URL exactly once: one slash between them, nothing else touched. An absolute
224
+ * URL is returned unchanged (an OData next-link already holds its `/v1.0` segment).
225
+ */
226
+ export declare function joinUrl(baseURL: string, path: string): string;
227
+ /** Serialises query params (null/undefined skipped) without touching an existing query string. */
228
+ export declare function buildQueryString(query: QueryParams | undefined, arrayFormat?: ArrayFormat): string;
229
+ export interface TemplatePathOptions {
230
+ /** The client's base URL path (`/api/v4`): its API words and versions are kept, anything else masked. */
231
+ basePath?: string;
232
+ /** Route templates relative to the base path (`/projects/:id/repository/tags/:tag`); a match is logged as-is. */
233
+ routes?: readonly string[];
234
+ }
235
+ /**
236
+ * The route shape of a path for logs and errors, never a dynamic value. Fail closed: without a matching
237
+ * route template every request-path segment becomes `:id` except a leading API prefix or version
238
+ * (`api`, `rest`, `v4`). The configured base path keeps its API words and versions (`/api/v4`); any
239
+ * other base segment (a token in the base URL) is masked too. A `routes` template that matches the
240
+ * path segment for segment (`:name` matches any one segment) is logged instead, with its literal words;
241
+ * a request's own `logPath` overrides everything.
242
+ *
243
+ * templatePath('/api/v4/projects/7/repository/tags/stable', { basePath: '/api/v4' })
244
+ * -> '/api/v4/:id/:id/:id/:id/:id'
245
+ * templatePath('/api/v4/projects/7/repository/tags/stable', {
246
+ * basePath: '/api/v4', routes: ['/projects/:id/repository/tags/:tag'] })
247
+ * -> '/api/v4/projects/:id/repository/tags/:tag'
248
+ */
249
+ export declare function templatePath(pathname: string, options?: TemplatePathOptions): string;
250
+ /**
251
+ * MCP HTTP client. Build one per upstream per process (not per MCP request), so the rate limiter and
252
+ * the connection pool are shared.
253
+ */
254
+ export declare class McpHttpClient {
255
+ private readonly client;
256
+ private readonly logger;
257
+ private readonly logContext;
258
+ private readonly config;
259
+ private readonly baseOrigin;
260
+ private readonly basePath;
261
+ private readonly allowedOrigins;
262
+ private readonly bucket?;
263
+ private readonly staticSecrets;
264
+ private readonly providerTokens;
265
+ constructor(config: HttpClientConfig);
266
+ private collectSecrets;
267
+ /** Replaces every configured credential value in `text` with `[REDACTED]`. */
268
+ maskSecrets(text: string): string;
269
+ private authHeaders;
270
+ private resolve;
271
+ private errorInfo;
272
+ private toHttpError;
55
273
  /**
56
- * Perform a DELETE request.
274
+ * Where a request's `credential` outcome goes: the current tool call's scope, else the configured
275
+ * recorder, else the process registry. The name must be declared there (`UnknownCredentialError`
276
+ * otherwise, before anything is sent: a value passed by mistake is never published).
57
277
  */
58
- delete<T>(path: string, params?: Record<string, unknown>): Promise<T>;
278
+ private credentialRecorder;
279
+ private recordCredential;
280
+ /** Performs a request and returns status, headers and data. */
281
+ requestRaw<T = unknown>(req: RequestOptions): Promise<HttpResponse<T>>;
282
+ /** Performs a request and returns the response data. */
283
+ request<T = unknown>(req: RequestOptions): Promise<T>;
284
+ get<T = unknown>(path: string, config?: RequestConfig): Promise<T>;
285
+ /** HEAD request; returns the response headers (lower-cased). */
286
+ head(path: string, config?: RequestConfig): Promise<Record<string, string>>;
287
+ post<T = unknown>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
288
+ put<T = unknown>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
289
+ patch<T = unknown>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
290
+ delete<T = unknown>(path: string, config?: RequestConfig): Promise<T>;
59
291
  /**
60
- * Get the underlying axios instance for advanced use cases.
292
+ * Walks an upstream API's pages with a strategy (see `pagination`). Returns an async iterator of
293
+ * pages plus `items()` and `collect()`; capped by `maxPages` (default 100) and `maxItems`.
61
294
  */
295
+ paginate<T>(request: RequestOptions, strategy: PaginationStrategy<T>, options?: PaginateOptions): PageIterator<T>;
296
+ /** The underlying axios instance for advanced use cases (bypasses retry, auth and logging). */
62
297
  getAxiosInstance(): AxiosInstance;
63
- private normalizeError;
64
298
  }
65
299
  /**
66
300
  * Create a configured HTTP client.
67
301
  */
68
302
  export declare function createHttpClient(config: HttpClientConfig): McpHttpClient;
303
+ export { createTokenBucket, TokenBucket, type TokenBucketOptions } from './rate-limiter.js';
69
304
  //# sourceMappingURL=http-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAc,EAAmB,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAEnE,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,gBAAgB;IAmCpC;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsBxE;;;OAGG;IACG,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAyBpG;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsBzF;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsBxF;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsB1F;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsB3E;;OAEG;IACH,gBAAgB,IAAI,aAAa;IAIjC,OAAO,CAAC,cAAc;CAgBvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAExE"}
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}