@mbeato/apimesh-mcp-server 1.0.0 → 1.2.1
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/index.ts +2 -288
- package/package.json +2 -2
- package/server.json +11 -7
- package/server.ts +198 -0
- package/bun.lock +0 -195
package/index.ts
CHANGED
|
@@ -1,293 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
-
import {
|
|
3
|
+
import { createServer } from "./server.js";
|
|
5
4
|
|
|
6
|
-
const server =
|
|
7
|
-
name: "apimesh",
|
|
8
|
-
version: "1.0.0",
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
// Helper: make an HTTP request and return a structured MCP tool result.
|
|
13
|
-
// Handles 402 (payment required) by returning the payment details.
|
|
14
|
-
// ---------------------------------------------------------------------------
|
|
15
|
-
async function callApi(
|
|
16
|
-
url: string,
|
|
17
|
-
options?: RequestInit,
|
|
18
|
-
): Promise<{ content: Array<{ type: "text"; text: string }>; isError?: boolean }> {
|
|
19
|
-
try {
|
|
20
|
-
const res = await fetch(url, options);
|
|
21
|
-
const body = await res.text();
|
|
22
|
-
|
|
23
|
-
if (res.status === 402) {
|
|
24
|
-
// Return 402 payment details so the agent can decide to pay
|
|
25
|
-
return {
|
|
26
|
-
content: [
|
|
27
|
-
{
|
|
28
|
-
type: "text",
|
|
29
|
-
text: JSON.stringify(
|
|
30
|
-
{
|
|
31
|
-
status: 402,
|
|
32
|
-
message: "Payment Required (x402)",
|
|
33
|
-
headers: Object.fromEntries(res.headers.entries()),
|
|
34
|
-
body: tryParseJSON(body),
|
|
35
|
-
},
|
|
36
|
-
null,
|
|
37
|
-
2,
|
|
38
|
-
),
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (!res.ok) {
|
|
45
|
-
return {
|
|
46
|
-
content: [
|
|
47
|
-
{
|
|
48
|
-
type: "text",
|
|
49
|
-
text: JSON.stringify(
|
|
50
|
-
{ status: res.status, error: tryParseJSON(body) },
|
|
51
|
-
null,
|
|
52
|
-
2,
|
|
53
|
-
),
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
isError: true,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
content: [
|
|
62
|
-
{
|
|
63
|
-
type: "text",
|
|
64
|
-
text: typeof tryParseJSON(body) === "object"
|
|
65
|
-
? JSON.stringify(tryParseJSON(body), null, 2)
|
|
66
|
-
: body,
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
};
|
|
70
|
-
} catch (err: unknown) {
|
|
71
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
72
|
-
return {
|
|
73
|
-
content: [{ type: "text", text: `Fetch error: ${message}` }],
|
|
74
|
-
isError: true,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function tryParseJSON(text: string): unknown {
|
|
80
|
-
try {
|
|
81
|
-
return JSON.parse(text);
|
|
82
|
-
} catch {
|
|
83
|
-
return text;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function qs(params: Record<string, string | number | undefined>): string {
|
|
88
|
-
const entries = Object.entries(params).filter(
|
|
89
|
-
([, v]) => v !== undefined && v !== null,
|
|
90
|
-
);
|
|
91
|
-
if (entries.length === 0) return "";
|
|
92
|
-
return "?" + entries.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`).join("&");
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
|
-
// 1. web_checker — Check brand/product name availability
|
|
97
|
-
// ---------------------------------------------------------------------------
|
|
98
|
-
server.tool(
|
|
99
|
-
"web_checker",
|
|
100
|
-
"Check brand/product name availability across domains, social media, and package registries",
|
|
101
|
-
{ name: z.string().describe("The brand or product name to check") },
|
|
102
|
-
async ({ name }) => callApi(`https://check.apimesh.xyz/check${qs({ name })}`),
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
// ---------------------------------------------------------------------------
|
|
106
|
-
// 2. http_status_checker — Check HTTP status of a URL
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
server.tool(
|
|
109
|
-
"http_status_checker",
|
|
110
|
-
"Check the HTTP status code of a URL, optionally verifying against an expected status",
|
|
111
|
-
{
|
|
112
|
-
url: z.string().describe("The URL to check"),
|
|
113
|
-
expected: z.number().optional().describe("Expected HTTP status code"),
|
|
114
|
-
},
|
|
115
|
-
async ({ url, expected }) =>
|
|
116
|
-
callApi(
|
|
117
|
-
`https://http-status-checker.apimesh.xyz/check${qs({ url, expected })}`,
|
|
118
|
-
),
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
// ---------------------------------------------------------------------------
|
|
122
|
-
// 3. favicon_checker — Check if a URL has a favicon
|
|
123
|
-
// ---------------------------------------------------------------------------
|
|
124
|
-
server.tool(
|
|
125
|
-
"favicon_checker",
|
|
126
|
-
"Check whether a URL has a favicon and retrieve its details",
|
|
127
|
-
{ url: z.string().describe("The URL to check for a favicon") },
|
|
128
|
-
async ({ url }) =>
|
|
129
|
-
callApi(`https://favicon-checker.apimesh.xyz/check${qs({ url })}`),
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
// 4. microservice_health_check — Check health of multiple service URLs
|
|
134
|
-
// ---------------------------------------------------------------------------
|
|
135
|
-
server.tool(
|
|
136
|
-
"microservice_health_check",
|
|
137
|
-
"Check the health status of multiple service URLs simultaneously",
|
|
138
|
-
{
|
|
139
|
-
services: z
|
|
140
|
-
.array(z.string())
|
|
141
|
-
.describe("Array of service URLs to health-check"),
|
|
142
|
-
},
|
|
143
|
-
async ({ services }) =>
|
|
144
|
-
callApi("https://microservice-health-check.apimesh.xyz/check", {
|
|
145
|
-
method: "POST",
|
|
146
|
-
headers: { "Content-Type": "application/json" },
|
|
147
|
-
body: JSON.stringify({ services }),
|
|
148
|
-
}),
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
// ---------------------------------------------------------------------------
|
|
152
|
-
// 5. status_code_checker — Check URL status code
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
server.tool(
|
|
155
|
-
"status_code_checker",
|
|
156
|
-
"Check the HTTP status code returned by a URL",
|
|
157
|
-
{ url: z.string().describe("The URL to check") },
|
|
158
|
-
async ({ url }) =>
|
|
159
|
-
callApi(`https://status-code-checker.apimesh.xyz/check${qs({ url })}`),
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
// ---------------------------------------------------------------------------
|
|
163
|
-
// 6. regex_builder — Build a regex pattern
|
|
164
|
-
// ---------------------------------------------------------------------------
|
|
165
|
-
server.tool(
|
|
166
|
-
"regex_builder",
|
|
167
|
-
"Build and validate a regular expression pattern with optional flags",
|
|
168
|
-
{
|
|
169
|
-
pattern: z.string().describe("The regex pattern to build"),
|
|
170
|
-
flags: z.string().optional().describe("Regex flags (e.g. 'gi')"),
|
|
171
|
-
},
|
|
172
|
-
async ({ pattern, flags }) =>
|
|
173
|
-
callApi("https://regex-builder.apimesh.xyz/build", {
|
|
174
|
-
method: "POST",
|
|
175
|
-
headers: { "Content-Type": "application/json" },
|
|
176
|
-
body: JSON.stringify({ pattern, flags }),
|
|
177
|
-
}),
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
// ---------------------------------------------------------------------------
|
|
181
|
-
// 7. regex_tester — Test a regex against input
|
|
182
|
-
// ---------------------------------------------------------------------------
|
|
183
|
-
server.tool(
|
|
184
|
-
"regex_tester",
|
|
185
|
-
"Test a regular expression against a string and return matches",
|
|
186
|
-
{
|
|
187
|
-
pattern: z.string().describe("The regex pattern to test"),
|
|
188
|
-
testString: z.string().describe("The string to test against"),
|
|
189
|
-
flags: z.string().optional().describe("Regex flags (e.g. 'gi')"),
|
|
190
|
-
},
|
|
191
|
-
async ({ pattern, testString, flags }) =>
|
|
192
|
-
callApi("https://regex-builder.apimesh.xyz/test", {
|
|
193
|
-
method: "POST",
|
|
194
|
-
headers: { "Content-Type": "application/json" },
|
|
195
|
-
body: JSON.stringify({ pattern, testString, flags }),
|
|
196
|
-
}),
|
|
197
|
-
);
|
|
198
|
-
|
|
199
|
-
// ---------------------------------------------------------------------------
|
|
200
|
-
// 8. user_agent_analyzer — Parse a user-agent string
|
|
201
|
-
// ---------------------------------------------------------------------------
|
|
202
|
-
server.tool(
|
|
203
|
-
"user_agent_analyzer",
|
|
204
|
-
"Parse and analyze a user-agent string to extract browser, OS, and device info",
|
|
205
|
-
{ ua: z.string().describe("The user-agent string to analyze") },
|
|
206
|
-
async ({ ua }) =>
|
|
207
|
-
callApi(
|
|
208
|
-
`https://user-agent-analyzer.apimesh.xyz/analyze${qs({ ua })}`,
|
|
209
|
-
),
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
// ---------------------------------------------------------------------------
|
|
213
|
-
// 9. robots_txt_parser — Analyze robots.txt of a website
|
|
214
|
-
// ---------------------------------------------------------------------------
|
|
215
|
-
server.tool(
|
|
216
|
-
"robots_txt_parser",
|
|
217
|
-
"Fetch and analyze the robots.txt file of a website",
|
|
218
|
-
{ url: z.string().describe("The website URL whose robots.txt to analyze") },
|
|
219
|
-
async ({ url }) =>
|
|
220
|
-
callApi(
|
|
221
|
-
`https://robots-txt-parser.apimesh.xyz/analyze${qs({ url })}`,
|
|
222
|
-
),
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
// ---------------------------------------------------------------------------
|
|
226
|
-
// 10. mock_jwt_generator — Generate a mock JWT for testing
|
|
227
|
-
// ---------------------------------------------------------------------------
|
|
228
|
-
server.tool(
|
|
229
|
-
"mock_jwt_generator",
|
|
230
|
-
"Generate a mock JSON Web Token (JWT) for testing purposes",
|
|
231
|
-
{
|
|
232
|
-
payload: z
|
|
233
|
-
.record(z.unknown())
|
|
234
|
-
.describe("The JWT payload as a JSON object"),
|
|
235
|
-
secret: z.string().describe("The secret key to sign the JWT"),
|
|
236
|
-
expiresInSeconds: z
|
|
237
|
-
.number()
|
|
238
|
-
.optional()
|
|
239
|
-
.describe("Token expiration time in seconds"),
|
|
240
|
-
},
|
|
241
|
-
async ({ payload, secret, expiresInSeconds }) =>
|
|
242
|
-
callApi("https://mock-jwt-generator.apimesh.xyz/generate", {
|
|
243
|
-
method: "POST",
|
|
244
|
-
headers: { "Content-Type": "application/json" },
|
|
245
|
-
body: JSON.stringify({ payload, secret, expiresInSeconds }),
|
|
246
|
-
}),
|
|
247
|
-
);
|
|
248
|
-
|
|
249
|
-
// ---------------------------------------------------------------------------
|
|
250
|
-
// 11. yaml_validator — Validate YAML syntax
|
|
251
|
-
// ---------------------------------------------------------------------------
|
|
252
|
-
server.tool(
|
|
253
|
-
"yaml_validator",
|
|
254
|
-
"Validate YAML syntax and report any errors",
|
|
255
|
-
{ yaml: z.string().describe("The YAML string to validate") },
|
|
256
|
-
async ({ yaml }) =>
|
|
257
|
-
callApi("https://yaml-validator.apimesh.xyz/validate", {
|
|
258
|
-
method: "POST",
|
|
259
|
-
headers: { "Content-Type": "application/json" },
|
|
260
|
-
body: JSON.stringify({ yaml }),
|
|
261
|
-
}),
|
|
262
|
-
);
|
|
263
|
-
|
|
264
|
-
// ---------------------------------------------------------------------------
|
|
265
|
-
// 12. swagger_docs_creator — Generate Swagger documentation
|
|
266
|
-
// ---------------------------------------------------------------------------
|
|
267
|
-
server.tool(
|
|
268
|
-
"swagger_docs_creator",
|
|
269
|
-
"Generate Swagger/OpenAPI documentation for an API endpoint",
|
|
270
|
-
{
|
|
271
|
-
path: z.string().describe("The API path (e.g. '/users/{id}')"),
|
|
272
|
-
method: z
|
|
273
|
-
.string()
|
|
274
|
-
.describe("HTTP method (GET, POST, PUT, DELETE, etc.)"),
|
|
275
|
-
summary: z.string().optional().describe("Short summary of the endpoint"),
|
|
276
|
-
description: z
|
|
277
|
-
.string()
|
|
278
|
-
.optional()
|
|
279
|
-
.describe("Detailed description of the endpoint"),
|
|
280
|
-
},
|
|
281
|
-
async ({ path, method, summary, description }) =>
|
|
282
|
-
callApi("https://swagger-docs-creator.apimesh.xyz/generate", {
|
|
283
|
-
method: "POST",
|
|
284
|
-
headers: { "Content-Type": "application/json" },
|
|
285
|
-
body: JSON.stringify({ path, method, summary, description }),
|
|
286
|
-
}),
|
|
287
|
-
);
|
|
288
|
-
|
|
289
|
-
// ---------------------------------------------------------------------------
|
|
290
|
-
// Start the server on stdio transport
|
|
291
|
-
// ---------------------------------------------------------------------------
|
|
5
|
+
const server = createServer();
|
|
292
6
|
const transport = new StdioServerTransport();
|
|
293
7
|
await server.connect(transport);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mbeato/apimesh-mcp-server",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "MCP server for APIMesh — 12 x402-payable API tools for AI agents.
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "MCP server for APIMesh — 12 curated x402-payable API tools for AI agents. Web vitals, security headers, SEO audit, email security, brand assets, redirect chains, indexability, plus brand availability, HTTP status, favicon, health checks, robots.txt. Pay per call with USDC on Base via x402.",
|
|
5
5
|
"mcpName": "io.github.mbeato/apimesh",
|
|
6
6
|
"main": "index.ts",
|
|
7
7
|
"bin": { "apimesh-mcp": "./index.ts" },
|
package/server.json
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.github.mbeato/apimesh",
|
|
4
|
-
"description": "12 x402-payable API tools for AI agents —
|
|
5
|
-
"repository":
|
|
6
|
-
|
|
4
|
+
"description": "12 curated x402-payable API tools for AI agents — web vitals, security headers, SEO audit, email security, brand assets, redirect chains, indexability, brand availability, HTTP status, favicon, health checks, robots.txt. Pay per call with USDC on Base.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/mbeato/conway",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "1.2.1",
|
|
7
10
|
"packages": [
|
|
8
11
|
{
|
|
9
12
|
"registryType": "npm",
|
|
10
13
|
"identifier": "@mbeato/apimesh-mcp-server",
|
|
11
|
-
"version": "1.
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
+
"version": "1.2.1",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
}
|
|
14
18
|
}
|
|
15
19
|
]
|
|
16
20
|
}
|
package/server.ts
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Helper: make an HTTP request and return a structured MCP tool result.
|
|
6
|
+
// Handles 402 (payment required) by returning the payment details.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
async function callApi(
|
|
9
|
+
url: string,
|
|
10
|
+
options?: RequestInit,
|
|
11
|
+
): Promise<{ content: Array<{ type: "text"; text: string }>; isError?: boolean }> {
|
|
12
|
+
try {
|
|
13
|
+
const res = await fetch(url, options);
|
|
14
|
+
const body = await res.text();
|
|
15
|
+
|
|
16
|
+
if (res.status === 402) {
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{
|
|
20
|
+
type: "text",
|
|
21
|
+
text: JSON.stringify(
|
|
22
|
+
{
|
|
23
|
+
status: 402,
|
|
24
|
+
message: "Payment Required (x402)",
|
|
25
|
+
headers: Object.fromEntries(res.headers.entries()),
|
|
26
|
+
body: tryParseJSON(body),
|
|
27
|
+
},
|
|
28
|
+
null,
|
|
29
|
+
2,
|
|
30
|
+
),
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: JSON.stringify(
|
|
42
|
+
{ status: res.status, error: tryParseJSON(body) },
|
|
43
|
+
null,
|
|
44
|
+
2,
|
|
45
|
+
),
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
isError: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: "text",
|
|
56
|
+
text: typeof tryParseJSON(body) === "object"
|
|
57
|
+
? JSON.stringify(tryParseJSON(body), null, 2)
|
|
58
|
+
: body,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
} catch (err: unknown) {
|
|
63
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: `Fetch error: ${message}` }],
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function tryParseJSON(text: string): unknown {
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(text);
|
|
74
|
+
} catch {
|
|
75
|
+
return text;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function qs(params: Record<string, string | number | undefined>): string {
|
|
80
|
+
const entries = Object.entries(params).filter(
|
|
81
|
+
([, v]) => v !== undefined && v !== null,
|
|
82
|
+
);
|
|
83
|
+
if (entries.length === 0) return "";
|
|
84
|
+
return "?" + entries.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`).join("&");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function createServer(): McpServer {
|
|
88
|
+
const server = new McpServer({
|
|
89
|
+
name: "apimesh",
|
|
90
|
+
version: "1.2.0",
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
server.tool(
|
|
94
|
+
"web_checker",
|
|
95
|
+
"Check if a brand name is available across 5 domain TLDs (.com, .io, .xyz, .dev, .ai), GitHub, npm, PyPI, and Reddit in one call. Free preview: GET https://check.apimesh.xyz/preview?name=... returns .com availability only",
|
|
96
|
+
{ name: z.string().describe("The brand or product name to check") },
|
|
97
|
+
async ({ name }) => callApi(`https://check.apimesh.xyz/check${qs({ name })}`),
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
server.tool(
|
|
101
|
+
"http_status_checker",
|
|
102
|
+
"Check the live HTTP status of any URL, optionally verify against an expected code. Useful for uptime monitoring, redirect validation, and link checking",
|
|
103
|
+
{
|
|
104
|
+
url: z.string().describe("The URL to check"),
|
|
105
|
+
expected: z.number().optional().describe("Expected HTTP status code"),
|
|
106
|
+
},
|
|
107
|
+
async ({ url, expected }) =>
|
|
108
|
+
callApi(`https://http-status-checker.apimesh.xyz/check${qs({ url, expected })}`),
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
server.tool(
|
|
112
|
+
"favicon_checker",
|
|
113
|
+
"Check whether a website has a favicon and get its URL, format, and status. Useful for link previews and site branding validation",
|
|
114
|
+
{ url: z.string().describe("The URL to check for a favicon") },
|
|
115
|
+
async ({ url }) =>
|
|
116
|
+
callApi(`https://favicon-checker.apimesh.xyz/check${qs({ url })}`),
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
server.tool(
|
|
120
|
+
"microservice_health_check",
|
|
121
|
+
"Check health and response times of up to 10 service URLs in parallel. Free preview: GET https://microservice-health-check.apimesh.xyz/preview?url=... checks 1 service for free",
|
|
122
|
+
{
|
|
123
|
+
services: z.array(z.string()).describe("Array of service URLs to health-check"),
|
|
124
|
+
},
|
|
125
|
+
async ({ services }) =>
|
|
126
|
+
callApi("https://microservice-health-check.apimesh.xyz/check", {
|
|
127
|
+
method: "POST",
|
|
128
|
+
headers: { "Content-Type": "application/json" },
|
|
129
|
+
body: JSON.stringify({ services }),
|
|
130
|
+
}),
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
server.tool(
|
|
134
|
+
"robots_txt_parser",
|
|
135
|
+
"Fetch and parse a website's robots.txt into structured rules, sitemaps, and crawl directives",
|
|
136
|
+
{ url: z.string().describe("The website URL whose robots.txt to parse") },
|
|
137
|
+
async ({ url }) =>
|
|
138
|
+
callApi(`https://robots-txt-parser.apimesh.xyz/analyze${qs({ url })}`),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
server.tool(
|
|
142
|
+
"core_web_vitals",
|
|
143
|
+
"Get Core Web Vitals and Lighthouse performance scores for any URL. Returns LCP, CLS, INP field data plus performance, accessibility, best-practices, and SEO scores. Free preview: GET https://core-web-vitals.apimesh.xyz/preview?url=... returns performance score only",
|
|
144
|
+
{ url: z.string().describe("The URL to analyze") },
|
|
145
|
+
async ({ url }) =>
|
|
146
|
+
callApi(`https://core-web-vitals.apimesh.xyz/check${qs({ url })}`),
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
server.tool(
|
|
150
|
+
"security_headers",
|
|
151
|
+
"Audit HTTP security headers for any URL. Checks 10 headers (CSP, HSTS, X-Frame-Options, etc.) with weighted grading A+ through F and remediation suggestions. Free preview: GET https://security-headers.apimesh.xyz/preview?url=... checks 3 key headers for free",
|
|
152
|
+
{ url: z.string().describe("The URL to audit") },
|
|
153
|
+
async ({ url }) =>
|
|
154
|
+
callApi(`https://security-headers.apimesh.xyz/check${qs({ url })}`),
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
server.tool(
|
|
158
|
+
"redirect_chain",
|
|
159
|
+
"Trace the full redirect chain for any URL. Returns each hop with status code, location, and latency. Detects loops and extracts the final canonical URL. Free preview: GET https://redirect-chain.apimesh.xyz/preview?url=... traces up to 5 hops for free",
|
|
160
|
+
{ url: z.string().describe("The URL to trace") },
|
|
161
|
+
async ({ url }) =>
|
|
162
|
+
callApi(`https://redirect-chain.apimesh.xyz/check${qs({ url })}`),
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
server.tool(
|
|
166
|
+
"email_security",
|
|
167
|
+
"Check email security configuration for any domain. Analyzes SPF, DMARC, DKIM (probes 10 common selectors), and MX records with provider detection. Free preview: GET https://email-security.apimesh.xyz/preview?domain=... checks SPF and DMARC for free",
|
|
168
|
+
{ domain: z.string().describe("The domain to check (e.g. example.com)") },
|
|
169
|
+
async ({ domain }) =>
|
|
170
|
+
callApi(`https://email-security.apimesh.xyz/check${qs({ domain })}`),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
server.tool(
|
|
174
|
+
"seo_audit",
|
|
175
|
+
"Run a comprehensive on-page SEO audit on any URL. Analyzes title, meta description, headings, images, links, content, canonical, OG tags, JSON-LD, and robots directives with a 0-100 score. Free preview: GET https://seo-audit.apimesh.xyz/preview?url=... returns title, meta, H1, and score for free",
|
|
176
|
+
{ url: z.string().describe("The URL to audit") },
|
|
177
|
+
async ({ url }) =>
|
|
178
|
+
callApi(`https://seo-audit.apimesh.xyz/check${qs({ url })}`),
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
server.tool(
|
|
182
|
+
"indexability_checker",
|
|
183
|
+
"Check if a URL is indexable by search engines. Performs 5-layer analysis: robots.txt rules, HTTP status, meta robots, X-Robots-Tag, and canonical tag. Free preview: GET https://indexability.apimesh.xyz/preview?url=... checks HTTP status and meta robots for free",
|
|
184
|
+
{ url: z.string().describe("The URL to check") },
|
|
185
|
+
async ({ url }) =>
|
|
186
|
+
callApi(`https://indexability.apimesh.xyz/check${qs({ url })}`),
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
server.tool(
|
|
190
|
+
"brand_assets",
|
|
191
|
+
"Extract brand assets from any domain. Returns logo URL, favicon, theme colors, OG image, and site name. Free preview: GET https://brand-assets.apimesh.xyz/preview?domain=... returns Google favicon URL for free",
|
|
192
|
+
{ domain: z.string().describe("The domain to extract assets from (e.g. example.com)") },
|
|
193
|
+
async ({ domain }) =>
|
|
194
|
+
callApi(`https://brand-assets.apimesh.xyz/check${qs({ domain })}`),
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
return server;
|
|
198
|
+
}
|
package/bun.lock
DELETED
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"lockfileVersion": 1,
|
|
3
|
-
"configVersion": 1,
|
|
4
|
-
"workspaces": {
|
|
5
|
-
"": {
|
|
6
|
-
"name": "@apimesh/mcp-server",
|
|
7
|
-
"dependencies": {
|
|
8
|
-
"@modelcontextprotocol/sdk": "latest",
|
|
9
|
-
},
|
|
10
|
-
},
|
|
11
|
-
},
|
|
12
|
-
"packages": {
|
|
13
|
-
"@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="],
|
|
14
|
-
|
|
15
|
-
"@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.27.1", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA=="],
|
|
16
|
-
|
|
17
|
-
"accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
|
|
18
|
-
|
|
19
|
-
"ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
|
|
20
|
-
|
|
21
|
-
"ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
|
|
22
|
-
|
|
23
|
-
"body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
|
|
24
|
-
|
|
25
|
-
"bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
|
|
26
|
-
|
|
27
|
-
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
|
|
28
|
-
|
|
29
|
-
"call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
|
|
30
|
-
|
|
31
|
-
"content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
|
|
32
|
-
|
|
33
|
-
"content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
|
|
34
|
-
|
|
35
|
-
"cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
|
|
36
|
-
|
|
37
|
-
"cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
|
|
38
|
-
|
|
39
|
-
"cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
|
|
40
|
-
|
|
41
|
-
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
|
42
|
-
|
|
43
|
-
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
|
44
|
-
|
|
45
|
-
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
|
46
|
-
|
|
47
|
-
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
|
48
|
-
|
|
49
|
-
"ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
|
|
50
|
-
|
|
51
|
-
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
|
|
52
|
-
|
|
53
|
-
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
|
|
54
|
-
|
|
55
|
-
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
|
|
56
|
-
|
|
57
|
-
"es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
|
|
58
|
-
|
|
59
|
-
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
|
|
60
|
-
|
|
61
|
-
"etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
|
|
62
|
-
|
|
63
|
-
"eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
|
|
64
|
-
|
|
65
|
-
"eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
|
|
66
|
-
|
|
67
|
-
"express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
|
|
68
|
-
|
|
69
|
-
"express-rate-limit": ["express-rate-limit@8.2.1", "", { "dependencies": { "ip-address": "10.0.1" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g=="],
|
|
70
|
-
|
|
71
|
-
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
|
|
72
|
-
|
|
73
|
-
"fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
|
|
74
|
-
|
|
75
|
-
"finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
|
|
76
|
-
|
|
77
|
-
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
|
|
78
|
-
|
|
79
|
-
"fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
|
|
80
|
-
|
|
81
|
-
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
|
82
|
-
|
|
83
|
-
"get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
|
|
84
|
-
|
|
85
|
-
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
|
|
86
|
-
|
|
87
|
-
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
|
|
88
|
-
|
|
89
|
-
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
|
|
90
|
-
|
|
91
|
-
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
|
92
|
-
|
|
93
|
-
"hono": ["hono@4.12.3", "", {}, "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg=="],
|
|
94
|
-
|
|
95
|
-
"http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
|
|
96
|
-
|
|
97
|
-
"iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
|
|
98
|
-
|
|
99
|
-
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
|
|
100
|
-
|
|
101
|
-
"ip-address": ["ip-address@10.0.1", "", {}, "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA=="],
|
|
102
|
-
|
|
103
|
-
"ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
|
|
104
|
-
|
|
105
|
-
"is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
|
|
106
|
-
|
|
107
|
-
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
|
108
|
-
|
|
109
|
-
"jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
|
|
110
|
-
|
|
111
|
-
"json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
|
|
112
|
-
|
|
113
|
-
"json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="],
|
|
114
|
-
|
|
115
|
-
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
|
|
116
|
-
|
|
117
|
-
"media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
|
|
118
|
-
|
|
119
|
-
"merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
|
|
120
|
-
|
|
121
|
-
"mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
|
|
122
|
-
|
|
123
|
-
"mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
|
|
124
|
-
|
|
125
|
-
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
|
126
|
-
|
|
127
|
-
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
|
|
128
|
-
|
|
129
|
-
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
|
|
130
|
-
|
|
131
|
-
"object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
|
|
132
|
-
|
|
133
|
-
"on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
|
|
134
|
-
|
|
135
|
-
"once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
|
|
136
|
-
|
|
137
|
-
"parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
|
|
138
|
-
|
|
139
|
-
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
|
140
|
-
|
|
141
|
-
"path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
|
|
142
|
-
|
|
143
|
-
"pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
|
|
144
|
-
|
|
145
|
-
"proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
|
|
146
|
-
|
|
147
|
-
"qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="],
|
|
148
|
-
|
|
149
|
-
"range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
|
|
150
|
-
|
|
151
|
-
"raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
|
|
152
|
-
|
|
153
|
-
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
|
|
154
|
-
|
|
155
|
-
"router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
|
|
156
|
-
|
|
157
|
-
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
|
158
|
-
|
|
159
|
-
"send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
|
|
160
|
-
|
|
161
|
-
"serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
|
|
162
|
-
|
|
163
|
-
"setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
|
|
164
|
-
|
|
165
|
-
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
|
166
|
-
|
|
167
|
-
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
|
168
|
-
|
|
169
|
-
"side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
|
|
170
|
-
|
|
171
|
-
"side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
|
|
172
|
-
|
|
173
|
-
"side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
|
|
174
|
-
|
|
175
|
-
"side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
|
|
176
|
-
|
|
177
|
-
"statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
|
|
178
|
-
|
|
179
|
-
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
|
|
180
|
-
|
|
181
|
-
"type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
|
|
182
|
-
|
|
183
|
-
"unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
|
|
184
|
-
|
|
185
|
-
"vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
|
|
186
|
-
|
|
187
|
-
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
|
188
|
-
|
|
189
|
-
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
|
190
|
-
|
|
191
|
-
"zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
|
|
192
|
-
|
|
193
|
-
"zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
|
|
194
|
-
}
|
|
195
|
-
}
|