io.github.toosoontospoon/crate-quote
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.toosoontospoon/crate-quoteWhat's it cost for a 48x30x36 crate to Chicago? Email me at jo@acme.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-services
MCP (Model Context Protocol) tools for several business services, one module per service. Each module is a thin client of that business's own HTTP API: no business logic lives here. The first service is crate, Speed Crate quotes for custom wooden shipping crates.
One server per service, so each can be listed on its own (MCP Registry, Muse Connector Platform), or all services in one server.
Transports: stdio (local clients such as Claude Desktop or Cursor) and streamable HTTP (hosted endpoints).
Official Python MCP SDK 2.x (
MCPServer, which replaced FastMCP),httpxfor the backend APIs.MIT licensed.
Quick start
pip install toosoon-mcp-services # not on PyPI yet: pip install -e ".[test]" from a checkout
export SPEEDCRATE_API_URL=http://127.0.0.1:8080 # the crate API (CustomCrateBuilder speedcrate-api)
toosoon-mcp-services --list # services and their tools
mcp-crate-quote # crate service only, stdio
toosoon-mcp-services --service crate # same
toosoon-mcp-services # every enabled service in one server
toosoon-mcp-services --service crate --transport streamable-http --host 127.0.0.1 --port 8765
# -> http://127.0.0.1:8765/mcp (--stateless for load balancers)Client config (stdio), e.g. Claude Desktop:
{ "mcpServers": { "crate-quote": {
"command": "uvx", "args": ["toosoon-mcp-services", "--service", "crate"],
"env": { "SPEEDCRATE_API_URL": "https://YOUR-CRATE-API" } } } }Related MCP server: SMKlog Parcel Shipping Rates
Configuration
Variable | Meaning |
| Comma list of services to run when |
| Base URL of the service's API (required to call its tools) |
| Optional API key, sent as |
| Request timeout in seconds (default 20) |
|
|
Prefixes: crate = SPEEDCRATE.
Services
crate: Speed Crate quotes (SPEEDCRATE_*)
Calls the CustomCrateBuilder HTTP API (speedcrate-api). Sizes are inside inches. Quotes need the
customer's email. They return only a price range (plus code, sizes, layout and notices) and say the
full quote will be emailed to that address. The API queues the full-quote request; this server sends
no email.
Tool | API call | Access | Sensitive data | Side effects |
|
| write | customer email (PII) | queues a full-quote request; the shop emails the customer |
|
| write | customer email (PII) | same |
|
| read-only | none | none |
|
| read-only | none | none |
|
| read-only | none | none |
|
| read-only | none | none |
The tools carry matching MCP annotations: readOnlyHint is true for the read tools. The quote tools
are readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true.
MCP Registry entries (one per service)
Each service gets its own registry entry and server.json under servers/<registry-name>/. All
entries point at the same PyPI package (toosoon-mcp-services) with a --service <name> package
argument, plus that service's environment variables. The registry checks PyPI ownership by looking for
an mcp-name line with the registry name in the package README (this file). Every service's name
gets its own line at the top of this file.
Service | Registry name | server.json |
crate |
|
|
Publishing (not done yet):
Release the package to PyPI.
mcp-publisher login githubas toosoontospoon.mcp-publisher publish servers/crate-quote/server.json.
mcp-publisher validate servers/crate-quote/server.json passes today.
Hosted endpoint (TODO): no public streamable-HTTP URL exists yet. When there is one, add a
remotes entry ({"type": "streamable-http", "url": "https://<host>/mcp"}) to the service's
server.json. A public deployment also needs TLS in front of it, an allowed Host/Origin list (the SDK's
DNS-rebinding protection), and probably --stateless.
Development
uv venv && uv pip install -e ".[test]"
pytest # unit tests with a mocked API (respx)
CRATE_API_REPO=/path/to/CustomCrateBuilder CRATE_API_PYTHON=/path/to/its/python pytest
# + integration tests against a local uvicorn of the API
SPEEDCRATE_TEST_API_URL=http://127.0.0.1:8080 pytest # or against a running APISee CONTRIBUTING.md to add a service.
Available Tools
6 toolscrate_preview_svgCrate preview drawing (SVG)BRead-onlyIdempotent
Isometric customer preview drawing of a crate, as SVG markup.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | configuration code, e.g. SC-W19-H21.5-L30.75 | |
| dims | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent, closed-world read operation, so safety behavior is covered. The description adds that the output is SVG markup, which is useful, but says nothing about output size, determinism, or what the optional dims flag changes in the drawing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is the right shape for a simple rendering tool. It is close to under-specified rather than over-long, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the SVG return value need not be explained. However, the unexplained dims parameter and the absence of any usage or prerequisite context leave gaps an agent would want filled for a simple two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: the required code parameter is documented with an example format (SC-W19-H21.5-L30.75), but dims has no description anywhere. The description does not compensate by explaining what dims toggles, leaving an undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (crate) and output form (isometric SVG markup), so an agent knows exactly what it produces. It does not explicitly contrast itself with siblings like quote_crate, but no sibling renders drawings, so confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance, e.g. that this is for visual preview only and not for pricing or validation. An agent must infer that from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crate_size_limitsCrate size limitsBRead-onlyIdempotent
Minimum inside size and the standard/tall layout maximums (bigger sizes are oversized: custom quote).
| Name | Required | Description | Default |
|---|---|---|---|
| heavy_floor | No | ||
| forklift_base | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds that oversized sizes fall outside these limits and require a custom quote, which is useful domain context, but it omits units and any behavior tied to the two flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the key content (minimums, layout maximums) first and the escalation note parenthetically. It is appropriately sized, though the telegraphic phrasing leaves terms like 'inside size' slightly ambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. What is missing is parameter meaning and explicit selection guidance, leaving the definition only minimally complete for a tool whose output depends on two unexplained flags.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions heavy_floor or forklift_base. These two boolean flags materially change the returned limits, yet an agent gets no explanation of what they mean or how they affect the answer, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the specific resource returned (minimum inside size, standard/tall layout maximums) rather than restating the name. It gives enough to distinguish this reference-lookup tool from the quoting siblings, especially by noting oversized crates need a custom quote. No verb is stated explicitly, but the content is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage ('bigger sizes are oversized: custom quote') by routing oversized cases elsewhere, which is helpful. However it never states when an agent should call this tool versus quote_crate or crate_preview_svg, so the routing is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
encode_crate_codeEncode a crate codeCRead-onlyIdempotent
Configuration code for inside sizes and options (snapped to 1/16 inch, not raised to the minimum).
| Name | Required | Description | Default |
|---|---|---|---|
| h | Yes | inches (inside) | |
| l | Yes | inches (inside) | |
| w | Yes | inches (inside) | |
| lid | No | ||
| full | No | ||
| quantity | No | number of crates | |
| heavy_floor | No | ||
| forklift_base | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower. The description does add one genuinely useful behavioral nuance the annotations lack: values are snapped to 1/16 inch and are not raised to the minimum, i.e. no silent floor enforcement. It stops short of explaining failure behavior for out-of-range values or anything about the resulting code.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and not padded, but it is a sentence fragment rather than a structured statement, and the parenthetical caveat is the only substantive content. Brevity here reflects under-specification more than disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, but for an 8-parameter tool with four opaque booleans and no usage routing, the description is too thin. An agent cannot determine from it what the code means, what the options do, or why it would choose this over parse_crate_code.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: w/h/l carry 'inches (inside)' and quantity is described, but the four booleans (lid, full, heavy_floor, forklift_base) are completely undocumented. The description's word 'options' does not disambiguate any of them, so the semantic gap on half the parameters is left unfilled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the artifact as a 'configuration code for inside sizes and options,' which gestures at the resource but never states a verb like 'encodes/generates.' It gives no signal that separates it from the obvious inverse sibling parse_crate_code, leaving the agent to infer direction from the tool name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as parse_crate_code or quote_crate_by_code. The only hint is an implicit 'given dimensions, produce a code,' which is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_crate_codeParse a crate codeBRead-onlyIdempotent
Decode a crate configuration code into sizes and options and return its canonical form.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | configuration code, e.g. SC-W19-H21.5-L30.75 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond that: the result is a canonical form, implying input normalization. It says nothing about malformed-input behavior, which is the remaining unknown for a pure decoder.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero padding, with the action front-loaded and the outcome trailing. Every clause earns its place and nothing is repeated from the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the single required parameter is fully documented in the schema. The definition is nearly complete; only error handling for an invalid code is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already supplies the format example (SC-W19-H21.5-L30.75) plus length bounds. The description adds only the loose phrase 'sizes and options' and no syntax or format detail, so the schema does the heavy lifting and the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (decode/parse) and resource (crate configuration code) and says what the output is: sizes, options, and a canonical form. It reads clearly as the inverse of encode_crate_code, though it never names that sibling explicitly, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no alternatives are named. An agent must infer on its own that this is the tool for turning an encoded code into structured values rather than quote_crate_by_code or encode_crate_code; nothing in the text routes it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_crateQuote a crateA
Quote a crate from inside width, height and length (inches) for a customer email. Returns the price range, configuration code, inside/outside size, layout and notices, plus a message that the full quote will be emailed to that address. Submits a full-quote request (not read-only).
| Name | Required | Description | Default |
|---|---|---|---|
| h | Yes | inches (inside) | |
| l | Yes | inches (inside) | |
| w | Yes | inches (inside) | |
| lid | No | ||
| Yes | customer's email; the full quote is emailed here | ||
| quantity | No | number of crates | |
| heavy_floor | No | ||
| auto_forklift | No | ||
| forklift_base | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, but the description adds the key consequence: an email is actually dispatched to the customer with the full quote, which is not derivable from the schema. It restates the non-read-only nature redundantly but otherwise adds real behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and the side-effect disclosure trailing. Minor waste in repeating 'not read-only' after annotations already say so.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values are adequately covered, but with 9 parameters and a mutating email side effect, the description leaves the optional configuration flags and any failure behavior unexplained. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56%; the description restates that dimensions are inside-inches and that the email receives the full quote, but says nothing about the five optional flags (lid, quantity, heavy_floor, auto_forklift, forklift_base), which are undocumented in both schema and description. Adds only marginal meaning over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Quote a crate') plus the exact input basis (inside width/height/length in inches) and the output (price range, config code, layout). It doesn't differentiate itself from the sibling quote_crate_by_code, which is likely the closest alternative, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context ('for a customer email') implies when to use it, and the note that it submits a full-quote request hints at side effects, but there is no explicit when-to-use vs. quote_crate_by_code / crate_size_limits guidance or any stated preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_crate_by_codeQuote a crate by codeB
Same as quote_crate, for a configuration code such as SC-W19-H21.5-L30.75-BN-Q2.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | configuration code, e.g. SC-W19-H21.5-L30.75 | |
| Yes | customer's email; the full quote is emailed here |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false and openWorldHint=true, which imply a side-effecting, non-repeatable, externally-dependent call — yet the description says nothing about side effects. The only hint that a quote is emailed comes from the input schema's email description, not the tool description. The description squanders the chance to disclose the mailed-quote behavior or non-idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the sibling reference and example front-loaded; nothing is padded. It is arguably too terse, but that is an incompleteness problem rather than a verbosity one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for an openWorld, non-idempotent tool whose annotations imply side effects, the description should at minimum note that the quote is generated and emailed and whether calls are repeatable. Minimum viable but with a real behavioral gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (code, email) are already documented in the schema, including the emailing side effect. The description adds only a richer code example (with the -Q2 suffix) beyond the schema's example, which is marginal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool is equivalent to quote_crate but keyed on a configuration code, and gives a concrete code example, so the verb (quote) and resource (crate) are inferable. It distinguishes itself from the sibling quote_crate by input form. It does fall short of a self-contained statement of purpose because the agent must already know what quote_crate does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: reach for this tool when you have a configuration code string. There is no explicit when-not guidance, no mention of the sibling parse_crate_code / encode_crate_code, and no statement of when to prefer quote_crate instead. Adequate but thin.
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.
6 tool updates
v0.1.0- First observed
crate_preview_svg - First observed
crate_size_limits - First observed
encode_crate_code - First observed
parse_crate_code - First observed
quote_crate - First observed
quote_crate_by_code
TDQS
Scored across 6 tools
quote_crate and quote_crate_by_code have overlapping purpose but are clearly distinguished by input type (dimensions vs configuration code), and the description explicitly cross-references them. parse_crate_code and encode_crate_code are inverse operations with distinct roles, and crate_size_limits and crate_preview_svg are unambiguous. Only the two quote tools risk mild confusion.
Most tools use a verb_noun pattern (quote_crate, parse_crate_code, encode_crate_code) with a shared 'crate' token, giving good predictability. crate_size_limits and crate_preview_svg deviate to noun-first phrasing, a minor inconsistency but still readable and clearly scoped.
Six tools is well-scoped for a crate-quoting domain: two quoting paths, code parse/encode, size limits, and a preview generator. Each tool earns its place with no redundant or filler entries.
The surface covers the core lifecycle: quote from dimensions or code, encode/decode codes, check size limits, and render a preview. There is no tool to retrieve or manage previously submitted quote requests, but quoting plus code handling covers the main workflows an agent would need.
Maintenance
Related MCP Connectors
Live USPS, UPS & FedEx shipping rates plus USPS postage and stamp prices. Free, no API key.
Crates.io MCP — wraps the crates.io REST API v1 (free, no auth)
Make price offers on Shopify products; get counters, single-use codes and checkout links.
Search products, manage a customer cart, and request current checkout quotes.
Related MCP Servers
AlicenseNot gradedqualityAmaintenanceEnables AI agents to search a Shopify packaging-supplies catalog, get live pricing and inventory, recommend boxes, estimate shipping, and generate checkout URLs.1MIT- AlicenseAqualityAmaintenanceLive USPS, UPS, FedEx and DHL Express parcel rates from a US origin, domestic or to Canada, the UK, Germany and Australia, from a plain-words item description: no scale, no account, no API key. Also creates checkout links, reports checkout status, tracks parcels bought on smklog.com and serves a monthly US parcel price index.51MIT
- AlicenseNot gradedqualityCmaintenanceEnables real-time China-to-USA freight quotes with all-in delivered-duty-paid pricing for small shipments, without requiring an API key or signup.MIT
- AlicenseNot gradedqualityAmaintenanceEnables interaction with WooCommerce stores through the WordPress REST API, providing tools for managing products, orders, customers, shipping, taxes, coupons, payment gateways, reports, and store settings. Also supports WordPress content operations such as creating and updating posts and post metadata.MIT