infrawise
Infrawise is a read-only MCP server that gives AI coding assistants deterministic infrastructure awareness across AWS, databases, IaC, and code relationships.
Get an infrastructure overview or full graph of services, findings, and recognized code edges.
Inspect table and collection schemas, including keys, indexes, DynamoDB capacity details, and MongoDB counts.
Analyze functions and Lambda handlers for table access patterns, scans vs queries, triggers, event shapes, and missing IAM permissions.
Generate exact index suggestions for DynamoDB GSIs, PostgreSQL, MySQL, and MongoDB.
Review SQS queues, SNS/Kafka topics, Kinesis streams, and MSK clusters.
Inspect Lambda configuration and triggers, API Gateway routes, EventBridge rules, S3 buckets, CloudFront distributions, Cognito pools, and ElastiCache clusters.
Check Secrets Manager and SSM Parameter Store metadata without exposing values.
View CloudWatch log group retention metadata only, never log message bodies.
Read IaC stack outputs and cross-stack exports, with staleness warnings for CDK outputs.
Use
dataHealthand freshness controls to judge whether results are current, complete, or limited by source health.
Provides tools to suggest exact createIndex commands for MongoDB collections based on query patterns.
Provides tools to suggest exact ALTER TABLE ADD INDEX SQL for MySQL tables and detect missing indexes.
Provides tools to suggest exact CREATE INDEX SQL for PostgreSQL tables and detect missing indexes.
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.

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 rowsRecommend adding a GSI on
statusthat you already haveWrite a
SELECT *when you need to keep query cost lowNot 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 INDEXSQL or GSI config for your tables — not generic advice
Related MCP server: Cost Management MCP
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.
Installation
Requires Node.js 22 or later (node --version).
npm install -g infrawiseor use without installing:
npx infrawise start --claudeQuick start
cd your-project
infrawise start --claudeThat's it. Infrawise will:
Probe your environment and generate
infrawise.yaml(first time only — asks which AWS profile to use only if you have several)Scan your AWS services, databases, and codebase
Write
.mcp.jsonso your editor auto-connects on every future launchOpen Claude Code with all 22 MCP tools ready
Every time after:
claude # no infrawise command needed — editor manages the connectionAnalysis 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 keeps its TypeScript project in memory and scans only changed files and their transitive importers. 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.Using with AI coding assistants
Claude Code (recommended)
infrawise start --claudeWrites .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@infrawiseCursor
infrawise start --cursorWrites .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 --vscodeWrites .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 startWrites .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/mcpAdd 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 |
| Complete snapshot — services, counts, high-severity findings, |
| Full infrastructure graph — all nodes, edges, and findings |
| Column-level schema for named tables/collections — types, PKs, FKs, indexes, DynamoDB keys/billing mode, cost signal (no row data) |
| 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 |
| Exact GSI config for a DynamoDB table + attribute — names the existing index instead when one already covers it |
| Exact |
| Exact |
| Exact |
| SQS queues — DLQ status, encryption, FIFO type, visibility timeout, message counts |
| API Gateway APIs (REST, HTTP, WebSocket) — routes, HTTP methods, paths, and Lambda integrations |
| SNS topics — subscription counts, protocols, and filter policies (required message attributes per subscription) |
| Secrets Manager — names, rotation status, and key names inferred from code (values never included) |
| SSM Parameter Store — names, types, tiers (values never included) |
| 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 ( |
| EventBridge rules — name, state, schedule/event pattern, target functions |
| S3 buckets — versioning, encryption, public access, event notifications |
| CloudWatch log group names and retention (metadata only; no message bodies) |
| Stack outputs and cross-stack exports parsed from local IaC files, with staleness flags for orphaned |
| Cognito user pools — MFA config, app client auth flows, OAuth settings, token validity (secrets never included) |
| Kinesis streams (shards, retention, capacity mode) and MSK clusters (state, Kafka version, brokers) |
| ElastiCache clusters — engine, encryption in transit/at rest, replication group, failover, cost signal (data never read) |
| 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.
CLI reference
Command | What it does |
| Primary command — probe env, generate config, analyze, write editor MCP config |
| Same as above, then opens Claude Code |
| Same as above, then opens Cursor |
| Same as above, then opens VS Code (merges into |
| Run the guided setup wizard instead of auto-discovery |
| Delete |
| Force a full re-scan with extraction progress and a time estimate from past runs — useful after major infrastructure changes |
| CI gate — analyze and exit non-zero when findings reach the threshold severity |
| Start the MCP server — HTTP by default, or |
| Diagnostic escape hatch — validate AWS/DB access, config, and repo scan |
infrawise analyze options
Flag | Description |
| Path to |
| Repository to scan (default: current directory) |
| Skip reading/writing the cache |
| Save findings as a markdown report, e.g. |
| Only show findings at or above this level: |
# 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.mdinfrawise 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 |
| Path to |
| Repository to scan (default: current directory) |
| Severity that fails the build: |
| 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 mediuminfrawise serve options
Flag | Description |
| Path to |
| Use stdio transport (for editors via |
| Port to listen on, HTTP only (default: |
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/mydbFull 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-analyzeAWS 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 myprofilePostgreSQL 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.
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 ( |
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 |
|
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 |
|
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 |
|
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
Infrawise scans your repository and infrastructure metadata
A graph engine maps services, schemas, indexes, and query patterns
Rule-based analyzers detect infrastructure and query anti-patterns
The resulting context is exposed through MCP
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.
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.
Architecture overview
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)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
Large monorepos may require future incremental analysis optimization
Roadmap
Feature roadmap is tracked in the Infrawise v1 project board. Feature requests and upvotes welcome.
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.

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 versionBumps 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
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: 15refreshIntervalMinutes 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.
Available Tools
22 toolsanalyze_functionAnalyze a functionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Bind the result to one source file: the full stored path, or a trailing fragment on a path-segment boundary (e.g. "orders.ts" or "handlers/orders.ts"). Case sensitive. | |
| function | Yes | Function name to analyze | |
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint; the description adds substantial behavior the agent could not otherwise know: no AWS re-read happens on a tool call and dataHealth.withinRequestedAge reports freshness, ambiguous matches withhold `accesses`, unresolvedLambdas explains refused Lambda links with reasons, and candidateLambdas replaces an empty `triggers`. This is exactly the kind of context annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is well front-loaded, but the body runs long as an unstructured wall of conditionals covering every branch of the return shape. Each clause is informative, yet the density without formatting or grouping makes it easy to lose the primary purpose among the edge-case handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so thoroughly: success shape (`matches` per file), the single-match shortcut, ambiguity, no-match, unresolved-Lambda, and not-found cases are all specified, plus the freshness caveat. An agent has enough to call it and interpret every plausible response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `file` (path or trailing fragment, case sensitive) and `maxAgeSeconds` (advisory freshness tolerance) are already documented in the schema, and the description largely restates them. It does add the consequence chain around `file` values, but that is response behavior rather than new parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (analyze a named function/Lambda handler) and enumerates the exact findings: tables queried, scan vs query, queue publishing, secret access, trigger event shape. This is clearly differentiated from the sibling overview tools (get_lambda_overview, get_infra_overview), which are catalog-level rather than per-function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the moment of use ('Call this before writing or reviewing a Lambda handler') and gives conditional guidance for the `file` parameter (pass it to bind to the file you are editing; re-call with `file` rather than guessing on ambiguity). No alternative tool is named, but no sibling performs this same analysis, so there is little to route against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_routesAPI Gateway routesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavioral context by disclosing that it enumerates ALL APIs across three protocol types and links each route to its Lambda, which is more than the annotations convey. The snapshot/freshness caveat lives in the parameter schema rather than the description, a minor omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the return content and followed by usage scenarios. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully explains the returned structure (routes, methods, paths, Lambda target). Annotations cover the safety profile and the sole parameter is fully documented, so an agent has enough to call it correctly. Only the freshness behavior, which is documented in the schema, is not echoed in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single maxAgeSeconds parameter, and the schema itself richly documents its freshness-tolerance semantics. The description adds no additional parameter meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('all API Gateway APIs (REST, HTTP, WebSocket)'), then enumerates exactly what fields come back (routes, HTTP methods, paths, and the invoked Lambda). It is clearly distinct from siblings like get_lambda_overview or get_infra_overview because it names the API Gateway domain and its route-to-Lambda linkage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete when-to-use scenarios: 'before writing any API handler to understand which Lambda handles a route' and 'when reviewing API surface area and Lambda integration coverage.' This is clear context, though it doesn't name an explicit alternative tool or a when-not-to-use condition, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cache_overviewElastiCache overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real value beyond that: it clarifies that cached data is never read, warns of the TLS/rediss:// client-code implication, and discloses the costSignal annotation on clusters with more than 3 nodes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded — the highest-value content (what is returned, when to call) leads, and each sentence carries distinct information (fields, usage, data-exclusion, cost note). Three sentences with little waste, though the costSignal sentence is somewhat tangential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only overview tool with one optional param and no output schema, the description compensates by enumerating returned fields and disclosing behavior. An agent has enough to call it correctly and interpret the result; only the exact response shape is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional maxAgeSeconds parameter is fully documented in the schema, so baseline is 3. The description adds no parameter information beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns all ElastiCache clusters') and enumerates the exact fields returned (engine, version, node type, encryption status, failover state). This is clearly distinguishable from the sibling overview tools, which cover entirely different AWS services.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use conditions: 'Call this before writing cache client code' and 'when reviewing cache availability and security posture.' No explicit when-not or named alternative, but the service scope makes alternatives largely irrelevant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cloudfront_overviewCloudFront distribution overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: behaviors are returned in CloudFront match order with ordered behaviors first and the default last, and execute-api origins get their API Gateway name resolved. It stops short of stating any result-size or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph that front-loads the return contents before moving to usage guidance, so an agent gets the most important information first. Every clause carries content, though the single long sentence is slightly heavy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing return shape and it does so thoroughly, including field-level detail and ordering semantics. It is nearly complete, lacking only edge-case notes such as result limits or how large distribution sets are handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single maxAgeSeconds parameter is fully documented in the schema, including its advisory freshness semantics. The description adds nothing about the parameter, so the baseline of 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns) and resource (all CloudFront distributions) and then enumerates exactly what is included per distribution: id, domain, aliases, origins, and each cache behavior with path pattern, target origin, cache policy, protocol and methods. This is precise enough to distinguish it from siblings such as get_cache_overview and get_api_routes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names three usage contexts: answering which distribution/behavior serves a path and which origin it hits, checking before changing a path-based routing rule, and reviewing edge caching/HTTPS enforcement. It gives clear when-to-use guidance but names no alternative sibling or explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cognito_overviewCognito user pool overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds real behavioral context beyond them: secret values are never returned, and SECRET_HASH must be sent when a client has a secret. It stops short of describing pagination or snapshot staleness mechanics in the description body itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is returned, then the usage trigger, then the exclusion. Dense but nearly every clause carries information; the enumeration of client fields is slightly long but justified since there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return content and does so thoroughly (MFA config, auth flows, OAuth scopes, callback URLs, token validity, secret presence). Nothing an agent needs to call it correctly appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single optional maxAgeSeconds parameter is fully documented in the schema including its advisory nature and refresh behavior. The description adds nothing about parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns all Cognito user pools with MFA configuration and every app client config') and enumerates the returned facets, letting an agent distinguish it from sibling overview tools like get_secrets_overview or get_lambda_overview without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit positive trigger ('Call this before writing any Cognito sign-in, sign-up, or token-refresh code') plus an explicit exclusion ('Do NOT call to look up users or tokens'). Both when-to-use and when-not are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventbridge_detailsEventBridge rule detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and locality are covered without description support. The description adds value by disclosing the shape of the returned data (states, expressions, patterns, targets), but says nothing about auth requirements, rate limits, or freshness. With annotations carrying the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded: the return contents first, then the usage contexts. Every clause carries concrete information (field names, rule types) and there is no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by enumerating the returned fields, which is exactly what an agent needs to interpret results. Only one optional parameter exists and annotations cover the safety profile. The only minor omission is that the snapshot/staleness model lives solely in the schema, not the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter (maxAgeSeconds) and schema description coverage is 100%, so the schema fully explains its semantics, including the advisory freshness behavior and dataHealth reporting. The description does not mention it, but per the baseline rule, a 3 is correct when the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Returns) plus resource (EventBridge rules) and enumerates the exact fields returned: name, ENABLED/DISABLED state, schedule expression, event pattern, and target Lambda names. This clearly distinguishes it from sibling overview tools like get_lambda_overview because it is scoped to EventBridge rules and their triggers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it: 'when checking what schedule or event triggers a Lambda, or when reviewing rule coverage across the account.' This gives two concrete usage contexts. It does not name a specific alternative tool or an exclusion condition, so it stops short of a 5, but the trigger conditions are clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_graph_summaryFull infrastructure graphARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint true, openWorldHint false), so the description correctly spends its space on the non-obvious caveat: gaps in dataHealth.codeCoverage mean missing edges never prove no runtime access. That is a genuinely useful epistemic limit not derivable from annotations, though it stops short of describing pagination, size, or shape of the payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler: return contents first, then the critical caveat, then the usage/routing sentence. Front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return contents and does so by enumerating the four payload categories, plus it flags the coverage caveat. It could say more about payload volume or how findings are structured, but nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema description coverage is 100%, with the schema itself carrying rich guidance on when to pass a small maxAgeSeconds versus omitting it. The description does not mention the parameter at all, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific contents returned (nodes, code edges, findings, unresolvedReferences) rather than restating the title, and it explicitly distinguishes itself from get_infra_overview. An agent can tell what this returns and how it differs from the sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives both a positive condition ("when tracing relationships across services or inspecting the full finding set") and a routing rule to the alternative ("prefer get_infra_overview for quick orientation"). This is explicit when/when-not guidance against a named sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_infra_overviewInfrastructure overviewARead-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".
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint=true and openWorldHint=false, and the description adds substantial behavior beyond that: the `configured` flag semantics (empty results when no infrawise.yaml is loaded), the `setupHint`, the fixed `dataHealth` shape with `analyzedAt`/`ageSeconds`/`iac`/`refreshWith`, and the crucial interpretation rule that a non-`ok` source means 'not read' rather than 'none exist'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the highest-value content (what it returns, then routing guidance) before the response-shape detail. It is dense at six sentences, and the dataHealth explanation is somewhat lengthy, but given there is no output schema most of it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and rich response semantics (configured flag, dataHealth block, per-source status interpretation), the description carries the return-value burden well and explains how to read an empty result. An agent can call this tool correctly and interpret its response without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter with 100% schema description coverage, and the schema already documents the advisory freshness-tolerance semantics of `maxAgeSeconds` in detail. The description adds no parameter-specific meaning, so the baseline of 3 for high schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Returns a compact infrastructure snapshot') and enumerates what it contains (service counts, databases, queues, topics, secrets, lambdas, findings). It explicitly distinguishes itself from the sibling get_graph_summary, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Call this first at the start of any database or infrastructure task'), names the alternative ('Prefer this over get_graph_summary'), and states the exact condition that selects the alternative ('use get_graph_summary only when you need every node, edge, and finding in full'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lambda_overviewLambda function overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, yet the description adds substantial context: env var values are never returned, the costSignal is a config-level heuristic with no billing API, and unresolvedLink carries a reason enum (no_match/multiple_functions/multiple_lambdas) with the consequence that analyze_function returns no triggers. These are behaviors an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with returns and usage routing, then the edge-case details. It is long, but nearly every sentence carries non-obvious behavioral information. Slight density cost for an overview tool, though no sentence is clearly wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description fully compensates by describing the return contents, the costSignal heuristic, and the unresolvedLink structure with its reason values and downstream effect. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single maxAgeSeconds parameter is thoroughly documented in the schema itself (freshness tolerance, dataHealth.withinRequestedAge, the analyze refresh caveat). The description adds no parameter-specific meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and enumerates exactly what is returned: runtime, memory, timeout, environment variable key names, and trigger event shapes. It explicitly distinguishes itself from the sibling analyze_function ('without running analyze_function'), so an agent can select it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions ('auditing Lambda configuration for default memory (128 MB) or high timeouts', 'need the trigger event shape for a specific function') and names the alternative it substitutes for (analyze_function). This is a textbook when/when-not with an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_log_errorsCloudWatch log group metadataARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| logGroup | No | Filter to a specific log group name (optional) | |
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations by disclosing the exact response semantics: errorCount is null, topErrorPatterns is empty, errorsObserved is false, and no message bodies are fetched. Since there is no output schema, this is the only place an agent learns how to interpret the response and why empty error fields must not be read as 'no errors'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is returned, then the legacy-name caveat, then usage guidance — a sensible order with no filler. There is mild redundancy between 'errorsObserved is false' and the later warning not to infer no errors, though the second occurrence serves a different (interpretive) purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the returned fields and their placeholder values, the filtering parameter, and the key interpretive pitfall. Combined with full schema coverage and safety annotations, an agent has everything needed to call and read this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already well documented, including the advisory nature of maxAgeSeconds and the stale-snapshot behavior. The description only restates that logGroup filters names, adding no syntax or semantics beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (returns CloudWatch log group names and retention metadata) with an explicit scope exclusion (without reading log events). It also disambiguates the misleading legacy name get_log_errors, so an agent can't mistake it for an error-diagnosis tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit positive trigger ('Call when checking retention policies') and explicit exclusions ('do NOT use to diagnose runtime errors or infer that no errors occurred'), plus guidance to use logGroup for filtering. Nothing about when to select or avoid this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_parameter_overviewSSM parameter overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral fact beyond annotations: 'Parameter values are never returned,' which tells the agent this cannot leak secrets. It does not cover pagination or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each doing distinct work: what is returned, what is excluded, and when to call it. The scope is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey the return shape, and it does: all parameters with type and tier, values omitted. Combined with annotations and a fully documented parameter, this is nearly complete; only ordering, pagination, or result-size behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter maxAgeSeconds is fully documented in the schema (100% coverage), including its advisory freshness semantics, so the description need not repeat it. The description adds no parameter-level information, which is the correct baseline of 3 when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('all SSM Parameter Store parameters'), plus the exact fields returned (type and tier). It is clearly distinguishable from neighboring tools like get_secrets_overview by naming the SSM Parameter Store domain, though it does not explicitly contrast with any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'checking which config parameters exist for a service or verifying parameter types.' That is clear context, but there is no when-not guidance or named alternative (e.g., get_secrets_overview) to route the agent away when appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queue_detailsSQS queue detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnlyHint/openWorldHint, so safety is established, but the description adds real behavioral context: CloudWatch-derived oldestMessageAgeSec, the FIFO MessageGroupId requirement, and the 6x Lambda timeout rule of thumb. It doesn't cover output shape or pagination, but the added semantics clearly exceed the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return payload, then when-to-use, then the sibling alternative. Dense and largely waste-free, though the FIFO MessageGroupId aside is mildly tangential to selecting this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating returned fields and the optional runtime-signal field. Combined with when-to-use guidance and the sibling alternative, an agent has enough to call it correctly; only minor detail (e.g. multi-account scope) is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single maxAgeSeconds parameter is thoroughly documented in the schema itself (freshness tolerance, advisory behavior, dataHealth.withinRequestedAge). The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('all SQS queues') and enumerates the concrete fields returned (DLQ presence, encryption, isFifo, visibility timeout, message count, retention). It explicitly contrasts with sibling get_infra_overview, so an agent can distinguish the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use triggers ('reviewing messaging architecture, investigating a message backlog, checking DLQ coverage, verifying visibility timeout') and names the alternative with its narrower scope ('Use get_infra_overview for a quick queue count only'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_s3_overviewS3 bucket overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower. The description still adds real boundary information beyond the annotations: security findings are included and object contents never are, which tells the agent what this tool will and won't report. It stops short of describing staleness behavior, though the schema parameter carries that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each doing distinct work: what is returned, when to call, when not to call plus the alternative, and one scope boundary. The most decision-relevant content (the return inventory) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by enumerating the returned fields and the one thing never returned. Combined with the routing guidance and a fully documented parameter, an agent has everything needed to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single maxAgeSeconds parameter is thoroughly documented in the schema itself, including the advisory semantics and the analyze refresh note. The description adds no parameter-level information, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (returns all S3 buckets) and enumerates exactly what each entry carries: versioning, encryption, public access configuration, security findings. It also explicitly negates the closest sibling case by routing counts to get_infra_overview, so an agent can separate it from the other *_overview tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete triggering situations (checking which buckets exist, reviewing security posture, confirming a bucket name before writing upload/delete handlers) and an explicit exclusion with the named alternative for the count-only case. Both the when and the when-not are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_secrets_overviewSecrets Manager overviewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful provenance context the annotations cannot: referencedKeys are key names inferred from parsing application code and are never secret values. It does not restate the schema's freshness/snapshot caveat, which is the one behavioral element left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each doing distinct work: the first front-loads what is returned and what referencedKeys means, the second front-loads when to call it. No redundant phrasing or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only overview tool with no output schema, the description covers the resource scope, the returned fields, the semantics of the non-obvious field, and the calling conditions. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single optional maxAgeSeconds parameter, and the description adds nothing about it. Baseline 3 applies when the schema fully carries parameter documentation, and the description does not compensate with any extra semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Returns) plus resource (all Secrets Manager secrets) and an enumeration of the returned fields (rotation status, rotation interval, referencedKeys). It is immediately distinguishable from sibling overview tools like get_parameter_overview or get_s3_overview, which cover different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete when-to-use scenarios: checking which secrets exist, confirming rotation before a security review, and looking up the correct key name before writing code. Clear context, but it names no exclusions or alternative sibling tools, so it stops short of the top of the scale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stack_outputsIaC stack outputsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and openWorldHint, so safety is already covered; the description goes further by disclosing the data provenance (parsed from local IaC files, not the deployed stack), the staleness model (CDK outputs carry stale:true and staleReason), and the remediation ('re-synthesizing'). This is meaningful behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The primary purpose is front-loaded in the first clause, followed by return fields, usage triggers, exclusions, and the staleness caveat. Each sentence carries distinct information with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (name, description, export name, raw value expression) and the stale/staleReason flags. Combined with the annotation-covered safety profile and a fully documented lone parameter, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single maxAgeSeconds parameter is fully documented in the schema, including the advisory-with-dataHealth.withinRequestedAge behavior. The description adds freshness framing but no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns all stack outputs and cross-stack exports') and enumerates the sources (Terraform output blocks, CloudFormation/CDK Outputs sections) and returned fields. It also explicitly scopes itself against live attributes ('outputs come from local IaC files, not the deployed stack'), so an agent can distinguish it from the resource-introspection siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers ('wiring cross-stack references (Fn::ImportValue, terraform_remote_state) or when you need the exported name of a resource defined in another stack') and an explicit when-not ('Do NOT call for live resource attributes'). This leaves nothing to inference for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stream_detailsKinesis and MSK detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds value by enumerating exactly what a caller receives (status, shard count, retention, encryption, capacity mode) even though no output schema exists, which is genuinely useful behavioral disclosure. It stops short of describing snapshot freshness or pagination in the tool description itself, though the schema parameter documents the cached-snapshot model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all load-bearing: returns first, usage scenarios second, sibling disambiguation third. No filler, no repetition of the title, and the routing information is front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup tool with no output schema, the description compensates by enumerating the returned fields for both stream types, and the schema fully documents the single optional parameter. Nothing an agent needs to select or invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter (maxAgeSeconds) carries a rich description covering freshness tolerance, dataHealth.withinRequestedAge, and the need to run `infrawise analyze` to refresh. The tool description adds nothing about this parameter, so the baseline 3 for full schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and two named resources (Kinesis data streams and Amazon MSK clusters) and enumerates the concrete attributes returned for each (status, shard count, retention hours, encryption, capacity mode; state, cluster type, Kafka version, broker count). It also explicitly contrasts itself with the sibling get_topic_details, so an agent can distinguish the two streaming-related tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete triggering scenarios ('writing Kinesis producer or consumer code', 'checking whether a stream is PROVISIONED or ON_DEMAND before writing PutRecord calls', 'reviewing streaming architecture') and names the alternative for a different case ('For Kafka topic-level producer/consumer mappings... use get_topic_details instead'). Both when-to-use and when-to-use-something-else are stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_schemaTable and collection schemasARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tables | Yes | Table or collection names to fetch schemas for | |
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description goes much further: row data is never returned, index metadata describes possible access paths rather than observed query plans, found:false must be read against source health, and DynamoDB may carry an advisory costSignal. These are non-obvious behavioral traits an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded: what is returned comes first, then usage ordering, exclusions, and caveats. It is dense but nearly every clause carries operational information; the index 'possible access paths, not observed query plans' clarification and the costSignal note are the most compressed items and border on terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only schema-inspection tool with no output schema, the description covers return content, scoping limits, name resolution, absence semantics, and staleness handling. An agent has everything needed to invoke it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters, giving a baseline of 3. The description adds real value on top by stating that short names match qualified names case-insensitively and by reinforcing scoping to only the needed tables, though it does not explain the maxAgeSeconds advisory behavior that the schema covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (Returns) and resource (schemas) and enumerates the exact content returned: column types/nullability, keys, foreign keys, indexes, DynamoDB keys/billing mode, and MongoDB estimated counts. It also explicitly separates itself from the inventory sibling, so an agent can distinguish the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit ordering ('Call after get_infra_overview before writing queries'), an efficiency constraint ('request only needed tables'), and a hard exclusion with the alternative named ('Do NOT use for inventory; use get_infra_overview'). It also flags a caveat on interpretation ('Read source health before treating found:false as absence').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topic_detailsSNS and Kafka topic detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxAgeSeconds | No | Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions ("does this queue have a DLQ right now"); omit it for architecture questions where a day-old snapshot is fine. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower, and the description adds genuinely non-obvious behavior: filter policies determine required message attributes and violating publishers get messages 'silently dropped.' That is real operational consequence beyond the structured fields. It does not discuss data freshness, though the maxAgeSeconds schema entry covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, with the return contents front-loaded and the call-to-action last. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what comes back (subscription counts, encryption status, filter policies) and flags the silent-drop consequence. The one gap is the Kafka scope implied by the title but absent from the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and maxAgeSeconds is documented in exhaustive detail (advisory semantics, dataHealth.withinRequestedAge, when to pass small vs. omit). The description adds nothing about parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Returns) and resource (SNS topics) and enumerates what is included: subscription count, encryption status, and filter policies. It implicitly separates itself from siblings like get_queue_details and get_eventbridge_details by resource, but never names them, and the title's promise of 'Kafka topic details' is not reflected in the description text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers: 'Call this before writing any SNS publish code or when reviewing event fan-out patterns.' That is actionable context for the agent. It stops short of a 5 because it names no alternative tool or when-not-to-call condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mysql_index_suggestionsSuggest a MySQL indexARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | MySQL table name | |
| column | Yes | Column name to index |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description is consistent with that (it only generates SQL text). It adds real context beyond the annotations: the output includes a composite variant plus EXPLAIN verification guidance, and it explicitly disclaims existence checking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is produced, then when to call it, then the caveat. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by describing the deliverable (ALTER TABLE statement, composite variant, EXPLAIN guidance), which is exactly what an agent needs to know before invoking it. Nothing material is missing for a two-parameter read-only generator.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with two well-described required parameters (table, column), so the schema already carries the parameter semantics. The description's phrase 'for a MySQL table column' merely restates that pairing and adds no format or constraint detail, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact: generates the exact ALTER TABLE ADD INDEX SQL for a MySQL table column. The MySQL qualifier cleanly separates it from the sibling index tools (postgres_index_suggestions, suggest_mongo_index, suggest_gsi) without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger: 'Call this when the analyzer flags a missing MySQL index or full table scan finding.' It also states one boundary condition (does not check for an existing index), but it never names an alternative tool for non-MySQL engines, leaving that routing to the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
postgres_index_suggestionsSuggest a PostgreSQL indexARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | PostgreSQL table name | |
| column | Yes | Column name to index |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=false, and the description is consistent with them (it emits SQL rather than executing DDL). It adds genuinely useful behavior beyond the annotations: the output includes a partial index variant and a post-creation ANALYZE reminder, and it discloses the limitation that existing indexes are not checked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all load-bearing: what is produced, when to call it, and the explicit non-guarantee. The output composition is front-loaded ahead of the usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly fills that gap by enumerating what is returned (CREATE INDEX CONCURRENTLY SQL, partial variant, ANALYZE reminder). Combined with the existence-check caveat, an agent has enough to call and interpret results; only pagination/return-shape mechanics are absent and largely irrelevant for a two-string-input generator.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both params ('PostgreSQL table name', 'Column name to index'), so the schema already carries the parameter meaning. The description restates 'table column' without adding format, qualification, or naming-convention detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact (generates the exact CREATE INDEX CONCURRENTLY SQL) for a specific resource (PostgreSQL table column), and names sibling-adjacent alternatives implicitly by being PostgreSQL-specific against suggest_gsi/suggest_mongo_index/mysql_index_suggestions. An agent can distinguish it from all listed siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete invocation triggers ('when the analyzer flags a missing index finding' or 'when writing a query that filters on a column without an existing index') and one exclusion ('Does not verify whether the index already exists'). It stops short of explicitly naming sibling tools as alternatives, but the when-to-use conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_gsiSuggest a DynamoDB GSIARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | DynamoDB table name | |
| attribute | Yes | Attribute to create the GSI on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description is consistent — this only proposes a definition rather than mutating the table. It adds genuinely useful behavior beyond the annotations: it checks existing indexes first and returns alreadyIndexed: true with the existing index name instead of proposing a duplicate. It does not describe the non-duplicate return shape, which would have pushed this to a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: capability, trigger conditions, and idempotent-check behavior. The capability is front-loaded and the alternative is routed at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description correctly compensates by describing the alreadyIndexed return and its semantics for a duplicate attribute. It covers the common case well, though the full output shape for the success path is only partially implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, so the schema carries the load. The description implies the attribute is what gets keyed and the table is the target, but adds no syntax or format detail beyond the schema — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — generates a ready-to-use DynamoDB GSI definition — and enumerates what the output contains (index name, partition key, projection type, billing mode). It clearly separates itself from sibling get_table_schema by naming it as the tool for the full index list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger conditions are given: when a query pattern needs an index that does not exist yet, or when the analyzer flags a missing GSI finding. It also names the alternative (get_table_schema) and the condition that selects it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_mongo_indexSuggest a MongoDB indexARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | Field name to index | |
| collection | Yes | MongoDB collection name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: what the output contains (createIndex command, compound/text variants, verification explain query) and the limitation that it will not detect an existing index. It stops short of saying the output is advisory only or how duplicates would manifest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: output scope first, invocation triggers second, limitation last. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing what is produced and why (verification via explain). With annotations covering safety, triggers covered, and the duplicate-index caveat stated, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two parameters (field, collection), both self-describing, so the schema carries the semantics. The description adds no format, naming, or dot-notation guidance for nested fields that would go beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Generates the exact db.collection.createIndex() command for a MongoDB field') and enumerates the deliverables (compound and text variants, explain query). This clearly separates it from the sibling index tools suggest_gsi, postgres_index_suggestions, and mysql_index_suggestions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete triggers ('when a collection scan is flagged by the analyzer' or 'when writing a query that filters on an unindexed field') and adds a boundary condition ('Does not check whether the index already exists'). The only minor gap is not naming a sibling as the alternative, but the invocation conditions are fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.28.0- Changed
analyze_function1 field changed- added
Input schema / properties / fileAdded value: +{ + "description": "Bind the result to one source file: the full stored path, or a trailing fragment on a path-segment boundary (e.g. \"orders.ts\" or \"handlers/orders.ts\"). Case sensitive.", + "type": "string" +}
18 tool updates
v0.26.1- Changed
analyze_function1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_api_routes1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_cache_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_cloudfront_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_cognito_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_eventbridge_details1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_graph_summary1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_infra_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_lambda_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_log_errors1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_parameter_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_queue_details1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_s3_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_secrets_overview1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_stack_outputs1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_stream_details1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
- Changed
get_table_schema1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_topic_details1 field changed- changed
Input schema / properties / maxAgeSeconds / descriptionPrevious value: -"Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."New value: +"Freshness tolerance in seconds. Advisory: the answer is returned either way, with dataHealth.withinRequestedAge reporting whether it met the tolerance. Nothing re-reads AWS on a tool call — run `infrawise analyze` to refresh. Pass a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine."
15 tool updates
v0.25.1- Changed
get_api_routes1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_cache_overview1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Added
get_cloudfront_overview - Changed
get_cognito_overview1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_eventbridge_details1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_graph_summary1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_infra_overview1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_lambda_overview1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_parameter_overview1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_queue_details1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_s3_overview1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_secrets_overview1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_stack_outputs1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_stream_details1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
- Changed
get_topic_details1 field changed- added
Input schema / properties / maxAgeSecondsAdded value: +{ + "description": "Refuse to answer from an analysis older than this many seconds. Use a small value for point-in-time questions (\"does this queue have a DLQ right now\"); omit it for architecture questions where a day-old snapshot is fine.", + "type": "number" +}
11 tool updates
v0.21.0- Added
analyze_function - Added
get_api_routes - Added
get_cache_overview - Added
get_cognito_overview - Added
get_eventbridge_details - Added
get_graph_summary - Added
get_lambda_overview - Added
get_queue_details - Added
get_stack_outputs - Added
get_stream_details - Added
mysql_index_suggestions
11 tool updates
v0.19.7- Removed
analyze_function - Removed
get_api_routes - Removed
get_cache_overview - Removed
get_cognito_overview - Removed
get_eventbridge_details - Removed
get_graph_summary - Removed
get_lambda_overview - Removed
get_queue_details - Removed
get_stack_outputs - Removed
get_stream_details - Removed
mysql_index_suggestions
1 tool update
v0.15.0- Added
get_table_schema
4 tool updates
v0.14.0- Added
get_cache_overview - Added
get_cognito_overview - Added
get_stack_outputs - Added
get_stream_details
TDQS
Scored across 22 tools
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.
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.
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.
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
Related MCP Connectors
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
Hosted MCP server for AWS cloud spend: service breakdowns, anomalies, savings and forecasts.
Hosted SQL Server MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseCqualityDmaintenanceA 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.13296ISC
- AlicenseBqualityDmaintenanceAn 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.10MIT
- AlicenseNot gradedqualityCmaintenanceDiagnose 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.1MIT
- AlicenseAqualityAmaintenanceAI-powered codebase health analysis — detects dead code, circular dependencies, coupling issues, and architectural drift. 6 MCP tools for Claude Desktop, Cursor, Windsurf, and Slack.634 npmMIT