Skip to main content
Glama

Infrawise gives AI coding assistants deterministic infrastructure awareness.

It statically analyzes your codebase, cloud infrastructure, and database schemas, then exposes that context through MCP so tools like Claude Code can understand your actual tables, indexes, query patterns, and service relationships instead of guessing from source files alone.

infrawise start --claude, then Claude Code answers an SQS handler question with the exact event shape and queue risks pulled live from infrawise


Why this exists

New software developers don't write wrong code. Claude Code writes wrong code and they ship it. Infrawise is the only thing standing between Claude Code's generated output and a production incident.

AI coding assistants can read your source files but have no deterministic knowledge of your infrastructure. They do not know which GSIs exist, how tables are partitioned, which functions already trigger scans, or where indexes are missing. So they guess.

Infrawise replaces guessing with infrastructure-aware context.

Without Infrawise, an AI assistant might:

  • Suggest a .scan() on your Orders table that has 50M rows

  • Recommend adding a GSI on status that you already have

  • Write a SELECT * when you need to keep query cost low

  • Not notice that 5 functions are already hammering the same partition key

With Infrawise, it knows:

  • Your exact table schemas, partition keys, sort keys, and GSIs

  • Which functions query which tables and how

  • Which patterns are already flagged as high severity

  • The exact CREATE INDEX SQL or GSI config for your tables — not generic advice


Related MCP server: Cost Management MCP

Installation

Requires Node.js 22 or later (node --version).

npm install -g infrawise

or use without installing:

npx infrawise start --claude

Quick start

cd your-project
infrawise start --claude

That's it. Infrawise will:

  1. Probe your environment and generate infrawise.yaml (first time only — asks which AWS profile to use only if you have several)

  2. Scan your AWS services, databases, and codebase

  3. Write .mcp.json so your editor auto-connects on every future launch

  4. Open Claude Code with all 22 MCP tools ready

Every time after:

claude    # no infrawise command needed — editor manages the connection

Analysis is cached for 24 hours. infrawise serve --stdio (spawned automatically by your editor) connects and lists tools without loading the snapshot or running analysis. The first infrastructure tool call loads the cache; if it is missing or expired, that call waits for a fresh analysis. Concurrent calls share that initial analysis. Run infrawise start before opening your editor to prepare the cache and avoid that first-call wait. File watching starts once the snapshot is loaded. HTTP serve still loads its snapshot before listening.

After the first code refresh, the server retains extracted operations and dependency paths, then scans only changed files and their transitive importers. TypeScript ASTs are released as files are processed. Python saves scan only the changed Python files. Added and deleted files update the snapshot, saves are batched for two seconds, and edits made during a refresh are queued. Changing a tsconfig*.json rebuilds the scanner. IaC extraction, graph construction, and analyzers still run across the full snapshot to preserve cross-resource findings; cloud metadata stays cached. No configuration or CLI flags are needed.

Findings (3 total)

1. [HIGH] Full table scan detected on DynamoDB table "Orders"
   listAllOrders() scans without any filter — reads every item in the table.
   Recommendation: Replace Scan with Query using a partition key or add a GSI.

2. [MEDIUM] PostgreSQL table "users" has no index on column "email"
   No matching leading-column index was observed for "email"; verify with EXPLAIN.
   Recommendation: CREATE INDEX CONCURRENTLY idx_users_email ON users(email);

3. [MEDIUM] DynamoDB table "Sessions" accessed by 6 distinct code paths
   High access concentration may create hot partition issues at scale.

Demo

Two demos run infrawise against real AWS APIs emulated locally in Docker, at zero cost and with no real AWS account.

  • demo/floci/ uses Floci, an MIT-licensed emulator that covers every service infrawise supports — including CloudFront, API Gateway v2, RDS, Cognito, Kinesis, ElastiCache, and MSK. No auth token, no sign-up. Start here.

  • demo/localstack/ uses LocalStack community edition, which covers the core services.

Both listen on port 4566, so run one at a time.

infrawise analyze running against the LocalStack demo and reporting the high-severity findings


Using with AI coding assistants

infrawise start --claude

Writes .mcp.json to your project root (merging with any MCP servers already configured there) and opens Claude Code. Claude Code reads .mcp.json automatically on every launch and manages the infrawise serve --stdio process — no server to start, no ports to configure.

Infrawise is also installable as a Claude Code plugin. It registers the same MCP server and still needs an infrawise.yaml in the project, which infrawise start creates:

/plugin marketplace add Sidd27/infrawise
/plugin install infrawise@infrawise

Cursor

infrawise start --cursor

Writes .cursor/mcp.json (merging with any existing MCP servers) and opens Cursor. All 22 infrawise tools are available in Cursor's MCP panel.

VS Code

infrawise start --vscode

Writes .vscode/mcp.json (merging with any existing MCP servers) and opens VS Code. The tools are available to Copilot agent mode via the MCP servers panel.

Any editor (no flag)

infrawise start

Writes .mcp.json (merging with any existing MCP servers) and exits. Open whichever editor you prefer — point it at infrawise serve --stdio --config /path/to/infrawise.yaml as an MCP server command.

HTTP transport (alternative)

If your editor or workflow requires an HTTP MCP endpoint instead of stdio:

infrawise serve    # starts server at http://localhost:3000/mcp

Add to your editor's MCP config:

{
  "mcpServers": {
    "infrawise": {
      "url": "http://localhost:3000/mcp"
    }
  }
}

MCP tools

Every tool is annotated read-only (readOnlyHint: true, openWorldHint: false), so MCP clients that honor annotations can call them without a confirmation prompt.

Tool

What it provides

get_infra_overview

Complete snapshot — services, counts, high-severity findings, configured flag (data age and per-source status ride the dataHealth block on every response)

get_graph_summary

Full infrastructure graph — all nodes, edges, and findings

get_table_schema

Column-level schema for named tables/collections — types, PKs, FKs, indexes, DynamoDB keys/billing mode, cost signal (no row data)

analyze_function

Issues in a specific function — scans, missing indexes, N+1, trigger event shapes, missing IAM permissions; returns every same-named file as a separate match, or bind to one with the optional file input; names refused Lambda links and why (unresolvedLambdas)

suggest_gsi

Exact GSI config for a DynamoDB table + attribute — names the existing index instead when one already covers it

postgres_index_suggestions

Exact CREATE INDEX SQL for your actual table

suggest_mongo_index

Exact createIndex command for a MongoDB collection + field

mysql_index_suggestions

Exact ALTER TABLE ADD INDEX SQL for your MySQL table

get_queue_details

SQS queues — DLQ status, encryption, FIFO type, visibility timeout, message counts

get_api_routes

API Gateway APIs (REST, HTTP, WebSocket) — routes, HTTP methods, paths, and Lambda integrations

get_topic_details

SNS topics — subscription counts, protocols, and filter policies (required message attributes per subscription)

get_secrets_overview

Secrets Manager — names, rotation status, and key names inferred from code (values never included)

get_parameter_overview

SSM Parameter Store — names, types, tiers (values never included)

get_lambda_overview

Lambda functions — runtime, memory, timeout, execution role ARN, triggers (SQS/SNS/DynamoDB/Kinesis/MSK/EventBridge/S3), env var key names, cost signal, why a Lambda could not be linked to its source (unresolvedLink)

get_eventbridge_details

EventBridge rules — name, state, schedule/event pattern, target functions

get_s3_overview

S3 buckets — versioning, encryption, public access, event notifications

get_log_errors

CloudWatch log group names and retention (metadata only; no message bodies)

get_stack_outputs

Stack outputs and cross-stack exports parsed from local IaC files, with staleness flags for orphaned cdk.out templates

get_cognito_overview

Cognito user pools — MFA config, app client auth flows, OAuth settings, token validity (secrets never included)

get_stream_details

Kinesis streams (shards, retention, capacity mode) and MSK clusters (state, Kafka version, brokers)

get_cache_overview

ElastiCache clusters — engine, encryption in transit/at rest, replication group, failover, cost signal (data never read)

get_cloudfront_overview

CloudFront distributions — per-behavior path patterns, origins (S3 vs custom, resolved API Gateway name), cache policy, viewer protocol policy

Every response carries a dataHealth block with a fixed shape: when the infrastructure was read and how long ago, the status of each source behind that answer, whether cdk.out has been synthed since, and the command that refreshes. Every key is always present, so nothing has to be inferred from a field's absence — an empty result you can't distinguish from a failed one reads as "no queues need a DLQ" when the truth is "SQS was never listed".

Infrawise reports; it doesn't rule. Pass maxAgeSeconds when a question is point-in-time and the answer tells you whether the data meets it (advisory — the data still comes back, marked). A running server rechecks the cache on each tool call, so an open session picks up a fresh infrawise analyze on its next question, without a restart. infrawise analyze and infrawise check print the same source warnings and stop calling a run clean when any source went unread.

Age is a proxy for drift, not drift itself — a three-day-old snapshot of an untouched account is accurate, and a five-minute-old one taken before a terraform apply isn't. How Infrawise handles staleness covers where that proxy misleads and what to do about it; the data freshness reference is the field-by-field table and the freshness config key.


Analysis capabilities

Infrawise has two analysis layers:

Infrastructure analysis (all languages)

Works from AWS APIs, database schema introspection, and IaC files — no dependency on application code:

Service

What it checks

DynamoDB schema

Tables, GSIs, partition keys, billing mode, cost signal (provisioned capacity)

PostgreSQL / MySQL schema

Tables, indexes, column types

MongoDB schema

Collections, indexes

SQS

Missing DLQs, unencrypted queues, large backlogs, FIFO detection, visibility timeout below the consumer Lambda timeout (high) or below AWS's recommended 6× (medium)

SNS

Subscription filter policies — required message attributes per subscription

Apache Kafka (kafkajs)

Producer/consumer topic mapping from code — any broker (self-hosted, Confluent, Redpanda, MSK); distinct from the MSK Lambda trigger

Secrets Manager

Missing secret rotation

Lambda

Default memory (128 MB), high timeouts, triggers (SQS/SNS/DynamoDB/Kinesis/MSK/EventBridge/S3), missing DLQ on trigger source, cost signal (high memory with no throttling evidence)

S3

Public access blocking (verify), missing versioning, missing encryption

EventBridge

Rules, schedules, event patterns, target Lambda functions

API Gateway

REST, HTTP, and WebSocket APIs — routes, methods, Lambda integrations

RDS

Publicly accessible, no backups, unencrypted, no deletion protection, single-AZ, cost signal (Multi-AZ on a non-production-looking instance)

CloudWatch Logs

Log groups with no retention policy

Cognito

User pools and app client config — auth flows, OAuth settings, token validity, client secret presence

Kinesis / MSK

Streams (shards, retention, capacity mode) and MSK clusters (state, Kafka version, brokers)

ElastiCache

Missing in-transit encryption, single-node clusters with no replication, cost signal (more than 3 nodes)

CloudFront

Behaviors serving traffic over plain HTTP (allow-all viewer protocol policy)

Runtime signals (opt-in)

Lambda throttling/errors and stale queue messages from CloudWatch metrics

Terraform / CloudFormation / CDK

IaC drift vs deployed state; stack outputs and cross-stack exports

Code correlation analysis (TypeScript / JavaScript / Python)

Uses ts-morph AST analysis to detect which functions call which tables and how:

Python repositories are scanned with a bundled stdlib-ast scanner (requires python3 on PATH; skipped with a warning otherwise): boto3 clients and dynamodb.Table() resources, cursor.execute SQL, pymongo collections, and kafka-python/confluent-kafka producers and consumers. Language detection is automatic — TypeScript and Python scans each run only when matching files exist.

Analyzer

Severity

What it detects

Full Table Scan (DynamoDB)

High

.scan() calls without filters

Missing GSI

Medium

Queries on attributes without a matching GSI

Hot Partition

Medium

5+ distinct code paths hitting the same table

Missing Index (PostgreSQL)

Medium

Tables queried without indexes

N+1 Query

High

Repeated query patterns from ORM loops

Large SELECT

Low

SELECT * usage

Missing MySQL Index

Medium

MySQL tables queried without indexes

MySQL Full Table Scan

High

Full table scan patterns in MySQL queries

Missing Mongo Index

Medium

Collections queried without secondary indexes

Collection Scan

High

find() calls without filter predicates

Pipeline: scan in consumer

High / Verify

Full scan inside an event-triggered Lambda handler (High when the lambda-to-code link is IaC-proven, Verify when name-matched)

Pipeline: repeated table access

Medium / Verify

Same table read by 2+ functions in one service pipeline

Pipeline: missing DLQ hop

Medium

Mid-pipeline queue (has producer and consumer) with no Dead Letter Queue

Projects in other languages still get full value from infrastructure-level analyzers — code correlation (function-to-table mapping, N+1 patterns) currently supports TypeScript, JavaScript, and Python.

The scanner supports: AWS SDK v3/v2 for DynamoDB, pg/Prisma/Knex for PostgreSQL, mysql2/Knex for MySQL, driver/Mongoose for MongoDB, AWS SDK v3 for SQS/SNS/SSM/Secrets/Lambda, and kafkajs for Kafka topics (producer/consumer).


How it works

  1. Infrawise scans your repository and infrastructure metadata

  2. A graph engine maps services, schemas, indexes, and query patterns

  3. Rule-based analyzers detect infrastructure and query anti-patterns

  4. The resulting context is exposed through MCP

  5. AI coding assistants query this context while generating code


Deterministic analysis

Infrawise does not use an LLM to analyze your infrastructure. All extraction and analysis are deterministic: AST parsing, schema introspection, rule-based analyzers, and graph correlation. LLMs are only consumers of the generated context through MCP.


Analysis confidence and refresh policy

check uses exit 0 for a completed check below the severity threshold, exit 1 for blocking findings, and exit 2 for incomplete extraction or analyzer failures. Failed and partial sources block by default; --allow-incomplete explicitly permits success when there are no blocking findings. --severity only filters analyze report output and never changes CI policy.

Relational schemas include ordered index columns, method, partial, and valid metadata. SQL analysis compares supported filter columns with leading index columns; an unrelated primary key no longer hides a missing access path. Findings are static warnings, not observed query plans. Partial/expression indexes and unsupported predicates require manual verification with EXPLAIN. Query values are not retained in predicate metadata.

Every response includes dataHealth.codeCoverage: recognized operation counts, unresolved reference counts, unsupported SQL counts, and limitations. These counts describe recognized patterns only. Wrappers, dynamic names, and unsupported constructs can be missed. get_graph_summary lists unresolved recognized references; absence of an edge never proves no runtime access.

get_log_errors now returns retention metadata only: errorCount: null, topErrorPatterns: [], errorsObserved: false. The compatibility name does not imply error sampling. Log message bodies are never requested. Older caches are invalidated so previously sampled patterns are not served.

For optional background refreshes after the initial snapshot loads:

freshness:
  suggestRefreshAfterHours: 6
  refreshIntervalMinutes: 15

refreshIntervalMinutes is opt-in, between 1 and 1440 minutes, and performs full cloud/database/code analysis between tool requests. It is serialized with source refreshes, can incur API/DB costs, and stops scheduling if the config changes until restart. It bounds snapshot age while the server runs; it does not detect deployments instantly. For exact deployment boundaries run infrawise analyze --config infrawise.yaml after deployment; already-running MCP sessions see the refreshed cache on their next call.

To improve assistant use, follow the assistant workflow. Evaluate real editor runs with pnpm eval:assistant traces.json; see evaluation instructions. Use pnpm benchmark for repeatable performance and result-equivalence checks; see benchmark methodology. Synthetic controls are not a measured model-quality score.

analyze_function returning found: false means absent from the recognized graph, not proven absent from source code. Check source health, wrappers, and dynamic references before making an absence claim. Failed session refreshes appear in dataHealth.codeCoverage.refreshError while the previous graph is retained.

Incomplete runtime metric reads are recorded in source health and block check by default; they are not interpreted as zero activity.

Validation commands: pnpm test:demo exercises seeded local databases, index metadata, coverage, and CI exit codes; pnpm test:demo --background also verifies the timed refresh. Start and seed the database demo first.

Large repository memory

TS/JS scanning uses a lazy async generator and sequential batches capped at 32 files or 512 KiB of source (a larger supported file is scanned alone). Each batch releases its ASTs before the next; watch sessions retain extracted operations and dependency paths rather than a whole-project compiler AST. Imported dependency types and standard-library declarations are not loaded. Configured source selection is respected, and dependency folders, declarations, and common generated outputs (dist, build, .next, .nuxt, .output, coverage) are excluded before parsing.

A source file above 2 MiB is reported as incomplete code coverage, with its path in source health, while readable files are still scanned. check exits 2 for incomplete analysis unless --allow-incomplete is explicit. Memory still scales with extracted operations and the infrastructure graph; this is not an unlimited-repository guarantee. No larger Node heap setting is required for ordinary scanning. Run pnpm test:memory for a repeatable 256 MiB heap regression, including full scans, incremental edits, shared-import updates, and the actual analyze CLI.


Configuration

infrawise.yaml is generated by infrawise start (or infrawise start --interactive for the guided wizard) and lives in your repo root. Every service must be explicitly enabled: true — infrawise never connects to anything not listed in config.

Connection strings support ${ENV_VAR} substitution so passwords never need to be committed:

postgres:
  enabled: true
  connectionString: postgresql://infrawise_ro:${DB_PASSWORD}@host:5432/mydb

Full example:

project: payments-service

aws:
  profile: default # AWS profile from ~/.aws/credentials
  region: ap-south-1

dynamodb:
  enabled: true
  includeTables: # omit to include all tables
    - Orders
    - Users

postgres:
  enabled: true
  connectionString: postgresql://infrawise_ro:${DB_PASSWORD}@host:5432/mydb

mysql:
  enabled: false
  connectionString: ''

mongodb:
  enabled: false
  connectionString: ''

sqs:
  enabled: true

sns:
  enabled: true

ssm:
  enabled: true
  paths: [] # filter by prefix e.g. ["/myapp/prod"]

secretsManager:
  enabled: true

lambda:
  enabled: true
  includeFunctions: # omit to include all functions
    - myFunction
    - anotherFunction

eventbridge:
  enabled: true

rds:
  enabled: false

s3:
  enabled: false

apiGateway:
  enabled: false

cognito:
  enabled: false

kinesis:
  enabled: false

msk:
  enabled: false

elasticache:
  enabled: false

cloudfront:
  enabled: false

runtimeSignals:
  enabled: false # Lambda throttles/errors + queue age via CloudWatch metrics
  windowHours: 24

cloudwatchLogs:
  enabled: false
  logGroupPrefixes: []
  windowHours: 24

analysis:
  hotPartitionThreshold: 5
  hotPartitionThresholds:
    high-traffic-table: 12

freshness:
  suggestRefreshAfterHours: 6 # when MCP responses start hinting to re-analyze

AWS setup

Infrawise is read-only. Minimum IAM policy for DynamoDB:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["dynamodb:ListTables", "dynamodb:DescribeTable"],
      "Resource": "*"
    }
  ]
}

For the full policy across all supported services, how to scope it to only the services you enable, and using a session policy for temporary scoped credentials, see the AWS setup guide.

For SSO profiles, log in before running infrawise:

aws sso login --profile myprofile

PostgreSQL setup (optional)

Create a read-only user for infrawise:

CREATE USER infrawise_ro WITH PASSWORD 'yourpassword';
GRANT CONNECT ON DATABASE yourdb TO infrawise_ro;
GRANT USAGE ON SCHEMA public TO infrawise_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO infrawise_ro;

For Amazon RDS: allow inbound on port 5432 from your machine's IP in the security group.


CLI reference

Command

What it does

infrawise start

Primary command — probe env, generate config, analyze, write editor MCP config

infrawise start --claude

Same as above, then opens Claude Code

infrawise start --cursor

Same as above, then opens Cursor

infrawise start --vscode

Same as above, then opens VS Code (merges into .vscode/mcp.json)

infrawise start --interactive

Run the guided setup wizard instead of auto-discovery

infrawise start --rediscover

Delete infrawise.yaml + .infrawise/, then re-probe and re-analyze

infrawise analyze

Force a full re-scan with extraction progress and a time estimate from past runs — useful after major infrastructure changes

infrawise check

CI gate — analyze and exit non-zero when findings reach the threshold severity

infrawise serve

Start the MCP server — HTTP by default, or --stdio for editor integration

infrawise doctor

Diagnostic escape hatch — validate AWS/DB access, config, and repo scan

infrawise analyze options

Flag

Description

-c, --config <path>

Path to infrawise.yaml (default: infrawise.yaml)

-r, --repo <path>

Repository to scan (default: current directory)

--no-cache

Skip reading/writing the cache

-o, --output <path>

Save findings as a markdown report, e.g. report.md

--severity <level>

Only show findings at or above this level: high | medium | low

# Export a shareable findings report
infrawise analyze --output report.md

# Only show high-severity issues
infrawise analyze --severity high

# High-severity issues only, saved to a file
infrawise analyze --severity high --output report.md

infrawise check options (CI/CD)

check runs a fresh analysis and sets a non-zero exit code when blocking findings exist, so it can gate a pipeline without an AI editor.

Flag

Description

-c, --config <path>

Path to infrawise.yaml (default: infrawise.yaml)

-r, --repo <path>

Repository to scan (default: current directory)

--fail-on <level>

Severity that fails the build: high (default) | medium | low

--allow-incomplete

Explicitly permit success when sources failed or were partly read

# Block a deploy if any high-severity finding exists (exit 1)
infrawise check

# Stricter gate — fail on medium and above
infrawise check --fail-on medium

infrawise serve options

Flag

Description

-c, --config <path>

Path to infrawise.yaml (default: infrawise.yaml)

--stdio

Use stdio transport (for editors via .mcp.json) instead of HTTP

-p, --port <number>

Port to listen on, HTTP only (default: 3000)


Security

  • Read-only — never writes to AWS or your database, never executes DDL

  • Local-first — everything runs on your machine, nothing sent to external servers

  • No telemetry — zero data collection

  • Credentials — uses your existing AWS credential chain, never stored by infrawise

🔒 Security & Project Naming Note

You might see this package flagged on certain supply-chain security scanners under "deceptive naming." This is a false positive triggered by automated tools because of the prefix "infra." This project is completely safe, independent, and unaffiliated with any commercial trademarks.


What Infrawise is not

Infrawise is not an AI agent framework, an infrastructure provisioning tool, an observability platform, or a cloud management dashboard.

It is a deterministic infrastructure intelligence layer for AI-assisted development.


Current limitations

  • Code-level correlation supports TypeScript, JavaScript, and Python (Python requires python3 on PATH)

  • Dynamically constructed queries may not always be resolved statically

  • Runtime tracing is not yet implemented

  • Static scanning covers recognized patterns; extracted operations and graph size still affect memory use


Architecture overview

Architecture

Source layout

src/
  types.ts      Shared type definitions
  core/         Config (Zod + YAML), logger (Pino), local cache
  graph/        Graph engine — nodes, edges, builder
  adapters/
    aws/        DynamoDB, S3, Lambda, SQS/SNS/SSM/Secrets/EventBridge/RDS/APIGateway, CloudWatch
    db/         PostgreSQL, MySQL, MongoDB
    iac/        Terraform, CDK, CloudFormation (local file parsing)
  analyzers/    39 rule-based analyzers
  context/      Repository scanner (ts-morph AST + Python stdlib-ast subprocess)
  server/       Fastify MCP server (@modelcontextprotocol/sdk, Streamable HTTP)
  cli/          CLI commands (Commander.js)

Roadmap

Feature roadmap is tracked in the Infrawise v1 project board. Feature requests and upvotes welcome.


Contributing

See CONTRIBUTING.md for a full walkthrough — including how to add a new service adapter, a new analyzer, and the PR checklist.

Releasing

Before releasing, run pnpm check:docs — it fails if the version or the MCP tool list in README.md/AGENTS.md/llms.txt drifted from src/server/index.ts.

pnpm release patch    # 0.1.2 → 0.1.3  (bug fixes)
pnpm release minor    # 0.1.2 → 0.2.0  (new features, backwards compatible)
pnpm release major    # 0.1.2 → 1.0.0  (breaking changes)
pnpm release 1.5.0    # explicit version

Bumps package.json, commits, tags, pushes, and creates a draft GitHub release with notes from commit messages. Then publish the draft on GitHub to trigger npm publish.


License

MIT

Available Tools

22 tools
analyze_functionAnalyze a functionA
Read-only

Analyzes a single named function or Lambda handler for infrastructure issues: which tables it queries, how it queries them (scan vs query), queue publishing, secret access, and the correct event shape for each trigger (SQS, DynamoDB Streams, Kinesis, EventBridge). Call this before writing or reviewing a Lambda handler to get the exact trigger event shape and all findings scoped to this function. Per-file detail (file, accesses, missingPermissions) is returned in matches, one entry per source file defining a function with this name. Pass file to bind the answer to the one file you are editing: it matches a stored path exactly, or as a trailing fragment on a path-segment boundary, so a bare "orders.ts" resolves against the absolute path the scanner recorded. Matching is case sensitive. When file selects exactly one entry, that entry is returned alone with its accesses. When several deployed Lambdas link to the same function, candidateLambdas names them and triggers is absent rather than empty; re-call with file if the candidates come from different files. When several files match — with or without file — ambiguous: true is returned and accesses is withheld from every entry; re-call with file set to the file you are editing rather than guessing between them. When file matches nothing, fileMatched: false is returned with availableFiles listing the paths that do exist, so you can retry. When no deployed Lambda could be linked to this function, unresolvedLambdas names each Lambda that was considered and why it was refused (no_match, multiple_functions, or multiple_lambdas with the colliding names), so an empty triggers can be told apart from a function that is not deployed. Returns found: false if the function name was not discovered during analysis.

Inputs: function (required), file, maxAgeSeconds.

get_api_routesAPI Gateway routesA
Read-only

Returns all API Gateway APIs (REST, HTTP, WebSocket) with their routes, HTTP methods, paths, and the Lambda function each route invokes. Call this before writing any API handler to understand which Lambda handles a route, or when reviewing API surface area and Lambda integration coverage.

Inputs: maxAgeSeconds.

get_cache_overviewElastiCache overviewA
Read-only

Returns all ElastiCache clusters with engine, version, node type, node count, in-transit and at-rest encryption status, replication group, and automatic failover state. Call this before writing cache client code (TLS is required when transit encryption is on — rediss:// for Redis) or when reviewing cache availability and security posture. Cached data is never read or included. A costSignal note appears on clusters with more than 3 nodes.

Inputs: maxAgeSeconds.

get_cloudfront_overviewCloudFront distribution overviewA
Read-only

Returns all CloudFront distributions with, per distribution: id, comment, domain name, alias domains, enabled state, origins (type s3 or custom, domain name, and the resolved API Gateway name when the origin is an execute-api endpoint), and every cache behavior with its path pattern, target origin, cache policy name, viewer protocol policy, and allowed methods. Behaviors are listed in CloudFront match order — ordered behaviors first, the default behavior last. Call this to answer which distribution and behavior serves a given path and which origin it hits, before changing a path-based routing rule, or when reviewing edge caching and HTTPS enforcement across a multi-API front door.

Inputs: maxAgeSeconds.

get_cognito_overviewCognito user pool overviewA
Read-only

Returns all Cognito user pools with MFA configuration and every app client config: allowed auth flows, OAuth flows/scopes, callback URLs, token validity, and whether the client has a secret (SDK auth calls must send SECRET_HASH when true). Client secret values are never returned. Call this before writing any Cognito sign-in, sign-up, or token-refresh code to use the correct auth flow and client settings. Do NOT call to look up users or tokens — infrawise never reads user data.

Inputs: maxAgeSeconds.

get_eventbridge_detailsEventBridge rule detailsA
Read-only

Returns all EventBridge rules with name, ENABLED/DISABLED state, schedule expression (rate/cron rules), event pattern (event-driven rules), and target Lambda function names. Call this when checking what schedule or event triggers a Lambda, or when reviewing rule coverage across the account.

Inputs: maxAgeSeconds.

get_graph_summaryFull infrastructure graphA
Read-only

Returns extracted nodes, recognized code edges, all findings, and unresolvedReferences. Read dataHealth.codeCoverage: wrappers, dynamic names, and unsupported expressions may be missed, so missing edges never prove no runtime access. Use when tracing relationships across services or inspecting the full finding set; prefer get_infra_overview for quick orientation.

Inputs: maxAgeSeconds.

get_infra_overviewInfrastructure overviewA
Read-only

Returns a compact infrastructure snapshot: service counts, all databases, queues, topics, secrets, lambdas, and high-severity findings. Call this first at the start of any database or infrastructure task to understand what services are in scope. Prefer this over get_graph_summary for quick orientation; use get_graph_summary only when you need every node, edge, and finding in full. Also returns a configured flag — when false, the server has no infrawise.yaml loaded (e.g. a remotely hosted instance) and all tools return empty results; a setupHint explains how to run infrawise locally. Every response (this one included) carries a dataHealth block with a fixed shape: analyzedAt/ageSeconds for when the infrastructure was read, per-source status, iac for whether cdk.out was synthed since, and refreshWith. On this tool dataHealth.sources covers every source rather than one tool's. A source that is not ok means an empty result is "not read", not "none exist".

Inputs: maxAgeSeconds.

get_lambda_overviewLambda function overviewA
Read-only

Returns all Lambda functions with runtime, memory (MB), timeout (sec), environment variable key names (values never returned), and event source triggers with the correct handler event shape for each. Call this when auditing Lambda configuration for default memory (128 MB) or high timeouts, or when you need the trigger event shape for a specific function without running analyze_function. When runtime signals are enabled, recentThrottles and recentErrors report CloudWatch counts for the analysis window. A costSignal note appears when memory is 3008 MB+ and there is no throttling evidence to justify it — no billing API involved, this is a config-level heuristic. A function carrying unresolvedLink could not be attributed to one source function: reason is no_match, multiple_functions (candidates are function node ids), or multiple_lambdas (candidates are the other Lambda names that normalize to the same key), so analyze_function on its handler will return no triggers for it.

Inputs: maxAgeSeconds.

get_log_errorsCloudWatch log group metadataA
Read-only

Returns CloudWatch log group names and retention metadata without reading log events. The legacy get_log_errors name is retained for compatibility; errorCount is null, topErrorPatterns is empty, and errorsObserved is false because no message bodies are requested. Use logGroup to filter names. Call when checking retention policies; do NOT use to diagnose runtime errors or infer that no errors occurred.

Inputs: logGroup, maxAgeSeconds.

get_parameter_overviewSSM parameter overviewA
Read-only

Returns all SSM Parameter Store parameters with type (String, SecureString, StringList) and tier (Standard, Advanced). Parameter values are never returned. Call this when checking which config parameters exist for a service or verifying parameter types.

Inputs: maxAgeSeconds.

get_queue_detailsSQS queue detailsA
Read-only

Returns all SQS queues with DLQ presence, encryption status, FIFO type (isFifo), visibility timeout, approximate message count, and retention days. When isFifo is true, all SendMessage calls must include a MessageGroupId. Call this when reviewing messaging architecture, investigating a message backlog, checking DLQ coverage, or verifying visibility timeout is set correctly relative to Lambda timeout (should be 6× the Lambda timeout). Use get_infra_overview for a quick queue count only. When runtime signals are enabled, oldestMessageAgeSec reports the age of the oldest message from CloudWatch.

Inputs: maxAgeSeconds.

get_s3_overviewS3 bucket overviewA
Read-only

Returns all S3 buckets with versioning status, encryption, public access configuration, and security findings. Call this when checking which S3 buckets exist, reviewing bucket security posture, or before writing S3 upload/delete handlers to confirm the bucket name. Do NOT call when you only need a quick infrastructure count — use get_infra_overview for that. Object contents are never included.

Inputs: maxAgeSeconds.

get_secrets_overviewSecrets Manager overviewA
Read-only

Returns all Secrets Manager secrets with rotation status, rotation interval, and referencedKeys — key names (e.g. "password", "apiKey") inferred from application code that parses the secret, never the values. Call this when checking which secrets exist, confirming rotation is enabled before a security review, or before writing code that reads a secret so you use the correct key name instead of guessing.

Inputs: maxAgeSeconds.

get_stack_outputsIaC stack outputsA
Read-only

Returns all stack outputs and cross-stack exports parsed from local IaC files: Terraform output blocks and CloudFormation/CDK Outputs sections, with name, description, export name, and the raw value expression. Call this when wiring cross-stack references (Fn::ImportValue, terraform_remote_state) or when you need the exported name of a resource defined in another stack. Do NOT call for live resource attributes — outputs come from local IaC files, not the deployed stack. CDK outputs carry stale: true with a staleReason when their cdk.out template is no longer instantiated in the CDK app or predates the last cdk synth — do not rely on a stale export without re-synthesizing.

Inputs: maxAgeSeconds.

get_stream_detailsKinesis and MSK detailsA
Read-only

Returns all Kinesis data streams (status, shard count, retention hours, encryption, capacity mode) and Amazon MSK clusters (state, cluster type, Kafka version, broker count). Call this when writing Kinesis producer or consumer code, checking whether a stream is PROVISIONED or ON_DEMAND before writing PutRecord calls, or reviewing streaming architecture. For Kafka topic-level producer/consumer mappings extracted from application code, use get_topic_details instead.

Inputs: maxAgeSeconds.

get_table_schemaTable and collection schemasA
Read-only

Returns schemas for named tables or collections: column types/nullability, keys, foreign keys, indexes, DynamoDB keys/billing mode, and MongoDB estimated counts. Relational indexes include ordered columns, method, partial and valid flags; these describe possible access paths, not observed query plans. Short names match qualified names case-insensitively. Call after get_infra_overview before writing queries; request only needed tables. Do NOT use for inventory; use get_infra_overview. Row data is never included. Read source health before treating found:false as absence. DynamoDB provisioned tables may include an advisory costSignal.

Inputs: tables (required), maxAgeSeconds.

get_topic_detailsSNS and Kafka topic detailsA
Read-only

Returns all SNS topics with subscription count, encryption status, and filter policies. Filter policies list the message attributes each subscription requires — publishers must include these attributes or messages are silently dropped. Call this before writing any SNS publish code or when reviewing event fan-out patterns.

Inputs: maxAgeSeconds.

mysql_index_suggestionsSuggest a MySQL indexA
Read-only

Generates the exact ALTER TABLE ADD INDEX SQL for a MySQL table column, including a composite variant and EXPLAIN guidance to verify the index is used. Call this when the analyzer flags a missing MySQL index or full table scan finding. Does not verify whether the index already exists.

Inputs: table (required), column (required).

postgres_index_suggestionsSuggest a PostgreSQL indexA
Read-only

Generates the exact CREATE INDEX CONCURRENTLY SQL for a PostgreSQL table column, including a partial index variant and a post-creation ANALYZE reminder. Call this when the analyzer flags a missing index finding or when writing a query that filters on a column without an existing index. Does not verify whether the index already exists.

Inputs: table (required), column (required).

suggest_gsiSuggest a DynamoDB GSIA
Read-only

Generates a ready-to-use DynamoDB GSI definition — index name, partition key, projection type, billing mode — for a given table and attribute. Call this when a query pattern needs an index that does not exist yet, or when the analyzer flags a missing GSI finding. Checks the table's existing indexes first: when one is already keyed on that attribute it returns alreadyIndexed: true with the existing index name to use as IndexName, instead of proposing a duplicate. Use get_table_schema for the full index list on a table.

Inputs: table (required), attribute (required).

suggest_mongo_indexSuggest a MongoDB indexA
Read-only

Generates the exact db.collection.createIndex() command for a MongoDB field, plus compound and text index variants and an explain query to verify. Call this when a collection scan is flagged by the analyzer or when writing a query that filters on an unindexed field. Does not check whether the index already exists.

Inputs: field (required), collection (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 22 tools

    Disambiguation4/5

    Most tools map to a single distinct resource (queues, topics, secrets, S3, CloudFront, Cognito, API routes) with explicit 'use X instead of Y' guidance, and the four index-suggestion tools are cleanly separated by engine. A few boundaries need reading the description to resolve: get_infra_overview vs get_graph_summary vs get_table_schema, get_lambda_overview vs analyze_function, and get_topic_details which also claims Kafka topic mappings that overlap with get_stream_details. get_log_errors is a genuinely confusing name given it explicitly does not return errors.

    Naming Consistency3/5

    The bulk of tools follow a clean get_<resource>_overview/details pattern, but the index-suggestion family breaks it three ways: postgres_index_suggestions and mysql_index_suggestions put the verb last while suggest_mongo_index and suggest_gsi put it first. analyze_function and get_log_errors (a legacy name that contradicts its behavior) are further deviations. Still readable, but not a predictable pattern an agent can pattern-match on.

    Tool Count4/5

    22 tools is on the heavy side, but the server covers an entire AWS account surface and each tool maps to a distinct service or engine, so nearly all earn their place. The dashboard-style overview tools (infra_overview, graph_summary, lambda_overview) plus 12 per-service overviews is a defensible decomposition rather than sprawl.

    Completeness4/5

    Coverage across compute, messaging, storage, caching, edge, auth, config, and data layers is strong, and index/GSI advice plus schema lookups close the loop from finding to fix. Gaps exist for common adjacent services (IAM roles/permissions, VPC/networking, Step Functions, ECS) and the index tools deliberately do not check for existing indexes, forcing a get_table_schema detour. The surface is read/advise-only by design, so the lack of mutation tools is not a completeness fault.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      C
      quality
      D
      maintenance
      A Model Context Protocol (MCP) server that enables AI assistants like Claude to interact with your AWS environment. This allows for natural language querying and management of your AWS resources during conversations. Think of better Amazon Q alternative.
      3
      296
      ISC
    • A
      license
      B
      quality
      D
      maintenance
      An MCP server for unified cost tracking and analysis across AWS, OpenAI, and Anthropic. It enables users to query expenditures, compare costs across providers, and analyze usage trends through natural language.
      10
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Diagnose MCP servers — health checks, tool testing, token cost audits, conflict detection, and security scanning with 50+ prompt injection patterns. Works as CLI or MCP server inside Claude Desktop.
      1
      MIT