Skip to main content
Glama

Server Details

AI infrastructure design agent. Describe your app in plain English; Riley designs, prices, and deploys AWS or GCP infrastructure with generated Terraform.

Ownership verified
Status
Healthy
Uptime
100.0% over 80 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A4.1/5.0

Scored across 24 tools

Disambiguation4/5

Most tools have clearly distinct purposes (awsinspect vs gcpinspect, tfplan vs tfdeploy vs tfdrift), and the singular/batch split is explicitly documented. The monitoring trio (tfstatus, tflogs, tfruns) and status trio (convostatus, convoinspect, tfstatus) have some conceptual overlap, but descriptions draw clear boundaries. An agent can reliably pick the right tool in nearly all cases.

Naming Consistency3/5

Grouped prefixes are internally consistent (tf*, convo*, stack*, aws/gcp*inspect), but conventions diverge across groups: some are noun+verb concatenations (convoopen, stackdiff) while others are verb-first with underscores (submit_feedback). The standalone 'help' and snake_case 'submit_feedback' break the otherwise uniform lowercase-word pattern, creating mixed conventions.

Tool Count4/5

24 tools is on the heavy side, but the server spans a large domain (conversation workflow, terraform lifecycle, AWS + GCP inspection, versioning, feedback). Each tool maps to a real workflow step, so the surface is scoped rather than padded, though the batch variants and monitor split add some weight.

Completeness4/5

The lifecycle is well covered: open/reply/status, generate, plan, deploy, logs, status, outputs, drift, destroy, runs, versions, rollback, and diff, plus feedback. Minor gaps exist (no explicit job-cancel/stop or direct config-edit tool), but the conversation-driven design makes these workable.

Available Tools

24 tools
awsinspectInspect AWS InfrastructureA
Read-only
Inspect

INSPECTION: Inspect AWS infrastructure for a deployed project ⚠️ PREREQUISITE: This tool requires a prior deployment ATTEMPT (successful or failed). Check convostatus for hasDeployAttempt=true before calling. Works even after failed deploys to inspect orphaned resources.

Inspect deployed AWS resources after a deployment attempt. Use this tool when the user asks about the status or details of their deployed infrastructure. It fetches temporary read-only credentials securely and queries the AWS API directly.

RESPONSE TIERS (default is summary for token efficiency):

  • Summary (default): Key fields only (~500 tokens). Set detail=false, raw=false or omit both.

  • Detail: Full metadata for a specific resource. Set detail=true + resource filter.

  • Raw: Complete unprocessed API response. Set raw=true.

REQUIRES: session_id from convoopen response (format: sess_v2_...). Supported services: account, acm, alb, apigateway, apprunner, backup, bedrock, cloudfront, cloudwatchlogs, cognito, cost-explorer, dynamodb, ebs, ec2, ecs, eks, elasticache, kms, lambda, msk, opensearch, rds, route53, s3, sagemaker, secretsmanager, sqs, vpc, waf For a specific service's actions, call with action="list-actions". METRICS: Use list-metrics to discover available metrics for a service (no credentials needed). Then use get-metrics to retrieve data (auto-discovers resources). Most services return CloudWatch time-series. KMS returns key health (rotation, state). SecretsManager returns secret health (rotation, last accessed/rotated). Optional filters JSON: {"hours":6,"period":300}. BILLING: Use service=cost-explorer to inspect AWS costs. Actions: get-cost-summary (last 30 days by service, filters: {"days":7,"granularity":"DAILY"}), get-cost-forecast (projected spend through end of month), get-cost-by-tag (costs grouped by tag, filters: {"tag_key":"Environment","days":30}). Requires ce:GetCostAndUsage and ce:GetCostForecast IAM permissions.

EXAMPLES:

  • awsinspect(session_id=..., service="ec2", action="describe-instances")

  • awsinspect(session_id=..., service="cost-explorer", action="get-cost-summary")

  • awsinspect(session_id=..., service="ec2", action="get-metrics", filters="{"hours":6}")

  • awsinspect(session_id=..., service="rds", action="describe-db-instances", detail=true)

NameRequiredDescriptionDefault
rawYesWhen true, returns the unprocessed AWS API response. Escape hatch for fields the summarized response doesn't surface.
actionYesOperation on the service. Examples: 'describe-instances' (ec2), 'list-buckets' (s3), 'list-keys' (kms), 'get-cost-summary' (cost-explorer), 'list-actions' (discovery), 'list-metrics' / 'get-metrics' (CloudWatch).
detailYesWhen true, returns full metadata for a single resource (requires a resource ID in filters). When false (default), returns a summary.
filtersYesOptional JSON-encoded filter object passed through to the underlying AWS API. Examples: '{"hours":6}' for metric windows, '{"days":7,"granularity":"DAILY"}' for cost queries.
serviceYesAWS service to query. Examples: 'ec2', 'rds', 'vpc', 's3', 'lambda', 'eks', 'ecs', 'cost-explorer'. Use action='list-actions' to discover the supported actions for a service.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have an AWS deploy attempt before inspect probes will succeed.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
resultNoThe AWS inspect result. A list action returns a summary object (count plus the listed items) when summarized is true; detail and raw actions return the backend result unchanged.
summarizedNoTrue when result is a compact summary instead of the full backend response.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/openWorldHint, but the description adds real substance beyond them: it fetches temporary read-only credentials and hits the AWS API directly, describes the three response tiers and their token cost, and discloses that metrics discovery needs no credentials while billing actions need ce:GetCostAndUsage/ce:GetCostForecast IAM permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the prerequisite and purpose, and the header-based sections (RESPONSE TIERS, REQUIRES, METRICS, BILLING, EXAMPLES) make it scannable despite its length. Slightly redundant: the purpose is restated three times across the opening lines and the 'Use this tool when...' sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-param, multi-service inspection tool with an output schema, this covers everything an agent needs: gating prerequisite, credential/session format (sess_v2_...?token=...), the full service enum rationale, metric and billing sub-flows, and worked examples. Return values need not be explained since an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description genuinely enriches it with concrete filter JSON ('{"hours":6,"period":300}', '{"days":7,"granularity":"DAILY"}'), action discovery via action='list-actions', and the coupling of detail/raw to response tiers. Minor gap: it says detail/raw may be omitted while the schema lists them as required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Inspect AWS infrastructure / deployed AWS resources') and immediately narrows scope to resources created by a deployment attempt. An agent can distinguish it from convoinspect, gcpinspect, and the tf* family 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit prerequisite ('requires a prior deployment ATTEMPT', check convostatus for hasDeployAttempt=true), explicit trigger ('when the user asks about the status or details of their deployed infrastructure'), and an explicit edge case ('works even after failed deploys to inspect orphaned resources'). It also names the sibling (convostatus) that gates this call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

awsinspect_batchBatch-Inspect AWS InfrastructureA
Read-only
Inspect

BATCH INSPECTION: run up to 32 AWS inspect probes in one call. ⚠️ PREREQUISITE: Same as awsinspect — deploy attempt required. Check convostatus for hasDeployAttempt=true before calling.

Use this when you need to check more than ~3 resources. The backend fetches Oracle credentials ONCE per batch and fans out probes against a single AWS config — for a 12-resource health check this is ~5–8× faster and 12× fewer Oracle round-trips than calling awsinspect 12 times.

BUDGETS:

  • Up to 32 sub-probes per call (subs array length).

  • 30s per-sub timeout; 60s total batch wall-clock.

  • Concurrency cap 8 — sub-probes run in parallel but never saturate AWS.

  • 512 KB response cap: subs past the cap keep their envelope (index/service/action/ok) but have result replaced with truncated=true.

PARTIAL FAILURE IS EXPECTED. The response is an ordered results array; each entry has {index, service, action, ok, result, error}. Inspect each result — do NOT abort on the first error. A credential fetch failure leaves cred-less probes (list-actions, list-metrics) succeeding anyway.

REQUIRES: session_id from convoopen response (format: sess_v2_...). Supported services: account, acm, alb, apigateway, apprunner, backup, bedrock, cloudfront, cloudwatchlogs, cognito, cost-explorer, dynamodb, ebs, ec2, ecs, eks, elasticache, kms, lambda, msk, opensearch, rds, route53, s3, sagemaker, secretsmanager, sqs, vpc, waf For a specific service's actions, use awsinspect (singular) with action="list-actions" — batch is not the place for discovery. Batch responses are always summarized (no detail/raw per-sub); use singular awsinspect when you need full metadata or raw API output for one resource.

EXAMPLES:

  • awsinspect_batch(session_id=..., subs=[ {"service":"ec2","action":"describe-instances"}, {"service":"rds","action":"describe-db-instances"}, {"service":"vpc","action":"describe-vpcs"}, {"service":"s3","action":"list-buckets"}])

  • awsinspect_batch(session_id=..., subs=[ {"service":"ec2","action":"get-metrics","filters":"{"hours":6}"}, {"service":"rds","action":"get-metrics","filters":"{"hours":6}"}])

NameRequiredDescriptionDefault
subsYesUp to 32 sub-probes, each with {service, action, filters?, detail?, raw?}. The backend fetches credentials once per batch and fans out probes in parallel (concurrency 8, 30s per-sub timeout, 60s total wall clock). Partial failure is expected — inspect each result.ok independently.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have an AWS deploy attempt before inspect probes will succeed.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
resultsNoOne entry per sub-request, in request order.
truncated_atNoIndex of the first sub-request whose result was dropped for size.
truncated_cap_bytesNoResponse size cap, in bytes, that caused the truncation.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the safety profile (readOnly/openWorld/not idempotent), while the description adds substantial behavior: per-sub and total budgets, concurrency cap 8, 512 KB cap with truncated=true envelopes, that partial failure is expected, and that a credential fetch failure still leaves cred-less probes succeeding. This is exactly the extra context the structured fields cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then prerequisite, then budgets, partial-failure guidance, requirements, and examples. Given the genuine complexity (32 sub-probes, budgets, concurrency, truncation), the length is justified and every section earns its place; labeled blocks make it scannable rather than rambling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations carry safety, yet the description still supplies prerequisites, budget/truncation semantics, partial-failure handling, response entry shape, credential-fetch caveat, and examples. Nothing an agent needs to call a batch tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and documents subs/service/action/filters, so the baseline is 3; the description adds value with worked example calls showing the subs array shape and the JSON-encoded filters pattern. It stops short of explaining per-sub timeout interaction but goes beyond the schema with concrete examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('BATCH INSPECTION: run up to 32 AWS inspect probes in one call') and immediately distinguishes itself from the singular sibling: batch for >3 resources, awsinspect for discovery (list-actions) or full metadata/raw output on one resource. An agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('when you need to check more than ~3 resources'), stated prerequisite (deploy attempt / hasDeployAttempt=true), and clear exclusions with the alternative named ('batch is not the place for discovery'; use singular awsinspect for full metadata/raw). 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.

convoawaitAwait Pending ResponseA
Read-only
Inspect

Wait for a pending response from Riley after a convoreply timeout.

🎯 USE THIS TOOL WHEN: convoreply returned a timeout error. This allows you to continue waiting for the response without resending the message.

REQUIRES:

  • session_id: from convoopen response

OPTIONAL:

  • message_id: if known (from convoreply timeout error)

  • timeout (integer): seconds to wait. For Cursor, use 50 (default). Max 55.

Returns the same format as convoreply when successful.

NameRequiredDescriptionDefault
timeoutNoMax seconds to wait. Default 50, max 55.
message_idNoOptional message ID from a convoreply timeout error. Not required for normal turn-based flow.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
sourceNoHow the reply was found when it did not come from the pending convoreply call: 'poll' or 'targeted_poll'.
statusNoOutcome of the call: 'ok' (Riley replied), 'timeout' (still working; call convoawait), or 'pending_exists' (an earlier reply is still pending; call convoawait).
message_idNoID of Riley's reply message.
session_idNoSession ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.
instructionNoPlain-language instruction for the agent when the reply is not ready yet.
next_actionNoTool to call next when the reply is not ready yet (for example 'convoawait').
terraform_readyNoTrue when Riley signalled that the design is final and tfgenerate can be called.
assistant_messageNoRiley's reply, cleaned of internal markers. Show it to the user.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=true, openWorldHint=true, idempotentHint=false), so the bar is lower. The description adds real behavioral context: this is a blocking wait operation, it requires the session_id credential from convoopen, and it enforces a max timeout of 55s (default 50, Cursor-specific). It doesn't discuss failure modes if the wait times out again, but overall it meaningfully supplements 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then clearly sectioned into USE WHEN / REQUIRES / OPTIONAL. Headers and emoji are slightly decorative but every line carries actionable information with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the trigger condition, credential source, and timeout constraints for a blocking tool. An output schema exists, so the brief 'returns the same format as convoreply' note is sufficient and the description needn't detail return values further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters including the token-suffix requirement on session_id. The description restates the required/optional split and the source of session_id (convoopen), adding only marginal value beyond what the schema provides, which matches the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: waiting for a pending response from Riley after a convoreply timeout. It explicitly distinguishes itself from the sibling convoreply by noting it continues waiting 'without resending the message', so an agent can tell them apart 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'USE THIS TOOL WHEN: convoreply returned a timeout error' gives the exact triggering condition and names the alternative tool (convoreply). When-to-use is unambiguous and no inference is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convoinspectInspect Session TranscriptA
Read-only
Inspect

INSPECTION: View a session's conversation transcript and metadata Returns the full message history (user / assistant / tool turns) plus the session's meta — workflow step, cloud, deployment status, drift state.

This is the transcript-reader companion to the other read tools — combine it with: • convostatus for the live stack / config / pricing • tfruns for deployment history (apply / destroy / plan / drift) • stackversions for the stack-version ladder

Use it when a user asks 'what did I say earlier?' or you need to retrace why the session ended up where it did. Read-only; never mutates session state.

REQUIRES: session_id (format: sess_v2_...).

NameRequiredDescriptionDefault
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
idNoSession ID (without the token suffix).
metaNoSession metadata from the backend (stack, deploy and credential state).
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
messagesNoConversation transcript, oldest first. System rows are removed.
createdAtNoSession creation time as a Unix timestamp in milliseconds.
updatedAtNoLast update time as a Unix timestamp in milliseconds.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered; the description's 'Read-only; never mutates session state' merely restates it. The enumerated return payload (message history plus workflow step, cloud, deployment status, drift state) is largely duplicative of the existing output schema. It does not explain what idempotentHint=false means in practice or disclose any auth/credential nuance beyond what the schema already states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core capability before the routing bullets, and the bulleted sibling list is compact and earns its place as a disambiguation aid. The trailing 'REQUIRES:' line duplicates the schema and is the one section that could be dropped.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and it covers the calling precondition, the read-only guarantee, and sibling routing, so an agent has everything needed to invoke it. The only shortfall is redundancy rather than a genuine gap — it over-explains returns that the output schema already supplies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and schema description coverage is 100% — the schema already documents the sess_v2_*?token=* pattern and warns not to strip the token suffix. The description's 'REQUIRES: session_id (format: sess_v2_...)' restates the schema rather than adding new semantic detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (View/Inspect) and resource (a session's conversation transcript and metadata), and explicitly positions itself as the 'transcript-reader companion to the other read tools' while naming convostatus, tfruns, and stackversions as distinct siblings. An agent can distinguish it from the thirteen other read/inspect 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('what did I say earlier?', retracing why a session ended up where it did) and routes each alternative use case to a specific sibling with the condition that selects it (convostatus for live stack/config/pricing, tfruns for deployment history, stackversions for version ladders). 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.

convoopenStart Design SessionAInspect

WORKFLOW: Step 1 of 4 - Start infrastructure design conversation Open an InsideOut V2 session and receive the assistant's intro message. The response contains a clean message from Riley (the infrastructure advisor) - display it to the user. ⚠️ Riley will ask questions - forward these to the user, DO NOT answer on their behalf. CRITICAL: This tool returns a session_id in the response metadata. You MUST use this session_id for ALL subsequent tool calls (convoreply, tfgenerate, tfdeploy, etc.). ⚠️ The session_id includes a ?token=... suffix (format: sess_v2_xxx?token=yyy) which is part of the session credential — without it, downstream tools fall back to a tokenless connect URL that 401s. Always pass session_id verbatim to subsequent tools and to the user; do NOT shorten, paraphrase, or strip the ?token= portion when summarizing the session in chat or in your own scratch notes. Use when the user mentions keywords like: 'setup my cloud infra', 'provision infrastructure', 'deploy infra', 'start insideout', 'use insideout', or similar intent to begin infra setup.

OPTIONAL: project_context (string) - General tech stack summary so Riley can skip discovery questions and jump to recommendations. The agent should confirm this with the user before sending. Include whichever apply: language/framework, databases/services, container usage, existing IaC, CI/CD platform, cloud provider, Kubernetes usage, what the project does. Example: 'Next.js 14 + TypeScript, PostgreSQL, Redis, Docker Compose, deployed to AWS ECS, GitHub Actions CI/CD, ~50k MAU'. NEVER include credentials, secrets, API keys, PII, source code, or internal URLs/IPs -- only general metadata summaries useful to a cloud architect agent. IMPORTANT: source (string) - You MUST set this to identify which IDE/tool you are. Auto-detect from your environment: 'claude-code', 'codex', 'antigravity', 'kiro', 'vscode', 'web', 'mcp'. If unsure, use the name of your IDE/tool in lowercase. Do NOT omit this — it controls the 'Open {IDE}' button on the credential connect screen. OPTIONAL: github_username (string) - GitHub username for deploy commit attribution. Pre-populates the GitHub username field on the connect page. 💡 TIP: Examine workflow.usage prompt for more context on how to properly use these tools.

NameRequiredDescriptionDefault
sourceNoIDE/tool identifier so the connect screen can show the right 'Open {IDE}' button. Use lowercase: 'claude-code', 'codex', 'antigravity', 'kiro', 'cursor', 'vscode', 'windsurf', 'zed', 'aider', 'copilot', 'web', 'mcp'.
github_usernameNoGitHub username used for deploy commit attribution; pre-fills the GitHub username field on the connect screen.
project_contextNoOptional tech-stack summary so Riley can skip discovery questions (e.g. 'Next.js 14 + Postgres on AWS, ~50k MAU'). No PII, secrets, file paths, or source code — only general metadata useful to a cloud architect.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
session_idNoSession ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.
assistant_messageNoRiley's reply, cleaned of internal markers. Show it to the user.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses that the response carries an intro message from 'Riley' to relay verbatim, that questions must be forwarded rather than answered, and that a session_id with a ?token= credential suffix appears in metadata and must be passed unmodified to downstream tools or they 401. This is exactly the operational context annotations (readOnly=false, openWorld=true) cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the workflow position, which is good, but the body is heavy with emoji warnings and repeats the session_id/?token= instruction across two consecutive paragraphs. Every point is useful, yet the same message is stated more than once, costing structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a session-opening tool with an output schema, the description supplies everything an agent needs: the trigger, the return handling (relay message, forward questions), the credential-passing contract for all downstream tools, and full parameter guidance. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it tells the agent to confirm project_context with the user before sending and enumerates what to include and explicitly exclude (secrets, PII, source code), and explains source auto-detection and its effect on the connect button.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Open an InsideOut V2 session and receive the assistant's intro message.' It is placed within a numbered workflow (Step 1 of 4) and clearly distinguished from siblings like convoreply, convostatus, and tfgenerate, which are named as downstream steps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger conditions ('setup my cloud infra', 'provision infrastructure', 'start insideout') and positions itself as the entry point of a 4-step workflow, so the agent knows both when to call it and how it relates to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convoreplySend MessageAInspect

WORKFLOW: Step 2 of 4 - Continue infrastructure design conversation Send a user message to the active InsideOut session and receive the assistant reply. The response contains a clean message from Riley - display it to the user.

⚠️ CRITICAL: DO NOT answer Riley's questions yourself! Forward questions to the user and wait for their response. NEVER fabricate or assume the user's answer, even if you think you know what they would say. Examples of questions Riley asks that YOU MUST forward to the user:

  • 'Any questions or tweaks to these details?'

  • 'Ready for the cost estimate?'

  • 'Do you want to change the stack/config?'

  • 'Ready to proceed to Terraform?' When Riley asks ANY question, STOP and wait for the user's answer!

📋 WORKFLOW PHASES: The typical flow is conversation → tfgenerate → tfdeploy When terraform_ready=true appears in THIS tool's response, THEN you can call tfgenerate. ⚠️ DO NOT call tfgenerate until this tool returns! Wait for the response first.

🎯 KEY SIGNALS IN RESPONSE:

  • [TERRAFORM_READY: true] → NOW you can call tfgenerate

  • [[BUTTON_TF_APPLY: ...]] → Deployment is ready! Ask user if they want to deploy, then use tfdeploy

  • [[BUTTON_TF_DESTROY: ...]] → User confirmed destroy intent! Ask user to confirm, then use tfdestroy

  • [[BUTTON_TF_PLAN: ...]] → User wants to preview changes! Use tfplan to run a plan, then tfdeploy with plan_id to apply

REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: timeout (integer) - seconds to wait for response. For Cursor, use 50 (default). Max 55. OPTIONAL: project_context (string) - Only pass genuinely NEW project details the user shares after convoopen. Do NOT resend context already provided in convoopen — Riley remembers it. Do NOT scan files or directories to gather this — only use what the user explicitly tells you. Example: user reveals a new constraint like 'we also need HIPAA compliance' mid-conversation. 💡 TIP: Use convostatus to check progress anytime. Examine workflow.usage prompt for more guidance.

NameRequiredDescriptionDefault
textYesUser message to send to Riley. Forward verbatim what the user said — do not summarize or rewrite.
retryNoWhen true, re-send the most recent user turn instead of submitting a new one.
timeoutNoMax seconds to wait for Riley's response. Default 50, max 55.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.
project_contextNoOnly NEW project details revealed after convoopen (e.g. user mentions a new constraint mid-conversation). Don't re-send context already provided in convoopen. No PII or secrets.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
statusNoOutcome of the call: 'ok' (Riley replied), 'timeout' (still working; call convoawait), or 'pending_exists' (an earlier reply is still pending; call convoawait).
message_idNoID of Riley's reply message.
session_idNoSession ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.
instructionNoPlain-language instruction for the agent when the reply is not ready yet.
next_actionNoTool to call next when the reply is not ready yet (for example 'convoawait').
terraform_readyNoTrue when Riley signalled that the design is final and tfgenerate can be called.
assistant_messageNoRiley's reply, cleaned of internal markers. Show it to the user.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true, but the description goes well beyond them: it discloses that the call blocks for a response (timeout default 50, max 55), that the response is gated on server-side signals, and it carries a strong behavioral constraint ('DO NOT answer Riley's questions yourself... STOP and wait'). This is real operational context the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The workflow step is front-loaded and the sections are labeled, but the description is bloated: the 'do not answer Riley' warning is repeated three times in escalating caps, and the response-signal list restates gating rules already covered in the workflow section. Emoji-heavy ALL-CAPS formatting adds length without adding information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, yet the description usefully summarizes the key in-band signals ([TERRAFORM_READY], [[BUTTON_TF_*]]). Given this is a stateful, non-idempotent, open-world call, the description supplies the session requirements, blocking behavior, and downstream gating an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine value: it flags session_id's provenance and exact-pass-back requirement, gives environment-specific timeout advice ('For Cursor, use 50'), and constrains project_context to genuinely new details with an explicit example. It stops short of 5 only because much of this overlaps the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Send a user message to the active InsideOut session and receive the assistant reply,' and adds the return semantics ('contains a clean message from Riley'). Combined with the 'Step 2 of 4' framing, an agent can distinguish this from convoopen, convostatus, and convoawait without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing is provided: the conversation → tfgenerate → tfdeploy phase order, the condition that unlocks tfgenerate ('when terraform_ready=true appears in THIS tool's response'), and per-signal instructions for tfplan, tfdeploy, and tfdestroy. It even names convostatus as the progress-checking alternative. Nothing about when to call this vs. siblings 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.

convostatusView Session Stack StatusA
Read-only
Inspect

INSPECTION: View the current infrastructure stack for a session Returns the current state of the user's infrastructure design including:

Components - Selected infrastructure services (VPC, databases, caching, etc.) • Shows what services the user has chosen (e.g., PostgreSQL, Redis, S3) • Includes architecture decisions (EKS vs EC2, monolith vs microservices)

Config - Configuration details for each component • Database sizes, replica counts, storage amounts • Cache settings, queue configurations • Backup schedules and retention policies

Pricing - Cost estimates (when available) • Monthly cost estimates per component • Total estimated monthly spend

Phase Indicators - Where the user is in the design workflow: • hasComponents: User has selected infrastructure services • hasConfig: User has configured component details • hasPricing: Cost estimates have been calculated • hasTerraform: Ready for Terraform generation

Use this tool when the user asks 'what is my current stack?', 'show my infrastructure', 'what have I selected?', or similar questions about their design progress. REQUIRES: session_id from convoopen response (format: sess_v2_...).

NameRequiredDescriptionDefault
job_idNoOptional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
configNoConfiguration of each selected component.
personaNoWhat InsideOut knows about the user and their target cloud.
pricingNoCost estimate details per component.
hasConfigNoTrue when the stack configuration is complete.
componentsNoSelected stack components, keyed by component.
hasPricingNoTrue when a cost estimate exists.
session_idNoSession ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.
versioningNoStack version state, when the backend tracks versions.
hasFeaturesNoTrue when the session has selected features.
hasAnyConfigNoTrue when any component has configuration.
hasSelectionNoTrue when the session has selected stack components.
hasTerraformNoTrue when Terraform has been generated (tfgenerate).
hasDeploymentNoTrue when the stack is deployed.
session_sourceNoIDE or tool that opened the session (for example 'claude-code').
hasDeployAttemptNoTrue when a deploy has been started at least once.
hasCloudConnectionNoTrue when cloud credentials are connected to the session.
cloudConnectionInfoNoCloud credential status from the backend (has_credentials, expired, cloud, auth_method, account or project ID, ...).
grandTotalMonthlyUSDNoEstimated total monthly cost in US dollars, or null when there is no estimate.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful context beyond that: the session credential requirement ('session_id from convoopen response', never strip the ?token= suffix) and the meaning of each phase indicator. It does not disclose whether the tool is a pure snapshot or can mutate design state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and the usage triggers are easy to find, which is good. However, the bulk of the text is a multi-level enumeration of return values — an output schema already exists, so this section is largely redundant and crowds out more decision-relevant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an existing output schema, the description carries the parts that matter: what the tool answers, when to call it, and the credential constraint on session_id. It is complete enough for correct invocation; the only soft spot is the absence of any disambiguation against the many sibling inspection tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description does not exceed it meaningfully — the format and token-preservation guidance it repeats is already spelled out in the schema. It does add one piece of information the schema lacks: that session_id originates from a convoopen response. The optional job_id and its 'latest job' fallback behavior are never mentioned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — 'View the current infrastructure stack for a session' — and itemizes what that stack view contains (components, config, pricing, phase indicators). It is clear on its own, but it never distinguishes itself from near-neighbors like convoinspect, awsinspect, or gcpinspect, leaving the agent to guess which inspection tool applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger phrases ('what is my current stack?', 'show my infrastructure', 'what have I selected?') that map directly to invocation conditions. It stops short of naming when NOT to use it or which sibling handles the adjacent cases, so no exclusions or alternatives are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

credawaitAwait Cloud CredentialsA
Idempotent
Inspect

Wait for the user to securely connect their cloud account and subscribe to Luther Systems. Polls until credentials appear on the session.

🎯 USE THIS TOOL WHEN: tfdeploy returns an 'auth_required', 'no_credentials', or 'credentials_expired' error.

The user needs to visit the connect URL to:

  1. Connect their cloud credentials (AWS or GCP)

  2. Sign up and subscribe to a Luther Systems plan (required for deployment)

This secure connection allows InsideOut to deploy and manage infrastructure in the user's cloud account on their behalf. Credentials are handled securely and only used for deployment and management sessions.

WORKFLOW:

  1. FIRST: Present the connect URL and explanation to the user (from the tfdeploy error response)

  2. THEN: Call this tool to begin polling for credentials

  3. The user opens the URL in their browser to subscribe and add credentials

  4. When credentials are found, inform the user and call tfdeploy to deploy

IMPORTANT: Do NOT call this tool without first showing the connect URL to the user. The user needs to see the URL to complete the process.

REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: cloud ('aws' or 'gcp'), timeout (integer, seconds to wait, default 300, max 600).

NameRequiredDescriptionDefault
cloudNoCloud provider whose credentials are awaited: 'aws' or 'gcp'. Defaults to 'aws'.
timeoutNoMax seconds to wait for the user to complete the browser-based credential connect flow. Default 300, max 600.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
cloudNoCloud provider: 'aws' or 'gcp'.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
statusNo'connected' when credentials were found, or 'timeout' when the wait ended first (call credawait again).
session_idNoSession ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.
auth_methodNoHow the credentials were connected, when status is 'connected'.
connect_urlNoURL the user opens to connect credentials, when status is 'timeout'.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (non-destructive, idempotent, open-world); the description adds the blocking/polling behavior, the timeout bound, the prerequisite that a URL must be surfaced first, and how credentials are used. That is substantial context beyond what structured fields provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with headers and a numbered workflow that an agent can act on. Slightly over-written: the 'IMPORTANT: do not call without showing URL' maxim restates workflow step 1, and the InsideOut security paragraph is persuasive filler rather than operational guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values needn't be explained; prerequisites, session source, trigger errors, timeout semantics, and the post-success next step (call tfdeploy) are all present. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the description largely restates it (session_id from convoopen, cloud aws/gcp, timeout default 300 max 600). The one added nuance, that the ?token= suffix is part of the session credential and must not be stripped, is also already in the schema, so this is baseline rather than enrichment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: wait/poll for the user's cloud credentials to appear on the session. The Luther Systems subscription step and the polling mechanism make it clearly distinct from siblings like convoawait or tfstatus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit trigger condition ('tfdeploy returns auth_required, no_credentials, or credentials_expired'), explicit ordering rule ('Do NOT call without first showing the connect URL'), and a numbered workflow that names tfdeploy as the follow-up. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gcpinspectInspect GCP InfrastructureA
Read-only
Inspect

INSPECTION: Inspect GCP infrastructure for a deployed project ⚠️ PREREQUISITE: This tool requires a prior deployment ATTEMPT (successful or failed). Check convostatus for hasDeployAttempt=true before calling. Works even after failed deploys to inspect orphaned resources.

Inspect deployed GCP resources after a deployment attempt. Use this tool when the user asks about the status or details of their deployed GCP infrastructure. It fetches temporary read-only credentials securely and queries the GCP API directly.

RESPONSE TIERS (default is summary for token efficiency):

  • Summary (default): Key fields only (~500 tokens). Set detail=false, raw=false or omit both.

  • Detail: Full metadata for a specific resource. Set detail=true + resource filter.

  • Raw: Complete unprocessed API response. Set raw=true.

REQUIRES: session_id from convoopen response (format: sess_v2_...). Supported services: apigateway, bastion, billing, certificatemanager, cloudarmor, cloudbuild, cloudcdn, clouddeploy, clouddns, cloudfunctions, cloudkms, cloudlogging, cloudmonitoring, cloudrun, cloudsql, compute, firestore, gcs, gke, iam, identityplatform, loadbalancer, memorystore, pubsub, secretmanager, vertexai, vpc For a specific service's actions, call with action="list-actions".

METRICS: Use list-metrics to see available Cloud Monitoring metrics for any service (no credentials needed — progressive disclosure). Use get-metrics to retrieve time-series data. Optional filters JSON: {"hours":6,"period":300}. Label breakdowns: Cloud Functions (by status), Load Balancer/API Gateway (by response_code_class), Cloud CDN (by cache_result). Secret Manager get-metrics returns operational health (version count, replication, create time) — no time-series. Bastion is an alias for Compute Engine metrics (SSH connection count not available as a GCP metric). BILLING: Use service=billing to inspect GCP billing. Actions: get-billing-info (check if billing enabled, which billing account), get-budgets (list budget alerts for the project — auto-fetches billing account). Requires roles/billing.viewer IAM role. Required IAM roles: Monitoring Viewer (roles/monitoring.viewer) for metrics, Secret Manager Viewer (roles/secretmanager.viewer) for secret health, Billing Viewer (roles/billing.viewer) for billing.

EXAMPLES:

  • gcpinspect(session_id=..., service="compute", action="list-instances")

  • gcpinspect(session_id=..., service="gke", action="list-clusters")

  • gcpinspect(session_id=..., service="cloudsql", action="get-metrics", filters="{"hours":6}")

  • gcpinspect(session_id=..., service="billing", action="get-billing-info")

NameRequiredDescriptionDefault
rawYesWhen true, returns the unprocessed GCP API response. Escape hatch for fields the summarized response doesn't surface.
actionYesOperation on the service. Examples: 'list-instances' (compute), 'list-buckets' (storage), 'list-clusters' (gke), 'list-actions' (discovery), 'list-metrics' / 'get-metrics' (Cloud Monitoring).
detailYesWhen true, returns full metadata for a single resource. When false (default), returns a summary.
filtersYesOptional JSON-encoded filter object passed through to the underlying GCP API. Examples: '{"hours":6}' for metric windows, '{"zone":"us-central1-a"}' for zone-scoped queries.
serviceYesGCP service to query. Examples: 'compute', 'storage', 'cloudsql', 'gke', 'cloudrun', 'pubsub', 'firestore'. Use action='list-actions' to discover supported actions for a service.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have a GCP deploy attempt before inspect probes will succeed.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
resultNoThe GCP inspect result. A list action returns a summary object (count plus the listed items) when summarized is true; detail and raw actions return the backend result unchanged.
summarizedNoTrue when result is a compact summary instead of the full backend response.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, yet the description adds real context beyond them: it fetches temporary read-only credentials and queries the GCP API directly, it works after failed deploys to surface orphaned resources, and it names the token cost of each response tier (~500 tokens for summary). It also enumerates the IAM roles required for metrics, secret health, and billing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and well sectioned (PREREQUISITE, RESPONSE TIERS, REQUIRES, METRICS, BILLING, EXAMPLES), so an agent can skim to the tier defaults. It loses a point for redundancy: the 27-service list repeats the schema enum verbatim, and 'Inspect deployed GCP resources after a deployment attempt' restates the header and the following usage sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and everything else an agent needs is present: credential prerequisites, IAM roles, tier selection with defaults, service/action discovery, and worked examples. Nothing required 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema descriptions: how detail/raw interact with resource filters to select a tier, a concrete filters JSON with a 'period' key the schema omits, the session_id format and the deploy-attempt requirement tied to it, and per-service metric label breakdowns. It stops short of documenting every service/action combination.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Inspect GCP infrastructure for a deployed project') and scopes it to resources created by a prior deployment attempt. The GCP focus plus the deploy-attempt precondition cleanly separates it from awsinspect and from gcpinspect_batch 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Use this tool when the user asks about the status or details of their deployed GCP infrastructure'), an explicit precondition ('requires a prior deployment ATTEMPT... Check convostatus for hasDeployAttempt=true'), and routes between sub-actions (action="list-actions" for discovery, list-metrics vs get-metrics, service=billing for billing). When, when-not, and alternatives are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gcpinspect_batchBatch-Inspect GCP InfrastructureA
Read-only
Inspect

BATCH INSPECTION: run up to 32 GCP inspect probes in one call. ⚠️ PREREQUISITE: Same as gcpinspect — deploy attempt required. Check convostatus for hasDeployAttempt=true before calling.

Use this when you need to check more than ~3 resources. The backend fetches Oracle credentials ONCE per batch and fans out probes against a single GCP credentials blob — a 12-resource health check is ~5–8× faster and 12× fewer Oracle round-trips than calling gcpinspect 12 times.

BUDGETS:

  • Up to 32 sub-probes per call (subs array length).

  • 30s per-sub timeout; 60s total batch wall-clock.

  • Concurrency cap 8.

  • 512 KB response cap: subs past the cap keep their envelope (index/service/action/ok) but have result replaced with truncated=true.

PARTIAL FAILURE IS EXPECTED. The response is an ordered results array; each entry has {index, service, action, ok, result, error}. Inspect each result — do NOT abort on the first error. A credential fetch failure leaves cred-less probes (list-actions, list-metrics) succeeding anyway.

REQUIRES: session_id from convoopen response (format: sess_v2_...). Supported services: apigateway, bastion, billing, certificatemanager, cloudarmor, cloudbuild, cloudcdn, clouddeploy, clouddns, cloudfunctions, cloudkms, cloudlogging, cloudmonitoring, cloudrun, cloudsql, compute, firestore, gcs, gke, iam, identityplatform, loadbalancer, memorystore, pubsub, secretmanager, vertexai, vpc For a specific service's actions, use gcpinspect (singular) with action="list-actions" — batch is not the place for discovery. Batch responses are always summarized (no detail/raw per-sub); use singular gcpinspect when you need full metadata or raw API output for one resource.

EXAMPLES:

  • gcpinspect_batch(session_id=..., subs=[ {"service":"compute","action":"list-instances"}, {"service":"gke","action":"list-clusters"}, {"service":"cloudsql","action":"list-instances"}])

  • gcpinspect_batch(session_id=..., subs=[ {"service":"compute","action":"get-metrics","filters":"{"hours":6}"}, {"service":"cloudrun","action":"get-metrics","filters":"{"hours":6}"}])

NameRequiredDescriptionDefault
subsYesUp to 32 sub-probes, each with {service, action, filters?, detail?, raw?}. The backend fetches credentials once per batch and fans out probes in parallel (concurrency 8, 30s per-sub timeout, 60s total wall clock). Partial failure is expected — inspect each result.ok independently.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have a GCP deploy attempt before inspect probes will succeed.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
resultsNoOne entry per sub-request, in request order.
truncated_atNoIndex of the first sub-request whose result was dropped for size.
truncated_cap_bytesNoResponse size cap, in bytes, that caused the truncation.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description provides rich, non-obvious behavioral constraints, such as the prerequisite of a deploy attempt (`hasDeployAttempt=true`), the specific performance characteristics (fan out, single credential fetch), and the critical instruction that partial failure is expected and agents should not abort.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, the structure is highly effective. It front-loads prerequisites and core limitations (32 probes), then moves logically through performance, constraints, failure policies, and finally provides usage examples, making zero sentences feel wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of batch operations, failure handling, and performance characteristics, the definition is exceptionally complete. It details everything from concurrency caps to the specific truncation policy for large responses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds vital semantic meaning. It specifies that the session_id must include the full `?token=...` suffix, and it provides practical examples of filter usage and clarifies the difference between action types (e.g., discovery vs. time-series metrics).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and description clearly state the purpose: running up to 32 GCP inspect probes in a single batch call. It explicitly distinguishes itself from the singular tool, gcpinspect, by stating the batch is not suitable for discovery.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The guidelines are exhaustive. It tells the agent exactly when to use the tool (when checking >~3 resources), and crucially, when *not* to use it, directing agents to gcpinspect for discovery or detailed raw output.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpWorkflow GuideA
Read-only
Inspect

Get workflow guidance for using InsideOut infrastructure tools. Call help() for a compact overview, or help(section=...) for a detailed guide. Sections: workflow, tools, examples, inspect. Responses include hints with next_actions and related_tools.

NameRequiredDescriptionDefault
sectionNoOptional section to focus the response. One of: 'workflow', 'tools', 'examples', 'inspect'. When omitted, returns a compact overview (~500 tokens).

Output Schema

NameRequiredDescription
dirtyNoTrue when the server was built from a modified tree.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
sectionNoGuide section returned, when help(section=...) was called.
versionNoServer version.
base_urlNoInsideOut backend URL the server talks to.
transportNoMCP transport in use (for example 'stdio' or 'http').
build_timeNoServer build time.
git_commitNoGit commit the server was built from.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: responses carry hints with next_actions and related_tools, telling the agent to expect follow-up suggestions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, front-loaded sentences: purpose first, then invocation modes, section list, and response shape. Every sentence carries information, though the section enumeration overlaps with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no prose, and the description still notes the hint structure. For a single optional-enum guidance tool this is sufficient; only a note on when to reach for help is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single enum parameter is fully documented in the schema, including the omitted-behavior default. The description merely restates the section names, adding no syntax or meaning beyond the structured field. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get workflow guidance') and scopes it to the InsideOut infrastructure toolset. This clearly separates it from every sibling, all of which are operational tools (tfdeploy, awsinspect, etc.) rather than meta/guidance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete invocation guidance: help() for a compact overview vs help(section=...) for a detailed guide, and enumerates the four sections. There are no competing alternatives to exclude, but it also doesn't state when in an agent's workflow it should be called.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stackdiffCompare Stack VersionsA
Read-only
Inspect

Structured diff showing what would be deployed if the user ran tfdeploy now. Returns component-level changes (added/removed/modified), field-level details, and pricing deltas.

Defaults (#1392): with no version arguments, compares the LAST SUCCESSFULLY DEPLOYED version against the user's CURRENT LIVE DESIGN (the same data the UI shows). Empty baseline if nothing has been deployed or after a destroy. Pending drafts are NOT used as the target — they go stale once the user edits past them; live IR via chat history is always current.

Pass explicit from_version and/or to_version integers to compare any two saved versions (e.g. v3 → v5).

REQUIRES: session_id from convoopen response (format: sess_v2_...).

NameRequiredDescriptionDefault
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.
to_versionNoEnding stack version number for the diff. Defaults to the current draft.
from_versionNoStarting stack version number for the diff. Defaults to the latest applied version.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
summaryNoSummary of the differences.
componentsNoChanged components, each with key, change and per-field from/to values.
to_versionNoVersion number the diff ends at.
from_versionNoVersion number the diff starts from.
pricing_deltaNoMonthly cost before and after (from_total, to_total).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and open-world, and the description adds substantial non-obvious behavior: the default comparison target, empty baseline after a destroy, staleness of pending drafts, and the fact that live IR via chat history is always current. These details materially affect how the agent interprets the diff.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core output description, then groups default behavior, explicit-version usage, and session prerequisite in short paragraphs. Every sentence contributes, though the chat-history justification and format repetition add some length beyond the minimum.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the presence of an output schema plus read-only annotations, the description provides all missing context: prerequisite session credential, default behavior, explicit-version semantics, and edge cases like empty baselines. Nothing needed to call it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already documents session_id format and version parameters, but the description adds meaning by correcting the default target (live design, not pending draft) and by stating that explicit integers compare any two saved versions. Some session_id format detail is repeated from the schema, keeping this from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (compare/diff) and resource (stack versions), states the output is a structured diff of what tfdeploy would deploy now, and implicitly separates it from sibling stackversions/tfplan by focusing on version-to-version comparison. An agent can identify the operation 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when to rely on default behavior (no version arguments compare the last successfully deployed version against the current live design) and when to pass explicit from_version/to_version integers to compare saved versions. It adds important caveats about pending drafts and empty baselines, but does not explicitly name sibling alternatives such as using stackversions to list versions first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stackrollbackRollback Stack VersionA
Idempotent
Inspect

Create a draft version by reverting to a previous version's config. Copies components, config, and pricing from the target version. If a draft already exists, updates it in-place (single-draft rule).

Use stackversions first to find available version numbers.

REQUIRES: session_id from convoopen response (format: sess_v2_...), version (target version number).

NameRequiredDescriptionDefault
versionYesTarget stack version number to roll back to. Use stackversions to list available versions.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
versionNoThe stack version the session now points to (version, status).

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lower, but the description adds valuable behavior beyond them: the single-draft rule (updates an existing draft in-place) and that it copies components/config/pricing. This meaningfully explains what the mutation does without contradicting any hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is front-loaded with the core action, then behavior (single-draft rule), then prerequisites. It is appropriately sized and mostly waste-free, though the REQUIRES line partly duplicates the schema's required fields and format notes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and the description covers behavior, the single-draft edge case, and prerequisites. It stops short of stating permission/authorization needs or what happens to non-copied fields, leaving minor gaps for a first-time caller.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema (version's 'use stackversions to list', session_id's exact format). The description largely restates those requirements, adding little syntax or format detail beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and outcome: 'Create a draft version by reverting to a previous version's config,' and elaborates what gets copied (components, config, pricing). It is clearly a rollback/draft-creation tool rather than a listing or diff tool. However, it does not explicitly contrast itself with siblings like stackdiff or stackversions beyond naming stackversions as a prerequisite.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit prerequisite guidance is given: 'Use stackversions first to find available version numbers,' and the REQUIRES line names the two required inputs. There are no negative exclusions (when not to use it) or named alternative tools for other scenarios, which would be needed for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stackversionsList Stack VersionsA
Read-only
Inspect

List all stack versions for a session (newest first). Shows version history including version number, status (draft/confirmed/applied), change summaries, and timestamps.

Use this tool to see the design history, review what changed between iterations, or find a version number to roll back to.

REQUIRES: session_id from convoopen response (format: sess_v2_...).

NameRequiredDescriptionDefault
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
versionsNoStack versions, each with version, status, change_summary and created_at.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is partly covered. The description adds real value beyond them: newest-first sort order, the status vocabulary (draft/confirmed/applied), and the auth prerequisite that session_id must come from convoopen. It stops short of noting volume/pagination or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded blocks: what it returns, when to use it, and the prerequisite. Little waste, though the REQUIRES line partially repeats the session_id format already covered in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

One required parameter fully documented, output schema present so return values need no further explanation, and the description covers ordering, returned fields, use cases, and the auth prerequisite. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one parameter and 100% schema description coverage, the schema already carries the format details and the ?token= suffix warning. The description echoes the requirement and usefully traces the value's origin back to convoopen, but adds no syntax the schema lacks, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all stack versions for a session') and adds ordering (newest first) plus the fields returned (version number, status, change summaries, timestamps). It is unambiguous what the tool does, but it never names or contrasts a sibling such as stackdiff or stackrollback, which is what a 5 would require.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete use cases: see design history, review what changed between iterations, and find a version number to roll back to. This gives clear context for when to reach for it, and 'find a version number to roll back to' implicitly routes toward stackrollback, but there is no explicit when-not or named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_feedbackSubmit FeedbackAInspect

FEEDBACK: Submit feedback, bug reports, or feature requests to Luther Systems Use this tool to forward user feedback directly to the Luther Systems team. This includes bug reports, feature requests, questions, or general feedback about InsideOut. The agent itself can also use this tool to report issues it encounters during operation.

REQUIRES: session_id, category, message OPTIONAL: user_email (for follow-up), user_name, source (default: 'mcp'), initiator ('user' or 'agent')

Categories: bug_report, feature_request, general_feedback, question, security

The 'initiator' field tracks who triggered the report:

  • 'user' — the user explicitly reported the issue or requested feedback submission

  • 'agent' — Riley detected an issue and initiated the feedback flow

Examples:

  • User says 'the deploy button is broken' → submit_feedback(category='bug_report', message='...', initiator='user')

  • User says 'I wish it had dark mode' → submit_feedback(category='feature_request', message='...', initiator='user')

  • Deployment failed with Terraform error → submit_feedback(category='bug_report', message='Deployment failed: Terraform apply error on aws_alb resource — timeout waiting for ALB provisioning', initiator='agent')

NameRequiredDescriptionDefault
sourceNoOptional source channel: 'mcp', 'cli', or 'web'.
messageYesFeedback content. Free-form text describing the issue, request, or comment.
categoryYesFeedback category. One of: bug_report, feature_request, general_feedback, question.
initiatorNoOptional originator: 'user' (human triggered) or 'agent' (automated).
user_nameNoOptional display name for attribution.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. Identifies the conversation the feedback is about.
user_emailNoOptional email address for follow-up.

Output Schema

NameRequiredDescription
okNoTrue when the feedback was delivered to Luther Systems.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
messageNoConfirmation text to show the user.
session_idNoSession ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-destructive, open-world write, so the safety profile is covered. The description adds real value beyond that: the destination team, the initiator tracking semantics ('user' vs 'agent'), and the accepted categories/examples of what constitutes reportable feedback.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is longer than most, but well front-loaded with FEEDBACK/REQUIRES/OPTIONAL headers and each section (categories, initiator semantics, examples) earns its place. Slight redundancy between the prose intro and the examples.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained. Required/optional parameters, category enum, and initiator semantics are all covered. The only shortfall is the 'security' category mentioned in prose but absent from the schema enum, leaving minor ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter; the description goes further by restating required vs optional fields with intent (user_email 'for follow-up', source 'default: mcp', initiator meaning). One caveat: it lists 'security' as a category, but the schema enum omits it, creating a small mismatch.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ("Submit feedback, bug reports, or feature requests to Luther Systems") and names the destination team. It is trivially distinguishable from all siblings, which are terraform/AWS/conversation tools with no overlapping function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states when to use it (forward user feedback; agent self-reporting issues) and provides three concrete trigger examples. It lacks explicit when-NOT-to-use guidance or named alternatives, but no sibling competes for this function, so the gap is minor.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tfdeployDeploy InfrastructureA
Destructive
Inspect

WORKFLOW: Step 4 of 4 - Deploy infrastructure to the cloud Deploy infrastructure by starting a Terraform job for an InsideOut session. This tool initiates the actual deployment process after Terraform files have been generated. IMPORTANT: This starts a long-running job (15+ minutes). Use tfstatus to monitor progress. SINGLE-FLIGHT: only one TF job (apply/plan/destroy/drift) runs per session at a time. If another job is already in flight, tfdeploy returns tf_job_conflict with the live job_id — attach with tfstatus/tflogs instead of retrying, or pass force_new=true to override. Returns confirmation that the deployment has started. REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: plan_id (string) — Apply a previously created plan from tfplan. Preview-then-apply workflow: tfplan → tflogs (review) → tfdeploy(plan_id=...). OPTIONAL: sandbox (boolean, default false) — deploys real generated Terraform. Set to true for cheap sandbox template (testing only). OPTIONAL: ignore_drift (boolean, default false) - when true, proceeds with deploy even if infrastructure drift is detected. By default, deploys fail on drift. Use after reviewing drift details via tfdrift or tflogs. OPTIONAL: force_new (boolean, default false) - bypass the session-level single-flight guard. Use only when the existing run is provably wedged. CREDENTIAL FLOW (if credentials are missing):

  1. Response includes a connect_url — present it to the user

  2. Call credawait(session_id=...) to poll for credentials

  3. When credawait returns success, retry tfdeploy Do NOT call credawait without first showing the connect URL to the user.

NameRequiredDescriptionDefault
plan_idNoApply a previously created plan from tfplan. When set, project_id should also be provided.
sandboxNoWhen true (default for MCP), deploys a small sandbox stack instead of the real generated Terraform. Set false to deploy the actual user stack.
versionNoDeploy a specific stack version number. Defaults to the current draft.
force_newNoWhen true, bypass the session-level single-flight guard and start a new deploy even if another job is in flight. Use only when an existing run is provably wedged.
project_idNoProject ID returned by tfplan. Required alongside plan_id.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.
ignore_driftNoWhen true, proceed with deploy even if drift is detected on the existing stack.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
job_idNoID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one.
successNoTrue when the deploy job was started.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive=true and openWorld=true, but the description adds a lot beyond them: the 15+ minute long-running nature, the session-level single-flight guard and the tf_job_conflict response contract, the default-fail-on-drift behavior, and the full credential flow. This is unusually rich operational context for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with WORKFLOW step and the core action, and the labeled sections (REQUIRES, OPTIONAL, CREDENTIAL FLOW) make it scannable. Slightly over-long: force_new and ignore_drift are explained both in prose and again in the schema, and the return-value sentence is redundant given the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, long-running, open-world deploy tool with 7 params, it covers prerequisites (session_id format), optional overrides, conflict handling, drift policy, and credential recovery. With an output schema present, it correctly does not over-explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning: the preview-then-apply sequence for plan_id (tfplan → tflogs → tfdeploy), the single-flight interaction of force_new, and the drift-override semantics of ignore_drift. Note a minor inconsistency: the description says sandbox defaults to false while the schema says true is the MCP default, which is worth resolving.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Deploy infrastructure by starting a Terraform job') and frames it as Step 4 of 4, which immediately distinguishes it from tfplan, tfdestroy, tfdrift, and tfstatus. An agent can place this tool in the workflow without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it (after Terraform files are generated), names alternatives for adjacent needs (tfstatus to monitor, tflogs/tfdrift before overriding drift, credawait for missing credentials), and gives a clear when-not rule for force_new ('only when the existing run is provably wedged'). 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.

tfdestroyDestroy InfrastructureA
Destructive
Inspect

DESTROY: Tear down previously deployed infrastructure Destroys infrastructure by calling the Oracle destroy endpoint for a session that has a prior successful deployment. IMPORTANT: This starts a long-running job. Use tfstatus/tflogs to monitor progress. SINGLE-FLIGHT: only one TF job per session at a time. If another job is already in flight, tfdestroy returns tf_job_conflict with the live job_id — attach with tfstatus/tflogs, or pass force_new=true to override. REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: force_new (boolean, default false) - bypass the single-flight guard. Use only when the existing run is provably wedged. PREREQUISITE: The session must have a prior successful deployment with a project_id. After destroy completes, the session is kept for historical record but hasDeployment is set to false.

NameRequiredDescriptionDefault
force_newNoWhen true, bypass the single-flight guard and force a new destroy even if another job is in flight.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The deployed stack for this session will be torn down.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
job_idNoID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one.
successNoTrue when the destroy job was started.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint annotation by disclosing that this starts a long-running job, that only one TF job per session may be in flight, that a conflict returns tf_job_conflict with a live job_id, and that the session is retained afterward with hasDeployment set to false. These are exactly the operational traits an agent needs that structured annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead line is front-loaded with the verb, and labeled blocks (IMPORTANT, SINGLE-FLIGHT, REQUIRES, OPTIONAL, PREREQUISITE) make each fact scannable. It is dense but every sentence carries operational weight; nothing is redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-format detail is unnecessary, and the description instead supplies the missing context: prerequisites, job lifecycle, conflict recovery path, and post-destroy session state. An agent has everything needed to invoke it correctly and handle the single-flight conflict.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine guidance beyond the schema: it explains that force_new should only be used when a run is 'provably wedged' and clarifies the session_id provenance (convoopen) and the credential suffix. That extra context lifts it above baseline without fully replacing schema detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (destroy/tear down) and resource (previously deployed infrastructure) with exact mechanism ('Oracle destroy endpoint'). Clearly distinguishes itself from its sibling tfdeploy, and the scope ('previously deployed infrastructure') leaves no ambiguity about what is being acted on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternatives for monitoring (tfstatus/tflogs) and gives a precise condition for the force_new override ('only when the existing run is provably wedged'). It also states the precondition (prior successful deployment) and the conflict-handling flow, so an agent knows when and how to call it versus reach for tfstatus.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tfdriftCheck Infrastructure DriftA
Idempotent
Inspect

DRIFT CHECK: Run a read-only drift detection check Checks whether deployed infrastructure has drifted from the expected Terraform state. This is a read-only operation — it does NOT modify any infrastructure. Returns job_id. Use tflogs to stream the drift check results. SINGLE-FLIGHT: only one TF job per session at a time. If another job is already in flight, tfdrift returns tf_job_conflict with the live job_id — attach with tfstatus/tflogs, or pass force_new=true to override. REQUIRES: session_id from convoopen response (format: sess_v2_...). PREREQUISITE: The session must have a prior deployment with a project_id. OPTIONAL: force_new (boolean, default false) - bypass the single-flight guard. Use only when the existing run is provably wedged. If drift is detected, the user can either fix the drift or use tfdeploy(ignore_drift=true) to proceed.

NameRequiredDescriptionDefault
force_newNoWhen true, bypass the single-flight guard and force a new drift check even if another job is in flight.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
job_idNoID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one.
successNoTrue when the drift check job was started.

TDQS

A4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description asserts twice that this is a read-only operation ('read-only drift detection check', 'it does NOT modify any infrastructure'), yet the annotations declare readOnlyHint=false. An agent receiving these two signals would be genuinely unsure whether invoking this tool can mutate state, which is exactly the kind of conflict the rubric penalizes. Annotation Contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with labeled sections (DRIFT CHECK, SINGLE-FLIGHT, REQUIRES, PREREQUISITE, OPTIONAL) and the core purpose is front-loaded. It runs long, but nearly every line carries operational information an agent needs (conflict handling, credential format, prerequisite).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so the return value needn't be explained, yet the description still tells the agent it returns job_id and to stream results with tflogs. Combined with the single-flight guard, session format, project_id prerequisite, and override escape hatch, nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains force_new as bypassing the single-flight guard and constrains its use ('use only when the existing run is provably wedged'), and it reinforces the session_id format/credential requirement beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Run a read-only drift detection check') and scopes it precisely ('checks whether deployed infrastructure has drifted from the expected Terraform state'). It is clearly distinguishable from sibling tools like tfdeploy, tflogs, and tfstatus, which it names directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Use tflogs to stream the drift check results', and on conflict 'attach with tfstatus/tflogs, or pass force_new=true'. It also gives a when-not for force_new ('Use only when the existing run is provably wedged') and names tfdeploy(ignore_drift=true) as the downstream alternative when drift is found.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tfgenerateGenerate TerraformA
Idempotent
Inspect

WORKFLOW: Step 3 of 4 - Generate Terraform files from completed design Generate Terraform files from an InsideOut session that has completed infrastructure design.

⚠️ PREREQUISITE: Only call this AFTER convoreply returns with terraform_ready=true in the response metadata. DO NOT call this while convoreply is still running or before terraform_ready is confirmed! If you get 'session has not reached terraform-ready state', wait for convoreply to complete first.

🎯 USE THIS TOOL WHEN: convoreply has returned with terraform_ready=true, OR the user asks to 'see the terraforms', 'generate terraform', 'show me the code', etc.

DEFAULT RESPONSE: Returns summary table + download URL (keeps code out of LLM context). FALLBACK: Set include_code: true to get full code inline if curl/unzip fails.

CRITICAL WORKFLOW (default mode):

  1. Call this tool to get file summary and download URL

  2. ASK the user: 'Where would you like me to save the Terraform files? Default: ./insideout-infra/'

  3. WAIT for user confirmation before running the download command

  4. Run the curl/unzip command with the user's chosen directory

  5. If curl/unzip FAILS (sandbox, security, platform issues), retry with include_code: true

AFTER GENERATION: Ask user if they want to review the files and then deploy with tfdeploy

REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: include_code (boolean) - set true to return full code inline as fallback. 💡 TIP: Examine workflow.usage prompt for more context on how to properly use these tools.

NameRequiredDescriptionDefault
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. Riley must have signaled [TERRAFORM_READY: true] before calling this tool.
include_codeNoWhen true, the response inlines the full generated Terraform source. Use as a fallback when the host can't read the on-disk archive (sandbox or security restrictions).

Output Schema

NameRequiredDescription
filesNoNumber of generated Terraform files.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
inlineNoTrue when the source is inlined in the result (include_code=true) instead of offered as a download.
successNoTrue when the Terraform was generated.
download_urlNoURL of the archive with the generated Terraform.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and the description does not contradict them. It adds meaningful behavior beyond the annotations: default response returns a summary table + download URL rather than inline code, include_code triggers a fallback path, and there's a required user-confirmation step before download. It does not say whether generation overwrites existing files in ./insideout-infra/, a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the workflow step and purpose, and organized under clear headers, but there is noticeable redundancy: the terraform_ready prerequisite is asserted three separate times and the fallback/retry behavior is stated twice. It is longer than necessary without being disorganized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists (so return values need not be described), the description goes further and explains the shape of the response (summary table + URL vs inline code). Prerequisite state, fallback behavior, required user confirmation, and the handoff to tfdeploy are all covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented; the schema itself explains the ?token= suffix and the include_code fallback. The description restates these rather than adding new semantics, though noting session_id originates from convoopen adds slight provenance value. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Generate Terraform files') scoped to an InsideOut session that has completed infrastructure design. Clearly distinguishable from siblings like tfplan, tfdeploy, and tfdestroy, which operate at other stages. The 'Step 3 of 4' framing further anchors it in the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('convoreply has returned with terraform_ready=true, OR the user asks to see the terraforms') and explicit when-not ('DO NOT call this while convoreply is still running or before terraform_ready is confirmed'). It also routes the user forward to tfdeploy after generation, naming the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tflogsFetch Deploy LogsA
Read-only
Inspect

MONITORING: Fetch Terraform deployment logs with pagination Fetches logs from a running or completed Terraform deployment job. For completed jobs: uses REST endpoint for instant retrieval (supports tail for server-side filtering). For running jobs: streams via SSE with timeout-based pagination.

PAGINATION (running jobs only): Use last_event_id from the response to fetch more:

  1. First call: tflogs(session_id='...') → get logs + last_event_id

  2. Next call: tflogs(session_id='...', last_event_id='...') → get NEW logs only

  3. Repeat until complete: true in response

RESPONSE FIELDS:

  • logs: Array of log messages collected

  • last_event_id: Pass this back to get more logs (pagination cursor, SSE only)

  • complete: true if job finished, false if more logs may be available

  • total_logs: total log entries before tail truncation

REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: job_id to target a specific deployment (use tfruns to discover IDs), timeout (default 50s, max 55s), last_event_id (for pagination), tail (return only last N entries) ⚠️ CONTEXT WARNING: Deploy logs can be hundreds of lines. Use tail: 50 for completed jobs to avoid blowing up the context window.

NameRequiredDescriptionDefault
tailNoReturn only the last N log entries. Use 0 (or omit) for all available entries.
job_idNoOptional. Target a specific job. Use tfruns to discover job IDs. When omitted, streams the latest job for the session.
timeoutNoMax seconds to collect logs. Default 50, max 55.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.
last_event_idNoResume cursor for pagination. Pass back the last_event_id from a previous tflogs response to fetch only newer entries.

Output Schema

NameRequiredDescription
logsNoLog lines, oldest first.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
completeNoTrue when the job has finished and no more logs will come.
logs_countNoNumber of log lines in this result.
session_idNoSession ID these logs belong to.
last_event_idNoLog cursor. Pass it back as last_event_id to fetch only newer entries.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations by disclosing the dual REST/SSE execution path, the 50s default/55s max timeout ceiling, and the context-window warning about hundreds of log lines. The pagination cursor lifecycle (last_event_id returning only new logs) is a genuinely non-obvious behavioral trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Bold headers and a numbered pagination flow make it scannable and front-loaded with purpose before mechanics. The RESPONSE FIELDS block partially duplicates the existing output schema, which is the only wasted space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't re-explain return values, yet it still supplies the operational context an agent needs: prerequisites (session_id from convoopen), pagination termination condition, and the context-blowup risk. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3; the description earns above that by adding selection guidance the schema lacks — tail:50 for completed jobs, timeout defaults, job_id discovery via tfruns — though it doesn't add much on the session_id token format beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch Terraform deployment logs') and immediately distinguishes the two operating modes (completed jobs via REST vs running jobs via SSE). An agent can tell exactly what this tool returns and how it differs from tfstatus or tfruns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete routing advice: use tfruns to discover job_id, use tail for completed jobs, and a three-step pagination recipe until complete:true. It lacks explicit when-not-to-use guidance against near siblings like tfstatus or tfoutputs, which keeps it from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tfoutputsGet Deploy OutputsA
Read-only
Inspect

INSPECTION: Retrieve Terraform outputs from a completed deployment Returns structured output values (VPC IDs, endpoints, cluster names, etc.) after a successful deploy. Sensitive outputs are redacted (shown as '(sensitive)').

By default returns outputs for the latest successful deploy. Optionally specify job_id to get outputs for a specific deployment.

REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: job_id (specific deployment), lifecycle (filter by step e.g. 'cloud-provision').

NameRequiredDescriptionDefault
job_idNoOptional. Specific job ID to fetch outputs from. When omitted, returns outputs from the latest successful apply.
lifecycleNoOptional Oracle deploy-step filter for the outputs. Common values are 'provision', 'cloud-provision', 'k8s-provision' — these correspond to the lifecycle stages of the deployed stack. When omitted, returns outputs from all lifecycle steps.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
errorNoWhy no outputs were found, when found is false.
foundNoFalse when no successful deploy with outputs was found.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
job_idNoID of the deploy job the outputs come from.
sourceNoWhere the outputs were read from.
session_idNoSession ID these outputs belong to.
step_outputsNoTerraform outputs, one entry per deploy lifecycle step.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: sensitive outputs are redacted as '(sensitive)', outputs are only available after a successful deploy, and lifecycle filters restrict which step's outputs are returned. With readOnlyHint/openWorldHint already covering the safety profile, this is solid supplementary disclosure, though nothing is said about staleness or size of the returned set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the redaction/default behavior, but the trailing REQUIRES/OPTIONAL block duplicates the input schema near-verbatim, and the 'INSPECTION:' prefix adds no information. Serviceable but with redundant bulk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the description covers the essentials an agent needs: prerequisite session_id, default selection behavior, filtering options, and redaction of sensitive values. Only minor gaps (failure behavior when no successful deploy exists) remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description largely restates the schema (job_id as specific deployment, lifecycle as a step filter) and adds only the 'cloud-provision' example already present in the schema, so it contributes little new meaning despite being accurate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Retrieve Terraform outputs from a completed deployment') with a clear scope statement about default (latest successful deploy) versus explicit job_id. It implies but never explicitly contrasts itself with siblings like tflogs/tfstatus, which also read deployment state, so differentiation is only partial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context for use: outputs come from a *completed* deployment, default selects the latest successful apply, and job_id/lifecycle narrow the scope. It also names convoopen as the source of the required session_id, giving a prerequisite chain, but it names no explicit alternative tool or exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tfplanPreview Infrastructure PlanA
Idempotent
Inspect

PREVIEW: Run terraform plan to preview infrastructure changes Runs a terraform plan for an InsideOut session without applying any changes. This lets the user review what will be created/changed/destroyed before committing. Returns job_id, plan_id, and project_id. Use tflogs to stream the plan output. After the plan completes, use tfdeploy with plan_id to apply the exact plan. SINGLE-FLIGHT: only one TF job per session at a time. If another job is already in flight, tfplan returns tf_job_conflict with the live job_id — attach with tfstatus/tflogs, or pass force_new=true to override. REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: sandbox (boolean, default false) — plans real generated Terraform. Set to true for cheap sandbox template (testing only). OPTIONAL: force_new (boolean, default false) - bypass the single-flight guard. Use only when the existing run is provably wedged. CREDENTIAL HANDLING: Same as tfdeploy - credentials must be configured first.

NameRequiredDescriptionDefault
sandboxNoWhen true, plan against the sandbox stack; when false (default), plan the real generated Terraform.
force_newNoWhen true, bypass the single-flight guard and force a new plan even if one is already running.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
job_idNoID of the plan job. Follow it with tfstatus.
plan_idNoPlan ID. Pass it to tfdeploy (with project_id) to apply exactly this plan.
successNoTrue when the plan job was started.
project_idNoProject ID that goes with plan_id on tfdeploy.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the single-flight guard, the tf_job_conflict response and its handling, returned identifiers, and credential prerequisites. The one gap is that it never reconciles its 'without applying any changes' framing with readOnlyHint=false — an agent is not told that a job/plan artifact is still created or whether state is refreshed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with labeled sections (PREVIEW, SINGLE-FLIGHT, REQUIRES, OPTIONAL, CREDENTIAL HANDLING) that make it scannable. Slight redundancy between the header line and the second sentence ('preview' vs 'without applying any changes') costs it a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema covers return values and annotations cover the safety profile, the description supplies everything else needed to invoke correctly: prerequisite session format, conflict behavior, override condition, credential requirement, and the follow-up deploy step.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine value: it frames session_id as coming from convoopen, states the exact sess_v2_... format, and constrains force_new ('Use only when the existing run is provably wedged'), which the schema does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run terraform plan to preview infrastructure changes') and immediately scopes it as non-applying. It is clearly distinguishable from siblings tfdeploy, tflogs, tfstatus, and tfdestroy, which the description names directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use plus alternatives: 'Use tflogs to stream the plan output', 'After the plan completes, use tfdeploy with plan_id to apply', and the force_new escape hatch versus attaching with tfstatus/tflogs on tf_job_conflict. 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.

tfrunsList Deploy RunsA
Read-only
Inspect

INSPECTION: List all Terraform deployment runs for a session Returns job IDs, statuses, types (apply/destroy), and timestamps for every run. Use this to see deployment history, find job IDs for log inspection, or check which deployments succeeded or failed.

REQUIRES: session_id from convoopen response (format: sess_v2_...).

NameRequiredDescriptionDefault
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. Returns the deployment-job history (apply / destroy / plan / drift) for this session.

Output Schema

NameRequiredDescription
runsNoDeploy job history, newest first.
countNoNumber of runs the backend reported.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
session_idNoSession ID these runs belong to.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavior beyond that: the returned field set and the credential requirement ('REQUIRES: session_id from convoopen response'). One minor discrepancy: it says types are 'apply/destroy' while the schema lists apply/destroy/plan/drift.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with an INSPECTION label, then purpose, return fields, usage, and prerequisites in clearly separated blocks. Slightly longer than necessary given an output schema exists, but every sentence is relevant and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, explaining return values is optional, yet the description still covers purpose, usage, and the required credential format, leaving no gap for an agent to call it correctly. The only shortfall is the minor type-list mismatch with the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter's format and token-suffix warning are already fully documented in the schema. The description only restates the source tool (convoopen) and a truncated format hint, adding little beyond what the schema provides — the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all Terraform deployment runs for a session') and names the exact fields returned (job IDs, statuses, types, timestamps). It is clearly distinguishable from log- or status-oriented siblings, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete use cases — viewing deployment history, finding job IDs for log inspection, and checking success/failure — which routes the agent well. It does not, however, state when to prefer another tool (e.g. tflogs or tfstatus) or any exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tfstatusCheck Deploy StatusA
Read-only
Inspect

MONITORING: Quick status check for Terraform deployments Check the current status of a Terraform deployment job. Use this tool to quickly check if a deployment is running, completed, or failed. Returns job status, job_id, and other metadata without streaming logs. Use tflogs to stream the actual deployment logs. REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: job_id to target a specific deployment (use tfruns to discover IDs).

LIVENESS: The response carries two distinct timestamps:

  • updated_at — last semantic change (only bumped when status / drift / version actually differ). Useful for sorting deployments; NOT a per-poll heartbeat.

  • last_refresh_at — last successful Oracle decode (stamped on every poll where reliable reached Oracle, even if nothing in the row changed). Use this to confirm reliable is still actively talking to Oracle for a long-running RUNNING job. Absent on rows that haven't been refreshed since the column was added. 💡 TIP: Examine workflow.usage prompt for more context on how to properly use these tools.

NameRequiredDescriptionDefault
job_idNoOptional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescription
foundNoFalse when the session has no job yet.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
job_idNoID of the job reported on.
statusNoJob status, for example 'pending', 'running', 'succeeded' or 'failed'.
job_keyNoJob type key (for example 'apply', 'destroy', 'plan', 'drift').
created_atNoJob creation time (RFC 3339).
session_idNoSession ID this status belongs to.
updated_atNoTime of the job's last status change (RFC 3339).
version_idNoID of the stack version the job ran.
plan_summaryNoSummary of the Terraform plan, for plan and drift jobs.
draft_versionNoDraft stack version number, when a draft exists.
last_event_idNoLog cursor. Pass it to tflogs to fetch only newer entries.
drift_detectedNoTrue when a drift check found differences from the deployed state.
version_numberNoNumber of the stack version the job ran.
version_statusNoStatus of that stack version.
current_versionNoLatest committed stack version number.
last_refresh_atNoTime the backend last polled the deploy runner for this job (RFC 3339).
presets_versionNoTerraform presets version the runner used.
drift_actionableNoTrue when the drift would make Terraform apply changes; false when it is refresh-only noise.
template_versionNoInfrastructure template version the runner used.
has_pending_changesNoTrue when the draft stack differs from the deployed version.
drift_classificationNoPer-resource drift verdicts, when the drift check could classify them.
custom_presets_versionNoTerraform presets version InsideOut composed the stack with.
custom_template_versionNoInfrastructure template version InsideOut composed the stack with.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations by disclosing the liveness model: updated_at only bumps on semantic change while last_refresh_at stamps every successful Oracle poll, which is exactly what an agent needs to distinguish a stalled job from a stale row. It also states that no logs are streamed and what identifiers the response carries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead line and the tflogs hand-off are front-loaded and earn their place, and the liveness bullets carry real information. The trailing 'workflow.usage prompt' tip is vague filler, and the REQUIRES/OPTIONAL block duplicates the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description covers auth, sibling alternatives, and the timestamp semantics that matter for polling. The only loose end is the ambiguous pointer to the workflow.usage prompt, which gives no concrete action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents both parameters, including the sess_v2_*?token=* format warning. The description mostly restates those REQUIRES/OPTIONAL lines; the only genuinely new fact is that job IDs can be discovered via tfruns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'check the current status of a Terraform deployment job' — and immediately narrows the scope ('without streaming logs'). It is distinguishable from tflogs and tfruns, which are named in the text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use tflogs to stream the actual deployment logs, use tfruns to discover job IDs. It also states the precondition (session_id from convoopen) and when job_id is optional, so an agent knows exactly when this tool is and is not the right call.

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. 24 tool updates
    • Changedawsinspect1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "result": {
        +      "description": "The AWS inspect result. A list action returns a summary object (count plus the listed items) when summarized is true; detail and raw actions return the backend result unchanged."
        +    },
        +    "summarized": {
        +      "description": "True when result is a compact summary instead of the full backend response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedawsinspect_batch1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "results": {
        +      "description": "One entry per sub-request, in request order.",
        +      "items": {
        +        "description": "Result of one AWS sub-request.",
        +        "properties": {
        +          "action": {
        +            "description": "Action the sub-request ran.",
        +            "type": "string"
        +          },
        +          "duration_ms": {
        +            "description": "Time the sub-request took, in milliseconds.",
        +            "type": "integer"
        +          },
        +          "error": {
        +            "description": "Error message when ok is false.",
        +            "type": "string"
        +          },
        +          "index": {
        +            "description": "Position of the sub-request in the request.",
        +            "type": "integer"
        +          },
        +          "ok": {
        +            "description": "True when the sub-request succeeded.",
        +            "type": "boolean"
        +          },
        +          "result": {
        +            "description": "The sub-request result, with the same rules as the single inspect tool."
        +          },
        +          "service": {
        +            "description": "Service the sub-request inspected.",
        +            "type": "string"
        +          },
        +          "summarized": {
        +            "description": "True when result is a compact summary.",
        +            "type": "boolean"
        +          },
        +          "truncated": {
        +            "description": "True when result was dropped to keep the response under the size cap.",
        +            "type": "boolean"
        +          }
        +        },
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "truncated_at": {
        +      "description": "Index of the first sub-request whose result was dropped for size.",
        +      "type": "integer"
        +    },
        +    "truncated_cap_bytes": {
        +      "description": "Response size cap, in bytes, that caused the truncation.",
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedconvoawait1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "assistant_message": {
        +      "description": "Riley's reply, cleaned of internal markers. Show it to the user.",
        +      "properties": {
        +        "text": {
        +          "description": "The message text.",
        +          "type": "string"
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "instruction": {
        +      "description": "Plain-language instruction for the agent when the reply is not ready yet.",
        +      "type": "string"
        +    },
        +    "message_id": {
        +      "description": "ID of Riley's reply message.",
        +      "type": "string"
        +    },
        +    "next_action": {
        +      "description": "Tool to call next when the reply is not ready yet (for example 'convoawait').",
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.",
        +      "type": "string"
        +    },
        +    "source": {
        +      "description": "How the reply was found when it did not come from the pending convoreply call: 'poll' or 'targeted_poll'.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Outcome of the call: 'ok' (Riley replied), 'timeout' (still working; call convoawait), or 'pending_exists' (an earlier reply is still pending; call convoawait).",
        +      "type": "string"
        +    },
        +    "terraform_ready": {
        +      "description": "True when Riley signalled that the design is final and tfgenerate can be called.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedconvoinspect1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "createdAt": {
        +      "description": "Session creation time as a Unix timestamp in milliseconds."
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "id": {
        +      "description": "Session ID (without the token suffix).",
        +      "type": "string"
        +    },
        +    "messages": {
        +      "description": "Conversation transcript, oldest first. System rows are removed.",
        +      "items": {
        +        "description": "One message.",
        +        "properties": {
        +          "content": {
        +            "description": "Message text.",
        +            "type": "string"
        +          },
        +          "createdAt": {
        +            "description": "Creation time as a Unix timestamp in milliseconds."
        +          },
        +          "id": {
        +            "description": "Message ID.",
        +            "type": "string"
        +          },
        +          "internal": {
        +            "description": "Set when the message is internal to the session."
        +          },
        +          "name": {
        +            "description": "Optional author name.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "Author role: 'user' or 'assistant'.",
        +            "type": "string"
        +          }
        +        },
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "meta": {
        +      "description": "Session metadata from the backend (stack, deploy and credential state).",
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "updatedAt": {
        +      "description": "Last update time as a Unix timestamp in milliseconds."
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedconvoopen1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "assistant_message": {
        +      "description": "Riley's reply, cleaned of internal markers. Show it to the user.",
        +      "properties": {
        +        "text": {
        +          "description": "The message text.",
        +          "type": "string"
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "session_id": {
        +      "description": "Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedconvoreply1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "assistant_message": {
        +      "description": "Riley's reply, cleaned of internal markers. Show it to the user.",
        +      "properties": {
        +        "text": {
        +          "description": "The message text.",
        +          "type": "string"
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "instruction": {
        +      "description": "Plain-language instruction for the agent when the reply is not ready yet.",
        +      "type": "string"
        +    },
        +    "message_id": {
        +      "description": "ID of Riley's reply message.",
        +      "type": "string"
        +    },
        +    "next_action": {
        +      "description": "Tool to call next when the reply is not ready yet (for example 'convoawait').",
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Outcome of the call: 'ok' (Riley replied), 'timeout' (still working; call convoawait), or 'pending_exists' (an earlier reply is still pending; call convoawait).",
        +      "type": "string"
        +    },
        +    "terraform_ready": {
        +      "description": "True when Riley signalled that the design is final and tfgenerate can be called.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedconvostatus1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "cloudConnectionInfo": {
        +      "description": "Cloud credential status from the backend (has_credentials, expired, cloud, auth_method, account or project ID, ...).",
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "components": {
        +      "description": "Selected stack components, keyed by component.",
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "config": {
        +      "description": "Configuration of each selected component.",
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "grandTotalMonthlyUSD": {
        +      "description": "Estimated total monthly cost in US dollars, or null when there is no estimate.",
        +      "type": [
        +        "null",
        +        "number"
        +      ]
        +    },
        +    "hasAnyConfig": {
        +      "description": "True when any component has configuration.",
        +      "type": "boolean"
        +    },
        +    "hasCloudConnection": {
        +      "description": "True when cloud credentials are connected to the session.",
        +      "type": "boolean"
        +    },
        +    "hasConfig": {
        +      "description": "True when the stack configuration is complete.",
        +      "type": "boolean"
        +    },
        +    "hasDeployAttempt": {
        +      "description": "True when a deploy has been started at least once.",
        +      "type": "boolean"
        +    },
        +    "hasDeployment": {
        +      "description": "True when the stack is deployed.",
        +      "type": "boolean"
        +    },
        +    "hasFeatures": {
        +      "description": "True when the session has selected features.",
        +      "type": "boolean"
        +    },
        +    "hasPricing": {
        +      "description": "True when a cost estimate exists.",
        +      "type": "boolean"
        +    },
        +    "hasSelection": {
        +      "description": "True when the session has selected stack components.",
        +      "type": "boolean"
        +    },
        +    "hasTerraform": {
        +      "description": "True when Terraform has been generated (tfgenerate).",
        +      "type": "boolean"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "persona": {
        +      "description": "What InsideOut knows about the user and their target cloud.",
        +      "properties": {
        +        "builderIds": {
        +          "description": "IDs of the stack builders selected for this session.",
        +          "items": {
        +            "description": "A builder ID.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "cloudProvider": {
        +          "description": "Target cloud provider ('aws' or 'gcp').",
        +          "type": "string"
        +        },
        +        "email": {
        +          "description": "User's email address.",
        +          "type": "string"
        +        },
        +        "githubUsername": {
        +          "description": "GitHub username used for deploy commit attribution.",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "User's display name.",
        +          "type": "string"
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "pricing": {
        +      "description": "Cost estimate details per component.",
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "session_id": {
        +      "description": "Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.",
        +      "type": "string"
        +    },
        +    "session_source": {
        +      "description": "IDE or tool that opened the session (for example 'claude-code').",
        +      "type": "string"
        +    },
        +    "versioning": {
        +      "description": "Stack version state, when the backend tracks versions.",
        +      "properties": {
        +        "change_summary": {
        +          "description": "Summary of the draft's changes.",
        +          "type": "string"
        +        },
        +        "changes": {
        +          "description": "Component changes in the draft.",
        +          "items": {
        +            "description": "One component change.",
        +            "type": [
        +              "null",
        +              "object"
        +            ]
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "current_version": {
        +          "description": "Latest committed stack version number.",
        +          "type": "integer"
        +        },
        +        "draft_version": {
        +          "description": "Draft version number, when a draft exists.",
        +          "type": "integer"
        +        },
        +        "has_pending_changes": {
        +          "description": "True when the draft differs from the current version.",
        +          "type": "boolean"
        +        },
        +        "pricing_changes": {
        +          "description": "Cost changes in the draft.",
        +          "items": {
        +            "description": "One cost change.",
        +            "type": [
        +              "null",
        +              "object"
        +            ]
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcredawait1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "auth_method": {
        +      "description": "How the credentials were connected, when status is 'connected'.",
        +      "type": "string"
        +    },
        +    "cloud": {
        +      "description": "Cloud provider: 'aws' or 'gcp'.",
        +      "type": "string"
        +    },
        +    "connect_url": {
        +      "description": "URL the user opens to connect credentials, when status is 'timeout'.",
        +      "type": "string"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "session_id": {
        +      "description": "Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "'connected' when credentials were found, or 'timeout' when the wait ended first (call credawait again).",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedgcpinspect1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "result": {
        +      "description": "The GCP inspect result. A list action returns a summary object (count plus the listed items) when summarized is true; detail and raw actions return the backend result unchanged."
        +    },
        +    "summarized": {
        +      "description": "True when result is a compact summary instead of the full backend response.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedgcpinspect_batch1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "results": {
        +      "description": "One entry per sub-request, in request order.",
        +      "items": {
        +        "description": "Result of one GCP sub-request.",
        +        "properties": {
        +          "action": {
        +            "description": "Action the sub-request ran.",
        +            "type": "string"
        +          },
        +          "duration_ms": {
        +            "description": "Time the sub-request took, in milliseconds.",
        +            "type": "integer"
        +          },
        +          "error": {
        +            "description": "Error message when ok is false.",
        +            "type": "string"
        +          },
        +          "index": {
        +            "description": "Position of the sub-request in the request.",
        +            "type": "integer"
        +          },
        +          "ok": {
        +            "description": "True when the sub-request succeeded.",
        +            "type": "boolean"
        +          },
        +          "result": {
        +            "description": "The sub-request result, with the same rules as the single inspect tool."
        +          },
        +          "service": {
        +            "description": "Service the sub-request inspected.",
        +            "type": "string"
        +          },
        +          "summarized": {
        +            "description": "True when result is a compact summary.",
        +            "type": "boolean"
        +          },
        +          "truncated": {
        +            "description": "True when result was dropped to keep the response under the size cap.",
        +            "type": "boolean"
        +          }
        +        },
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "truncated_at": {
        +      "description": "Index of the first sub-request whose result was dropped for size.",
        +      "type": "integer"
        +    },
        +    "truncated_cap_bytes": {
        +      "description": "Response size cap, in bytes, that caused the truncation.",
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedhelp1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "base_url": {
        +      "description": "InsideOut backend URL the server talks to.",
        +      "type": "string"
        +    },
        +    "build_time": {
        +      "description": "Server build time.",
        +      "type": "string"
        +    },
        +    "dirty": {
        +      "description": "True when the server was built from a modified tree.",
        +      "type": "boolean"
        +    },
        +    "git_commit": {
        +      "description": "Git commit the server was built from.",
        +      "type": "string"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "section": {
        +      "description": "Guide section returned, when help(section=...) was called.",
        +      "type": "string"
        +    },
        +    "transport": {
        +      "description": "MCP transport in use (for example 'stdio' or 'http').",
        +      "type": "string"
        +    },
        +    "version": {
        +      "description": "Server version.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedstackdiff1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "components": {
        +      "description": "Changed components, each with key, change and per-field from/to values.",
        +      "items": {
        +        "description": "One changed component.",
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "from_version": {
        +      "description": "Version number the diff starts from."
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "pricing_delta": {
        +      "description": "Monthly cost before and after (from_total, to_total).",
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "summary": {
        +      "description": "Summary of the differences."
        +    },
        +    "to_version": {
        +      "description": "Version number the diff ends at."
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedstackrollback1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "version": {
        +      "description": "The stack version the session now points to (version, status).",
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedstackversions1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "versions": {
        +      "description": "Stack versions, each with version, status, change_summary and created_at.",
        +      "items": {
        +        "description": "One stack version.",
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedsubmit_feedback1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "message": {
        +      "description": "Confirmation text to show the user.",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "True when the feedback was delivered to Luther Systems.",
        +      "type": "boolean"
        +    },
        +    "session_id": {
        +      "description": "Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfdeploy1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "job_id": {
        +      "description": "ID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one.",
        +      "type": "string"
        +    },
        +    "success": {
        +      "description": "True when the deploy job was started.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfdestroy1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "job_id": {
        +      "description": "ID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one.",
        +      "type": "string"
        +    },
        +    "success": {
        +      "description": "True when the destroy job was started.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfdrift1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "job_id": {
        +      "description": "ID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one.",
        +      "type": "string"
        +    },
        +    "success": {
        +      "description": "True when the drift check job was started.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfgenerate1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "download_url": {
        +      "description": "URL of the archive with the generated Terraform.",
        +      "type": "string"
        +    },
        +    "files": {
        +      "description": "Number of generated Terraform files.",
        +      "type": "integer"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "inline": {
        +      "description": "True when the source is inlined in the result (include_code=true) instead of offered as a download.",
        +      "type": "boolean"
        +    },
        +    "success": {
        +      "description": "True when the Terraform was generated.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtflogs1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "complete": {
        +      "description": "True when the job has finished and no more logs will come.",
        +      "type": "boolean"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "last_event_id": {
        +      "description": "Log cursor. Pass it back as last_event_id to fetch only newer entries.",
        +      "type": "string"
        +    },
        +    "logs": {
        +      "description": "Log lines, oldest first.",
        +      "items": {
        +        "description": "One log line.",
        +        "type": "string"
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "logs_count": {
        +      "description": "Number of log lines in this result.",
        +      "type": "integer"
        +    },
        +    "session_id": {
        +      "description": "Session ID these logs belong to.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfoutputs1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "error": {
        +      "description": "Why no outputs were found, when found is false.",
        +      "type": "string"
        +    },
        +    "found": {
        +      "description": "False when no successful deploy with outputs was found.",
        +      "type": "boolean"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "job_id": {
        +      "description": "ID of the deploy job the outputs come from.",
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Session ID these outputs belong to.",
        +      "type": "string"
        +    },
        +    "source": {
        +      "description": "Where the outputs were read from.",
        +      "type": "string"
        +    },
        +    "step_outputs": {
        +      "description": "Terraform outputs, one entry per deploy lifecycle step.",
        +      "items": {
        +        "description": "Outputs of one lifecycle step.",
        +        "properties": {
        +          "lifecycle": {
        +            "description": "Lifecycle step name (for example 'cloud-provision').",
        +            "type": "string"
        +          },
        +          "outputs": {
        +            "additionalProperties": {
        +              "description": "One Terraform output.",
        +              "properties": {
        +                "sensitive": {
        +                  "description": "True when Terraform marks the output as sensitive.",
        +                  "type": "boolean"
        +                },
        +                "type": {
        +                  "description": "Terraform type of the value (a string such as 'string', or a nested type expression)."
        +                },
        +                "value": {
        +                  "description": "Output value; any JSON type. Redacted when sensitive is true."
        +                }
        +              },
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "description": "Terraform outputs of the step, keyed by output name; each has value, type and sensitive.",
        +            "type": [
        +              "null",
        +              "object"
        +            ]
        +          }
        +        },
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfplan1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "job_id": {
        +      "description": "ID of the plan job. Follow it with tfstatus.",
        +      "type": "string"
        +    },
        +    "plan_id": {
        +      "description": "Plan ID. Pass it to tfdeploy (with project_id) to apply exactly this plan.",
        +      "type": "string"
        +    },
        +    "project_id": {
        +      "description": "Project ID that goes with plan_id on tfdeploy.",
        +      "type": "string"
        +    },
        +    "success": {
        +      "description": "True when the plan job was started.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfruns1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "count": {
        +      "description": "Number of runs the backend reported.",
        +      "type": "integer"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "runs": {
        +      "description": "Deploy job history, newest first.",
        +      "items": {
        +        "description": "One deploy job.",
        +        "properties": {
        +          "cloud": {
        +            "description": "Cloud provider the job ran against.",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "Job creation time (RFC 3339).",
        +            "type": "string"
        +          },
        +          "job_id": {
        +            "description": "Job ID. Pass it to tfstatus, tflogs or tfoutputs.",
        +            "type": "string"
        +          },
        +          "job_key": {
        +            "description": "Job type key.",
        +            "type": "string"
        +          },
        +          "job_type": {
        +            "description": "Job type: apply, destroy, plan or drift.",
        +            "type": "string"
        +          },
        +          "project_id": {
        +            "description": "Deploy runner project ID.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Job status.",
        +            "type": "string"
        +          },
        +          "updated_at": {
        +            "description": "Time of the job's last status change (RFC 3339).",
        +            "type": "string"
        +          },
        +          "version_id": {
        +            "description": "ID of the stack version the job ran.",
        +            "type": "string"
        +          }
        +        },
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "type": [
        +        "null",
        +        "array"
        +      ]
        +    },
        +    "session_id": {
        +      "description": "Session ID these runs belong to.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedtfstatus1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "created_at": {
        +      "description": "Job creation time (RFC 3339).",
        +      "type": "string"
        +    },
        +    "current_version": {
        +      "description": "Latest committed stack version number.",
        +      "type": "integer"
        +    },
        +    "custom_presets_version": {
        +      "description": "Terraform presets version InsideOut composed the stack with.",
        +      "type": "string"
        +    },
        +    "custom_template_version": {
        +      "description": "Infrastructure template version InsideOut composed the stack with.",
        +      "type": "string"
        +    },
        +    "draft_version": {
        +      "description": "Draft stack version number, when a draft exists.",
        +      "type": [
        +        "null",
        +        "integer"
        +      ]
        +    },
        +    "drift_actionable": {
        +      "description": "True when the drift would make Terraform apply changes; false when it is refresh-only noise.",
        +      "type": [
        +        "null",
        +        "boolean"
        +      ]
        +    },
        +    "drift_classification": {
        +      "description": "Per-resource drift verdicts, when the drift check could classify them.",
        +      "properties": {
        +        "resources": {
        +          "description": "One verdict per drifted resource.",
        +          "items": {
        +            "description": "One drifted resource.",
        +            "properties": {
        +              "action": {
        +                "description": "Terraform actions the drift would cause.",
        +                "items": {
        +                  "description": "One action.",
        +                  "type": "string"
        +                },
        +                "type": [
        +                  "null",
        +                  "array"
        +                ]
        +              },
        +              "address": {
        +                "description": "Terraform resource address.",
        +                "type": "string"
        +              },
        +              "class": {
        +                "description": "Drift class assigned to the resource.",
        +                "type": "string"
        +              },
        +              "name": {
        +                "description": "Terraform resource name.",
        +                "type": "string"
        +              },
        +              "reason": {
        +                "description": "Why the resource got that class.",
        +                "type": "string"
        +              },
        +              "type": {
        +                "description": "Terraform resource type.",
        +                "type": "string"
        +              }
        +            },
        +            "type": [
        +              "null",
        +              "object"
        +            ]
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "summary": {
        +          "description": "Summary of the drift verdicts.",
        +          "type": "string"
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "drift_detected": {
        +      "description": "True when a drift check found differences from the deployed state.",
        +      "type": "boolean"
        +    },
        +    "found": {
        +      "description": "False when the session has no job yet.",
        +      "type": "boolean"
        +    },
        +    "has_pending_changes": {
        +      "description": "True when the draft stack differs from the deployed version.",
        +      "type": "boolean"
        +    },
        +    "hints": {
        +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
        +      "properties": {
        +        "next_actions": {
        +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
        +          "items": {
        +            "description": "One suggested next step.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "related_tools": {
        +          "description": "Names of tools that are useful after this result.",
        +          "items": {
        +            "description": "A tool name.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "job_id": {
        +      "description": "ID of the job reported on.",
        +      "type": "string"
        +    },
        +    "job_key": {
        +      "description": "Job type key (for example 'apply', 'destroy', 'plan', 'drift').",
        +      "type": "string"
        +    },
        +    "last_event_id": {
        +      "description": "Log cursor. Pass it to tflogs to fetch only newer entries.",
        +      "type": "string"
        +    },
        +    "last_refresh_at": {
        +      "description": "Time the backend last polled the deploy runner for this job (RFC 3339).",
        +      "type": "string"
        +    },
        +    "plan_summary": {
        +      "description": "Summary of the Terraform plan, for plan and drift jobs.",
        +      "properties": {
        +        "add": {
        +          "description": "Resources to create.",
        +          "type": "integer"
        +        },
        +        "change": {
        +          "description": "Resources to update in place.",
        +          "type": "integer"
        +        },
        +        "destroy": {
        +          "description": "Resources to destroy.",
        +          "type": "integer"
        +        },
        +        "expected_tag_changes_only": {
        +          "description": "True when every change is an import or an InsideOut tag update.",
        +          "type": [
        +            "null",
        +            "boolean"
        +          ]
        +        },
        +        "has_changes": {
        +          "description": "True when the plan changes anything.",
        +          "type": "boolean"
        +        },
        +        "import": {
        +          "description": "Resources to import.",
        +          "type": "integer"
        +        },
        +        "resource_changes": {
        +          "description": "Per-resource changes.",
        +          "items": {
        +            "description": "One resource change.",
        +            "properties": {
        +              "action": {
        +                "description": "Change action: 'create', 'update', 'delete' or 'replace'.",
        +                "type": "string"
        +              },
        +              "address": {
        +                "description": "Terraform resource address.",
        +                "type": "string"
        +              }
        +            },
        +            "type": [
        +              "null",
        +              "object"
        +            ]
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "stage_errors": {
        +          "description": "Errors reported by plan stages.",
        +          "items": {
        +            "description": "One stage error.",
        +            "type": "string"
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        },
        +        "validation_issues": {
        +          "description": "First-import plan gate violations, each with code, field, reason and value.",
        +          "items": {
        +            "additionalProperties": {
        +              "type": "string"
        +            },
        +            "description": "One violation.",
        +            "type": [
        +              "null",
        +              "object"
        +            ]
        +          },
        +          "type": [
        +            "null",
        +            "array"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "null",
        +        "object"
        +      ]
        +    },
        +    "presets_version": {
        +      "description": "Terraform presets version the runner used.",
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Session ID this status belongs to.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Job status, for example 'pending', 'running', 'succeeded' or 'failed'.",
        +      "type": "string"
        +    },
        +    "template_version": {
        +      "description": "Infrastructure template version the runner used.",
        +      "type": "string"
        +    },
        +    "updated_at": {
        +      "description": "Time of the job's last status change (RFC 3339).",
        +      "type": "string"
        +    },
        +    "version_id": {
        +      "description": "ID of the stack version the job ran.",
        +      "type": "string"
        +    },
        +    "version_number": {
        +      "description": "Number of the stack version the job ran.",
        +      "type": "integer"
        +    },
        +    "version_status": {
        +      "description": "Status of that stack version.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  2. 4 tool updates
    • Changedawsinspect1 field changed
      • changedInput schema / properties / service / enum
        Previous value: -[
        -  "account",
        -  "alb",
        -  "apigateway",
        -  "backup",
        -  "bedrock",
        -  "cloudfront",
        -  "cloudwatchlogs",
        -  "cognito",
        -  "cost-explorer",
        -  "dynamodb",
        -  "ebs",
        -  "ec2",
        -  "ecs",
        -  "eks",
        -  "elasticache",
        -  "kms",
        -  "lambda",
        -  "msk",
        -  "opensearch",
        -  "rds",
        -  "s3",
        -  "secretsmanager",
        -  "sqs",
        -  "vpc",
        -  "waf"
        -]New value: +[
        +  "account",
        +  "acm",
        +  "alb",
        +  "apigateway",
        +  "apprunner",
        +  "backup",
        +  "bedrock",
        +  "cloudfront",
        +  "cloudwatchlogs",
        +  "cognito",
        +  "cost-explorer",
        +  "dynamodb",
        +  "ebs",
        +  "ec2",
        +  "ecs",
        +  "eks",
        +  "elasticache",
        +  "kms",
        +  "lambda",
        +  "msk",
        +  "opensearch",
        +  "rds",
        +  "route53",
        +  "s3",
        +  "sagemaker",
        +  "secretsmanager",
        +  "sqs",
        +  "vpc",
        +  "waf"
        +]
    • Changedawsinspect_batch1 field changed
      • changedInput schema / properties / subs / items / properties / service / enum
        Previous value: -[
        -  "account",
        -  "alb",
        -  "apigateway",
        -  "backup",
        -  "bedrock",
        -  "cloudfront",
        -  "cloudwatchlogs",
        -  "cognito",
        -  "cost-explorer",
        -  "dynamodb",
        -  "ebs",
        -  "ec2",
        -  "ecs",
        -  "eks",
        -  "elasticache",
        -  "kms",
        -  "lambda",
        -  "msk",
        -  "opensearch",
        -  "rds",
        -  "s3",
        -  "secretsmanager",
        -  "sqs",
        -  "vpc",
        -  "waf"
        -]New value: +[
        +  "account",
        +  "acm",
        +  "alb",
        +  "apigateway",
        +  "apprunner",
        +  "backup",
        +  "bedrock",
        +  "cloudfront",
        +  "cloudwatchlogs",
        +  "cognito",
        +  "cost-explorer",
        +  "dynamodb",
        +  "ebs",
        +  "ec2",
        +  "ecs",
        +  "eks",
        +  "elasticache",
        +  "kms",
        +  "lambda",
        +  "msk",
        +  "opensearch",
        +  "rds",
        +  "route53",
        +  "s3",
        +  "sagemaker",
        +  "secretsmanager",
        +  "sqs",
        +  "vpc",
        +  "waf"
        +]
    • Changedgcpinspect1 field changed
      • changedInput schema / properties / service / enum
        Previous value: -[
        -  "apigateway",
        -  "bastion",
        -  "billing",
        -  "cloudarmor",
        -  "cloudbuild",
        -  "cloudcdn",
        -  "cloudfunctions",
        -  "cloudkms",
        -  "cloudlogging",
        -  "cloudmonitoring",
        -  "cloudrun",
        -  "cloudsql",
        -  "compute",
        -  "firestore",
        -  "gcs",
        -  "gke",
        -  "identityplatform",
        -  "loadbalancer",
        -  "memorystore",
        -  "pubsub",
        -  "secretmanager",
        -  "vertexai",
        -  "vpc"
        -]New value: +[
        +  "apigateway",
        +  "bastion",
        +  "billing",
        +  "certificatemanager",
        +  "cloudarmor",
        +  "cloudbuild",
        +  "cloudcdn",
        +  "clouddeploy",
        +  "clouddns",
        +  "cloudfunctions",
        +  "cloudkms",
        +  "cloudlogging",
        +  "cloudmonitoring",
        +  "cloudrun",
        +  "cloudsql",
        +  "compute",
        +  "firestore",
        +  "gcs",
        +  "gke",
        +  "iam",
        +  "identityplatform",
        +  "loadbalancer",
        +  "memorystore",
        +  "pubsub",
        +  "secretmanager",
        +  "vertexai",
        +  "vpc"
        +]
    • Changedgcpinspect_batch1 field changed
      • changedInput schema / properties / subs / items / properties / service / enum
        Previous value: -[
        -  "apigateway",
        -  "bastion",
        -  "billing",
        -  "cloudarmor",
        -  "cloudbuild",
        -  "cloudcdn",
        -  "cloudfunctions",
        -  "cloudkms",
        -  "cloudlogging",
        -  "cloudmonitoring",
        -  "cloudrun",
        -  "cloudsql",
        -  "compute",
        -  "firestore",
        -  "gcs",
        -  "gke",
        -  "identityplatform",
        -  "loadbalancer",
        -  "memorystore",
        -  "pubsub",
        -  "secretmanager",
        -  "vertexai",
        -  "vpc"
        -]New value: +[
        +  "apigateway",
        +  "bastion",
        +  "billing",
        +  "certificatemanager",
        +  "cloudarmor",
        +  "cloudbuild",
        +  "cloudcdn",
        +  "clouddeploy",
        +  "clouddns",
        +  "cloudfunctions",
        +  "cloudkms",
        +  "cloudlogging",
        +  "cloudmonitoring",
        +  "cloudrun",
        +  "cloudsql",
        +  "compute",
        +  "firestore",
        +  "gcs",
        +  "gke",
        +  "iam",
        +  "identityplatform",
        +  "loadbalancer",
        +  "memorystore",
        +  "pubsub",
        +  "secretmanager",
        +  "vertexai",
        +  "vpc"
        +]
  3. 1 tool update
    • Changedconvoreply1 field changed
      • removedInput schema / properties / auto_accept
        Removed value: -{
        -  "description": "When true, Riley skips setup confirmation gates and proceeds with defaults. Only affects the setup phase (not management, deploy, or destroy). Default true for MCP.",
        -  "type": [
        -    "null",
        -    "boolean"
        -  ]
        -}
  4. 24 tool updates
    • Changedawsinspect8 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Operation on the service. Examples: 'describe-instances' (ec2), 'list-buckets' (s3), 'list-keys' (kms), 'get-cost-summary' (cost-explorer), 'list-actions' (discovery), 'list-metrics' / 'get-metrics' (CloudWatch)."
      • addedInput schema / properties / detail / description
        Added value: +"When true, returns full metadata for a single resource (requires a resource ID in filters). When false (default), returns a summary."
      • addedInput schema / properties / filters / description
        Added value: +"Optional JSON-encoded filter object passed through to the underlying AWS API. Examples: '{\"hours\":6}' for metric windows, '{\"days\":7,\"granularity\":\"DAILY\"}' for cost queries."
      • addedInput schema / properties / raw / description
        Added value: +"When true, returns the unprocessed AWS API response. Escape hatch for fields the summarized response doesn't surface."
      • addedInput schema / properties / service / description
        Added value: +"AWS service to query. Examples: 'ec2', 'rds', 'vpc', 's3', 'lambda', 'eks', 'ecs', 'cost-explorer'. Use action='list-actions' to discover the supported actions for a service."
      • addedInput schema / properties / service / enum
        Added value: +[
        +  "account",
        +  "alb",
        +  "apigateway",
        +  "backup",
        +  "bedrock",
        +  "cloudfront",
        +  "cloudwatchlogs",
        +  "cognito",
        +  "cost-explorer",
        +  "dynamodb",
        +  "ebs",
        +  "ec2",
        +  "ecs",
        +  "eks",
        +  "elasticache",
        +  "kms",
        +  "lambda",
        +  "msk",
        +  "opensearch",
        +  "rds",
        +  "s3",
        +  "secretsmanager",
        +  "sqs",
        +  "vpc",
        +  "waf"
        +]
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have an AWS deploy attempt before inspect probes will succeed."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedawsinspect_batch9 fields changed
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have an AWS deploy attempt before inspect probes will succeed."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / subs / description
        Added value: +"Up to 32 sub-probes, each with {service, action, filters?, detail?, raw?}. The backend fetches credentials once per batch and fans out probes in parallel (concurrency 8, 30s per-sub timeout, 60s total wall clock). Partial failure is expected — inspect each result.ok independently."
      • addedInput schema / properties / subs / items / properties / action / description
        Added value: +"Operation on the service (e.g. 'describe-instances', 'list-buckets', 'list-actions' for discovery, 'list-metrics' / 'get-metrics' for time-series)."
      • addedInput schema / properties / subs / items / properties / filters / description
        Added value: +"Optional JSON-encoded filter object passed through to the underlying API. Examples: '{\"hours\":6}' for metric windows, '{\"days\":7}' for cost queries."
      • addedInput schema / properties / subs / items / properties / service / description
        Added value: +"Cloud service to query (e.g. 'ec2', 'rds', 's3' for AWS; 'compute', 'storage', 'cloudsql' for GCP). Use the singular awsinspect/gcpinspect tool with action='list-actions' to discover supported services."
      • addedInput schema / properties / subs / items / properties / service / enum
        Added value: +[
        +  "account",
        +  "alb",
        +  "apigateway",
        +  "backup",
        +  "bedrock",
        +  "cloudfront",
        +  "cloudwatchlogs",
        +  "cognito",
        +  "cost-explorer",
        +  "dynamodb",
        +  "ebs",
        +  "ec2",
        +  "ecs",
        +  "eks",
        +  "elasticache",
        +  "kms",
        +  "lambda",
        +  "msk",
        +  "opensearch",
        +  "rds",
        +  "s3",
        +  "secretsmanager",
        +  "sqs",
        +  "vpc",
        +  "waf"
        +]
      • addedInput schema / properties / subs / maxItems
        Added value: +32
      • addedInput schema / properties / subs / minItems
        Added value: +1
    • Changedconvoawait6 fields changed
      • addedInput schema / properties / message_id / description
        Added value: +"Optional message ID from a convoreply timeout error. Not required for normal turn-based flow."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / timeout / description
        Added value: +"Max seconds to wait. Default 50, max 55."
      • addedInput schema / properties / timeout / maximum
        Added value: +55
      • addedInput schema / properties / timeout / minimum
        Added value: +1
    • Changedconvoinspect2 fields changed
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedconvoopen3 fields changed
      • addedInput schema / properties / github_username / description
        Added value: +"GitHub username used for deploy commit attribution; pre-fills the GitHub username field on the connect screen."
      • addedInput schema / properties / project_context / description
        Added value: +"Optional tech-stack summary so Riley can skip discovery questions (e.g. 'Next.js 14 + Postgres on AWS, ~50k MAU'). No PII, secrets, file paths, or source code — only general metadata useful to a cloud architect."
      • addedInput schema / properties / source / description
        Added value: +"IDE/tool identifier so the connect screen can show the right 'Open {IDE}' button. Use lowercase: 'claude-code', 'codex', 'antigravity', 'kiro', 'cursor', 'vscode', 'windsurf', 'zed', 'aider', 'copilot', 'web', 'mcp'."
    • Changedconvoreply11 fields changed
      • addedInput schema / properties / auto_accept / description
        Added value: +"When true, Riley skips setup confirmation gates and proceeds with defaults. Only affects the setup phase (not management, deploy, or destroy). Default true for MCP."
      • addedInput schema / properties / project_context / description
        Added value: +"Only NEW project details revealed after convoopen (e.g. user mentions a new constraint mid-conversation). Don't re-send context already provided in convoopen. No PII or secrets."
      • addedInput schema / properties / retry / description
        Added value: +"When true, re-send the most recent user turn instead of submitting a new one."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / text / description
        Added value: +"User message to send to Riley. Forward verbatim what the user said — do not summarize or rewrite."
      • addedInput schema / properties / text / maxLength
        Added value: +20000
      • addedInput schema / properties / text / minLength
        Added value: +1
      • addedInput schema / properties / timeout / description
        Added value: +"Max seconds to wait for Riley's response. Default 50, max 55."
      • addedInput schema / properties / timeout / maximum
        Added value: +55
      • addedInput schema / properties / timeout / minimum
        Added value: +1
    • Changedconvostatus4 fields changed
      • removedInput schema / properties / include_code
        Removed value: -{
        -  "type": [
        -    "null",
        -    "boolean"
        -  ]
        -}
      • addedInput schema / properties / job_id
        Added value: +{
        +  "description": "Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session.",
        +  "type": "string"
        +}
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedcredawait7 fields changed
      • addedInput schema / properties / cloud / description
        Added value: +"Cloud provider whose credentials are awaited: 'aws' or 'gcp'. Defaults to 'aws'."
      • addedInput schema / properties / cloud / enum
        Added value: +[
        +  "aws",
        +  "gcp"
        +]
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / timeout / description
        Added value: +"Max seconds to wait for the user to complete the browser-based credential connect flow. Default 300, max 600."
      • addedInput schema / properties / timeout / maximum
        Added value: +600
      • addedInput schema / properties / timeout / minimum
        Added value: +1
    • Changedgcpinspect8 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Operation on the service. Examples: 'list-instances' (compute), 'list-buckets' (storage), 'list-clusters' (gke), 'list-actions' (discovery), 'list-metrics' / 'get-metrics' (Cloud Monitoring)."
      • addedInput schema / properties / detail / description
        Added value: +"When true, returns full metadata for a single resource. When false (default), returns a summary."
      • addedInput schema / properties / filters / description
        Added value: +"Optional JSON-encoded filter object passed through to the underlying GCP API. Examples: '{\"hours\":6}' for metric windows, '{\"zone\":\"us-central1-a\"}' for zone-scoped queries."
      • addedInput schema / properties / raw / description
        Added value: +"When true, returns the unprocessed GCP API response. Escape hatch for fields the summarized response doesn't surface."
      • addedInput schema / properties / service / description
        Added value: +"GCP service to query. Examples: 'compute', 'storage', 'cloudsql', 'gke', 'cloudrun', 'pubsub', 'firestore'. Use action='list-actions' to discover supported actions for a service."
      • addedInput schema / properties / service / enum
        Added value: +[
        +  "apigateway",
        +  "bastion",
        +  "billing",
        +  "cloudarmor",
        +  "cloudbuild",
        +  "cloudcdn",
        +  "cloudfunctions",
        +  "cloudkms",
        +  "cloudlogging",
        +  "cloudmonitoring",
        +  "cloudrun",
        +  "cloudsql",
        +  "compute",
        +  "firestore",
        +  "gcs",
        +  "gke",
        +  "identityplatform",
        +  "loadbalancer",
        +  "memorystore",
        +  "pubsub",
        +  "secretmanager",
        +  "vertexai",
        +  "vpc"
        +]
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have a GCP deploy attempt before inspect probes will succeed."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedgcpinspect_batch9 fields changed
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The session must have a GCP deploy attempt before inspect probes will succeed."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / subs / description
        Added value: +"Up to 32 sub-probes, each with {service, action, filters?, detail?, raw?}. The backend fetches credentials once per batch and fans out probes in parallel (concurrency 8, 30s per-sub timeout, 60s total wall clock). Partial failure is expected — inspect each result.ok independently."
      • addedInput schema / properties / subs / items / properties / action / description
        Added value: +"Operation on the service (e.g. 'describe-instances', 'list-buckets', 'list-actions' for discovery, 'list-metrics' / 'get-metrics' for time-series)."
      • addedInput schema / properties / subs / items / properties / filters / description
        Added value: +"Optional JSON-encoded filter object passed through to the underlying API. Examples: '{\"hours\":6}' for metric windows, '{\"days\":7}' for cost queries."
      • addedInput schema / properties / subs / items / properties / service / description
        Added value: +"Cloud service to query (e.g. 'ec2', 'rds', 's3' for AWS; 'compute', 'storage', 'cloudsql' for GCP). Use the singular awsinspect/gcpinspect tool with action='list-actions' to discover supported services."
      • addedInput schema / properties / subs / items / properties / service / enum
        Added value: +[
        +  "apigateway",
        +  "bastion",
        +  "billing",
        +  "cloudarmor",
        +  "cloudbuild",
        +  "cloudcdn",
        +  "cloudfunctions",
        +  "cloudkms",
        +  "cloudlogging",
        +  "cloudmonitoring",
        +  "cloudrun",
        +  "cloudsql",
        +  "compute",
        +  "firestore",
        +  "gcs",
        +  "gke",
        +  "identityplatform",
        +  "loadbalancer",
        +  "memorystore",
        +  "pubsub",
        +  "secretmanager",
        +  "vertexai",
        +  "vpc"
        +]
      • addedInput schema / properties / subs / maxItems
        Added value: +32
      • addedInput schema / properties / subs / minItems
        Added value: +1
    • Changedhelp2 fields changed
      • addedInput schema / properties / section / description
        Added value: +"Optional section to focus the response. One of: 'workflow', 'tools', 'examples', 'inspect'. When omitted, returns a compact overview (~500 tokens)."
      • addedInput schema / properties / section / enum
        Added value: +[
        +  "workflow",
        +  "tools",
        +  "examples",
        +  "inspect"
        +]
    • Changedstackdiff4 fields changed
      • addedInput schema / properties / from_version / description
        Added value: +"Starting stack version number for the diff. Defaults to the latest applied version."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / to_version / description
        Added value: +"Ending stack version number for the diff. Defaults to the current draft."
    • Changedstackrollback3 fields changed
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / version / description
        Added value: +"Target stack version number to roll back to. Use stackversions to list available versions."
    • Changedstackversions2 fields changed
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedsubmit_feedback14 fields changed
      • addedInput schema / properties / category / description
        Added value: +"Feedback category. One of: bug_report, feature_request, general_feedback, question."
      • addedInput schema / properties / category / enum
        Added value: +[
        +  "bug_report",
        +  "feature_request",
        +  "general_feedback",
        +  "question"
        +]
      • addedInput schema / properties / initiator / description
        Added value: +"Optional originator: 'user' (human triggered) or 'agent' (automated)."
      • addedInput schema / properties / initiator / enum
        Added value: +[
        +  "user",
        +  "agent"
        +]
      • addedInput schema / properties / message / description
        Added value: +"Feedback content. Free-form text describing the issue, request, or comment."
      • addedInput schema / properties / message / maxLength
        Added value: +10000
      • addedInput schema / properties / message / minLength
        Added value: +1
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. Identifies the conversation the feedback is about."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / source / description
        Added value: +"Optional source channel: 'mcp', 'cli', or 'web'."
      • addedInput schema / properties / source / enum
        Added value: +[
        +  "mcp",
        +  "cli",
        +  "web"
        +]
      • addedInput schema / properties / user_email / description
        Added value: +"Optional email address for follow-up."
      • addedInput schema / properties / user_email / format
        Added value: +"email"
      • addedInput schema / properties / user_name / description
        Added value: +"Optional display name for attribution."
    • Changedtfdeploy8 fields changed
      • addedInput schema / properties / force_new / description
        Added value: +"When true, bypass the session-level single-flight guard and start a new deploy even if another job is in flight. Use only when an existing run is provably wedged."
      • addedInput schema / properties / ignore_drift / description
        Added value: +"When true, proceed with deploy even if drift is detected on the existing stack."
      • addedInput schema / properties / plan_id / description
        Added value: +"Apply a previously created plan from tfplan. When set, project_id should also be provided."
      • addedInput schema / properties / project_id / description
        Added value: +"Project ID returned by tfplan. Required alongside plan_id."
      • addedInput schema / properties / sandbox / description
        Added value: +"When true (default for MCP), deploys a small sandbox stack instead of the real generated Terraform. Set false to deploy the actual user stack."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / version / description
        Added value: +"Deploy a specific stack version number. Defaults to the current draft."
    • Changedtfdestroy3 fields changed
      • addedInput schema / properties / force_new / description
        Added value: +"When true, bypass the single-flight guard and force a new destroy even if another job is in flight."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. The deployed stack for this session will be torn down."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedtfdrift3 fields changed
      • addedInput schema / properties / force_new / description
        Added value: +"When true, bypass the single-flight guard and force a new drift check even if another job is in flight."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedtfgenerate3 fields changed
      • addedInput schema / properties / include_code / description
        Added value: +"When true, the response inlines the full generated Terraform source. Use as a fallback when the host can't read the on-disk archive (sandbox or security restrictions)."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. Riley must have signaled [TERRAFORM_READY: true] before calling this tool."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedtflogs10 fields changed
      • addedInput schema / properties / job_id / description
        Added value: +"Optional. Target a specific job. Use tfruns to discover job IDs. When omitted, streams the latest job for the session."
      • addedInput schema / properties / last_event_id / description
        Added value: +"Resume cursor for pagination. Pass back the last_event_id from a previous tflogs response to fetch only newer entries."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
      • addedInput schema / properties / tail / description
        Added value: +"Return only the last N log entries. Use 0 (or omit) for all available entries."
      • addedInput schema / properties / tail / maximum
        Added value: +10000
      • addedInput schema / properties / tail / minimum
        Added value: +0
      • addedInput schema / properties / timeout / description
        Added value: +"Max seconds to collect logs. Default 50, max 55."
      • addedInput schema / properties / timeout / maximum
        Added value: +55
      • addedInput schema / properties / timeout / minimum
        Added value: +1
    • Changedtfoutputs4 fields changed
      • addedInput schema / properties / job_id / description
        Added value: +"Optional. Specific job ID to fetch outputs from. When omitted, returns outputs from the latest successful apply."
      • addedInput schema / properties / lifecycle / description
        Added value: +"Optional Oracle deploy-step filter for the outputs. Common values are 'provision', 'cloud-provision', 'k8s-provision' — these correspond to the lifecycle stages of the deployed stack. When omitted, returns outputs from all lifecycle steps."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedtfplan4 fields changed
      • addedInput schema / properties / force_new / description
        Added value: +"When true, bypass the single-flight guard and force a new plan even if one is already running."
      • addedInput schema / properties / sandbox / description
        Added value: +"When true, plan against the sandbox stack; when false (default), plan the real generated Terraform."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedtfruns2 fields changed
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing. Returns the deployment-job history (apply / destroy / plan / drift) for this session."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
    • Changedtfstatus3 fields changed
      • addedInput schema / properties / job_id / description
        Added value: +"Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session."
      • addedInput schema / properties / session_id / description
        Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
      • addedInput schema / properties / session_id / pattern
        Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
  5. 24 tool updates
    • First observedawsinspect
    • First observedawsinspect_batch
    • First observedconvoawait
    • First observedconvoinspect
    • First observedconvoopen
    • First observedconvoreply
    • First observedconvostatus
    • First observedcredawait
    • First observedgcpinspect
    • First observedgcpinspect_batch
    • First observedhelp
    • First observedstackdiff
    • First observedstackrollback
    • First observedstackversions
    • First observedsubmit_feedback
    • First observedtfdeploy
    • First observedtfdestroy
    • First observedtfdrift
    • First observedtfgenerate
    • First observedtflogs
    • First observedtfoutputs
    • First observedtfplan
    • First observedtfruns
    • First observedtfstatus

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    23 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources