Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,559Letters: 14Defects: 1,336counted just now
teppi

Server definition

Hash
sha256:580b4daa97a605c3610d08678af20096e60dc3e3c0e5cdfd6cd4fbd76aad23a6
What it is
What a remote MCP server returned when asked what it offers: 24 tools

The blob, as servednamed by its sha256

{ "instructions": null, "tools": [ { "description": "INSPECTION: Inspect AWS infrastructure for a deployed project\n⚠️ **PREREQUISITE**: This tool requires a prior deployment ATTEMPT (successful or failed).\nCheck convostatus for hasDeployAttempt=true before calling. Works even after failed deploys to inspect orphaned resources.\n\nInspect deployed AWS resources after a deployment attempt.\nUse this tool when the user asks about the status or details of their deployed infrastructure.\nIt fetches temporary read-only credentials securely and queries the AWS API directly.\n\nRESPONSE TIERS (default is summary for token efficiency):\n- Summary (default): Key fields only (~500 tokens). Set detail=false, raw=false or omit both.\n- Detail: Full metadata for a specific resource. Set detail=true + resource filter.\n- Raw: Complete unprocessed API response. Set raw=true.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nSupported 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\nFor a specific service's actions, call with action=\"list-actions\".\nMETRICS: 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}.\nBILLING: 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.\n\nEXAMPLES:\n- awsinspect(session_id=..., service=\"ec2\", action=\"describe-instances\")\n- awsinspect(session_id=..., service=\"cost-explorer\", action=\"get-cost-summary\")\n- awsinspect(session_id=..., service=\"ec2\", action=\"get-metrics\", filters=\"{\\\"hours\\\":6}\")\n- awsinspect(session_id=..., service=\"rds\", action=\"describe-db-instances\", detail=true)", "inputSchema": { "additionalProperties": false, "properties": { "action": { "description": "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).", "type": "string" }, "detail": { "description": "When true, returns full metadata for a single resource (requires a resource ID in filters). When false (default), returns a summary.", "type": "boolean" }, "filters": { "description": "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.", "type": "string" }, "raw": { "description": "When true, returns the unprocessed AWS API response. Escape hatch for fields the summarized response doesn't surface.", "type": "boolean" }, "service": { "description": "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.", "enum": [ "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" ], "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id", "service", "action", "filters", "detail", "raw" ], "type": "object" }, "name": "awsinspect", "outputSchema": null }, { "description": "BATCH INSPECTION: run up to 32 AWS inspect probes in one call.\n⚠️ **PREREQUISITE**: Same as awsinspect — deploy attempt required.\nCheck convostatus for hasDeployAttempt=true before calling.\n\nUse this when you need to check more than ~3 resources. The backend fetches\nOracle credentials ONCE per batch and fans out probes against a single AWS\nconfig — for a 12-resource health check this is ~5–8× faster and 12× fewer\nOracle round-trips than calling awsinspect 12 times.\n\nBUDGETS:\n- Up to 32 sub-probes per call (subs array length).\n- 30s per-sub timeout; 60s total batch wall-clock.\n- Concurrency cap 8 — sub-probes run in parallel but never saturate AWS.\n- 512 KB response cap: subs past the cap keep their envelope\n (index/service/action/ok) but have result replaced with truncated=true.\n\nPARTIAL FAILURE IS EXPECTED. The response is an ordered results array;\neach entry has {index, service, action, ok, result, error}. Inspect each\nresult — do NOT abort on the first error. A credential fetch failure\nleaves cred-less probes (list-actions, list-metrics) succeeding anyway.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nSupported 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\nFor a specific service's actions, use awsinspect (singular) with\naction=\"list-actions\" — batch is not the place for discovery.\nBatch responses are always summarized (no detail/raw per-sub); use\nsingular awsinspect when you need full metadata or raw API output for one\nresource.\n\nEXAMPLES:\n- awsinspect_batch(session_id=..., subs=[\n {\"service\":\"ec2\",\"action\":\"describe-instances\"},\n {\"service\":\"rds\",\"action\":\"describe-db-instances\"},\n {\"service\":\"vpc\",\"action\":\"describe-vpcs\"},\n {\"service\":\"s3\",\"action\":\"list-buckets\"}])\n- awsinspect_batch(session_id=..., subs=[\n {\"service\":\"ec2\",\"action\":\"get-metrics\",\"filters\":\"{\\\"hours\\\":6}\"},\n {\"service\":\"rds\",\"action\":\"get-metrics\",\"filters\":\"{\\\"hours\\\":6}\"}])", "inputSchema": { "additionalProperties": false, "properties": { "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "subs": { "description": "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.", "items": { "additionalProperties": false, "properties": { "action": { "description": "Operation on the service (e.g. 'describe-instances', 'list-buckets', 'list-actions' for discovery, 'list-metrics' / 'get-metrics' for time-series).", "type": "string" }, "filters": { "description": "Optional JSON-encoded filter object passed through to the underlying API. Examples: '{\"hours\":6}' for metric windows, '{\"days\":7}' for cost queries.", "type": "string" }, "service": { "description": "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.", "enum": [ "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" ], "type": "string" } }, "required": [ "service", "action" ], "type": "object" }, "maxItems": 32, "minItems": 1, "type": [ "null", "array" ] } }, "required": [ "session_id", "subs" ], "type": "object" }, "name": "awsinspect_batch", "outputSchema": null }, { "description": "Wait for a pending response from Riley after a convoreply timeout.\n\n🎯 USE THIS TOOL WHEN: convoreply returned a timeout error.\nThis allows you to continue waiting for the response without resending the message.\n\nREQUIRES:\n- session_id: from convoopen response\n\nOPTIONAL:\n- message_id: if known (from convoreply timeout error)\n- timeout (integer): seconds to wait. For Cursor, use 50 (default). Max 55.\n\nReturns the same format as convoreply when successful.", "inputSchema": { "additionalProperties": false, "properties": { "message_id": { "description": "Optional message ID from a convoreply timeout error. Not required for normal turn-based flow.", "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "timeout": { "description": "Max seconds to wait. Default 50, max 55.", "maximum": 55, "minimum": 1, "type": [ "null", "integer" ] } }, "required": [ "session_id" ], "type": "object" }, "name": "convoawait", "outputSchema": null }, { "description": "INSPECTION: View a session's conversation transcript and metadata\nReturns the full message history (user / assistant / tool turns) plus the session's meta — workflow step, cloud, deployment status, drift state.\n\nThis is the transcript-reader companion to the other read tools — combine it with:\n • `convostatus` for the live stack / config / pricing\n • `tfruns` for deployment history (apply / destroy / plan / drift)\n • `stackversions` for the stack-version ladder\n\nUse 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.\n\nREQUIRES: session_id (format: sess_v2_...).", "inputSchema": { "additionalProperties": false, "properties": { "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "convoinspect", "outputSchema": null }, { "description": "WORKFLOW: Step 1 of 4 - Start infrastructure design conversation\nOpen an InsideOut V2 session and receive the assistant's intro message.\nThe response contains a clean message from Riley (the infrastructure advisor) - display it to the user.\n⚠️ Riley will ask questions - forward these to the user, DO NOT answer on their behalf.\nCRITICAL: 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.).\n⚠️ 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.\nUse 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.\n\nOPTIONAL: 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.\nIMPORTANT: 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.\nOPTIONAL: github_username (string) - GitHub username for deploy commit attribution. Pre-populates the GitHub username field on the connect page.\n💡 TIP: Examine workflow.usage prompt for more context on how to properly use these tools.", "inputSchema": { "additionalProperties": false, "properties": { "github_username": { "description": "GitHub username used for deploy commit attribution; pre-fills the GitHub username field on the connect screen.", "type": "string" }, "project_context": { "description": "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.", "type": "string" }, "source": { "description": "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'.", "type": "string" } }, "type": "object" }, "name": "convoopen", "outputSchema": null }, { "description": "WORKFLOW: Step 2 of 4 - Continue infrastructure design conversation\nSend a user message to the active InsideOut session and receive the assistant reply.\nThe response contains a clean message from Riley - display it to the user.\n\n⚠️ 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.\nExamples of questions Riley asks that YOU MUST forward to the user:\n- 'Any questions or tweaks to these details?'\n- 'Ready for the cost estimate?'\n- 'Do you want to change the stack/config?'\n- 'Ready to proceed to Terraform?'\nWhen Riley asks ANY question, STOP and wait for the user's answer!\n\n📋 WORKFLOW PHASES: The typical flow is conversation → tfgenerate → tfdeploy\nWhen terraform_ready=true appears in THIS tool's response, THEN you can call tfgenerate.\n⚠️ DO NOT call tfgenerate until this tool returns! Wait for the response first.\n\n🎯 KEY SIGNALS IN RESPONSE:\n- `[TERRAFORM_READY: true]` → NOW you can call tfgenerate\n- `[[BUTTON_TF_APPLY: ...]]` → Deployment is ready! Ask user if they want to deploy, then use tfdeploy\n- `[[BUTTON_TF_DESTROY: ...]]` → User confirmed destroy intent! Ask user to confirm, then use tfdestroy\n- `[[BUTTON_TF_PLAN: ...]]` → User wants to preview changes! Use tfplan to run a plan, then tfdeploy with plan_id to apply\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: timeout (integer) - seconds to wait for response. For Cursor, use 50 (default). Max 55.\nOPTIONAL: 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.\n💡 TIP: Use convostatus to check progress anytime. Examine workflow.usage prompt for more guidance.", "inputSchema": { "additionalProperties": false, "properties": { "project_context": { "description": "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.", "type": "string" }, "retry": { "description": "When true, re-send the most recent user turn instead of submitting a new one.", "type": [ "null", "boolean" ] }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "text": { "description": "User message to send to Riley. Forward verbatim what the user said — do not summarize or rewrite.", "maxLength": 20000, "minLength": 1, "type": "string" }, "timeout": { "description": "Max seconds to wait for Riley's response. Default 50, max 55.", "maximum": 55, "minimum": 1, "type": [ "null", "integer" ] } }, "required": [ "session_id", "text" ], "type": "object" }, "name": "convoreply", "outputSchema": null }, { "description": "INSPECTION: View the current infrastructure stack for a session\nReturns the current state of the user's infrastructure design including:\n\n**Components** - Selected infrastructure services (VPC, databases, caching, etc.)\n • Shows what services the user has chosen (e.g., PostgreSQL, Redis, S3)\n • Includes architecture decisions (EKS vs EC2, monolith vs microservices)\n\n**Config** - Configuration details for each component\n • Database sizes, replica counts, storage amounts\n • Cache settings, queue configurations\n • Backup schedules and retention policies\n\n**Pricing** - Cost estimates (when available)\n • Monthly cost estimates per component\n • Total estimated monthly spend\n\n**Phase Indicators** - Where the user is in the design workflow:\n • hasComponents: User has selected infrastructure services\n • hasConfig: User has configured component details\n • hasPricing: Cost estimates have been calculated\n • hasTerraform: Ready for Terraform generation\n\nUse 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.\nREQUIRES: session_id from convoopen response (format: sess_v2_...).", "inputSchema": { "additionalProperties": false, "properties": { "job_id": { "description": "Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session.", "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "convostatus", "outputSchema": null }, { "description": "Wait for the user to securely connect their cloud account and subscribe to Luther Systems.\nPolls until credentials appear on the session.\n\n🎯 USE THIS TOOL WHEN: tfdeploy returns an 'auth_required', 'no_credentials', or 'credentials_expired' error.\n\nThe user needs to visit the connect URL to:\n1. Connect their cloud credentials (AWS or GCP)\n2. Sign up and subscribe to a Luther Systems plan (required for deployment)\n\nThis 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.\n\nWORKFLOW:\n1. FIRST: Present the connect URL and explanation to the user (from the tfdeploy error response)\n2. THEN: Call this tool to begin polling for credentials\n3. The user opens the URL in their browser to subscribe and add credentials\n4. When credentials are found, inform the user and call tfdeploy to deploy\n\nIMPORTANT: 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.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: cloud ('aws' or 'gcp'), timeout (integer, seconds to wait, default 300, max 600).", "inputSchema": { "additionalProperties": false, "properties": { "cloud": { "description": "Cloud provider whose credentials are awaited: 'aws' or 'gcp'. Defaults to 'aws'.", "enum": [ "aws", "gcp" ], "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "timeout": { "description": "Max seconds to wait for the user to complete the browser-based credential connect flow. Default 300, max 600.", "maximum": 600, "minimum": 1, "type": [ "null", "integer" ] } }, "required": [ "session_id" ], "type": "object" }, "name": "credawait", "outputSchema": null }, { "description": "INSPECTION: Inspect GCP infrastructure for a deployed project\n⚠️ **PREREQUISITE**: This tool requires a prior deployment ATTEMPT (successful or failed).\nCheck convostatus for hasDeployAttempt=true before calling. Works even after failed deploys to inspect orphaned resources.\n\nInspect deployed GCP resources after a deployment attempt.\nUse this tool when the user asks about the status or details of their deployed GCP infrastructure.\nIt fetches temporary read-only credentials securely and queries the GCP API directly.\n\nRESPONSE TIERS (default is summary for token efficiency):\n- Summary (default): Key fields only (~500 tokens). Set detail=false, raw=false or omit both.\n- Detail: Full metadata for a specific resource. Set detail=true + resource filter.\n- Raw: Complete unprocessed API response. Set raw=true.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nSupported 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\nFor a specific service's actions, call with action=\"list-actions\".\n\nMETRICS: 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}.\nLabel breakdowns: Cloud Functions (by status), Load Balancer/API Gateway (by response_code_class), Cloud CDN (by cache_result).\nSecret Manager get-metrics returns operational health (version count, replication, create time) — no time-series.\nBastion is an alias for Compute Engine metrics (SSH connection count not available as a GCP metric).\nBILLING: 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.\nRequired 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.\n\nEXAMPLES:\n- gcpinspect(session_id=..., service=\"compute\", action=\"list-instances\")\n- gcpinspect(session_id=..., service=\"gke\", action=\"list-clusters\")\n- gcpinspect(session_id=..., service=\"cloudsql\", action=\"get-metrics\", filters=\"{\\\"hours\\\":6}\")\n- gcpinspect(session_id=..., service=\"billing\", action=\"get-billing-info\")", "inputSchema": { "additionalProperties": false, "properties": { "action": { "description": "Operation on the service. Examples: 'list-instances' (compute), 'list-buckets' (storage), 'list-clusters' (gke), 'list-actions' (discovery), 'list-metrics' / 'get-metrics' (Cloud Monitoring).", "type": "string" }, "detail": { "description": "When true, returns full metadata for a single resource. When false (default), returns a summary.", "type": "boolean" }, "filters": { "description": "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.", "type": "string" }, "raw": { "description": "When true, returns the unprocessed GCP API response. Escape hatch for fields the summarized response doesn't surface.", "type": "boolean" }, "service": { "description": "GCP service to query. Examples: 'compute', 'storage', 'cloudsql', 'gke', 'cloudrun', 'pubsub', 'firestore'. Use action='list-actions' to discover supported actions for a service.", "enum": [ "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" ], "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id", "service", "action", "filters", "detail", "raw" ], "type": "object" }, "name": "gcpinspect", "outputSchema": null }, { "description": "BATCH INSPECTION: run up to 32 GCP inspect probes in one call.\n⚠️ **PREREQUISITE**: Same as gcpinspect — deploy attempt required.\nCheck convostatus for hasDeployAttempt=true before calling.\n\nUse this when you need to check more than ~3 resources. The backend fetches\nOracle credentials ONCE per batch and fans out probes against a single GCP\ncredentials blob — a 12-resource health check is ~5–8× faster and 12× fewer\nOracle round-trips than calling gcpinspect 12 times.\n\nBUDGETS:\n- Up to 32 sub-probes per call (subs array length).\n- 30s per-sub timeout; 60s total batch wall-clock.\n- Concurrency cap 8.\n- 512 KB response cap: subs past the cap keep their envelope\n (index/service/action/ok) but have result replaced with truncated=true.\n\nPARTIAL FAILURE IS EXPECTED. The response is an ordered results array;\neach entry has {index, service, action, ok, result, error}. Inspect each\nresult — do NOT abort on the first error. A credential fetch failure\nleaves cred-less probes (list-actions, list-metrics) succeeding anyway.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nSupported 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\nFor a specific service's actions, use gcpinspect (singular) with\naction=\"list-actions\" — batch is not the place for discovery.\nBatch responses are always summarized (no detail/raw per-sub); use\nsingular gcpinspect when you need full metadata or raw API output for one\nresource.\n\nEXAMPLES:\n- gcpinspect_batch(session_id=..., subs=[\n {\"service\":\"compute\",\"action\":\"list-instances\"},\n {\"service\":\"gke\",\"action\":\"list-clusters\"},\n {\"service\":\"cloudsql\",\"action\":\"list-instances\"}])\n- gcpinspect_batch(session_id=..., subs=[\n {\"service\":\"compute\",\"action\":\"get-metrics\",\"filters\":\"{\\\"hours\\\":6}\"},\n {\"service\":\"cloudrun\",\"action\":\"get-metrics\",\"filters\":\"{\\\"hours\\\":6}\"}])", "inputSchema": { "additionalProperties": false, "properties": { "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "subs": { "description": "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.", "items": { "additionalProperties": false, "properties": { "action": { "description": "Operation on the service (e.g. 'describe-instances', 'list-buckets', 'list-actions' for discovery, 'list-metrics' / 'get-metrics' for time-series).", "type": "string" }, "filters": { "description": "Optional JSON-encoded filter object passed through to the underlying API. Examples: '{\"hours\":6}' for metric windows, '{\"days\":7}' for cost queries.", "type": "string" }, "service": { "description": "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.", "enum": [ "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" ], "type": "string" } }, "required": [ "service", "action" ], "type": "object" }, "maxItems": 32, "minItems": 1, "type": [ "null", "array" ] } }, "required": [ "session_id", "subs" ], "type": "object" }, "name": "gcpinspect_batch", "outputSchema": null }, { "description": "Get workflow guidance for using InsideOut infrastructure tools.\nCall help() for a compact overview, or help(section=...) for a detailed guide.\nSections: workflow, tools, examples, inspect.\nResponses include hints with next_actions and related_tools.", "inputSchema": { "additionalProperties": false, "properties": { "section": { "description": "Optional section to focus the response. One of: 'workflow', 'tools', 'examples', 'inspect'. When omitted, returns a compact overview (~500 tokens).", "enum": [ "workflow", "tools", "examples", "inspect" ], "type": "string" } }, "type": "object" }, "name": "help", "outputSchema": null }, { "description": "Structured diff showing what would be deployed if the user ran tfdeploy now.\nReturns component-level changes (added/removed/modified), field-level details, and pricing deltas.\n\nDefaults (#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.\n\nPass explicit `from_version` and/or `to_version` integers to compare any two saved versions (e.g. v3 → v5).\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).", "inputSchema": { "additionalProperties": false, "properties": { "from_version": { "description": "Starting stack version number for the diff. Defaults to the latest applied version.", "type": [ "null", "integer" ] }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "to_version": { "description": "Ending stack version number for the diff. Defaults to the current draft.", "type": [ "null", "integer" ] } }, "required": [ "session_id" ], "type": "object" }, "name": "stackdiff", "outputSchema": null }, { "description": "Create a draft version by reverting to a previous version's config.\nCopies components, config, and pricing from the target version. If a draft already exists, updates it in-place (single-draft rule).\n\nUse `stackversions` first to find available version numbers.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...), version (target version number).", "inputSchema": { "additionalProperties": false, "properties": { "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "version": { "description": "Target stack version number to roll back to. Use stackversions to list available versions.", "type": "integer" } }, "required": [ "session_id", "version" ], "type": "object" }, "name": "stackrollback", "outputSchema": null }, { "description": "List all stack versions for a session (newest first).\nShows version history including version number, status (draft/confirmed/applied), change summaries, and timestamps.\n\nUse this tool to see the design history, review what changed between iterations, or find a version number to roll back to.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).", "inputSchema": { "additionalProperties": false, "properties": { "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "stackversions", "outputSchema": null }, { "description": "FEEDBACK: Submit feedback, bug reports, or feature requests to Luther Systems\nUse this tool to forward user feedback directly to the Luther Systems team. This includes bug reports, feature requests, questions, or general feedback about InsideOut.\nThe agent itself can also use this tool to report issues it encounters during operation.\n\nREQUIRES: session_id, category, message\nOPTIONAL: user_email (for follow-up), user_name, source (default: 'mcp'), initiator ('user' or 'agent')\n\nCategories: bug_report, feature_request, general_feedback, question, security\n\nThe 'initiator' field tracks who triggered the report:\n- 'user' — the user explicitly reported the issue or requested feedback submission\n- 'agent' — Riley detected an issue and initiated the feedback flow\n\nExamples:\n- User says 'the deploy button is broken' → submit_feedback(category='bug_report', message='...', initiator='user')\n- User says 'I wish it had dark mode' → submit_feedback(category='feature_request', message='...', initiator='user')\n- 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')", "inputSchema": { "additionalProperties": false, "properties": { "category": { "description": "Feedback category. One of: bug_report, feature_request, general_feedback, question.", "enum": [ "bug_report", "feature_request", "general_feedback", "question" ], "type": "string" }, "initiator": { "description": "Optional originator: 'user' (human triggered) or 'agent' (automated).", "enum": [ "user", "agent" ], "type": "string" }, "message": { "description": "Feedback content. Free-form text describing the issue, request, or comment.", "maxLength": 10000, "minLength": 1, "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "source": { "description": "Optional source channel: 'mcp', 'cli', or 'web'.", "enum": [ "mcp", "cli", "web" ], "type": "string" }, "user_email": { "description": "Optional email address for follow-up.", "format": "email", "type": "string" }, "user_name": { "description": "Optional display name for attribution.", "type": "string" } }, "required": [ "session_id", "category", "message" ], "type": "object" }, "name": "submit_feedback", "outputSchema": null }, { "description": "WORKFLOW: Step 4 of 4 - Deploy infrastructure to the cloud\nDeploy infrastructure by starting a Terraform job for an InsideOut session.\nThis tool initiates the actual deployment process after Terraform files have been generated.\nIMPORTANT: This starts a long-running job (15+ minutes). Use tfstatus to monitor progress.\nSINGLE-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.\nReturns confirmation that the deployment has started.\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: plan_id (string) — Apply a previously created plan from tfplan.\nPreview-then-apply workflow: tfplan → tflogs (review) → tfdeploy(plan_id=...).\nOPTIONAL: sandbox (boolean, default false) — deploys real generated Terraform. Set to true for cheap sandbox template (testing only).\nOPTIONAL: 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.\nOPTIONAL: force_new (boolean, default false) - bypass the session-level single-flight guard. Use only when the existing run is provably wedged.\nCREDENTIAL FLOW (if credentials are missing):\n1. Response includes a connect_url — present it to the user\n2. Call credawait(session_id=...) to poll for credentials\n3. When credawait returns success, retry tfdeploy\nDo NOT call credawait without first showing the connect URL to the user.", "inputSchema": { "additionalProperties": false, "properties": { "force_new": { "description": "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.", "type": [ "null", "boolean" ] }, "ignore_drift": { "description": "When true, proceed with deploy even if drift is detected on the existing stack.", "type": [ "null", "boolean" ] }, "plan_id": { "description": "Apply a previously created plan from tfplan. When set, project_id should also be provided.", "type": "string" }, "project_id": { "description": "Project ID returned by tfplan. Required alongside plan_id.", "type": "string" }, "sandbox": { "description": "When true (default for MCP), deploys a small sandbox stack instead of the real generated Terraform. Set false to deploy the actual user stack.", "type": [ "null", "boolean" ] }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "version": { "description": "Deploy a specific stack version number. Defaults to the current draft.", "type": [ "null", "integer" ] } }, "required": [ "session_id" ], "type": "object" }, "name": "tfdeploy", "outputSchema": null }, { "description": "DESTROY: Tear down previously deployed infrastructure\nDestroys infrastructure by calling the Oracle destroy endpoint for a session that has a prior successful deployment.\nIMPORTANT: This starts a long-running job. Use tfstatus/tflogs to monitor progress.\nSINGLE-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.\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: force_new (boolean, default false) - bypass the single-flight guard. Use only when the existing run is provably wedged.\nPREREQUISITE: The session must have a prior successful deployment with a project_id.\nAfter destroy completes, the session is kept for historical record but hasDeployment is set to false.", "inputSchema": { "additionalProperties": false, "properties": { "force_new": { "description": "When true, bypass the single-flight guard and force a new destroy even if another job is in flight.", "type": [ "null", "boolean" ] }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "tfdestroy", "outputSchema": null }, { "description": "DRIFT CHECK: Run a read-only drift detection check\nChecks whether deployed infrastructure has drifted from the expected Terraform state.\nThis is a read-only operation — it does NOT modify any infrastructure.\nReturns job_id. Use tflogs to stream the drift check results.\nSINGLE-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.\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nPREREQUISITE: The session must have a prior deployment with a project_id.\nOPTIONAL: force_new (boolean, default false) - bypass the single-flight guard. Use only when the existing run is provably wedged.\nIf drift is detected, the user can either fix the drift or use tfdeploy(ignore_drift=true) to proceed.", "inputSchema": { "additionalProperties": false, "properties": { "force_new": { "description": "When true, bypass the single-flight guard and force a new drift check even if another job is in flight.", "type": [ "null", "boolean" ] }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "tfdrift", "outputSchema": null }, { "description": "WORKFLOW: Step 3 of 4 - Generate Terraform files from completed design\nGenerate Terraform files from an InsideOut session that has completed infrastructure design.\n\n⚠️ PREREQUISITE: Only call this AFTER convoreply returns with `terraform_ready=true` in the response metadata.\nDO NOT call this while convoreply is still running or before terraform_ready is confirmed!\nIf you get 'session has not reached terraform-ready state', wait for convoreply to complete first.\n\n🎯 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.\n\n**DEFAULT RESPONSE**: Returns summary table + download URL (keeps code out of LLM context).\n**FALLBACK**: Set `include_code: true` to get full code inline if curl/unzip fails.\n\n**CRITICAL WORKFLOW** (default mode):\n1. Call this tool to get file summary and download URL\n2. ASK the user: 'Where would you like me to save the Terraform files? Default: ./insideout-infra/'\n3. WAIT for user confirmation before running the download command\n4. Run the curl/unzip command with the user's chosen directory\n5. If curl/unzip FAILS (sandbox, security, platform issues), retry with `include_code: true`\n\n**AFTER GENERATION**: Ask user if they want to review the files and then deploy with tfdeploy\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: include_code (boolean) - set true to return full code inline as fallback.\n💡 TIP: Examine workflow.usage prompt for more context on how to properly use these tools.", "inputSchema": { "additionalProperties": false, "properties": { "include_code": { "description": "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).", "type": [ "null", "boolean" ] }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "tfgenerate", "outputSchema": null }, { "description": "MONITORING: Fetch Terraform deployment logs with pagination\nFetches logs from a running or completed Terraform deployment job.\nFor **completed jobs**: uses REST endpoint for instant retrieval (supports `tail` for server-side filtering).\nFor **running jobs**: streams via SSE with timeout-based pagination.\n\n**PAGINATION** (running jobs only): Use `last_event_id` from the response to fetch more:\n1. First call: `tflogs(session_id='...')` → get logs + `last_event_id`\n2. Next call: `tflogs(session_id='...', last_event_id='...')` → get NEW logs only\n3. Repeat until `complete: true` in response\n\n**RESPONSE FIELDS**:\n- `logs`: Array of log messages collected\n- `last_event_id`: Pass this back to get more logs (pagination cursor, SSE only)\n- `complete`: true if job finished, false if more logs may be available\n- `total_logs`: total log entries before tail truncation\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: job_id to target a specific deployment (use tfruns to discover IDs),\ntimeout (default 50s, max 55s), last_event_id (for pagination), tail (return only last N entries)\n⚠️ CONTEXT WARNING: Deploy logs can be hundreds of lines. Use tail: 50 for completed jobs to avoid blowing up the context window.", "inputSchema": { "additionalProperties": false, "properties": { "job_id": { "description": "Optional. Target a specific job. Use tfruns to discover job IDs. When omitted, streams the latest job for the session.", "type": "string" }, "last_event_id": { "description": "Resume cursor for pagination. Pass back the last_event_id from a previous tflogs response to fetch only newer entries.", "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" }, "tail": { "description": "Return only the last N log entries. Use 0 (or omit) for all available entries.", "maximum": 10000, "minimum": 0, "type": [ "null", "integer" ] }, "timeout": { "description": "Max seconds to collect logs. Default 50, max 55.", "maximum": 55, "minimum": 1, "type": [ "null", "integer" ] } }, "required": [ "session_id" ], "type": "object" }, "name": "tflogs", "outputSchema": null }, { "description": "INSPECTION: Retrieve Terraform outputs from a completed deployment\nReturns structured output values (VPC IDs, endpoints, cluster names, etc.) after a successful deploy.\nSensitive outputs are redacted (shown as '(sensitive)').\n\nBy default returns outputs for the latest successful deploy. Optionally specify job_id to get outputs for a specific deployment.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: job_id (specific deployment), lifecycle (filter by step e.g. 'cloud-provision').", "inputSchema": { "additionalProperties": false, "properties": { "job_id": { "description": "Optional. Specific job ID to fetch outputs from. When omitted, returns outputs from the latest successful apply.", "type": "string" }, "lifecycle": { "description": "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.", "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "tfoutputs", "outputSchema": null }, { "description": "PREVIEW: Run terraform plan to preview infrastructure changes\nRuns a terraform plan for an InsideOut session without applying any changes.\nThis lets the user review what will be created/changed/destroyed before committing.\nReturns job_id, plan_id, and project_id. Use tflogs to stream the plan output.\nAfter the plan completes, use tfdeploy with plan_id to apply the exact plan.\nSINGLE-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.\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: sandbox (boolean, default false) — plans real generated Terraform. Set to true for cheap sandbox template (testing only).\nOPTIONAL: force_new (boolean, default false) - bypass the single-flight guard. Use only when the existing run is provably wedged.\nCREDENTIAL HANDLING: Same as tfdeploy - credentials must be configured first.", "inputSchema": { "additionalProperties": false, "properties": { "force_new": { "description": "When true, bypass the single-flight guard and force a new plan even if one is already running.", "type": [ "null", "boolean" ] }, "sandbox": { "description": "When true, plan against the sandbox stack; when false (default), plan the real generated Terraform.", "type": [ "null", "boolean" ] }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "tfplan", "outputSchema": null }, { "description": "INSPECTION: List all Terraform deployment runs for a session\nReturns job IDs, statuses, types (apply/destroy), and timestamps for every run.\nUse this to see deployment history, find job IDs for log inspection, or check which deployments succeeded or failed.\n\nREQUIRES: session_id from convoopen response (format: sess_v2_...).", "inputSchema": { "additionalProperties": false, "properties": { "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "tfruns", "outputSchema": null }, { "description": "MONITORING: Quick status check for Terraform deployments\nCheck the current status of a Terraform deployment job.\nUse this tool to quickly check if a deployment is running, completed, or failed.\nReturns job status, job_id, and other metadata without streaming logs.\nUse tflogs to stream the actual deployment logs.\nREQUIRES: session_id from convoopen response (format: sess_v2_...).\nOPTIONAL: job_id to target a specific deployment (use tfruns to discover IDs).\n\n**LIVENESS**: The response carries two distinct timestamps:\n- `updated_at` — last semantic change (only bumped when status / drift / version actually differ).\n Useful for sorting deployments; NOT a per-poll heartbeat.\n- `last_refresh_at` — last successful Oracle decode (stamped on every poll where reliable\n reached Oracle, even if nothing in the row changed). Use this to confirm reliable is\n still actively talking to Oracle for a long-running RUNNING job. Absent on rows that\n haven't been refreshed since the column was added.\n💡 TIP: Examine workflow.usage prompt for more context on how to properly use these tools.", "inputSchema": { "additionalProperties": false, "properties": { "job_id": { "description": "Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session.", "type": "string" }, "session_id": { "description": "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.", "pattern": "^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$", "type": "string" } }, "required": [ "session_id" ], "type": "object" }, "name": "tfstatus", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:580b4daa97a605c3610d08678af20096e60dc3e3c0e5cdfd6cd4fbd76aad23a6 | sha256sum