visus-mcp 0.6.0 → 0.6.2

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 (147) hide show
  1. package/.claude/settings.local.json +42 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +47 -0
  3. package/.github/ISSUE_TEMPLATE/false_positive.md +43 -0
  4. package/.github/ISSUE_TEMPLATE/new_pattern.md +49 -0
  5. package/.github/ISSUE_TEMPLATE/security_report.md +31 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +39 -0
  7. package/.mcpregistry_github_token +1 -0
  8. package/.mcpregistry_registry_token +1 -0
  9. package/CLAUDE.md +197 -0
  10. package/CONTRIBUTING.md +329 -0
  11. package/README.md +111 -45
  12. package/STATUS.md +167 -29
  13. package/SUBMISSION.md +66 -0
  14. package/TROUBLESHOOT-COGNITO-AUTH-20260324-2029.md +415 -0
  15. package/TROUBLESHOOT-COGNITO-JWT-20260324.md +592 -0
  16. package/dist/browser/playwright-renderer.d.ts.map +1 -1
  17. package/dist/browser/playwright-renderer.js +71 -51
  18. package/dist/browser/playwright-renderer.js.map +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +49 -6
  21. package/dist/index.js.map +1 -1
  22. package/dist/sanitizer/elicit-runner.d.ts +48 -0
  23. package/dist/sanitizer/elicit-runner.d.ts.map +1 -0
  24. package/dist/sanitizer/elicit-runner.js +100 -0
  25. package/dist/sanitizer/elicit-runner.js.map +1 -0
  26. package/dist/sanitizer/framework-mapper.d.ts +2 -0
  27. package/dist/sanitizer/framework-mapper.d.ts.map +1 -1
  28. package/dist/sanitizer/framework-mapper.js +91 -45
  29. package/dist/sanitizer/framework-mapper.js.map +1 -1
  30. package/dist/sanitizer/hitl-gate.d.ts +69 -0
  31. package/dist/sanitizer/hitl-gate.d.ts.map +1 -0
  32. package/dist/sanitizer/hitl-gate.js +101 -0
  33. package/dist/sanitizer/hitl-gate.js.map +1 -0
  34. package/dist/sanitizer/threat-reporter.d.ts +1 -0
  35. package/dist/sanitizer/threat-reporter.d.ts.map +1 -1
  36. package/dist/sanitizer/threat-reporter.js +10 -7
  37. package/dist/sanitizer/threat-reporter.js.map +1 -1
  38. package/infrastructure/stack.ts +1 -0
  39. package/lambda-deploy/index.js +81512 -0
  40. package/lambda-deploy/index.js.map +7 -0
  41. package/lambda-package/browser/__mocks__/playwright-renderer.d.ts +25 -0
  42. package/lambda-package/browser/__mocks__/playwright-renderer.d.ts.map +1 -0
  43. package/lambda-package/browser/__mocks__/playwright-renderer.js +119 -0
  44. package/lambda-package/browser/__mocks__/playwright-renderer.js.map +1 -0
  45. package/lambda-package/browser/playwright-renderer.d.ts +40 -0
  46. package/lambda-package/browser/playwright-renderer.d.ts.map +1 -0
  47. package/lambda-package/browser/playwright-renderer.js +214 -0
  48. package/lambda-package/browser/playwright-renderer.js.map +1 -0
  49. package/lambda-package/browser/reader.d.ts +31 -0
  50. package/lambda-package/browser/reader.d.ts.map +1 -0
  51. package/lambda-package/browser/reader.js +98 -0
  52. package/lambda-package/browser/reader.js.map +1 -0
  53. package/lambda-package/index.d.ts +18 -0
  54. package/lambda-package/index.d.ts.map +1 -0
  55. package/lambda-package/index.js +238 -0
  56. package/lambda-package/index.js.map +1 -0
  57. package/lambda-package/lambda-handler.d.ts +28 -0
  58. package/lambda-package/lambda-handler.d.ts.map +1 -0
  59. package/lambda-package/lambda-handler.js +257 -0
  60. package/lambda-package/lambda-handler.js.map +1 -0
  61. package/lambda-package/package-lock.json +7435 -0
  62. package/lambda-package/package.json +74 -0
  63. package/lambda-package/runtime.d.ts +50 -0
  64. package/lambda-package/runtime.d.ts.map +1 -0
  65. package/lambda-package/runtime.js +86 -0
  66. package/lambda-package/runtime.js.map +1 -0
  67. package/lambda-package/sanitizer/elicit-runner.d.ts +48 -0
  68. package/lambda-package/sanitizer/elicit-runner.d.ts.map +1 -0
  69. package/lambda-package/sanitizer/elicit-runner.js +100 -0
  70. package/lambda-package/sanitizer/elicit-runner.js.map +1 -0
  71. package/lambda-package/sanitizer/framework-mapper.d.ts +24 -0
  72. package/lambda-package/sanitizer/framework-mapper.d.ts.map +1 -0
  73. package/lambda-package/sanitizer/framework-mapper.js +342 -0
  74. package/lambda-package/sanitizer/framework-mapper.js.map +1 -0
  75. package/lambda-package/sanitizer/hitl-gate.d.ts +69 -0
  76. package/lambda-package/sanitizer/hitl-gate.d.ts.map +1 -0
  77. package/lambda-package/sanitizer/hitl-gate.js +101 -0
  78. package/lambda-package/sanitizer/hitl-gate.js.map +1 -0
  79. package/lambda-package/sanitizer/index.d.ts +63 -0
  80. package/lambda-package/sanitizer/index.d.ts.map +1 -0
  81. package/lambda-package/sanitizer/index.js +105 -0
  82. package/lambda-package/sanitizer/index.js.map +1 -0
  83. package/lambda-package/sanitizer/injection-detector.d.ts +34 -0
  84. package/lambda-package/sanitizer/injection-detector.d.ts.map +1 -0
  85. package/lambda-package/sanitizer/injection-detector.js +89 -0
  86. package/lambda-package/sanitizer/injection-detector.js.map +1 -0
  87. package/lambda-package/sanitizer/patterns.d.ts +30 -0
  88. package/lambda-package/sanitizer/patterns.d.ts.map +1 -0
  89. package/lambda-package/sanitizer/patterns.js +372 -0
  90. package/lambda-package/sanitizer/patterns.js.map +1 -0
  91. package/lambda-package/sanitizer/pii-allowlist.d.ts +49 -0
  92. package/lambda-package/sanitizer/pii-allowlist.d.ts.map +1 -0
  93. package/lambda-package/sanitizer/pii-allowlist.js +231 -0
  94. package/lambda-package/sanitizer/pii-allowlist.js.map +1 -0
  95. package/lambda-package/sanitizer/pii-redactor.d.ts +41 -0
  96. package/lambda-package/sanitizer/pii-redactor.d.ts.map +1 -0
  97. package/lambda-package/sanitizer/pii-redactor.js +213 -0
  98. package/lambda-package/sanitizer/pii-redactor.js.map +1 -0
  99. package/lambda-package/sanitizer/severity-classifier.d.ts +33 -0
  100. package/lambda-package/sanitizer/severity-classifier.d.ts.map +1 -0
  101. package/lambda-package/sanitizer/severity-classifier.js +113 -0
  102. package/lambda-package/sanitizer/severity-classifier.js.map +1 -0
  103. package/lambda-package/sanitizer/threat-reporter.d.ts +66 -0
  104. package/lambda-package/sanitizer/threat-reporter.d.ts.map +1 -0
  105. package/lambda-package/sanitizer/threat-reporter.js +163 -0
  106. package/lambda-package/sanitizer/threat-reporter.js.map +1 -0
  107. package/lambda-package/tools/fetch-structured.d.ts +51 -0
  108. package/lambda-package/tools/fetch-structured.d.ts.map +1 -0
  109. package/lambda-package/tools/fetch-structured.js +237 -0
  110. package/lambda-package/tools/fetch-structured.js.map +1 -0
  111. package/lambda-package/tools/fetch.d.ts +49 -0
  112. package/lambda-package/tools/fetch.d.ts.map +1 -0
  113. package/lambda-package/tools/fetch.js +131 -0
  114. package/lambda-package/tools/fetch.js.map +1 -0
  115. package/lambda-package/tools/read.d.ts +51 -0
  116. package/lambda-package/tools/read.d.ts.map +1 -0
  117. package/lambda-package/tools/read.js +127 -0
  118. package/lambda-package/tools/read.js.map +1 -0
  119. package/lambda-package/tools/search.d.ts +45 -0
  120. package/lambda-package/tools/search.d.ts.map +1 -0
  121. package/lambda-package/tools/search.js +220 -0
  122. package/lambda-package/tools/search.js.map +1 -0
  123. package/lambda-package/types.d.ts +167 -0
  124. package/lambda-package/types.d.ts.map +1 -0
  125. package/lambda-package/types.js +16 -0
  126. package/lambda-package/types.js.map +1 -0
  127. package/lambda-package/utils/format-converter.d.ts +39 -0
  128. package/lambda-package/utils/format-converter.d.ts.map +1 -0
  129. package/lambda-package/utils/format-converter.js +191 -0
  130. package/lambda-package/utils/format-converter.js.map +1 -0
  131. package/lambda-package/utils/truncate.d.ts +26 -0
  132. package/lambda-package/utils/truncate.d.ts.map +1 -0
  133. package/lambda-package/utils/truncate.js +54 -0
  134. package/lambda-package/utils/truncate.js.map +1 -0
  135. package/lambda.zip +0 -0
  136. package/mcp.json +44 -0
  137. package/package.json +9 -8
  138. package/server.json +43 -0
  139. package/src/browser/playwright-renderer.ts +74 -51
  140. package/src/index.ts +78 -6
  141. package/src/sanitizer/elicit-runner.ts +125 -0
  142. package/src/sanitizer/framework-mapper.ts +92 -45
  143. package/src/sanitizer/hitl-gate.ts +111 -0
  144. package/src/sanitizer/threat-reporter.ts +11 -7
  145. package/tests/elicit-runner.test.ts +232 -0
  146. package/tests/hitl-gate.test.ts +267 -0
  147. package/tests/threat-reporter.test.ts +69 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Shared TypeScript interfaces for Visus MCP tool
3
+ */
4
+ import type { ThreatReport } from './sanitizer/threat-reporter.js';
5
+ /**
6
+ * Input options for visus_fetch tool
7
+ */
8
+ export interface VisusFetchInput {
9
+ url: string;
10
+ format?: 'markdown' | 'text';
11
+ timeout_ms?: number;
12
+ }
13
+ /**
14
+ * Output from visus_fetch tool
15
+ */
16
+ export interface VisusFetchOutput {
17
+ url: string;
18
+ content: string;
19
+ sanitization: {
20
+ patterns_detected: string[];
21
+ pii_types_redacted: string[];
22
+ pii_allowlisted: Array<{
23
+ type: string;
24
+ value: string;
25
+ reason: string;
26
+ }>;
27
+ content_modified: boolean;
28
+ };
29
+ metadata: {
30
+ title: string;
31
+ fetched_at: string;
32
+ content_length_original: number;
33
+ content_length_sanitized: number;
34
+ format_detected?: 'html' | 'json' | 'xml' | 'rss';
35
+ content_type?: string;
36
+ truncated?: boolean;
37
+ truncated_at_chars?: number;
38
+ };
39
+ threat_report?: ThreatReport;
40
+ }
41
+ /**
42
+ * Input for visus_fetch_structured tool
43
+ */
44
+ export interface VisusFetchStructuredInput {
45
+ url: string;
46
+ schema: Record<string, string>;
47
+ timeout_ms?: number;
48
+ }
49
+ /**
50
+ * Input for visus_read tool
51
+ */
52
+ export interface VisusReadInput {
53
+ url: string;
54
+ timeout_ms?: number;
55
+ }
56
+ /**
57
+ * Output from visus_fetch_structured tool
58
+ */
59
+ export interface VisusFetchStructuredOutput {
60
+ url: string;
61
+ data: Record<string, string | null>;
62
+ sanitization: {
63
+ patterns_detected: string[];
64
+ pii_types_redacted: string[];
65
+ pii_allowlisted: Array<{
66
+ type: string;
67
+ value: string;
68
+ reason: string;
69
+ }>;
70
+ content_modified: boolean;
71
+ };
72
+ metadata: {
73
+ title: string;
74
+ fetched_at: string;
75
+ content_length_original: number;
76
+ content_length_sanitized: number;
77
+ format_detected?: 'html' | 'json' | 'xml' | 'rss';
78
+ content_type?: string;
79
+ truncated?: boolean;
80
+ truncated_at_chars?: number;
81
+ };
82
+ threat_report?: ThreatReport;
83
+ }
84
+ /**
85
+ * Output from visus_read tool
86
+ */
87
+ export interface VisusReadOutput {
88
+ url: string;
89
+ content: string;
90
+ metadata: {
91
+ title: string;
92
+ author: string | null;
93
+ published: string | null;
94
+ word_count: number;
95
+ reader_mode_available: boolean;
96
+ sanitized: true;
97
+ injections_removed: number;
98
+ pii_redacted: number;
99
+ truncated: boolean;
100
+ fetched_at?: string;
101
+ };
102
+ threat_report?: ThreatReport;
103
+ }
104
+ /**
105
+ * Input for visus_search tool
106
+ */
107
+ export interface VisusSearchInput {
108
+ query: string;
109
+ max_results?: number;
110
+ }
111
+ /**
112
+ * Output from visus_search tool
113
+ */
114
+ export interface VisusSearchOutput {
115
+ query: string;
116
+ result_count: number;
117
+ sanitized: true;
118
+ results: Array<{
119
+ title: string;
120
+ url: string;
121
+ snippet: string;
122
+ injections_removed: number;
123
+ pii_redacted: number;
124
+ }>;
125
+ total_injections_removed: number;
126
+ message?: string;
127
+ threat_report?: ThreatReport;
128
+ }
129
+ /**
130
+ * Result from browser rendering
131
+ */
132
+ export interface BrowserRenderResult {
133
+ html: string;
134
+ title: string;
135
+ url: string;
136
+ contentType?: string;
137
+ text?: string;
138
+ error?: string;
139
+ }
140
+ /**
141
+ * Environment configuration
142
+ */
143
+ export interface VisusConfig {
144
+ timeout_ms: number;
145
+ max_content_kb: number;
146
+ lateos_api_key?: string;
147
+ lateos_endpoint?: string;
148
+ }
149
+ /**
150
+ * Result type for error handling (Lateos convention)
151
+ */
152
+ export type Result<T, E = Error> = {
153
+ ok: true;
154
+ value: T;
155
+ } | {
156
+ ok: false;
157
+ error: E;
158
+ };
159
+ /**
160
+ * Create a success result
161
+ */
162
+ export declare function Ok<T>(value: T): Result<T, never>;
163
+ /**
164
+ * Create an error result
165
+ */
166
+ export declare function Err<E>(error: E): Result<never, E>;
167
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared TypeScript interfaces for Visus MCP tool
3
+ */
4
+ /**
5
+ * Create a success result
6
+ */
7
+ export function Ok(value) {
8
+ return { ok: true, value };
9
+ }
10
+ /**
11
+ * Create an error result
12
+ */
13
+ export function Err(error) {
14
+ return { ok: false, error };
15
+ }
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6JH;;GAEG;AACH,MAAM,UAAU,EAAE,CAAI,KAAQ;IAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAI,KAAQ;IAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Format Converter - Content-Type based format detection and conversion
3
+ *
4
+ * Handles format-appropriate conversion based on detected Content-Type.
5
+ * Supports HTML, JSON, XML, and RSS/Atom feeds.
6
+ */
7
+ /**
8
+ * Detected format type
9
+ */
10
+ export type FormatType = 'html' | 'json' | 'xml' | 'rss';
11
+ /**
12
+ * Detect format from Content-Type header
13
+ *
14
+ * @param contentType - Content-Type header value (e.g., "application/json", "text/html; charset=utf-8")
15
+ * @returns Detected format type
16
+ */
17
+ export declare function detectFormat(contentType: string): FormatType;
18
+ /**
19
+ * Convert JSON content to formatted string
20
+ *
21
+ * @param raw - Raw JSON string
22
+ * @returns Formatted JSON string with prefix, or raw string if parse fails
23
+ */
24
+ export declare function convertJson(raw: string): string;
25
+ /**
26
+ * Convert XML content to clean text representation
27
+ *
28
+ * @param raw - Raw XML string
29
+ * @returns Formatted XML representation with prefix, or tag-stripped fallback if parse fails
30
+ */
31
+ export declare function convertXml(raw: string): string;
32
+ /**
33
+ * Convert RSS/Atom feed content to clean Markdown
34
+ *
35
+ * @param raw - Raw RSS/Atom XML string
36
+ * @returns Formatted Markdown representation, or falls back to convertXml if parse fails
37
+ */
38
+ export declare function convertRss(raw: string): string;
39
+ //# sourceMappingURL=format-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-converter.d.ts","sourceRoot":"","sources":["../../src/utils/format-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CA4B5D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoB9C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiC9C"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Format Converter - Content-Type based format detection and conversion
3
+ *
4
+ * Handles format-appropriate conversion based on detected Content-Type.
5
+ * Supports HTML, JSON, XML, and RSS/Atom feeds.
6
+ */
7
+ import { XMLParser } from 'fast-xml-parser';
8
+ /**
9
+ * Detect format from Content-Type header
10
+ *
11
+ * @param contentType - Content-Type header value (e.g., "application/json", "text/html; charset=utf-8")
12
+ * @returns Detected format type
13
+ */
14
+ export function detectFormat(contentType) {
15
+ // Normalize: lowercase and extract MIME type (before semicolon)
16
+ const mimeType = contentType.toLowerCase().split(';')[0].trim();
17
+ // HTML formats
18
+ if (mimeType === 'text/html' || mimeType === 'application/xhtml+xml') {
19
+ return 'html';
20
+ }
21
+ // JSON formats
22
+ if (mimeType === 'application/json' || mimeType === 'text/json') {
23
+ return 'json';
24
+ }
25
+ // RSS/Atom feed formats
26
+ if (mimeType === 'application/rss+xml' ||
27
+ mimeType === 'application/atom+xml' ||
28
+ mimeType === 'application/feed+json') {
29
+ return 'rss';
30
+ }
31
+ // XML formats (must come after RSS check)
32
+ if (mimeType === 'application/xml' || mimeType === 'text/xml') {
33
+ return 'xml';
34
+ }
35
+ // Default to HTML for unknown types
36
+ return 'html';
37
+ }
38
+ /**
39
+ * Convert JSON content to formatted string
40
+ *
41
+ * @param raw - Raw JSON string
42
+ * @returns Formatted JSON string with prefix, or raw string if parse fails
43
+ */
44
+ export function convertJson(raw) {
45
+ try {
46
+ // Parse and re-stringify with 2-space indent for readability
47
+ const parsed = JSON.parse(raw);
48
+ const formatted = JSON.stringify(parsed, null, 2);
49
+ return `JSON Response:\n\n${formatted}`;
50
+ }
51
+ catch (error) {
52
+ // Parse failed, return raw string unchanged
53
+ return raw;
54
+ }
55
+ }
56
+ /**
57
+ * Convert XML content to clean text representation
58
+ *
59
+ * @param raw - Raw XML string
60
+ * @returns Formatted XML representation with prefix, or tag-stripped fallback if parse fails
61
+ */
62
+ export function convertXml(raw) {
63
+ try {
64
+ const parser = new XMLParser({
65
+ ignoreAttributes: false,
66
+ attributeNamePrefix: '@_',
67
+ textNodeName: '#text',
68
+ ignoreDeclaration: true,
69
+ ignorePiTags: true,
70
+ removeNSPrefix: true,
71
+ });
72
+ const parsed = parser.parse(raw);
73
+ const formatted = JSON.stringify(parsed, null, 2);
74
+ return `XML Response:\n\n${formatted}`;
75
+ }
76
+ catch (error) {
77
+ // Parse failed, strip XML tags using regex and return
78
+ const stripped = raw.replace(/<[^>]+>/g, '').trim();
79
+ return `XML Response:\n\n${stripped}`;
80
+ }
81
+ }
82
+ /**
83
+ * Convert RSS/Atom feed content to clean Markdown
84
+ *
85
+ * @param raw - Raw RSS/Atom XML string
86
+ * @returns Formatted Markdown representation, or falls back to convertXml if parse fails
87
+ */
88
+ export function convertRss(raw) {
89
+ try {
90
+ const parser = new XMLParser({
91
+ ignoreAttributes: false,
92
+ attributeNamePrefix: '@_',
93
+ textNodeName: '#text',
94
+ removeNSPrefix: true,
95
+ });
96
+ const parsed = parser.parse(raw);
97
+ // Handle RSS 2.0 format
98
+ if (parsed.rss && parsed.rss.channel) {
99
+ return formatRss2(parsed.rss.channel);
100
+ }
101
+ // Handle Atom format
102
+ if (parsed.feed) {
103
+ return formatAtom(parsed.feed);
104
+ }
105
+ // Handle RSS 1.0 (RDF) format
106
+ if (parsed.rdf && parsed.rdf.channel) {
107
+ return formatRss2(parsed.rdf.channel);
108
+ }
109
+ // Unknown feed format, fall back to XML
110
+ return convertXml(raw);
111
+ }
112
+ catch (error) {
113
+ // Parse failed, fall back to XML converter
114
+ return convertXml(raw);
115
+ }
116
+ }
117
+ /**
118
+ * Format RSS 2.0 feed data as Markdown
119
+ */
120
+ function formatRss2(channel) {
121
+ const title = channel.title || 'Untitled Feed';
122
+ const description = channel.description || '';
123
+ const items = Array.isArray(channel.item) ? channel.item : (channel.item ? [channel.item] : []);
124
+ let markdown = `RSS Feed:\n\n# ${title}\n`;
125
+ if (description) {
126
+ markdown += `${description}\n`;
127
+ }
128
+ markdown += '\n## Items\n\n';
129
+ // Extract up to 10 items
130
+ const itemsToShow = items.slice(0, 10);
131
+ for (const item of itemsToShow) {
132
+ const itemTitle = item.title || 'Untitled';
133
+ const itemLink = item.link || '';
134
+ const itemDescription = item.description || '';
135
+ const itemPubDate = item.pubDate || '';
136
+ // Truncate description to 200 chars
137
+ const truncatedDesc = itemDescription.length > 200
138
+ ? itemDescription.substring(0, 200) + '...'
139
+ : itemDescription;
140
+ markdown += `### ${itemTitle}\n\n`;
141
+ if (truncatedDesc) {
142
+ markdown += `${truncatedDesc}\n\n`;
143
+ }
144
+ if (itemLink) {
145
+ markdown += `Link: ${itemLink}\n`;
146
+ }
147
+ if (itemPubDate) {
148
+ markdown += `Published: ${itemPubDate}\n`;
149
+ }
150
+ markdown += '\n---\n\n';
151
+ }
152
+ return markdown;
153
+ }
154
+ /**
155
+ * Format Atom feed data as Markdown
156
+ */
157
+ function formatAtom(feed) {
158
+ const title = feed.title || 'Untitled Feed';
159
+ const subtitle = feed.subtitle || '';
160
+ const entries = Array.isArray(feed.entry) ? feed.entry : (feed.entry ? [feed.entry] : []);
161
+ let markdown = `RSS Feed:\n\n# ${title}\n`;
162
+ if (subtitle) {
163
+ markdown += `${subtitle}\n`;
164
+ }
165
+ markdown += '\n## Items\n\n';
166
+ // Extract up to 10 entries
167
+ const entriesToShow = entries.slice(0, 10);
168
+ for (const entry of entriesToShow) {
169
+ const entryTitle = entry.title || 'Untitled';
170
+ const entryLink = entry.link ? (entry.link['@_href'] || entry.link) : '';
171
+ const entrySummary = entry.summary || entry.content || '';
172
+ const entryPublished = entry.published || entry.updated || '';
173
+ // Truncate summary to 200 chars
174
+ const truncatedSummary = entrySummary.length > 200
175
+ ? entrySummary.substring(0, 200) + '...'
176
+ : entrySummary;
177
+ markdown += `### ${entryTitle}\n\n`;
178
+ if (truncatedSummary) {
179
+ markdown += `${truncatedSummary}\n\n`;
180
+ }
181
+ if (entryLink) {
182
+ markdown += `Link: ${entryLink}\n`;
183
+ }
184
+ if (entryPublished) {
185
+ markdown += `Published: ${entryPublished}\n`;
186
+ }
187
+ markdown += '\n---\n\n';
188
+ }
189
+ return markdown;
190
+ }
191
+ //# sourceMappingURL=format-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-converter.js","sourceRoot":"","sources":["../../src/utils/format-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Token-aware content truncation utility
3
+ *
4
+ * Anthropic MCP Directory enforces a 25,000 token response limit.
5
+ * This utility provides safe truncation with token estimation.
6
+ */
7
+ /**
8
+ * Truncate content if it exceeds the token ceiling
9
+ *
10
+ * @param content Content to potentially truncate
11
+ * @returns Truncated content and metadata
12
+ */
13
+ export declare function truncateContent(content: string): {
14
+ content: string;
15
+ truncated: boolean;
16
+ truncated_at_chars?: number;
17
+ };
18
+ /**
19
+ * Estimate token count for a given string
20
+ * Uses conservative 4 chars per token approximation
21
+ *
22
+ * @param text Text to estimate
23
+ * @returns Estimated token count
24
+ */
25
+ export declare function estimateTokens(text: string): number;
26
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/utils/truncate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAkBA;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Token-aware content truncation utility
3
+ *
4
+ * Anthropic MCP Directory enforces a 25,000 token response limit.
5
+ * This utility provides safe truncation with token estimation.
6
+ */
7
+ /**
8
+ * Maximum tokens allowed in MCP response (Anthropic Directory limit)
9
+ * We target 24,000 to leave headroom for metadata/JSON structure
10
+ */
11
+ const MAX_TOKENS = 24000;
12
+ /**
13
+ * Conservative token estimation: 1 token ≈ 4 characters
14
+ * This is a safe approximation that errs on the side of caution
15
+ */
16
+ const CHARS_PER_TOKEN = 4;
17
+ /**
18
+ * Maximum characters based on token limit
19
+ */
20
+ const MAX_CHARS = MAX_TOKENS * CHARS_PER_TOKEN; // 96,000 characters
21
+ /**
22
+ * Truncate content if it exceeds the token ceiling
23
+ *
24
+ * @param content Content to potentially truncate
25
+ * @returns Truncated content and metadata
26
+ */
27
+ export function truncateContent(content) {
28
+ if (content.length <= MAX_CHARS) {
29
+ // Content is within limits
30
+ return {
31
+ content,
32
+ truncated: false
33
+ };
34
+ }
35
+ // Content exceeds limit - truncate with warning message
36
+ const truncatedContent = content.substring(0, MAX_CHARS);
37
+ const warningMessage = `\n\n--- CONTENT TRUNCATED ---\nOriginal length: ${content.length} characters (~${Math.ceil(content.length / CHARS_PER_TOKEN)} tokens)\nTruncated to: ${MAX_CHARS} characters (~${MAX_TOKENS} tokens)\nReason: Anthropic MCP Directory enforces a 25,000 token response limit\n`;
38
+ return {
39
+ content: truncatedContent + warningMessage,
40
+ truncated: true,
41
+ truncated_at_chars: MAX_CHARS
42
+ };
43
+ }
44
+ /**
45
+ * Estimate token count for a given string
46
+ * Uses conservative 4 chars per token approximation
47
+ *
48
+ * @param text Text to estimate
49
+ * @returns Estimated token count
50
+ */
51
+ export function estimateTokens(text) {
52
+ return Math.ceil(text.length / CHARS_PER_TOKEN);
53
+ }
54
+ //# sourceMappingURL=truncate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../src/utils/truncate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB;;;GAGG;AACH,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,SAAS,GAAG,UAAU,GAAG,eAAe,CAAC,CAAC,oBAAoB;AAEpE;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAK7C,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAChC,2BAA2B;QAC3B,OAAO;YACL,OAAO;YACP,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,mDAAmD,OAAO,CAAC,MAAM,iBAAiB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,2BAA2B,SAAS,iBAAiB,UAAU,oFAAoF,CAAC;IAExS,OAAO;QACL,OAAO,EAAE,gBAAgB,GAAG,cAAc;QAC1C,SAAS,EAAE,IAAI;QACf,kBAAkB,EAAE,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;AAClD,CAAC"}
package/lambda.zip ADDED
Binary file
package/mcp.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "visus-mcp",
3
+ "displayName": "Visus — Secure Web Access",
4
+ "version": "0.6.0",
5
+ "status": "active",
6
+ "tier": "open-source",
7
+ "phase": "1",
8
+ "description": "Security-first web access for Claude. Strips prompt injection attacks, redacts PII, and reduces token consumption by up to 70% before content enters your context window.",
9
+ "longDescription": "Visus is a pre-filter MCP server that sanitizes web content before it reaches Claude. It detects 43 categories of prompt injection patterns (mapped to OWASP LLM Top 10, NIST AI 600-1, MITRE ATLAS, and ISO/IEC 42001:2023), redacts PII (email, phone, SSN, CC, IP), and uses Mozilla Readability to strip nav bars, ads, and boilerplate — reducing token consumption by up to 70% on content-heavy pages.",
10
+ "author": "Leo Chongolnee",
11
+ "license": "MIT",
12
+ "homepage": "https://github.com/visus-mcp/visus-mcp",
13
+ "repository": "https://github.com/visus-mcp/visus-mcp",
14
+ "categories": ["web-fetch", "security", "search", "productivity"],
15
+ "tags": ["prompt-injection", "pii-redaction", "web-scraping", "token-optimization", "security", "duckduckgo"],
16
+ "install": {
17
+ "type": "npx",
18
+ "command": "npx visus-mcp",
19
+ "note": "No API key required. Open-source tier is fully functional out of the box."
20
+ },
21
+ "tools": [
22
+ {
23
+ "name": "visus_fetch",
24
+ "description": "Fetch and sanitize a web page with automatic format detection (HTML/JSON/XML/RSS). Includes threat report when injection or PII is detected."
25
+ },
26
+ {
27
+ "name": "visus_read",
28
+ "description": "Extract clean article content using Mozilla Readability (~70% token reduction). Strips nav, ads, and boilerplate."
29
+ },
30
+ {
31
+ "name": "visus_search",
32
+ "description": "Search the web via DuckDuckGo with injection and PII sanitization applied to all results before they reach the LLM."
33
+ },
34
+ {
35
+ "name": "visus_fetch_structured",
36
+ "description": "Extract structured data from a web page according to a user-defined schema. All fields are independently sanitized."
37
+ }
38
+ ],
39
+ "security": {
40
+ "frameworks": ["OWASP LLM Top 10 2025", "NIST AI 600-1", "MITRE ATLAS", "ISO/IEC 42001:2023"],
41
+ "injectionPatterns": 43,
42
+ "piiTypes": ["email", "phone", "ssn", "creditCard", "ipAddress"]
43
+ }
44
+ }
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "visus-mcp",
3
- "version": "0.6.0",
4
- "description": "Secure, sanitized web access for Claude. Detects prompt injection (43 patterns), redacts PII, renders JavaScript pages, generates NIST AI 600-1 / OWASP / MITRE ATLAS threat reports, and auto-detects JSON/XML/RSS content types.",
3
+ "version": "0.6.2",
4
+ "mcpName": "io.github.visus-mcp/visus-mcp",
5
+ "description": "Security-first MCP server. Sanitizes web content before it reaches your LLM — strips prompt injection, redacts PII, and reduces token consumption by up to 70%.",
5
6
  "main": "dist/index.js",
6
7
  "bin": {
7
8
  "visus-mcp": "dist/index.js"
@@ -25,15 +26,14 @@
25
26
  "keywords": [
26
27
  "mcp",
27
28
  "claude",
28
- "web-scraping",
29
+ "web-fetch",
29
30
  "security",
30
31
  "prompt-injection",
31
- "ai-safety",
32
- "lateos",
33
- "sanitization",
34
- "pii-redaction"
32
+ "pii-redaction",
33
+ "anthropic"
35
34
  ],
36
- "author": "Leo Chongolnee (Lateos)",
35
+ "author": "Roongrunchai Chongolnee <contact@lateos.ai>",
36
+ "homepage": "https://github.com/visus-mcp/visus-mcp",
37
37
  "license": "MIT",
38
38
  "engines": {
39
39
  "node": ">=18"
@@ -59,6 +59,7 @@
59
59
  "aws-cdk": "^2.1112.0",
60
60
  "aws-cdk-lib": "^2.244.0",
61
61
  "constructs": "^10.5.1",
62
+ "esbuild": "^0.27.4",
62
63
  "jest": "^29.7.0",
63
64
  "ts-jest": "^29.2.5",
64
65
  "ts-node": "^10.9.2",