{"serverId":"mcp-registry/io.github.springrolldev/springroll","tools":[{"name":"springroll.app.get","fixed":{"name":"springroll_app_get","description":"Returns an application's registry record: metadata, lifecycle stage, risk score, and whichever of the optional sections you ask for. No secrets are included.\n\nSections, all returned by default:\n  • `source`: repository or uploaded bundle, and `cannotBuildReason` when a deploy would be refused for want of a source\n  • `history`: recent releases and deployments\n  • `status`: each environment's current deployment, outstanding approvals, and usage. This answers \"where is my app up to?\"\n  • `grants`:","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"include":{"type":"array","items":{"enum":["source","history","status","grants"],"type":"string"},"description":"Sections to return. Defaults to all of them."},"application":{"type":"string","minLength":1,"description":"Application slug or id."}}},"annotations":{"title":"Get an application","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Get an application"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.get\" → \"springroll_app_get\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":421,"tokensAfter":421},{"name":"springroll.app.list","fixed":{"name":"springroll_app_list","description":"Lists applications in this organization, newest first. Use `search` to find one by name or slug.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["context"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1},"search":{"type":"string","maxLength":200},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""}}},"annotations":{"title":"List applications","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"List applications"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.list\" → \"springroll_app_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":262,"tokensAfter":262},{"name":"springroll.app.presentation.generate_icon","fixed":{"name":"springroll_app_presentation_generate_icon","description":"Queue one premium icon draft from the app's reviewed purpose. Requests are limited and deduplicated. Artwork never blocks deployment or publishes itself.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","purpose","idempotencyKey","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"purpose":{"type":"string","maxLength":500,"minLength":1},"application":{"type":"string"},"idempotencyKey":{"type":"string","maxLength":200,"minLength":8,"description":"Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate."}}},"annotations":{"title":"Prepare an app icon draft","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Prepare an app icon draft"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.presentation.generate_icon\" → \"springroll_app_presentation_generate_icon\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":352,"tokensAfter":352},{"name":"springroll.app.presentation.get","fixed":{"name":"springroll_app_presentation_get","description":"Read a private app listing draft and available artwork. Does not publish or expose the app.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"application":{"type":"string"}}},"annotations":{"title":"Read app presentation draft","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Read app presentation draft"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.presentation.get\" → \"springroll_app_presentation_get\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":250,"tokensAfter":250},{"name":"springroll.app.presentation.save","fixed":{"name":"springroll_app_presentation_save","description":"Save listing copy and selected image IDs to a private draft. Read the revision first. Use factual copy and real, reviewed screenshots. Only the owner or admin can publish in SpringRoll.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","revision","draft","context"],"properties":{"draft":{"type":"object","required":["name","tagline"],"properties":{"name":{"type":"string","maxLength":120,"minLength":1},"creator":{"type":"string","default":"","maxLength":100},"tagline":{"type":"string","maxLength":160,"minLength":1},"shareText":{"type":"string","default":"","maxLength":240},"description":{"type":"string","default":"","maxLength":4000},"iconAssetId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"default":null},"screenshots":{"type":"array","items":{"type":"object","required":["assetId"],"properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"caption":{"type":"string","default":"","maxLength":180}}},"default":[],"maxItems":6}}},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"revision":{"type":"integer","maximum":9007199254740991,"minimum":0},"application":{"type":"string"}}},"annotations":{"title":"Prepare app presentation draft","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Prepare app presentation draft"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.presentation.save\" → \"springroll_app_presentation_save\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":587,"tokensAfter":587},{"name":"springroll.app.presentation.upload","fixed":{"name":"springroll_app_presentation_upload","description":"Upload a real screenshot or app icon as base64 PNG, JPEG, or WebP (8 MB maximum). Metadata is stripped. Images remain private until selected in an owner-published snapshot. Never upload confidential screen content.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","kind","base64","idempotencyKey","context"],"properties":{"kind":{"enum":["icon","screenshot"],"type":"string"},"base64":{"type":"string","pattern":"^[A-Za-z0-9+/]+={0,2}$","maxLength":11184812,"minLength":1},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"application":{"type":"string"},"idempotencyKey":{"type":"string","maxLength":200,"minLength":8,"description":"Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate."}}},"annotations":{"title":"Upload app presentation image","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Upload app presentation image"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.presentation.upload\" → \"springroll_app_presentation_upload\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":394,"tokensAfter":394},{"name":"springroll.app.record_prompts","fixed":{"name":"springroll_app_record_prompts","description":"Attaches the conversation that produced this application to its record, as reference for whoever maintains it next and for the reviewer who has to approve it.\n\nAsk the user before calling this, every time. The transcript is STORED and is READABLE BY ANYONE who can see the application record. SpringRoll scrubs credentials it recognises before writing (agent tokens, cloud keys, private keys, connection strings, and assignment lines whose key looks like a secret), but that scrubbing is best-effort ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","sessionKey","turns","idempotencyKey","context"],"properties":{"turns":{"type":"array","items":{"type":"object","required":["role","content"],"properties":{"role":{"enum":["user","assistant","system","tool"],"type":"string"},"content":{"type":"string","minLength":1},"occurredAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}}},"maxItems":50,"minItems":1,"description":"Up to 50 turns per call, in order."},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"agentName":{"type":"string","maxLength":120},"modelName":{"type":"string","maxLength":120},"releaseId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"sessionKey":{"type":"string","maxLength":200,"minLength":1,"description":"Stable identifier for this build conversation."},"application":{"type":"string","minLength":1,"description":"Application slug or id."},"inputTokens":{"type":"integer","maximum":9007199254740991,"minimum":0},"outputTokens":{"type":"integer","maximum":9007199254740991,"minimum":0},"idempotencyKey":{"type":"string","maxLength":200,"minLength":8,"description":"Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate."},"startTurnIndex":{"type":"integer","maximum":9007199254740991,"minimum":0,"description":"Where this batch starts. Defaults to after the last recorded turn."}}},"annotations":{"title":"Record the build transcript","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Record the build transcript"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.record_prompts\" → \"springroll_app_record_prompts\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":828,"tokensAfter":828},{"name":"springroll.app.update","fixed":{"name":"springroll_app_update","description":"Updates App Portal metadata: description, icon, tags, department, support contact, and data classification. Visibility is deliberately not editable here, because widening an audience requires an approval request (sec. 15.4).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","context"],"properties":{"tags":{"type":"array","items":{"type":"string","maxLength":40,"minLength":1},"maxItems":20},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"iconUrl":{"type":"string","format":"uri"},"department":{"type":"string","maxLength":120},"application":{"type":"string","minLength":1,"description":"Application slug or id."},"description":{"type":"string","maxLength":2000},"supportContact":{"type":"string","maxLength":200},"dataClassification":{"enum":["public","internal","confidential","restricted"],"type":"string"}}},"annotations":{"title":"Update application metadata","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Update application metadata"},"changes":[{"kind":"name","detail":"Renamed \"springroll.app.update\" → \"springroll_app_update\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":404,"tokensAfter":404},{"name":"springroll.approval.get","fixed":{"name":"springroll_approval_get","description":"Returns an approval request with its assigned reviewers, decisions so far, and the policy snapshot taken at submission. Poll this to find out whether a release has been approved.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["approvalRequestId","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"approvalRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"annotations":{"title":"Get an approval request","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Get an approval request"},"changes":[{"kind":"name","detail":"Renamed \"springroll.approval.get\" → \"springroll_approval_get\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":329,"tokensAfter":329},{"name":"springroll.approval.submit","fixed":{"name":"springroll_approval_submit","description":"Submits an approval request of any supported type: UAT_PROMOTION, UAT_SIGN_OFF, PRODUCTION_PROMOTION, VISIBILITY_CHANGE, OWNERSHIP_TRANSFER, RETIREMENT, DOMAIN_CHANGE, or ROLLBACK. **An agent may submit but never decide**: SpringRoll requires a human approver, and an agent token cannot approve its own request.\n\nConfirm with the user before calling this. It creates review work for named people.\n\nType-specific behaviour:\n  • `PRODUCTION_PROMOTION`: this does NOT deploy. It asks. `releaseId` defaul","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","requestType","idempotencyKey","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"payload":{"type":"object","description":"Type-specific detail, e.g. { visibility: 'TENANT' }, { newOwnerMembershipId: '…' }, or { targetDeploymentId: '…' } for a rollback.","propertyNames":{"type":"string"},"additionalProperties":{}},"releaseId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Release this concerns. For PRODUCTION_PROMOTION, defaults to the latest release."},"application":{"type":"string","minLength":1,"description":"Application slug or id."},"requestType":{"enum":["UAT_PROMOTION","UAT_SIGN_OFF","PRODUCTION_PROMOTION","VISIBILITY_CHANGE","OWNERSHIP_TRANSFER","RETIREMENT","DOMAIN_CHANGE","ROLLBACK"],"type":"string"},"justification":{"type":"string","maxLength":2000,"description":"Why this should happen. Shown to reviewers. Required for ROLLBACK and RETIREMENT, and at least 10 characters when required."},"idempotencyKey":{"type":"string","maxLength":200,"minLength":8,"description":"Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate."},"targetEnvironmentType":{"enum":["development","uat","production"],"type":"string","description":"Canonical environment class. SpringRoll promotes development -> uat -> production."}}},"annotations":{"title":"Submit an approval request","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Submit an approval request"},"changes":[{"kind":"name","detail":"Renamed \"springroll.approval.submit\" → \"springroll_approval_submit\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":753,"tokensAfter":753},{"name":"springroll.connect.access_status","fixed":{"name":"springroll_connect_access_status","description":"Returns the status of a data access request: REQUESTED, APPROVED, REJECTED, REVOKED, or EXPIRED, with the fields actually approved. Approved fields are often narrower than requested, and a row filter may restrict which rows the application can see at all.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["grantId","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"grantId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"annotations":{"title":"Get data access status","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Get data access status"},"changes":[{"kind":"name","detail":"Renamed \"springroll.connect.access_status\" → \"springroll_connect_access_status\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":347,"tokensAfter":347},{"name":"springroll.connect.data_products","fixed":{"name":"springroll_connect_data_products","description":"Without `dataProduct`, lists the governed data products this organization publishes: what each one holds, who owns it, and how sensitive it is.\n\nWith `dataProduct`, returns that product's schema: its datasets, the available fields with their types and sensitivity, the business glossary its owner wrote, and what the underlying source can compute. Read this before requesting access, so you request the fields the application actually needs.\n\nEither way you learn the *kind* of system behind a produc","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"dataProduct":{"type":"string","minLength":1,"description":"Data product slug. Omit to list every product this organization publishes."}}},"annotations":{"title":"List or describe data products","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"List or describe data products"},"changes":[{"kind":"name","detail":"Renamed \"springroll.connect.data_products\" → \"springroll_connect_data_products\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":390,"tokensAfter":390},{"name":"springroll.connect.request_access","fixed":{"name":"springroll_connect_request_access","description":"Requests access to a data product for one environment, naming the exact fields the application needs. A data owner must approve, and may narrow the field list or add a row filter before doing so. Nothing is readable until then. You never receive a credential: an approved grant lets the deployed application ask questions through the SpringRoll Connect gateway, which enforces the grant on every request.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","dataProduct","environmentType","fields","context"],"properties":{"fields":{"type":"array","items":{"type":"string","maxLength":260,"minLength":1},"maxItems":200,"minItems":1,"description":"Qualified field names to request, as `dataset.field`. Ask for what the application actually reads, because a narrower request is approved faster and survives review."},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"purpose":{"type":"string","maxLength":2000,"description":"Why the application needs this data. Shown to the data owner."},"application":{"type":"string","minLength":1,"description":"Application slug or id."},"dataProduct":{"type":"string","minLength":1,"description":"Data product slug from springroll.connect.data_products."},"environmentType":{"enum":["development","uat","production"],"type":"string","description":"Canonical environment class. SpringRoll promotes development -> uat -> production."}}},"annotations":{"title":"Request data product access","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Request data product access"},"changes":[{"kind":"name","detail":"Renamed \"springroll.connect.request_access\" → \"springroll_connect_request_access\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":561,"tokensAfter":561},{"name":"springroll.context","fixed":{"name":"springroll_context","description":"Returns the organization, identity, and permissions this agent token acts as, together with the deployment runtimes configured for it. Call this first: it tells you which tenant you are in, what you are allowed to do, and whether a deployment can actually land. It never returns credentials.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""}}},"annotations":{"title":"Get SpringRoll context","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Get SpringRoll context"},"changes":[{"kind":"name","detail":"Renamed \"springroll.context\" → \"springroll_context\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":289,"tokensAfter":289},{"name":"springroll.deploy","fixed":{"name":"springroll_deploy","description":"Registers the project if it is new, attaches whatever source you give it, and deploys it using the application's Deployment workflow. Direct applications go to Production; Staged applications go to Development. Returns the live URL, or a deployment id to poll if the build is still running.\n\n**You do not decide whether this project needs git.** Send what you have and SpringRoll works it out:\n  • a pushed git remote → pass `repositoryUrl` (and `ref` if not the default branch)\n  • no remote, or unc","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["idempotencyKey","context"],"properties":{"ref":{"type":"string","maxLength":200,"description":"Branch, tag, or full commit SHA. Defaults to the app's default revision."},"name":{"type":"string","maxLength":120,"minLength":2},"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","maxLength":63,"minLength":2},"tags":{"type":"array","items":{"type":"string","maxLength":60,"minLength":1},"maxItems":20},"files":{"type":"object","description":"Path-to-contents map. Use `archive` for anything beyond a few files.","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"archive":{"type":"string","description":"Base64 of a gzipped tar of the project source. Preferred over `files`."},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"manifest":{"type":"string","description":"A SpringRoll manifest. Supersedes the metadata fields below; the source fields still apply."},"framework":{"enum":["nextjs","static"],"type":"string"},"placement":{"type":"object","properties":{"needs":{"type":"array","items":{"enum":["static","serverless","server","container","database","postgres","auth","storage","realtime","edge-functions"],"type":"string"},"description":"Everything this application needs, in one list. At most one shape of thing being run ('static', 'serverless', 'server', or 'container'), plus any services it needs beside its own code: 'postgres', 'auth', 'storage', 'realtime', 'edge-functions'. A provider that cannot supply an entry is excluded, so ask only for what the app actually uses, and leave the shape out unless the project does something the source does not show."},"region":{"type":"string","maxLength":64,"description":"A required region, when the data has to stay somewhere specific."},"memoryMb":{"type":"integer","maximum":9007199254740991,"minimum":0},"storageGb":{"type":"number","minimum":0,"description":"Persistent disk needed, in gigabytes."},"computeVcpu":{"type":"number","minimum":0,"description":"Sustained vCPU. Fractional is normal."},"monthlyUsage":{"type":"object","properties":{"kv":{"type":"object","properties":{"lists":{"type":"integer","maximum":1000000000000000,"minimum":0},"reads":{"type":"integer","maximum":1000000000000000,"minimum":0},"writes":{"type":"integer","maximum":1000000000000000,"minimum":0},"deletes":{"type":"integer","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"build":{"type":"object","properties":{"starts":{"type":"integer","maximum":1000000000000000,"minimum":0},"minutes":{"type":"number","maximum":1000000000000000,"minimum":0},"activeCpuHours":{"type":"number","maximum":1000000000000000,"minimum":0},"dataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactDataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactStorageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"registryStorageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactSimpleOperations":{"type":"integer","maximum":1000000000000000,"minimum":0},"provisionedMemoryGbHours":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactAdvancedOperations":{"type":"integer","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"cache":{"type":"object","properties":{"commands":{"type":"integer","maximum":1000000000000000,"minimum":0},"dataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"worker":{"type":"object","properties":{"cpuMilliseconds":{"type":"number","maximum":1000000000000000,"minimum":0},"dispatchRequests":{"type":"integer","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"runtime":{"type":"object","properties":{"invocations":{"type":"integer","maximum":1000000000000000,"minimum":0},"activeCpuHours":{"type":"number","maximum":1000000000000000,"minimum":0},"originTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"provisionedMemoryGbHours":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"database":{"type":"object","properties":{"rowsRead":{"type":"integer","maximum":1000000000000000,"minimum":0},"rowsWritten":{"type":"integer","maximum":1000000000000000,"minimum":0},"computeCuHours":{"type":"number","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"extraBranchHours":{"type":"number","maximum":1000000000000000,"minimum":0},"extraBranchMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"publicDataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"restoreHistoryGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"snapshotStorageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"container":{"type":"object","properties":{"egressNaEuGb":{"type":"number","maximum":1000000000000000,"minimum":0},"egressOtherGb":{"type":"number","maximum":1000000000000000,"minimum":0},"billedVcpuSeconds":{"type":"number","maximum":1000000000000000,"minimum":0},"billedDiskGbSeconds":{"type":"number","maximum":1000000000000000,"minimum":0},"billedMemoryGibSeconds":{"type":"number","maximum":1000000000000000,"minimum":0},"egressOceaniaKoreaTaiwanGb":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"durableObject":{"type":"object","properties":{"rowsRead":{"type":"integer","maximum":1000000000000000,"minimum":0},"rowsWritten":{"type":"integer","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"billableRequests":{"type":"integer","maximum":1000000000000000,"minimum":0},"durationGbSeconds":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"objectStorage":{"type":"object","properties":{"dataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"simpleOperations":{"type":"integer","maximum":1000000000000000,"minimum":0},"advancedOperations":{"type":"integer","maximum":1000000000000000,"minimum":0}},"additionalProperties":false}},"description":"Optional monthly billing quantities supplied by the user or actual usage evidence. Never invent values or default missing fields to zero. CPU-hours mean active CPU time; memory GB-hours include billable wait time and provider minimums. Build minutes do not substitute for Sandbox CPU/memory. Database and object storage are separate from local disk. Cloudflare Worker dispatch requests and CPU are separate from container active vCPU, provisioned memory, disk and regional egress. Rows read/written mean billed rows including indexes, not SQL query counts. Cache commands include internal operations and realtime polling. On redeploy this replaces the previous monthlyUsage forecast; omit the whole object to keep it.","additionalProperties":false},"needsWebSockets":{"type":"boolean","description":"Set true if the app holds a live connection. Inferred from the dependency list otherwise, and getting it wrong puts the app on a runtime that drops the socket on every request."},"budgetUsdPerMonth":{"type":"number","minimum":0,"description":"A real ceiling, if the user gave one. Leave it out otherwise: a budget of zero that nobody asked for would exclude every qualified plan with a non-zero estimate."},"coldStartTolerant":{"type":"boolean","description":"False if the first visitor after an idle period must not wait. Set this when the user says the app has to be instant; it excludes plans that sleep, which are otherwise the cheapest ones."},"productionCritical":{"type":"boolean","description":"Whether a colleague depends on this during their working day. Defaults to true for production and false elsewhere."},"expectedBandwidthGb":{"type":"number","minimum":0,"description":"Egress in gigabytes a month. Only if the user told you."},"needsBackgroundWork":{"type":"boolean","description":"Set true if the app runs jobs or a scheduler outside a request."},"needsPersistentDisk":{"type":"boolean","description":"Set true if the app writes files it expects to read back later."},"expectedRequestsPerMonth":{"type":"integer","maximum":9007199254740991,"minimum":0,"description":"Only if the user actually told you. Do not estimate: an invented number is indistinguishable from a measured one once it gets here, and SpringRoll's own default for an internal tool is more honest than a guess."}},"description":"Optional, provider-neutral hints about what this application needs. SpringRoll chooses the provider and plan; these only inform that choice. Leave out anything you do not actually know: monthly billing quantities remain unknown; ordinary workload hints are inferred from the source and named on the placement receipt, which is more useful to the user than a confident guess.","additionalProperties":false},"department":{"type":"string","maxLength":120},"application":{"type":"string","minLength":1,"description":"An existing app's slug or id. Omit on the first ship; `name` implies it."},"description":{"type":"string","maxLength":2000},"waitSeconds":{"type":"integer","maximum":60,"minimum":0,"description":"How long to wait for the build before returning. Defaults to 20. A real build usually outlasts this; poll springroll.deploy.status after."},"buildCommand":{"type":"string","maxLength":500},"preferSource":{"enum":["git","upload"],"type":"string","description":"Tie-breaker when both a repository and files are given. Defaults to git."},"filesEncoding":{"enum":["utf-8","base64"],"type":"string"},"repositoryUrl":{"type":"string","format":"uri"},"rootDirectory":{"type":"string","maxLength":300},"idempotencyKey":{"type":"string","maxLength":200,"minLength":8,"description":"Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate."},"installCommand":{"type":"string","maxLength":500},"supportContact":{"type":"string","maxLength":200,"description":"Team channel or email for users of this app. Required before production."},"outputDirectory":{"type":"string","maxLength":300},"dataClassification":{"enum":["public","internal","confidential","restricted"],"type":"string"}}},"annotations":{"title":"Deploy a project","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Deploy a project"},"changes":[{"kind":"name","detail":"Renamed \"springroll.deploy\" → \"springroll_deploy\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":3222,"tokensAfter":3222},{"name":"springroll.deploy.promote","fixed":{"name":"springroll_deploy_promote","description":"Promotes a tested deployment into the next environment (development -> uat, uat -> production). Reuses the already-built artifact rather than rebuilding, so the bytes that were tested are the bytes that ship.\n\nPromotion into an environment that requires approval will be refused until the approval exists. For production, submit the request first.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["deploymentId","targetEnvironmentType","idempotencyKey","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The tested deployment to promote."},"idempotencyKey":{"type":"string","maxLength":200,"minLength":8,"description":"Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate."},"targetEnvironmentType":{"enum":["development","uat","production"],"type":"string","description":"Canonical environment class. SpringRoll promotes development -> uat -> production."}}},"annotations":{"title":"Promote a deployment","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Promote a deployment"},"changes":[{"kind":"name","detail":"Renamed \"springroll.deploy.promote\" → \"springroll_deploy_promote\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":509,"tokensAfter":509},{"name":"springroll.deploy.status","fixed":{"name":"springroll_deploy_status","description":"Returns a deployment's current status, refreshing it from the runtime provider when the build is still in progress. Statuses: QUEUED, VALIDATING, BUILDING, DEPLOYING, READY, FAILED, CANCELLED, SUPERSEDED, ROLLED_BACK. Poll this after deploying rather than assuming success.\n\nPass `includeLogs` to get the normalised build and deploy log lines alongside the status. Do that once the status is FAILED, rather than guessing at the cause.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["deploymentId","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"logLimit":{"type":"integer","maximum":500,"minimum":1,"description":"How many log lines to return, counting from the end. Defaults to 200."},"includeLogs":{"type":"boolean","description":"Include build and deploy log lines. Defaults to false."},"deploymentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"annotations":{"title":"Get deployment status","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Get deployment status"},"changes":[{"kind":"name","detail":"Renamed \"springroll.deploy.status\" → \"springroll_deploy_status\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":467,"tokensAfter":467},{"name":"springroll.feedback.list","fixed":{"name":"springroll_feedback_list","description":"List only the authenticated member's SpringRoll feedback in the current organization, newest first. Use nextOffset for the next page.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["context"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1},"offset":{"type":"integer","maximum":100000,"minimum":0},"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""}}},"annotations":{"title":"Read your feedback","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Read your feedback"},"changes":[{"kind":"name","detail":"Renamed \"springroll.feedback.list\" → \"springroll_feedback_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":277,"tokensAfter":277},{"name":"springroll.feedback.submit","fixed":{"name":"springroll_feedback_submit","description":"Submit a bug report, idea, or other feedback about SpringRoll on behalf of the authenticated member. Do not include credentials. Reuse the idempotency key when retrying the same submission.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["category","message","idempotencyKey","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"message":{"type":"string","maxLength":5000,"minLength":1},"category":{"enum":["BUG","IDEA","OTHER"],"type":"string"},"idempotencyKey":{"type":"string","maxLength":200,"minLength":1}}},"annotations":{"title":"Send feedback","readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Send feedback"},"changes":[{"kind":"name","detail":"Renamed \"springroll.feedback.submit\" → \"springroll_feedback_submit\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":324,"tokensAfter":324},{"name":"springroll.placement.preview","fixed":{"name":"springroll_placement_preview","description":"Scores where SpringRoll would place this application and what it would cost, without deploying or writing anything. It shares its implementation with springroll.deploy, so the receipt it returns is what a deploy right now would decide: the provider and plan, the estimated monthly cost range, every limit the plan carries, what was inferred rather than declared, and why each other candidate lost.\n\nIt works before any provider account is connected. The ranking is computed from the public catalog al","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["application","context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"placement":{"type":"object","properties":{"needs":{"type":"array","items":{"enum":["static","serverless","server","container","database","postgres","auth","storage","realtime","edge-functions"],"type":"string"},"description":"Everything this application needs, in one list. At most one shape of thing being run ('static', 'serverless', 'server', or 'container'), plus any services it needs beside its own code: 'postgres', 'auth', 'storage', 'realtime', 'edge-functions'. A provider that cannot supply an entry is excluded, so ask only for what the app actually uses, and leave the shape out unless the project does something the source does not show."},"region":{"type":"string","maxLength":64,"description":"A required region, when the data has to stay somewhere specific."},"memoryMb":{"type":"integer","maximum":9007199254740991,"minimum":0},"storageGb":{"type":"number","minimum":0,"description":"Persistent disk needed, in gigabytes."},"computeVcpu":{"type":"number","minimum":0,"description":"Sustained vCPU. Fractional is normal."},"monthlyUsage":{"type":"object","properties":{"kv":{"type":"object","properties":{"lists":{"type":"integer","maximum":1000000000000000,"minimum":0},"reads":{"type":"integer","maximum":1000000000000000,"minimum":0},"writes":{"type":"integer","maximum":1000000000000000,"minimum":0},"deletes":{"type":"integer","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"build":{"type":"object","properties":{"starts":{"type":"integer","maximum":1000000000000000,"minimum":0},"minutes":{"type":"number","maximum":1000000000000000,"minimum":0},"activeCpuHours":{"type":"number","maximum":1000000000000000,"minimum":0},"dataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactDataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactStorageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"registryStorageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactSimpleOperations":{"type":"integer","maximum":1000000000000000,"minimum":0},"provisionedMemoryGbHours":{"type":"number","maximum":1000000000000000,"minimum":0},"artifactAdvancedOperations":{"type":"integer","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"cache":{"type":"object","properties":{"commands":{"type":"integer","maximum":1000000000000000,"minimum":0},"dataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"worker":{"type":"object","properties":{"cpuMilliseconds":{"type":"number","maximum":1000000000000000,"minimum":0},"dispatchRequests":{"type":"integer","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"runtime":{"type":"object","properties":{"invocations":{"type":"integer","maximum":1000000000000000,"minimum":0},"activeCpuHours":{"type":"number","maximum":1000000000000000,"minimum":0},"originTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"provisionedMemoryGbHours":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"database":{"type":"object","properties":{"rowsRead":{"type":"integer","maximum":1000000000000000,"minimum":0},"rowsWritten":{"type":"integer","maximum":1000000000000000,"minimum":0},"computeCuHours":{"type":"number","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"extraBranchHours":{"type":"number","maximum":1000000000000000,"minimum":0},"extraBranchMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"publicDataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"restoreHistoryGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"snapshotStorageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"container":{"type":"object","properties":{"egressNaEuGb":{"type":"number","maximum":1000000000000000,"minimum":0},"egressOtherGb":{"type":"number","maximum":1000000000000000,"minimum":0},"billedVcpuSeconds":{"type":"number","maximum":1000000000000000,"minimum":0},"billedDiskGbSeconds":{"type":"number","maximum":1000000000000000,"minimum":0},"billedMemoryGibSeconds":{"type":"number","maximum":1000000000000000,"minimum":0},"egressOceaniaKoreaTaiwanGb":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"durableObject":{"type":"object","properties":{"rowsRead":{"type":"integer","maximum":1000000000000000,"minimum":0},"rowsWritten":{"type":"integer","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"billableRequests":{"type":"integer","maximum":1000000000000000,"minimum":0},"durationGbSeconds":{"type":"number","maximum":1000000000000000,"minimum":0}},"additionalProperties":false},"objectStorage":{"type":"object","properties":{"dataTransferGb":{"type":"number","maximum":1000000000000000,"minimum":0},"storageGbMonths":{"type":"number","maximum":1000000000000000,"minimum":0},"simpleOperations":{"type":"integer","maximum":1000000000000000,"minimum":0},"advancedOperations":{"type":"integer","maximum":1000000000000000,"minimum":0}},"additionalProperties":false}},"description":"Optional monthly billing quantities supplied by the user or actual usage evidence. Never invent values or default missing fields to zero. CPU-hours mean active CPU time; memory GB-hours include billable wait time and provider minimums. Build minutes do not substitute for Sandbox CPU/memory. Database and object storage are separate from local disk. Cloudflare Worker dispatch requests and CPU are separate from container active vCPU, provisioned memory, disk and regional egress. Rows read/written mean billed rows including indexes, not SQL query counts. Cache commands include internal operations and realtime polling. On redeploy this replaces the previous monthlyUsage forecast; omit the whole object to keep it.","additionalProperties":false},"needsWebSockets":{"type":"boolean","description":"Set true if the app holds a live connection. Inferred from the dependency list otherwise, and getting it wrong puts the app on a runtime that drops the socket on every request."},"budgetUsdPerMonth":{"type":"number","minimum":0,"description":"A real ceiling, if the user gave one. Leave it out otherwise: a budget of zero that nobody asked for would exclude every qualified plan with a non-zero estimate."},"coldStartTolerant":{"type":"boolean","description":"False if the first visitor after an idle period must not wait. Set this when the user says the app has to be instant; it excludes plans that sleep, which are otherwise the cheapest ones."},"productionCritical":{"type":"boolean","description":"Whether a colleague depends on this during their working day. Defaults to true for production and false elsewhere."},"expectedBandwidthGb":{"type":"number","minimum":0,"description":"Egress in gigabytes a month. Only if the user told you."},"needsBackgroundWork":{"type":"boolean","description":"Set true if the app runs jobs or a scheduler outside a request."},"needsPersistentDisk":{"type":"boolean","description":"Set true if the app writes files it expects to read back later."},"expectedRequestsPerMonth":{"type":"integer","maximum":9007199254740991,"minimum":0,"description":"Only if the user actually told you. Do not estimate: an invented number is indistinguishable from a measured one once it gets here, and SpringRoll's own default for an internal tool is more honest than a guess."}},"description":"Optional, provider-neutral hints about what this application needs. SpringRoll chooses the provider and plan; these only inform that choice. Leave out anything you do not actually know: monthly billing quantities remain unknown; ordinary workload hints are inferred from the source and named on the placement receipt, which is more useful to the user than a confident guess.","additionalProperties":false},"application":{"type":"string","minLength":1,"description":"Application slug or id."},"environmentType":{"enum":["development","uat","production"],"type":"string","description":"Environment class to score for. Defaults to production, which is the strictest: plans published as unsuitable for production are excluded there."}}},"annotations":{"title":"Preview a placement","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Preview a placement"},"changes":[{"kind":"name","detail":"Renamed \"springroll.placement.preview\" → \"springroll_placement_preview\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":2698,"tokensAfter":2698},{"name":"springroll.policy.check","fixed":{"name":"springroll_policy_check","description":"Reports which governance policies an application would pass or fail for an environment.\n\nSend `manifest` (YAML or JSON) to validate a document without creating anything. Call this before springroll.deploy to avoid a rejected submission. Read the `springroll://manifest/example` resource for the document's shape.\n\nSend `application` instead to explain why an existing application cannot deploy or promote to `environmentType`, with specific remediation for each failing rule. Call this when a deploym","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["context"],"properties":{"context":{"type":"string","description":"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""},"manifest":{"type":"string","minLength":10,"description":"The manifest document, as YAML or JSON. Mutually exclusive with `application`."},"releaseId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Release to evaluate. Only meaningful with `application`."},"application":{"type":"string","minLength":1,"description":"An existing application to explain. Mutually exclusive with `manifest`."},"environmentType":{"enum":["development","uat","production"],"type":"string","description":"Environment to evaluate against. Defaults to production."}}},"annotations":{"title":"Check governance policy","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Check governance policy"},"changes":[{"kind":"name","detail":"Renamed \"springroll.policy.check\" → \"springroll_policy_check\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":550,"tokensAfter":550}],"toolsChanged":21,"tokensSaved":0,"todo":[{"tool":"springroll_app_list","params":["limit","search"]},{"tool":"springroll_app_presentation_generate_icon","params":["purpose","application"]},{"tool":"springroll_app_presentation_get","params":["application"]},{"tool":"springroll_app_presentation_save","params":["draft","revision","application"]},{"tool":"springroll_app_presentation_upload","params":["kind","base64","application"]},{"tool":"springroll_app_record_prompts","params":["agentName","modelName","releaseId","inputTokens","outputTokens"]},{"tool":"springroll_app_update","params":["tags","iconUrl","department","description","supportContact","dataClassification"]},{"tool":"springroll_approval_get","params":["approvalRequestId"]},{"tool":"springroll_approval_submit","params":["requestType"]},{"tool":"springroll_connect_access_status","params":["grantId"]},{"tool":"springroll_deploy","params":["name","slug","tags","framework","department","description","buildCommand","filesEncoding","repositoryUrl","rootDirectory","installCommand","outputDirectory","dataClassification"]},{"tool":"springroll_deploy_status","params":["deploymentId"]},{"tool":"springroll_feedback_list","params":["limit","offset"]},{"tool":"springroll_feedback_submit","params":["message","category","idempotencyKey"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}