@sureshgururajan/aws-console-private-access-validator 1.0.3 → 1.0.5

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/src/index.ts CHANGED
@@ -1,110 +1,111 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
- import {
4
- CallToolRequestSchema,
5
- ListToolsRequestSchema,
6
- Tool,
7
- } from '@modelcontextprotocol/sdk/types.js';
8
- import { ConsolePrivateAccessValidator } from './validator.js';
9
- import { CloudFormationTemplate } from './types.js';
10
-
11
- const server = new Server(
12
- {
13
- name: 'aws-console-private-access-validator',
14
- version: '1.0.0',
15
- },
16
- {
17
- capabilities: {
18
- tools: {},
19
- },
20
- }
21
- );
22
-
23
- const tools: Tool[] = [
24
- {
25
- name: 'validate-cloudformation',
26
- description:
27
- 'Validates a CloudFormation template for AWS Console Private Access requirements',
28
- inputSchema: {
29
- type: 'object' as const,
30
- properties: {
31
- template: {
32
- type: 'string',
33
- description: 'CloudFormation template as JSON string',
34
- },
35
- region: {
36
- type: 'string',
37
- description: 'AWS region (default: us-east-1)',
38
- default: 'us-east-1',
39
- },
40
- },
41
- required: ['template'],
42
- },
43
- },
44
- ];
45
-
46
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
47
- tools,
48
- }));
49
-
50
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
51
- if (request.params.name === 'validate-cloudformation') {
52
- const { template, region = 'us-east-1' } = request.params.arguments as {
53
- template: string;
54
- region?: string;
55
- };
56
-
57
- try {
58
- const parsedTemplate: CloudFormationTemplate = JSON.parse(template);
59
- const validator = new ConsolePrivateAccessValidator(parsedTemplate, region);
60
- const result = validator.validate();
61
-
62
- return {
63
- content: [
64
- {
65
- type: 'text',
66
- text: JSON.stringify(result, null, 2),
67
- },
68
- ],
69
- };
70
- } catch (error) {
71
- const errorMessage = error instanceof Error ? error.message : String(error);
72
- return {
73
- content: [
74
- {
75
- type: 'text',
76
- text: JSON.stringify(
77
- {
78
- valid: false,
79
- checks: [],
80
- summary: `Error parsing template: ${errorMessage}`,
81
- },
82
- null,
83
- 2
84
- ),
85
- },
86
- ],
87
- isError: true,
88
- };
89
- }
90
- }
91
-
92
- return {
93
- content: [
94
- {
95
- type: 'text',
96
- text: `Unknown tool: ${request.params.name}`,
97
- },
98
- ],
99
- isError: true,
100
- };
101
- });
102
-
103
- async function main() {
104
- const transport = new StdioServerTransport();
105
- await server.connect(transport);
106
- }
107
-
108
- main().catch((error) => {
109
- process.exit(1);
110
- });
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import {
5
+ CallToolRequestSchema,
6
+ ListToolsRequestSchema,
7
+ Tool,
8
+ } from '@modelcontextprotocol/sdk/types.js';
9
+ import { ConsolePrivateAccessValidator } from './validator.js';
10
+ import { CloudFormationTemplate } from './types.js';
11
+
12
+ const server = new Server(
13
+ {
14
+ name: 'aws-console-private-access-validator',
15
+ version: '1.0.0',
16
+ },
17
+ {
18
+ capabilities: {
19
+ tools: {},
20
+ },
21
+ }
22
+ );
23
+
24
+ const tools: Tool[] = [
25
+ {
26
+ name: 'validate-cloudformation',
27
+ description:
28
+ 'Validates a CloudFormation template for AWS Console Private Access requirements',
29
+ inputSchema: {
30
+ type: 'object' as const,
31
+ properties: {
32
+ template: {
33
+ type: 'string',
34
+ description: 'CloudFormation template as JSON string',
35
+ },
36
+ region: {
37
+ type: 'string',
38
+ description: 'AWS region (default: us-east-1)',
39
+ default: 'us-east-1',
40
+ },
41
+ },
42
+ required: ['template'],
43
+ },
44
+ },
45
+ ];
46
+
47
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
48
+ tools,
49
+ }));
50
+
51
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
52
+ if (request.params.name === 'validate-cloudformation') {
53
+ const { template, region = 'us-east-1' } = request.params.arguments as {
54
+ template: string;
55
+ region?: string;
56
+ };
57
+
58
+ try {
59
+ const parsedTemplate: CloudFormationTemplate = JSON.parse(template);
60
+ const validator = new ConsolePrivateAccessValidator(parsedTemplate, region);
61
+ const result = validator.validate();
62
+
63
+ return {
64
+ content: [
65
+ {
66
+ type: 'text',
67
+ text: JSON.stringify(result, null, 2),
68
+ },
69
+ ],
70
+ };
71
+ } catch (error) {
72
+ const errorMessage = error instanceof Error ? error.message : String(error);
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: JSON.stringify(
78
+ {
79
+ valid: false,
80
+ checks: [],
81
+ summary: `Error parsing template: ${errorMessage}`,
82
+ },
83
+ null,
84
+ 2
85
+ ),
86
+ },
87
+ ],
88
+ isError: true,
89
+ };
90
+ }
91
+ }
92
+
93
+ return {
94
+ content: [
95
+ {
96
+ type: 'text',
97
+ text: `Unknown tool: ${request.params.name}`,
98
+ },
99
+ ],
100
+ isError: true,
101
+ };
102
+ });
103
+
104
+ async function main() {
105
+ const transport = new StdioServerTransport();
106
+ await server.connect(transport);
107
+ }
108
+
109
+ main().catch((error) => {
110
+ process.exit(1);
111
+ });
package/src/test.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/src/test.js ADDED
@@ -0,0 +1,26 @@
1
+ import fs from 'fs';
2
+ import { ConsolePrivateAccessValidator } from './validator.js';
3
+ // Read the CloudFormation template
4
+ const templatePath = process.argv[2] || '/tmp/template.json';
5
+ const templateContent = fs.readFileSync(templatePath, 'utf-8');
6
+ const template = JSON.parse(templateContent);
7
+ // Run validation
8
+ const validator = new ConsolePrivateAccessValidator(template, 'us-east-1');
9
+ const result = validator.validate();
10
+ // Print results
11
+ console.log('\n=== AWS Console Private Access Validation Results ===\n');
12
+ console.log(`Valid: ${result.valid ? '✓ YES' : '✗ NO'}\n`);
13
+ console.log('Checks:');
14
+ result.checks.forEach((check) => {
15
+ const icon = check.status === 'pass' ? '✓' : check.status === 'fail' ? '✗' : '⚠';
16
+ console.log(` ${icon} ${check.name}`);
17
+ console.log(` Status: ${check.status}`);
18
+ console.log(` Message: ${check.message}`);
19
+ if (check.details) {
20
+ console.log(` Details: ${check.details}`);
21
+ }
22
+ });
23
+ console.log(`\nSummary: ${result.summary}\n`);
24
+ // Exit with appropriate code
25
+ process.exit(result.valid ? 0 : 1);
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELG1DQUFtQztBQUNuQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDO0FBQzdELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFN0MsaUJBQWlCO0FBQ2pCLE1BQU0sU0FBUyxHQUFHLElBQUksNkJBQTZCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzNFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUVwQyxnQkFBZ0I7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0FBQ3pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFFM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQzlCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNqRixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFFOUMsNkJBQTZCO0FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBDb25zb2xlUHJpdmF0ZUFjY2Vzc1ZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9yLmpzJztcblxuLy8gUmVhZCB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbmNvbnN0IHRlbXBsYXRlUGF0aCA9IHByb2Nlc3MuYXJndlsyXSB8fCAnL3RtcC90ZW1wbGF0ZS5qc29uJztcbmNvbnN0IHRlbXBsYXRlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsICd1dGYtOCcpO1xuY29uc3QgdGVtcGxhdGUgPSBKU09OLnBhcnNlKHRlbXBsYXRlQ29udGVudCk7XG5cbi8vIFJ1biB2YWxpZGF0aW9uXG5jb25zdCB2YWxpZGF0b3IgPSBuZXcgQ29uc29sZVByaXZhdGVBY2Nlc3NWYWxpZGF0b3IodGVtcGxhdGUsICd1cy1lYXN0LTEnKTtcbmNvbnN0IHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZSgpO1xuXG4vLyBQcmludCByZXN1bHRzXG5jb25zb2xlLmxvZygnXFxuPT09IEFXUyBDb25zb2xlIFByaXZhdGUgQWNjZXNzIFZhbGlkYXRpb24gUmVzdWx0cyA9PT1cXG4nKTtcbmNvbnNvbGUubG9nKGBWYWxpZDogJHtyZXN1bHQudmFsaWQgPyAn4pyTIFlFUycgOiAn4pyXIE5PJ31cXG5gKTtcblxuY29uc29sZS5sb2coJ0NoZWNrczonKTtcbnJlc3VsdC5jaGVja3MuZm9yRWFjaCgoY2hlY2spID0+IHtcbiAgY29uc3QgaWNvbiA9IGNoZWNrLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJ+KckycgOiBjaGVjay5zdGF0dXMgPT09ICdmYWlsJyA/ICfinJcnIDogJ+KaoCc7XG4gIGNvbnNvbGUubG9nKGAgICR7aWNvbn0gJHtjaGVjay5uYW1lfWApO1xuICBjb25zb2xlLmxvZyhgICAgIFN0YXR1czogJHtjaGVjay5zdGF0dXN9YCk7XG4gIGNvbnNvbGUubG9nKGAgICAgTWVzc2FnZTogJHtjaGVjay5tZXNzYWdlfWApO1xuICBpZiAoY2hlY2suZGV0YWlscykge1xuICAgIGNvbnNvbGUubG9nKGAgICAgRGV0YWlsczogJHtjaGVjay5kZXRhaWxzfWApO1xuICB9XG59KTtcblxuY29uc29sZS5sb2coYFxcblN1bW1hcnk6ICR7cmVzdWx0LnN1bW1hcnl9XFxuYCk7XG5cbi8vIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlXG5wcm9jZXNzLmV4aXQocmVzdWx0LnZhbGlkID8gMCA6IDEpO1xuIl19
package/src/test.ts CHANGED
@@ -1,31 +1,31 @@
1
- import fs from 'fs';
2
- import { ConsolePrivateAccessValidator } from './validator.js';
3
-
4
- // Read the CloudFormation template
5
- const templatePath = process.argv[2] || '/tmp/template.json';
6
- const templateContent = fs.readFileSync(templatePath, 'utf-8');
7
- const template = JSON.parse(templateContent);
8
-
9
- // Run validation
10
- const validator = new ConsolePrivateAccessValidator(template, 'us-east-1');
11
- const result = validator.validate();
12
-
13
- // Print results
14
- console.log('\n=== AWS Console Private Access Validation Results ===\n');
15
- console.log(`Valid: ${result.valid ? '✓ YES' : '✗ NO'}\n`);
16
-
17
- console.log('Checks:');
18
- result.checks.forEach((check) => {
19
- const icon = check.status === 'pass' ? '✓' : check.status === 'fail' ? '✗' : '⚠';
20
- console.log(` ${icon} ${check.name}`);
21
- console.log(` Status: ${check.status}`);
22
- console.log(` Message: ${check.message}`);
23
- if (check.details) {
24
- console.log(` Details: ${check.details}`);
25
- }
26
- });
27
-
28
- console.log(`\nSummary: ${result.summary}\n`);
29
-
30
- // Exit with appropriate code
31
- process.exit(result.valid ? 0 : 1);
1
+ import fs from 'fs';
2
+ import { ConsolePrivateAccessValidator } from './validator.js';
3
+
4
+ // Read the CloudFormation template
5
+ const templatePath = process.argv[2] || '/tmp/template.json';
6
+ const templateContent = fs.readFileSync(templatePath, 'utf-8');
7
+ const template = JSON.parse(templateContent);
8
+
9
+ // Run validation
10
+ const validator = new ConsolePrivateAccessValidator(template, 'us-east-1');
11
+ const result = validator.validate();
12
+
13
+ // Print results
14
+ console.log('\n=== AWS Console Private Access Validation Results ===\n');
15
+ console.log(`Valid: ${result.valid ? '✓ YES' : '✗ NO'}\n`);
16
+
17
+ console.log('Checks:');
18
+ result.checks.forEach((check) => {
19
+ const icon = check.status === 'pass' ? '✓' : check.status === 'fail' ? '✗' : '⚠';
20
+ console.log(` ${icon} ${check.name}`);
21
+ console.log(` Status: ${check.status}`);
22
+ console.log(` Message: ${check.message}`);
23
+ if (check.details) {
24
+ console.log(` Details: ${check.details}`);
25
+ }
26
+ });
27
+
28
+ console.log(`\nSummary: ${result.summary}\n`);
29
+
30
+ // Exit with appropriate code
31
+ process.exit(result.valid ? 0 : 1);
package/src/types.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export interface ValidationCheck {
2
+ name: string;
3
+ status: 'pass' | 'fail' | 'warning';
4
+ message: string;
5
+ details?: string;
6
+ }
7
+ export interface ValidationResult {
8
+ valid: boolean;
9
+ checks: ValidationCheck[];
10
+ summary: string;
11
+ }
12
+ export interface CloudFormationTemplate {
13
+ Resources?: Record<string, any>;
14
+ Outputs?: Record<string, any>;
15
+ Parameters?: Record<string, any>;
16
+ }
package/src/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uQ2hlY2sge1xuICBuYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ3dhcm5pbmcnO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRldGFpbHM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBjaGVja3M6IFZhbGlkYXRpb25DaGVja1tdO1xuICBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB7XG4gIFJlc291cmNlcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIE91dHB1dHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cbiJdfQ==
package/src/types.ts CHANGED
@@ -1,18 +1,18 @@
1
- export interface ValidationCheck {
2
- name: string;
3
- status: 'pass' | 'fail' | 'warning';
4
- message: string;
5
- details?: string;
6
- }
7
-
8
- export interface ValidationResult {
9
- valid: boolean;
10
- checks: ValidationCheck[];
11
- summary: string;
12
- }
13
-
14
- export interface CloudFormationTemplate {
15
- Resources?: Record<string, any>;
16
- Outputs?: Record<string, any>;
17
- Parameters?: Record<string, any>;
18
- }
1
+ export interface ValidationCheck {
2
+ name: string;
3
+ status: 'pass' | 'fail' | 'warning';
4
+ message: string;
5
+ details?: string;
6
+ }
7
+
8
+ export interface ValidationResult {
9
+ valid: boolean;
10
+ checks: ValidationCheck[];
11
+ summary: string;
12
+ }
13
+
14
+ export interface CloudFormationTemplate {
15
+ Resources?: Record<string, any>;
16
+ Outputs?: Record<string, any>;
17
+ Parameters?: Record<string, any>;
18
+ }
@@ -0,0 +1,18 @@
1
+ import { ValidationResult, CloudFormationTemplate } from './types';
2
+ export declare class ConsolePrivateAccessValidator {
3
+ private template;
4
+ private region;
5
+ private checks;
6
+ constructor(template: CloudFormationTemplate, region?: string);
7
+ validate(): ValidationResult;
8
+ private getServiceName;
9
+ private checkVpcEndpoints;
10
+ private checkEndpointPolicies;
11
+ private validatePolicyContent;
12
+ private checkRoute53HostedZones;
13
+ private checkSecurityGroups;
14
+ private checkEc2Instance;
15
+ private checkNatGateway;
16
+ private checkNetworkConfiguration;
17
+ private generateSummary;
18
+ }