visus-mcp 0.6.2 → 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/.claude/settings.local.json +15 -1
- package/.env.status +7 -0
- package/CHANGELOG.md +110 -0
- package/CLAUDE.md +3 -0
- package/README.md +29 -19
- package/SECURITY.md +2 -0
- package/STATUS.md +320 -12
- package/dist/browser/playwright-renderer.d.ts.map +1 -1
- package/dist/browser/playwright-renderer.js +27 -5
- package/dist/browser/playwright-renderer.js.map +1 -1
- package/dist/content-handlers/index.d.ts +36 -0
- package/dist/content-handlers/index.d.ts.map +1 -0
- package/dist/content-handlers/index.js +59 -0
- package/dist/content-handlers/index.js.map +1 -0
- package/dist/content-handlers/json-handler.d.ts +28 -0
- package/dist/content-handlers/json-handler.d.ts.map +1 -0
- package/dist/content-handlers/json-handler.js +116 -0
- package/dist/content-handlers/json-handler.js.map +1 -0
- package/dist/content-handlers/pdf-handler.d.ts +29 -0
- package/dist/content-handlers/pdf-handler.d.ts.map +1 -0
- package/dist/content-handlers/pdf-handler.js +77 -0
- package/dist/content-handlers/pdf-handler.js.map +1 -0
- package/dist/content-handlers/svg-handler.d.ts +35 -0
- package/dist/content-handlers/svg-handler.d.ts.map +1 -0
- package/dist/content-handlers/svg-handler.js +206 -0
- package/dist/content-handlers/svg-handler.js.map +1 -0
- package/dist/content-handlers/types.d.ts +42 -0
- package/dist/content-handlers/types.d.ts.map +1 -0
- package/dist/content-handlers/types.js +7 -0
- package/dist/content-handlers/types.js.map +1 -0
- package/dist/sanitizer/framework-mapper.d.ts +4 -0
- package/dist/sanitizer/framework-mapper.d.ts.map +1 -1
- package/dist/sanitizer/framework-mapper.js +92 -0
- package/dist/sanitizer/framework-mapper.js.map +1 -1
- package/dist/sanitizer/threat-reporter.d.ts +5 -0
- package/dist/sanitizer/threat-reporter.d.ts.map +1 -1
- package/dist/sanitizer/threat-reporter.js +15 -6
- package/dist/sanitizer/threat-reporter.js.map +1 -1
- package/dist/tools/fetch-structured.d.ts.map +1 -1
- package/dist/tools/fetch-structured.js +4 -0
- package/dist/tools/fetch-structured.js.map +1 -1
- package/dist/tools/fetch.d.ts.map +1 -1
- package/dist/tools/fetch.js +68 -4
- package/dist/tools/fetch.js.map +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +4 -0
- package/dist/tools/read.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -1
- package/server.json +25 -14
- package/src/browser/playwright-renderer.ts +29 -6
- package/src/content-handlers/index.ts +72 -0
- package/src/content-handlers/json-handler.ts +137 -0
- package/src/content-handlers/pdf-handler.ts +91 -0
- package/src/content-handlers/svg-handler.ts +243 -0
- package/src/content-handlers/types.ts +44 -0
- package/src/sanitizer/framework-mapper.ts +94 -0
- package/src/sanitizer/threat-reporter.ts +17 -6
- package/src/tools/fetch-structured.ts +5 -0
- package/src/tools/fetch.ts +76 -4
- package/src/tools/read.ts +5 -0
- package/src/types.ts +9 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -47
- package/.github/ISSUE_TEMPLATE/false_positive.md +0 -43
- package/.github/ISSUE_TEMPLATE/new_pattern.md +0 -49
- package/.github/ISSUE_TEMPLATE/security_report.md +0 -31
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -39
- package/.mcpregistry_github_token +0 -1
- package/.mcpregistry_registry_token +0 -1
- package/CONTRIBUTING.md +0 -329
- package/LINKEDIN-STRATEGY.md +0 -367
- package/ROADMAP.md +0 -221
- package/SECURITY-AUDIT-v1.md +0 -277
- package/SUBMISSION.md +0 -66
- package/TROUBLESHOOT-AUTH-20260322-2019.md +0 -291
- package/TROUBLESHOOT-BUILD-20260319-1450.md +0 -546
- package/TROUBLESHOOT-COGNITO-AUTH-20260324-2029.md +0 -415
- package/TROUBLESHOOT-COGNITO-JWT-20260324.md +0 -592
- package/TROUBLESHOOT-FETCH-20260320-1150.md +0 -168
- package/TROUBLESHOOT-JEST-20260323-1357.md +0 -139
- package/TROUBLESHOOT-LAMBDA-20260322-1945.md +0 -183
- package/TROUBLESHOOT-PLAYWRIGHT-20260321-1549.md +0 -217
- package/TROUBLESHOOT-SSL-20260320-1138.md +0 -171
- package/TROUBLESHOOT-STRUCTURED-20260320-1200.md +0 -246
- package/TROUBLESHOOT-TEST-20260320-0942.md +0 -281
- package/VISUS-CLAUDE-CODE-PROMPT.md +0 -324
- package/VISUS-PROJECT-PLAN.md +0 -205
- package/cdk.json +0 -73
- package/infrastructure/app.ts +0 -39
- package/infrastructure/stack.ts +0 -298
- package/jest.config.js +0 -33
- package/jest.setup.js +0 -9
- package/lambda-deploy/index.js +0 -81512
- package/lambda-deploy/index.js.map +0 -7
- package/lambda-package/browser/__mocks__/playwright-renderer.d.ts +0 -25
- package/lambda-package/browser/__mocks__/playwright-renderer.d.ts.map +0 -1
- package/lambda-package/browser/__mocks__/playwright-renderer.js +0 -119
- package/lambda-package/browser/__mocks__/playwright-renderer.js.map +0 -1
- package/lambda-package/browser/playwright-renderer.d.ts +0 -40
- package/lambda-package/browser/playwright-renderer.d.ts.map +0 -1
- package/lambda-package/browser/playwright-renderer.js +0 -214
- package/lambda-package/browser/playwright-renderer.js.map +0 -1
- package/lambda-package/browser/reader.d.ts +0 -31
- package/lambda-package/browser/reader.d.ts.map +0 -1
- package/lambda-package/browser/reader.js +0 -98
- package/lambda-package/browser/reader.js.map +0 -1
- package/lambda-package/index.d.ts +0 -18
- package/lambda-package/index.d.ts.map +0 -1
- package/lambda-package/index.js +0 -238
- package/lambda-package/index.js.map +0 -1
- package/lambda-package/lambda-handler.d.ts +0 -28
- package/lambda-package/lambda-handler.d.ts.map +0 -1
- package/lambda-package/lambda-handler.js +0 -257
- package/lambda-package/lambda-handler.js.map +0 -1
- package/lambda-package/package-lock.json +0 -7435
- package/lambda-package/package.json +0 -74
- package/lambda-package/runtime.d.ts +0 -50
- package/lambda-package/runtime.d.ts.map +0 -1
- package/lambda-package/runtime.js +0 -86
- package/lambda-package/runtime.js.map +0 -1
- package/lambda-package/sanitizer/elicit-runner.d.ts +0 -48
- package/lambda-package/sanitizer/elicit-runner.d.ts.map +0 -1
- package/lambda-package/sanitizer/elicit-runner.js +0 -100
- package/lambda-package/sanitizer/elicit-runner.js.map +0 -1
- package/lambda-package/sanitizer/framework-mapper.d.ts +0 -24
- package/lambda-package/sanitizer/framework-mapper.d.ts.map +0 -1
- package/lambda-package/sanitizer/framework-mapper.js +0 -342
- package/lambda-package/sanitizer/framework-mapper.js.map +0 -1
- package/lambda-package/sanitizer/hitl-gate.d.ts +0 -69
- package/lambda-package/sanitizer/hitl-gate.d.ts.map +0 -1
- package/lambda-package/sanitizer/hitl-gate.js +0 -101
- package/lambda-package/sanitizer/hitl-gate.js.map +0 -1
- package/lambda-package/sanitizer/index.d.ts +0 -63
- package/lambda-package/sanitizer/index.d.ts.map +0 -1
- package/lambda-package/sanitizer/index.js +0 -105
- package/lambda-package/sanitizer/index.js.map +0 -1
- package/lambda-package/sanitizer/injection-detector.d.ts +0 -34
- package/lambda-package/sanitizer/injection-detector.d.ts.map +0 -1
- package/lambda-package/sanitizer/injection-detector.js +0 -89
- package/lambda-package/sanitizer/injection-detector.js.map +0 -1
- package/lambda-package/sanitizer/patterns.d.ts +0 -30
- package/lambda-package/sanitizer/patterns.d.ts.map +0 -1
- package/lambda-package/sanitizer/patterns.js +0 -372
- package/lambda-package/sanitizer/patterns.js.map +0 -1
- package/lambda-package/sanitizer/pii-allowlist.d.ts +0 -49
- package/lambda-package/sanitizer/pii-allowlist.d.ts.map +0 -1
- package/lambda-package/sanitizer/pii-allowlist.js +0 -231
- package/lambda-package/sanitizer/pii-allowlist.js.map +0 -1
- package/lambda-package/sanitizer/pii-redactor.d.ts +0 -41
- package/lambda-package/sanitizer/pii-redactor.d.ts.map +0 -1
- package/lambda-package/sanitizer/pii-redactor.js +0 -213
- package/lambda-package/sanitizer/pii-redactor.js.map +0 -1
- package/lambda-package/sanitizer/severity-classifier.d.ts +0 -33
- package/lambda-package/sanitizer/severity-classifier.d.ts.map +0 -1
- package/lambda-package/sanitizer/severity-classifier.js +0 -113
- package/lambda-package/sanitizer/severity-classifier.js.map +0 -1
- package/lambda-package/sanitizer/threat-reporter.d.ts +0 -66
- package/lambda-package/sanitizer/threat-reporter.d.ts.map +0 -1
- package/lambda-package/sanitizer/threat-reporter.js +0 -163
- package/lambda-package/sanitizer/threat-reporter.js.map +0 -1
- package/lambda-package/tools/fetch-structured.d.ts +0 -51
- package/lambda-package/tools/fetch-structured.d.ts.map +0 -1
- package/lambda-package/tools/fetch-structured.js +0 -237
- package/lambda-package/tools/fetch-structured.js.map +0 -1
- package/lambda-package/tools/fetch.d.ts +0 -49
- package/lambda-package/tools/fetch.d.ts.map +0 -1
- package/lambda-package/tools/fetch.js +0 -131
- package/lambda-package/tools/fetch.js.map +0 -1
- package/lambda-package/tools/read.d.ts +0 -51
- package/lambda-package/tools/read.d.ts.map +0 -1
- package/lambda-package/tools/read.js +0 -127
- package/lambda-package/tools/read.js.map +0 -1
- package/lambda-package/tools/search.d.ts +0 -45
- package/lambda-package/tools/search.d.ts.map +0 -1
- package/lambda-package/tools/search.js +0 -220
- package/lambda-package/tools/search.js.map +0 -1
- package/lambda-package/types.d.ts +0 -167
- package/lambda-package/types.d.ts.map +0 -1
- package/lambda-package/types.js +0 -16
- package/lambda-package/types.js.map +0 -1
- package/lambda-package/utils/format-converter.d.ts +0 -39
- package/lambda-package/utils/format-converter.d.ts.map +0 -1
- package/lambda-package/utils/format-converter.js +0 -191
- package/lambda-package/utils/format-converter.js.map +0 -1
- package/lambda-package/utils/truncate.d.ts +0 -26
- package/lambda-package/utils/truncate.d.ts.map +0 -1
- package/lambda-package/utils/truncate.js +0 -54
- package/lambda-package/utils/truncate.js.map +0 -1
- package/lambda.zip +0 -0
- package/test-output.txt +0 -4
- package/tests/auth-smoke.test.ts +0 -480
- package/tests/elicit-runner.test.ts +0 -232
- package/tests/fetch-tool.test.ts +0 -922
- package/tests/hitl-gate.test.ts +0 -267
- package/tests/injection-corpus.ts +0 -338
- package/tests/pii-allowlist.test.ts +0 -282
- package/tests/reader.test.ts +0 -353
- package/tests/sanitizer.test.ts +0 -358
- package/tests/search.test.ts +0 -456
- package/tests/threat-reporter.test.ts +0 -334
- package/tsconfig.cdk.json +0 -35
package/STATUS.md
CHANGED
|
@@ -1,9 +1,312 @@
|
|
|
1
1
|
# Visus MCP - Project Status
|
|
2
2
|
|
|
3
|
-
**Generated:** 2026-03-
|
|
4
|
-
**Version:** 0.
|
|
3
|
+
**Generated:** 2026-03-26
|
|
4
|
+
**Version:** 0.9.0
|
|
5
5
|
**Phase:** 3 (Anthropic Directory Prep)
|
|
6
|
-
**Status:** ✅ **v0.
|
|
6
|
+
**Status:** ✅ **v0.9.0 COMPLETE** - NIST AI RMF & CSF 2.0 Framework Mappings
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## v0.9.0 Release - NIST AI RMF & CSF 2.0 Framework Mappings
|
|
11
|
+
|
|
12
|
+
**Status:** ✅ COMPLETE (Ready for release)
|
|
13
|
+
**Type:** Feature enhancement - Expanded compliance framework support
|
|
14
|
+
**Implemented:** 2026-03-26
|
|
15
|
+
**Tests:** 294/294 passing (100%)
|
|
16
|
+
|
|
17
|
+
### Features Added
|
|
18
|
+
|
|
19
|
+
**NIST AI Risk Management Framework (AI RMF / AI 100-1) Mappings**
|
|
20
|
+
- Added comprehensive mappings for all 43 injection patterns to NIST AI RMF controls
|
|
21
|
+
- Maps threats to four core functions: GOVERN, MAP, MEASURE, and MANAGE
|
|
22
|
+
- Examples:
|
|
23
|
+
- GOVERN-1.1: Legal and Regulatory Requirements
|
|
24
|
+
- MAP-4.1: Risk Mapping for AI Components
|
|
25
|
+
- MEASURE-2.7: AI System Security and Resilience
|
|
26
|
+
- MANAGE-2.3: Respond to Unknown Risks
|
|
27
|
+
- Provides federal/government compliance alignment for procurement
|
|
28
|
+
|
|
29
|
+
**NIST Cybersecurity Framework 2.0 (CSF 2.0) Mappings**
|
|
30
|
+
- Added comprehensive mappings for all 43 injection patterns to CSF 2.0 controls
|
|
31
|
+
- Maps threats to six core functions: IDENTIFY, PROTECT, DETECT, RESPOND, RECOVER, and GOVERN
|
|
32
|
+
- Examples:
|
|
33
|
+
- DE.CM-01: Network Monitoring
|
|
34
|
+
- PR.DS-01: Data at Rest Protection
|
|
35
|
+
- PR.AC-04: Access Control Enforcement
|
|
36
|
+
- DE.AE-02: Anomaly Detection
|
|
37
|
+
- Widely adopted enterprise cybersecurity framework for audit requirements
|
|
38
|
+
|
|
39
|
+
**Enhanced Threat Reporting**
|
|
40
|
+
- Expanded framework coverage from 4 to 6 compliance frameworks
|
|
41
|
+
- Updated TOON format from 10 fields to 12 fields (added nist_ai_rmf, nist_csf_2_0)
|
|
42
|
+
- Enhanced Markdown threat report table with new AI-RMF and CSF 2.0 columns
|
|
43
|
+
- All threat reports now include comprehensive 6-framework alignment
|
|
44
|
+
|
|
45
|
+
### Documentation Updates
|
|
46
|
+
- Updated security badge to highlight NIST AI RMF and CSF 2.0
|
|
47
|
+
- Updated all 4 MCP tool descriptions to reference 6 frameworks
|
|
48
|
+
- Expanded "Framework Alignments" section with NIST AI RMF and CSF 2.0 descriptions
|
|
49
|
+
- Updated example threat reports to show 9-column table format
|
|
50
|
+
|
|
51
|
+
### Files Modified
|
|
52
|
+
- `src/sanitizer/framework-mapper.ts` - Added nist_ai_rmf and nist_csf_2_0 fields, mappings for all 43 patterns
|
|
53
|
+
- `src/sanitizer/threat-reporter.ts` - Updated ThreatFinding interface, TOON format, Markdown report
|
|
54
|
+
- `README.md` - Updated badges, tool descriptions, framework alignments section, examples
|
|
55
|
+
- `tests/threat-reporter.test.ts` - Updated to verify 6 frameworks and 12 TOON fields
|
|
56
|
+
- `CHANGELOG.md` - Added v0.9.0 release notes
|
|
57
|
+
|
|
58
|
+
### Why This Matters
|
|
59
|
+
- **Federal/Government Procurement**: NIST AI RMF is widely adopted by U.S. federal agencies
|
|
60
|
+
- **Enterprise Compliance**: CSF 2.0 is the de facto standard for cybersecurity audit requirements
|
|
61
|
+
- **Natural Extension**: Builds on existing NIST AI 600-1 mapping infrastructure
|
|
62
|
+
- **High Value, Easy Implementation**: Leveraged existing framework mapping system
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## v0.8.1 Release - PDF Extraction Bug Fix
|
|
67
|
+
|
|
68
|
+
**Status:** ✅ COMPLETE (Ready for release)
|
|
69
|
+
**Type:** Critical bug fix
|
|
70
|
+
**Implemented:** 2026-03-25
|
|
71
|
+
**Tests:** 294/294 passing (100%)
|
|
72
|
+
|
|
73
|
+
### Bug Fixed
|
|
74
|
+
|
|
75
|
+
**PDF Text Extraction Returning Binary Data Instead of Text**
|
|
76
|
+
|
|
77
|
+
**Root Cause:** `response.text()` in `src/browser/playwright-renderer.ts` was converting ALL response bodies to UTF-8 strings, including binary PDFs. This corrupted the binary data before it reached the pdf-parse library, causing the PDF handler to receive mangled strings instead of proper binary content.
|
|
78
|
+
|
|
79
|
+
**Impact:** All PDF extractions failed, returning raw binary garbage like "%PDF-1.7..." instead of extracted text.
|
|
80
|
+
|
|
81
|
+
**Fix:** Implemented content-type detection in the renderer to use `response.arrayBuffer()` for binary types and `response.text()` for text types.
|
|
82
|
+
|
|
83
|
+
### Technical Details
|
|
84
|
+
|
|
85
|
+
**Files Modified:**
|
|
86
|
+
1. **src/types.ts** - Updated `BrowserRenderResult.html` from `string` to `string | Buffer`
|
|
87
|
+
- Added JSDoc explaining when Buffer is used (PDFs, images, binary content)
|
|
88
|
+
|
|
89
|
+
2. **src/browser/playwright-renderer.ts** - Added binary content detection
|
|
90
|
+
- Checks Content-Type: `application/pdf`, `image/*`, `application/octet-stream`
|
|
91
|
+
- Binary types: `response.arrayBuffer()` → `Buffer.from(arrayBuffer)`
|
|
92
|
+
- Text types: `response.text()` → string (existing behavior)
|
|
93
|
+
|
|
94
|
+
3. **src/tools/fetch.ts** - Added Buffer type guard
|
|
95
|
+
- Ensures Buffer content doesn't reach HTML/XML/RSS path (would cause errors)
|
|
96
|
+
|
|
97
|
+
4. **src/tools/fetch-structured.ts** - Added Buffer rejection
|
|
98
|
+
- Structured extraction doesn't support binary types - returns clear error message
|
|
99
|
+
|
|
100
|
+
5. **src/tools/read.ts** - Added Buffer rejection
|
|
101
|
+
- Reader mode (Readability) doesn't support binary types - returns clear error message
|
|
102
|
+
|
|
103
|
+
**Verification:**
|
|
104
|
+
- ✅ All 294 tests passing - zero regressions
|
|
105
|
+
- ✅ Manual test with WAI dummy PDF: Text extraction working correctly
|
|
106
|
+
- ✅ Metadata extraction working (Author, Creator, Producer fields)
|
|
107
|
+
- ✅ Content is readable English, not binary garbage
|
|
108
|
+
|
|
109
|
+
**Known Limitations:**
|
|
110
|
+
- Some complex PDFs may fail with "Invalid Root reference" error
|
|
111
|
+
- This is a limitation of the pdf-parse library (v2.4.5), not Visus
|
|
112
|
+
- Simple to moderately complex PDFs work correctly
|
|
113
|
+
|
|
114
|
+
**Documentation:**
|
|
115
|
+
- Updated CHANGELOG.md with bug fix entry
|
|
116
|
+
- Created TROUBLESHOOT-PDF-EXTRACTION-20260325-2040.md with full investigation log
|
|
117
|
+
- Added inline comments explaining Buffer handling in all modified files
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## v0.8.0 Release - PDF, JSON, and SVG Content Handlers
|
|
122
|
+
|
|
123
|
+
**Status:** ✅ COMPLETE (Ready for release)
|
|
124
|
+
**Type:** Feature enhancement + Security expansion
|
|
125
|
+
**Implemented:** 2026-03-25
|
|
126
|
+
|
|
127
|
+
### New Features
|
|
128
|
+
|
|
129
|
+
**🎯 Specialized Content Type Handlers with Full Sanitization**
|
|
130
|
+
|
|
131
|
+
Adds content-type routing for three specialized formats (PDF, JSON, SVG), applying the full 43-pattern injection sanitization pipeline to each format before returning content to the LLM.
|
|
132
|
+
|
|
133
|
+
**Key Features:**
|
|
134
|
+
- ✅ PDF text extraction with metadata (Title, Author, Subject, Keywords, Creator, Producer)
|
|
135
|
+
- ✅ Recursive JSON sanitization preserving structure while neutralizing injections
|
|
136
|
+
- ✅ SVG element stripping (script, foreignObject, event handlers, external use)
|
|
137
|
+
- ✅ Content-type routing dispatcher with MIME type normalization
|
|
138
|
+
- ✅ Full sanitization metadata flow (patterns_detected, pii_types_redacted, pii_allowlisted)
|
|
139
|
+
- ✅ 48 new tests (294 total, all passing)
|
|
140
|
+
- ✅ Zero regressions - all existing tests continue to pass
|
|
141
|
+
|
|
142
|
+
**Supported Content Types:**
|
|
143
|
+
1. **PDF** (`application/pdf`)
|
|
144
|
+
- Extracts text content from all pages using pdf-parse v2 API
|
|
145
|
+
- Extracts metadata fields (Title, Author, Subject, Keywords, Creator, Producer)
|
|
146
|
+
- Combines text + metadata into single string for sanitization
|
|
147
|
+
- Returns structured error for corrupt PDFs (PDF_PARSE_FAILED)
|
|
148
|
+
- Processing time tracked for performance monitoring
|
|
149
|
+
|
|
150
|
+
2. **JSON** (`application/json`, `text/json`)
|
|
151
|
+
- Recursive sanitization preserving JSON structure
|
|
152
|
+
- Field-by-field injection detection with metadata aggregation
|
|
153
|
+
- Uses Sets to deduplicate patterns/PII types across nested objects
|
|
154
|
+
- Falls back to plain text sanitization if JSON.parse fails
|
|
155
|
+
- Returns pure sanitized JSON (no "JSON Response:" prefix)
|
|
156
|
+
|
|
157
|
+
3. **SVG** (`image/svg+xml`)
|
|
158
|
+
- Strips dangerous elements: `<script>`, `<foreignObject>`
|
|
159
|
+
- Removes event handlers: `onload`, `onclick`, etc.
|
|
160
|
+
- Blocks external `<use>` references (e.g., `href="http://evil.com/icon.svg"`)
|
|
161
|
+
- Removes `data:` URIs to prevent base64-encoded payloads
|
|
162
|
+
- Extracts and sanitizes text content from title/desc elements
|
|
163
|
+
- Returns cleaned SVG with text injection detection
|
|
164
|
+
|
|
165
|
+
**Handler Interface Design:**
|
|
166
|
+
|
|
167
|
+
All handlers return `HandlerResult` with full sanitization metadata:
|
|
168
|
+
```typescript
|
|
169
|
+
interface HandlerSuccessResult {
|
|
170
|
+
status: 'sanitized';
|
|
171
|
+
content_type: string;
|
|
172
|
+
sanitized_content: string;
|
|
173
|
+
sanitization: {
|
|
174
|
+
patterns_detected: string[];
|
|
175
|
+
pii_types_redacted: string[];
|
|
176
|
+
pii_allowlisted: Array<{ type: string; value: string; reason: string }>;
|
|
177
|
+
sanitized_fields: number;
|
|
178
|
+
};
|
|
179
|
+
processing_time_ms: number;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Processing Pipeline:**
|
|
184
|
+
```
|
|
185
|
+
URL Fetch → Content-Type Detection → Handler Routing →
|
|
186
|
+
PDF: Extract text + metadata → Sanitize → Return
|
|
187
|
+
JSON: Recursive sanitize → Deduplicate metadata → Return
|
|
188
|
+
SVG: Strip dangerous elements → Extract text → Sanitize → Return
|
|
189
|
+
→ Token Ceiling → Output
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Security Guarantees:**
|
|
193
|
+
- ✅ All 43 injection patterns applied to PDF text
|
|
194
|
+
- ✅ All 43 patterns applied recursively to every JSON string field
|
|
195
|
+
- ✅ SVG text content scanned with all 43 patterns
|
|
196
|
+
- ✅ PII redaction works on all three formats
|
|
197
|
+
- ✅ No content bypasses sanitization (fail-safe design)
|
|
198
|
+
- ✅ Corrupt/malformed input returns structured error (never throws)
|
|
199
|
+
|
|
200
|
+
**Technical Implementation:**
|
|
201
|
+
|
|
202
|
+
**New Components:**
|
|
203
|
+
1. **src/content-handlers/types.ts** (60 lines)
|
|
204
|
+
- Shared interfaces for all content handlers
|
|
205
|
+
- `HandlerResult` union type: `HandlerSuccessResult | HandlerErrorResult | HandlerRejectedResult`
|
|
206
|
+
- Full sanitization metadata preservation
|
|
207
|
+
|
|
208
|
+
2. **src/content-handlers/pdf-handler.ts** (95 lines)
|
|
209
|
+
- Uses pdf-parse v2 API (`new PDFParse({ data: buffer })`)
|
|
210
|
+
- Calls `parser.getText()` and `parser.getInfo()` separately
|
|
211
|
+
- Combines text + metadata for comprehensive sanitization
|
|
212
|
+
- Returns error with reason code on PDF parse failure
|
|
213
|
+
|
|
214
|
+
3. **src/content-handlers/json-handler.ts** (140 lines)
|
|
215
|
+
- Recursive sanitization with `recursiveSanitize()` helper
|
|
216
|
+
- Aggregates metadata using Sets for deduplication
|
|
217
|
+
- Preserves JSON structure (objects, arrays, primitives)
|
|
218
|
+
- Graceful fallback to plain text on parse error
|
|
219
|
+
|
|
220
|
+
4. **src/content-handlers/svg-handler.ts** (185 lines)
|
|
221
|
+
- XML parsing with fast-xml-parser
|
|
222
|
+
- `stripDangerousContent()` removes unsafe elements/attributes
|
|
223
|
+
- `extractTextContent()` pulls title/desc text for injection scanning
|
|
224
|
+
- Returns cleaned SVG + sanitization metadata
|
|
225
|
+
|
|
226
|
+
5. **src/content-handlers/index.ts** (55 lines)
|
|
227
|
+
- Central routing dispatcher based on normalized MIME type
|
|
228
|
+
- `normalizeMimeType()` handles charset and case normalization
|
|
229
|
+
- `routeContentHandler()` maps MIME to appropriate handler
|
|
230
|
+
- Returns rejection for unsupported content types
|
|
231
|
+
|
|
232
|
+
**Modified Files:**
|
|
233
|
+
- `src/tools/fetch.ts` - Integrated content handler routing before HTML pipeline
|
|
234
|
+
- Added MIME type detection (lines 46-53)
|
|
235
|
+
- Early routing for PDF/JSON/SVG (lines 50-108)
|
|
236
|
+
- Uses handler-provided sanitization metadata (lines 88-90)
|
|
237
|
+
- Removed placeholder pattern array
|
|
238
|
+
- `package.json` - Added pdf-parse@2.4.5 dependency
|
|
239
|
+
|
|
240
|
+
**Test Coverage:**
|
|
241
|
+
|
|
242
|
+
New test file:
|
|
243
|
+
- `tests/content-handlers.test.ts` - 20 tests covering:
|
|
244
|
+
- PDF: corrupt file error handling
|
|
245
|
+
- JSON: clean flat/nested pass-through, injection sanitization, invalid fallback
|
|
246
|
+
- SVG: clean pass-through, script stripping, event handler removal, foreignObject removal, external use blocking, title injection detection
|
|
247
|
+
- Routing: MIME normalization, unsupported type rejection
|
|
248
|
+
|
|
249
|
+
Updated test files:
|
|
250
|
+
- `tests/fetch-tool.test.ts` - Updated JSON test expectations (2 tests modified):
|
|
251
|
+
- Removed "JSON Response:" prefix expectation
|
|
252
|
+
- Changed to expect pure JSON content with specific fields
|
|
253
|
+
|
|
254
|
+
**Test Results:** ✅ 294/294 tests passing (48 new content handler tests added)
|
|
255
|
+
|
|
256
|
+
**Dependencies Added:**
|
|
257
|
+
- `pdf-parse@2.4.5` - PDF text extraction library
|
|
258
|
+
|
|
259
|
+
**Troubleshooting:**
|
|
260
|
+
- Documented handler interface metadata loss issue in `TROUBLESHOOT-CONTENT-HANDLERS-20260325-1047.md`
|
|
261
|
+
- Root cause: Initial interface only had `sanitized_fields: number`, lost pattern names and PII types
|
|
262
|
+
- Resolution: Expanded interface to include full `sanitization` object
|
|
263
|
+
- Time to resolution: ~10 minutes
|
|
264
|
+
|
|
265
|
+
**Example Usage:**
|
|
266
|
+
|
|
267
|
+
PDF document:
|
|
268
|
+
```json
|
|
269
|
+
{
|
|
270
|
+
"url": "https://example.com/whitepaper.pdf"
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Returns extracted text + metadata with `format_detected: "html"` and sanitization metadata.
|
|
275
|
+
|
|
276
|
+
JSON API:
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"url": "https://api.github.com/repos/anthropics/anthropic-sdk-typescript"
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Returns pure sanitized JSON with `format_detected: "json"` and injection detection metadata.
|
|
284
|
+
|
|
285
|
+
SVG image:
|
|
286
|
+
```json
|
|
287
|
+
{
|
|
288
|
+
"url": "https://example.com/diagram.svg"
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Returns cleaned SVG with dangerous elements removed and `format_detected: "xml"`.
|
|
293
|
+
|
|
294
|
+
**README Documentation:**
|
|
295
|
+
- Updated test count badge from 246 to 294 passing tests
|
|
296
|
+
- Updated "How Visus Works" pipeline diagram to show Content-Type Detection
|
|
297
|
+
- Added detailed content-type routing section explaining PDF, JSON, SVG handling
|
|
298
|
+
- Documented fail-safe error handling and structured response design
|
|
299
|
+
|
|
300
|
+
**Changelog:**
|
|
301
|
+
- Created `CHANGELOG.md` with v0.8.0 (Unreleased) section
|
|
302
|
+
- Detailed entries for PDF, JSON, SVG handlers with specifications
|
|
303
|
+
- Notes on content-type routing and test coverage
|
|
304
|
+
|
|
305
|
+
**Lessons Learned:**
|
|
306
|
+
1. **Interface Design**: Preserve all metadata when wrapping existing functionality
|
|
307
|
+
2. **Type Safety**: TypeScript strict mode caught interface mismatches early
|
|
308
|
+
3. **Test Coverage**: Existing tests immediately caught metadata loss
|
|
309
|
+
4. **Aggregation Pattern**: Use Sets to deduplicate findings in recursive sanitization
|
|
7
310
|
|
|
8
311
|
---
|
|
9
312
|
|
|
@@ -266,7 +569,7 @@ When prompt injection or PII is detected, Visus now automatically generates stru
|
|
|
266
569
|
**Key Features:**
|
|
267
570
|
- ✅ TOON-formatted findings array (token-efficient, machine-readable)
|
|
268
571
|
- ✅ Markdown compliance report (human-readable, renders in Claude Desktop)
|
|
269
|
-
- ✅
|
|
572
|
+
- ✅ Six framework alignments: OWASP LLM Top 10, NIST AI 600-1, NIST AI RMF, NIST CSF 2.0, MITRE ATLAS, ISO/IEC 42001
|
|
270
573
|
- ✅ Severity classification (CRITICAL, HIGH, MEDIUM, LOW, CLEAN)
|
|
271
574
|
- ✅ Zero overhead for clean pages (report omitted when no findings)
|
|
272
575
|
- ✅ Aggregated reporting across multiple results (search, structured extraction)
|
|
@@ -292,6 +595,8 @@ When prompt injection or PII is detected, Visus now automatically generates stru
|
|
|
292
595
|
**Framework Alignments:**
|
|
293
596
|
- **OWASP LLM Top 10 (2025)**: Industry-standard LLM security risks
|
|
294
597
|
- **NIST AI 600-1**: Generative AI Profile for risk management
|
|
598
|
+
- **NIST AI RMF**: AI Risk Management Framework (AI 100-1) with GOVERN, MAP, MEASURE, MANAGE functions
|
|
599
|
+
- **NIST CSF 2.0**: Cybersecurity Framework 2.0 with IDENTIFY, PROTECT, DETECT, RESPOND, RECOVER, GOVERN functions
|
|
295
600
|
- **MITRE ATLAS**: Adversarial Threat Landscape for AI Systems
|
|
296
601
|
- **ISO/IEC 42001:2023**: International AI Management System standard (Annex A controls)
|
|
297
602
|
|
|
@@ -746,9 +1051,9 @@ Visus is a security-first MCP tool that provides Claude with sanitized web page
|
|
|
746
1051
|
|
|
747
1052
|
### ✅ Test Execution
|
|
748
1053
|
- **Status:** SUCCESS - All tests passing
|
|
749
|
-
- **Test Results:**
|
|
750
|
-
- **Test Suites:**
|
|
751
|
-
- **Execution Time:** ~7.
|
|
1054
|
+
- **Test Results:** 294/294 tests passing (100%)
|
|
1055
|
+
- **Test Suites:** 8/8 passing
|
|
1056
|
+
- **Execution Time:** ~7.5 seconds
|
|
752
1057
|
- **Test Files:**
|
|
753
1058
|
- `tests/sanitizer.test.ts` - PASS (43 pattern categories + 5 threat report integration tests)
|
|
754
1059
|
- `tests/fetch-tool.test.ts` - PASS (all MCP tool functions + annotations + 2 threat report tests + 14 format detection tests) - **v0.6.0**
|
|
@@ -757,8 +1062,9 @@ Visus is a security-first MCP tool that provides Claude with sanitized web page
|
|
|
757
1062
|
- `tests/auth-smoke.test.ts` - PASS (24 auth enforcement tests) - **v0.3.1**
|
|
758
1063
|
- `tests/reader.test.ts` - PASS (14 reader mode tests) - **v0.3.2**
|
|
759
1064
|
- `tests/search.test.ts` - PASS (18 search tests) - **v0.4.0**
|
|
1065
|
+
- `tests/content-handlers.test.ts` - PASS (20 content handler tests) - **v0.8.0**
|
|
760
1066
|
- `tests/injection-corpus.ts` - Test data library
|
|
761
|
-
- **Coverage:** All 43 injection pattern categories + PII allowlist + authentication enforcement + reader mode + safe web search + security fixes + threat reporting with framework mappings + Content-Type format detection (JSON, XML, RSS/Atom) validated
|
|
1067
|
+
- **Coverage:** All 43 injection pattern categories + PII allowlist + authentication enforcement + reader mode + safe web search + security fixes + threat reporting with framework mappings + Content-Type format detection (JSON, XML, RSS/Atom) + Content handlers (PDF, JSON, SVG) validated
|
|
762
1068
|
|
|
763
1069
|
---
|
|
764
1070
|
|
|
@@ -1580,13 +1886,13 @@ npm URL: https://www.npmjs.com/package/visus-mcp
|
|
|
1580
1886
|
**Contact:** security@lateos.ai
|
|
1581
1887
|
**Repository:** https://github.com/visus-mcp/visus-mcp
|
|
1582
1888
|
**npm Package:** https://www.npmjs.com/package/visus-mcp
|
|
1583
|
-
**Installation:** `npm install -g visus-mcp@0.
|
|
1889
|
+
**Installation:** `npm install -g visus-mcp@0.8.1` or `npx visus-mcp@0.8.1`
|
|
1584
1890
|
|
|
1585
1891
|
---
|
|
1586
1892
|
|
|
1587
|
-
**Last Updated:** 2026-03-
|
|
1893
|
+
**Last Updated:** 2026-03-25
|
|
1588
1894
|
**Build:** SUCCESS ✅
|
|
1589
|
-
**Tests:**
|
|
1895
|
+
**Tests:** 294/294 PASSING ✅
|
|
1590
1896
|
**CDK Deploy:** SUCCESS ✅
|
|
1591
1897
|
**Phase 1:** ✅ PUBLISHED TO NPM (v0.1.0)
|
|
1592
1898
|
**Phase 2:** ✅ DEPLOYED TO AWS LAMBDA (us-east-1)
|
|
@@ -1597,6 +1903,8 @@ npm URL: https://www.npmjs.com/package/visus-mcp
|
|
|
1597
1903
|
**v0.5.0:** ✅ PUBLISHED TO NPM (Threat Reporting + ISO/IEC 42001 - 31 tests added)
|
|
1598
1904
|
**v0.6.0:** ✅ PUBLISHED TO NPM (Content-Type Format Detection - 14 tests added)
|
|
1599
1905
|
**v0.7.0:** ✅ COMPLETE (HITL Elicitation Bridge for CRITICAL threats - 30 tests added)
|
|
1906
|
+
**v0.8.0:** ✅ PUBLISHED TO NPM (PDF/JSON/SVG Content Handlers - 48 tests added)
|
|
1907
|
+
**v0.8.1:** ✅ COMPLETE (PDF Extraction Bug Fix - binary content handling)
|
|
1600
1908
|
**Security Audit:** ✅ COMPLETE + REMEDIATED (24 auth tests, 100% compliance)
|
|
1601
1909
|
**Lambda Endpoint:** [API_ENDPOINT]
|
|
1602
|
-
**Latest Release:** v0.
|
|
1910
|
+
**Latest Release:** v0.8.0 (2026-03-25)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright-renderer.d.ts","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"playwright-renderer.d.ts","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyO/D;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAClC,GACL,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAuB7C;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,SAAO,GAChB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAwBjC;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
|
|
@@ -88,6 +88,8 @@ async function renderWithLambda(url, timeout_ms) {
|
|
|
88
88
|
return Err(new Error(`Lambda renderer error: ${body.error}`));
|
|
89
89
|
}
|
|
90
90
|
// Success response
|
|
91
|
+
// TODO: Lambda renderer needs PDF support - should return binary content as base64
|
|
92
|
+
// for application/pdf responses instead of always converting to HTML string
|
|
91
93
|
return Ok({
|
|
92
94
|
html: body.html,
|
|
93
95
|
title: body.title,
|
|
@@ -127,15 +129,35 @@ async function renderWithFetch(url, timeout_ms) {
|
|
|
127
129
|
if (!response.ok) {
|
|
128
130
|
return Err(new Error(`HTTP ${response.status}: ${response.statusText}`));
|
|
129
131
|
}
|
|
130
|
-
|
|
131
|
-
// Capture Content-Type header
|
|
132
|
+
// Capture Content-Type header before reading body
|
|
132
133
|
const contentTypeHeader = response.headers.get('content-type');
|
|
133
134
|
const contentType = contentTypeHeader
|
|
134
135
|
? contentTypeHeader.split(';')[0].trim() // Remove charset and other params
|
|
135
136
|
: 'text/html'; // Default to HTML if missing
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
const
|
|
137
|
+
// Read response body - use arrayBuffer() for binary types, text() for text types
|
|
138
|
+
// CRITICAL: pdf-parse requires original binary bytes, not UTF-8 string conversion
|
|
139
|
+
const isBinary = contentType === 'application/pdf' ||
|
|
140
|
+
contentType.startsWith('image/') ||
|
|
141
|
+
contentType.startsWith('application/octet-stream');
|
|
142
|
+
let html;
|
|
143
|
+
let title = '';
|
|
144
|
+
if (isBinary) {
|
|
145
|
+
// Binary content (PDF, images, etc.) - preserve byte integrity
|
|
146
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
147
|
+
html = Buffer.from(arrayBuffer);
|
|
148
|
+
// Title extraction not meaningful for binary content
|
|
149
|
+
title = '';
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Text content (HTML, JSON, etc.) - read as UTF-8 string
|
|
153
|
+
const textContent = await response.text();
|
|
154
|
+
html = textContent;
|
|
155
|
+
// Extract title using regex (HTML only)
|
|
156
|
+
if (contentType.includes('html')) {
|
|
157
|
+
const titleMatch = textContent.match(/<title[^>]*>(.*?)<\/title>/i);
|
|
158
|
+
title = titleMatch ? titleMatch[1].trim() : '';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
139
161
|
return Ok({
|
|
140
162
|
html,
|
|
141
163
|
title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright-renderer.js","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"playwright-renderer.js","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Handlers Module
|
|
3
|
+
*
|
|
4
|
+
* Central routing for content-type specific sanitization handlers.
|
|
5
|
+
* Detects MIME type from Content-Type header and routes to appropriate handler.
|
|
6
|
+
*
|
|
7
|
+
* Supported content types:
|
|
8
|
+
* - application/pdf -> PDF handler
|
|
9
|
+
* - application/json -> JSON handler
|
|
10
|
+
* - image/svg+xml -> SVG handler
|
|
11
|
+
*
|
|
12
|
+
* Unsupported types return structured rejection (no throw).
|
|
13
|
+
*/
|
|
14
|
+
import type { HandlerResult } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Normalize Content-Type header to base MIME type
|
|
17
|
+
*
|
|
18
|
+
* Examples:
|
|
19
|
+
* - "application/pdf; charset=utf-8" -> "application/pdf"
|
|
20
|
+
* - "application/json" -> "application/json"
|
|
21
|
+
* - "IMAGE/SVG+XML" -> "image/svg+xml"
|
|
22
|
+
*
|
|
23
|
+
* @param contentType - Raw Content-Type header value
|
|
24
|
+
* @returns Normalized MIME type (lowercase, parameters stripped)
|
|
25
|
+
*/
|
|
26
|
+
export declare function normalizeMimeType(contentType: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Route content to appropriate handler based on MIME type
|
|
29
|
+
*
|
|
30
|
+
* @param content - Raw content (string or Buffer)
|
|
31
|
+
* @param contentType - Content-Type header value
|
|
32
|
+
* @returns Handler result (success or error/rejected)
|
|
33
|
+
*/
|
|
34
|
+
export declare function routeContentHandler(content: string | Buffer, contentType: string): Promise<HandlerResult>;
|
|
35
|
+
export type { HandlerResult, HandlerSuccessResult, HandlerErrorResult } from './types.js';
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content-handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAGD,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content Handlers Module
|
|
3
|
+
*
|
|
4
|
+
* Central routing for content-type specific sanitization handlers.
|
|
5
|
+
* Detects MIME type from Content-Type header and routes to appropriate handler.
|
|
6
|
+
*
|
|
7
|
+
* Supported content types:
|
|
8
|
+
* - application/pdf -> PDF handler
|
|
9
|
+
* - application/json -> JSON handler
|
|
10
|
+
* - image/svg+xml -> SVG handler
|
|
11
|
+
*
|
|
12
|
+
* Unsupported types return structured rejection (no throw).
|
|
13
|
+
*/
|
|
14
|
+
import { handlePdf } from './pdf-handler.js';
|
|
15
|
+
import { handleJson } from './json-handler.js';
|
|
16
|
+
import { handleSvg } from './svg-handler.js';
|
|
17
|
+
/**
|
|
18
|
+
* Normalize Content-Type header to base MIME type
|
|
19
|
+
*
|
|
20
|
+
* Examples:
|
|
21
|
+
* - "application/pdf; charset=utf-8" -> "application/pdf"
|
|
22
|
+
* - "application/json" -> "application/json"
|
|
23
|
+
* - "IMAGE/SVG+XML" -> "image/svg+xml"
|
|
24
|
+
*
|
|
25
|
+
* @param contentType - Raw Content-Type header value
|
|
26
|
+
* @returns Normalized MIME type (lowercase, parameters stripped)
|
|
27
|
+
*/
|
|
28
|
+
export function normalizeMimeType(contentType) {
|
|
29
|
+
return contentType.toLowerCase().split(';')[0].trim();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Route content to appropriate handler based on MIME type
|
|
33
|
+
*
|
|
34
|
+
* @param content - Raw content (string or Buffer)
|
|
35
|
+
* @param contentType - Content-Type header value
|
|
36
|
+
* @returns Handler result (success or error/rejected)
|
|
37
|
+
*/
|
|
38
|
+
export async function routeContentHandler(content, contentType) {
|
|
39
|
+
const mimeType = normalizeMimeType(contentType);
|
|
40
|
+
// Route to appropriate handler
|
|
41
|
+
switch (mimeType) {
|
|
42
|
+
case 'application/pdf':
|
|
43
|
+
return handlePdf(content, mimeType);
|
|
44
|
+
case 'application/json':
|
|
45
|
+
case 'text/json':
|
|
46
|
+
return handleJson(content, mimeType);
|
|
47
|
+
case 'image/svg+xml':
|
|
48
|
+
return handleSvg(content, mimeType);
|
|
49
|
+
default:
|
|
50
|
+
// Unsupported content type - return structured rejection
|
|
51
|
+
return {
|
|
52
|
+
status: 'rejected',
|
|
53
|
+
reason: 'UNSUPPORTED_CONTENT_TYPE',
|
|
54
|
+
mime: mimeType,
|
|
55
|
+
message: `Content type ${mimeType} is not supported by Visus-MCP.`
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content-handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAwB,EACxB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEhD,+BAA+B;IAC/B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEtC,KAAK,kBAAkB,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEvC,KAAK,eAAe;YAClB,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEtC;YACE,yDAAyD;YACzD,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,0BAA0B;gBAClC,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,gBAAgB,QAAQ,iCAAiC;aACnE,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Content Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles application/json content type. Recursively traverses all nodes in the JSON
|
|
5
|
+
* object tree and applies the full injection pattern registry to every string value.
|
|
6
|
+
*
|
|
7
|
+
* What it handles:
|
|
8
|
+
* - All string values in the JSON tree (any depth)
|
|
9
|
+
* - Arrays, nested objects, and mixed-type arrays
|
|
10
|
+
* - Falls back to plain text pipeline if JSON.parse fails
|
|
11
|
+
*
|
|
12
|
+
* What it strips:
|
|
13
|
+
* - Nothing (preserves original structure)
|
|
14
|
+
*
|
|
15
|
+
* What it passes through:
|
|
16
|
+
* - Sanitized JSON with original structure preserved
|
|
17
|
+
* - All non-string values pass through unchanged
|
|
18
|
+
*/
|
|
19
|
+
import type { HandlerResult } from './types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Handle JSON content
|
|
22
|
+
*
|
|
23
|
+
* @param content - Raw JSON string
|
|
24
|
+
* @param mimeType - Original MIME type
|
|
25
|
+
* @returns Sanitized handler result
|
|
26
|
+
*/
|
|
27
|
+
export declare function handleJson(content: string | Buffer, mimeType: string): HandlerResult;
|
|
28
|
+
//# sourceMappingURL=json-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-handler.d.ts","sourceRoot":"","sources":["../../src/content-handlers/json-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,QAAQ,EAAE,MAAM,GACf,aAAa,CAoEf"}
|