Skip to main content
Glama

Server Details

Register, deploy, review, and govern internal applications built with coding agents.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
95.2% over 57 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.2/5.0

Scored across 21 tools

Disambiguation5/5

Tools are cleanly partitioned into distinct subsystems (app, approval, connect, deploy, feedback, placement, policy), and within each the resource+action differs clearly (app.get vs app.list vs app.update, deploy vs deploy.promote vs deploy.status). Even seemingly overlapping pairs like connect.data_products/connect.request_access and policy.check vs deploy are separated by explicit 'read vs act' vs 'preview vs execute' descriptions.

Naming Consistency4/5

The set follows a predictable dotted namespace of resource.action (app.get, approval.submit, connect.request_access, deploy.promote) with consistent verb-noun tails. Minor deviations exist where top-level single-word names are used (springroll.context, springroll.deploy, springroll.policy.check) that break the strict subsystem.action shape.

Tool Count4/5

At 21 tools this sits at the heavy end, but the server spans a genuinely broad platform surface (app registry, presentation, prompts, approvals, data access, deployment, placement, policy, feedback), so most tools map to a distinct capability rather than redundancy. Slightly over-scoped but each tool is defensible.

Completeness4/5

The surface covers most lifecycle stages: registry (get/list/update), presentation drafts, approvals, data-access grants, deploy/promote/status, policy checks, placement preview, and feedback. Gaps are minor — no direct create/delete for apps (registration is folded into deploy, retirement/ownership handled through approval.submit) and approval decisions are deliberately human-only.

Available Tools

21 tools
springroll.app.getGet an applicationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
includeNoSections to return. Defaults to all of them.
applicationYesApplication slug or id.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines4/5

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 applicationsA
Read-onlyIdempotent
Inspect

Lists applications in this organization, newest first. Use search to find one by name or slug.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
searchNo
contextYesExplain 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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.presentation.generate_iconPrepare an app icon draftA
Idempotent
Inspect

Queue one premium icon draft from the app's reviewed purpose. Requests are limited and deduplicated. Artwork never blocks deployment or publishes itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
purposeYes
applicationYes
idempotencyKeyYesRequired. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate.

TDQS

A3.9/5.0
Behavior4/5

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

The description adds meaningful behavior beyond the annotations: requests are 'limited and deduplicated,' and artwork 'never blocks deployment or publishes itself.' It does not cover failure modes or asynchronous completion, but given the annotations already establish idempotency and non-destructiveness, this is strong additional context.

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

Conciseness5/5

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

Three terse sentences front-load the core action, then add constraint and safety context; every sentence earns its place. There is no redundant restatement of the title or schema.

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

Completeness3/5

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

For a 4-required-parameter tool with no output schema, the description explains purpose, limitation, deduplication, and non-blocking behavior, which is enough to invoke correctly. It does not mention the response/result or how to retrieve the queued draft, leaving a small gap an agent may need to infer from sibling tools.

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

Parameters3/5

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

Schema descriptions cover context and idempotencyKey thoroughly, while application and purpose are bare in the schema. The description only indirectly maps to parameters via 'app's reviewed purpose' and 'deduplicated,' adding marginal meaning without value constraints, examples, or format details.

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

Purpose5/5

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

The description opens with a specific verb and object, 'Queue one premium icon draft,' and anchors it to 'the app's reviewed purpose.' This makes the operation distinct from sibling save/upload/deploy tools by emphasizing 'draft' and explicitly stating that it never publishes itself.

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

Usage Guidelines3/5

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

The wording implies when it should be used: when a non-blocking, premium icon draft is needed from an app's reviewed purpose. 'Artwork never blocks deployment or publishes itself' hints that this tool is not the final save/upload/deploy step, but no alternative tools are named and no explicit when-not-to-use conditions are stated.

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

springroll.app.presentation.getRead app presentation draftA
Read-onlyIdempotent
Inspect

Read a private app listing draft and available artwork. Does not publish or expose the app.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
applicationYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds meaningful context: the resource is a private draft and the call does not publish or expose the app. This goes beyond the annotation hints, though it does not cover authentication or return behavior.

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

Conciseness5/5

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

Two short sentences with no filler. The action and resource are front-loaded, and the second sentence adds a useful non-goal clarification without redundancy.

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

Completeness4/5

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

For a simple read-only tool with strong annotations, the description is mostly sufficient: it identifies what is read and what side effects are avoided. The lack of an output schema is partially offset by the simplicity, but a brief mention of what is returned would make it fully complete.

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

Parameters2/5

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

The schema covers the 'context' parameter well but leaves 'application' completely undocumented. The tool description does not clarify what 'application' should contain (ID, slug, name, etc.), and with 50% schema coverage this is a significant gap for an agent trying to construct a valid call.

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

Purpose5/5

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

The description names a specific verb ('Read') and resource ('private app listing draft and available artwork'). It also explicitly states what the tool does not do ('Does not publish or expose the app'), which helps distinguish it from publishing, saving, and uploading siblings.

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

Usage Guidelines3/5

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

The intended use case is implied by 'Read a private app listing draft' — it should be used when you need the draft rather than the published app. However, the description names no alternative tools or explicit when-not-to-use conditions, leaving some routing responsibility to the agent.

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

springroll.app.presentation.savePrepare app presentation draftA
Idempotent
Inspect

Save listing copy and selected image IDs to a private draft. Read the revision first. Use factual copy and real, reviewed screenshots. Only the owner or admin can publish in SpringRoll.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftYes
contextYesExplain 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."
revisionYes
applicationYes

TDQS

A3.7/5.0
Behavior4/5

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

No contradiction with annotations: 'Save' aligns with readOnlyHint=false, and draft-saving matches destructiveHint=false and idempotentHint=true. Adds value beyond annotations by disclosing 'private draft' visibility, the revision-read precondition, and the owner/admin publishing boundary. Doesn't state what happens to an existing draft (overwrite vs append), but idempotency is already flagged in annotations.

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

Conciseness5/5

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

Four sentences, each earning its place: core purpose first, then prerequisite, content-quality guideline, and permission boundary. No fluff, no repetition of schema or annotation data. Ideal front-loading for an agent scanning quickly.

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

Completeness3/5

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

Covers purpose, precondition, content quality, and permission. But with no output schema, the return behavior is unstated, and the `application` parameter meaning is absent. The nested draft structure is reasonably left to schema. For a 4-required-param tool without an output schema, some return-value guidance would round it out.

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

Parameters3/5

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

Schema description coverage is only 25% (context is the sole described param). The description maps 'listing copy' to the draft object's name/tagline/description fields, 'image IDs' to iconAssetId and screenshots[].assetId, and references the revision param. But the `application` parameter is left unexplained in both schema and description, and draft field details are deferred to the schema.

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

Purpose4/5

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

States a specific verb+resource: 'Save listing copy and selected image IDs to a private draft.' The 'private draft' phrase clearly differentiates from presentation.upload and presentation.get siblings. However, it doesn't explicitly name or contrast those siblings, so it stops short of a 5.

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

Usage Guidelines3/5

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

Provides execution context: 'Read the revision first' establishes a prerequisite, and 'Use factual copy and real, reviewed screenshots' sets content-quality expectations. But it offers no explicit when-to-use vs alternative guidance (e.g., when to pick this over presentation.upload), so the routing burden is left to the agent.

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

springroll.app.presentation.uploadUpload app presentation imageA
Idempotent
Inspect

Upload a real screenshot or app icon as base64 PNG, JPEG, or WebP (8 MB maximum). Metadata is stripped. Images remain private until selected in an owner-published snapshot. Never upload confidential screen content.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
base64Yes
contextYesExplain 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."
applicationYes
idempotencyKeyYesRequired. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate.

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the annotations, the description discloses that metadata is stripped, that images remain private until selected in an owner-published snapshot, and that confidential content should never be uploaded. This adds meaningful behavioral context without contradicting 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.

Conciseness5/5

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

The description is tight and front-loaded, with each sentence adding a distinct piece of information: what to upload, format/size constraints, metadata handling, privacy behavior, and a warning. There is no filler.

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

Completeness3/5

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

It covers the most important input semantics and privacy expectations, but it omits what the 'application' parameter should contain and gives no indication of the response or follow-up result. Given there is no output schema, these gaps leave the agent with some uncertainty.

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

Parameters3/5

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

The prose gives useful meaning for base64 (allowed formats, size limit) and kind (screenshot vs icon), which the schema only partially conveys. However, the required 'application' parameter is left unexplained, and the low schema coverage means the description does not fully compensate for all parameters.

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

Purpose5/5

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

The description states a specific action — uploading a real screenshot or app icon — with explicit formats and size limits. It clearly distinguishes this tool from the sibling generate_icon by emphasizing that the upload must be a real image.

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

Usage Guidelines4/5

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

It clearly indicates this is the path for uploading actual screenshots or icons, and it sets a firm exclusion by warning against confidential content. However, it does not explicitly name alternatives such as generate_icon or state exact conditions for choosing between them.

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 transcriptA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
turnsYesUp to 50 turns per call, in order.
contextYesExplain 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."
agentNameNo
modelNameNo
releaseIdNo
sessionKeyYesStable identifier for this build conversation.
applicationYesApplication slug or id.
inputTokensNo
outputTokensNo
idempotencyKeyYesRequired. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate.
startTurnIndexNoWhere this batch starts. Defaults to after the last recorded turn.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description opens with a specific verb 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.

Usage Guidelines5/5

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 requestA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
approvalRequestIdYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 requestA
Idempotent
Inspect

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, and targetEnvironmentType to 'production'. Once approved, call springroll.deploy.promote. • UAT_PROMOTION: targetEnvironmentType is required, 'uat' (or 'development' where Development needs approval). An approval only unlocks the environment it names. • UAT_SIGN_OFF: targetEnvironmentType defaults to 'uat'. • ROLLBACK: justification and targetEnvironmentType (the environment to roll back) are required. Put the deployment to restore in payload.targetDeploymentId; it defaults to the last successful one. • RETIREMENT: justification is required. • Every other type takes no targetEnvironmentType.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
payloadNoType-specific detail, e.g. { visibility: 'TENANT' }, { newOwnerMembershipId: '…' }, or { targetDeploymentId: '…' } for a rollback.
releaseIdNoRelease this concerns. For PRODUCTION_PROMOTION, defaults to the latest release.
applicationYesApplication slug or id.
requestTypeYes
justificationNoWhy this should happen. Shown to reviewers. Required for ROLLBACK and RETIREMENT, and at least 10 characters when required.
idempotencyKeyYesRequired. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate.
targetEnvironmentTypeNoCanonical environment class. SpringRoll promotes development -> uat -> production.

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations: 'An agent may submit but never decide', a human approver is required, an agent cannot approve its own request, and it creates review work for named people. It also clarifies that PRODUCTION_PROMOTION does not deploy, which is exactly the kind of side-effect transparency that prevents misuse of a mutation tool.

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

Conciseness5/5

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

Front-loads the core constraint (submit but never decide) and the confirm-with-user warning, then organizes type-specific behavior into scannable bullets. Length is justified by eight request types and eight parameters; every sentence carries actionable content.

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

Completeness5/5

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

For a mutation tool with no output schema and a nested payload object, the description covers the missing pieces: what the call produces (review work, not a deployment), the human-approval gate, and the follow-up call to springroll.deploy.promote. Nothing an agent needs to call it correctly is absent.

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

Parameters5/5

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

Despite 88% schema coverage, the description adds conditional, cross-parameter semantics the schema cannot express: defaults for releaseId and targetEnvironmentType, which types require justification, that UAT_PROMOTION requires targetEnvironmentType, and that the ROLLBACK deployment goes in payload.targetDeploymentId defaulting to the last successful one.

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

Purpose5/5

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

States a specific verb and resource ('Submits an approval request') and enumerates all eight supported request types, so the agent knows exactly what it creates. It is clearly distinguishable from siblings like springroll.approval.get and 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.

Usage Guidelines5/5

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

Explicitly states when to use it versus the alternative ('this does NOT deploy... Once approved, call springroll.deploy.promote'), and gives a hard usage constraint plus a prerequisite ('Confirm with the user before calling this'). Decision rules are spelled out per request type rather than left to inference.

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 metadataA
Idempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
contextYesExplain 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."
iconUrlNo
departmentNo
applicationYesApplication slug or id.
descriptionNo
supportContactNo
dataClassificationNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 statusA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
grantIdYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 products
Read-onlyIdempotent
Inspect

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, which query capabilities a source supports) 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
dataProductNoData product slug. Omit to list every product this organization publishes.
springroll.connect.request_accessRequest data product accessA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesQualified field names to request, as `dataset.field`. Ask for what the application actually reads, because a narrower request is approved faster and survives review.
contextYesExplain 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."
purposeNoWhy the application needs this data. Shown to the data owner.
applicationYesApplication slug or id.
dataProductYesData product slug from springroll.connect.data_products.
environmentTypeYesCanonical environment class. SpringRoll promotes development -> uat -> production.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose5/5

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

The description opens with a specific verb 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.

Usage Guidelines4/5

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 contextA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 projectA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoBranch, tag, or full commit SHA. Defaults to the app's default revision.
nameNo
slugNo
tagsNo
filesNoPath-to-contents map. Use `archive` for anything beyond a few files.
archiveNoBase64 of a gzipped tar of the project source. Preferred over `files`.
contextYesExplain 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."
manifestNoA SpringRoll manifest. Supersedes the metadata fields below; the source fields still apply.
frameworkNo
placementNoOptional, 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.
departmentNo
applicationNoAn existing app's slug or id. Omit on the first ship; `name` implies it.
descriptionNo
waitSecondsNoHow long to wait for the build before returning. Defaults to 20. A real build usually outlasts this; poll springroll.deploy.status after.
buildCommandNo
preferSourceNoTie-breaker when both a repository and files are given. Defaults to git.
filesEncodingNo
repositoryUrlNo
rootDirectoryNo
idempotencyKeyYesRequired. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate.
installCommandNo
supportContactNoTeam channel or email for users of this app. Required before production.
outputDirectoryNo
dataClassificationNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 deploymentA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
deploymentIdYesThe tested deployment to promote.
idempotencyKeyYesRequired. A stable, caller-generated key. Retrying with the same key returns the original result instead of creating a duplicate.
targetEnvironmentTypeYesCanonical environment class. SpringRoll promotes development -> uat -> production.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
logLimitNoHow many log lines to return, counting from the end. Defaults to 200.
includeLogsNoInclude build and deploy log lines. Defaults to false.
deploymentIdYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.feedback.listRead your feedbackA
Read-onlyIdempotent
Inspect

List only the authenticated member's SpringRoll feedback in the current organization, newest first. Use nextOffset for the next page.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
contextYesExplain 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

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so safety is covered. The description adds real behavioral context beyond them: the result set is scoped to the authenticated member and current organization, and results come back newest first, plus a pagination pointer. It stops short of describing rate limits or total counts.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the scope constraint and then the pagination instruction. No filler, nothing redundant with the title.

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

Completeness3/5

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

For a read-only list tool with annotations covering the safety profile and no output schema, the description is nearly sufficient. However, it references 'nextOffset' as a response field the agent cannot see anywhere in the input schema, and leaves limit/offset unexplained, creating a small but real ambiguity about pagination.

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

Parameters2/5

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

Schema coverage is only 33%: the long 'context' description comes from the schema, while limit and offset carry no documentation anywhere. The description's mention of 'nextOffset' loosely gestures at pagination but never explains limit/offset semantics or their bounds, so it does not compensate for the coverage gap.

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

Purpose5/5

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

States a specific verb (List) and resource (SpringRoll feedback) with precise scope: the authenticated member's own feedback within the current organization. The scope wording implicitly separates it from springroll.feedback.submit, so an agent can pick it without opening the schema.

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

Usage Guidelines3/5

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

The description implies a read/list use case and gives one operational hint ('Use nextOffset for the next page'), but never states when to prefer this over alternatives or any preconditions. There is no explicit when/when-not guidance, so usage is only implied.

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

springroll.feedback.submitSend feedbackA
Idempotent
Inspect

Submit a bug report, idea, or other feedback about SpringRoll on behalf of the authenticated member. Do not include credentials. Reuse the idempotency key when retrying the same submission.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
messageYes
categoryYes
idempotencyKeyYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the mutation, idempotency, open-world, and non-destructive profile. The description adds value beyond them by warning against including credentials and clarifying retry semantics tied to the idempotency key, though it says nothing about what a successful submission returns or rate limits.

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

Conciseness5/5

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

Three short sentences, front-loaded with purpose followed by the two key constraints. Every sentence carries operational value with no repetition or filler.

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

Completeness4/5

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

For a four-parameter mutation tool with no output schema, the description plus rich annotations cover the safety and retry picture an agent needs. Minor gaps remain around the category values and expected outcome, but the core call path is well specified.

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

Parameters3/5

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

Schema coverage is 25%, so the description must compensate, but it only implicitly illuminates idempotencyKey behavior. It offers no guidance on the category enum values or the message content/length constraints beyond the schema's own bounds.

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

Purpose5/5

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

States a specific verb (submit) and resource (bug report, idea, or other feedback) scoped to the authenticated member, which cleanly distinguishes it from the read-only sibling springroll.feedback.list. An agent can identify the tool's operation without opening the schema.

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

Usage Guidelines4/5

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

Gives actionable context: exclude credentials and reuse the idempotency key when retrying the same submission. It does not name the complementary sibling (feedback.list) or state explicit when-not conditions, so it falls short of full routing guidance.

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 placementA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
placementNoOptional, 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.
applicationYesApplication slug or id.
environmentTypeNoEnvironment class to score for. Defaults to production, which is the strictest: plans published as unsuitable for production are excluded there.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 policyA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesExplain 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."
manifestNoThe manifest document, as YAML or JSON. Mutually exclusive with `application`.
releaseIdNoRelease to evaluate. Only meaningful with `application`.
applicationNoAn existing application to explain. Mutually exclusive with `manifest`.
environmentTypeNoEnvironment to evaluate against. Defaults to production.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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

The description opens with a specific verb 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.

Usage Guidelines5/5

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.

  1. 2 tool updates
    • Addedspringroll.feedback.list
    • Addedspringroll.feedback.submit
  2. 4 tool updates
    • Addedspringroll.app.presentation.generate_icon
    • Addedspringroll.app.presentation.get
    • Addedspringroll.app.presentation.save
    • Addedspringroll.app.presentation.upload
  3. 2 tool updates
    • Changedspringroll.deploy1 field changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchHours
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedspringroll.placement.preview1 field changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchHours
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
  4. 2 tool updates
    • Changedspringroll.deploy4 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / publicDataTransferGb
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / restoreHistoryGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / snapshotStorageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedspringroll.placement.preview4 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / publicDataTransferGb
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / restoreHistoryGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / snapshotStorageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
  5. 2 tool updates
    • Changedspringroll.deploy2 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / cache / properties / dataTransferGb
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / cache / properties / storageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedspringroll.placement.preview2 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / cache / properties / dataTransferGb
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / cache / properties / storageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
  6. 2 tool updates
    • Changedspringroll.deploy3 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactAdvancedOperations
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactDataTransferGb
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactSimpleOperations
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedspringroll.placement.preview3 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactAdvancedOperations
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactDataTransferGb
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactSimpleOperations
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
  7. 2 tool updates
    • Changedspringroll.deploy2 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactStorageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / registryStorageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedspringroll.placement.preview2 fields changed
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / artifactStorageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / build / properties / registryStorageGbMonths
        Added value: +{
        +  "maximum": 1000000000000000,
        +  "minimum": 0,
        +  "type": "number"
        +}
  8. 2 tool updates
    • Changedspringroll.deploy5 fields changed
      • changedInput schema / properties / placement / properties / monthlyUsage / description
        Previous 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."
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / container
        Added 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"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / durableObject
        Added 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"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / kv
        Added 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"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / worker
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cpuMilliseconds": {
        +      "maximum": 1000000000000000,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "dispatchRequests": {
        +      "maximum": 1000000000000000,
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedspringroll.placement.preview5 fields changed
      • changedInput schema / properties / placement / properties / monthlyUsage / description
        Previous 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."
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / container
        Added 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"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / durableObject
        Added 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"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / kv
        Added 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"
        +}
      • addedInput schema / properties / placement / properties / monthlyUsage / properties / worker
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cpuMilliseconds": {
        +      "maximum": 1000000000000000,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "dispatchRequests": {
        +      "maximum": 1000000000000000,
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
  9. 2 tool updates
    • Changedspringroll.deploy2 fields changed
      • changedInput schema / properties / placement / description
        Previous 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."
      • addedInput schema / properties / placement / properties / monthlyUsage
        Added 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"
        +}
    • Changedspringroll.placement.preview2 fields changed
      • changedInput schema / properties / placement / description
        Previous 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."
      • addedInput schema / properties / placement / properties / monthlyUsage
        Added 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"
        +}
  10. 2 tool updates
    • Changedspringroll.deploy1 field changed
      • changedInput schema / properties / placement / properties / needs / items / enum
        Previous value: -[
        -  "static",
        -  "serverless",
        -  "server",
        -  "container",
        -  "postgres",
        -  "auth",
        -  "storage",
        -  "realtime",
        -  "edge-functions"
        -]New value: +[
        +  "static",
        +  "serverless",
        +  "server",
        +  "container",
        +  "database",
        +  "postgres",
        +  "auth",
        +  "storage",
        +  "realtime",
        +  "edge-functions"
        +]
    • Changedspringroll.placement.preview1 field changed
      • changedInput schema / properties / placement / properties / needs / items / enum
        Previous value: -[
        -  "static",
        -  "serverless",
        -  "server",
        -  "container",
        -  "postgres",
        -  "auth",
        -  "storage",
        -  "realtime",
        -  "edge-functions"
        -]New value: +[
        +  "static",
        +  "serverless",
        +  "server",
        +  "container",
        +  "database",
        +  "postgres",
        +  "auth",
        +  "storage",
        +  "realtime",
        +  "edge-functions"
        +]
  11. 2 tool updates
    • Changedspringroll.deploy1 field changed
      • changedInput schema / properties / placement / properties / budgetUsdPerMonth / description
        Previous 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."
    • Changedspringroll.placement.preview1 field changed
      • changedInput schema / properties / placement / properties / budgetUsdPerMonth / description
        Previous 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."
  12. 2 tool updates
    • Changedspringroll.deploy3 fields changed
      • addedInput schema / properties / placement / properties / needs
        Added 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"
        +}
      • removedInput schema / properties / placement / properties / requiredCapabilities
        Removed 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"
        -}
      • removedInput schema / properties / placement / properties / workloadClass
        Removed 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"
        -}
    • Changedspringroll.placement.preview3 fields changed
      • addedInput schema / properties / placement / properties / needs
        Added 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"
        +}
      • removedInput schema / properties / placement / properties / requiredCapabilities
        Removed 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"
        -}
      • removedInput schema / properties / placement / properties / workloadClass
        Removed 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"
        -}
  13. 1 tool update
    • Addedspringroll.placement.preview
  14. 2 tool updates
    • Changedspringroll.connect.request_access1 field changed
      • changedInput schema / properties / fields / description
        Previous 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."
    • Changedspringroll.deploy1 field changed
      • addedInput schema / properties / placement
        Added 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"
        +}
  15. 14 tool updates
    • First observedspringroll.app.get
    • First observedspringroll.app.list
    • First observedspringroll.app.record_prompts
    • First observedspringroll.app.update
    • First observedspringroll.approval.get
    • First observedspringroll.approval.submit
    • First observedspringroll.connect.access_status
    • First observedspringroll.connect.data_products
    • First observedspringroll.connect.request_access
    • First observedspringroll.context
    • First observedspringroll.deploy
    • First observedspringroll.deploy.promote
    • First observedspringroll.deploy.status
    • First observedspringroll.policy.check

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources