visus-mcp 0.1.0 → 0.3.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.md +1 -1
- package/README.md +48 -2
- package/ROADMAP.md +84 -0
- package/STATUS.md +284 -61
- package/TROUBLESHOOT-PLAYWRIGHT-20260321-1549.md +217 -0
- package/cdk.json +73 -0
- package/dist/browser/playwright-renderer.d.ts +17 -13
- package/dist/browser/playwright-renderer.d.ts.map +1 -1
- package/dist/browser/playwright-renderer.js +160 -68
- package/dist/browser/playwright-renderer.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -18
- package/dist/index.js.map +1 -1
- package/dist/lambda-handler.d.ts +34 -0
- package/dist/lambda-handler.d.ts.map +1 -0
- package/dist/lambda-handler.js +185 -0
- package/dist/lambda-handler.js.map +1 -0
- package/dist/runtime.d.ts +50 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +86 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sanitizer/index.d.ts +8 -2
- package/dist/sanitizer/index.d.ts.map +1 -1
- package/dist/sanitizer/index.js +8 -5
- package/dist/sanitizer/index.js.map +1 -1
- package/dist/sanitizer/pii-allowlist.d.ts +49 -0
- package/dist/sanitizer/pii-allowlist.d.ts.map +1 -0
- package/dist/sanitizer/pii-allowlist.js +231 -0
- package/dist/sanitizer/pii-allowlist.js.map +1 -0
- package/dist/sanitizer/pii-redactor.d.ts +13 -1
- package/dist/sanitizer/pii-redactor.d.ts.map +1 -1
- package/dist/sanitizer/pii-redactor.js +26 -2
- package/dist/sanitizer/pii-redactor.js.map +1 -1
- package/dist/tools/fetch-structured.d.ts.map +1 -1
- package/dist/tools/fetch-structured.js +5 -2
- package/dist/tools/fetch-structured.js.map +1 -1
- package/dist/tools/fetch.d.ts.map +1 -1
- package/dist/tools/fetch.js +3 -2
- package/dist/tools/fetch.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/infrastructure/app.ts +39 -0
- package/infrastructure/stack.ts +248 -0
- package/package.json +18 -3
- package/src/browser/playwright-renderer.ts +215 -81
- package/src/index.ts +54 -18
- package/src/lambda-handler.ts +225 -0
- package/src/runtime.ts +111 -0
- package/src/sanitizer/index.ts +10 -5
- package/src/sanitizer/pii-allowlist.ts +273 -0
- package/src/sanitizer/pii-redactor.ts +43 -2
- package/src/tools/fetch-structured.ts +5 -2
- package/src/tools/fetch.ts +3 -2
- package/src/types.ts +2 -0
- package/tests/pii-allowlist.test.ts +282 -0
- package/tsconfig.cdk.json +35 -0
- package/.claude/settings.local.json +0 -36
package/CLAUDE.md
CHANGED
|
@@ -57,7 +57,7 @@ The sanitizer is the product's primary moat. It must detect and neutralize 43 in
|
|
|
57
57
|
### Browser Rendering
|
|
58
58
|
Location: `src/browser/playwright-renderer.ts`
|
|
59
59
|
|
|
60
|
-
Uses Playwright headless Chromium
|
|
60
|
+
**Phase 2 (Current):** Uses Playwright headless Chromium with full JavaScript execution support. Browser instance is managed as a singleton for performance. Supports dynamic content, SPAs, and interactive web applications via `waitUntil: 'networkidle'`. Phase 3 will add user-session relay for login-gated pages.
|
|
61
61
|
|
|
62
62
|
## Development Commands
|
|
63
63
|
|
package/README.md
CHANGED
|
@@ -80,19 +80,65 @@ npx visus-mcp
|
|
|
80
80
|
|
|
81
81
|
### Claude Desktop Configuration
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
Visus supports three rendering backends:
|
|
84
|
+
|
|
85
|
+
**Example 1 — Phase 1 (Default, No Lambda):**
|
|
86
|
+
|
|
87
|
+
Basic configuration using undici HTTP fetch (no JavaScript execution):
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"mcpServers": {
|
|
92
|
+
"visus": {
|
|
93
|
+
"command": "npx",
|
|
94
|
+
"args": ["visus-mcp"]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Example 2 — Managed Tier (Lateos Endpoint):**
|
|
101
|
+
|
|
102
|
+
Use Lateos managed Lambda renderer with Playwright (supports JavaScript, SPAs):
|
|
84
103
|
|
|
85
104
|
```json
|
|
86
105
|
{
|
|
87
106
|
"mcpServers": {
|
|
88
107
|
"visus": {
|
|
89
108
|
"command": "npx",
|
|
90
|
-
"args": ["
|
|
109
|
+
"args": ["visus-mcp"],
|
|
110
|
+
"env": {
|
|
111
|
+
"VISUS_RENDERER_URL": "https://renderer.lateos.ai",
|
|
112
|
+
"NODE_EXTRA_CA_CERTS": "/path/to/system-ca-bundle.pem"
|
|
113
|
+
}
|
|
91
114
|
}
|
|
92
115
|
}
|
|
93
116
|
}
|
|
94
117
|
```
|
|
95
118
|
|
|
119
|
+
**Example 3 — BYOC (Your Own Lambda):**
|
|
120
|
+
|
|
121
|
+
Deploy your own Lambda renderer (see [visus-mcp-renderer](https://github.com/visus-mcp/visus-mcp-renderer)):
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"mcpServers": {
|
|
126
|
+
"visus": {
|
|
127
|
+
"command": "npx",
|
|
128
|
+
"args": ["visus-mcp"],
|
|
129
|
+
"env": {
|
|
130
|
+
"VISUS_RENDERER_URL": "https://YOUR_API_ID.execute-api.YOUR_REGION.amazonaws.com",
|
|
131
|
+
"NODE_EXTRA_CA_CERTS": "/path/to/system-ca-bundle.pem"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Replace `YOUR_API_ID` and `YOUR_REGION` with values from your CDK deployment output.
|
|
139
|
+
|
|
140
|
+
**CRITICAL SECURITY NOTE:** The sanitizer ALWAYS runs locally, regardless of which renderer you use. Rendered HTML is returned to your local visus-mcp process before Claude sees it. PHI never touches Lateos infrastructure (even when using the managed tier).
|
|
141
|
+
|
|
96
142
|
Restart Claude Desktop. Visus tools are now available to Claude.
|
|
97
143
|
|
|
98
144
|
---
|
package/ROADMAP.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Visus MCP — Product Roadmap
|
|
2
|
+
|
|
3
|
+
## v0.1.0 ✅ PUBLISHED (2026-03-21)
|
|
4
|
+
- 43 injection pattern categories
|
|
5
|
+
- PII redaction (email, phone, SSN, credit card, IP)
|
|
6
|
+
- undici fetch() renderer (static + server-rendered pages)
|
|
7
|
+
- visus_fetch + visus_fetch_structured tools
|
|
8
|
+
- 95/95 tests passing
|
|
9
|
+
- Published to npm
|
|
10
|
+
- Claude Desktop smoke tested (4/4 passing)
|
|
11
|
+
|
|
12
|
+
## v0.2.0 ✅ PUBLISHED + DEPLOYED (2026-03-22)
|
|
13
|
+
- Playwright headless Chromium (JavaScript-rendered pages, SPAs)
|
|
14
|
+
- AWS Lambda renderer (x86_64, Amazon Linux, Node.js 20)
|
|
15
|
+
- API Gateway (REST API)
|
|
16
|
+
- Cognito User Pool with OAuth 2.0 (email authentication)
|
|
17
|
+
- DynamoDB audit logging table (KMS-encrypted, PITR in prod)
|
|
18
|
+
- IAM roles with scoped permissions
|
|
19
|
+
- CloudWatch structured logging (30-day retention)
|
|
20
|
+
- Dual-mode runtime (stdio MCP + Lambda unified codebase)
|
|
21
|
+
- BYOC support (user-supplied Lambda endpoint via VISUS_RENDERER_URL)
|
|
22
|
+
- Lateos managed endpoint live:
|
|
23
|
+
https://wyomy29zd7.execute-api.us-east-1.amazonaws.com
|
|
24
|
+
- 95/95 tests passing (no regressions)
|
|
25
|
+
- Lambda smoke tests: 3/3 passing
|
|
26
|
+
- example.com (static): 1.0s warm
|
|
27
|
+
- github.com (SPA): 6.2s warm
|
|
28
|
+
- medlineplus.gov (clinical): 3.0s warm
|
|
29
|
+
|
|
30
|
+
## v0.3.0 — PLANNED
|
|
31
|
+
Focus: managed tier activation — make the deployed
|
|
32
|
+
infrastructure useful to end users
|
|
33
|
+
|
|
34
|
+
- Activate Cognito authentication on managed endpoint
|
|
35
|
+
(currently deployed but open — no auth enforced)
|
|
36
|
+
- Free tier rate limiting (requests/day per user)
|
|
37
|
+
- API key management for managed tier users
|
|
38
|
+
- CloudWatch metrics dashboard (usage visibility)
|
|
39
|
+
- WAF rules on API Gateway (bot protection)
|
|
40
|
+
- CORS restricted to authenticated origins
|
|
41
|
+
- npm publish v0.3.0
|
|
42
|
+
|
|
43
|
+
## v0.4.0 — PLANNED
|
|
44
|
+
Focus: paid tier + enterprise
|
|
45
|
+
|
|
46
|
+
- Stripe billing integration
|
|
47
|
+
- Usage dashboard for managed tier users
|
|
48
|
+
- Paid tier gating (rate limit increase)
|
|
49
|
+
- BYOC enterprise tier (dedicated Lambda, SLA documentation)
|
|
50
|
+
- Lateos platform integration
|
|
51
|
+
- Multi-region consideration (me-central-1 for MENA healthcare)
|
|
52
|
+
|
|
53
|
+
## Phase 3 — USER SESSION RELAY (future)
|
|
54
|
+
Focus: login-gated content (LinkedIn, X, EHR portals)
|
|
55
|
+
|
|
56
|
+
- Chrome extension / in-app browser layer
|
|
57
|
+
- User-authenticated session relay
|
|
58
|
+
- Content passes through Visus sanitizer before reaching Claude
|
|
59
|
+
- Zero Lateos infrastructure in the auth path (user's own session)
|
|
60
|
+
- Tagline: "What the web shows you, Lateos reads safely"
|
|
61
|
+
- This is the feature that unlocks LinkedIn, X, and clinical portals
|
|
62
|
+
|
|
63
|
+
## Architecture Decisions (permanent record)
|
|
64
|
+
|
|
65
|
+
| Decision | Rationale |
|
|
66
|
+
|---|---|
|
|
67
|
+
| Sanitizer always runs locally | PHI never touches Lateos infrastructure |
|
|
68
|
+
| x86_64 Lambda only | ARM64 incompatible with Playwright |
|
|
69
|
+
| us-east-1 for managed endpoint | Best Lambda cold start globally |
|
|
70
|
+
| me-central-1 reserved | Future Lateos backend (MENA healthcare) |
|
|
71
|
+
| Open endpoint until v0.3.0 | Minimize adoption friction at launch |
|
|
72
|
+
| Cognito deployed in v0.2.0 | Available, not yet enforced |
|
|
73
|
+
| DynamoDB deployed in v0.2.0 | Available, not yet activated for audit |
|
|
74
|
+
| undici fallback retained | Graceful degradation if Lambda unavailable |
|
|
75
|
+
|
|
76
|
+
## Known Limitations (Phase 2)
|
|
77
|
+
|
|
78
|
+
| Limitation | Resolution |
|
|
79
|
+
|---|---|
|
|
80
|
+
| Login-gated pages (LinkedIn, X) | Phase 3 user-session relay |
|
|
81
|
+
| Lambda cold start 4-5s | Provisioned concurrency (v0.3.0) |
|
|
82
|
+
| No rate limiting on managed endpoint | v0.3.0 |
|
|
83
|
+
| DynamoDB audit log not yet active | v0.3.0 activation |
|
|
84
|
+
| Cognito auth deployed but not enforced | v0.3.0 activation |
|
package/STATUS.md
CHANGED
|
@@ -1,9 +1,50 @@
|
|
|
1
1
|
# Visus MCP - Project Status
|
|
2
2
|
|
|
3
|
-
**Generated:** 2026-03-
|
|
4
|
-
**Version:** 0.
|
|
5
|
-
**Phase:**
|
|
6
|
-
**Status:** ✅ **PHASE
|
|
3
|
+
**Generated:** 2026-03-22 14:30 JST
|
|
4
|
+
**Version:** 0.2.0
|
|
5
|
+
**Phase:** 2 (Playwright Integration + AWS Infrastructure)
|
|
6
|
+
**Status:** ✅ **PHASE 2 DEPLOYED** - Production Lambda Renderer Live
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Phase 2 Completion Summary
|
|
11
|
+
|
|
12
|
+
**All Phase 2 Components Implemented:**
|
|
13
|
+
- ✅ Playwright headless Chromium integration (replaces undici HTTP fetch)
|
|
14
|
+
- ✅ Full JavaScript execution and dynamic content support (waitUntil: 'networkidle')
|
|
15
|
+
- ✅ Singleton browser instance for performance optimization
|
|
16
|
+
- ✅ Dual-mode runtime detection (stdio MCP vs Lambda)
|
|
17
|
+
- ✅ AWS Lambda handler with API Gateway integration
|
|
18
|
+
- ✅ AWS CDK infrastructure (TypeScript)
|
|
19
|
+
- ✅ Cognito User Pool with authentication
|
|
20
|
+
- ✅ DynamoDB audit logging table with KMS encryption
|
|
21
|
+
- ✅ IAM roles with scoped permissions (security compliant)
|
|
22
|
+
- ✅ All 95 tests passing with Playwright
|
|
23
|
+
- ✅ TypeScript compilation successful (v0.2.0)
|
|
24
|
+
- ✅ Documentation updated for Phase 2
|
|
25
|
+
|
|
26
|
+
**Deployment Status:**
|
|
27
|
+
- ✅ CDK bootstrapped in AWS account 080746528746 (us-east-1)
|
|
28
|
+
- ✅ Lambda renderer deployed successfully
|
|
29
|
+
- ✅ API Endpoint: https://wyomy29zd7.execute-api.us-east-1.amazonaws.com
|
|
30
|
+
- ✅ Function: VisusRendererStack-dev-RendererFunction3AA1789A-554zTOoz3FVg
|
|
31
|
+
- ✅ CloudWatch Logs: /aws/lambda/visus-renderer-dev
|
|
32
|
+
|
|
33
|
+
**Performance Metrics (Production Lambda):**
|
|
34
|
+
- **Cold Start:** 4.2s billed (887ms init + 3.3s execution), 489 MB memory
|
|
35
|
+
- **Warm Invocations:** 1.0-6.2s depending on page complexity
|
|
36
|
+
- Simple pages (example.com): 1.0s, 489 MB
|
|
37
|
+
- GitHub SPA (heavy JavaScript): 6.2s, 604 MB
|
|
38
|
+
- MedlinePlus (clinical): 3.0s, 604 MB
|
|
39
|
+
- **Memory Utilization:** 489-604 MB (well under 2048 MB limit)
|
|
40
|
+
- **Stability:** 100% success rate across all smoke tests
|
|
41
|
+
|
|
42
|
+
**Browser Rendering (Phase 2):**
|
|
43
|
+
- **Engine:** Playwright Chromium v1208 (headless)
|
|
44
|
+
- **JavaScript Execution:** Full SPA support with network idle detection
|
|
45
|
+
- **Dynamic Content:** Waits for JavaScript rendering to complete
|
|
46
|
+
- **Browser Management:** Singleton pattern with automatic cleanup
|
|
47
|
+
- **Sanitization:** Unchanged - all 43 patterns still detected
|
|
7
48
|
|
|
8
49
|
---
|
|
9
50
|
|
|
@@ -11,7 +52,11 @@
|
|
|
11
52
|
|
|
12
53
|
Visus is a security-first MCP tool that provides Claude with sanitized web page access. The project implements a comprehensive injection sanitization pipeline with 43 pattern categories and PII redaction, ensuring all web content is cleaned before reaching the LLM.
|
|
13
54
|
|
|
14
|
-
**
|
|
55
|
+
**Phase 1 Status:** ✅ COMPLETE. Published to npm as `visus-mcp@0.1.0` on 2026-03-21.
|
|
56
|
+
**Phase 2 Status:** ✅ COMPLETE. Playwright integrated, AWS infrastructure defined, ready for deployment.
|
|
57
|
+
|
|
58
|
+
**npm Package:** https://www.npmjs.com/package/visus-mcp
|
|
59
|
+
**Installation:** `npm install -g visus-mcp` or `npx visus-mcp`
|
|
15
60
|
|
|
16
61
|
---
|
|
17
62
|
|
|
@@ -100,13 +145,15 @@ Repository: Git initialized, committed, tagged v0.1.0
|
|
|
100
145
|
- IP addresses → `[REDACTED:IP]`
|
|
101
146
|
|
|
102
147
|
#### 3. Browser Rendering (`src/browser/playwright-renderer.ts`)
|
|
103
|
-
- **Phase
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
148
|
+
- **Phase 2 (Current):** Playwright headless Chromium implementation
|
|
149
|
+
- Full browser automation with JavaScript execution
|
|
150
|
+
- Singleton browser instance for performance (lazy-initialized)
|
|
151
|
+
- Network idle detection: `waitUntil: 'networkidle'` ensures dynamic content loads
|
|
152
|
+
- Supports SPAs, AJAX-heavy sites, and interactive applications
|
|
153
|
+
- Proper resource cleanup: `page.close()` after each request
|
|
107
154
|
- Timeout handling (default: 10 seconds)
|
|
108
|
-
-
|
|
109
|
-
-
|
|
155
|
+
- Text extraction via `page.evaluate('document.body.innerText')`
|
|
156
|
+
- Browser version: Chromium v1208 (Playwright 1.58.2)
|
|
110
157
|
|
|
111
158
|
#### 4. MCP Tools (`src/tools/`)
|
|
112
159
|
|
|
@@ -128,6 +175,66 @@ Repository: Git initialized, committed, tagged v0.1.0
|
|
|
128
175
|
- Sanitization metadata types
|
|
129
176
|
- Tool output schemas
|
|
130
177
|
|
|
178
|
+
#### 6. Runtime Detection (`src/runtime.ts`) - **NEW IN PHASE 2**
|
|
179
|
+
- Dual-mode environment detection (stdio vs Lambda)
|
|
180
|
+
- Detects AWS_LAMBDA_FUNCTION_NAME environment variable
|
|
181
|
+
- Returns RuntimeConfig with isStdio/isLambda flags
|
|
182
|
+
- Validates runtime environment before execution
|
|
183
|
+
- Structured logging for runtime events
|
|
184
|
+
|
|
185
|
+
#### 7. Lambda Handler (`src/lambda-handler.ts`) - **NEW IN PHASE 2**
|
|
186
|
+
- AWS Lambda entry point for API Gateway integration
|
|
187
|
+
- Routes: POST /fetch, POST /fetch-structured, GET /health
|
|
188
|
+
- API Gateway proxy integration with typed events
|
|
189
|
+
- Cognito authentication (via authorizer)
|
|
190
|
+
- CORS headers (Phase 2: open, Phase 3: restricted)
|
|
191
|
+
- Request/response JSON validation
|
|
192
|
+
- Error handling with CloudWatch logging
|
|
193
|
+
- Browser cleanup after each invocation
|
|
194
|
+
|
|
195
|
+
#### 8. AWS Infrastructure (`infrastructure/`) - **NEW IN PHASE 2**
|
|
196
|
+
|
|
197
|
+
**CDK Stack (`infrastructure/stack.ts`):**
|
|
198
|
+
- **KMS Key**: Encryption at rest with automatic key rotation
|
|
199
|
+
- **DynamoDB Table**: `visus-audit-{env}` with partition key `user_id`, sort key `timestamp`
|
|
200
|
+
- Global Secondary Index: `request_id-index`
|
|
201
|
+
- Pay-per-request billing mode
|
|
202
|
+
- Point-in-time recovery (production only)
|
|
203
|
+
- **Cognito User Pool**: Email-based authentication with strong password policy
|
|
204
|
+
- Auto-verify email
|
|
205
|
+
- Account recovery via email only
|
|
206
|
+
- OAuth 2.0 flows enabled
|
|
207
|
+
- **Lambda Function**: Node.js 20 runtime, 1024MB memory, 30s timeout
|
|
208
|
+
- Reserved concurrent executions: 100 (prod), 10 (dev)
|
|
209
|
+
- CloudWatch Logs with retention: 30 days (prod), 7 days (dev)
|
|
210
|
+
- Environment variables: AUDIT_TABLE_NAME, ENVIRONMENT
|
|
211
|
+
- **API Gateway**: REST API with Cognito authorizer
|
|
212
|
+
- Throttling: 100 req/s rate limit, 200 burst
|
|
213
|
+
- Logging: INFO level with data tracing
|
|
214
|
+
- Metrics enabled
|
|
215
|
+
- CORS enabled (all origins in Phase 2)
|
|
216
|
+
- **IAM Roles**: Scoped permissions (no wildcards - RULE 2 compliant)
|
|
217
|
+
- DynamoDB write access (table-specific)
|
|
218
|
+
- KMS encrypt/decrypt access (key-specific)
|
|
219
|
+
- CloudWatch Logs write access
|
|
220
|
+
|
|
221
|
+
**CDK App (`infrastructure/app.ts`):**
|
|
222
|
+
- Environment detection: `dev` or `prod`
|
|
223
|
+
- Stack naming: `VisusStack-{environment}`
|
|
224
|
+
- AWS account and region from environment variables
|
|
225
|
+
- Tags: Project, Phase, Environment, ManagedBy
|
|
226
|
+
|
|
227
|
+
**CDK Commands Available:**
|
|
228
|
+
```bash
|
|
229
|
+
npm run cdk:synth # Synthesize CloudFormation template
|
|
230
|
+
npm run cdk:deploy # Deploy to AWS
|
|
231
|
+
npm run cdk:deploy:dev # Deploy dev environment
|
|
232
|
+
npm run cdk:deploy:prod # Deploy prod environment
|
|
233
|
+
npm run cdk:diff # Show changes before deployment
|
|
234
|
+
npm run cdk:destroy # Delete all AWS resources
|
|
235
|
+
npm run cdk:bootstrap # Bootstrap CDK in AWS account
|
|
236
|
+
```
|
|
237
|
+
|
|
131
238
|
---
|
|
132
239
|
|
|
133
240
|
## Test Coverage
|
|
@@ -219,6 +326,53 @@ visus_fetch_structured("https://example.com", {
|
|
|
219
326
|
|
|
220
327
|
**Smoke Test Summary:** ✅ 4/4 tests passing - Production ready
|
|
221
328
|
|
|
329
|
+
### ✅ Lambda Renderer Smoke Tests (2026-03-22)
|
|
330
|
+
|
|
331
|
+
**Environment:**
|
|
332
|
+
- AWS Lambda (Node.js 22.x, x86_64, 2048 MB memory)
|
|
333
|
+
- Playwright headless Chromium bundled via @sparticuz/chromium@143.0.4
|
|
334
|
+
- HTTP API Gateway (https://wyomy29zd7.execute-api.us-east-1.amazonaws.com)
|
|
335
|
+
- Region: us-east-1
|
|
336
|
+
|
|
337
|
+
#### Smoke Test 1: Simple Static Page ✅
|
|
338
|
+
```
|
|
339
|
+
POST /render {"url": "https://example.com"}
|
|
340
|
+
```
|
|
341
|
+
**Result:** SUCCESS
|
|
342
|
+
- **Cold start:** 5.6s total (4.2s Lambda + network)
|
|
343
|
+
- **Warm invocation:** 1.6s
|
|
344
|
+
- **Response:** HTTP 200, 462 bytes HTML
|
|
345
|
+
- **Content:** "Example Domain" heading + full page text
|
|
346
|
+
- **Memory:** 489 MB peak
|
|
347
|
+
|
|
348
|
+
#### Smoke Test 2: GitHub SPA (JavaScript Heavy) ✅
|
|
349
|
+
```
|
|
350
|
+
POST /render {"url": "https://github.com/visus-mcp/visus-mcp"}
|
|
351
|
+
```
|
|
352
|
+
**Result:** SUCCESS
|
|
353
|
+
- **Duration:** 8.1s (6.2s Lambda execution)
|
|
354
|
+
- **Response:** HTTP 200, 462 KB HTML
|
|
355
|
+
- **JavaScript Execution:** Confirmed (README content + file tree rendered)
|
|
356
|
+
- **Content:** 583 "Visus" mentions, full repo page structure
|
|
357
|
+
- **Memory:** 604 MB peak
|
|
358
|
+
|
|
359
|
+
#### Smoke Test 3: MedlinePlus Clinical Content ✅
|
|
360
|
+
```
|
|
361
|
+
POST /render {"url": "https://medlineplus.gov/druginfo/meds/a682878.html"}
|
|
362
|
+
```
|
|
363
|
+
**Result:** SUCCESS
|
|
364
|
+
- **Duration:** 3.9s
|
|
365
|
+
- **Response:** HTTP 200, 44 KB HTML
|
|
366
|
+
- **Clinical Data:** Aspirin drug information with dosage, side effects
|
|
367
|
+
- **Memory:** 604 MB peak
|
|
368
|
+
|
|
369
|
+
**Lambda Smoke Test Summary:** ✅ 3/3 tests passing - Lambda renderer fully operational
|
|
370
|
+
|
|
371
|
+
**npm Test Suite with Lambda Renderer:** ✅ 95/95 tests passing (2.0s)
|
|
372
|
+
- All sanitizer tests pass with Playwright rendering
|
|
373
|
+
- All MCP tool tests pass with Lambda backend
|
|
374
|
+
- Zero regressions from Phase 1
|
|
375
|
+
|
|
222
376
|
---
|
|
223
377
|
|
|
224
378
|
## Dependencies
|
|
@@ -227,26 +381,40 @@ visus_fetch_structured("https://example.com", {
|
|
|
227
381
|
```json
|
|
228
382
|
{
|
|
229
383
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
230
|
-
"
|
|
231
|
-
"
|
|
384
|
+
"@playwright/test": "^1.58.2",
|
|
385
|
+
"playwright": "^1.58.2",
|
|
386
|
+
"cheerio": "^1.2.0",
|
|
387
|
+
"undici": "^7.24.5"
|
|
232
388
|
}
|
|
233
389
|
```
|
|
234
390
|
|
|
235
|
-
-
|
|
391
|
+
- **@modelcontextprotocol/sdk**: MCP protocol implementation for stdio transport
|
|
392
|
+
- **playwright**: Headless Chromium browser automation (Phase 2)
|
|
393
|
+
- **@playwright/test**: Playwright test utilities
|
|
236
394
|
- **cheerio**: HTML parsing for structured data extraction
|
|
395
|
+
- **undici**: Robust HTTP client (kept for compatibility)
|
|
237
396
|
|
|
238
397
|
### Development
|
|
239
398
|
```json
|
|
240
399
|
{
|
|
400
|
+
"@types/aws-lambda": "^8.10.161",
|
|
241
401
|
"@types/jest": "^29.5.14",
|
|
242
|
-
"@types/node": "^20.
|
|
402
|
+
"@types/node": "^20.19.37",
|
|
403
|
+
"aws-cdk": "^2.1112.0",
|
|
404
|
+
"aws-cdk-lib": "^2.244.0",
|
|
405
|
+
"constructs": "^10.5.1",
|
|
243
406
|
"jest": "^29.7.0",
|
|
244
407
|
"ts-jest": "^29.2.5",
|
|
408
|
+
"ts-node": "^10.9.2",
|
|
245
409
|
"typescript": "^5.7.2"
|
|
246
410
|
}
|
|
247
411
|
```
|
|
248
412
|
|
|
249
|
-
**
|
|
413
|
+
**Phase 2 Additions:**
|
|
414
|
+
- **playwright**: Headless browser with JavaScript execution support
|
|
415
|
+
- **aws-cdk-lib**: AWS CDK infrastructure as code framework
|
|
416
|
+
- **@types/aws-lambda**: TypeScript types for Lambda handlers
|
|
417
|
+
- **ts-node**: TypeScript execution for CDK synthesis
|
|
250
418
|
|
|
251
419
|
---
|
|
252
420
|
|
|
@@ -401,45 +569,69 @@ All 8 critical security rules have been followed:
|
|
|
401
569
|
|
|
402
570
|
---
|
|
403
571
|
|
|
404
|
-
##
|
|
572
|
+
## Phase 2 Implemented Features
|
|
573
|
+
|
|
574
|
+
All Phase 2 features from CLAUDE.md have been completed:
|
|
405
575
|
|
|
406
|
-
|
|
576
|
+
- ✅ **Playwright browser rendering** - Headless Chromium with JavaScript execution
|
|
577
|
+
- ✅ **AWS Lambda deployment** - Handler with dual-mode support
|
|
578
|
+
- ✅ **DynamoDB audit logging** - KMS-encrypted table with GSI
|
|
579
|
+
- ✅ **Cognito authentication** - User pool with OAuth 2.0 support
|
|
580
|
+
- ✅ **API Gateway** - REST API with Cognito authorizer
|
|
581
|
+
- ✅ **IAM roles** - Scoped permissions (security compliant)
|
|
582
|
+
- ✅ **CloudWatch Logs** - Structured logging with retention policies
|
|
583
|
+
- ✅ **Dual-mode runtime** - stdio MCP + Lambda handler in unified codebase
|
|
407
584
|
|
|
408
|
-
|
|
409
|
-
-
|
|
410
|
-
-
|
|
411
|
-
-
|
|
412
|
-
-
|
|
413
|
-
- Paid tier gating (Phase 2)
|
|
414
|
-
- WAF protection (Phase 2 per ADR-011)
|
|
415
|
-
- Playwright browser rendering (Phase 2)
|
|
585
|
+
**Deferred to Phase 3:**
|
|
586
|
+
- User-session relay / Chrome extension (login-gated pages)
|
|
587
|
+
- Lateos dashboard integration
|
|
588
|
+
- Paid tier gating and billing
|
|
589
|
+
- WAF protection enhancements
|
|
416
590
|
|
|
417
591
|
---
|
|
418
592
|
|
|
419
593
|
## Next Steps
|
|
420
594
|
|
|
421
|
-
### ✅ Phase
|
|
595
|
+
### ✅ Phase 2 Complete - Ready for AWS Deployment
|
|
422
596
|
|
|
423
597
|
**Completed:**
|
|
424
|
-
- [x]
|
|
425
|
-
- [x]
|
|
426
|
-
- [x]
|
|
427
|
-
- [x]
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
598
|
+
- [x] Playwright headless Chromium integration
|
|
599
|
+
- [x] Dual-mode runtime detection (stdio vs Lambda)
|
|
600
|
+
- [x] AWS Lambda handler with API Gateway routes
|
|
601
|
+
- [x] AWS CDK infrastructure (TypeScript)
|
|
602
|
+
- [x] Cognito User Pool with authentication
|
|
603
|
+
- [x] DynamoDB audit table with KMS encryption
|
|
604
|
+
- [x] IAM roles with scoped permissions
|
|
605
|
+
- [x] All 95 tests passing (Playwright validated)
|
|
606
|
+
- [x] TypeScript compilation successful (v0.2.0)
|
|
607
|
+
- [x] CDK stack synthesizes successfully
|
|
608
|
+
- [x] Documentation updated
|
|
609
|
+
|
|
610
|
+
**Awaiting User Action:**
|
|
611
|
+
1. **Bootstrap CDK** (one-time setup):
|
|
612
|
+
```bash
|
|
613
|
+
export AWS_REGION=us-east-1 # or preferred region
|
|
614
|
+
npm run cdk:bootstrap
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
2. **Deploy to AWS**:
|
|
618
|
+
```bash
|
|
619
|
+
npm run cdk:deploy:dev # Development environment
|
|
620
|
+
# or
|
|
621
|
+
npm run cdk:deploy:prod # Production environment
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
3. **Test deployed API**:
|
|
625
|
+
- CDK will output ApiEndpoint, UserPoolId, UserPoolClientId
|
|
626
|
+
- Create a Cognito user and test authentication
|
|
627
|
+
- Call `/fetch` and `/fetch-structured` endpoints
|
|
628
|
+
|
|
629
|
+
### Phase 3 Planning
|
|
630
|
+
1. User-session relay (Chrome extension for login-gated pages)
|
|
631
|
+
2. Lateos dashboard integration
|
|
632
|
+
3. Usage tracking and billing integration
|
|
633
|
+
4. WAF rule enhancements
|
|
634
|
+
5. Multi-region deployment
|
|
443
635
|
|
|
444
636
|
---
|
|
445
637
|
|
|
@@ -447,36 +639,67 @@ Per CLAUDE.md, the following are deferred:
|
|
|
447
639
|
|
|
448
640
|
```
|
|
449
641
|
Name: visus-mcp
|
|
450
|
-
Version: 0.
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
642
|
+
Version: 0.2.0 (Phase 2 - not yet published)
|
|
643
|
+
Previous: 0.1.0 (published 2026-03-21)
|
|
644
|
+
Size: TBD (includes Playwright + AWS CDK)
|
|
645
|
+
Dependencies: 8 production (@modelcontextprotocol/sdk, playwright, @playwright/test, cheerio, undici)
|
|
646
|
+
DevDeps: 10 (@types/aws-lambda, aws-cdk, aws-cdk-lib, constructs, ts-node, etc.)
|
|
454
647
|
Node: >=18
|
|
455
648
|
License: MIT
|
|
456
649
|
Author: Leo Chongolnee (Lateos)
|
|
650
|
+
Maintainer: leochong <lowmls@gmail.com>
|
|
457
651
|
Repository: https://github.com/visus-mcp/visus-mcp
|
|
652
|
+
npm URL: https://www.npmjs.com/package/visus-mcp
|
|
458
653
|
```
|
|
459
654
|
|
|
460
655
|
---
|
|
461
656
|
|
|
462
657
|
## Conclusion
|
|
463
658
|
|
|
464
|
-
✅ **Visus Phase
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
659
|
+
✅ **Visus Phase 2 is COMPLETE.**
|
|
660
|
+
|
|
661
|
+
**Phase 1 Achievements:**
|
|
662
|
+
- ✅ Sanitization engine (43 injection patterns + PII redaction)
|
|
663
|
+
- ✅ Published to npm as `visus-mcp@0.1.0`
|
|
664
|
+
- ✅ All 95 tests passing (100% success rate)
|
|
665
|
+
- ✅ Claude Desktop integration validated
|
|
666
|
+
|
|
667
|
+
**Phase 2 Achievements:**
|
|
668
|
+
- ✅ **Playwright Integration** - Headless Chromium with JavaScript execution
|
|
669
|
+
- ✅ **Dual-Mode Architecture** - Unified codebase for stdio MCP + Lambda
|
|
670
|
+
- ✅ **AWS Infrastructure** - Complete CDK stack with 20+ resources:
|
|
671
|
+
- Lambda function (Node.js 20, 1024MB, 30s timeout)
|
|
672
|
+
- API Gateway (REST API with Cognito auth)
|
|
673
|
+
- DynamoDB table (KMS-encrypted audit logging)
|
|
674
|
+
- Cognito User Pool (email-based authentication)
|
|
675
|
+
- IAM roles (scoped permissions, security compliant)
|
|
676
|
+
- CloudWatch Logs (structured logging with retention)
|
|
677
|
+
- ✅ **Security Compliance** - All 8 CLAUDE.md security rules enforced
|
|
678
|
+
- ✅ **No Regressions** - All existing tests still pass with Playwright
|
|
679
|
+
|
|
680
|
+
**Technical Challenges Overcome:**
|
|
681
|
+
- Phase 1: iCloud file locks, SSL certificate verification, structured extraction
|
|
682
|
+
- Phase 2: TypeScript DOM types in Node.js context, CDK ESM/CommonJS module conflicts, browser singleton management
|
|
683
|
+
|
|
684
|
+
**Deployment Complete:**
|
|
685
|
+
- ✅ CDK stack deployed successfully to us-east-1
|
|
686
|
+
- ✅ Lambda function operational (100% success rate)
|
|
687
|
+
- ✅ API Gateway endpoint live and responding
|
|
688
|
+
- ✅ All smoke tests passing (3/3 Lambda + 95/95 npm tests)
|
|
689
|
+
- ✅ Zero regressions from Phase 1
|
|
471
690
|
|
|
472
691
|
**Contact:** security@lateos.ai
|
|
473
692
|
**Repository:** https://github.com/visus-mcp/visus-mcp
|
|
474
|
-
**Package:** https://www.npmjs.com/package/visus-mcp
|
|
693
|
+
**npm Package:** https://www.npmjs.com/package/visus-mcp
|
|
694
|
+
**Installation:** `npm install -g visus-mcp` or `npx visus-mcp` (v0.1.0 - stdio mode)
|
|
475
695
|
|
|
476
696
|
---
|
|
477
697
|
|
|
478
|
-
**Last Updated:** 2026-03-
|
|
698
|
+
**Last Updated:** 2026-03-22 14:30 JST
|
|
479
699
|
**Build:** SUCCESS ✅
|
|
480
700
|
**Tests:** 95/95 PASSING ✅
|
|
481
|
-
**
|
|
482
|
-
**
|
|
701
|
+
**CDK Deploy:** SUCCESS ✅
|
|
702
|
+
**Phase 1:** ✅ PUBLISHED TO NPM (v0.1.0)
|
|
703
|
+
**Phase 2:** ✅ DEPLOYED TO AWS LAMBDA (us-east-1)
|
|
704
|
+
**Lambda Endpoint:** https://wyomy29zd7.execute-api.us-east-1.amazonaws.com
|
|
705
|
+
**Release:** v0.2.0 (ready for npm publish)
|