@paretools/http 0.8.4 → 0.9.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/dist/lib/curl-runner.js +1 -1
- package/dist/lib/formatters.d.ts +5 -1
- package/dist/lib/formatters.d.ts.map +1 -1
- package/dist/lib/formatters.js +56 -4
- package/dist/lib/formatters.js.map +1 -1
- package/dist/lib/parsers.d.ts +2 -1
- package/dist/lib/parsers.d.ts.map +1 -1
- package/dist/lib/parsers.js +55 -3
- package/dist/lib/parsers.js.map +1 -1
- package/dist/schemas/index.d.ts +55 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +34 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/tools/get.d.ts.map +1 -1
- package/dist/tools/get.js +72 -4
- package/dist/tools/get.js.map +1 -1
- package/dist/tools/head.d.ts.map +1 -1
- package/dist/tools/head.js +52 -2
- package/dist/tools/head.js.map +1 -1
- package/dist/tools/post.d.ts.map +1 -1
- package/dist/tools/post.js +90 -10
- package/dist/tools/post.js.map +1 -1
- package/dist/tools/request.d.ts +26 -4
- package/dist/tools/request.d.ts.map +1 -1
- package/dist/tools/request.js +149 -8
- package/dist/tools/request.js.map +1 -1
- package/package.json +2 -2
package/dist/lib/curl-runner.js
CHANGED
|
@@ -4,6 +4,6 @@ import { run } from "@paretools/shared";
|
|
|
4
4
|
* Uses a generous timeout since HTTP requests can be slow.
|
|
5
5
|
*/
|
|
6
6
|
export async function curlCmd(args, cwd) {
|
|
7
|
-
return run("curl", args, { cwd, timeout:
|
|
7
|
+
return run("curl", args, { cwd, timeout: 180_000 });
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=curl-runner.js.map
|
package/dist/lib/formatters.d.ts
CHANGED
|
@@ -7,7 +7,11 @@ export declare function formatHttpHeadResponse(data: HttpHeadResponse): string;
|
|
|
7
7
|
export declare function compactResponseMap(data: HttpResponse): HttpResponseCompact;
|
|
8
8
|
/** Formats compact HTTP response. */
|
|
9
9
|
export declare function formatResponseCompact(data: HttpResponseCompact): string;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Maps full HEAD response to compact form.
|
|
12
|
+
* Preserves essential headers (content-length, cache-control, etag, last-modified, content-type)
|
|
13
|
+
* even in compact mode, since HEAD responses are primarily about headers.
|
|
14
|
+
*/
|
|
11
15
|
export declare function compactHeadResponseMap(data: HttpHeadResponse): HttpHeadResponseCompact;
|
|
12
16
|
/** Formats compact HEAD response. */
|
|
13
17
|
export declare function formatHeadResponseCompact(data: HttpHeadResponseCompact): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EAExB,MAAM,qBAAqB,CAAC;AAyB7B,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA0B7D;AAED,wDAAwD;AACxD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAwBrE;AAID,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB,CAQ1E;AAED,qCAAqC;AACrC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAGvE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,uBAAuB,CAkBtF;AAED,qCAAqC;AACrC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAkB/E"}
|
package/dist/lib/formatters.js
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
import { HEAD_ESSENTIAL_HEADERS } from "../schemas/index.js";
|
|
2
|
+
/** Formats timing details into a human-readable string. */
|
|
3
|
+
function formatTimingLine(timing) {
|
|
4
|
+
let line = `Time: ${timing.total.toFixed(3)}s`;
|
|
5
|
+
if (timing.details) {
|
|
6
|
+
const d = timing.details;
|
|
7
|
+
const parts = [];
|
|
8
|
+
parts.push(`dns=${d.namelookup.toFixed(3)}s`);
|
|
9
|
+
parts.push(`tcp=${d.connect.toFixed(3)}s`);
|
|
10
|
+
if (d.appconnect !== undefined) {
|
|
11
|
+
parts.push(`tls=${d.appconnect.toFixed(3)}s`);
|
|
12
|
+
}
|
|
13
|
+
if (d.pretransfer !== undefined) {
|
|
14
|
+
parts.push(`pre=${d.pretransfer.toFixed(3)}s`);
|
|
15
|
+
}
|
|
16
|
+
if (d.starttransfer !== undefined) {
|
|
17
|
+
parts.push(`ttfb=${d.starttransfer.toFixed(3)}s`);
|
|
18
|
+
}
|
|
19
|
+
line += ` (${parts.join(", ")})`;
|
|
20
|
+
}
|
|
21
|
+
return line;
|
|
22
|
+
}
|
|
1
23
|
/** Formats a full HTTP response into human-readable text. */
|
|
2
24
|
export function formatHttpResponse(data) {
|
|
3
25
|
const lines = [];
|
|
@@ -5,7 +27,7 @@ export function formatHttpResponse(data) {
|
|
|
5
27
|
if (data.contentType) {
|
|
6
28
|
lines.push(`Content-Type: ${data.contentType}`);
|
|
7
29
|
}
|
|
8
|
-
lines.push(`Size: ${data.size} bytes |
|
|
30
|
+
lines.push(`Size: ${data.size} bytes | ${formatTimingLine(data.timing)}`);
|
|
9
31
|
const headers = data.headers ?? {};
|
|
10
32
|
const headerCount = Object.keys(headers).length;
|
|
11
33
|
lines.push(`Headers: ${headerCount}`);
|
|
@@ -26,7 +48,10 @@ export function formatHttpHeadResponse(data) {
|
|
|
26
48
|
if (data.contentType) {
|
|
27
49
|
lines.push(`Content-Type: ${data.contentType}`);
|
|
28
50
|
}
|
|
29
|
-
|
|
51
|
+
if (data.contentLength !== undefined) {
|
|
52
|
+
lines.push(`Content-Length: ${data.contentLength}`);
|
|
53
|
+
}
|
|
54
|
+
lines.push(formatTimingLine(data.timing));
|
|
30
55
|
const headers = data.headers ?? {};
|
|
31
56
|
const headerCount = Object.keys(headers).length;
|
|
32
57
|
lines.push(`Headers: ${headerCount}`);
|
|
@@ -51,18 +76,45 @@ export function formatResponseCompact(data) {
|
|
|
51
76
|
const ct = data.contentType ? ` (${data.contentType})` : "";
|
|
52
77
|
return `HTTP ${data.status} ${data.statusText}${ct} | ${data.size} bytes | ${data.timing.total.toFixed(3)}s`;
|
|
53
78
|
}
|
|
54
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Maps full HEAD response to compact form.
|
|
81
|
+
* Preserves essential headers (content-length, cache-control, etag, last-modified, content-type)
|
|
82
|
+
* even in compact mode, since HEAD responses are primarily about headers.
|
|
83
|
+
*/
|
|
55
84
|
export function compactHeadResponseMap(data) {
|
|
85
|
+
const headers = data.headers ?? {};
|
|
86
|
+
const essential = {};
|
|
87
|
+
for (const key of HEAD_ESSENTIAL_HEADERS) {
|
|
88
|
+
if (headers[key] !== undefined) {
|
|
89
|
+
essential[key] = headers[key];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
56
92
|
return {
|
|
57
93
|
status: data.status,
|
|
58
94
|
statusText: data.statusText,
|
|
59
95
|
contentType: data.contentType,
|
|
96
|
+
contentLength: data.contentLength,
|
|
60
97
|
timing: data.timing,
|
|
98
|
+
...(Object.keys(essential).length > 0 ? { essentialHeaders: essential } : {}),
|
|
61
99
|
};
|
|
62
100
|
}
|
|
63
101
|
/** Formats compact HEAD response. */
|
|
64
102
|
export function formatHeadResponseCompact(data) {
|
|
65
103
|
const ct = data.contentType ? ` (${data.contentType})` : "";
|
|
66
|
-
|
|
104
|
+
const cl = data.contentLength !== undefined ? ` | ${data.contentLength} bytes` : "";
|
|
105
|
+
let line = `HTTP ${data.status} ${data.statusText}${ct}${cl} | ${data.timing.total.toFixed(3)}s`;
|
|
106
|
+
if (data.essentialHeaders && Object.keys(data.essentialHeaders).length > 0) {
|
|
107
|
+
const headerParts = [];
|
|
108
|
+
for (const [key, value] of Object.entries(data.essentialHeaders)) {
|
|
109
|
+
// Skip content-type (already shown) and content-length (already shown as bytes)
|
|
110
|
+
if (key === "content-type" || key === "content-length")
|
|
111
|
+
continue;
|
|
112
|
+
headerParts.push(`${key}: ${value}`);
|
|
113
|
+
}
|
|
114
|
+
if (headerParts.length > 0) {
|
|
115
|
+
line += "\n " + headerParts.join("\n ");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return line;
|
|
67
119
|
}
|
|
68
120
|
//# sourceMappingURL=formatters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAOA,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/parsers.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare const PARE_META_SEPARATOR = "---PARE_HTTP_META---";
|
|
|
11
11
|
* \r\n
|
|
12
12
|
* <body>
|
|
13
13
|
* \n---PARE_HTTP_META---\n
|
|
14
|
-
* <time_total> <size_download>
|
|
14
|
+
* <time_total> <size_download> <time_namelookup> <time_connect> <time_appconnect> <time_pretransfer> <time_starttransfer>
|
|
15
15
|
*
|
|
16
16
|
* When following redirects, multiple status+header blocks may appear.
|
|
17
17
|
* We parse the LAST one (the final response).
|
|
@@ -19,6 +19,7 @@ export declare const PARE_META_SEPARATOR = "---PARE_HTTP_META---";
|
|
|
19
19
|
export declare function parseCurlOutput(stdout: string, _stderr: string, _exitCode: number): HttpResponse;
|
|
20
20
|
/**
|
|
21
21
|
* Parses curl output for HEAD requests (no body expected).
|
|
22
|
+
* Extracts contentLength as a numeric field from the Content-Length header.
|
|
22
23
|
*/
|
|
23
24
|
export declare function parseCurlHeadOutput(stdout: string, stderr: string, exitCode: number): HttpHeadResponse;
|
|
24
25
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAiB,MAAM,qBAAqB,CAAC;AAEzF,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAe1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAoChG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAsBlB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,CA0CA"}
|
package/dist/lib/parsers.js
CHANGED
|
@@ -10,7 +10,7 @@ export const PARE_META_SEPARATOR = "---PARE_HTTP_META---";
|
|
|
10
10
|
* \r\n
|
|
11
11
|
* <body>
|
|
12
12
|
* \n---PARE_HTTP_META---\n
|
|
13
|
-
* <time_total> <size_download>
|
|
13
|
+
* <time_total> <size_download> <time_namelookup> <time_connect> <time_appconnect> <time_pretransfer> <time_starttransfer>
|
|
14
14
|
*
|
|
15
15
|
* When following redirects, multiple status+header blocks may appear.
|
|
16
16
|
* We parse the LAST one (the final response).
|
|
@@ -31,27 +31,43 @@ export function parseCurlOutput(stdout, _stderr, _exitCode) {
|
|
|
31
31
|
const lastBlock = blocks.length > 0 ? blocks[blocks.length - 1] : responsePart;
|
|
32
32
|
const { status, statusText, headers, body } = parseHttpBlock(lastBlock);
|
|
33
33
|
const contentType = headers["content-type"];
|
|
34
|
+
const timingDetails = buildTimingDetails(meta);
|
|
34
35
|
return {
|
|
35
36
|
status,
|
|
36
37
|
statusText,
|
|
37
38
|
headers,
|
|
38
39
|
body: body || undefined,
|
|
39
|
-
timing: {
|
|
40
|
+
timing: {
|
|
41
|
+
total: meta.time_total,
|
|
42
|
+
...(timingDetails ? { details: timingDetails } : {}),
|
|
43
|
+
},
|
|
40
44
|
size: meta.size_download,
|
|
41
45
|
contentType,
|
|
42
46
|
};
|
|
43
47
|
}
|
|
44
48
|
/**
|
|
45
49
|
* Parses curl output for HEAD requests (no body expected).
|
|
50
|
+
* Extracts contentLength as a numeric field from the Content-Length header.
|
|
46
51
|
*/
|
|
47
52
|
export function parseCurlHeadOutput(stdout, stderr, exitCode) {
|
|
48
53
|
const full = parseCurlOutput(stdout, stderr, exitCode);
|
|
54
|
+
// Extract Content-Length as a numeric field for easy size checking
|
|
55
|
+
const headers = full.headers ?? {};
|
|
56
|
+
const clHeader = headers["content-length"];
|
|
57
|
+
let contentLength;
|
|
58
|
+
if (clHeader !== undefined) {
|
|
59
|
+
const parsed = parseInt(clHeader, 10);
|
|
60
|
+
if (!isNaN(parsed) && parsed >= 0) {
|
|
61
|
+
contentLength = parsed;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
49
64
|
return {
|
|
50
65
|
status: full.status,
|
|
51
66
|
statusText: full.statusText,
|
|
52
67
|
headers: full.headers,
|
|
53
68
|
timing: full.timing,
|
|
54
69
|
contentType: full.contentType,
|
|
70
|
+
contentLength,
|
|
55
71
|
};
|
|
56
72
|
}
|
|
57
73
|
/**
|
|
@@ -117,15 +133,51 @@ export function parseHttpBlock(block) {
|
|
|
117
133
|
body = body.replace(/\n$/, "");
|
|
118
134
|
return { status, statusText, headers, body };
|
|
119
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Builds a TimingDetails object from the parsed meta section.
|
|
138
|
+
* Returns undefined if all timing values are zero (no real timing data available).
|
|
139
|
+
*/
|
|
140
|
+
function buildTimingDetails(meta) {
|
|
141
|
+
// If namelookup and connect are both 0, we likely have no timing data
|
|
142
|
+
// (e.g. old format or no metadata)
|
|
143
|
+
if (meta.time_namelookup === 0 && meta.time_connect === 0 && meta.time_starttransfer === 0) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
const details = {
|
|
147
|
+
namelookup: meta.time_namelookup,
|
|
148
|
+
connect: meta.time_connect,
|
|
149
|
+
};
|
|
150
|
+
// Only include appconnect when it has a meaningful value (> 0 means TLS was used)
|
|
151
|
+
if (meta.time_appconnect > 0) {
|
|
152
|
+
details.appconnect = meta.time_appconnect;
|
|
153
|
+
}
|
|
154
|
+
// Only include pretransfer when available
|
|
155
|
+
if (meta.time_pretransfer > 0) {
|
|
156
|
+
details.pretransfer = meta.time_pretransfer;
|
|
157
|
+
}
|
|
158
|
+
// Only include starttransfer when available
|
|
159
|
+
if (meta.time_starttransfer > 0) {
|
|
160
|
+
details.starttransfer = meta.time_starttransfer;
|
|
161
|
+
}
|
|
162
|
+
return details;
|
|
163
|
+
}
|
|
120
164
|
/**
|
|
121
165
|
* Parses the metadata section appended by curl's -w format string.
|
|
122
|
-
* Format: "<time_total> <size_download>"
|
|
166
|
+
* Format: "<time_total> <size_download> <time_namelookup> <time_connect> <time_appconnect> <time_pretransfer> <time_starttransfer>"
|
|
167
|
+
*
|
|
168
|
+
* For backward compatibility, also handles the old 2-field format:
|
|
169
|
+
* "<time_total> <size_download>"
|
|
123
170
|
*/
|
|
124
171
|
function parseMetaSection(meta) {
|
|
125
172
|
const parts = meta.trim().split(/\s+/);
|
|
126
173
|
return {
|
|
127
174
|
time_total: parts[0] ? parseFloat(parts[0]) : 0,
|
|
128
175
|
size_download: parts[1] ? parseFloat(parts[1]) : 0,
|
|
176
|
+
time_namelookup: parts[2] ? parseFloat(parts[2]) : 0,
|
|
177
|
+
time_connect: parts[3] ? parseFloat(parts[3]) : 0,
|
|
178
|
+
time_appconnect: parts[4] ? parseFloat(parts[4]) : 0,
|
|
179
|
+
time_pretransfer: parts[5] ? parseFloat(parts[5]) : 0,
|
|
180
|
+
time_starttransfer: parts[6] ? parseFloat(parts[6]) : 0,
|
|
129
181
|
};
|
|
130
182
|
}
|
|
131
183
|
//# sourceMappingURL=parsers.js.map
|
package/dist/lib/parsers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/index.d.ts
CHANGED
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
/** Zod schema for a single HTTP header key-value pair as a record. */
|
|
3
3
|
export declare const HttpHeadersSchema: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
4
|
+
/** Zod schema for expanded timing details from curl's -w format variables. */
|
|
5
|
+
export declare const TimingDetailsSchema: z.ZodObject<{
|
|
6
|
+
namelookup: z.ZodNumber;
|
|
7
|
+
connect: z.ZodNumber;
|
|
8
|
+
appconnect: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
pretransfer: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
starttransfer: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export type TimingDetails = z.infer<typeof TimingDetailsSchema>;
|
|
4
13
|
/** Zod schema for HTTP timing information. */
|
|
5
14
|
export declare const HttpTimingSchema: z.ZodObject<{
|
|
6
15
|
total: z.ZodNumber;
|
|
16
|
+
details: z.ZodOptional<z.ZodObject<{
|
|
17
|
+
namelookup: z.ZodNumber;
|
|
18
|
+
connect: z.ZodNumber;
|
|
19
|
+
appconnect: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
pretransfer: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
starttransfer: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
}, z.core.$strip>>;
|
|
7
23
|
}, z.core.$strip>;
|
|
24
|
+
export type HttpTiming = z.infer<typeof HttpTimingSchema>;
|
|
8
25
|
/** Zod schema for the full HTTP response result (used by request, get, post). */
|
|
9
26
|
export declare const HttpResponseSchema: z.ZodObject<{
|
|
10
27
|
status: z.ZodNumber;
|
|
@@ -13,6 +30,13 @@ export declare const HttpResponseSchema: z.ZodObject<{
|
|
|
13
30
|
body: z.ZodOptional<z.ZodString>;
|
|
14
31
|
timing: z.ZodObject<{
|
|
15
32
|
total: z.ZodNumber;
|
|
33
|
+
details: z.ZodOptional<z.ZodObject<{
|
|
34
|
+
namelookup: z.ZodNumber;
|
|
35
|
+
connect: z.ZodNumber;
|
|
36
|
+
appconnect: z.ZodOptional<z.ZodNumber>;
|
|
37
|
+
pretransfer: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
starttransfer: z.ZodOptional<z.ZodNumber>;
|
|
39
|
+
}, z.core.$strip>>;
|
|
16
40
|
}, z.core.$strip>;
|
|
17
41
|
size: z.ZodNumber;
|
|
18
42
|
contentType: z.ZodOptional<z.ZodString>;
|
|
@@ -25,8 +49,16 @@ export declare const HttpHeadResponseSchema: z.ZodObject<{
|
|
|
25
49
|
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
26
50
|
timing: z.ZodObject<{
|
|
27
51
|
total: z.ZodNumber;
|
|
52
|
+
details: z.ZodOptional<z.ZodObject<{
|
|
53
|
+
namelookup: z.ZodNumber;
|
|
54
|
+
connect: z.ZodNumber;
|
|
55
|
+
appconnect: z.ZodOptional<z.ZodNumber>;
|
|
56
|
+
pretransfer: z.ZodOptional<z.ZodNumber>;
|
|
57
|
+
starttransfer: z.ZodOptional<z.ZodNumber>;
|
|
58
|
+
}, z.core.$strip>>;
|
|
28
59
|
}, z.core.$strip>;
|
|
29
60
|
contentType: z.ZodOptional<z.ZodString>;
|
|
61
|
+
contentLength: z.ZodOptional<z.ZodNumber>;
|
|
30
62
|
}, z.core.$strip>;
|
|
31
63
|
export type HttpHeadResponse = z.infer<typeof HttpHeadResponseSchema>;
|
|
32
64
|
/** Compact response: status, timing, size. Drop headers and body. */
|
|
@@ -37,17 +69,39 @@ export declare const HttpResponseCompactSchema: z.ZodObject<{
|
|
|
37
69
|
size: z.ZodNumber;
|
|
38
70
|
timing: z.ZodObject<{
|
|
39
71
|
total: z.ZodNumber;
|
|
72
|
+
details: z.ZodOptional<z.ZodObject<{
|
|
73
|
+
namelookup: z.ZodNumber;
|
|
74
|
+
connect: z.ZodNumber;
|
|
75
|
+
appconnect: z.ZodOptional<z.ZodNumber>;
|
|
76
|
+
pretransfer: z.ZodOptional<z.ZodNumber>;
|
|
77
|
+
starttransfer: z.ZodOptional<z.ZodNumber>;
|
|
78
|
+
}, z.core.$strip>>;
|
|
40
79
|
}, z.core.$strip>;
|
|
41
80
|
}, z.core.$strip>;
|
|
42
81
|
export type HttpResponseCompact = z.infer<typeof HttpResponseCompactSchema>;
|
|
43
|
-
/**
|
|
82
|
+
/**
|
|
83
|
+
* Compact HEAD response: status, timing, and key headers.
|
|
84
|
+
* Retains essential headers even in compact mode: content-length, cache-control,
|
|
85
|
+
* etag, last-modified, content-type.
|
|
86
|
+
*/
|
|
44
87
|
export declare const HttpHeadResponseCompactSchema: z.ZodObject<{
|
|
45
88
|
status: z.ZodNumber;
|
|
46
89
|
statusText: z.ZodString;
|
|
47
90
|
contentType: z.ZodOptional<z.ZodString>;
|
|
91
|
+
contentLength: z.ZodOptional<z.ZodNumber>;
|
|
48
92
|
timing: z.ZodObject<{
|
|
49
93
|
total: z.ZodNumber;
|
|
94
|
+
details: z.ZodOptional<z.ZodObject<{
|
|
95
|
+
namelookup: z.ZodNumber;
|
|
96
|
+
connect: z.ZodNumber;
|
|
97
|
+
appconnect: z.ZodOptional<z.ZodNumber>;
|
|
98
|
+
pretransfer: z.ZodOptional<z.ZodNumber>;
|
|
99
|
+
starttransfer: z.ZodOptional<z.ZodNumber>;
|
|
100
|
+
}, z.core.$strip>>;
|
|
50
101
|
}, z.core.$strip>;
|
|
102
|
+
essentialHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
51
103
|
}, z.core.$strip>;
|
|
52
104
|
export type HttpHeadResponseCompact = z.infer<typeof HttpHeadResponseCompactSchema>;
|
|
105
|
+
/** Headers that should be preserved in HEAD compact mode. */
|
|
106
|
+
export declare const HEAD_ESSENTIAL_HEADERS: readonly ["content-length", "cache-control", "etag", "last-modified", "content-type"];
|
|
53
107
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,uCAAmC,CAAC;AAElE,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,uCAAmC,CAAC;AAElE,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB;;;;;;iBAe9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB;;;;;;;;;iBAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,iFAAiF;AACjF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAQ7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,mEAAmE;AACnE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;iBAOjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,qEAAqE;AACrE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;iBAMpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;GAIG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;iBAOxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,uFAMzB,CAAC"}
|
package/dist/schemas/index.js
CHANGED
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
/** Zod schema for a single HTTP header key-value pair as a record. */
|
|
3
3
|
export const HttpHeadersSchema = z.record(z.string(), z.string());
|
|
4
|
+
/** Zod schema for expanded timing details from curl's -w format variables. */
|
|
5
|
+
export const TimingDetailsSchema = z.object({
|
|
6
|
+
namelookup: z.number().describe("Time from start until DNS resolution completed (seconds)"),
|
|
7
|
+
connect: z.number().describe("Time from start until TCP connection established (seconds)"),
|
|
8
|
+
appconnect: z
|
|
9
|
+
.number()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe("Time from start until TLS handshake completed (seconds)"),
|
|
12
|
+
pretransfer: z
|
|
13
|
+
.number()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Time from start until just before transfer begins (seconds)"),
|
|
16
|
+
starttransfer: z
|
|
17
|
+
.number()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Time from start until first response byte received (seconds)"),
|
|
20
|
+
});
|
|
4
21
|
/** Zod schema for HTTP timing information. */
|
|
5
22
|
export const HttpTimingSchema = z.object({
|
|
6
23
|
total: z.number(),
|
|
24
|
+
details: TimingDetailsSchema.optional(),
|
|
7
25
|
});
|
|
8
26
|
/** Zod schema for the full HTTP response result (used by request, get, post). */
|
|
9
27
|
export const HttpResponseSchema = z.object({
|
|
@@ -22,6 +40,7 @@ export const HttpHeadResponseSchema = z.object({
|
|
|
22
40
|
headers: HttpHeadersSchema.optional(),
|
|
23
41
|
timing: HttpTimingSchema,
|
|
24
42
|
contentType: z.string().optional(),
|
|
43
|
+
contentLength: z.number().optional(),
|
|
25
44
|
});
|
|
26
45
|
/** Compact response: status, timing, size. Drop headers and body. */
|
|
27
46
|
export const HttpResponseCompactSchema = z.object({
|
|
@@ -31,11 +50,25 @@ export const HttpResponseCompactSchema = z.object({
|
|
|
31
50
|
size: z.number(),
|
|
32
51
|
timing: HttpTimingSchema,
|
|
33
52
|
});
|
|
34
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Compact HEAD response: status, timing, and key headers.
|
|
55
|
+
* Retains essential headers even in compact mode: content-length, cache-control,
|
|
56
|
+
* etag, last-modified, content-type.
|
|
57
|
+
*/
|
|
35
58
|
export const HttpHeadResponseCompactSchema = z.object({
|
|
36
59
|
status: z.number(),
|
|
37
60
|
statusText: z.string(),
|
|
38
61
|
contentType: z.string().optional(),
|
|
62
|
+
contentLength: z.number().optional(),
|
|
39
63
|
timing: HttpTimingSchema,
|
|
64
|
+
essentialHeaders: HttpHeadersSchema.optional(),
|
|
40
65
|
});
|
|
66
|
+
/** Headers that should be preserved in HEAD compact mode. */
|
|
67
|
+
export const HEAD_ESSENTIAL_HEADERS = [
|
|
68
|
+
"content-length",
|
|
69
|
+
"cache-control",
|
|
70
|
+
"etag",
|
|
71
|
+
"last-modified",
|
|
72
|
+
"content-type",
|
|
73
|
+
];
|
|
41
74
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAElE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/get.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAkKhD"}
|
package/dist/tools/get.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
3
|
import { curlCmd } from "../lib/curl-runner.js";
|
|
4
4
|
import { parseCurlOutput } from "../lib/parsers.js";
|
|
5
5
|
import { formatHttpResponse, compactResponseMap, formatResponseCompact, } from "../lib/formatters.js";
|
|
6
6
|
import { HttpResponseSchema } from "../schemas/index.js";
|
|
7
7
|
import { assertSafeUrl } from "../lib/url-validation.js";
|
|
8
8
|
import { buildCurlArgs } from "./request.js";
|
|
9
|
+
const HTTP_VERSIONS = ["1.0", "1.1", "2"];
|
|
9
10
|
/** Registers the `get` tool on the given MCP server. */
|
|
10
11
|
export function registerGetTool(server) {
|
|
11
12
|
server.registerTool("get", {
|
|
@@ -27,11 +28,54 @@ export function registerGetTool(server) {
|
|
|
27
28
|
.optional()
|
|
28
29
|
.default(30)
|
|
29
30
|
.describe("Request timeout in seconds (default: 30)"),
|
|
31
|
+
connectTimeout: z
|
|
32
|
+
.number()
|
|
33
|
+
.min(1)
|
|
34
|
+
.max(300)
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("Maximum time in seconds for connection phase only (--connect-timeout). Detects connection failures fast."),
|
|
30
37
|
followRedirects: z
|
|
31
38
|
.boolean()
|
|
32
39
|
.optional()
|
|
33
40
|
.default(true)
|
|
34
41
|
.describe("Follow HTTP redirects (default: true)"),
|
|
42
|
+
insecure: z
|
|
43
|
+
.boolean()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("Allow insecure TLS connections, e.g. self-signed certificates (-k)"),
|
|
46
|
+
retry: z
|
|
47
|
+
.number()
|
|
48
|
+
.min(0)
|
|
49
|
+
.max(10)
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Number of retries on transient failures (--retry)"),
|
|
52
|
+
compressed: z
|
|
53
|
+
.boolean()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Request compressed response and decompress automatically (--compressed)"),
|
|
56
|
+
basicAuth: z
|
|
57
|
+
.string()
|
|
58
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Basic auth credentials as 'user:password' (-u)"),
|
|
61
|
+
proxy: z
|
|
62
|
+
.string()
|
|
63
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Proxy URL (e.g., http://proxy:8080) (-x)"),
|
|
66
|
+
queryParams: z
|
|
67
|
+
.record(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX), z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
68
|
+
.optional()
|
|
69
|
+
.describe("Query parameters as key-value pairs. URL-encoded and appended to the URL automatically."),
|
|
70
|
+
httpVersion: z
|
|
71
|
+
.enum(HTTP_VERSIONS)
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("HTTP version to use: '1.0', '1.1', or '2' (--http1.0/--http1.1/--http2)"),
|
|
74
|
+
resolve: z
|
|
75
|
+
.string()
|
|
76
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
77
|
+
.optional()
|
|
78
|
+
.describe("Custom DNS resolution (--resolve). Format: 'host:port:addr' (e.g., 'example.com:443:127.0.0.1')"),
|
|
35
79
|
compact: z
|
|
36
80
|
.boolean()
|
|
37
81
|
.optional()
|
|
@@ -44,14 +88,38 @@ export function registerGetTool(server) {
|
|
|
44
88
|
.describe("Working directory (default: cwd)"),
|
|
45
89
|
},
|
|
46
90
|
outputSchema: HttpResponseSchema,
|
|
47
|
-
}, async ({ url, headers, timeout, followRedirects, compact, path }) => {
|
|
48
|
-
|
|
91
|
+
}, async ({ url, headers, timeout, connectTimeout, followRedirects, insecure, retry, compressed, basicAuth, proxy, queryParams, httpVersion, resolve, compact, path, }) => {
|
|
92
|
+
// Build URL with query params if provided
|
|
93
|
+
let finalUrl = url;
|
|
94
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
95
|
+
const params = new URLSearchParams();
|
|
96
|
+
for (const [key, value] of Object.entries(queryParams)) {
|
|
97
|
+
params.append(key, value);
|
|
98
|
+
}
|
|
99
|
+
const separator = url.includes("?") ? "&" : "?";
|
|
100
|
+
finalUrl = `${url}${separator}${params.toString()}`;
|
|
101
|
+
}
|
|
102
|
+
assertSafeUrl(finalUrl);
|
|
103
|
+
if (basicAuth)
|
|
104
|
+
assertNoFlagInjection(basicAuth, "basicAuth");
|
|
105
|
+
if (proxy)
|
|
106
|
+
assertNoFlagInjection(proxy, "proxy");
|
|
107
|
+
if (resolve)
|
|
108
|
+
assertNoFlagInjection(resolve, "resolve");
|
|
49
109
|
const args = buildCurlArgs({
|
|
50
|
-
url,
|
|
110
|
+
url: finalUrl,
|
|
51
111
|
method: "GET",
|
|
52
112
|
headers,
|
|
53
113
|
timeout: timeout ?? 30,
|
|
114
|
+
connectTimeout,
|
|
54
115
|
followRedirects: followRedirects ?? true,
|
|
116
|
+
insecure,
|
|
117
|
+
retry,
|
|
118
|
+
compressed,
|
|
119
|
+
basicAuth,
|
|
120
|
+
proxy,
|
|
121
|
+
httpVersion,
|
|
122
|
+
resolve,
|
|
55
123
|
});
|
|
56
124
|
const cwd = path || process.cwd();
|
|
57
125
|
const result = await curlCmd(args, cwd);
|
package/dist/tools/get.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/head.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAwIjD"}
|
package/dist/tools/head.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
3
|
import { curlCmd } from "../lib/curl-runner.js";
|
|
4
4
|
import { parseCurlHeadOutput } from "../lib/parsers.js";
|
|
5
5
|
import { formatHttpHeadResponse, compactHeadResponseMap, formatHeadResponseCompact, } from "../lib/formatters.js";
|
|
6
6
|
import { HttpHeadResponseSchema } from "../schemas/index.js";
|
|
7
7
|
import { assertSafeUrl } from "../lib/url-validation.js";
|
|
8
8
|
import { buildCurlArgs } from "./request.js";
|
|
9
|
+
const HTTP_VERSIONS = ["1.0", "1.1", "2"];
|
|
9
10
|
/** Registers the `head` tool on the given MCP server. */
|
|
10
11
|
export function registerHeadTool(server) {
|
|
11
12
|
server.registerTool("head", {
|
|
@@ -27,11 +28,46 @@ export function registerHeadTool(server) {
|
|
|
27
28
|
.optional()
|
|
28
29
|
.default(30)
|
|
29
30
|
.describe("Request timeout in seconds (default: 30)"),
|
|
31
|
+
connectTimeout: z
|
|
32
|
+
.number()
|
|
33
|
+
.min(1)
|
|
34
|
+
.max(300)
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("Maximum time in seconds for connection phase only (--connect-timeout). Fast failure for availability probing."),
|
|
30
37
|
followRedirects: z
|
|
31
38
|
.boolean()
|
|
32
39
|
.optional()
|
|
33
40
|
.default(true)
|
|
34
41
|
.describe("Follow HTTP redirects (default: true)"),
|
|
42
|
+
insecure: z
|
|
43
|
+
.boolean()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("Allow insecure TLS connections, e.g. self-signed certificates (-k)"),
|
|
46
|
+
retry: z
|
|
47
|
+
.number()
|
|
48
|
+
.min(0)
|
|
49
|
+
.max(10)
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Number of retries on transient failures (--retry)"),
|
|
52
|
+
basicAuth: z
|
|
53
|
+
.string()
|
|
54
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("Basic auth credentials as 'user:password' (-u)"),
|
|
57
|
+
proxy: z
|
|
58
|
+
.string()
|
|
59
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("Proxy URL (e.g., http://proxy:8080) (-x)"),
|
|
62
|
+
httpVersion: z
|
|
63
|
+
.enum(HTTP_VERSIONS)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("HTTP version to use: '1.0', '1.1', or '2' (--http1.0/--http1.1/--http2)"),
|
|
66
|
+
resolve: z
|
|
67
|
+
.string()
|
|
68
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("Custom DNS resolution (--resolve). Format: 'host:port:addr' (e.g., 'example.com:443:127.0.0.1')"),
|
|
35
71
|
compact: z
|
|
36
72
|
.boolean()
|
|
37
73
|
.optional()
|
|
@@ -44,14 +80,28 @@ export function registerHeadTool(server) {
|
|
|
44
80
|
.describe("Working directory (default: cwd)"),
|
|
45
81
|
},
|
|
46
82
|
outputSchema: HttpHeadResponseSchema,
|
|
47
|
-
}, async ({ url, headers, timeout, followRedirects, compact, path }) => {
|
|
83
|
+
}, async ({ url, headers, timeout, connectTimeout, followRedirects, insecure, retry, basicAuth, proxy, httpVersion, resolve, compact, path, }) => {
|
|
48
84
|
assertSafeUrl(url);
|
|
85
|
+
if (basicAuth)
|
|
86
|
+
assertNoFlagInjection(basicAuth, "basicAuth");
|
|
87
|
+
if (proxy)
|
|
88
|
+
assertNoFlagInjection(proxy, "proxy");
|
|
89
|
+
if (resolve)
|
|
90
|
+
assertNoFlagInjection(resolve, "resolve");
|
|
49
91
|
const args = buildCurlArgs({
|
|
50
92
|
url,
|
|
51
93
|
method: "HEAD",
|
|
52
94
|
headers,
|
|
53
95
|
timeout: timeout ?? 30,
|
|
96
|
+
connectTimeout,
|
|
54
97
|
followRedirects: followRedirects ?? true,
|
|
98
|
+
insecure,
|
|
99
|
+
retry,
|
|
100
|
+
basicAuth,
|
|
101
|
+
proxy,
|
|
102
|
+
httpVersion,
|
|
103
|
+
resolve,
|
|
104
|
+
useHeadFlag: true, // Use -I instead of -X HEAD to avoid potential hangs
|
|
55
105
|
});
|
|
56
106
|
const cwd = path || process.cwd();
|
|
57
107
|
const result = await curlCmd(args, cwd);
|
package/dist/tools/head.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"head.js","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"head.js","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/post.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAmMjD"}
|
package/dist/tools/post.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
3
|
import { curlCmd } from "../lib/curl-runner.js";
|
|
4
4
|
import { parseCurlOutput } from "../lib/parsers.js";
|
|
5
5
|
import { formatHttpResponse, compactResponseMap, formatResponseCompact, } from "../lib/formatters.js";
|
|
6
6
|
import { HttpResponseSchema } from "../schemas/index.js";
|
|
7
7
|
import { assertSafeUrl } from "../lib/url-validation.js";
|
|
8
8
|
import { buildCurlArgs } from "./request.js";
|
|
9
|
+
const HTTP_VERSIONS = ["1.0", "1.1", "2"];
|
|
9
10
|
/** Registers the `post` tool on the given MCP server. */
|
|
10
11
|
export function registerPostTool(server) {
|
|
11
12
|
server.registerTool("post", {
|
|
@@ -16,7 +17,11 @@ export function registerPostTool(server) {
|
|
|
16
17
|
.string()
|
|
17
18
|
.max(INPUT_LIMITS.STRING_MAX)
|
|
18
19
|
.describe("The URL to request (http:// or https:// only)"),
|
|
19
|
-
body: z
|
|
20
|
+
body: z
|
|
21
|
+
.string()
|
|
22
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Request body. Ignored when `form` is provided."),
|
|
20
25
|
headers: z
|
|
21
26
|
.record(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX), z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
22
27
|
.optional()
|
|
@@ -26,7 +31,7 @@ export function registerPostTool(server) {
|
|
|
26
31
|
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
27
32
|
.optional()
|
|
28
33
|
.default("application/json")
|
|
29
|
-
.describe("Content-Type header (default: application/json)"),
|
|
34
|
+
.describe("Content-Type header (default: application/json). Ignored when `form` is provided."),
|
|
30
35
|
timeout: z
|
|
31
36
|
.number()
|
|
32
37
|
.min(1)
|
|
@@ -34,11 +39,56 @@ export function registerPostTool(server) {
|
|
|
34
39
|
.optional()
|
|
35
40
|
.default(30)
|
|
36
41
|
.describe("Request timeout in seconds (default: 30)"),
|
|
42
|
+
connectTimeout: z
|
|
43
|
+
.number()
|
|
44
|
+
.min(1)
|
|
45
|
+
.max(300)
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("Maximum time in seconds for connection phase only (--connect-timeout). Detects connection failures fast."),
|
|
37
48
|
followRedirects: z
|
|
38
49
|
.boolean()
|
|
39
50
|
.optional()
|
|
40
51
|
.default(true)
|
|
41
52
|
.describe("Follow HTTP redirects (default: true)"),
|
|
53
|
+
preserveMethodOnRedirect: z
|
|
54
|
+
.boolean()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("Preserve POST method on 301/302/303 redirects instead of converting to GET (--post301/--post302/--post303)"),
|
|
57
|
+
insecure: z
|
|
58
|
+
.boolean()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Allow insecure TLS connections, e.g. self-signed certificates (-k)"),
|
|
61
|
+
accept: z
|
|
62
|
+
.string()
|
|
63
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Expected response format via Accept header (e.g., 'application/json')"),
|
|
66
|
+
compressed: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe("Request compressed response and decompress automatically (--compressed)"),
|
|
70
|
+
basicAuth: z
|
|
71
|
+
.string()
|
|
72
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
73
|
+
.optional()
|
|
74
|
+
.describe("Basic auth credentials as 'user:password' (-u)"),
|
|
75
|
+
proxy: z
|
|
76
|
+
.string()
|
|
77
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
78
|
+
.optional()
|
|
79
|
+
.describe("Proxy URL (e.g., http://proxy:8080) (-x)"),
|
|
80
|
+
dataUrlencode: z
|
|
81
|
+
.array(z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
82
|
+
.optional()
|
|
83
|
+
.describe("URL-encoded form data items (--data-urlencode). Each item is 'key=value'. Use instead of manual URL encoding."),
|
|
84
|
+
form: z
|
|
85
|
+
.record(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX), z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("Multipart form data as key-value pairs (-F). Each pair maps to `-F key=value`. For file uploads use `@filepath` as the value. When provided, `body` and `contentType` are ignored."),
|
|
88
|
+
httpVersion: z
|
|
89
|
+
.enum(HTTP_VERSIONS)
|
|
90
|
+
.optional()
|
|
91
|
+
.describe("HTTP version to use: '1.0', '1.1', or '2' (--http1.0/--http1.1/--http2)"),
|
|
42
92
|
compact: z
|
|
43
93
|
.boolean()
|
|
44
94
|
.optional()
|
|
@@ -51,20 +101,50 @@ export function registerPostTool(server) {
|
|
|
51
101
|
.describe("Working directory (default: cwd)"),
|
|
52
102
|
},
|
|
53
103
|
outputSchema: HttpResponseSchema,
|
|
54
|
-
}, async ({ url, body, headers, contentType, timeout, followRedirects, compact, path }) => {
|
|
104
|
+
}, async ({ url, body, headers, contentType, timeout, connectTimeout, followRedirects, preserveMethodOnRedirect, insecure, accept, compressed, basicAuth, proxy, dataUrlencode, form, httpVersion, compact, path, }) => {
|
|
55
105
|
assertSafeUrl(url);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
106
|
+
if (accept)
|
|
107
|
+
assertNoFlagInjection(accept, "accept");
|
|
108
|
+
if (basicAuth)
|
|
109
|
+
assertNoFlagInjection(basicAuth, "basicAuth");
|
|
110
|
+
if (proxy)
|
|
111
|
+
assertNoFlagInjection(proxy, "proxy");
|
|
112
|
+
if (dataUrlencode) {
|
|
113
|
+
for (const item of dataUrlencode) {
|
|
114
|
+
assertNoFlagInjection(item, "dataUrlencode");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (form) {
|
|
118
|
+
for (const value of Object.values(form)) {
|
|
119
|
+
assertNoFlagInjection(value, "form value");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// When form is provided, don't set Content-Type (curl sets multipart/form-data automatically)
|
|
123
|
+
const mergedHeaders = form
|
|
124
|
+
? { ...headers }
|
|
125
|
+
: {
|
|
126
|
+
"Content-Type": contentType ?? "application/json",
|
|
127
|
+
...headers,
|
|
128
|
+
};
|
|
129
|
+
if (accept) {
|
|
130
|
+
mergedHeaders["Accept"] = accept;
|
|
131
|
+
}
|
|
61
132
|
const args = buildCurlArgs({
|
|
62
133
|
url,
|
|
63
134
|
method: "POST",
|
|
64
135
|
headers: mergedHeaders,
|
|
65
|
-
body,
|
|
136
|
+
body: form ? undefined : body,
|
|
66
137
|
timeout: timeout ?? 30,
|
|
138
|
+
connectTimeout,
|
|
67
139
|
followRedirects: followRedirects ?? true,
|
|
140
|
+
insecure,
|
|
141
|
+
compressed,
|
|
142
|
+
basicAuth,
|
|
143
|
+
proxy,
|
|
144
|
+
httpVersion,
|
|
145
|
+
preserveMethodOnRedirect,
|
|
146
|
+
dataUrlencode: form ? undefined : dataUrlencode,
|
|
147
|
+
form,
|
|
68
148
|
});
|
|
69
149
|
const cwd = path || process.cwd();
|
|
70
150
|
const result = await curlCmd(args, cwd);
|
package/dist/tools/post.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/request.d.ts
CHANGED
|
@@ -2,15 +2,37 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
/** Registers the `request` tool on the given MCP server. */
|
|
3
3
|
export declare function registerRequestTool(server: McpServer): void;
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Options for building curl arguments.
|
|
6
|
+
* Shared by all HTTP tools (get, post, head, request).
|
|
7
7
|
*/
|
|
8
|
-
export
|
|
8
|
+
export interface BuildCurlArgsOptions {
|
|
9
9
|
url: string;
|
|
10
10
|
method: string;
|
|
11
11
|
headers?: Record<string, string>;
|
|
12
12
|
body?: string;
|
|
13
13
|
timeout: number;
|
|
14
|
+
connectTimeout?: number;
|
|
14
15
|
followRedirects: boolean;
|
|
15
|
-
|
|
16
|
+
insecure?: boolean;
|
|
17
|
+
retry?: number;
|
|
18
|
+
compressed?: boolean;
|
|
19
|
+
basicAuth?: string;
|
|
20
|
+
proxy?: string;
|
|
21
|
+
httpVersion?: string;
|
|
22
|
+
cookie?: string;
|
|
23
|
+
resolve?: string;
|
|
24
|
+
/** When true, use -I (--head) instead of -X HEAD for proper HEAD behavior. */
|
|
25
|
+
useHeadFlag?: boolean;
|
|
26
|
+
/** When true, add --post301 --post302 --post303 to preserve POST method on redirects. */
|
|
27
|
+
preserveMethodOnRedirect?: boolean;
|
|
28
|
+
/** URL-encoded form data items passed via --data-urlencode. */
|
|
29
|
+
dataUrlencode?: string[];
|
|
30
|
+
/** Multipart form data items passed via -F. Each key-value becomes -F key=value. */
|
|
31
|
+
form?: Record<string, string>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Builds the curl argument array from the request parameters.
|
|
35
|
+
* Exported for reuse in get/post/head tools.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildCurlArgs(opts: BuildCurlArgsOptions): string[];
|
|
16
38
|
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/tools/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/tools/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,QAgKpD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAmIlE"}
|
package/dist/tools/request.js
CHANGED
|
@@ -6,6 +6,7 @@ import { formatHttpResponse, compactResponseMap, formatResponseCompact, } from "
|
|
|
6
6
|
import { HttpResponseSchema } from "../schemas/index.js";
|
|
7
7
|
import { assertSafeUrl, assertSafeHeader } from "../lib/url-validation.js";
|
|
8
8
|
const METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
9
|
+
const HTTP_VERSIONS = ["1.0", "1.1", "2"];
|
|
9
10
|
/** Registers the `request` tool on the given MCP server. */
|
|
10
11
|
export function registerRequestTool(server) {
|
|
11
12
|
server.registerTool("request", {
|
|
@@ -33,11 +34,55 @@ export function registerRequestTool(server) {
|
|
|
33
34
|
.optional()
|
|
34
35
|
.default(30)
|
|
35
36
|
.describe("Request timeout in seconds (default: 30)"),
|
|
37
|
+
connectTimeout: z
|
|
38
|
+
.number()
|
|
39
|
+
.min(1)
|
|
40
|
+
.max(300)
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Maximum time in seconds for connection phase only (--connect-timeout). Independent of total timeout."),
|
|
36
43
|
followRedirects: z
|
|
37
44
|
.boolean()
|
|
38
45
|
.optional()
|
|
39
46
|
.default(true)
|
|
40
47
|
.describe("Follow HTTP redirects (default: true)"),
|
|
48
|
+
insecure: z
|
|
49
|
+
.boolean()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Allow insecure TLS connections, e.g. self-signed certificates (-k)"),
|
|
52
|
+
retry: z
|
|
53
|
+
.number()
|
|
54
|
+
.min(0)
|
|
55
|
+
.max(10)
|
|
56
|
+
.optional()
|
|
57
|
+
.describe("Number of retries on transient failures (--retry)"),
|
|
58
|
+
compressed: z
|
|
59
|
+
.boolean()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("Request compressed response and decompress automatically (--compressed)"),
|
|
62
|
+
basicAuth: z
|
|
63
|
+
.string()
|
|
64
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Basic auth credentials as 'user:password' (-u)"),
|
|
67
|
+
proxy: z
|
|
68
|
+
.string()
|
|
69
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
70
|
+
.optional()
|
|
71
|
+
.describe("Proxy URL (e.g., http://proxy:8080) (-x)"),
|
|
72
|
+
httpVersion: z
|
|
73
|
+
.enum(HTTP_VERSIONS)
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("HTTP version to use: '1.0', '1.1', or '2' (--http1.0/--http1.1/--http2)"),
|
|
76
|
+
cookie: z
|
|
77
|
+
.string()
|
|
78
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
79
|
+
.optional()
|
|
80
|
+
.describe("Cookie string or cookie jar file path for session-based APIs (-b). Format: 'name=value; name2=value2'"),
|
|
81
|
+
resolve: z
|
|
82
|
+
.string()
|
|
83
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
84
|
+
.optional()
|
|
85
|
+
.describe("Custom DNS resolution (--resolve). Format: 'host:port:addr' (e.g., 'example.com:443:127.0.0.1')"),
|
|
41
86
|
compact: z
|
|
42
87
|
.boolean()
|
|
43
88
|
.optional()
|
|
@@ -50,15 +95,32 @@ export function registerRequestTool(server) {
|
|
|
50
95
|
.describe("Working directory (default: cwd)"),
|
|
51
96
|
},
|
|
52
97
|
outputSchema: HttpResponseSchema,
|
|
53
|
-
}, async ({ url, method, headers, body, timeout, followRedirects, compact, path }) => {
|
|
98
|
+
}, async ({ url, method, headers, body, timeout, connectTimeout, followRedirects, insecure, retry, compressed, basicAuth, proxy, httpVersion, cookie, resolve, compact, path, }) => {
|
|
54
99
|
assertSafeUrl(url);
|
|
100
|
+
if (basicAuth)
|
|
101
|
+
assertNoFlagInjection(basicAuth, "basicAuth");
|
|
102
|
+
if (proxy)
|
|
103
|
+
assertNoFlagInjection(proxy, "proxy");
|
|
104
|
+
if (cookie)
|
|
105
|
+
assertNoFlagInjection(cookie, "cookie");
|
|
106
|
+
if (resolve)
|
|
107
|
+
assertNoFlagInjection(resolve, "resolve");
|
|
55
108
|
const args = buildCurlArgs({
|
|
56
109
|
url,
|
|
57
110
|
method: method ?? "GET",
|
|
58
111
|
headers,
|
|
59
112
|
body,
|
|
60
113
|
timeout: timeout ?? 30,
|
|
114
|
+
connectTimeout,
|
|
61
115
|
followRedirects: followRedirects ?? true,
|
|
116
|
+
insecure,
|
|
117
|
+
retry,
|
|
118
|
+
compressed,
|
|
119
|
+
basicAuth,
|
|
120
|
+
proxy,
|
|
121
|
+
httpVersion,
|
|
122
|
+
cookie,
|
|
123
|
+
resolve,
|
|
62
124
|
});
|
|
63
125
|
const cwd = path || process.cwd();
|
|
64
126
|
const result = await curlCmd(args, cwd);
|
|
@@ -77,19 +139,41 @@ export function buildCurlArgs(opts) {
|
|
|
77
139
|
"-S", // Show errors
|
|
78
140
|
"-i", // Include response headers in output
|
|
79
141
|
];
|
|
80
|
-
// Write-out format for timing and size metadata
|
|
81
|
-
const writeOut =
|
|
142
|
+
// Write-out format for timing and size metadata (expanded with detailed timing)
|
|
143
|
+
const writeOut = [
|
|
144
|
+
`\n${PARE_META_SEPARATOR}\n`,
|
|
145
|
+
"%{time_total}",
|
|
146
|
+
"%{size_download}",
|
|
147
|
+
"%{time_namelookup}",
|
|
148
|
+
"%{time_connect}",
|
|
149
|
+
"%{time_appconnect}",
|
|
150
|
+
"%{time_pretransfer}",
|
|
151
|
+
"%{time_starttransfer}",
|
|
152
|
+
].join(" ");
|
|
82
153
|
args.push("-w", writeOut);
|
|
83
|
-
// HTTP method
|
|
84
|
-
|
|
154
|
+
// HTTP method: use -I (--head) for HEAD requests, -X for everything else
|
|
155
|
+
if (opts.useHeadFlag) {
|
|
156
|
+
args.push("-I");
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
args.push("-X", opts.method);
|
|
160
|
+
}
|
|
85
161
|
// Timeout
|
|
86
162
|
args.push("--max-time", String(opts.timeout));
|
|
163
|
+
// Connection timeout (separate from total timeout)
|
|
164
|
+
if (opts.connectTimeout !== undefined) {
|
|
165
|
+
args.push("--connect-timeout", String(opts.connectTimeout));
|
|
166
|
+
}
|
|
87
167
|
// Follow redirects
|
|
88
168
|
if (opts.followRedirects) {
|
|
89
169
|
args.push("-L");
|
|
90
170
|
// Limit redirect hops to prevent infinite loops
|
|
91
171
|
args.push("--max-redirs", "10");
|
|
92
172
|
}
|
|
173
|
+
// Preserve POST method on redirects (prevent silent POST-to-GET conversion)
|
|
174
|
+
if (opts.preserveMethodOnRedirect) {
|
|
175
|
+
args.push("--post301", "--post302", "--post303");
|
|
176
|
+
}
|
|
93
177
|
// Custom headers
|
|
94
178
|
if (opts.headers) {
|
|
95
179
|
for (const [key, value] of Object.entries(opts.headers)) {
|
|
@@ -99,9 +183,66 @@ export function buildCurlArgs(opts) {
|
|
|
99
183
|
args.push("-H", `${key}: ${value}`);
|
|
100
184
|
}
|
|
101
185
|
}
|
|
102
|
-
//
|
|
103
|
-
if (opts.
|
|
104
|
-
|
|
186
|
+
// Multipart form data (-F): takes priority over body/data-raw
|
|
187
|
+
if (opts.form && Object.keys(opts.form).length > 0) {
|
|
188
|
+
for (const [key, value] of Object.entries(opts.form)) {
|
|
189
|
+
assertNoFlagInjection(value, "form value");
|
|
190
|
+
args.push("-F", `${key}=${value}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Request body
|
|
195
|
+
if (opts.body) {
|
|
196
|
+
args.push("--data-raw", opts.body);
|
|
197
|
+
}
|
|
198
|
+
// URL-encoded form data
|
|
199
|
+
if (opts.dataUrlencode) {
|
|
200
|
+
for (const item of opts.dataUrlencode) {
|
|
201
|
+
args.push("--data-urlencode", item);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Insecure TLS (self-signed certs)
|
|
206
|
+
if (opts.insecure) {
|
|
207
|
+
args.push("-k");
|
|
208
|
+
}
|
|
209
|
+
// Retry on transient failures
|
|
210
|
+
if (opts.retry !== undefined) {
|
|
211
|
+
args.push("--retry", String(opts.retry));
|
|
212
|
+
}
|
|
213
|
+
// Request compressed response
|
|
214
|
+
if (opts.compressed) {
|
|
215
|
+
args.push("--compressed");
|
|
216
|
+
}
|
|
217
|
+
// Basic authentication
|
|
218
|
+
if (opts.basicAuth) {
|
|
219
|
+
args.push("-u", opts.basicAuth);
|
|
220
|
+
}
|
|
221
|
+
// HTTP proxy
|
|
222
|
+
if (opts.proxy) {
|
|
223
|
+
args.push("-x", opts.proxy);
|
|
224
|
+
}
|
|
225
|
+
// HTTP version
|
|
226
|
+
if (opts.httpVersion) {
|
|
227
|
+
switch (opts.httpVersion) {
|
|
228
|
+
case "1.0":
|
|
229
|
+
args.push("--http1.0");
|
|
230
|
+
break;
|
|
231
|
+
case "1.1":
|
|
232
|
+
args.push("--http1.1");
|
|
233
|
+
break;
|
|
234
|
+
case "2":
|
|
235
|
+
args.push("--http2");
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Cookie
|
|
240
|
+
if (opts.cookie) {
|
|
241
|
+
args.push("-b", opts.cookie);
|
|
242
|
+
}
|
|
243
|
+
// Custom DNS resolution
|
|
244
|
+
if (opts.resolve) {
|
|
245
|
+
args.push("--resolve", opts.resolve);
|
|
105
246
|
}
|
|
106
247
|
// URL must be last
|
|
107
248
|
args.push(opts.url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/tools/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE3E,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/tools/request.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paretools/http",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"mcpName": "io.github.Dave-London/pare-http",
|
|
5
5
|
"description": "MCP server for HTTP requests (curl) with structured, token-efficient output",
|
|
6
6
|
"license": "MIT",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
53
53
|
"zod": "^4.3.6",
|
|
54
|
-
"@paretools/shared": "0.
|
|
54
|
+
"@paretools/shared": "0.9.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@types/node": "^25.2.3",
|