Atlas / MCP servers / yawlabs / aws-mcp

aws-mcpBLOCK

mcp/yawlabs/aws-mcp

AWS MCP server, streamlines AWS SSO login from inside AI assistants

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
22 12r · 7w · 3d
Transport
stdio
License
MIT
Stars
5
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://yaw.sh/mcp/install?name=AWS&command=npx&args=-y%2C%40yawlabs%2Faws-mcp&env=AWSPROFILE%2CAWSREGION&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)

One click adds this to your local Yaw MCP config so it's available in every Yaw Terminal session. Or install manually below.

A small AWS MCP for AI assistants: one server, one config entry, SSO re-auth baked in, generic CRUD over 1,300+ resource types, live docs lookup, server-side scripting for batched workflows.

It's an alternative to AWS's official MCP server, not a complement -- both reach any AWS API, so running both hands the model two overlapping ways to do the same thing. (AWS gives the same advice about its own older servers: its setup guide says to remove them "to avoid tool conflicts that can confuse AI agents".) Pick one. They overlap in coverage and differ in shape. The honest comparison:

  • [AWS MCP Server](https://docs.aws.amazon.com/agent-toolkit/latest/userguide/getting-started-aws-mcp-server.html) -- AWS's hosted server, GA since May 2026 and part of the Agent Toolkit for AWS. Strong on AWS-team-curated skills, a server-side Python sandbox (run_script) with days-fresh API coverage, a read-only serverless troubleshooting capability (Lambda diagnose, recent changes, X-Ray trace summaries), IAM condition keys that tell its calls apart from direct API calls, and per-tool CloudWatch metrics. As of September 2026, run_script is its only general-purpose way to call an AWS API -- the single-call call_aws tool has been removed -- so every call, even a one-off describe, is a Python script the model writes. The endpoint runs in us-east-1 and eu-central-1. Two ways to connect:
  • OAuth through AWS Sign-in (since July 2026): nothing to install -- your client opens a browser and connec
Read from source at commit cb2d983c9f87OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add aws-mcp -- npx -y @yawlabs/[email protected]
03

Exposed tools (22)

12 read · 7 write · 3 destructive. Blast radius: 3 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
aws_callwriteRun an arbitrary AWS API operation via the aws CLI. Use kebab-case service and operation names as in
aws_docs_readreadFetch an AWS documentation page and return it as markdown.
aws_iam_simulatereadSimulate IAM permissions for a principal: can principal X do actions Y on resources Z? Wraps
aws_lambda_invokewriteInvoke a Lambda function synchronously (RequestResponse) and return its response payload plus the DECODED tail of its execution log in one call. Use this instead of aws_call for Lambda invokes:
aws_list_profilesreadList AWS profiles configured in ~/.aws/config. Returns profile name, region, and SSO metadata (start URL, region, session name) where set, plus an
aws_login_completereadBlock until the SSO login started by aws_login_start finishes (user completed auth in browser, or subprocess exited with error). Returns the new identity on success, or a structured error.
aws_logs_querywriteRun a CloudWatch Logs Insights query and wait for it to finish -- StartQuery, poll GetQueryResults until the query reaches a terminal status, return the rows -- in ONE call, replacing the three-step start/poll/interpret-status dance you would otherwise write with aws_call.
aws_logs_tailreadFetch the newest CloudWatch Logs events for one log group over the last \
aws_metrics_queryreadQuery CloudWatch metrics via GetMetricData (the modern multi-metric / expression-capable API, not the legacy get-metric-statistics). Pass
aws_multi_accountwriteRun the same AWS API operation across multiple ACCOUNTS in parallel by assuming the same role name in each. Same shape as aws_call (service, operation, params?, query?, outputFormat?, region?, timeoutMs?) plus
aws_paginatereadFetch one page of a paginated AWS list/describe operation. Identical to aws_call plus
aws_refresh_if_expiring_soonreadProactive SSO token check. If the cached token has fewer than
aws_resource_createwriteCreate an AWS resource via Cloud Control API. Async by default: returns a ProgressEvent with OperationStatus=IN_PROGRESS and a
aws_resource_deletedestructiveDelete an AWS resource via Cloud Control API. Async by default: returns a ProgressEvent with OperationStatus=IN_PROGRESS and a top-level
aws_resource_getreadRead a single AWS resource via Cloud Control API. Covers hundreds of resource types with a CloudFormation schema.
aws_resource_listreadList resources of a given type via Cloud Control API, paginated. Returns an array of {identifier, properties}, a
aws_resource_statusdestructivePoll the status of an async Cloud Control API request (create/update/delete). Pass the
aws_resource_updatewriteUpdate an AWS resource via Cloud Control API using RFC 6902 JSON Patch. Async by default: returns a ProgressEvent with OperationStatus=IN_PROGRESS and a top-level
aws_session_cleardestructiveRemove session-set profile and/or region overrides so subsequent calls fall back to env vars / defaults. No args clears both. Pass
aws_session_getreadShow the current session
aws_session_setwriteSet the default AWS profile and/or region for the rest of this MCP session. Subsequent calls to aws_whoami, aws_login_*, and other AWS tools will use these values unless they override explicitly. Use when the user says
aws_whoamireadShow the current AWS identity (account, role ARN, user ID) plus SSO token status and time remaining. Use this first to verify auth before running other AWS operations. Returns a structured fix-it message if SSO is expired.
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (6 observation(s))
Shell
declared (5 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
scripts/update-manifests.mjs:212
const SSH = 'ssh -i ~/.ssh/gh_woods -o IdentitiesOnly=yes';
Why it matters. touches a credential store
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/tools/lambda.test.ts:619
payload: { password: "hunter2-should-not-leak" },
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
aws_resource_delete, aws_resource_status, aws_session_clear
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/launcher.test.ts:59
return new Function(`${pieces}\nreturn runtimePlan;`)() as RuntimePlan;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/launcher.test.ts:64
return new Function(`${pieces}\nreturn { pickNewest, floor: OAM_MIN };`)() as {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/launcher.test.ts:158
const remedyFor = new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/launcher.test.ts:198
const childEnv = new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/launcher.test.ts:247
const discover = new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/aws-cli.realcli.test.ts:279
: "a cp1252 byte in ~/.aws/config cannot parse where the preferred encoding is UTF-8",
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/aws-cli.test.ts:65
"file://~/.aws/credentials",
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/aws-cli.test.ts:66
"file://$HOME/.aws/credentials",
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/aws-cli.test.ts:67
"file://%USERPROFILE%/.aws/credentials",
Why it matters. touches a credential store
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/errors.test.ts:274
const err = new Error("connect ECONNREFUSED 169.254.169.254:80");
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/errors.test.ts:809
'\r\naws: [ERROR]: Read timeout on endpoint URL: "http://127.0.0.1:28763/2015-03-31/functions/slow-6000/invocations"\r\n',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/errors.test.ts:810
'\r\nRead timeout on endpoint URL: "http://127.0.0.1:28841/2015-03-31/functions/slow-4000/invocations?Qualifier=PROD"\r\n',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/errors.test.ts:828
'\r\naws: [ERROR]: Connect timeout on endpoint URL: "http://192.0.2.1:9/2015-03-31/functions/ok/invocations"\r\n',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/errors.test.ts:839
'\r\naws: [ERROR]: Connection was closed before we received a valid response from endpoint URL: "http://127.0.0.1:28763/2015-03-31/functions/reset/invocations".\r\n',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/errors.test.ts:857
const m = READ_TIMEOUT_RE.exec('\r\naws: [ERROR]: Read timeout on endpoint URL: "http://127.0.0.1:28842/"\r\n');
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, @types/node, @types/turndown, @yawlabs/mcp-compliance, esbuild, node-html-parser, postject, turndown
Why it matters. 10 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:35
- **The bundled MCP SDK moves from 1.30.0 to 1.32.1** (GHSA-6qxp-vccf-f47h, high: the SDK's OAuth client could send credentials to an authorization server chosen by the MCP server). The SDK is bundled
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:65
- **The 0600 on the two files that can hold credentials is verified now rather than assumed, and a filesystem that cannot honour it fails the call instead of leaking.** The `--cli-input-json` params f
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:80
- **Blob-typed `params` are always base64.** This is a behavior change for one configuration. With `cli_binary_format = raw-in-base64-out` in your AWS config -- common advice, AWS's own docs suggest i
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:92
- **`aws_docs_read` could not open the `index.html` pages `aws_docs_search` hands out.** docs.aws.amazon.com answers every `<path>/index.html` with a 301 to `<path>/`, and the post-redirect check adde
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:100
- **A Registry-driven install had no way to offer a profile, so it wrote none.** `server.json` declared no environment variables, so an installer reading the MCP Registry entry had nothing to prompt f
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
CHANGELOG.md:121
- **`aws_lambda_invoke` could run a function three times and still return nothing.** A function slower than 60 s hit the AWS CLI's default socket read timeout, and the CLI's standard retry mode then s
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha cb2d983c9f87full audit observations/trust-audit/mcp-server/yawlabs__aws-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11cb2d983c9f87BLOCKD69first audit
06

Questions

What is the aws-mcp MCP server?

AWS MCP server, streamlines AWS SSO login from inside AI assistants

What tools does aws-mcp expose?

22 in total: 12 read-only, 7 that write, and 3 that can delete or overwrite (aws_resource_delete, aws_resource_status, aws_session_clear). Every one is listed on this page with its risk.

Is aws-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does aws-mcp need?

It reads AWS_ACCESS_KEY_ID, AWS_CREDENTIAL_EXPIRATION, AWS_SECRET_ACCESS_KEY, AWS_SECURITY_TOKEN, AWS_SESSION_TOKEN, AWS_SHARED_CREDENTIALS_FILE, GH_TOKEN, GITHUB_TOKEN and SSH_KEYGEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does aws-mcp run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @yawlabs/aws-mcp at 2.5.2.

How current is this page?

The grade is for one exact copy of the source (cb2d983c9f87), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement