MCP Infrastructure Layer
Your AI coding assistant
finally knows your infra.
Infrawise gives Claude Code and Cursor a real-time, deterministic map of your AWS services, databases, and IaC — so they stop writing code that assumes wrong indexes, missing queues, and stale schemas.
Demo
Ask about your infra. Claude already knows.

The Problem
AI writes wrong code.
Infrawise is the fix.
"New software developers don't write wrong code. Claude Code writes wrong code and they ship it."
# AI writes from assumptions
response = table.query(
FilterExpression=Attr('userId').eq(user_id)
)
# ❌ Full table scan — GSI doesn't exist# AI knows your actual schema
response = table.query(
IndexName='userId-createdAt-index',
KeyConditionExpression=Key('userId').eq(user_id)
)
# ✅ Uses real GSI from suggest_gsiWhere It Helps
The bugs that only appear at runtime.
AI hallucinates column names, queue types, event shapes, and filter policies. Infrawise gives it your actual infrastructure so it stops guessing.
Pasting your schema into the chat, again
The oldest ritual in AI-assisted development: copy the table definitions out of the console, paste them into the chat, repeat next session. The pasted copy is partial, and it goes stale the moment someone runs a migration.
-- pasted by hand at the top of every session
CREATE TABLE orders (
id uuid PRIMARY KEY,
customer_id uuid, -- FK to what? nullable?
... -- 40 more tables to go
);
-- ❌ partial, and stale after the next migration
-- the assistant asks infrawise instead
get_table_schema({ tables: ["orders", "customers"] })
-- → columns, types, primary keys, foreign keys
SELECT o.id, c.email FROM orders o
JOIN customers c ON c.id = o.customer_id;
-- ✅ real column names, real join path, live schema
Wrong Lambda event shape
AI guesses the handler signature. SQS, S3, and EventBridge all use different shapes — getting it wrong means silent undefined at runtime.
# AI guesses the payload structure
def handler(event, context):
body = json.loads(event["body"])
process(body["orderId"])
# ❌ SQS wraps in Records — event["body"] is None
# analyze_function returns the exact event shape
def handler(event, context):
body = json.loads(event["Records"][0]["body"])
process(body["orderId"])
# ✅ Correct shape — no silent failures
FIFO queue missing MessageGroupId
AI writes a standard SendMessage call without checking if the queue is FIFO. FIFO queues require MessageGroupId — omitting it throws a runtime error.
# AI writes a standard SendMessage call
sqs.send_message(
QueueUrl=queue_url,
MessageBody=json.dumps(order),
)
# ❌ FIFO queue — InvalidParameterValue at runtime
# get_queue_details shows isFifo: true
sqs.send_message(
QueueUrl=queue_url,
MessageBody=json.dumps(order),
MessageGroupId=order["customerId"],
)
# ✅ Required field included — no runtime error
SNS message silently dropped
A subscription has a filter policy requiring specific message attributes. Missing one drops the message with no error, no retry, and no DLQ entry.
# AI publishes without checking filter policies
sns.publish(
TopicArn=topic_arn,
Message=json.dumps(payload),
)
# ❌ "eventType" required — subscription drops it silently
# get_topic_details reveals requiredAttributes
sns.publish(
TopicArn=topic_arn,
Message=json.dumps(payload),
MessageAttributes={
"eventType": {"DataType": "String",
"StringValue": "order.created"},
},
)
# ✅ All required attributes present — delivered
Who It Helps
The same graph, three different jobs.
Writing a handler is one use. The graph is just as useful for onboarding onto a service you did not build, reviewing someone else's pull request, or auditing an account you inherited.
Software engineer
Shipping the feature in front of you
Your first week on an unfamiliar service
get_infra_overview → get_graph_summaryAsk "what does checkout actually touch?" and get the blast radius back: every table, queue, and topic it reaches, and which Lambda sits behind each API route. No reading 40 Terraform files, no clicking through six console tabs.
Writing a query against a 200-table database
get_table_schemaPull schemas for the three tables you need — columns, types, primary keys, and the foreign keys that give you the join path. The rest of the database never enters the context window.
Triage without leaving the editor
get_log_errors + get_queue_detailsA queue is backing up. Is the consumer stuck or is the Lambda being throttled? oldestMessageAgeSec and recentThrottles answer it in one question, before you open CloudWatch.
Principal engineer
Raising the floor for everyone else
The IAM policy nobody remembered to update
analyze_functionRun it on the handler in the pull request: what it reaches, what triggers it, and missingPermissions — the services the code calls that its execution role does not allow. Found in review instead of at 3am.
Make the standard enforce itself
infrawise check --fail-on highA queue with no DLQ, a bucket with no encryption, a Lambda still on default memory — the build fails on the pull request. The convention stops depending on whoever happens to review it.
Know every consumer before you change the contract
get_graph_summary + get_topic_detailsBefore renaming a column or a topic, list every function that queries the table and every producer and consumer of the topic — mapped from real code, not from tribal memory.
Architect
The estate, not the endpoint
Find the infrastructure nobody declared
IaC drift findingsTwo lists worth having before any audit: resources running in the account with no Terraform, CloudFormation, or CDK definition behind them, and definitions that were never deployed at all.
One security posture sweep, not six
infrawise analyzePublic S3 buckets, unencrypted queues, secrets with rotation switched off, publicly accessible RDS instances, cache clusters without transit encryption — one report, severity-ranked, across every service at once.
A cost pass that arrives before the bill
cost signalsProvisioned-capacity DynamoDB tables, 3 GB Lambdas that have never once throttled, cache clusters carrying more nodes than they need — surfaced as advisory signals you can act on this month.
Quick Start
Up and running in 60 seconds.
$ npm install -g infrawise
$ infrawise start --claude
✔ Scanning AWS services…
✔ Scanning databases…
✔ Scanning IaC files…
✔ Running 37 analyzers…
✔ 22 MCP tools ready
✔ .mcp.json written
✔ Open Claude Code in this directory
12 findings — 3 high, 6 medium, 3 lowHow It Works
Five steps. One command.
Reads AWS services, databases, and IaC files statically — no agents, no polling.
Constructs a typed graph of every node and edge: tables, queues, lambdas, topics, buckets.
Rule-based analyzers flag missing indexes, absent DLQs, default Lambda memory, and more.
Exposes the graph and findings as 22 MCP tools your editor can query during generation.
Right GSI name, right event shape, right DLQ config — grounded in your actual infrastructure.
Works With Your Editor
Drop-in for every AI coding tool.
Standard MCP protocol. No plugins, no extensions, no lock-in.
Claude Code reads .mcp.json automatically — just run infrawise start and open your editor.
Architecture
How Infrawise connects to your tools.
Writing
From the blog
Practical guides on AWS, serverless patterns, and AI-assisted infrastructure from the team behind Infrawise.
Fix N+1 Trigger Patterns Where Lambda Functions Hammer the Same DynamoDB Partition Key
You add a sixth Lambda trigger to your OrderEvents table, deploy it, and within 20 minutes your SLA breaches. Here's how to detect and fix N+1 trigger patterns before they hit production.
Read article →Give Your AI Assistant Infrastructure Eyes Before It Writes Another Query
You asked Claude Code to add pagination to your order history endpoint. It generated a clean function — for a GSI that doesn't exist. Here's how to fix that.
Read article →How I gave Claude Code eyes on my infrastructure — and stopped flying blind
As a full-stack developer, I write the code. But I don't always know what happens after it deploys. Is my Lambda running out of memory? Is that SQS queue dropping messages silently?
Read article →AI Generated a DynamoDB Query That Could Never Work
I asked an AI coding assistant to generate a DynamoDB query. A few seconds later it confidently gave me code querying a GSI that didn't exist. Here's what went wrong and how to prevent it.
Read article →Ready to go deeper?
Full configuration reference, all CLI flags, and all 22 MCP tools documented with inputs, return shapes, and usage patterns.
View full docs →