Skip to main content
Glama
toosoontospoon

io.github.toosoontospoon/crate-quote

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), httpx for 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

MCP_SERVICES

Comma list of services to run when --service isn't given (default: all enabled)

<PREFIX>_API_URL

Base URL of the service's API (required to call its tools)

<PREFIX>_API_KEY

Optional API key, sent as Authorization: Bearer …. Never logged

<PREFIX>_TIMEOUT

Request timeout in seconds (default 20)

<PREFIX>_ENABLED

0 leaves the service out of "all services"

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

quote_crate

POST /v1/quote

write

customer email (PII)

queues a full-quote request; the shop emails the customer

quote_crate_by_code

POST /v1/quote/by-code

write

customer email (PII)

same

parse_crate_code

POST /v1/codes/parse

read-only

none

none

encode_crate_code

POST /v1/codes/encode

read-only

none

none

crate_size_limits

GET /v1/limits

read-only

none

none

crate_preview_svg

GET /v1/designs/{code}/preview.svg

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

io.github.toosoontospoon/crate-quote

servers/crate-quote/server.json

Publishing (not done yet):

  1. Release the package to PyPI.

  2. mcp-publisher login github as toosoontospoon.

  3. 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 API

See CONTRIBUTING.md to add a service.

Available Tools

6 tools
crate_preview_svgCrate preview drawing (SVG)B
Read-onlyIdempotent

Isometric customer preview drawing of a crate, as SVG markup.

NameRequiredDescriptionDefault
codeYesconfiguration code, e.g. SC-W19-H21.5-L30.75
dimsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 limitsB
Read-onlyIdempotent

Minimum inside size and the standard/tall layout maximums (bigger sizes are oversized: custom quote).

NameRequiredDescriptionDefault
heavy_floorNo
forklift_baseNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 codeC
Read-onlyIdempotent

Configuration code for inside sizes and options (snapped to 1/16 inch, not raised to the minimum).

NameRequiredDescriptionDefault
hYesinches (inside)
lYesinches (inside)
wYesinches (inside)
lidNo
fullNo
quantityNonumber of crates
heavy_floorNo
forklift_baseNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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 codeB
Read-onlyIdempotent

Decode a crate configuration code into sizes and options and return its canonical form.

NameRequiredDescriptionDefault
codeYesconfiguration code, e.g. SC-W19-H21.5-L30.75

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

NameRequiredDescriptionDefault
hYesinches (inside)
lYesinches (inside)
wYesinches (inside)
lidNo
emailYescustomer's email; the full quote is emailed here
quantityNonumber of crates
heavy_floorNo
auto_forkliftNo
forklift_baseNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
codeYesconfiguration code, e.g. SC-W19-H21.5-L30.75
emailYescustomer's email; the full quote is emailed here

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv0.1.0
    • First observedcrate_preview_svg
    • First observedcrate_size_limits
    • First observedencode_crate_code
    • First observedparse_crate_code
    • First observedquote_crate
    • First observedquote_crate_by_code

TDQS

B3.4/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to search a Shopify packaging-supplies catalog, get live pricing and inventory, recommend boxes, estimate shipping, and generate checkout URLs.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Live 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.
    5
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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