Skip to main content
Glama

craft

Queue a crafting job (auto-routes to your own/faction facility, or hand-crafts at the Station Workshop) (Must be docked. Ordinary recipes require crafting and storage service; package recipes use the rules described below. Crafting is no longer instant: it queues a job that runs over subsequent ticks (check progress by calling craft with no recipe_id). You do NOT need to poll: each tick a job deposits finished output you get a 'crafting_update' notification (category 'crafting' in get_notifications) naming exactly what was made and where, with runs_remaining and a completed flag — so re-issuing the same craft because 'nothing happened yet' only stacks a duplicate job. 'quantity' is the number of OUTPUT ITEMS you want, rounded up to a whole number of production runs (a recipe that yields several items per run may make a few extra). Materials are escrowed from your station storage at enqueue (NOT cargo) and outputs are delivered to station storage on completion — deposit your inputs to storage first. Auto-routing prefers your OWN facility, then your FACTION's, then one an ALLIED faction has granted you access to (free to you, but queued at external priority), then a public rental, and only hand-crafts at the Station Workshop (speed scales with crafting/refining skill) when none is available — pass preset "workshop" to force hand-crafting, or facility_id to target one, plus optional preset "fast" (soonest finish globally, so a busy own facility may route to an idle public rental), "cheap" (lowest fee you would actually pay — your own and your faction's facilities are free to you, so they always win), or "prefer_own" (keep the job on your own/faction/ally-granted facility, renting a public one only when you have none that can run it). The Station Workshop is hand-crafting (your own labor, not the station's facility): its jobs advance only while you stay docked at that base and pause if you undock, resuming when you return — whereas a job at a real production facility you own or rent keeps running while you're away. deliver_to=faction crafts from/to faction storage (needs manage treasury permission), and deliver_to=faction: pulls inputs from and deposits outputs into a specific faction Storage Extension bucket; and if you leave deliver_to off and your own storage/credits can't cover the job, it automatically draws from your faction's storage/treasury when you're allowed to spend them. Renting another player's public facility prepays a per-run fee. COST CHECK: add dry_run=true to get a quote — the materials, labor, and rental fee the job would cost, the venue it auto-routes to, whether you can afford it, and the ETA — without queuing or spending anything (not supported with bulk jobs). Use 'recycle' to reverse a recipe at a recycler. BULK: pass jobs=[{recipe_id, quantity, facility_id?, preset?, deliver_to?, source?, package_ids?, output_package_label?}, ...] to queue many crafts in one action (up to 50 facilities at once instead of one job per tick) — each entry is queued independently and the response reports per-job success/failure. Each entry accepts the same package_ids (source inputs from packages) and output_package_label (seal outputs into a new package) fields as a single craft. QUEUE & CANCEL: call craft with no recipe_id to list your queued jobs, their IDs, and each job's current deliver_to — that is the portable form and it works on every transport. (The legacy WebSocket v1 payload also accepts an explicit "action":"queue" field, but the v2 REST/MCP/WebSocket transports reserve "action" for routing and strip it from the request body — which is why it is absent from the v2 request schema — so a v2 request that sets it alongside a recipe_id queues a craft instead of listing.) Pass job_id= to cancel a queued job and refund its unconsumed inputs, labor, and fees (the same operation as facility action=job_cancel). Pass job_ids=[id1,id2,...] to cancel several at once (per-job success/failure). RETARGET: pass job_id= together with deliver_to=<storage|faction|faction:bucket> to redirect a queued or running job's REMAINING output to a different store at the same station without cancelling it — the recipe, quantity, source, escrow, cost, venue, ETA, and queue position are all unchanged, and runs already delivered stay where they landed. Only the job's own orderer may retarget it (a facility owner may cancel a rental order but not redirect its output), the new destination is permission-checked exactly as it is at queue time, and pack_package/unpack_package jobs cannot be retargeted. PACKAGE INPUTS/OUTPUT: package_ids=[...] sources the craft's inputs from those packages (raw id or package:) instead of loose storage — they must all sit in the source location and their pooled contents must equal the recipe inputs times quantity EXACTLY (no shortage or overage, no storage backfill), or it's rejected before anything is consumed. output_package_label="..." holds the outputs and, on completion, seals the whole job's output into one new package with that label in the destination, consuming one cargo_container; cancelling instead refunds the inputs with no package. The package id is pre-generated: both the queue response and the completion crafting_update return output_package_id, so you never need to poll storage to find the sealed package. Both need an accessible Logistics facility (your own, your faction's, a public rental, or a station-owned one), and with output_package_label the total output must fit one package (size <= 100). Add dry_run=true to preview a packaged craft — it reports the exact inputs and cost, the output package it would seal, and whether every gate (exact match, Logistics, a container, single-package size, destination room) would pass, without consuming anything. Not supported with bulk jobs. PACKAGE RECIPES: recipe_id=pack_package takes items, label, source, and target; it consumes one cargo_container, packs at most 100 total item size, and requires Logistics. recipe_id=unpack_package takes package_id, source, and target; A Logistics facility is fast, returns the container, and uses that facility's normal access/rental rules without requiring the station's generic crafting service. preset="workshop" is much slower, consumes the container, and requires the station's crafting service. source/target accept storage, cargo, faction, or faction:; target defaults to source (deliver_to is an alias). Package jobs use this same queue and job_id cancellation.)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
jobsNoBulk mode: queue many crafts in one action. Each entry accepts the same input-sourcing and output-packaging fields as a single craft — package_ids to source inputs from packages, output_package_label to seal outputs into a new package — plus items, package_id, label, and target. Each job commits independently with partial success. Max 50.
countNoAlias for quantity (used when quantity is not set).
itemsNoFor pack_package: selected items to pack; total unpacked size may not exceed 100.
labelNoFor pack_package: player-authored package label.
actionNoUse action='queue' to list your current crafting jobs instead of queuing a new one, action='cancel' to cancel the job named by job_id (passing a bare job_id implies cancel too), or action='retarget' to send the job named by job_id somewhere else (job_id + deliver_to implies retarget too).
job_idNoAct on this queued job instead of crafting. Call craft with no recipe_id to list your job IDs. job_id alone cancels it (refunding its unconsumed inputs, labor, and rental fee); job_id together with deliver_to instead redirects the job's REMAINING output to that destination, keeping its recipe, runs, escrow, cost, and queue position.
presetNoAuto-routing preset: 'fast' (fewest ticks, default) picks the best facility globally, so a busy own facility may route to an idle public rental. 'cheap' picks the lowest fee you would actually pay — your own and your faction's facilities are free to you, so they always win. Use 'prefer_own' to keep the job on your own (then faction, then ally-granted) facility and only rent a public one when you have none that can run it. Auto-routing otherwise prefers your own facility, then your faction's, then one an allied faction has granted you access to (free to you, but queued at external priority), then a public rental, and only hand-crafts at the Station Workshop if none is available. Use 'workshop' to force hand-crafting even when you have a facility.
sourceNoWhere inputs and labor/rental credits are pulled FROM. Same values as deliver_to: 'storage', 'faction', or 'faction:<bucket>'. Defaults to deliver_to, so inputs and outputs share one store unless you set them differently — e.g. source='storage' deliver_to='faction:Crafting' pulls from your personal storage and deposits into a faction bucket.
targetNoFor package recipes: output destination (storage, cargo, faction, or faction:<bucket>); defaults to source. deliver_to is accepted as an alias.
dry_runNoReturn a cost+time quote (materials, labor, rental fee, auto-routed venue, ETA) without queuing or spending anything. Not supported with bulk jobs.
job_idsNoBulk cancel: cancel many queued jobs in one action. Each ID is cancelled independently with per-job success/failure, so one bad ID doesn't sink the batch. Refunds the unconsumed escrow of every cancelled job.
quantityNoNumber of output items to make (default 1). Rounded up to a whole number of production runs, so a recipe that yields several items per run may produce a few extra.
recipe_idNoRecipe ID to craft (use catalog with type=recipes to see available recipes). Inputs are escrowed from station storage at enqueue.
deliver_toNoOutput destination: 'storage' (default), 'faction' (faction main store — requires manage treasury permission), or 'faction:<bucket name or id>' for a specific faction Storage Extension bucket. Pass it alongside job_id to redirect an ALREADY QUEUED job's remaining output there instead of queuing anything new.
package_idNoFor unpack_package: package instance ID to unpack.
session_idYesYour session ID from login/register
facility_idNoRoute to a specific facility ID (overrides auto-selection).
package_idsNoSource this craft's inputs from these packages (raw id or 'package:<id>' form) instead of loose storage items. The packages must all sit in the resolved source location, and their pooled contents must equal the recipe inputs (× quantity) EXACTLY — any shortage or overage is rejected before anything is consumed (no storage/cargo backfill). Their empty cargo_containers are reclaimed only when an accessible Logistics facility is present.
output_package_labelNoBundle the outputs into one package: instead of depositing outputs loose per run, the job holds them and seals them into a single new package with this label in the destination on completion, consuming one cargo_container. Requires an accessible Logistics facility, and the total output size across all runs must fit one package (<= 100). Cancelling refunds the inputs and produces no package.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • changedInput schema / properties / job_id / description
      Previous value: -"Act on this queued job instead of crafting. Use action='queue' to list your job IDs. job_id alone cancels it (refunding its unconsumed inputs, labor, and rental fee); job_id together with deliver_to instead redirects the job's REMAINING output to that destination, keeping its recipe, runs, escrow, cost, and queue position."New value: +"Act on this queued job instead of crafting. Call craft with no recipe_id to list your job IDs. job_id alone cancels it (refunding its unconsumed inputs, labor, and rental fee); job_id together with deliver_to instead redirects the job's REMAINING output to that destination, keeping its recipe, runs, escrow, cost, and queue position."
  2. Changed4 schema fields changed
    • changedInput schema / properties / action / description
      Previous value: -"Use action='queue' to list your current crafting jobs instead of queuing a new one, or action='cancel' to cancel the job named by job_id (passing a bare job_id implies cancel too)."New value: +"Use action='queue' to list your current crafting jobs instead of queuing a new one, action='cancel' to cancel the job named by job_id (passing a bare job_id implies cancel too), or action='retarget' to send the job named by job_id somewhere else (job_id + deliver_to implies retarget too)."
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "queue",
      -  "cancel"
      -]New value: +[
      +  "queue",
      +  "cancel",
      +  "retarget"
      +]
    • changedInput schema / properties / deliver_to / description
      Previous value: -"Output destination: 'storage' (default), 'faction' (faction main store — requires manage treasury permission), or 'faction:<bucket name or id>' for a specific faction Storage Extension bucket."New value: +"Output destination: 'storage' (default), 'faction' (faction main store — requires manage treasury permission), or 'faction:<bucket name or id>' for a specific faction Storage Extension bucket. Pass it alongside job_id to redirect an ALREADY QUEUED job's remaining output there instead of queuing anything new."
    • changedInput schema / properties / job_id / description
      Previous value: -"Cancel this queued job (refunding its unconsumed inputs, labor, and rental fee) instead of crafting. Use action='queue' to list your job IDs. Setting job_id implies cancel."New value: +"Act on this queued job instead of crafting. Use action='queue' to list your job IDs. job_id alone cancels it (refunding its unconsumed inputs, labor, and rental fee); job_id together with deliver_to instead redirects the job's REMAINING output to that destination, keeping its recipe, runs, escrow, cost, and queue position."
  3. Changed20 schema fields changed
    • addedInput schema / properties / action
      Added value: +{
      +  "description": "Use action='queue' to list your current crafting jobs instead of queuing a new one, or action='cancel' to cancel the job named by job_id (passing a bare job_id implies cancel too).",
      +  "enum": [
      +    "queue",
      +    "cancel"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / count
      Added value: +{
      +  "description": "Alias for quantity (used when quantity is not set).",
      +  "type": "integer"
      +}
    • changedInput schema / properties / deliver_to / description
      Previous value: -"Where to deliver crafted items: 'cargo' (default), 'storage' (station storage), or 'faction' (faction storage — requires Faction Workshop facility and manage treasury permission; inputs also come from faction storage)."New value: +"Output destination: 'storage' (default), 'faction' (faction main store — requires manage treasury permission), or 'faction:<bucket name or id>' for a specific faction Storage Extension bucket."
    • removedInput schema / properties / deliver_to / enum
      Removed value: -[
      -  "cargo",
      -  "storage",
      -  "faction"
      -]
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "description": "Return a cost+time quote (materials, labor, rental fee, auto-routed venue, ETA) without queuing or spending anything. Not supported with bulk jobs.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / facility_id
      Added value: +{
      +  "description": "Route to a specific facility ID (overrides auto-selection).",
      +  "type": "string"
      +}
    • addedInput schema / properties / items
      Added value: +{
      +  "description": "For pack_package: selected items to pack; total unpacked size may not exceed 100.",
      +  "items": {
      +    "properties": {
      +      "item_id": {
      +        "type": "string"
      +      },
      +      "quantity": {
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "item_id",
      +      "quantity"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / job_id
      Added value: +{
      +  "description": "Cancel this queued job (refunding its unconsumed inputs, labor, and rental fee) instead of crafting. Use action='queue' to list your job IDs. Setting job_id implies cancel.",
      +  "type": "string"
      +}
    • addedInput schema / properties / job_ids
      Added value: +{
      +  "description": "Bulk cancel: cancel many queued jobs in one action. Each ID is cancelled independently with per-job success/failure, so one bad ID doesn't sink the batch. Refunds the unconsumed escrow of every cancelled job.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / jobs
      Added value: +{
      +  "description": "Bulk mode: queue many crafts in one action. Each entry accepts the same input-sourcing and output-packaging fields as a single craft — package_ids to source inputs from packages, output_package_label to seal outputs into a new package — plus items, package_id, label, and target. Each job commits independently with partial success. Max 50.",
      +  "items": {
      +    "properties": {
      +      "deliver_to": {
      +        "type": "string"
      +      },
      +      "facility_id": {
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "item_id": {
      +              "type": "string"
      +            },
      +            "quantity": {
      +              "minimum": 1,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "item_id",
      +            "quantity"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "label": {
      +        "maxLength": 255,
      +        "type": "string"
      +      },
      +      "output_package_label": {
      +        "description": "Seal this entry's outputs into a single new package with this label on completion, consuming one cargo_container. Requires an accessible Logistics facility; total output must fit one package (<= 100).",
      +        "maxLength": 255,
      +        "type": "string"
      +      },
      +      "package_id": {
      +        "type": "string"
      +      },
      +      "package_ids": {
      +        "description": "Source this entry's inputs from these packages (raw id or 'package:<id>' form) instead of loose storage. Pooled contents must equal the recipe inputs (× quantity) EXACTLY, with no storage/cargo backfill.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "preset": {
      +        "type": "string"
      +      },
      +      "quantity": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "recipe_id": {
      +        "type": "string"
      +      },
      +      "source": {
      +        "type": "string"
      +      },
      +      "target": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "recipe_id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / label
      Added value: +{
      +  "description": "For pack_package: player-authored package label.",
      +  "maxLength": 255,
      +  "type": "string"
      +}
    • addedInput schema / properties / output_package_label
      Added value: +{
      +  "description": "Bundle the outputs into one package: instead of depositing outputs loose per run, the job holds them and seals them into a single new package with this label in the destination on completion, consuming one cargo_container. Requires an accessible Logistics facility, and the total output size across all runs must fit one package (<= 100). Cancelling refunds the inputs and produces no package.",
      +  "maxLength": 255,
      +  "type": "string"
      +}
    • addedInput schema / properties / package_id
      Added value: +{
      +  "description": "For unpack_package: package instance ID to unpack.",
      +  "type": "string"
      +}
    • addedInput schema / properties / package_ids
      Added value: +{
      +  "description": "Source this craft's inputs from these packages (raw id or 'package:<id>' form) instead of loose storage items. The packages must all sit in the resolved source location, and their pooled contents must equal the recipe inputs (× quantity) EXACTLY — any shortage or overage is rejected before anything is consumed (no storage/cargo backfill). Their empty cargo_containers are reclaimed only when an accessible Logistics facility is present.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / preset
      Added value: +{
      +  "description": "Auto-routing preset: 'fast' (fewest ticks, default) picks the best facility globally, so a busy own facility may route to an idle public rental. 'cheap' picks the lowest fee you would actually pay — your own and your faction's facilities are free to you, so they always win. Use 'prefer_own' to keep the job on your own (then faction, then ally-granted) facility and only rent a public one when you have none that can run it. Auto-routing otherwise prefers your own facility, then your faction's, then one an allied faction has granted you access to (free to you, but queued at external priority), then a public rental, and only hand-crafts at the Station Workshop if none is available. Use 'workshop' to force hand-crafting even when you have a facility.",
      +  "enum": [
      +    "fast",
      +    "cheap",
      +    "prefer_own",
      +    "workshop"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / quantity / description
      Previous value: -"Number of times to craft (1-10, default 1). Batch craft to save actions. If cargo is full, crafted items overflow to station storage."New value: +"Number of output items to make (default 1). Rounded up to a whole number of production runs, so a recipe that yields several items per run may produce a few extra."
    • changedInput schema / properties / recipe_id / description
      Previous value: -"Recipe ID to craft (use catalog with type=recipes to see available recipes). Materials are pulled from cargo first, then station storage if available."New value: +"Recipe ID to craft (use catalog with type=recipes to see available recipes). Inputs are escrowed from station storage at enqueue."
    • addedInput schema / properties / source
      Added value: +{
      +  "description": "Where inputs and labor/rental credits are pulled FROM. Same values as deliver_to: 'storage', 'faction', or 'faction:<bucket>'. Defaults to deliver_to, so inputs and outputs share one store unless you set them differently — e.g. source='storage' deliver_to='faction:Crafting' pulls from your personal storage and deposits into a faction bucket.",
      +  "type": "string"
      +}
    • addedInput schema / properties / target
      Added value: +{
      +  "description": "For package recipes: output destination (storage, cargo, faction, or faction:<bucket>); defaults to source. deliver_to is accepted as an alias.",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "session_id",
      -  "recipe_id"
      -]New value: +[
      +  "session_id"
      +]
  4. Changed1 schema field changed
    • addedInput schema / properties / deliver_to
      Added value: +{
      +  "description": "Where to deliver crafted items: 'cargo' (default), 'storage' (station storage), or 'faction' (faction storage — requires Faction Workshop facility and manage treasury permission; inputs also come from faction storage).",
      +  "enum": [
      +    "cargo",
      +    "storage",
      +    "faction"
      +  ],
      +  "type": "string"
      +}
  5. Changed2 schema fields changed
    • removedInput schema / properties / count
      Removed value: -{
      -  "description": "Number of times to craft (1-10, default 1). Batch craft to save actions. If cargo is full, crafted items overflow to station storage.",
      -  "type": "integer"
      -}
    • addedInput schema / properties / quantity
      Added value: +{
      +  "description": "Number of times to craft (1-10, default 1). Batch craft to save actions. If cargo is full, crafted items overflow to station storage.",
      +  "type": "integer"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / recipe_id / description
      Previous value: -"Recipe ID to craft (use get_recipes to see available recipes). Materials are pulled from cargo first, then station storage if available."New value: +"Recipe ID to craft (use catalog with type=recipes to see available recipes). Materials are pulled from cargo first, then station storage if available."
  7. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only include readOnlyHint=false, which adds no meaningful behavioral disclosure. The description therefore carries the full burden, and it does so thoroughly: it reveals that crafting is no longer instant, that materials are escrowed from station storage (NOT cargo), that outputs deposit into station storage, that Station Workshop jobs pause if you undock, that rental fees are prepaid, that faction treasury/bucket spending is automatic under certain conditions, that cancelling refunds unconsumed inputs, and that package jobs have distinct side effects such as consuming cargo_containers. It also clearly explains the queue/list vs queue/new behavior and the retarget semantics. There is no contradiction with annotations.

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?

The description is severely dense and runs on for paragraphs without clear section breaks. While every sentence adds substantive information, the structure is a wall of text and may exceed readability limits for an agent trying to parse it quickly. It front-loads the core queue behavior, which is good, but then concatenates bulk, package, retargeting, and preset details. It is appropriately sized for the 19-parameter complexity, but not well-structured or scannable enough for a 5.

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 the tool has 19 parameters, no output schema, and nested/convoluted use cases (single vs bundled, package vs regular, routing presets, retargeting, faction storage fallback), the description covers essentially all relevant operational details. It explains effects, preconditions (must be docked), storage requirements, cost check, facility routing priority, package input/output rules, cancellation refund semantics, and even multi-job responses. Nothing critical is missing for correctly calling this tool in its many modes.

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?

Although the schema description coverage is 100%, the description substantially clarifies semantics beyond the schema: it explains the difference between quantity and count, that quantity is rounded up to production runs, that source defaults to deliver_to, that deliver_to may be used to retarget a queued job when combined with job_id, and that 'workshop' preset forces hand-crafting with slower progress. It also clarifies package-related fields like package_ids exact-match rule. However, because the schema already covers all parameters at 100%, much of this is redundant elaboration; the baseline for high coverage is 3, and the description does add real over-schema meaning, so 3 is the right score.

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: 'Queue a crafting job', and immediately differentiates the tool's auto-routing behavior, the venue types (facility vs Station Workshop), and the fact that it is now deferred (jobs run over ticks) rather than instant. It distinguishes itself from siblings like recycle (reverse a recipe at a recycler) and mentions catalog as the way to find recipe IDs, so it is clear what craft does and how it differs from related 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 gives explicit when-to-use/when-not-to-use instructions: it warns against re-issuing the same craft when a job is already queued, says materials must be deposited to station storage first, tells users to add dry_run=true for a quote, and specifies which sibling tool to use for recipes (catalog with type=recipes). It also explains when to use bulk mode vs single job, queuing/cancelling/retargeting behavior, and package input/output specifics. This is extensive, explicit, and actionable guidance.

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.

TDQS

B3.4/5.0
Disambiguation4/5

Most tools are clearly distinct, targeting specific actions and resources. A few overlaps exist (e.g., attack vs hunt, view_insurance vs claim_insurance), but detailed descriptions clarify the boundaries. The scale makes selection harder, but each tool has a clear purpose.

Naming Consistency4/5

The majority use a consistent verb_noun snake_case pattern (e.g., create_buy_order, get_cargo, accept_mission). There are minor deviations like action-dispatch commands (facility, shipping, citizenship) and bare verbs (attack, dock, mine), but these are readable and follow a logical style.

Tool Count1/5

With 212 tools, the server far exceeds any reasonable scope for an MCP. While the game is complex, this is an extreme number that overwhelms agents and users, making discovery and selection impractical. The calibration considers 25+ already too many, and 212 is extreme.

Completeness5/5

The toolset covers nearly every aspect of the game: combat, trading, crafting, factions, missions, exploration, drones, passengers, freight, insurance, taxation, and more. It provides full CRUD for most resources and includes both action and query tools, leaving few obvious gaps.

Resources