@blacksandscyber/mcp-server-bursar 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +230 -0
  2. package/build/config.d.ts +45 -0
  3. package/build/config.js +177 -0
  4. package/build/http-transport.d.ts +16 -0
  5. package/build/http-transport.js +191 -0
  6. package/build/index.d.ts +16 -0
  7. package/build/index.js +31 -0
  8. package/build/server.d.ts +41 -0
  9. package/build/server.js +902 -0
  10. package/build/shared/errors.d.ts +50 -0
  11. package/build/shared/errors.js +69 -0
  12. package/build/shared/linkBuilder.d.ts +93 -0
  13. package/build/shared/linkBuilder.js +148 -0
  14. package/build/shared/logger.d.ts +10 -0
  15. package/build/shared/logger.js +28 -0
  16. package/build/shield/bootRole.d.ts +60 -0
  17. package/build/shield/bootRole.js +145 -0
  18. package/build/shield/client.d.ts +265 -0
  19. package/build/shield/client.js +656 -0
  20. package/build/shield/deploy/index.d.ts +69 -0
  21. package/build/shield/deploy/index.js +569 -0
  22. package/build/shield/discovery/dataStoreDetector.d.ts +3 -0
  23. package/build/shield/discovery/dataStoreDetector.js +125 -0
  24. package/build/shield/discovery/dockerScanner.d.ts +34 -0
  25. package/build/shield/discovery/dockerScanner.js +543 -0
  26. package/build/shield/discovery/endpointScanner.d.ts +3 -0
  27. package/build/shield/discovery/endpointScanner.js +306 -0
  28. package/build/shield/discovery/environmentScanner.d.ts +86 -0
  29. package/build/shield/discovery/environmentScanner.js +545 -0
  30. package/build/shield/discovery/externalServiceDetector.d.ts +3 -0
  31. package/build/shield/discovery/externalServiceDetector.js +98 -0
  32. package/build/shield/discovery/frameworkDetector.d.ts +3 -0
  33. package/build/shield/discovery/frameworkDetector.js +114 -0
  34. package/build/shield/discovery/manifestGenerator.d.ts +12 -0
  35. package/build/shield/discovery/manifestGenerator.js +124 -0
  36. package/build/shield/discovery/piiDetector.d.ts +5 -0
  37. package/build/shield/discovery/piiDetector.js +203 -0
  38. package/build/shield/discovery/severity.d.ts +47 -0
  39. package/build/shield/discovery/severity.js +138 -0
  40. package/build/shield/discovery/topologyNormalizer.d.ts +109 -0
  41. package/build/shield/discovery/topologyNormalizer.js +416 -0
  42. package/build/shield/identity.d.ts +53 -0
  43. package/build/shield/identity.js +70 -0
  44. package/build/shield/install/configMerge.d.ts +91 -0
  45. package/build/shield/install/configMerge.js +324 -0
  46. package/build/shield/install/keystore.d.ts +25 -0
  47. package/build/shield/install/keystore.js +156 -0
  48. package/build/shield/install/orchestrator.d.ts +33 -0
  49. package/build/shield/install/orchestrator.js +404 -0
  50. package/build/shield/install/transports/awsSsm.d.ts +43 -0
  51. package/build/shield/install/transports/awsSsm.js +378 -0
  52. package/build/shield/install/transports/bootstrapToken.d.ts +39 -0
  53. package/build/shield/install/transports/bootstrapToken.js +117 -0
  54. package/build/shield/install/transports/ssh.d.ts +50 -0
  55. package/build/shield/install/transports/ssh.js +569 -0
  56. package/build/shield/install/types.d.ts +139 -0
  57. package/build/shield/install/types.js +10 -0
  58. package/build/shield/protocol-walkthrough.d.ts +65 -0
  59. package/build/shield/protocol-walkthrough.js +392 -0
  60. package/build/shield/provision/appProvisioner.d.ts +15 -0
  61. package/build/shield/provision/appProvisioner.js +25 -0
  62. package/build/shield/types.d.ts +261 -0
  63. package/build/shield/types.js +4 -0
  64. package/build/shield/verify/postureReporter.d.ts +4 -0
  65. package/build/shield/verify/postureReporter.js +31 -0
  66. package/dxt/blacksands-ca.crt +67 -0
  67. package/dxt/scripts/setup.js +520 -0
  68. package/package.json +76 -0
@@ -0,0 +1,261 @@
1
+ /** Type definitions for Shield API resources and discovery results. */
2
+ export interface Organization {
3
+ id: string;
4
+ name: string;
5
+ plan: string;
6
+ createdAt: string;
7
+ updatedAt: string;
8
+ }
9
+ export interface App {
10
+ id: string;
11
+ orgId: string;
12
+ name: string;
13
+ status: "active" | "provisioning" | "locked" | "suspended";
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ }
17
+ export interface Certificate {
18
+ id: string;
19
+ appId: string;
20
+ type: "mtls" | "server" | "client";
21
+ fingerprint: string;
22
+ expiresAt: string;
23
+ issuedAt: string;
24
+ status: "active" | "revoked" | "expired";
25
+ }
26
+ export interface Endpoint {
27
+ id: string;
28
+ appId: string;
29
+ host: string;
30
+ port: number;
31
+ protocol: "tcp" | "udp" | "http" | "https";
32
+ status: "active" | "inactive";
33
+ }
34
+ export interface Policy {
35
+ id: string;
36
+ appId: string;
37
+ name: string;
38
+ type: "network" | "dns" | "access" | "compliance";
39
+ rules: PolicyRule[];
40
+ enabled: boolean;
41
+ }
42
+ export interface PolicyRule {
43
+ action: "allow" | "deny" | "log";
44
+ target: string;
45
+ conditions?: Record<string, unknown>;
46
+ }
47
+ export interface Manifest {
48
+ id: string;
49
+ orgId: string;
50
+ appName: string;
51
+ services: ManifestService[];
52
+ status: "pending" | "validated" | "provisioned" | "failed";
53
+ createdAt: string;
54
+ }
55
+ export interface ManifestService {
56
+ name: string;
57
+ port: number;
58
+ protocol: string;
59
+ allowedDomains?: string[];
60
+ }
61
+ export interface VerifyResult {
62
+ id: string;
63
+ appId: string;
64
+ score: number;
65
+ grade: "A" | "B" | "C" | "D" | "F";
66
+ checks: VerifyCheck[];
67
+ scannedAt: string;
68
+ dimensions?: Record<string, number>;
69
+ }
70
+ export interface VerifyCheck {
71
+ name: string;
72
+ passed: boolean;
73
+ severity: "critical" | "high" | "medium" | "low" | "info";
74
+ details?: string;
75
+ }
76
+ export interface ComplianceReport {
77
+ id: string;
78
+ appId: string;
79
+ framework: ComplianceFramework;
80
+ score: number;
81
+ controls: ComplianceControl[];
82
+ generatedAt: string;
83
+ }
84
+ export interface ComplianceControl {
85
+ id: string;
86
+ name: string;
87
+ status: "pass" | "fail" | "partial" | "not_applicable";
88
+ evidence?: string;
89
+ }
90
+ export interface DnsRule {
91
+ id: string;
92
+ appId: string;
93
+ domain: string;
94
+ action: "allow" | "block";
95
+ reason?: string;
96
+ createdAt: string;
97
+ }
98
+ export interface Operation {
99
+ id: string;
100
+ type: string;
101
+ status: "pending" | "running" | "completed" | "failed";
102
+ result?: Record<string, unknown>;
103
+ error?: string;
104
+ createdAt: string;
105
+ completedAt?: string;
106
+ }
107
+ export interface Session {
108
+ id: string;
109
+ appId: string;
110
+ userId: string;
111
+ status: "active" | "expired" | "revoked";
112
+ createdAt: string;
113
+ expiresAt: string;
114
+ }
115
+ export interface ListResponse<T> {
116
+ data: T[];
117
+ total: number;
118
+ page: number;
119
+ pageSize: number;
120
+ }
121
+ export type ComplianceFramework = "SOC2" | "HIPAA" | "PCI-DSS" | "ISO27001";
122
+ export interface FrameworkInfo {
123
+ framework: string;
124
+ runtime: string;
125
+ version: string | null;
126
+ packageManager: string | null;
127
+ runtimeVersion?: string;
128
+ dockerImage?: string;
129
+ }
130
+ /** Finding severity enum (Workstream-1 #13g). Applied uniformly across all scan findings. */
131
+ export type Severity = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW" | "INFO";
132
+ export interface EndpointInfo {
133
+ type: "api" | "web";
134
+ method: string;
135
+ path: string;
136
+ protocol: string;
137
+ file: string;
138
+ auth_method: string;
139
+ /** 1-based line number where the route was declared (Workstream-1 context). */
140
+ line?: number;
141
+ /** How the method was determined: "decorator" | "named-export" | "router-call" | "url-conf" | "page-file" | "fallback". */
142
+ detected_via?: string;
143
+ /** Confidence the route was identified correctly. */
144
+ confidence?: "high" | "medium" | "low";
145
+ /** Confidence the auth_method classification is correct. "low" generally means file-level inference, not per-route. */
146
+ auth_confidence?: "high" | "medium" | "low";
147
+ /** Risk severity for this route (Workstream-1 #13g). */
148
+ severity?: Severity;
149
+ /** Plain-English reason the severity was assigned. */
150
+ severity_rationale?: string;
151
+ }
152
+ export interface PiiField {
153
+ type: string;
154
+ sensitivity: "critical" | "high" | "medium" | "low";
155
+ field: string;
156
+ file: string;
157
+ /** 1-based line number where the match was found (Workstream-1 explanation context). */
158
+ line?: number;
159
+ /** Trimmed source line the match occurred on, for human review. */
160
+ snippet?: string;
161
+ /** Detection confidence — "high" = structural evidence (schema/object key/quoted field),
162
+ * "medium" = bare identifier in code, "low" = comment/prose (filtered out by default). */
163
+ confidence?: "high" | "medium" | "low";
164
+ /** Plain-English remediation guidance for this PII type. */
165
+ remediation?: string;
166
+ /** Risk severity for this finding (Workstream-1 #13g). */
167
+ severity?: Severity;
168
+ /** Plain-English reason the severity was assigned. */
169
+ severity_rationale?: string;
170
+ }
171
+ export interface ExternalService {
172
+ name: string;
173
+ domain: string;
174
+ port: number;
175
+ protocol: string;
176
+ purpose: string;
177
+ detectedFrom: string;
178
+ }
179
+ export interface DataStore {
180
+ type: string;
181
+ host: string;
182
+ port: number | null;
183
+ encrypted: boolean | null;
184
+ contains_pii: boolean | null;
185
+ detectedFrom: string;
186
+ }
187
+ export interface SecurityManifest {
188
+ application: {
189
+ name: string;
190
+ version: string;
191
+ framework: string;
192
+ runtime: string;
193
+ runtimeVersion?: string;
194
+ };
195
+ endpoints: Array<{
196
+ type: string;
197
+ protocol: string;
198
+ port: number;
199
+ path: string;
200
+ auth_method: string;
201
+ }>;
202
+ external_services: Array<{
203
+ name: string;
204
+ domain: string;
205
+ port: number;
206
+ protocol: string;
207
+ purpose: string;
208
+ }>;
209
+ data_stores: Array<{
210
+ type: string;
211
+ host: string;
212
+ port: number | null;
213
+ encrypted: boolean | null;
214
+ contains_pii: boolean;
215
+ }>;
216
+ data_flows: Array<{
217
+ source: string;
218
+ destination: string;
219
+ data_types: string[];
220
+ sensitivity: string;
221
+ }>;
222
+ compliance: {
223
+ frameworks: string[];
224
+ data_residency: string;
225
+ audit_required: boolean;
226
+ };
227
+ security_preferences: {
228
+ session_ttl: number;
229
+ mfa_required: boolean;
230
+ ip_binding: boolean;
231
+ auto_rotate_certs: boolean;
232
+ };
233
+ _metadata: {
234
+ generated_by: string;
235
+ generated_at: string;
236
+ confidence: number;
237
+ pii_summary: {
238
+ total_fields: number;
239
+ sensitivity_level: string;
240
+ types: string[];
241
+ };
242
+ };
243
+ }
244
+ export interface DiscoveryResult {
245
+ framework: FrameworkInfo;
246
+ endpoints: EndpointInfo[];
247
+ piiFields: PiiField[];
248
+ externalServices: ExternalService[];
249
+ dataStores: DataStore[];
250
+ manifest: SecurityManifest;
251
+ }
252
+ export interface PostureReport {
253
+ score: number;
254
+ grade: string;
255
+ status: "SECURE" | "NEEDS_ATTENTION" | "AT_RISK";
256
+ summary: string;
257
+ dimensions: Record<string, number>;
258
+ recommendations: string[];
259
+ timestamp: string;
260
+ }
261
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ /** Type definitions for Shield API resources and discovery results. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,4 @@
1
+ /** Format verification results into posture reports with grades and recommendations. */
2
+ import type { PostureReport } from "../types";
3
+ export declare function formatPosture(result: Record<string, unknown> | null): PostureReport;
4
+ //# sourceMappingURL=postureReporter.d.ts.map
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatPosture = formatPosture;
4
+ function formatPosture(result) {
5
+ if (!result) {
6
+ return { score: 0, grade: "F", status: "AT_RISK", summary: "No verification data available", dimensions: {}, recommendations: ["Run a posture scan to establish baseline"], timestamp: new Date().toISOString() };
7
+ }
8
+ const score = result.score || 0;
9
+ const grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : score >= 60 ? "D" : "F";
10
+ const status = score >= 80 ? "SECURE" : score >= 50 ? "NEEDS_ATTENTION" : "AT_RISK";
11
+ const dims = result.dimensions || {};
12
+ const recommendations = [];
13
+ if ((dims.certFreshness ?? 100) < 80)
14
+ recommendations.push("Rotate certificates that are approaching expiry");
15
+ if ((dims.policyCompliance ?? 100) < 80)
16
+ recommendations.push("Review and sync pending policy changes");
17
+ if ((dims.sessionHygiene ?? 100) < 80)
18
+ recommendations.push("Terminate stale sessions and review session TTL settings");
19
+ if ((dims.threatBlockRatio ?? 100) < 80)
20
+ recommendations.push("Review threat activity and update DNS block lists");
21
+ if (recommendations.length === 0)
22
+ recommendations.push("All security dimensions are healthy");
23
+ return {
24
+ score, grade, status,
25
+ summary: `Security Posture: ${grade} (${score}/100) - ${status}`,
26
+ dimensions: dims,
27
+ recommendations,
28
+ timestamp: result.timestamp || new Date().toISOString(),
29
+ };
30
+ }
31
+ //# sourceMappingURL=postureReporter.js.map
@@ -0,0 +1,67 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIF/DCCA+SgAwIBAgIJAPADND1aMtKrMA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD
3
+ VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5j
4
+ aXNjbzEcMBoGA1UECgwTQmxhY2tzYW5kcyBTZWN1cml0eTEeMBwGA1UECwwVQ2Vy
5
+ dGlmaWNhdGUgQXV0aG9yaXR5MRswGQYDVQQDDBJCbGFja3NhbmRzIFJvb3QgQ0Ew
6
+ HhcNMjYwNDAxMTM0MzI0WhcNMzYwMzI5MTM0MzI0WjCBnTELMAkGA1UEBhMCVVMx
7
+ EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xHDAa
8
+ BgNVBAoME0JsYWNrc2FuZHMgU2VjdXJpdHkxHjAcBgNVBAsMFUNlcnRpZmljYXRl
9
+ IEF1dGhvcml0eTEjMCEGA1UEAwwaQmxhY2tzYW5kcyBJbnRlcm1lZGlhdGUgQ0Ew
10
+ ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDrOJB5g8HyB30BvuQ1rokW
11
+ o9vduPvYnvXESYIN5+OvJDYpgCb4cxoc7oUySMtcwKMAX8/UdvQ3JxmglBSsQXGf
12
+ i0C2V8qftVtuqWdLwPhp8xQa07M+lZ3ZtM0AXI5y7FLxg7t5zx4cVcQDLSGNnmYY
13
+ fctuWIm+Ga4wtHGMPrG6PRwDG5K3RJOII2XjGqxtiex02mVcdIC4lZ+zA9svewbg
14
+ 11yLZEl+bxQdCDeY8Eo/uyxe+69AoM1ExZ0YoURq8lINkI4OtS6QGHug8eOWSwGU
15
+ NvhujNm9fnjDz5+9U91JbCeWBB6mvdlNqR28sSvECpqmQ4UCiCABHluP9TWlBjmy
16
+ CRYv4EBBpUeNSTzsYs3TQNSChgt+PsopUaIgiCEgSz6ioDf9BkFsOKDTsjsXcxiJ
17
+ 8UCYi8P5vMhwKeNDYVl/OO8Wp8s+/Z+1upCWVFGpreYfr4Q7iIh1RfA5HnO3R5N0
18
+ hJpuGeG45zQ2cCEV4N2lU1eUcxJHA/q61Uchlqb3kw81HlHCdy9pVQmSmhWRd7fL
19
+ hJqgiEp/4QRtlWi/rXncU5XYH2Hc3QXNDRvnEccwHexZAfcBEXdQN7m0NdGVn/e1
20
+ l+0BA3635P6IPhETkgDjGgDbKyY2MxHPtsfun4+Acrvaqxb0rdG/GS7NdMIbUArD
21
+ 7GK0h5AE9mHr1RHApPwGTwIDAQABo0UwQzAdBgNVHQ4EFgQU1rlRozoYooNirPVT
22
+ N18NqY0u3kQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwDQYJ
23
+ KoZIhvcNAQELBQADggIBAE3LitbXdghElOnnNOfK9fxX5l81STzxtj6LfpoyB1iF
24
+ AIdetbC3RBVaeLU1KmNxUGZG99SMywbJcRLdfkDb27UE8K/2vBiiehgnf8oMrNQh
25
+ vTQTPqZmFVUzAM4tOzVtigFFUzFvAiy4Dg/2/92Pqjmr/upMWiA83DndTAM1Zqiy
26
+ 6QKT8WwLnYuaPy/CJW2fiT0Ibkr6MR+70pqrqvNZNU5rP6wm2jNspyHop/IIEoXp
27
+ AMKsu4s2yn2WLgVIerumLqN3sZ0jJCTctLvehaE6xF6AE2OkQj3RPI6VjGrfthPg
28
+ pkMEiJ/R/wP4Z3+XBqzK8WHKg0p5xosViUgcNici7NSKXH1PeSn0QKkCkXMT1nEw
29
+ QcM4oudsP6PmSMsSW2Lez98TQH2yDepI9gMuCoWJZqXE/my9Qm7qApmSOfYpZKSe
30
+ +waA6O/SVf/pvUkkIL6xurbQ2YfQpyFPvxI++jTf1Fc3tr4Y1xbbhbp6YKwKjeub
31
+ mhiQ2TzDDnLKEWjSVFrcv1d1t2rs5UcF4gvFklKKVClUu+fc2fA1Y8tcY+V8yahb
32
+ 6yGH6+zdCKZKBmjuty7NE32SZo7JVMKSHXqQQY40OK7ME/gRbUGCgloeFSy93XgB
33
+ C2i4DhPrCsVvwq82ML2uN9ZRwtSj+0/AlMzPzOuCRA82ivOZvHApXY6MkPs3FJdY
34
+ -----END CERTIFICATE-----
35
+ -----BEGIN CERTIFICATE-----
36
+ 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
66
+ X5sIz6zv2K6bxt5+
67
+ -----END CERTIFICATE-----