SpringRoll
Server Details
Register, deploy, review, and govern internal applications built with coding agents.
- Status
- Healthy
- Uptime
- 92.2% over 37 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 15 tools
Every tool targets a distinct resource and action: app lifecycle, approvals, data access, deployment, placement preview, and policy checking are cleanly separated. Even closely related tools like springroll.deploy, springroll.deploy.promote, and springroll.deploy.status are unambiguous because they operate at clearly different stages.
The dotted lowercase snake_case namespace is consistent and predictable overall. Minor deviations exist: springroll.deploy acts as both a namespace and a verb, springroll.context has no verb, and connect.access_status and connect.data_products are noun-style rather than verb-style.
At 15 tools, the set sits at the upper edge of the ideal range but each tool earns its place. The count reflects the server's broad scope: application management, approvals, data access, deployment, placement, policy, and context.
The core lifecycle is well covered: policy check, placement preview, deploy, status, promote, approval submission, and data access requests all have explicit tools. Some edge operations like executing a retirement, revoking a grant, or carrying out a rollback after approval are only implied through approval types rather than dedicated execution tools, leaving minor gaps.
Available Tools
15 toolsspringroll.app.getGet an applicationARead-onlyIdempotentInspect
Returns an application's registry record: metadata, lifecycle stage, risk score, and whichever of the optional sections you ask for. No secrets are included.
Sections, all returned by default:
• source: repository or uploaded bundle, and cannotBuildReason when a deploy would be refused for want of a source
• history: recent releases and deployments
• status: each environment's current deployment, outstanding approvals, and usage. This answers "where is my app up to?"
• grants: data access grants and dependencies
Pass a narrower include when you only need part of it; each section costs a query.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | No | Sections to return. Defaults to all of them. | |
| application | Yes | Application slug or id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable behavioral detail beyond annotations: 'No secrets are included', all sections are returned by default, and each section costs a query. This gives the agent practical expectations for cost and data scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a clear opening sentence, a scannable bullet list for sections, and a concise closing tip about narrowing include. Every sentence adds value and the most important behavior is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining the return value, and it does so thoroughly for the optional sections. It covers the main output areas and parameter behavior, though the base 'metadata, lifecycle stage, risk score' fields remain somewhat high-level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes further by explaining what each optional section returns and clarifying the include parameter's default behavior, which the schema alone does not convey. It adds real meaning beyond the parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Returns an application's registry record' and enumerates what's inside (metadata, lifecycle stage, risk score, optional sections). It clearly differentiates from siblings like app.list by focusing on a single application's record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: 'This answers "where is my app up to?"' and advises passing a narrower include when only part of the record is needed to save queries. It doesn't explicitly mention alternatives or when not to use the tool, but the guidance is strong enough to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.app.listList applicationsARead-onlyIdempotentInspect
Lists applications in this organization, newest first. Use search to find one by name or slug.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | ||
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is established. The description adds meaningful behavioral context beyond the annotations by specifying 'newest first' and organization scope. It does not enumerate output format or pagination, but the annotations carry the bulk of the transparency burden here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, immediately front-loaded with the core action and scope. 'Use search...' is a helpful addition rather than padding. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation, the description covers the core elements: what is being listed, the scope, ordering, and a search assistant. It does not describe the return shape or pagination, which would be useful, but given the read-only annotations and straightforward nature of the tool, the description is sufficient for an agent to call it independently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, and the description compensates for only one param: 'search' is explained as finding by name or slug. The 'limit' parameter is left entirely to the schema, which only provides numeric constraints, and the 'context' parameter is already documented in the schema. A fuller statement of how limit applies would bring this higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Lists') and resource ('applications in this organization'), and adds key distinguishing behavior: newest-first ordering and a built-in search mechanism. This plainly differentiates it from the sibling tools such as springroll.app.get and springroll.app.update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it lists apps org-wide, newest first, and tells the agent to use the 'search' parameter when looking for a single app by name or slug. It does not explicitly discuss when to prefer this over a sibling tool like get, but the guidance is enough for a straightforward listing operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.app.record_promptsRecord the build transcriptAIdempotentInspect
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.
Ask 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 and cannot be complete. If the conversation contained a real secret, do not record it.
Send turns in order. Keep sessionKey stable across calls for one build so they join up; retrying with the same key and turn indexes overwrites rather than duplicating.
| Name | Required | Description | Default |
|---|---|---|---|
| turns | Yes | Up to 50 turns per call, in order. | |
| context | Yes | 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 | No | ||
| modelName | No | ||
| releaseId | No | ||
| sessionKey | Yes | Stable identifier for this build conversation. | |
| application | Yes | Application slug or id. | |
| inputTokens | No | ||
| outputTokens | No | ||
| idempotencyKey | Yes | Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate. | |
| startTurnIndex | No | Where this batch starts. Defaults to after the last recorded turn. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (which only mark idempotent and non-read-only), the description discloses that the transcript is STORED and READABLE BY ANYONE with access to the application record, that scrubbing of credentials is best-effort, and that retry with the same key and turn indexes overwrites rather than duplicates. This is significant behavioral context for a mutation operation with privacy implications. No contradiction with annotations (idempotentHint matches the overwrite behavior).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three paragraphs each serve a distinct purpose: purpose, privacy/safety, and operational mechanics. No filler sentences; the security caveat and idempotency detail are essential given the tool stores conversation data. Front-loads the action verb in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, 5-required mutation tool with no output schema, the description is unusually complete: it covers user consent, privacy exposure, credential scrubbing limitations, ordering, and idempotency. The only minor omission is the response format, but that is not necessary for correct invocation. An agent has everything it needs to call safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 6 of 11 parameters (55%). The description adds crucial semantics for `sessionKey` (stable across calls for joining), `turns` (send in order, up to 50 per call), and idempotency (same key + turn indexes overwrites), which are not fully captured by the schema. It does not explain the remaining optional analytics parameters (agentName, modelName, releaseId, tokens), but those are self-explanatory and non-critical.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Attaches the conversation that produced this application to its record.' It also states the purpose (reference for maintainers and the approving reviewer), which clearly differentiates it from sibling tools like springroll.app.update or springroll.approval.submit. Title and description align on the same action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly commands 'Ask the user before calling this, every time,' establishing a hard precondition. It gives a when-not condition ('If the conversation contained a real secret, do not record it') and operational usage rules: send turns in order, keep sessionKey stable, and expect overwrite on retry. No sibling tool does the same job, so naming alternatives is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.approval.getGet an approval requestARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, idempotent, and non-destructive behavior. The description adds useful context by disclosing what data is returned and that the tool is meant for polling over time, which goes beyond mere annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The main return behavior is front-loaded, and the polling tip is concise and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description gives a meaningful summary of the response contents and use context. It lacks explicit error/not-found behavior details, but the read-only annotations and simple parameter surface keep this from becoming a major omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents context and provides format-only information for approvalRequestId, while this description gives only an indirect hint that the ID refers to an approval request. It doesn't explain how the ID is obtained or how to pass it correctly, so the parameter guidance is adequate but has a clear gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states that the tool returns a specific approval request including reviewers, decisions, and policy snapshot. It differentiates itself from siblings like approval.submit and general app get/list tools by naming the exact resource and its read-only polling role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance: poll this endpoint to determine whether a release has been approved. It does not explicitly mention when not to use it or name alternative tools, but the intended usage scenario is unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.approval.submitSubmit an approval requestAIdempotentInspect
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.
Confirm with the user before calling this. It creates review work for named people.
Type-specific behaviour:
• PRODUCTION_PROMOTION: this does NOT deploy. It asks. releaseId defaults to the application's latest release. Once approved, call springroll.deploy.promote.
• ROLLBACK: justification is required, and targetEnvironmentType says which environment to roll back. Put the deployment to restore in payload.targetDeploymentId; it defaults to the last successful one.
• RETIREMENT: justification is required.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | No | Type-specific detail, e.g. { visibility: 'TENANT' }, { newOwnerMembershipId: '…' }, or { targetDeploymentId: '…' } for a rollback. | |
| releaseId | No | Release this concerns. For PRODUCTION_PROMOTION, defaults to the latest release. | |
| application | Yes | Application slug or id. | |
| requestType | Yes | ||
| justification | No | Why this should happen. Shown to reviewers. Required for ROLLBACK and RETIREMENT, and at least 10 characters when required. | |
| idempotencyKey | Yes | Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate. | |
| targetEnvironmentType | No | Canonical environment class. SpringRoll promotes development -> uat -> production. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it reveals the human-approval requirement, explicitly forbids agent self-approval, states that this is not a deployment action, and documents type-specific defaults and required fields. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a core workflow constraint up front and a compact bulleted list of type-specific behaviors. Every sentence adds information an agent needs before calling, and there is no redundant restatement of the schema or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with 8 request types, nested payloads, and no output schema, the description covers the most critical operational cautions, defaults, and required fields. However, several supported types (e.g., UAT_PROMOTION, OWNERSHIP_TRANSFER, DOMAIN_CHANGE) lack explicit behavioral guidance, and the description does not indicate what the response contains after submission. These are meaningful but not severe gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so the schema already carries most parameter meaning. The description adds value by explaining type-specific semantics: releaseId defaults to the latest release for PRODUCTION_PROMOTION, targetDeploymentId indicates the deployment to restore for ROLLBACK, and justification is required for ROLLBACK and RETIREMENT. It does not detail payload requirements for every request type, but the schema examples help fill that gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Submits') and resource ('approval request'), enumerates all supported request types, and clearly differentiates this submit action from the sibling approval.get and deploy.promote tools. It leaves no ambiguity about what the tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guardrails: an agent may submit but never decide, user confirmation is required before calling, and it creates review work for named people. It also clarifies that PRODUCTION_PROMOTION does not deploy but merely asks, and directs the agent to call springroll.deploy.promote after approval, which routes away from the wrong sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.app.updateUpdate application metadataAIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| context | Yes | 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 | No | ||
| department | No | ||
| application | Yes | Application slug or id. | |
| description | No | ||
| supportContact | No | ||
| dataClassification | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description adds a meaningful behavioral constraint: visibility is intentionally not editable in this tool, and the reason is an approval requirement. It does not claim any destructive effects and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: it names the resource and fields in the first sentence, then gives the single most important exception in the second. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with low schema coverage and no output schema, the description is somewhat thin. It clearly explains the visibility restriction, which is the most salient domain rule, but it does not clarify whether updates are partial or full replacements, what the response is, or how the less obvious fields like supportContact and department should be valued.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description only restates the field names already visible in the schema: description, icon, tags, department, support contact, and data classification. With schema coverage at only 25%, the description needed to add substantive meaning for the other parameters, but it does not explain formats, value semantics, or the update model. The application and context parameters are left to the schema's sparse notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Updates App Portal metadata') and enumerates the exact fields it affects. It also distinguishes itself by explicitly excluding visibility changes, which separates it from the approval-related sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when not to use this tool: visibility changes are deliberately not editable here, and widening an audience requires an approval request. This gives clear routing guidance toward the approval flow while leaving metadata updates to this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.connect.access_statusGet data access statusARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond that by explaining that approved fields can be narrower than requested and that a row filter may restrict access, which is non-obvious and valuable for interpreting the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured. The first sentence gives the core result and valid statuses; the second adds important caveats without unnecessary detail. Every sentence contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only status tool with this two required parameters, the description is sufficiently complete. The statuses and response-relevant nuance of narrower fields and row filters are covered, and the absence of an output schema is compensated by the explicit field descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description does not compensate by explaining the semantic meaning of grantId. The grantId parameter is only invoked as a UUID pattern with no description tying it to the data access request, and the description never clarifies if that ID originates from request_access or somewhere else.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (returns the status) and the resource (a data access request), and enumerates all possible status values. It adds distinctive detail about approved fields and row filters, which helps separate this status tool from siblings like approval.get or request_access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: this is for checking the status of a data access request. However, the description does not explicitly say when to use it over sibling tools, nor does it mention any prerequisites or next-step alternatives such as request_access or approval.submit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.connect.data_productsList or describe data productsARead-onlyIdempotentInspect
Without dataProduct, lists the governed data products this organization publishes: what each one holds, who owns it, and how sensitive it is.
With 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.
Either way you learn the kind of system behind a product (so you know, for example, that a Notion-backed product cannot aggregate) but never a host, a credential, a table name, or a connection string. Request access with springroll.connect.request_access; a data owner must approve it.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | No | Data product slug. Omit to list every product this organization publishes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate a read-only, idempotent, non-destructive operation, and the description adds meaningful behavioral detail: it returns the kind of source system, explains limitations such as lacking support for aggregation, and states that hosts, credentials, table names, and connection strings are never included. It also notes that access requires a data owner's approval, which goes beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with clear conditional paragraphs for the two invocation modes. Every sentence contributes either core behavior, usage guidance, or a security boundary, and the most important information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing return contents. It specifies list results, product schema details, field sensitivity, glossary information, system kind limitations, and information that will never be exposed. This is enough for an agent to invoke the tool confidently and to decide when to follow up with request_access.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully documented in the schema, so the baseline is high. The description adds real value by explaining exactly what happens when `dataProduct` is omitted versus provided, and why the returned information matters before requesting access. This goes beyond the schema's basic variable slUg description and clarifies what the caller should do with the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the resource, governed data products, and distinguishes two modes: listing all products when `dataProduct` is omitted, and describing a single product's schema when it is supplied. It also references the access-request flow, so the tool's role is clear relative to its sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly explains when to omit `dataProduct`, when to supply it, and instructs the agent to read this description before requesting access. It names the alternative action, springroll.connect.request_access, making the decision boundary between describing data and requesting access explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.connect.request_accessRequest data product accessAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | 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 | Yes | 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 | No | Why the application needs this data. Shown to the data owner. | |
| application | Yes | Application slug or id. | |
| dataProduct | Yes | Data product slug from springroll.connect.data_products. | |
| environmentType | Yes | Canonical environment class. SpringRoll promotes development -> uat -> production. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description reveals the approval workflow, possible narrowing by the owner, lack of readable data before approval, and absence of returned credentials. It also clarifies that the gateway enforces the grant on every request, which is non-obvious behavior an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences front-load the action and scope, then add the approval constraint, access timing, and credential behavior. Every sentence adds information with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter workflow tool, the description covers the request object, approval process, field narrowing, access timing, and credential handling, complementing a 100%-covered schema. It does not mention how the caller learns the request outcome or that springroll.connect.access_status can be used afterward, which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters, including field naming and context. The description reinforces the overall intent ('exact fields') and environment scope but does not add meaning beyond the schema, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Requests access to a data product') and adds the scope 'for one environment' and 'naming the exact fields the application needs.' This clearly identifies the operation and distinguishes it from status or approval sibling tools without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: call this when an application needs a data product's fields, expect an approval step, and know that nothing is readable until approval. It does not explicitly name alternatives like springroll.connect.access_status or when not to call it, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.contextGet SpringRoll contextARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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." |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, open-world, and non-destructive, so the description does not need to restate that. It adds useful behavioral credite by noting it returns identity/permission context and, notably, 'It never returns credentials,' which is important safety context for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences and front-loads the return content first. Every clause adds value: what is returned, when to call it, why it matters, and the important credentials caveat. There is no repetition of annotation data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even with no output schema, the description states the meaningful groups of returned information: organization, identity, permissions, and deployment runtimes. It might have provided slightly more detail about output shape or field names, but for a simple read-only introspection tool the description gives an agent sufficient context for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'context' parameter; the schema explains its exact purpose and length and viewpoint constraints. The description adds no parameter detail, but that is acceptable because the schema already carries the full parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation and resource: it 'Returns the organization, identity, and permissions this agent token acts as, together with the deployment runtimes configured for it.' This is clearly separating context retrieval from app, deployment, and approval tools, although it does not explicitly name which sibling it is being contrasted with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides strong sequencing guidance with 'Call this first' and explains the situational value: 'it tells you which tenant you are in, what you are allowed to do, and whether a deployment can actually land.' It does not explicitly say when not to use it or mention alternative tools such as springroll.policy.check, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.deployDeploy a projectAIdempotentInspect
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.
You do not decide whether this project needs git. Send what you have and SpringRoll works it out:
• a pushed git remote → pass repositoryUrl (and ref if not the default branch)
• no remote, or uncommitted work → pass archive, a base64 tar+gzip of the source:
tar --exclude=node_modules --exclude=.next --exclude=.git --exclude='.env*'
-czf - . | base64 -w0
• both → SpringRoll builds from git, and falls back to your files if the ref cannot be resolved (an unpushed branch, typically)
• neither, on an app that already exists → redeploys its current source
Upload SOURCE, not build output: SpringRoll runs the build. node_modules, .next, dist, build, out, coverage and .log files are dropped automatically and reported. Every .env file and .git/ is REFUSED outright, naming the offending path: configuration belongs in SpringRoll, not in the bundle. Upload limits are about 3 MB compressed on the wire (a platform request-body cap, not a preference), 20 MB expanded, 2000 files, 512 KB per file; a project past them should pass repositoryUrl instead, which SpringRoll clones directly with no size limit. Sending the same files twice is free, because bundles are addressed by content.
Direct to Production skips workflow approvals but keeps production safety checks. Staged applications continue to use explicit promotion and approvals.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Branch, tag, or full commit SHA. Defaults to the app's default revision. | |
| name | No | ||
| slug | No | ||
| tags | No | ||
| files | No | Path-to-contents map. Use `archive` for anything beyond a few files. | |
| archive | No | Base64 of a gzipped tar of the project source. Preferred over `files`. | |
| context | Yes | 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 | No | A SpringRoll manifest. Supersedes the metadata fields below; the source fields still apply. | |
| framework | No | ||
| placement | No | 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. | |
| department | No | ||
| application | No | An existing app's slug or id. Omit on the first ship; `name` implies it. | |
| description | No | ||
| waitSeconds | No | How long to wait for the build before returning. Defaults to 20. A real build usually outlasts this; poll springroll.deploy.status after. | |
| buildCommand | No | ||
| preferSource | No | Tie-breaker when both a repository and files are given. Defaults to git. | |
| filesEncoding | No | ||
| repositoryUrl | No | ||
| rootDirectory | No | ||
| idempotencyKey | Yes | Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate. | |
| installCommand | No | ||
| supportContact | No | Team channel or email for users of this app. Required before production. | |
| outputDirectory | No | ||
| dataClassification | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a mutating, idempotent operation, but the description goes much further: it explains that build output is not accepted, that .env and .git are refused, that upload limits exist, that duplicate bundles are content-addressed, and that production safety checks still apply even when approvals are skipped. This is rich behavioral context well beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the tool is complex and every sentence adds critical information: source selection, exclusions, limits, environment safety, and workflow routing. It is front-loaded with the core process and return behavior, then uses bullets to keep the decision logic scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 24 parameters, no output schema, and significant operational caveats, the description covers the full lifecycle: what gets registered, which source form to send, what is rejected, size limits, build behavior, workflow differences, return values, and how to follow up on an ongoing build. Nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 46%, so the description carries real parameter meaning: it clarifies repositoryUrl, ref, archive, files-as-source, preferSource-like fallback behavior, waitSeconds polling, and the source-vs-build distinction. It does not explain every underspecified parameter, but the most consequential decision parameters are given practical, non-obvious semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear, specific process: register if new, attach source, deploy through the application's workflow, and return a live URL or deployment id. It also distinguishes Direct vs Staged routing, so an agent understands exactly what the tool accomplishes beyond its title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance for the key alternatives: pass repositoryUrl for a pushed git remote, pass archive for local/uncommitted source, send both for fallback behavior, and send neither to redeploy existing source. It also points to springroll.deploy.status for polling and notes that staged applications use explicit promotion and approvals, routing the agent to the right sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.deploy.promotePromote a deploymentAIdempotentInspect
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.
Promotion into an environment that requires approval will be refused until the approval exists. For production, submit the request first.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | Yes | The tested deployment to promote. | |
| idempotencyKey | Yes | Required. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate. | |
| targetEnvironmentType | Yes | Canonical environment class. SpringRoll promotes development -> uat -> production. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing a meaningful behavioral invariant: the already-built artifact is reused, so tested bytes are shipped. It also transparently states that promotion requiring approval will be refused until approval exists. Annotations indicate mutation (readOnlyHint=false) and idempotency, and the description's behavior is consistent; there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs contain only value-adding content: the core behavior, the artifact-reuse guarantee, and the approval-gating caveat. There is no filler or repetition of title or schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, this is complete enough. It covers what happens, notes the approval requirement, advises the correct order for production flows, and leverages the idempotency key behavior already present in the schema. The sibling names further contextualize where it fits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful semantics beyond the schema by explaining that deploymentId should refer to a tested deployment and that targetEnvironmentType must be the 'next' environment in the chain. The idempotencyKey purpose is already well documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb 'promote' with the resource 'deployment' and the precise scope: moving a tested deployment through the environment chain development -> uat -> production. It stands apart from siblings like springroll.deploy.status by describing the actual promotion action and its artifact-reuse behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when a deployment has been tested and should advance environments. It also provides a key precondition for approval-gated environments ('For production, submit the request first') and notes that refused approval will block promotion. It stops short of naming the exact sibling tool, springroll.approval.submit, so alternatives are implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.deploy.statusGet deployment statusARead-onlyIdempotentInspect
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.
Pass 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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | No | How many log lines to return, counting from the end. Defaults to 200. | |
| includeLogs | No | Include build and deploy log lines. Defaults to false. | |
| deploymentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the readOnlyHint and idempotentHint annotations by explaining that the status is refreshed from the runtime provider while the build is in progress. It also discloses the full set of statuses and the log-inclusion behavior, which helps the agent understand what to expect and when to act.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core behavior and status list in the first sentence. Every clause earns its place: refresh behavior, status enumeration, polling guidance, and log usage instructions. There is no redundant or filler language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only status tool with no output schema, the description covers the key return concept, the status vocabulary, the log behavior, and the polling context. It is slightly incomplete in that it does not mention how to obtain the deploymentId, what poll interval to use, or the shape of the log lines, but these are minor given the otherwise rich annotations and schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so most parameters already carry documentation. The description adds useful semantics for includeLogs by calling the logs 'normalised' and advising use after failure, but it does not clarify how to obtain or format deploymentId, which lacks a schema description beyond its UUID pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Returns a deployment's current status' with a specific verb and resource, and goes beyond the title by detailing the refresh behavior and enumerating the possible statuses. This distinguishes it from sibling tools like springroll.deploy.promote and springroll.deploy, which are about action rather than observation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Poll this after deploying rather than assuming success' and advises passing includeLogs when the status is FAILED. It does not explicitly name alternative tools or provide when-not-to-use guidance, but the usage direction is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.placement.previewPreview a placementARead-onlyIdempotentInspect
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.
It works before any provider account is connected. The ranking is computed from the public catalog alone and credentials never affect it: connecting an account changes only whether a plan is deployable, never how it ranks. Each ranked alternative carries its readiness and the action that unlocks it, so you can tell the user both what is recommended and what would deploy today.
Use it to put the cost and the limits in front of the user before deploying, or to ask what-if questions by varying the placement hints.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | No | 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. | |
| application | Yes | Application slug or id. | |
| environmentType | No | Environment class to score for. Defaults to production, which is the strictest: plans published as unsuitable for production are excluded there. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnly, idempotent, and non-destructive, and the description adds that it works before any provider account is connected and that credentials never affect ranking, only deployability. It also explains what the receipt contains, including inferred vs declared attributes and why each candidate lost. This goes well beyond the annotation flags and gives the agent a strong model of side-effect-free behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
At roughly 130 words, the description is long but well-structured: purpose first, then behavioral guarantees, then usage guidance. Every sentence provides new information—credential independence, receipt contents, what-if use—so it is not padded. It could be tightened but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating what the receipt includes: provider, plan, cost range, limits, inferred attributes, and why other candidates lost. It also covers pre-account behavior and readiness/unlock actions per alternative, fully equipping an agent to call it correctly. Nothing essential is missing for a preview-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents every parameter with detailed descriptions, so the baseline is 3. The tool description itself only refers generically to 'placement hints' and does not add meaning to individual parameters. This is acceptable because the schema carries the full weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Scores where SpringRoll would place this application and what it would cost, without deploying or writing anything,' a specific verb, resource, and scope. It explicitly contrasts with springroll.deploy by noting the shared implementation but this tool does not deploy. This makes it clearly distinguishable from every sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says to use it to put cost and limits in front of the user before deploying or to explore what-if variations, providing strong positive guidance. It does not explicitly name springroll.deploy as the alternative when actual deployment is desired, but the repeated 'without deploying' framing makes that inference immediate. An explicit exclusion would push this to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
springroll.policy.checkCheck governance policyARead-onlyIdempotentInspect
Reports which governance policies an application would pass or fail for an environment.
Send 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.
Send 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 deployment is rejected with POLICY_BLOCKED.
Send exactly one of the two.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | 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 | No | The manifest document, as YAML or JSON. Mutually exclusive with `application`. | |
| releaseId | No | Release to evaluate. Only meaningful with `application`. | |
| application | No | An existing application to explain. Mutually exclusive with `manifest`. | |
| environmentType | No | Environment to evaluate against. Defaults to production. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value by stating 'without creating anything,' explaining that application mode provides 'specific remediation for each failing rule,' and pointing to an example resource—behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized and front-loaded with the core purpose. Each paragraph covers one mode with a clear trigger, and the closing 'Send exactly one of the two' eliminates ambiguity. There is no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's two-mode complexity and lack of an output schema, the description covers the essential decision-making context: when to call, what to send, how to avoid blocked deployments, and where to find the manifest shape. A small gap is that it does not describe the report structure, but the schema already documents parameters and defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra semantic value by grouping manifest/application as mutually exclusive modes, clarifying when releaseId is relevant (with application), and referencing the springroll://manifest/example resource for document shape, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Reports which governance policies an application would pass or fail for an environment.' It also clearly separates the two invocation modes (manifest validation vs. application explanation), making its purpose unambiguous and distinguishable from siblings like springroll.deploy or springroll.deploy.promote.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance for both modes: use manifest before springroll.deploy to avoid rejected submissions, and use application when a deployment is rejected with POLICY_BLOCKED. It also states 'Send exactly one of the two,' preventing ambiguous calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
springroll.deploy1 field changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchHoursAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
- Changed
springroll.placement.preview1 field changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchHoursAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
2 tool updates
- Changed
springroll.deploy4 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / publicDataTransferGbAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / restoreHistoryGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / snapshotStorageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
- Changed
springroll.placement.preview4 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / publicDataTransferGbAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / restoreHistoryGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / database / properties / snapshotStorageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
2 tool updates
- Changed
springroll.deploy2 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / cache / properties / dataTransferGbAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / cache / properties / storageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
- Changed
springroll.placement.preview2 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / cache / properties / dataTransferGbAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / cache / properties / storageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
2 tool updates
- Changed
springroll.deploy3 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactAdvancedOperationsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactDataTransferGbAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactSimpleOperationsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" +}
- Changed
springroll.placement.preview3 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactAdvancedOperationsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactDataTransferGbAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactSimpleOperationsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" +}
2 tool updates
- Changed
springroll.deploy2 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactStorageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / registryStorageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
- Changed
springroll.placement.preview2 fields changed- added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactStorageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / build / properties / registryStorageGbMonthsAdded value: +{ + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" +}
2 tool updates
- Changed
springroll.deploy5 fields changed- changed
Input schema / properties / placement / properties / monthlyUsage / descriptionPrevious value: -"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. 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."New value: +"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." - added
Input schema / properties / placement / properties / monthlyUsage / properties / containerAdded value: +{ + "additionalProperties": false, + "properties": { + "billedDiskGbSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "billedMemoryGibSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "billedVcpuSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "egressNaEuGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "egressOceaniaKoreaTaiwanGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "egressOtherGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / durableObjectAdded value: +{ + "additionalProperties": false, + "properties": { + "billableRequests": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "durationGbSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "rowsRead": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "rowsWritten": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / kvAdded value: +{ + "additionalProperties": false, + "properties": { + "deletes": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "lists": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "reads": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "writes": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / workerAdded value: +{ + "additionalProperties": false, + "properties": { + "cpuMilliseconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "dispatchRequests": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" +}
- Changed
springroll.placement.preview5 fields changed- changed
Input schema / properties / placement / properties / monthlyUsage / descriptionPrevious value: -"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. 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."New value: +"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." - added
Input schema / properties / placement / properties / monthlyUsage / properties / containerAdded value: +{ + "additionalProperties": false, + "properties": { + "billedDiskGbSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "billedMemoryGibSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "billedVcpuSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "egressNaEuGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "egressOceaniaKoreaTaiwanGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "egressOtherGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / durableObjectAdded value: +{ + "additionalProperties": false, + "properties": { + "billableRequests": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "durationGbSeconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "rowsRead": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "rowsWritten": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / kvAdded value: +{ + "additionalProperties": false, + "properties": { + "deletes": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "lists": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "reads": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "writes": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" +} - added
Input schema / properties / placement / properties / monthlyUsage / properties / workerAdded value: +{ + "additionalProperties": false, + "properties": { + "cpuMilliseconds": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "dispatchRequests": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" +}
2 tool updates
- Changed
springroll.deploy2 fields changed- changed
Input schema / properties / placement / descriptionPrevious value: -"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: omitted fields are inferred from the source and every inference is named on the placement receipt, which is more useful to the user than a confident guess."New value: +"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." - added
Input schema / properties / placement / properties / monthlyUsageAdded value: +{ + "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. 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.", + "properties": { + "build": { + "additionalProperties": false, + "properties": { + "activeCpuHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "dataTransferGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "minutes": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "provisionedMemoryGbHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "starts": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "cache": { + "additionalProperties": false, + "properties": { + "commands": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "database": { + "additionalProperties": false, + "properties": { + "computeCuHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "rowsRead": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "rowsWritten": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "objectStorage": { + "additionalProperties": false, + "properties": { + "advancedOperations": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "dataTransferGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "simpleOperations": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "runtime": { + "additionalProperties": false, + "properties": { + "activeCpuHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "invocations": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "originTransferGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "provisionedMemoryGbHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + } + }, + "type": "object" +}
- Changed
springroll.placement.preview2 fields changed- changed
Input schema / properties / placement / descriptionPrevious value: -"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: omitted fields are inferred from the source and every inference is named on the placement receipt, which is more useful to the user than a confident guess."New value: +"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." - added
Input schema / properties / placement / properties / monthlyUsageAdded value: +{ + "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. 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.", + "properties": { + "build": { + "additionalProperties": false, + "properties": { + "activeCpuHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "dataTransferGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "minutes": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "provisionedMemoryGbHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "starts": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "cache": { + "additionalProperties": false, + "properties": { + "commands": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "database": { + "additionalProperties": false, + "properties": { + "computeCuHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "rowsRead": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "rowsWritten": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "objectStorage": { + "additionalProperties": false, + "properties": { + "advancedOperations": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "dataTransferGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "simpleOperations": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "storageGbMonths": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "runtime": { + "additionalProperties": false, + "properties": { + "activeCpuHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "invocations": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "integer" + }, + "originTransferGb": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + }, + "provisionedMemoryGbHours": { + "maximum": 1000000000000000, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + } + }, + "type": "object" +}
2 tool updates
- Changed
springroll.deploy1 field changed- changed
Input schema / properties / placement / properties / needs / items / enumPrevious value: -[ - "static", - "serverless", - "server", - "container", - "postgres", - "auth", - "storage", - "realtime", - "edge-functions" -]New value: +[ + "static", + "serverless", + "server", + "container", + "database", + "postgres", + "auth", + "storage", + "realtime", + "edge-functions" +]
- Changed
springroll.placement.preview1 field changed- changed
Input schema / properties / placement / properties / needs / items / enumPrevious value: -[ - "static", - "serverless", - "server", - "container", - "postgres", - "auth", - "storage", - "realtime", - "edge-functions" -]New value: +[ + "static", + "serverless", + "server", + "container", + "database", + "postgres", + "auth", + "storage", + "realtime", + "edge-functions" +]
2 tool updates
- Changed
springroll.deploy1 field changed- changed
Input schema / properties / placement / properties / budgetUsdPerMonth / descriptionPrevious value: -"A real ceiling, if the user gave one. Leave it out otherwise: SpringRoll prefers free plans anyway, and a budget of zero that nobody asked for would exclude every paid plan even when no free one is eligible."New value: +"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."
- Changed
springroll.placement.preview1 field changed- changed
Input schema / properties / placement / properties / budgetUsdPerMonth / descriptionPrevious value: -"A real ceiling, if the user gave one. Leave it out otherwise: SpringRoll prefers free plans anyway, and a budget of zero that nobody asked for would exclude every paid plan even when no free one is eligible."New value: +"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."
2 tool updates
- Changed
springroll.deploy3 fields changed- added
Input schema / properties / placement / properties / needsAdded value: +{ + "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.", + "items": { + "enum": [ + "static", + "serverless", + "server", + "container", + "postgres", + "auth", + "storage", + "realtime", + "edge-functions" + ], + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / placement / properties / requiredCapabilitiesRemoved value: -{ - "description": "Stateful services the app needs beside its own code: postgres, auth, storage, realtime, edge-functions. A provider that does not offer one of these is excluded, so ask only for what the app actually uses.", - "items": { - "enum": [ - "postgres", - "auth", - "storage", - "realtime", - "edge-functions" - ], - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / placement / properties / workloadClassRemoved value: -{ - "description": "The shape of the thing being run. Leave this out unless the project does something the source does not show: a static bundle, an edge or serverless function set, a long-running server, or a container.", - "enum": [ - "static", - "edge", - "serverless", - "server", - "container" - ], - "type": "string" -}
- Changed
springroll.placement.preview3 fields changed- added
Input schema / properties / placement / properties / needsAdded value: +{ + "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.", + "items": { + "enum": [ + "static", + "serverless", + "server", + "container", + "postgres", + "auth", + "storage", + "realtime", + "edge-functions" + ], + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / placement / properties / requiredCapabilitiesRemoved value: -{ - "description": "Stateful services the app needs beside its own code: postgres, auth, storage, realtime, edge-functions. A provider that does not offer one of these is excluded, so ask only for what the app actually uses.", - "items": { - "enum": [ - "postgres", - "auth", - "storage", - "realtime", - "edge-functions" - ], - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / placement / properties / workloadClassRemoved value: -{ - "description": "The shape of the thing being run. Leave this out unless the project does something the source does not show: a static bundle, an edge or serverless function set, a long-running server, or a container.", - "enum": [ - "static", - "edge", - "serverless", - "server", - "container" - ], - "type": "string" -}
1 tool update
- Added
springroll.placement.preview
2 tool updates
- Changed
springroll.connect.request_access1 field changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Qualified field names to request, as `dataset.field`. Ask for what the application actually reads — a narrower request is approved faster and survives review."New value: +"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."
- Changed
springroll.deploy1 field changed- added
Input schema / properties / placementAdded value: +{ + "additionalProperties": false, + "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: omitted fields are inferred from the source and every inference is named on the placement receipt, which is more useful to the user than a confident guess.", + "properties": { + "budgetUsdPerMonth": { + "description": "A real ceiling, if the user gave one. Leave it out otherwise: SpringRoll prefers free plans anyway, and a budget of zero that nobody asked for would exclude every paid plan even when no free one is eligible.", + "minimum": 0, + "type": "number" + }, + "coldStartTolerant": { + "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.", + "type": "boolean" + }, + "computeVcpu": { + "description": "Sustained vCPU. Fractional is normal.", + "minimum": 0, + "type": "number" + }, + "expectedBandwidthGb": { + "description": "Egress in gigabytes a month. Only if the user told you.", + "minimum": 0, + "type": "number" + }, + "expectedRequestsPerMonth": { + "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.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "memoryMb": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "needsBackgroundWork": { + "description": "Set true if the app runs jobs or a scheduler outside a request.", + "type": "boolean" + }, + "needsPersistentDisk": { + "description": "Set true if the app writes files it expects to read back later.", + "type": "boolean" + }, + "needsWebSockets": { + "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.", + "type": "boolean" + }, + "productionCritical": { + "description": "Whether a colleague depends on this during their working day. Defaults to true for production and false elsewhere.", + "type": "boolean" + }, + "region": { + "description": "A required region, when the data has to stay somewhere specific.", + "maxLength": 64, + "type": "string" + }, + "requiredCapabilities": { + "description": "Stateful services the app needs beside its own code: postgres, auth, storage, realtime, edge-functions. A provider that does not offer one of these is excluded, so ask only for what the app actually uses.", + "items": { + "enum": [ + "postgres", + "auth", + "storage", + "realtime", + "edge-functions" + ], + "type": "string" + }, + "type": "array" + }, + "storageGb": { + "description": "Persistent disk needed, in gigabytes.", + "minimum": 0, + "type": "number" + }, + "workloadClass": { + "description": "The shape of the thing being run. Leave this out unless the project does something the source does not show: a static bundle, an edge or serverless function set, a long-running server, or a container.", + "enum": [ + "static", + "edge", + "serverless", + "server", + "container" + ], + "type": "string" + } + }, + "type": "object" +}
14 tool updates
- First observed
springroll.app.get - First observed
springroll.app.list - First observed
springroll.app.record_prompts - First observed
springroll.app.update - First observed
springroll.approval.get - First observed
springroll.approval.submit - First observed
springroll.connect.access_status - First observed
springroll.connect.data_products - First observed
springroll.connect.request_access - First observed
springroll.context - First observed
springroll.deploy - First observed
springroll.deploy.promote - First observed
springroll.deploy.status - First observed
springroll.policy.check
Related MCP Connectors
The cloud for agents. Tools for AI agents to register, build, and deploy other agents. Zero human required.
- SkilderOAuthai.skilder
One place to build, share, and govern the skills and tools your AI agents use at work.
Connect, monitor, and control AI agents — tasks, approvals, schedules, and governance.
Deploy and manage your apps, databases, storage, and scheduled jobs from your AI agent
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceDeterministic AI code review with audit records, providing stack-specific rulesets and governance for coding agents.5MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI coding agents to evaluate actions against team-defined policies, record decisions, and obtain human approvals for potentially risky operations.58 npm1-

corbatofficial
AlicenseAqualityBmaintenancePolicy and quality engine for AI coding agents that enforces team coding standards and provides validation gates for agent-assisted software delivery.734 npm4MIT- AlicenseAqualityAmaintenanceEnforces team knowledge and workflow policies for AI coding agents by providing context, decisions, and gates before code changes are made.153Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.