Skip to main content
Glama
PrintVaultMCP

PrintVaultMCP

Print Vault MCP Server

An MCP server that gives AI assistants full access to a self-hosted Print Vault instance — the 3D printing inventory, filament, printer, project, and print-tracker management app.

Built for Claude Desktop, Claude Code, and any MCP-compatible client.


Quick Start

Prerequisites

  • uv (Python package manager)

  • A running Print Vault instance (v1.1.0+)

Install & Run

# Clone the repo
git clone https://github.com/your-org/PrintVaultMCP.git
cd PrintVaultMCP

# Copy and configure environment
cp .env.example .env
# Edit .env and set PRINT_VAULT_URL to your instance

# Run the server
uv run print-vault-mcp

Add to Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "print-vault": {
      "command": "uv",
      "args": ["--directory", "/path/to/PrintVaultMCP", "run", "print-vault-mcp"],
      "env": {
        "PRINT_VAULT_URL": "http://192.168.1.100:8000"
      }
    }
  }
}

Add to Claude Code

claude mcp add print-vault \
  --command "uv --directory /path/to/PrintVaultMCP run print-vault-mcp" \
  --env PRINT_VAULT_URL=http://192.168.1.100:8000

Related MCP server: Homebox MCP Server

Configuration

Variable

Required

Default

Description

PRINT_VAULT_URL

Yes

—

Base URL of your Print Vault instance

PRINT_VAULT_TIMEOUT

No

30

HTTP request timeout in seconds


Tools

40 tools organized across 7 groups:

Dashboard & System

Tool

Description

get_dashboard

Full status overview — alerts, stats, featured trackers, active projects

get_version

Current Print Vault version

dismiss_alert

Dismiss a specific dashboard alert

Inventory Management

Tool

Description

search_inventory

Search items by keyword, brand, part type, or location

get_inventory_item

Full detail on a specific item

add_inventory_item

Add a new item (auto-creates brands, locations, etc.)

update_inventory_item

Update any field on an existing item

get_low_stock

List all consumables at or below threshold

get_item_allocation

See which projects are using an item

Filament Management

Tool

Description

list_materials

Browse material blueprints and generic types

create_material

Create a generic material type or specific blueprint

get_material_spools

List physical spools for a material blueprint

list_spools

Browse spools with status/printer/color filters

add_filament_spool

Add new spool(s) linked to a material blueprint

quick_add_spool

Quick-add a spool without a blueprint (standalone fields)

update_spool_weight

Update current weight (auto-updates status)

mark_spool_empty

Mark a spool as empty

open_spool

Open a spool from an unopened batch

archive_spools

Bulk archive empty spools

toggle_material_favorite

Toggle favorite on a material (max 5)

Printer Management

Tool

Description

list_printers

List printers with search and status filter

get_printer

Full detail including mods and filament

update_printer

Update status, notes, etc.

add_mod

Add a mod/upgrade to a printer

update_mod

Update mod status

Project Management

Tool

Description

list_projects

List projects with search and status filter

get_project

Full detail with BOM, inventory, printers, trackers

create_project

Create a new project

update_project

Update project fields

add_bom_item

Add a BOM line item (auto-reserves linked inventory)

get_shopping_list

Consolidated buy list across all active projects

link_printer_to_project

Associate a printer with a project

Print Tracker

Tool

Description

list_trackers

List all print trackers

get_tracker

Full tracker detail with file list and progress

create_tracker_from_github

Crawl a GitHub repo for printable files

update_file_status

Update print status of a tracker file

Reference Data

Tool

Description

list_brands

All brands/manufacturers

list_locations

All storage locations

list_part_types

All part type categories

list_vendors

All vendors/suppliers


Project Structure

PrintVaultMCP/
├── src/print_vault_mcp/
│   ├── __init__.py          # Package entry point
│   ├── __main__.py          # python -m support
│   ├── client.py            # Async HTTP client for Print Vault API
│   ├── formatters.py        # AI-friendly response formatters
│   └── server.py            # MCP server & tool definitions
├── docs/
│   ├── design.md            # Architecture & design document
│   └── reference/           # API contract references (links to upstream source)
├── .env.example             # Environment variable template
├── .gitignore
├── pyproject.toml           # uv/pip package configuration
└── README.md

Development

# Install dependencies
uv sync

# Run the server locally (stdio mode)
PRINT_VAULT_URL=http://localhost:8000 uv run print-vault-mcp

# Run with the MCP inspector for debugging
npx @modelcontextprotocol/inspector uv run print-vault-mcp

How It Works

The server is a stateless protocol translation layer. It receives structured tool calls from AI clients via MCP (stdio transport), translates them into HTTP requests against the Print Vault REST API, and returns formatted text responses the AI can reason about.

AI Client  ──MCP (stdio)──>  PrintVaultMCP  ──HTTP/JSON──>  Print Vault

Print Vault uses AllowAny permissions on every endpoint (single-user self-hosted app), so the MCP server only needs the base URL — no tokens or credentials required.


License

AGPL-3.0 — same license family as Print Vault itself.

Available Tools

40 tools
add_bom_itemA

Add a Bill of Materials line item to a project. If linked to an inventory item, it reserves stock.

Args: project: The ID of the project. description: Description of the BOM item (e.g. "M3x8 SHCS"). quantity_needed: Quantity needed. inventory_item: Optional ID of an existing inventory item to link (reserves stock). status: BOM status — 'linked' (auto-reserves), 'unlinked', or 'needs_purchase'. notes: Free-text notes.

Inputs: project (required), description (required), notes, status, +2 more. Returns: result

add_filament_spoolA

Add new filament spool(s) linked to an existing material blueprint.

Args: filament_type_id: ID of the material blueprint this spool uses. quantity: Number of identical spools to add (default 1). initial_weight: Net filament weight in grams (default 1000g / 1kg). location: Storage location name (will be created if new). notes: Free-text notes. price_paid: Price paid for this spool.

Inputs: filament_type_id (required), notes, location, quantity, +2 more. Returns: result

add_inventory_itemA

Add a new inventory item. Brand, part type, location, and vendor are created automatically if they don't exist.

Args: title: Name/title of the inventory item. quantity: Quantity on hand. brand: Brand name (will be created if new). part_type: Part type name (will be created if new). location: Storage location name (will be created if new). cost: Unit cost. is_consumable: Whether this is a consumable item (enables low stock tracking). low_stock_threshold: Quantity threshold for low stock alerts (consumables only). notes: Free-text notes. vendor: Vendor name (will be created if new). vendor_link: URL to vendor product page. model: Model/part number.

Inputs: title (required), cost, brand, model, +8 more. Returns: result

add_modA

Add a mod/upgrade to a printer.

Args: printer: The ID of the printer to add the mod to. name: Name of the mod. link: URL to the mod (Printables, GitHub, etc.). status: Mod status — 'Planned', 'In Progress', 'Completed'.

Inputs: name (required), printer (required), link, status. Returns: result

archive_spoolsA

Bulk archive empty spools.

Args: spool_ids: List of spool IDs to archive (must have 'empty' status).

Inputs: spool_ids (required). Returns: result

create_materialA

Create a new material — either a generic type (e.g. 'PLA') or a specific blueprint (e.g. 'Sunlu PLA+ Black').

A generic material is a base type that blueprints reference. A blueprint is a specific brand/color combination that spools are linked to. Create a generic first, then blueprints that reference it via base_material_id.

Args: name: Material name (e.g. 'PLA' for generic, 'Sunlu PLA+ Black' for blueprint). is_generic: True for a generic base material, False for a specific blueprint. brand: Brand name for blueprints (will be created if new). Ignored for generics. base_material_id: ID of a generic material this blueprint is based on. colors: List of color names (e.g. ['Black'] or ['Black', 'Red'] for multicolor). color_family: Color family for grouping (e.g. 'Black', 'Red', 'Neutral'). diameter: Filament diameter in mm (default 1.75). spool_weight: Net filament weight per spool in grams (default 1000). empty_spool_weight: Empty spool weight in grams. nozzle_temp_min: Minimum nozzle temperature in Celsius. nozzle_temp_max: Maximum nozzle temperature in Celsius. bed_temp_min: Minimum bed temperature in Celsius. bed_temp_max: Maximum bed temperature in Celsius. density: Filament density in g/cm3 (e.g. 1.24 for PLA). price_per_spool: Price per spool. vendor: Vendor name (will be created if new). vendor_link: URL to vendor product page. notes: Free-text notes. features: List of feature names (e.g. ['Matte', 'High Speed']). Created if new.

Inputs: name (required), brand, notes, colors, +15 more. Returns: result

create_projectA

Create a new project.

Args: project_name: Name of the project. description: Project description. status: Initial status — 'Planning', 'In Progress', 'On Hold'. start_date: Start date in YYYY-MM-DD format. due_date: Due date in YYYY-MM-DD format. notes: Free-text notes.

Inputs: project_name (required), notes, status, due_date, +2 more. Returns: result

create_tracker_from_githubA

Crawl a GitHub repository for printable files and return the results. Use this to preview files before creating a tracker.

Args: github_url: Full GitHub URL to a repository or subdirectory (e.g. https://github.com/VoronDesign/Voron-0/tree/main/STLs).

Inputs: github_url (required). Returns: result

dismiss_alertA

Dismiss a specific dashboard alert.

Args: alert_type: The type of alert (e.g. 'printer_repair', 'low_stock', 'maintenance_overdue'). alert_id: The ID of the specific alert to dismiss.

Inputs: alert_id (required), alert_type (required). Returns: result

get_dashboardA

Get a full status overview of your Print Vault: alerts, stats, featured trackers, and active projects.

Inputs: no named parameters. Returns: result

get_inventory_itemB

Get full details on a specific inventory item.

Args: item_id: The ID of the inventory item.

Inputs: item_id (required). Returns: result

get_item_allocationA

Get the allocation summary for an inventory item — how much is on hand, needed, and which projects are using it.

Args: item_id: The ID of the inventory item.

Inputs: item_id (required). Returns: result

get_low_stockA

List all consumable inventory items that are at or below their low stock threshold.

Inputs: no named parameters. Returns: result

get_material_spoolsA

List all physical spools for a given material blueprint.

Args: material_id: The ID of the material blueprint.

Inputs: material_id (required). Returns: result

get_printerA

Get full details on a specific printer including mods and assigned filament.

Args: printer_id: The ID of the printer.

Inputs: printer_id (required). Returns: result

get_projectA

Get full project details including BOM, linked inventory, printers, trackers, and files.

Args: project_id: The ID of the project.

Inputs: project_id (required). Returns: result

get_shopping_listA

Get the consolidated shopping list — items that need to be purchased across all active projects.

Inputs: no named parameters. Returns: result

get_trackerA

Get full tracker details including file list and progress.

Args: tracker_id: The ID of the tracker.

Inputs: tracker_id (required). Returns: result

get_versionA

Get the current Print Vault version.

Inputs: no named parameters. Returns: result

list_brandsA

List all brands/manufacturers in the system.

Inputs: no named parameters. Returns: result

list_locationsA

List all storage locations in the system.

Inputs: no named parameters. Returns: result

list_materialsA

List filament material blueprints and generic material types.

Args: search: Search by material or brand name. material_type: Filter by 'generic' or 'blueprint'. favorites: If true, show only favorited materials.

Inputs: search, favorites, material_type. Returns: result

list_part_typesB

List all part types/categories in the system.

Inputs: no named parameters. Returns: result

list_printersA

List all printers with optional search and status filter.

Args: search: Search by title, manufacturer, serial number, or notes. status: Filter by status (e.g. 'Active', 'Under Repair', 'Retired').

Inputs: search, status. Returns: result

list_projectsA

List projects with optional search and status filter.

Args: search: Search by project name, description, status, or notes. status: Filter by status — 'Planning', 'In Progress', 'On Hold', 'Completed', 'Canceled'.

Inputs: search, status. Returns: result

list_spoolsA

List filament spools with optional filtering.

Args: status: Filter by status — 'new', 'opened', 'active', 'in_use', 'low', 'empty', 'archived'. printer: Filter by assigned printer ID. color: Filter by color name (fuzzy match). is_archived: If true, show only archived spools. If false, exclude archived.

Inputs: color, status, printer, is_archived. Returns: result

list_trackersA

List all print trackers with optional search.

Args: search: Search by tracker name or GitHub URL.

Inputs: search. Returns: result

list_vendorsA

List all vendors/suppliers in the system.

Inputs: no named parameters. Returns: result

mark_spool_emptyA

Mark a filament spool as empty and clear its printer assignment.

Args: spool_id: The ID of the spool to mark as empty.

Inputs: spool_id (required). Returns: result

open_spoolA

Open a spool from an unopened batch. Creates a new individual spool record.

Args: spool_id: The ID of the unopened spool batch to open from. status: Status for the opened spool — 'opened' or 'in_use'. location_id: Optional location ID to assign the opened spool. printer_id: Optional printer ID to assign the opened spool.

Inputs: spool_id (required), status, printer_id, location_id. Returns: result

quick_add_spoolA

Quick-add a filament spool without a material blueprint. Use this when you just want to track a spool without setting up a full material blueprint first.

Args: standalone_name: Name for this spool (e.g. 'eSun PLA+ Black'). quantity: Number of identical spools to add (default 1). initial_weight: Net filament weight in grams (default 1000g / 1kg). standalone_brand: Brand name (will be created if new). standalone_material_type_id: ID of a generic material type (e.g. PLA, PETG). Use list_materials with material_type='generic' to find IDs. standalone_colors: List of color names (e.g. ['Black']). standalone_color_family: Color family for grouping (e.g. 'Black', 'Red'). location: Storage location name (will be created if new). notes: Free-text notes. price_paid: Price paid for this spool. standalone_nozzle_temp_min: Min nozzle temp in Celsius. standalone_nozzle_temp_max: Max nozzle temp in Celsius. standalone_bed_temp_min: Min bed temp in Celsius. standalone_bed_temp_max: Max bed temp in Celsius. standalone_density: Filament density in g/cm3.

Inputs: standalone_name (required), notes, location, quantity, +11 more. Returns: result

search_inventoryA

Search inventory items by keyword, brand, part type, or location.

Args: query: Free-text search across title, brand, part type, location, and notes. brand: Filter by brand name (exact match on brand__name). part_type: Filter by part type name (exact match on part_type__name). location: Filter by location name (exact match on location__name).

Inputs: brand, query, location, part_type. Returns: result

toggle_material_favoriteA

Toggle the favorite status of a material blueprint (max 5 favorites).

Args: material_id: The ID of the material blueprint.

Inputs: material_id (required). Returns: result

update_file_statusB

Update the print status or printed quantity of a tracker file.

Args: file_id: The ID of the tracker file. status: New status for the file. printed_quantity: Number of copies printed so far.

Inputs: file_id (required), status, printed_quantity. Returns: result

update_inventory_itemA

Update an existing inventory item. Only the fields you provide will be changed.

Args: item_id: The ID of the inventory item to update. title: New title. quantity: New quantity on hand. brand: Brand name (will be created if new). part_type: Part type name (will be created if new). location: Location name (will be created if new). cost: Unit cost. is_consumable: Whether this is a consumable item. low_stock_threshold: Low stock alert threshold. notes: Free-text notes. vendor: Vendor name (will be created if new). vendor_link: URL to vendor product page. model: Model/part number.

Inputs: item_id (required), cost, brand, model, +9 more. Returns: result

update_modA

Update a printer mod. Only the fields you provide will be changed.

Args: mod_id: The ID of the mod to update. name: New name for the mod. link: URL to the mod. status: New status — 'Planned', 'In Progress', 'Completed'.

Inputs: mod_id (required), link, name, status. Returns: result

update_printerA

Update a printer record. Only the fields you provide will be changed.

Args: printer_id: The ID of the printer to update. title: New title. status: New status (e.g. 'Active', 'Under Repair', 'Retired'). serial_number: Serial number. notes: Free-text notes. purchase_price: Purchase price. maintenance_notes: Maintenance notes. manufacturer: Manufacturer/brand name (will be created if new).

Inputs: printer_id (required), notes, title, status, +4 more. Returns: result

update_projectA

Update a project. Only the fields you provide will be changed.

Args: project_id: The ID of the project to update. project_name: New project name. description: New description. status: New status — 'Planning', 'In Progress', 'On Hold', 'Completed', 'Canceled'. start_date: Start date in YYYY-MM-DD format. due_date: Due date in YYYY-MM-DD format. notes: Free-text notes.

Inputs: project_id (required), notes, status, due_date, +3 more. Returns: result

update_spool_weightA

Update the current weight of an opened filament spool. Auto-updates status based on remaining weight.

Args: spool_id: The ID of the spool to update. current_weight: The current net filament weight in grams.

Inputs: spool_id (required), current_weight (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 40 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes, with only a few close pairs like add_filament_spool vs quick_add_spool and list_spools vs get_material_spools. Descriptions sufficiently clarify these boundaries, so an agent can usually select the right tool.

    Naming Consistency5/5

    All 40 tools follow a consistent verb_noun pattern in snake_case: list_* for collections, get_* for single items, and create_*/add_*/update_* for mutations. Even longer names like create_tracker_from_github maintain this convention throughout.

    Tool Count2/5

    With 40 tools, this server far exceeds the 25-tool threshold for being too heavy. While the multiple domains (materials, inventory, printers, projects, trackers) justify some breadth, the sheer volume makes the surface unwieldy and harder for agents to navigate.

    Completeness2/5

    The surface has significant gaps: there are no delete operations for any entity, no get for materials or spools, no general update for spools beyond weight/status, and no way to unlink a printer from a project or remove a BOM item. These missing operations will cause agent dead ends in common workflows.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables users to connect Claude with various 3D printer management systems, allowing tasks like printer status monitoring, file management, print job control, and STL file manipulation.
      9,494 npm
      GPL 2.0
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to manage inventory items, locations, and labels in a self-hosted Homebox instance using natural language, with support for flexible URL configurations.
      21
      3
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to operate a 3D print farm via O.D.I.N. backend, including job queuing, printer control, inventory management, and standalone cost calculators.
      14 npm
      Apache 2.0
    • A
      license
      B
      quality
      D
      maintenance
      Enables AI assistants to manage 3D printer filament inventory through Spoolman's API, allowing natural language queries and commands for CRUD operations on vendors, filaments, spools, settings, and more.
      34
      23 npm
      19
      MIT