@yawlabs/aws-mcp 0.9.10 → 1.0.0

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 +35 -0
  2. package/dist/index.js +19 -4
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -241,6 +241,41 @@ The token is cached in `~/.aws/sso/cache/<hash>.json` the same way a normal `aws
241
241
 
242
242
  SSO tokens live in `~/.aws/sso/cache/` on *your* device. A remote MCP server can't read them. So this is a stdio server, not a hosted one. That's a constraint of AWS SSO, not a limitation of mcp.hosting.
243
243
 
244
+ ## Stability
245
+
246
+ From 1.0 onward this package follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The 0.x line is the pre-stability tightening phase -- breaking changes are documented in [`CHANGELOG.md`](./CHANGELOG.md) but are not necessarily gated on a major bump.
247
+
248
+ **Stable in 1.x (anything below is a breaking change requiring a major bump):**
249
+
250
+ - **Tool names** -- the 24 tool names listed in the Tools table above will not be renamed or removed.
251
+ - **Tool annotations** -- `readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`. These signal to MCP hosts how to gate calls; flipping them silently would break host UIs.
252
+ - **Required input fields** -- the required fields per tool will not change shape or be removed. New *optional* fields may be added.
253
+ - **Success envelope shape per tool** -- the `data` object on `{ok: true, data}` responses, specifically:
254
+ - `aws_call` -> `{command, result}`
255
+ - `aws_paginate` -> `{command, result, nextToken, hasMore}`
256
+ - `aws_multi_region` -> `{service, operation, regionCount, okCount, errorCount, results: [{region, ok, data?, command?, error?, errorKind?}]}`
257
+ - `aws_whoami` -> `{account, userId, arn, profile, region, ssoToken: {expiresAt, minutesLeft, startUrl} | null}`
258
+ - `aws_assume_role` -> `{profile, credentialsPath, expiration, assumedRoleArn, assumedRoleId, sourceProfile, hint}`
259
+ - `aws_login_start` / `aws_refresh_if_expiring_soon` -> `{sessionId, profile, verificationUrl, userCode, instructions, reused?}`
260
+ - `aws_resource_get` -> `{command, typeName, identifier, properties, propertiesRaw?}`
261
+ - `aws_resource_list` -> `{command, typeName, resources: [{identifier, properties}], nextToken, hasMore}`
262
+ - `aws_resource_create` / `_update` / `_delete` / `_status` -> flat-promoted `{command, requestToken, operationStatus, identifier, errorCode, statusMessage, retryAfter, progressEvent}` plus an `awaited: {attempts, elapsedMs}` block when `awaitCompletion: true` was passed
263
+ - `aws_resource_diff` -> `{command, typeName, identifier, before, after, changes, changeCount}`
264
+ - `aws_logs_tail` -> `{command, logGroupName, since, eventCount, events}`
265
+ - `aws_iam_simulate` -> `{command, principalArn, summary: {allowed, denied, total}, results, evaluationResults}`
266
+ - `aws_session_get` -> `{profile, region, profileSource, regionSource}` where `*Source` is `"session" | "env" | "default"`
267
+ - **Error envelope** -- `{ok: false, error: string, rawBody?: string}`. The `error` string is human-readable; its *wording* is best-effort (see below).
268
+ - **`errorKind` enum on `aws_multi_region`** -- `"sso_expired" | "no_creds" | "bad_input" | "spawn_failure" | "timeout" | "output_too_large" | "nonzero_exit"`. New variants may be added (additive); existing ones won't be renamed or repurposed.
269
+
270
+ **Best-effort (may change in a minor or patch):**
271
+
272
+ - **Error message wording.** Strings like "SSO session expired for profile 'X'. Call aws_login_start..." may be retuned for clarity. Anchor on `errorKind` (for `aws_multi_region`) or the structured envelope, not on regex-matching `error` text.
273
+ - **`rawBody`** content -- raw stderr/stdout from the underlying `aws` CLI for diagnostic purposes. Format follows whatever the CLI emits in your installed version.
274
+ - **`command`** strings -- the human-readable command shown alongside results. Argv ordering and the exact redaction-stub format (`<redacted len=N>`) may shift.
275
+ - **Tool *descriptions*** -- the prose surfaced to the model. Tightening these is non-breaking.
276
+
277
+ **Deprecation policy:** breaking a stable shape requires a major bump. A deprecation lands first in a minor (the old shape continues to work and the new shape becomes available alongside it), with a removal scheduled for the next major. Both the deprecation and the removal show up in `CHANGELOG.md`.
278
+
244
279
  ## License
245
280
 
246
281
  MIT
package/dist/index.js CHANGED
@@ -54092,6 +54092,12 @@ var assumeTools = [
54092
54092
  const sourceProfile = i.sourceProfile || getProfile();
54093
54093
  const useRegion = i.region || getRegion();
54094
54094
  const targetProfile = resolveTargetProfile({ targetProfile: i.targetProfile, sessionName: i.sessionName });
54095
+ if (!isValidProfileName(sourceProfile)) {
54096
+ return {
54097
+ ok: false,
54098
+ error: `Invalid sourceProfile name '${sourceProfile}'. Must be 1-128 chars from [A-Za-z0-9_+=,.@:-], must not start with '-' or '='. Check the 'sourceProfile' arg or AWS_PROFILE env var.`
54099
+ };
54100
+ }
54095
54101
  if (!isValidProfileName(targetProfile)) {
54096
54102
  return {
54097
54103
  ok: false,
@@ -56110,7 +56116,7 @@ var resourceTools = [
56110
56116
  },
56111
56117
  {
56112
56118
  name: "aws_resource_diff",
56113
- description: "Dry-run a CCAPI update: fetch the current resource state, simulate applying a JSON Patch in memory, and return before/after plus a flat list of changed paths. No mutation is sent to AWS. Use this before aws_resource_update to verify the patch does what you expect. Supports the add/remove/replace subset of RFC 6902 (covers the vast majority of CCAPI updates); 'move'/'copy'/'test' are not implemented and fail with a clear error.",
56119
+ description: "Dry-run a CCAPI update: fetch the current resource state, simulate applying a JSON Patch in memory, and return before/after plus a flat list of changed paths. No mutation is sent to AWS. Use this before aws_resource_update to verify the patch does what you expect. Supports the add/remove/replace subset of RFC 6902 (covers the vast majority of CCAPI updates); 'move'/'copy'/'test' are rejected at schema validation -- use aws_resource_update directly if you need those (CCAPI accepts them, this preview tool just doesn't simulate them locally).",
56114
56120
  annotations: {
56115
56121
  title: "Preview a CCAPI update without applying it",
56116
56122
  readOnlyHint: true,
@@ -56123,12 +56129,21 @@ var resourceTools = [
56123
56129
  identifier: external_exports3.string().min(1).describe("Primary identifier for the resource."),
56124
56130
  patchDocument: external_exports3.array(
56125
56131
  external_exports3.object({
56126
- op: external_exports3.enum(["add", "remove", "replace", "move", "copy", "test"]),
56132
+ // Diff simulates patches locally via applyJsonPatch; only the
56133
+ // add/remove/replace subset is implemented. Reject the other
56134
+ // three RFC 6902 ops here so the model gets schema-validation
56135
+ // feedback instead of a runtime "not implemented" error
56136
+ // surfaced as a generic "Patch application failed". The
56137
+ // sibling aws_resource_update tool accepts the full op set
56138
+ // because CCAPI does -- only this preview tool is restricted.
56139
+ op: external_exports3.enum(["add", "remove", "replace"]),
56127
56140
  path: external_exports3.string(),
56128
56141
  value: external_exports3.unknown().optional(),
56129
56142
  from: external_exports3.string().optional()
56130
56143
  })
56131
- ).min(1).describe("RFC 6902 JSON Patch (the same shape aws_resource_update accepts)."),
56144
+ ).min(1).describe(
56145
+ "RFC 6902 JSON Patch (add/remove/replace subset). For move/copy/test, use aws_resource_update directly."
56146
+ ),
56132
56147
  ...baseFields
56133
56148
  }),
56134
56149
  handler: async (input) => {
@@ -56663,7 +56678,7 @@ var sessionTools = [
56663
56678
  ];
56664
56679
 
56665
56680
  // src/index.ts
56666
- var version2 = true ? "0.9.10" : (await null).createRequire(import.meta.url)("../package.json").version;
56681
+ var version2 = true ? "1.0.0" : (await null).createRequire(import.meta.url)("../package.json").version;
56667
56682
  var subcommand = process.argv[2];
56668
56683
  if (subcommand === "version" || subcommand === "--version") {
56669
56684
  console.log(version2);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yawlabs/aws-mcp",
3
- "version": "0.9.10",
3
+ "version": "1.0.0",
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",