@bbradar/mcp 0.1.3
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/README.md +156 -0
- package/dist/bbradarClient.d.ts +61 -0
- package/dist/bbradarClient.js +307 -0
- package/dist/bbradarClient.js.map +1 -0
- package/dist/cache.d.ts +26 -0
- package/dist/cache.js +60 -0
- package/dist/cache.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +4 -0
- package/dist/json.js +21 -0
- package/dist/json.js.map +1 -0
- package/dist/rateLimit.d.ts +11 -0
- package/dist/rateLimit.js +29 -0
- package/dist/rateLimit.js.map +1 -0
- package/dist/sanitize.d.ts +11 -0
- package/dist/sanitize.js +202 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.js +4418 -0
- package/dist/server.js.map +1 -0
- package/dist/url.d.ts +1 -0
- package/dist/url.js +21 -0
- package/dist/url.js.map +1 -0
- package/package.json +55 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const DEFAULT_API_BASE_URL = "https://bbradar.io/api/v1";
|
|
2
|
+
const DEFAULT_WEB_BASE_URL = "https://bbradar.io";
|
|
3
|
+
export function loadConfig(env = process.env) {
|
|
4
|
+
const apiKey = env.BBRADAR_API_KEY?.trim();
|
|
5
|
+
if (!apiKey) {
|
|
6
|
+
throw new Error("BBRADAR_API_KEY is required.");
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
apiKey,
|
|
10
|
+
apiBaseUrl: normalizeBaseUrl(env.BBRADAR_API_BASE_URL ?? DEFAULT_API_BASE_URL),
|
|
11
|
+
webBaseUrl: normalizeBaseUrl(env.BBRADAR_WEB_BASE_URL ?? DEFAULT_WEB_BASE_URL),
|
|
12
|
+
cacheTtlMs: readNonNegativeInteger(env.BBRADAR_MCP_CACHE_TTL_SECONDS, 30) * 1000,
|
|
13
|
+
cacheMaxEntries: readPositiveInteger(env.BBRADAR_MCP_CACHE_MAX_ENTRIES, 500),
|
|
14
|
+
defaultRateLimitPerMinute: readPositiveInteger(env.BBRADAR_MCP_RATE_LIMIT_PER_MINUTE, 60),
|
|
15
|
+
exportRateLimitPerMinute: readPositiveInteger(env.BBRADAR_MCP_EXPORT_RATE_LIMIT_PER_MINUTE, 15),
|
|
16
|
+
requestTimeoutMs: readPositiveInteger(env.BBRADAR_MCP_REQUEST_TIMEOUT_SECONDS, 30) * 1000,
|
|
17
|
+
validateOnStartup: readBoolean(env.BBRADAR_MCP_VALIDATE_ON_STARTUP, false)
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function normalizeBaseUrl(value) {
|
|
21
|
+
const trimmed = value.trim();
|
|
22
|
+
if (!trimmed) {
|
|
23
|
+
throw new Error("Base URL cannot be empty.");
|
|
24
|
+
}
|
|
25
|
+
return trimmed.replace(/\/+$/, "");
|
|
26
|
+
}
|
|
27
|
+
function readPositiveInteger(value, fallback) {
|
|
28
|
+
if (!value) {
|
|
29
|
+
return fallback;
|
|
30
|
+
}
|
|
31
|
+
const parsed = Number.parseInt(value, 10);
|
|
32
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
33
|
+
return fallback;
|
|
34
|
+
}
|
|
35
|
+
return parsed;
|
|
36
|
+
}
|
|
37
|
+
function readNonNegativeInteger(value, fallback) {
|
|
38
|
+
if (!value) {
|
|
39
|
+
return fallback;
|
|
40
|
+
}
|
|
41
|
+
const parsed = Number.parseInt(value, 10);
|
|
42
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
43
|
+
return fallback;
|
|
44
|
+
}
|
|
45
|
+
return parsed;
|
|
46
|
+
}
|
|
47
|
+
function readBoolean(value, fallback) {
|
|
48
|
+
if (!value) {
|
|
49
|
+
return fallback;
|
|
50
|
+
}
|
|
51
|
+
const normalized = value.trim().toLowerCase();
|
|
52
|
+
if (["1", "true", "yes", "on"].includes(normalized)) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
if (["0", "false", "no", "off"].includes(normalized)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return fallback;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { BBRadarClient } from "./bbradarClient.js";
|
|
4
|
+
import { loadConfig } from "./config.js";
|
|
5
|
+
import { createBbradarServer } from "./server.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
const client = new BBRadarClient(config);
|
|
9
|
+
if (config.validateOnStartup) {
|
|
10
|
+
await client.validateKey();
|
|
11
|
+
}
|
|
12
|
+
const server = createBbradarServer(client, config);
|
|
13
|
+
const transport = new StdioServerTransport();
|
|
14
|
+
await server.connect(transport);
|
|
15
|
+
}
|
|
16
|
+
main().catch((error) => {
|
|
17
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
18
|
+
console.error(`[bbradar-mcp] ${message}`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/json.d.ts
ADDED
package/dist/json.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function isJsonObject(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
export function stableStringify(value) {
|
|
5
|
+
return JSON.stringify(sortJson(value));
|
|
6
|
+
}
|
|
7
|
+
export function stripUndefined(value) {
|
|
8
|
+
return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
|
|
9
|
+
}
|
|
10
|
+
function sortJson(value) {
|
|
11
|
+
if (Array.isArray(value)) {
|
|
12
|
+
return value.map(sortJson);
|
|
13
|
+
}
|
|
14
|
+
if (!isJsonObject(value)) {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
return Object.fromEntries(Object.keys(value)
|
|
18
|
+
.sort()
|
|
19
|
+
.map((key) => [key, sortJson(value[key])]));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=json.js.map
|
package/dist/json.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACf,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type RateLimitDecision = {
|
|
2
|
+
allowed: boolean;
|
|
3
|
+
remaining: number;
|
|
4
|
+
resetAt: string;
|
|
5
|
+
};
|
|
6
|
+
export declare class FixedWindowRateLimiter {
|
|
7
|
+
private readonly windowMs;
|
|
8
|
+
private readonly buckets;
|
|
9
|
+
constructor(windowMs?: number);
|
|
10
|
+
consume(key: string, limit: number): RateLimitDecision;
|
|
11
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class FixedWindowRateLimiter {
|
|
2
|
+
windowMs;
|
|
3
|
+
buckets = new Map();
|
|
4
|
+
constructor(windowMs = 60_000) {
|
|
5
|
+
this.windowMs = windowMs;
|
|
6
|
+
}
|
|
7
|
+
consume(key, limit) {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
const existing = this.buckets.get(key);
|
|
10
|
+
const bucket = existing && now - existing.windowStart < this.windowMs
|
|
11
|
+
? existing
|
|
12
|
+
: { count: 0, windowStart: now };
|
|
13
|
+
if (bucket.count >= limit) {
|
|
14
|
+
return {
|
|
15
|
+
allowed: false,
|
|
16
|
+
remaining: 0,
|
|
17
|
+
resetAt: new Date(bucket.windowStart + this.windowMs).toISOString()
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
bucket.count += 1;
|
|
21
|
+
this.buckets.set(key, bucket);
|
|
22
|
+
return {
|
|
23
|
+
allowed: true,
|
|
24
|
+
remaining: Math.max(limit - bucket.count, 0),
|
|
25
|
+
resetAt: new Date(bucket.windowStart + this.windowMs).toISOString()
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=rateLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../src/rateLimit.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,sBAAsB;IAGJ;IAFZ,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,YAA6B,WAAW,MAAM;QAAjB,aAAQ,GAAR,QAAQ,CAAS;IAAG,CAAC;IAElD,OAAO,CAAC,GAAW,EAAE,KAAa;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,MAAM,GACV,QAAQ,IAAI,GAAG,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;YACpD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;QAErC,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;aACpE,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE9B,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;SACpE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type JsonObject } from "./json.js";
|
|
2
|
+
export declare function sanitizeProgram(value: unknown, webBaseUrl: string): JsonObject;
|
|
3
|
+
export declare function sanitizeTarget(value: unknown): JsonObject;
|
|
4
|
+
export declare function sanitizeChange(value: unknown, webBaseUrl: string): JsonObject;
|
|
5
|
+
export declare function sanitizeTargetsForExport(value: unknown, limit: number): unknown;
|
|
6
|
+
export declare function readObject(value: unknown): JsonObject | undefined;
|
|
7
|
+
export declare function readArray(value: unknown): unknown[];
|
|
8
|
+
export declare function readString(value: unknown): string | undefined;
|
|
9
|
+
export declare function readNumber(value: unknown): number | undefined;
|
|
10
|
+
export declare function readBoolean(value: unknown): boolean | undefined;
|
|
11
|
+
export declare function sanitizeJson(value: unknown, depth?: number): unknown;
|
package/dist/sanitize.js
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { isJsonObject, stripUndefined } from "./json.js";
|
|
2
|
+
const MAX_SANITIZED_STRING_LENGTH = 2_000;
|
|
3
|
+
const MAX_SANITIZED_ARRAY_LENGTH = 50;
|
|
4
|
+
const MAX_SANITIZED_OBJECT_KEYS = 50;
|
|
5
|
+
const MAX_SANITIZED_DEPTH = 4;
|
|
6
|
+
const MAX_SANITIZED_KEY_LENGTH = 128;
|
|
7
|
+
const CONTROL_CHARS = /[\u0000-\u001F\u007F]/g;
|
|
8
|
+
export function sanitizeProgram(value, webBaseUrl) {
|
|
9
|
+
if (!isJsonObject(value)) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
const id = readString(value.id);
|
|
13
|
+
const extraData = readObject(value.extra_data);
|
|
14
|
+
const reportCount = readNumber(value.report_count) ?? readNumber(extraData?.report_count);
|
|
15
|
+
const reportCountLabel = readString(extraData?.report_count_label);
|
|
16
|
+
const bountyMin = readNumber(value.bounty_min);
|
|
17
|
+
const bountyMax = readNumber(value.bounty_max);
|
|
18
|
+
const scopeTags = readStringArray(value.scope_tags);
|
|
19
|
+
return stripUndefined({
|
|
20
|
+
id,
|
|
21
|
+
handle: readString(value.handle),
|
|
22
|
+
name: readString(value.name),
|
|
23
|
+
platform: readString(value.platform),
|
|
24
|
+
platform_url: readString(value.link),
|
|
25
|
+
bbradar_url: id ? `${webBaseUrl}/programs/${encodeURIComponent(id)}` : undefined,
|
|
26
|
+
opportunity_tag: sanitizeOpportunityTag(value.opportunity_tag),
|
|
27
|
+
reward_range: bountyMin === undefined && bountyMax === undefined ? undefined : { min: bountyMin, max: bountyMax },
|
|
28
|
+
public_report_count: reportCount,
|
|
29
|
+
public_report_count_label: reportCountLabel,
|
|
30
|
+
first_seen_date: readString(value.added_at) ?? readString(value.date_launched),
|
|
31
|
+
date_launched: readString(value.date_launched),
|
|
32
|
+
last_updated: readString(value.last_updated),
|
|
33
|
+
targets_updated_at: readString(value.targets_updated_at),
|
|
34
|
+
scope_summary: stripUndefined({
|
|
35
|
+
tags: scopeTags.length > 0 ? scopeTags : undefined,
|
|
36
|
+
target_counts: sanitizeTargetCounts(value.target_counts),
|
|
37
|
+
target_activity: sanitizeTargetActivity(value.target_activity)
|
|
38
|
+
})
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function sanitizeTarget(value) {
|
|
42
|
+
if (!isJsonObject(value)) {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
return stripUndefined({
|
|
46
|
+
target_type: readString(value.target_type) ?? readString(value.type),
|
|
47
|
+
identifier: readString(value.identifier),
|
|
48
|
+
display_name: readString(value.display_name),
|
|
49
|
+
normalized_identifier: readString(value.normalized_identifier),
|
|
50
|
+
scope_tags: readStringArrayOrUndefined(value.scope_tags),
|
|
51
|
+
language_tags: readStringArrayOrUndefined(value.language_tags),
|
|
52
|
+
in_scope: readBoolean(value.in_scope),
|
|
53
|
+
eligible_for_bounty: readBoolean(value.eligible_for_bounty),
|
|
54
|
+
severity_score: readNumber(value.severity_score),
|
|
55
|
+
severity_label: readString(value.severity_label),
|
|
56
|
+
source_url: readString(value.source_url),
|
|
57
|
+
added_at: readString(value.added_at),
|
|
58
|
+
source_added_at: readString(value.source_added_at),
|
|
59
|
+
last_seen: readString(value.last_seen),
|
|
60
|
+
last_change_type: readString(value.last_change_type),
|
|
61
|
+
last_changed_at: readString(value.last_changed_at),
|
|
62
|
+
is_active: readBoolean(value.is_active),
|
|
63
|
+
wildcard: readBoolean(value.wildcard),
|
|
64
|
+
metadata: sanitizeJson(value.metadata)
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function sanitizeChange(value, webBaseUrl) {
|
|
68
|
+
if (!isJsonObject(value)) {
|
|
69
|
+
return {};
|
|
70
|
+
}
|
|
71
|
+
return stripUndefined({
|
|
72
|
+
id: readNumber(value.id) ?? readString(value.id),
|
|
73
|
+
change_type: readString(value.change_type),
|
|
74
|
+
changed_at: readString(value.changed_at),
|
|
75
|
+
program: sanitizeProgram(value.program, webBaseUrl),
|
|
76
|
+
target: sanitizeTarget(value.target),
|
|
77
|
+
metadata: sanitizeJson(value.metadata),
|
|
78
|
+
diff: sanitizeJson(value.diff)
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export function sanitizeTargetsForExport(value, limit) {
|
|
82
|
+
if (typeof value === "string" || value === null) {
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
return value.slice(0, limit).map(sanitizeTarget);
|
|
87
|
+
}
|
|
88
|
+
if (!isJsonObject(value)) {
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
const targets = Array.isArray(value.targets) ? value.targets.slice(0, limit).map(sanitizeTarget) : undefined;
|
|
92
|
+
return stripUndefined({
|
|
93
|
+
targets,
|
|
94
|
+
meta: sanitizeJson(value.meta),
|
|
95
|
+
format: readString(value.format),
|
|
96
|
+
total: readNumber(value.total),
|
|
97
|
+
generated_at: readString(value.generated_at)
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
export function readObject(value) {
|
|
101
|
+
return isJsonObject(value) ? value : undefined;
|
|
102
|
+
}
|
|
103
|
+
export function readArray(value) {
|
|
104
|
+
return Array.isArray(value) ? value : [];
|
|
105
|
+
}
|
|
106
|
+
export function readString(value) {
|
|
107
|
+
if (typeof value !== "string") {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const sanitized = sanitizeString(value);
|
|
111
|
+
return sanitized.length > 0 ? sanitized : undefined;
|
|
112
|
+
}
|
|
113
|
+
export function readNumber(value) {
|
|
114
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
115
|
+
}
|
|
116
|
+
export function readBoolean(value) {
|
|
117
|
+
return typeof value === "boolean" ? value : undefined;
|
|
118
|
+
}
|
|
119
|
+
export function sanitizeJson(value, depth = 0) {
|
|
120
|
+
if (depth > MAX_SANITIZED_DEPTH) {
|
|
121
|
+
return "[truncated]";
|
|
122
|
+
}
|
|
123
|
+
if (typeof value === "string") {
|
|
124
|
+
return sanitizeString(value);
|
|
125
|
+
}
|
|
126
|
+
if (typeof value === "number") {
|
|
127
|
+
return Number.isFinite(value) ? value : undefined;
|
|
128
|
+
}
|
|
129
|
+
if (typeof value === "boolean" || value === null) {
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
if (Array.isArray(value)) {
|
|
133
|
+
return value.slice(0, MAX_SANITIZED_ARRAY_LENGTH).map((entry) => sanitizeJson(entry, depth + 1));
|
|
134
|
+
}
|
|
135
|
+
if (isJsonObject(value)) {
|
|
136
|
+
const entries = [];
|
|
137
|
+
for (const [key, entry] of Object.entries(value).slice(0, MAX_SANITIZED_OBJECT_KEYS)) {
|
|
138
|
+
const sanitizedKey = sanitizeString(key).slice(0, MAX_SANITIZED_KEY_LENGTH);
|
|
139
|
+
const sanitizedEntry = sanitizeJson(entry, depth + 1);
|
|
140
|
+
if (sanitizedKey.length > 0 && sanitizedEntry !== undefined) {
|
|
141
|
+
entries.push([sanitizedKey, sanitizedEntry]);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return Object.fromEntries(entries);
|
|
145
|
+
}
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
function readStringArray(value) {
|
|
149
|
+
return Array.isArray(value)
|
|
150
|
+
? value.map(readString).filter((entry) => entry !== undefined)
|
|
151
|
+
: [];
|
|
152
|
+
}
|
|
153
|
+
function readStringArrayOrUndefined(value) {
|
|
154
|
+
const entries = readStringArray(value);
|
|
155
|
+
return entries.length > 0 ? entries : undefined;
|
|
156
|
+
}
|
|
157
|
+
function sanitizeOpportunityTag(value) {
|
|
158
|
+
if (!isJsonObject(value)) {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
return stripUndefined({
|
|
162
|
+
tier: readString(value.tier),
|
|
163
|
+
label: readString(value.label),
|
|
164
|
+
description: readString(value.description),
|
|
165
|
+
reason: readString(value.reason),
|
|
166
|
+
opportunity_score: readNumber(value.opportunity_score),
|
|
167
|
+
freshness: readNumber(value.freshness),
|
|
168
|
+
competition: readNumber(value.competition),
|
|
169
|
+
reward: readNumber(value.reward),
|
|
170
|
+
scope_bonus: readNumber(value.scope_bonus),
|
|
171
|
+
signal_count: readNumber(value.signal_count),
|
|
172
|
+
is_vdp: readBoolean(value.is_vdp)
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function sanitizeTargetCounts(value) {
|
|
176
|
+
if (!isJsonObject(value)) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
return stripUndefined({
|
|
180
|
+
total: readNumber(value.total),
|
|
181
|
+
in_scope: readNumber(value.in_scope),
|
|
182
|
+
out_of_scope: readNumber(value.out_of_scope),
|
|
183
|
+
eligible_for_bounty: readNumber(value.eligible_for_bounty),
|
|
184
|
+
wildcard: readNumber(value.wildcard)
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function sanitizeTargetActivity(value) {
|
|
188
|
+
if (!isJsonObject(value)) {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
return stripUndefined({
|
|
192
|
+
latest_change_at: readString(value.latest_change_at),
|
|
193
|
+
latest_added_at: readString(value.latest_added_at),
|
|
194
|
+
added_24h: readNumber(value.added_24h),
|
|
195
|
+
added_7d: readNumber(value.added_7d),
|
|
196
|
+
removed_7d: readNumber(value.removed_7d)
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
function sanitizeString(value) {
|
|
200
|
+
return value.replace(CONTROL_CHARS, " ").trim().slice(0, MAX_SANITIZED_STRING_LENGTH);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { BBRadarClient } from "./bbradarClient.js";
|
|
3
|
+
import type { ServerConfig } from "./config.js";
|
|
4
|
+
export declare function createBbradarServer(client: BBRadarClient, config: ServerConfig): McpServer;
|