Skip to main content
Glama

Preview a placement

springroll.placement.preview
Read-onlyIdempotent

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.

Input Schema

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / placement / properties / monthlyUsage / properties / database / properties / extraBranchHours
      Added value: +{
      +  "maximum": 1000000000000000,
      +  "minimum": 0,
      +  "type": "number"
      +}
  2. Changed4 schema 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"
      +}
  3. Changed2 schema 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"
      +}
  4. Changed3 schema 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"
      +}
  5. Changed2 schema 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"
      +}
  6. Changed5 schema 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"
      +}
  7. Changed2 schema 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"
      +}
  8. Changed1 schema 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"
      +]
  9. Changed1 schema 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."
  10. Changed3 schema 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"
      -}
  11. Added

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources