InsideOut (Riley)
Server Details
AI infrastructure design agent. Describe your app in plain English; Riley designs, prices, and deploys AWS or GCP infrastructure with generated Terraform.
- Status
- Healthy
- Uptime
- 100.0% over 80 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 24 tools
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.
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.
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.
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 toolsawsinspectInspect AWS InfrastructureARead-onlyInspect
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)
| Name | Required | Description | Default |
|---|---|---|---|
| raw | Yes | When true, returns the unprocessed AWS API response. Escape hatch for fields the summarized response doesn't surface. | |
| action | Yes | 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). | |
| detail | Yes | When true, returns full metadata for a single resource (requires a resource ID in filters). When false (default), returns a summary. | |
| filters | Yes | 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. | |
| service | Yes | 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. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| result | No | 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 | No | True when result is a compact summary instead of the full backend response. |
TDQS
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.
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.
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.
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.
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.
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 InfrastructureARead-onlyInspect
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}"}])
| Name | Required | Description | Default |
|---|---|---|---|
| subs | Yes | 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. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| results | No | One entry per sub-request, in request order. |
| truncated_at | No | Index of the first sub-request whose result was dropped for size. |
| truncated_cap_bytes | No | Response size cap, in bytes, that caused the truncation. |
TDQS
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.
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.
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.
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.
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.
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 ResponseARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Max seconds to wait. Default 50, max 55. | |
| message_id | No | Optional message ID from a convoreply timeout error. Not required for normal turn-based flow. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| source | No | How the reply was found when it did not come from the pending convoreply call: 'poll' or 'targeted_poll'. |
| status | No | Outcome of the call: 'ok' (Riley replied), 'timeout' (still working; call convoawait), or 'pending_exists' (an earlier reply is still pending; call convoawait). |
| message_id | No | ID of Riley's reply message. |
| session_id | No | Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools. |
| instruction | No | Plain-language instruction for the agent when the reply is not ready yet. |
| next_action | No | Tool to call next when the reply is not ready yet (for example 'convoawait'). |
| terraform_ready | No | True when Riley signalled that the design is final and tfgenerate can be called. |
| assistant_message | No | Riley's reply, cleaned of internal markers. Show it to the user. |
TDQS
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.
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.
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.
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.
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.
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 TranscriptARead-onlyInspect
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_...).
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Session ID (without the token suffix). |
| meta | No | Session metadata from the backend (stack, deploy and credential state). |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| messages | No | Conversation transcript, oldest first. System rows are removed. |
| createdAt | No | Session creation time as a Unix timestamp in milliseconds. |
| updatedAt | No | Last update time as a Unix timestamp in milliseconds. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | 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'. | |
| github_username | No | GitHub username used for deploy commit attribution; pre-fills the GitHub username field on the connect screen. | |
| project_context | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| session_id | No | Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools. |
| assistant_message | No | Riley's reply, cleaned of internal markers. Show it to the user. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | User message to send to Riley. Forward verbatim what the user said — do not summarize or rewrite. | |
| retry | No | When true, re-send the most recent user turn instead of submitting a new one. | |
| timeout | No | Max seconds to wait for Riley's response. Default 50, max 55. | |
| session_id | Yes | 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. | |
| project_context | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| status | No | Outcome of the call: 'ok' (Riley replied), 'timeout' (still working; call convoawait), or 'pending_exists' (an earlier reply is still pending; call convoawait). |
| message_id | No | ID of Riley's reply message. |
| session_id | No | Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools. |
| instruction | No | Plain-language instruction for the agent when the reply is not ready yet. |
| next_action | No | Tool to call next when the reply is not ready yet (for example 'convoawait'). |
| terraform_ready | No | True when Riley signalled that the design is final and tfgenerate can be called. |
| assistant_message | No | Riley's reply, cleaned of internal markers. Show it to the user. |
TDQS
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.
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.
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.
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.
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.
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 StatusARead-onlyInspect
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_...).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| config | No | Configuration of each selected component. |
| persona | No | What InsideOut knows about the user and their target cloud. |
| pricing | No | Cost estimate details per component. |
| hasConfig | No | True when the stack configuration is complete. |
| components | No | Selected stack components, keyed by component. |
| hasPricing | No | True when a cost estimate exists. |
| session_id | No | Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools. |
| versioning | No | Stack version state, when the backend tracks versions. |
| hasFeatures | No | True when the session has selected features. |
| hasAnyConfig | No | True when any component has configuration. |
| hasSelection | No | True when the session has selected stack components. |
| hasTerraform | No | True when Terraform has been generated (tfgenerate). |
| hasDeployment | No | True when the stack is deployed. |
| session_source | No | IDE or tool that opened the session (for example 'claude-code'). |
| hasDeployAttempt | No | True when a deploy has been started at least once. |
| hasCloudConnection | No | True when cloud credentials are connected to the session. |
| cloudConnectionInfo | No | Cloud credential status from the backend (has_credentials, expired, cloud, auth_method, account or project ID, ...). |
| grandTotalMonthlyUSD | No | Estimated total monthly cost in US dollars, or null when there is no estimate. |
TDQS
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.
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.
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.
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.
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.
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 CredentialsAIdempotentInspect
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:
Connect their cloud credentials (AWS or GCP)
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:
FIRST: Present the connect URL and explanation to the user (from the tfdeploy error response)
THEN: Call this tool to begin polling for credentials
The user opens the URL in their browser to subscribe and add credentials
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).
| Name | Required | Description | Default |
|---|---|---|---|
| cloud | No | Cloud provider whose credentials are awaited: 'aws' or 'gcp'. Defaults to 'aws'. | |
| timeout | No | Max seconds to wait for the user to complete the browser-based credential connect flow. Default 300, max 600. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cloud | No | Cloud provider: 'aws' or 'gcp'. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| status | No | 'connected' when credentials were found, or 'timeout' when the wait ended first (call credawait again). |
| session_id | No | Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools. |
| auth_method | No | How the credentials were connected, when status is 'connected'. |
| connect_url | No | URL the user opens to connect credentials, when status is 'timeout'. |
TDQS
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.
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.
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.
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.
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.
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 InfrastructureARead-onlyInspect
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")
| Name | Required | Description | Default |
|---|---|---|---|
| raw | Yes | When true, returns the unprocessed GCP API response. Escape hatch for fields the summarized response doesn't surface. | |
| action | Yes | Operation on the service. Examples: 'list-instances' (compute), 'list-buckets' (storage), 'list-clusters' (gke), 'list-actions' (discovery), 'list-metrics' / 'get-metrics' (Cloud Monitoring). | |
| detail | Yes | When true, returns full metadata for a single resource. When false (default), returns a summary. | |
| filters | Yes | 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. | |
| service | Yes | GCP service to query. Examples: 'compute', 'storage', 'cloudsql', 'gke', 'cloudrun', 'pubsub', 'firestore'. Use action='list-actions' to discover supported actions for a service. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| result | No | 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 | No | True when result is a compact summary instead of the full backend response. |
TDQS
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.
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.
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.
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.
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.
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 InfrastructureARead-onlyInspect
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}"}])
| Name | Required | Description | Default |
|---|---|---|---|
| subs | Yes | 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. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| results | No | One entry per sub-request, in request order. |
| truncated_at | No | Index of the first sub-request whose result was dropped for size. |
| truncated_cap_bytes | No | Response size cap, in bytes, that caused the truncation. |
TDQS
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.
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.
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.
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.
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.
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 GuideARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Optional section to focus the response. One of: 'workflow', 'tools', 'examples', 'inspect'. When omitted, returns a compact overview (~500 tokens). |
Output Schema
| Name | Required | Description |
|---|---|---|
| dirty | No | True when the server was built from a modified tree. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| section | No | Guide section returned, when help(section=...) was called. |
| version | No | Server version. |
| base_url | No | InsideOut backend URL the server talks to. |
| transport | No | MCP transport in use (for example 'stdio' or 'http'). |
| build_time | No | Server build time. |
| git_commit | No | Git commit the server was built from. |
TDQS
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.
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.
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.
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.
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.
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 VersionsARead-onlyInspect
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_...).
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 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. | |
| to_version | No | Ending stack version number for the diff. Defaults to the current draft. | |
| from_version | No | Starting stack version number for the diff. Defaults to the latest applied version. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| summary | No | Summary of the differences. |
| components | No | Changed components, each with key, change and per-field from/to values. |
| to_version | No | Version number the diff ends at. |
| from_version | No | Version number the diff starts from. |
| pricing_delta | No | Monthly cost before and after (from_total, to_total). |
TDQS
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.
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.
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.
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.
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.
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 VersionAIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Target stack version number to roll back to. Use stackversions to list available versions. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| version | No | The stack version the session now points to (version, status). |
TDQS
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.
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.
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.
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.
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.
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 VersionsARead-onlyInspect
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_...).
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| versions | No | Stack versions, each with version, status, change_summary and created_at. |
TDQS
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.
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.
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.
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.
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.
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')
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | Optional source channel: 'mcp', 'cli', or 'web'. | |
| message | Yes | Feedback content. Free-form text describing the issue, request, or comment. | |
| category | Yes | Feedback category. One of: bug_report, feature_request, general_feedback, question. | |
| initiator | No | Optional originator: 'user' (human triggered) or 'agent' (automated). | |
| user_name | No | Optional display name for attribution. | |
| session_id | Yes | 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. | |
| user_email | No | Optional email address for follow-up. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | True when the feedback was delivered to Luther Systems. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| message | No | Confirmation text to show the user. |
| session_id | No | Session ID this result belongs to (format sess_v2_*?token=*). Pass it back verbatim to later tools. |
TDQS
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.
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.
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.
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.
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.
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 InfrastructureADestructiveInspect
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):
Response includes a connect_url — present it to the user
Call credawait(session_id=...) to poll for credentials
When credawait returns success, retry tfdeploy Do NOT call credawait without first showing the connect URL to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | Apply a previously created plan from tfplan. When set, project_id should also be provided. | |
| sandbox | No | When true (default for MCP), deploys a small sandbox stack instead of the real generated Terraform. Set false to deploy the actual user stack. | |
| version | No | Deploy a specific stack version number. Defaults to the current draft. | |
| force_new | No | 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. | |
| project_id | No | Project ID returned by tfplan. Required alongside plan_id. | |
| session_id | Yes | 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. | |
| ignore_drift | No | When true, proceed with deploy even if drift is detected on the existing stack. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| job_id | No | ID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one. |
| success | No | True when the deploy job was started. |
TDQS
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.
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.
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.
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.
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.
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 InfrastructureADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| force_new | No | When true, bypass the single-flight guard and force a new destroy even if another job is in flight. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| job_id | No | ID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one. |
| success | No | True when the destroy job was started. |
TDQS
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.
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.
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.
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.
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.
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 DriftAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| force_new | No | When true, bypass the single-flight guard and force a new drift check even if another job is in flight. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| job_id | No | ID of the started job. Pass it to tfstatus or tflogs to follow progress. May be empty when the backend did not return one. |
| success | No | True when the drift check job was started. |
TDQS
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.
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.
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.
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.
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.
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 TerraformAIdempotentInspect
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):
Call this tool to get file summary and download URL
ASK the user: 'Where would you like me to save the Terraform files? Default: ./insideout-infra/'
WAIT for user confirmation before running the download command
Run the curl/unzip command with the user's chosen directory
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.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 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. | |
| include_code | No | 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | No | Number of generated Terraform files. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| inline | No | True when the source is inlined in the result (include_code=true) instead of offered as a download. |
| success | No | True when the Terraform was generated. |
| download_url | No | URL of the archive with the generated Terraform. |
TDQS
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.
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.
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.
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.
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.
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 LogsARead-onlyInspect
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:
First call:
tflogs(session_id='...')→ get logs +last_event_idNext call:
tflogs(session_id='...', last_event_id='...')→ get NEW logs onlyRepeat until
complete: truein response
RESPONSE FIELDS:
logs: Array of log messages collectedlast_event_id: Pass this back to get more logs (pagination cursor, SSE only)complete: true if job finished, false if more logs may be availabletotal_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.
| Name | Required | Description | Default |
|---|---|---|---|
| tail | No | Return only the last N log entries. Use 0 (or omit) for all available entries. | |
| job_id | No | Optional. Target a specific job. Use tfruns to discover job IDs. When omitted, streams the latest job for the session. | |
| timeout | No | Max seconds to collect logs. Default 50, max 55. | |
| session_id | Yes | 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. | |
| last_event_id | No | Resume cursor for pagination. Pass back the last_event_id from a previous tflogs response to fetch only newer entries. |
Output Schema
| Name | Required | Description |
|---|---|---|
| logs | No | Log lines, oldest first. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| complete | No | True when the job has finished and no more logs will come. |
| logs_count | No | Number of log lines in this result. |
| session_id | No | Session ID these logs belong to. |
| last_event_id | No | Log cursor. Pass it back as last_event_id to fetch only newer entries. |
TDQS
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.
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.
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.
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.
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.
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 OutputsARead-onlyInspect
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').
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | Optional. Specific job ID to fetch outputs from. When omitted, returns outputs from the latest successful apply. | |
| lifecycle | No | 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. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Why no outputs were found, when found is false. |
| found | No | False when no successful deploy with outputs was found. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| job_id | No | ID of the deploy job the outputs come from. |
| source | No | Where the outputs were read from. |
| session_id | No | Session ID these outputs belong to. |
| step_outputs | No | Terraform outputs, one entry per deploy lifecycle step. |
TDQS
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.
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.
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.
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.
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.
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 PlanAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sandbox | No | When true, plan against the sandbox stack; when false (default), plan the real generated Terraform. | |
| force_new | No | When true, bypass the single-flight guard and force a new plan even if one is already running. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| job_id | No | ID of the plan job. Follow it with tfstatus. |
| plan_id | No | Plan ID. Pass it to tfdeploy (with project_id) to apply exactly this plan. |
| success | No | True when the plan job was started. |
| project_id | No | Project ID that goes with plan_id on tfdeploy. |
TDQS
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.
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.
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.
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.
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.
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 RunsARead-onlyInspect
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_...).
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | No | Deploy job history, newest first. |
| count | No | Number of runs the backend reported. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| session_id | No | Session ID these runs belong to. |
TDQS
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.
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.
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.
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.
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.
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 StatusARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session. | |
| session_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | No | False when the session has no job yet. |
| hints | No | Guidance for the calling agent: what to do next and which tools relate to this result. |
| job_id | No | ID of the job reported on. |
| status | No | Job status, for example 'pending', 'running', 'succeeded' or 'failed'. |
| job_key | No | Job type key (for example 'apply', 'destroy', 'plan', 'drift'). |
| created_at | No | Job creation time (RFC 3339). |
| session_id | No | Session ID this status belongs to. |
| updated_at | No | Time of the job's last status change (RFC 3339). |
| version_id | No | ID of the stack version the job ran. |
| plan_summary | No | Summary of the Terraform plan, for plan and drift jobs. |
| draft_version | No | Draft stack version number, when a draft exists. |
| last_event_id | No | Log cursor. Pass it to tflogs to fetch only newer entries. |
| drift_detected | No | True when a drift check found differences from the deployed state. |
| version_number | No | Number of the stack version the job ran. |
| version_status | No | Status of that stack version. |
| current_version | No | Latest committed stack version number. |
| last_refresh_at | No | Time the backend last polled the deploy runner for this job (RFC 3339). |
| presets_version | No | Terraform presets version the runner used. |
| drift_actionable | No | True when the drift would make Terraform apply changes; false when it is refresh-only noise. |
| template_version | No | Infrastructure template version the runner used. |
| has_pending_changes | No | True when the draft stack differs from the deployed version. |
| drift_classification | No | Per-resource drift verdicts, when the drift check could classify them. |
| custom_presets_version | No | Terraform presets version InsideOut composed the stack with. |
| custom_template_version | No | Infrastructure template version InsideOut composed the stack with. |
TDQS
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.
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.
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.
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.
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.
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.
24 tool updates
- Changed
awsinspect1 field changed- changed
Output 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" +}
- Changed
awsinspect_batch1 field changed- changed
Output 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" +}
- Changed
convoawait1 field changed- changed
Output 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" +}
- Changed
convoinspect1 field changed- changed
Output 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" +}
- Changed
convoopen1 field changed- changed
Output 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" +}
- Changed
convoreply1 field changed- changed
Output 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" +}
- Changed
convostatus1 field changed- changed
Output 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" +}
- Changed
credawait1 field changed- changed
Output 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" +}
- Changed
gcpinspect1 field changed- changed
Output 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" +}
- Changed
gcpinspect_batch1 field changed- changed
Output 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" +}
- Changed
help1 field changed- changed
Output 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" +}
- Changed
stackdiff1 field changed- changed
Output 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" +}
- Changed
stackrollback1 field changed- changed
Output 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" +}
- Changed
stackversions1 field changed- changed
Output 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" +}
- Changed
submit_feedback1 field changed- changed
Output 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" +}
- Changed
tfdeploy1 field changed- changed
Output 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" +}
- Changed
tfdestroy1 field changed- changed
Output 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" +}
- Changed
tfdrift1 field changed- changed
Output 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" +}
- Changed
tfgenerate1 field changed- changed
Output 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" +}
- Changed
tflogs1 field changed- changed
Output 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" +}
- Changed
tfoutputs1 field changed- changed
Output 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" +}
- Changed
tfplan1 field changed- changed
Output 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" +}
- Changed
tfruns1 field changed- changed
Output 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" +}
- Changed
tfstatus1 field changed- changed
Output 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" +}
4 tool updates
- Changed
awsinspect1 field changed- changed
Input schema / properties / service / enumPrevious 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" +]
- Changed
awsinspect_batch1 field changed- changed
Input schema / properties / subs / items / properties / service / enumPrevious 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" +]
- Changed
gcpinspect1 field changed- changed
Input schema / properties / service / enumPrevious 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" +]
- Changed
gcpinspect_batch1 field changed- changed
Input schema / properties / subs / items / properties / service / enumPrevious 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" +]
1 tool update
- Changed
convoreply1 field changed- removed
Input schema / properties / auto_acceptRemoved 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" - ] -}
24 tool updates
- Changed
awsinspect8 fields changed- added
Input schema / properties / action / descriptionAdded 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)." - added
Input schema / properties / detail / descriptionAdded value: +"When true, returns full metadata for a single resource (requires a resource ID in filters). When false (default), returns a summary." - added
Input schema / properties / filters / descriptionAdded 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." - added
Input schema / properties / raw / descriptionAdded value: +"When true, returns the unprocessed AWS API response. Escape hatch for fields the summarized response doesn't surface." - added
Input schema / properties / service / descriptionAdded 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." - added
Input schema / properties / service / enumAdded 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" +] - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
awsinspect_batch9 fields changed- added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / subs / descriptionAdded 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." - added
Input schema / properties / subs / items / properties / action / descriptionAdded value: +"Operation on the service (e.g. 'describe-instances', 'list-buckets', 'list-actions' for discovery, 'list-metrics' / 'get-metrics' for time-series)." - added
Input schema / properties / subs / items / properties / filters / descriptionAdded value: +"Optional JSON-encoded filter object passed through to the underlying API. Examples: '{\"hours\":6}' for metric windows, '{\"days\":7}' for cost queries." - added
Input schema / properties / subs / items / properties / service / descriptionAdded 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." - added
Input schema / properties / subs / items / properties / service / enumAdded 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" +] - added
Input schema / properties / subs / maxItemsAdded value: +32 - added
Input schema / properties / subs / minItemsAdded value: +1
- Changed
convoawait6 fields changed- added
Input schema / properties / message_id / descriptionAdded value: +"Optional message ID from a convoreply timeout error. Not required for normal turn-based flow." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / timeout / descriptionAdded value: +"Max seconds to wait. Default 50, max 55." - added
Input schema / properties / timeout / maximumAdded value: +55 - added
Input schema / properties / timeout / minimumAdded value: +1
- Changed
convoinspect2 fields changed- added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
convoopen3 fields changed- added
Input schema / properties / github_username / descriptionAdded value: +"GitHub username used for deploy commit attribution; pre-fills the GitHub username field on the connect screen." - added
Input schema / properties / project_context / descriptionAdded 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." - added
Input schema / properties / source / descriptionAdded 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'."
- Changed
convoreply11 fields changed- added
Input schema / properties / auto_accept / descriptionAdded 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." - added
Input schema / properties / project_context / descriptionAdded 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." - added
Input schema / properties / retry / descriptionAdded value: +"When true, re-send the most recent user turn instead of submitting a new one." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / text / descriptionAdded value: +"User message to send to Riley. Forward verbatim what the user said — do not summarize or rewrite." - added
Input schema / properties / text / maxLengthAdded value: +20000 - added
Input schema / properties / text / minLengthAdded value: +1 - added
Input schema / properties / timeout / descriptionAdded value: +"Max seconds to wait for Riley's response. Default 50, max 55." - added
Input schema / properties / timeout / maximumAdded value: +55 - added
Input schema / properties / timeout / minimumAdded value: +1
- Changed
convostatus4 fields changed- removed
Input schema / properties / include_codeRemoved value: -{ - "type": [ - "null", - "boolean" - ] -} - added
Input schema / properties / job_idAdded value: +{ + "description": "Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session.", + "type": "string" +} - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
credawait7 fields changed- added
Input schema / properties / cloud / descriptionAdded value: +"Cloud provider whose credentials are awaited: 'aws' or 'gcp'. Defaults to 'aws'." - added
Input schema / properties / cloud / enumAdded value: +[ + "aws", + "gcp" +] - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / timeout / descriptionAdded value: +"Max seconds to wait for the user to complete the browser-based credential connect flow. Default 300, max 600." - added
Input schema / properties / timeout / maximumAdded value: +600 - added
Input schema / properties / timeout / minimumAdded value: +1
- Changed
gcpinspect8 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Operation on the service. Examples: 'list-instances' (compute), 'list-buckets' (storage), 'list-clusters' (gke), 'list-actions' (discovery), 'list-metrics' / 'get-metrics' (Cloud Monitoring)." - added
Input schema / properties / detail / descriptionAdded value: +"When true, returns full metadata for a single resource. When false (default), returns a summary." - added
Input schema / properties / filters / descriptionAdded 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." - added
Input schema / properties / raw / descriptionAdded value: +"When true, returns the unprocessed GCP API response. Escape hatch for fields the summarized response doesn't surface." - added
Input schema / properties / service / descriptionAdded value: +"GCP service to query. Examples: 'compute', 'storage', 'cloudsql', 'gke', 'cloudrun', 'pubsub', 'firestore'. Use action='list-actions' to discover supported actions for a service." - added
Input schema / properties / service / enumAdded value: +[ + "apigateway", + "bastion", + "billing", + "cloudarmor", + "cloudbuild", + "cloudcdn", + "cloudfunctions", + "cloudkms", + "cloudlogging", + "cloudmonitoring", + "cloudrun", + "cloudsql", + "compute", + "firestore", + "gcs", + "gke", + "identityplatform", + "loadbalancer", + "memorystore", + "pubsub", + "secretmanager", + "vertexai", + "vpc" +] - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
gcpinspect_batch9 fields changed- added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / subs / descriptionAdded 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." - added
Input schema / properties / subs / items / properties / action / descriptionAdded value: +"Operation on the service (e.g. 'describe-instances', 'list-buckets', 'list-actions' for discovery, 'list-metrics' / 'get-metrics' for time-series)." - added
Input schema / properties / subs / items / properties / filters / descriptionAdded value: +"Optional JSON-encoded filter object passed through to the underlying API. Examples: '{\"hours\":6}' for metric windows, '{\"days\":7}' for cost queries." - added
Input schema / properties / subs / items / properties / service / descriptionAdded 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." - added
Input schema / properties / subs / items / properties / service / enumAdded value: +[ + "apigateway", + "bastion", + "billing", + "cloudarmor", + "cloudbuild", + "cloudcdn", + "cloudfunctions", + "cloudkms", + "cloudlogging", + "cloudmonitoring", + "cloudrun", + "cloudsql", + "compute", + "firestore", + "gcs", + "gke", + "identityplatform", + "loadbalancer", + "memorystore", + "pubsub", + "secretmanager", + "vertexai", + "vpc" +] - added
Input schema / properties / subs / maxItemsAdded value: +32 - added
Input schema / properties / subs / minItemsAdded value: +1
- Changed
help2 fields changed- added
Input schema / properties / section / descriptionAdded value: +"Optional section to focus the response. One of: 'workflow', 'tools', 'examples', 'inspect'. When omitted, returns a compact overview (~500 tokens)." - added
Input schema / properties / section / enumAdded value: +[ + "workflow", + "tools", + "examples", + "inspect" +]
- Changed
stackdiff4 fields changed- added
Input schema / properties / from_version / descriptionAdded value: +"Starting stack version number for the diff. Defaults to the latest applied version." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / to_version / descriptionAdded value: +"Ending stack version number for the diff. Defaults to the current draft."
- Changed
stackrollback3 fields changed- added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / version / descriptionAdded value: +"Target stack version number to roll back to. Use stackversions to list available versions."
- Changed
stackversions2 fields changed- added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
submit_feedback14 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Feedback category. One of: bug_report, feature_request, general_feedback, question." - added
Input schema / properties / category / enumAdded value: +[ + "bug_report", + "feature_request", + "general_feedback", + "question" +] - added
Input schema / properties / initiator / descriptionAdded value: +"Optional originator: 'user' (human triggered) or 'agent' (automated)." - added
Input schema / properties / initiator / enumAdded value: +[ + "user", + "agent" +] - added
Input schema / properties / message / descriptionAdded value: +"Feedback content. Free-form text describing the issue, request, or comment." - added
Input schema / properties / message / maxLengthAdded value: +10000 - added
Input schema / properties / message / minLengthAdded value: +1 - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / source / descriptionAdded value: +"Optional source channel: 'mcp', 'cli', or 'web'." - added
Input schema / properties / source / enumAdded value: +[ + "mcp", + "cli", + "web" +] - added
Input schema / properties / user_email / descriptionAdded value: +"Optional email address for follow-up." - added
Input schema / properties / user_email / formatAdded value: +"email" - added
Input schema / properties / user_name / descriptionAdded value: +"Optional display name for attribution."
- Changed
tfdeploy8 fields changed- added
Input schema / properties / force_new / descriptionAdded 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." - added
Input schema / properties / ignore_drift / descriptionAdded value: +"When true, proceed with deploy even if drift is detected on the existing stack." - added
Input schema / properties / plan_id / descriptionAdded value: +"Apply a previously created plan from tfplan. When set, project_id should also be provided." - added
Input schema / properties / project_id / descriptionAdded value: +"Project ID returned by tfplan. Required alongside plan_id." - added
Input schema / properties / sandbox / descriptionAdded 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." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / version / descriptionAdded value: +"Deploy a specific stack version number. Defaults to the current draft."
- Changed
tfdestroy3 fields changed- added
Input schema / properties / force_new / descriptionAdded value: +"When true, bypass the single-flight guard and force a new destroy even if another job is in flight." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
tfdrift3 fields changed- added
Input schema / properties / force_new / descriptionAdded value: +"When true, bypass the single-flight guard and force a new drift check even if another job is in flight." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
tfgenerate3 fields changed- added
Input schema / properties / include_code / descriptionAdded 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)." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
tflogs10 fields changed- added
Input schema / properties / job_id / descriptionAdded value: +"Optional. Target a specific job. Use tfruns to discover job IDs. When omitted, streams the latest job for the session." - added
Input schema / properties / last_event_id / descriptionAdded value: +"Resume cursor for pagination. Pass back the last_event_id from a previous tflogs response to fetch only newer entries." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$" - added
Input schema / properties / tail / descriptionAdded value: +"Return only the last N log entries. Use 0 (or omit) for all available entries." - added
Input schema / properties / tail / maximumAdded value: +10000 - added
Input schema / properties / tail / minimumAdded value: +0 - added
Input schema / properties / timeout / descriptionAdded value: +"Max seconds to collect logs. Default 50, max 55." - added
Input schema / properties / timeout / maximumAdded value: +55 - added
Input schema / properties / timeout / minimumAdded value: +1
- Changed
tfoutputs4 fields changed- added
Input schema / properties / job_id / descriptionAdded value: +"Optional. Specific job ID to fetch outputs from. When omitted, returns outputs from the latest successful apply." - added
Input schema / properties / lifecycle / descriptionAdded 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." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
tfplan4 fields changed- added
Input schema / properties / force_new / descriptionAdded value: +"When true, bypass the single-flight guard and force a new plan even if one is already running." - added
Input schema / properties / sandbox / descriptionAdded value: +"When true, plan against the sandbox stack; when false (default), plan the real generated Terraform." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
tfruns2 fields changed- added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
- Changed
tfstatus3 fields changed- added
Input schema / properties / job_id / descriptionAdded value: +"Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session." - added
Input schema / properties / session_id / descriptionAdded 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." - added
Input schema / properties / session_id / patternAdded value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
24 tool updates
- First observed
awsinspect - First observed
awsinspect_batch - First observed
convoawait - First observed
convoinspect - First observed
convoopen - First observed
convoreply - First observed
convostatus - First observed
credawait - First observed
gcpinspect - First observed
gcpinspect_batch - First observed
help - First observed
stackdiff - First observed
stackrollback - First observed
stackversions - First observed
submit_feedback - First observed
tfdeploy - First observed
tfdestroy - First observed
tfdrift - First observed
tfgenerate - First observed
tflogs - First observed
tfoutputs - First observed
tfplan - First observed
tfruns - First observed
tfstatus
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote 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
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs115 npm58 PyPIMIT
- AlicenseAqualityCmaintenanceEnables 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.1623 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.