@yawlabs/aws-mcp 1.3.1 → 1.3.3
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 +4 -4
- package/dist/index.js +42 -129
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,9 +17,9 @@ Five things this server tries to handle well:
|
|
|
17
17
|
4. **Live AWS docs.** `aws_docs_search` queries the same backend that powers the docs.aws.amazon.com search box; `aws_docs_read` fetches a doc page and returns it as paginated markdown. Lets the agent discover new services and look up exact parameter names without a second MCP server installed.
|
|
18
18
|
5. **Batched workflows in one round-trip.** `aws_script` runs a short JS snippet inside a constrained `node:vm` sandbox with `aws.call`, `aws.paginate`, `aws.paginateAll`, `aws.resource.*`, and `aws.logsTail` available. Best for "list X, fetch Y for each, return Z" pipelines that would otherwise need N tool calls. Same shape as AWS's `run_script` (Python, sandboxed server-side) -- yours is JS-native and runs locally.
|
|
19
19
|
|
|
20
|
-
[](https://yaw.sh/mcp/install?name=AWS&command=npx&args=-y%2C%40yawlabs%2Faws-mcp&env=AWS_PROFILE%2CAWS_REGION&description=Call%20any%20AWS%20API%20from%20one%20server%20-%20CCAPI%20CRUD%2C%20multi-region%2C%20SSO%20re-login&source=https%3A%2F%2Fgithub.com%2FYawLabs%2Faws-mcp)
|
|
21
21
|
|
|
22
|
-
One click adds this to your
|
|
22
|
+
One click adds this to your local Yaw MCP config so it's available in every Yaw Terminal session. Or install manually below.
|
|
23
23
|
|
|
24
24
|
## Optional companion: AWS Labs per-service servers
|
|
25
25
|
|
|
@@ -30,7 +30,7 @@ For deep work in a single service -- typed `lambda_invoke`, Bedrock KB retrieval
|
|
|
30
30
|
"mcpServers": {
|
|
31
31
|
"aws": {
|
|
32
32
|
"command": "npx",
|
|
33
|
-
"args": ["-y", "@yawlabs/aws-mcp"]
|
|
33
|
+
"args": ["-y", "@yawlabs/aws-mcp@latest"]
|
|
34
34
|
},
|
|
35
35
|
"aws-lambda": {
|
|
36
36
|
"command": "uvx",
|
|
@@ -107,7 +107,7 @@ Add to your MCP client config (e.g. `.mcp.json`):
|
|
|
107
107
|
"mcpServers": {
|
|
108
108
|
"aws": {
|
|
109
109
|
"command": "npx",
|
|
110
|
-
"args": ["-y", "@yawlabs/aws-mcp"]
|
|
110
|
+
"args": ["-y", "@yawlabs/aws-mcp@latest"]
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
}
|
package/dist/index.js
CHANGED
|
@@ -3106,9 +3106,6 @@ var require_utils = __commonJS({
|
|
|
3106
3106
|
"use strict";
|
|
3107
3107
|
var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
|
|
3108
3108
|
var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
|
|
3109
|
-
var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
|
|
3110
|
-
var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
|
|
3111
|
-
var isPathCharacter = RegExp.prototype.test.bind(/^[\da-z\-._~!$&'()*+,;=:@/]$/iu);
|
|
3112
3109
|
function stringArrayToHexStripped(input) {
|
|
3113
3110
|
let acc = "";
|
|
3114
3111
|
let code = 0;
|
|
@@ -3301,77 +3298,27 @@ var require_utils = __commonJS({
|
|
|
3301
3298
|
}
|
|
3302
3299
|
return output.join("");
|
|
3303
3300
|
}
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
const re = isIP ? HOST_DELIM_NO_COLON_RE : HOST_DELIM_RE;
|
|
3309
|
-
re.lastIndex = 0;
|
|
3310
|
-
return host.replace(re, (ch) => HOST_DELIMS[ch]);
|
|
3311
|
-
}
|
|
3312
|
-
function normalizePercentEncoding(input, decodeUnreserved = false) {
|
|
3313
|
-
if (input.indexOf("%") === -1) {
|
|
3314
|
-
return input;
|
|
3301
|
+
function normalizeComponentEncoding(component, esc2) {
|
|
3302
|
+
const func = esc2 !== true ? escape : unescape;
|
|
3303
|
+
if (component.scheme !== void 0) {
|
|
3304
|
+
component.scheme = func(component.scheme);
|
|
3315
3305
|
}
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
if (input[i] === "%" && i + 2 < input.length) {
|
|
3319
|
-
const hex3 = input.slice(i + 1, i + 3);
|
|
3320
|
-
if (isHexPair(hex3)) {
|
|
3321
|
-
const normalizedHex = hex3.toUpperCase();
|
|
3322
|
-
const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
|
|
3323
|
-
if (decodeUnreserved && isUnreserved(decoded)) {
|
|
3324
|
-
output += decoded;
|
|
3325
|
-
} else {
|
|
3326
|
-
output += "%" + normalizedHex;
|
|
3327
|
-
}
|
|
3328
|
-
i += 2;
|
|
3329
|
-
continue;
|
|
3330
|
-
}
|
|
3331
|
-
}
|
|
3332
|
-
output += input[i];
|
|
3306
|
+
if (component.userinfo !== void 0) {
|
|
3307
|
+
component.userinfo = func(component.userinfo);
|
|
3333
3308
|
}
|
|
3334
|
-
|
|
3335
|
-
|
|
3336
|
-
function normalizePathEncoding(input) {
|
|
3337
|
-
let output = "";
|
|
3338
|
-
for (let i = 0; i < input.length; i++) {
|
|
3339
|
-
if (input[i] === "%" && i + 2 < input.length) {
|
|
3340
|
-
const hex3 = input.slice(i + 1, i + 3);
|
|
3341
|
-
if (isHexPair(hex3)) {
|
|
3342
|
-
const normalizedHex = hex3.toUpperCase();
|
|
3343
|
-
const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
|
|
3344
|
-
if (decoded !== "." && isUnreserved(decoded)) {
|
|
3345
|
-
output += decoded;
|
|
3346
|
-
} else {
|
|
3347
|
-
output += "%" + normalizedHex;
|
|
3348
|
-
}
|
|
3349
|
-
i += 2;
|
|
3350
|
-
continue;
|
|
3351
|
-
}
|
|
3352
|
-
}
|
|
3353
|
-
if (isPathCharacter(input[i])) {
|
|
3354
|
-
output += input[i];
|
|
3355
|
-
} else {
|
|
3356
|
-
output += escape(input[i]);
|
|
3357
|
-
}
|
|
3309
|
+
if (component.host !== void 0) {
|
|
3310
|
+
component.host = func(component.host);
|
|
3358
3311
|
}
|
|
3359
|
-
|
|
3360
|
-
|
|
3361
|
-
function escapePreservingEscapes(input) {
|
|
3362
|
-
let output = "";
|
|
3363
|
-
for (let i = 0; i < input.length; i++) {
|
|
3364
|
-
if (input[i] === "%" && i + 2 < input.length) {
|
|
3365
|
-
const hex3 = input.slice(i + 1, i + 3);
|
|
3366
|
-
if (isHexPair(hex3)) {
|
|
3367
|
-
output += "%" + hex3.toUpperCase();
|
|
3368
|
-
i += 2;
|
|
3369
|
-
continue;
|
|
3370
|
-
}
|
|
3371
|
-
}
|
|
3372
|
-
output += escape(input[i]);
|
|
3312
|
+
if (component.path !== void 0) {
|
|
3313
|
+
component.path = func(component.path);
|
|
3373
3314
|
}
|
|
3374
|
-
|
|
3315
|
+
if (component.query !== void 0) {
|
|
3316
|
+
component.query = func(component.query);
|
|
3317
|
+
}
|
|
3318
|
+
if (component.fragment !== void 0) {
|
|
3319
|
+
component.fragment = func(component.fragment);
|
|
3320
|
+
}
|
|
3321
|
+
return component;
|
|
3375
3322
|
}
|
|
3376
3323
|
function recomposeAuthority(component) {
|
|
3377
3324
|
const uriTokens = [];
|
|
@@ -3386,7 +3333,7 @@ var require_utils = __commonJS({
|
|
|
3386
3333
|
if (ipV6res.isIPV6 === true) {
|
|
3387
3334
|
host = `[${ipV6res.escapedHost}]`;
|
|
3388
3335
|
} else {
|
|
3389
|
-
host =
|
|
3336
|
+
host = component.host;
|
|
3390
3337
|
}
|
|
3391
3338
|
}
|
|
3392
3339
|
uriTokens.push(host);
|
|
@@ -3400,10 +3347,7 @@ var require_utils = __commonJS({
|
|
|
3400
3347
|
module.exports = {
|
|
3401
3348
|
nonSimpleDomain,
|
|
3402
3349
|
recomposeAuthority,
|
|
3403
|
-
|
|
3404
|
-
normalizePercentEncoding,
|
|
3405
|
-
normalizePathEncoding,
|
|
3406
|
-
escapePreservingEscapes,
|
|
3350
|
+
normalizeComponentEncoding,
|
|
3407
3351
|
removeDotSegments,
|
|
3408
3352
|
isIPv4,
|
|
3409
3353
|
isUUID,
|
|
@@ -3627,12 +3571,12 @@ var require_schemes = __commonJS({
|
|
|
3627
3571
|
var require_fast_uri = __commonJS({
|
|
3628
3572
|
"node_modules/fast-uri/index.js"(exports, module) {
|
|
3629
3573
|
"use strict";
|
|
3630
|
-
var { normalizeIPv6, removeDotSegments, recomposeAuthority,
|
|
3574
|
+
var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizeComponentEncoding, isIPv4, nonSimpleDomain } = require_utils();
|
|
3631
3575
|
var { SCHEMES, getSchemeHandler } = require_schemes();
|
|
3632
3576
|
function normalize(uri, options) {
|
|
3633
3577
|
if (typeof uri === "string") {
|
|
3634
3578
|
uri = /** @type {T} */
|
|
3635
|
-
|
|
3579
|
+
serialize(parse3(uri, options), options);
|
|
3636
3580
|
} else if (typeof uri === "object") {
|
|
3637
3581
|
uri = /** @type {T} */
|
|
3638
3582
|
parse3(serialize(uri, options), options);
|
|
@@ -3699,9 +3643,19 @@ var require_fast_uri = __commonJS({
|
|
|
3699
3643
|
return target;
|
|
3700
3644
|
}
|
|
3701
3645
|
function equal(uriA, uriB, options) {
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3646
|
+
if (typeof uriA === "string") {
|
|
3647
|
+
uriA = unescape(uriA);
|
|
3648
|
+
uriA = serialize(normalizeComponentEncoding(parse3(uriA, options), true), { ...options, skipEscape: true });
|
|
3649
|
+
} else if (typeof uriA === "object") {
|
|
3650
|
+
uriA = serialize(normalizeComponentEncoding(uriA, true), { ...options, skipEscape: true });
|
|
3651
|
+
}
|
|
3652
|
+
if (typeof uriB === "string") {
|
|
3653
|
+
uriB = unescape(uriB);
|
|
3654
|
+
uriB = serialize(normalizeComponentEncoding(parse3(uriB, options), true), { ...options, skipEscape: true });
|
|
3655
|
+
} else if (typeof uriB === "object") {
|
|
3656
|
+
uriB = serialize(normalizeComponentEncoding(uriB, true), { ...options, skipEscape: true });
|
|
3657
|
+
}
|
|
3658
|
+
return uriA.toLowerCase() === uriB.toLowerCase();
|
|
3705
3659
|
}
|
|
3706
3660
|
function serialize(cmpts, opts) {
|
|
3707
3661
|
const component = {
|
|
@@ -3726,12 +3680,12 @@ var require_fast_uri = __commonJS({
|
|
|
3726
3680
|
if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
|
|
3727
3681
|
if (component.path !== void 0) {
|
|
3728
3682
|
if (!options.skipEscape) {
|
|
3729
|
-
component.path =
|
|
3683
|
+
component.path = escape(component.path);
|
|
3730
3684
|
if (component.scheme !== void 0) {
|
|
3731
3685
|
component.path = component.path.split("%3A").join(":");
|
|
3732
3686
|
}
|
|
3733
3687
|
} else {
|
|
3734
|
-
component.path =
|
|
3688
|
+
component.path = unescape(component.path);
|
|
3735
3689
|
}
|
|
3736
3690
|
}
|
|
3737
3691
|
if (options.reference !== "suffix" && component.scheme) {
|
|
@@ -3766,16 +3720,7 @@ var require_fast_uri = __commonJS({
|
|
|
3766
3720
|
return uriTokens.join("");
|
|
3767
3721
|
}
|
|
3768
3722
|
var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
|
|
3769
|
-
function
|
|
3770
|
-
if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") {
|
|
3771
|
-
return 'URI path must start with "/" when authority is present.';
|
|
3772
|
-
}
|
|
3773
|
-
if (typeof parsed.port === "number" && (parsed.port < 0 || parsed.port > 65535)) {
|
|
3774
|
-
return "URI port is malformed.";
|
|
3775
|
-
}
|
|
3776
|
-
return void 0;
|
|
3777
|
-
}
|
|
3778
|
-
function parseWithStatus(uri, opts) {
|
|
3723
|
+
function parse3(uri, opts) {
|
|
3779
3724
|
const options = Object.assign({}, opts);
|
|
3780
3725
|
const parsed = {
|
|
3781
3726
|
scheme: void 0,
|
|
@@ -3786,7 +3731,6 @@ var require_fast_uri = __commonJS({
|
|
|
3786
3731
|
query: void 0,
|
|
3787
3732
|
fragment: void 0
|
|
3788
3733
|
};
|
|
3789
|
-
let malformedAuthorityOrPort = false;
|
|
3790
3734
|
let isIP = false;
|
|
3791
3735
|
if (options.reference === "suffix") {
|
|
3792
3736
|
if (options.scheme) {
|
|
@@ -3807,11 +3751,6 @@ var require_fast_uri = __commonJS({
|
|
|
3807
3751
|
if (isNaN(parsed.port)) {
|
|
3808
3752
|
parsed.port = matches[5];
|
|
3809
3753
|
}
|
|
3810
|
-
const parseError = getParseError(parsed, matches);
|
|
3811
|
-
if (parseError !== void 0) {
|
|
3812
|
-
parsed.error = parsed.error || parseError;
|
|
3813
|
-
malformedAuthorityOrPort = true;
|
|
3814
|
-
}
|
|
3815
3754
|
if (parsed.host) {
|
|
3816
3755
|
const ipv4result = isIPv4(parsed.host);
|
|
3817
3756
|
if (ipv4result === false) {
|
|
@@ -3850,18 +3789,14 @@ var require_fast_uri = __commonJS({
|
|
|
3850
3789
|
parsed.scheme = unescape(parsed.scheme);
|
|
3851
3790
|
}
|
|
3852
3791
|
if (parsed.host !== void 0) {
|
|
3853
|
-
parsed.host =
|
|
3792
|
+
parsed.host = unescape(parsed.host);
|
|
3854
3793
|
}
|
|
3855
3794
|
}
|
|
3856
3795
|
if (parsed.path) {
|
|
3857
|
-
parsed.path =
|
|
3796
|
+
parsed.path = escape(unescape(parsed.path));
|
|
3858
3797
|
}
|
|
3859
3798
|
if (parsed.fragment) {
|
|
3860
|
-
|
|
3861
|
-
parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
|
|
3862
|
-
} catch {
|
|
3863
|
-
parsed.error = parsed.error || "URI malformed";
|
|
3864
|
-
}
|
|
3799
|
+
parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
|
|
3865
3800
|
}
|
|
3866
3801
|
}
|
|
3867
3802
|
if (schemeHandler && schemeHandler.parse) {
|
|
@@ -3870,29 +3805,7 @@ var require_fast_uri = __commonJS({
|
|
|
3870
3805
|
} else {
|
|
3871
3806
|
parsed.error = parsed.error || "URI can not be parsed.";
|
|
3872
3807
|
}
|
|
3873
|
-
return
|
|
3874
|
-
}
|
|
3875
|
-
function parse3(uri, opts) {
|
|
3876
|
-
return parseWithStatus(uri, opts).parsed;
|
|
3877
|
-
}
|
|
3878
|
-
function normalizeString(uri, opts) {
|
|
3879
|
-
return normalizeStringWithStatus(uri, opts).normalized;
|
|
3880
|
-
}
|
|
3881
|
-
function normalizeStringWithStatus(uri, opts) {
|
|
3882
|
-
const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts);
|
|
3883
|
-
return {
|
|
3884
|
-
normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),
|
|
3885
|
-
malformedAuthorityOrPort
|
|
3886
|
-
};
|
|
3887
|
-
}
|
|
3888
|
-
function normalizeComparableURI(uri, opts) {
|
|
3889
|
-
if (typeof uri === "string") {
|
|
3890
|
-
const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts);
|
|
3891
|
-
return malformedAuthorityOrPort ? void 0 : normalized;
|
|
3892
|
-
}
|
|
3893
|
-
if (typeof uri === "object") {
|
|
3894
|
-
return serialize(uri, opts);
|
|
3895
|
-
}
|
|
3808
|
+
return parsed;
|
|
3896
3809
|
}
|
|
3897
3810
|
var fastUri = {
|
|
3898
3811
|
SCHEMES,
|
|
@@ -56943,7 +56856,7 @@ var sessionTools = [
|
|
|
56943
56856
|
];
|
|
56944
56857
|
|
|
56945
56858
|
// src/index.ts
|
|
56946
|
-
var version2 = true ? "1.3.
|
|
56859
|
+
var version2 = true ? "1.3.3" : (await null).createRequire(import.meta.url)("../package.json").version;
|
|
56947
56860
|
var subcommand = process.argv[2];
|
|
56948
56861
|
if (subcommand === "version" || subcommand === "--version") {
|
|
56949
56862
|
console.log(version2);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yawlabs/aws-mcp",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"mcpName": "io.github.YawLabs/aws-mcp",
|
|
5
5
|
"description": "AWS MCP server — call any AWS API from AI assistants, with first-class SSO re-login (no more 'browser won't open' dead ends)",
|
|
6
6
|
"license": "MIT",
|