@apono-io/mcp-aws 0.1.1

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/README.md ADDED
@@ -0,0 +1,16 @@
1
+ # @apono-io/mcp-aws
2
+
3
+ Apono MCP server for AWS with STS AssumeRole support.
4
+
5
+ ## Usage
6
+
7
+ This server is launched automatically by the Apono CLI via `npx`. It reads the following environment variables:
8
+
9
+ | Variable | Description |
10
+ |---|---|
11
+ | `AWS_ACCESS_KEY_ID` | Source IAM credentials — access key |
12
+ | `AWS_SECRET_ACCESS_KEY` | Source IAM credentials — secret key |
13
+ | `AWS_SESSION_TOKEN` | Source IAM credentials — session token |
14
+ | `AWS_ROLE_ARN` | ARN of the role to assume via STS |
15
+
16
+ It calls STS `AssumeRole`, then transparently proxies to the [awslabs AWS API MCP server](https://github.com/awslabs/mcp) using the assumed-role credentials.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { run } from './run.js';
3
+ run(process.env).catch((err) => {
4
+ process.stderr.write(`Unhandled error: ${String(err)}\n`);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { STSClient } from '@aws-sdk/client-sts';
2
+ export interface AwsCredentials {
3
+ accessKeyId: string;
4
+ secretAccessKey: string;
5
+ sessionToken: string;
6
+ }
7
+ export declare function validateEnv(env: NodeJS.ProcessEnv): {
8
+ credentials: AwsCredentials;
9
+ roleArn: string;
10
+ region: string;
11
+ };
12
+ export declare function assumeRole(sts: STSClient, roleArn: string): Promise<AwsCredentials>;
13
+ export declare function run(env: NodeJS.ProcessEnv): Promise<void>;
14
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAC;AAUnE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG;IACnD,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAgBA;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAED,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B/D"}
package/dist/run.js ADDED
@@ -0,0 +1,64 @@
1
+ import { STSClient, AssumeRoleCommand } from '@aws-sdk/client-sts';
2
+ import { spawn } from 'node:child_process';
3
+ const REQUIRED_ENV = [
4
+ 'AWS_ACCESS_KEY_ID',
5
+ 'AWS_SECRET_ACCESS_KEY',
6
+ 'AWS_SESSION_TOKEN',
7
+ 'AWS_ROLE_ARN',
8
+ ];
9
+ export function validateEnv(env) {
10
+ for (const key of REQUIRED_ENV) {
11
+ if (!env[key]) {
12
+ throw new Error(`Missing required environment variable: ${key}`);
13
+ }
14
+ }
15
+ return {
16
+ credentials: {
17
+ accessKeyId: env.AWS_ACCESS_KEY_ID,
18
+ secretAccessKey: env.AWS_SECRET_ACCESS_KEY,
19
+ sessionToken: env.AWS_SESSION_TOKEN,
20
+ },
21
+ roleArn: env.AWS_ROLE_ARN,
22
+ region: env.AWS_REGION ?? env.AWS_DEFAULT_REGION ?? 'us-east-1',
23
+ };
24
+ }
25
+ export async function assumeRole(sts, roleArn) {
26
+ const response = await sts.send(new AssumeRoleCommand({
27
+ RoleArn: roleArn,
28
+ RoleSessionName: `apono-mcp-aws-${Date.now()}`,
29
+ }));
30
+ const c = response.Credentials;
31
+ if (!c?.AccessKeyId || !c?.SecretAccessKey || !c?.SessionToken) {
32
+ throw new Error('STS response missing credentials fields');
33
+ }
34
+ return {
35
+ accessKeyId: c.AccessKeyId,
36
+ secretAccessKey: c.SecretAccessKey,
37
+ sessionToken: c.SessionToken,
38
+ };
39
+ }
40
+ export async function run(env) {
41
+ const { credentials, roleArn, region } = validateEnv(env);
42
+ const sts = new STSClient({ credentials, region });
43
+ const assumed = await assumeRole(sts, roleArn);
44
+ const child = spawn('uvx', ['awslabs.aws-api-mcp-server'], {
45
+ env: {
46
+ ...env,
47
+ AWS_ACCESS_KEY_ID: assumed.accessKeyId,
48
+ AWS_SECRET_ACCESS_KEY: assumed.secretAccessKey,
49
+ AWS_SESSION_TOKEN: assumed.sessionToken,
50
+ },
51
+ stdio: 'inherit',
52
+ });
53
+ for (const signal of ['SIGINT', 'SIGTERM']) {
54
+ process.on(signal, () => child.kill(signal));
55
+ }
56
+ child.on('exit', (code) => {
57
+ process.exit(code ?? 1);
58
+ });
59
+ child.on('error', (err) => {
60
+ process.stderr.write(`Error: Failed to spawn child process: ${String(err)}\n`);
61
+ process.exit(1);
62
+ });
63
+ }
64
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,YAAY,GAAG;IACnB,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,cAAc;CACN,CAAC;AAQX,MAAM,UAAU,WAAW,CAAC,GAAsB;IAKhD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE;YACX,WAAW,EAAE,GAAG,CAAC,iBAAkB;YACnC,eAAe,EAAE,GAAG,CAAC,qBAAsB;YAC3C,YAAY,EAAE,GAAG,CAAC,iBAAkB;SACrC;QACD,OAAO,EAAE,GAAG,CAAC,YAAa;QAC1B,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,kBAAkB,IAAI,WAAW;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAc,EACd,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAC7B,IAAI,iBAAiB,CAAC;QACpB,OAAO,EAAE,OAAO;QAChB,eAAe,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,EAAE;KAC/C,CAAC,CACH,CAAC;IACF,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;IAC/B,IAAI,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC,EAAE,eAAe,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,YAAY,EAAE,CAAC,CAAC,YAAY;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAsB;IAC9C,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,4BAA4B,CAAC,EAAE;QACzD,GAAG,EAAE;YACH,GAAG,GAAG;YACN,iBAAiB,EAAE,OAAO,CAAC,WAAW;YACtC,qBAAqB,EAAE,OAAO,CAAC,eAAe;YAC9C,iBAAiB,EAAE,OAAO,CAAC,YAAY;SACxC;QACD,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACpD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,EAAE;QACvC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@apono-io/mcp-aws",
3
+ "version": "0.1.1",
4
+ "description": "Apono MCP server for AWS with STS AssumeRole support",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "apono-mcp-aws": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc -p tsconfig.build.json",
17
+ "test": "vitest run",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "dependencies": {
21
+ "@aws-sdk/client-sts": "^3.0.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^22.0.0",
25
+ "typescript": "^5.7.0",
26
+ "vitest": "^3.0.0"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "author": "Apono",
32
+ "license": "ISC"
33
+ }