@yawlabs/aws-mcp 1.3.1 → 1.3.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 (3) hide show
  1. package/README.md +4 -4
  2. package/dist/index.js +42 -129
  3. 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
- [![Add to mcp.hosting](https://mcp.hosting/install-button.svg)](https://mcp.hosting/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)
20
+ [![Add to Yaw MCP](https://yaw.sh/yaw-mcp-button.svg)](yaw://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 [mcp.hosting](https://mcp.hosting) account so it syncs to every MCP client you use. Or install manually below.
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
- var HOST_DELIMS = { "@": "%40", "/": "%2F", "?": "%3F", "#": "%23", ":": "%3A" };
3305
- var HOST_DELIM_RE = /[@/?#:]/g;
3306
- var HOST_DELIM_NO_COLON_RE = /[@/?#]/g;
3307
- function reescapeHostDelimiters(host, isIP) {
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
- let output = "";
3317
- for (let i = 0; i < input.length; i++) {
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
- return output;
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
- return output;
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
- return output;
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 = reescapeHostDelimiters(host, false);
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
- reescapeHostDelimiters,
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, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
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
- normalizeString(uri, options);
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
- const normalizedA = normalizeComparableURI(uriA, options);
3703
- const normalizedB = normalizeComparableURI(uriB, options);
3704
- return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA.toLowerCase() === normalizedB.toLowerCase();
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 = escapePreservingEscapes(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 = normalizePercentEncoding(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 getParseError(parsed, matches) {
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 = reescapeHostDelimiters(unescape(parsed.host), isIP);
3792
+ parsed.host = unescape(parsed.host);
3854
3793
  }
3855
3794
  }
3856
3795
  if (parsed.path) {
3857
- parsed.path = normalizePathEncoding(parsed.path);
3796
+ parsed.path = escape(unescape(parsed.path));
3858
3797
  }
3859
3798
  if (parsed.fragment) {
3860
- try {
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 { parsed, malformedAuthorityOrPort };
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.1" : (await null).createRequire(import.meta.url)("../package.json").version;
56859
+ var version2 = true ? "1.3.2" : (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.1",
3
+ "version": "1.3.2",
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",