Skip to main content
Glama
devlimelabs

Lulu Print MCP Server

by devlimelabs

Lulu Print MCP Server

A Model Context Protocol (MCP) server that provides integration with Lulu Print API for print-on-demand services through Claude Desktop and other MCP clients.

Features

📚 Print Job Management

  • Create and manage print jobs for books and other printed materials

  • Track order status from creation to delivery

  • Calculate costs before placing orders

  • Support for multiple line items per order

📄 File Validation

  • Validate interior PDF files before printing

  • Validate cover PDF files with dimension checking

  • Calculate required cover dimensions based on page count

  • Get detailed validation status and error reporting

💰 Cost Calculation

  • Calculate product costs based on specifications

  • Include shipping and tax calculations

  • Support for different shipping levels (MAIL to EXPRESS)

  • Get detailed cost breakdowns

🚚 Shipping Management

  • Retrieve available shipping options by destination

  • Support for international shipping

  • Different service levels from standard mail to express delivery

🔔 Webhooks

  • Subscribe to print job status changes

  • Manage webhook endpoints

  • Test webhook delivery

  • View webhook submission history

Related MCP server: bizprint-mcp-server

Installation

Global Installation

# Install the package globally
npm install -g @devlimelabs/lulu-print-mcp

# Start the server
lulu-print-mcp

Local Development

# Clone the repository
git clone https://github.com/devlimelabs/lulu-print-mcp.git
cd lulu-print-mcp

# Install dependencies
npm install

# Set up development environment
npm run setup:dev

# Start the development server
npm run dev

Docker Installation

# Build and run with Docker Compose
docker-compose up -d

# Or build and run the Docker image directly
docker build -t lulu-print-mcp .
docker run -p 3000:3000 lulu-print-mcp

Configuration

1. Get Lulu API Credentials

  1. Sign up for a Lulu developer account at https://developers.lulu.com/

  2. For testing, create a sandbox account at https://developers.sandbox.lulu.com/

  3. Navigate to your API Keys page

  4. Copy your client key and client secret

2. Configure Environment Variables

# Create a configuration file
cp .env.example .env

Edit the .env file with your Lulu API credentials:

# Required: Your Lulu API credentials
LULU_CLIENT_KEY=your_client_key_here
LULU_CLIENT_SECRET=your_client_secret_here

# Optional: API endpoints (defaults are provided)
LULU_API_URL=https://api.lulu.com
LULU_SANDBOX_API_URL=https://api.sandbox.lulu.com
LULU_AUTH_URL=https://api.lulu.com/auth/realms/glasstree/protocol/openid-connect/token
LULU_SANDBOX_AUTH_URL=https://api.sandbox.lulu.com/auth/realms/glasstree/protocol/openid-connect/token

# Use sandbox environment for testing (default: false)
LULU_USE_SANDBOX=false

# Enable debug logging (default: false)
DEBUG=false

Usage with Claude Desktop

Add this MCP server to your Claude Desktop configuration file:

# Run the Claude Desktop setup script
npm run setup:claude

Follow the instructions to update your Claude Desktop configuration file. The script will generate a configuration similar to:

{
  "mcpServers": {
    "lulu-print": {
      "command": "lulu-print-mcp",
      "env": {
        "LULU_CLIENT_KEY": "your_client_key",
        "LULU_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Usage with Cursor

Add this MCP server to your Cursor configuration file:

  1. Open Cursor Settings (Cursor → Settings or Cmd+, on Mac)

  2. Navigate to the Features section

  3. Find the "Model Context Protocol" settings

  4. Add the following configuration:

{
  "mcpServers": {
    "lulu-print": {
      "command": "node",
      "args": ["/path/to/global/lulu-print-mcp/dist/index.js"],
      "env": {
        "LULU_CLIENT_KEY": "your_client_key",
        "LULU_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Or if installed globally:

{
  "mcpServers": {
    "lulu-print": {
      "command": "lulu-print-mcp",
      "env": {
        "LULU_CLIENT_KEY": "your_client_key",
        "LULU_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Usage with Windsurf

Add this MCP server to your Windsurf configuration:

  1. Create or edit the .windsurf/config.json file in your project directory

  2. Add the following configuration:

{
  "mcpServers": {
    "lulu-print": {
      "command": "lulu-print-mcp",
      "env": {
        "LULU_CLIENT_KEY": "your_client_key",
        "LULU_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

For development setup with Windsurf:

{
  "mcpServers": {
    "lulu-print": {
      "command": "tsx",
      "args": ["src/index.ts"],
      "cwd": "/path/to/lulu-print-mcp",
      "env": {
        "LULU_CLIENT_KEY": "your_client_key",
        "LULU_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Available Tools

Cost Calculation

calculate-print-job-cost

Calculate the cost of a print job without creating it:

calculate-print-job-cost
  line_items: Array of items to price
    - pod_package_id: Product SKU (e.g., "0600X0900BWSTDPB060UW444MXX")
    - page_count: Number of pages
    - quantity: Number of copies
  shipping_address: Delivery address
    - street1: Street address
    - city: City name
    - country_code: 2-letter ISO country code
    - postcode: Postal code
    - phone_number: Contact phone
  shipping_option: MAIL | PRIORITY_MAIL | GROUND | EXPEDITED | EXPRESS

Print Job Management

create-print-job

Create a new print job order:

create-print-job
  line_items: Array of books to print
    - title: Book title
    - cover_url: URL to cover PDF
    - interior_url: URL to interior PDF
    - pod_package_id: Product SKU
    - quantity: Number of copies
  shipping_address: Delivery address
    - name: Recipient name
    - street1: Street address
    - city: City
    - country_code: 2-letter ISO code
    - postcode: Postal code
    - phone_number: Phone
  contact_email: Email for order communication
  shipping_level: MAIL | PRIORITY_MAIL | GROUND | EXPEDITED | EXPRESS
  external_id: Your order reference (optional)

list-print-jobs

List print jobs with optional filters:

list-print-jobs
  page: Page number (optional)
  page_size: Results per page (optional)
  status: Filter by status (optional)
  created_after: Filter by creation date (optional)
  created_before: Filter by creation date (optional)

get-print-job

Get details of a specific print job:

get-print-job
  id: Print job ID

update-print-job

Update a print job (only before payment):

update-print-job
  id: Print job ID
  external_id: New reference (optional)
  contact_email: New email (optional)

cancel-print-job

Cancel a print job (only if unpaid):

cancel-print-job
  id: Print job ID

get-print-job-status

Get the current status of a print job:

get-print-job-status
  id: Print job ID

get-print-job-costs

Get detailed costs for a print job:

get-print-job-costs
  id: Print job ID

get-print-job-statistics

Get statistics for print jobs over a time period:

get-print-job-statistics
  start_date: Start date (YYYY-MM-DD) (optional)
  end_date: End date (YYYY-MM-DD) (optional)
  group_by: DAY | WEEK | MONTH (optional)

File Validation

validate-interior-file

Validate an interior PDF file:

validate-interior-file
  file_url: URL to interior PDF
  pod_package_id: Product SKU (optional, for normalization)

get-interior-validation

Check validation status:

get-interior-validation
  validation_id: ID from validate-interior-file

calculate-cover-dimensions

Calculate required cover dimensions:

calculate-cover-dimensions
  pod_package_id: Product SKU
  page_count: Number of interior pages
  unit: IN | MM | PT (optional, default: PT)

validate-cover-file

Validate a cover PDF file:

validate-cover-file
  file_url: URL to cover PDF
  pod_package_id: Product SKU
  page_count: Number of interior pages

get-cover-validation

Check cover validation status:

get-cover-validation
  validation_id: ID from validate-cover-file

Shipping

get-shipping-options

Get available shipping options:

get-shipping-options
  country_code: 2-letter ISO country code
  state_code: State/province code (optional)
  quantity: Number of items (optional)
  pod_package_id: Product SKU (optional)
  page_count: Number of pages (optional)
  level: Filter by specific level (optional)

Webhooks

create-webhook

Create a webhook subscription:

create-webhook
  url: Webhook endpoint URL
  topics: Array of events (currently supports ["PRINT_JOB_STATUS_CHANGED"])

list-webhooks

List all webhook subscriptions:

list-webhooks

get-webhook

Get webhook details:

get-webhook
  id: Webhook ID

update-webhook

Update a webhook:

update-webhook
  id: Webhook ID
  url: New URL (optional)
  topics: New topics (optional)
  is_active: Enable/disable (optional)

delete-webhook

Delete a webhook:

delete-webhook
  id: Webhook ID

test-webhook

Send a test webhook:

test-webhook
  id: Webhook ID
  topic: PRINT_JOB_STATUS_CHANGED

list-webhook-submissions

List webhook delivery attempts:

list-webhook-submissions
  webhook_id: Filter by webhook (optional)
  page: Page number (optional)
  page_size: Results per page (optional)

Lulu Product SKUs

Lulu uses a 27-character SKU system to identify products:

Format: Trim Size + Color + Print Quality + Bind + Paper + PPI + Finish + Linen + Foil

Common Examples

SKU

Description

0850X1100BWSTDLW060UW444MNG

8.5" x 11" black-and-white standard linen wrap with navy linen and gold foil

0600X0900FCSTDPB080CW444GXX

6" x 9" full color standard paperback with glossy cover

0700X1000FCPRECO060UC444MXX

7" x 10" full color premium coil-bound with matte cover

0600X0900BWSTDPB060UW444MXX

6" x 9" black-and-white standard paperback with matte cover

Use the Lulu Pricing Calculator to generate SKUs for your specific needs.

Testing with Sandbox

To use the Lulu sandbox environment for testing:

  1. Create a sandbox account at https://developers.sandbox.lulu.com/

  2. Get your sandbox API credentials

  3. Set LULU_USE_SANDBOX=true in your .env file

  4. Or use the --sandbox flag when running the CLI: lulu-print-mcp --sandbox

In sandbox mode:

  • Use test credit card numbers for payments

  • Orders won't be sent to real production

  • Perfect for development and testing

Command Line Options

lulu-print-mcp [options]

Options:
  -s, --sandbox    Use Lulu sandbox environment instead of production
  -d, --debug      Enable debug logging
  -h, --help       Display help
  -V, --version    Display version

Troubleshooting

Authentication Issues

  • Verify your client key and secret are correct

  • Check if you're using the right environment (production vs sandbox)

  • Ensure your API credentials have the necessary permissions

File Validation Errors

  • Ensure PDF files are publicly accessible via URL

  • Check file format requirements in Lulu's documentation

  • Verify page count and dimensions match the product specifications

Network Issues

  • Check your internet connection

  • Verify firewall settings allow HTTPS connections to api.lulu.com

  • Enable debug mode to see detailed request/response logs

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT

Available Tools

2 tools
calculate-print-job-costA

Calculate the cost of a print job without creating it

ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYesLulu product ID
quantityYesNumber of copies

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It clearly indicates this is a read-only calculation tool (not creating anything), which is helpful. However, it doesn't mention potential limitations like rate limits, authentication requirements, or what specific cost components are included in the calculation.

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?

The description is a single, efficient sentence that communicates the essential purpose without any wasted words. It's appropriately sized for a simple calculation tool and front-loads the key information.

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?

For a 2-parameter calculation tool with no annotations and no output schema, the description provides adequate but minimal context. It clearly states the purpose but doesn't explain what the output looks like (cost format, currency, breakdown) or any prerequisites for successful calculation.

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 the schema already fully documents both parameters. The description doesn't add any additional meaning or context about the parameters beyond what's in the schema. This meets the baseline expectation when schema coverage is complete.

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 clearly states the specific action ('calculate the cost') and resource ('print job'), and explicitly distinguishes it from the alternative action of creating a print job. This provides excellent clarity about what the tool does and what it doesn't do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context about when to use this tool ('without creating it'), which implicitly suggests it's for cost estimation before actual creation. However, it doesn't explicitly mention when NOT to use it or provide specific alternatives beyond the implied contrast with creation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-product-detailsB

Get specifications and details for a Lulu product

ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYesLulu product ID

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. The description states it 'gets' details, implying a read-only operation, but doesn't clarify permissions, rate limits, error conditions, or what 'specifications and details' includes. For a tool with zero annotation coverage, this is insufficient 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded with the core action and resource, making it easy to parse. Every word earns its place, achieving optimal conciseness.

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?

Given the tool's low complexity (single parameter, no output schema, no annotations), the description is minimally adequate. It covers the basic purpose but lacks details on behavior, usage context, and output format. Without annotations or output schema, the agent must rely heavily on the description, which is incomplete for informed tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the single parameter 'product_id' documented as 'Lulu product ID'. The description doesn't add any parameter-specific information beyond what the schema provides, such as format examples or constraints. With high schema coverage, the baseline score of 3 is appropriate.

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 clearly states the action ('Get') and resource ('specifications and details for a Lulu product'), making the purpose understandable. However, it doesn't differentiate from the sibling tool 'calculate-print-job-cost', which appears unrelated but could potentially overlap in product context. The description is specific but lacks sibling distinction.

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 guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites, context, or exclusions. With only one sibling tool that seems unrelated (cost calculation), the lack of explicit usage guidelines leaves the agent to infer based on tool names alone.

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. Dates show when Glama detected each change.

  1. 2 tool updates
    • First observedcalculate-print-job-cost
    • First observedget-product-details

TDQS

B3.2/5.0
Disambiguation5/5

The two tools have completely distinct purposes: one calculates costs for print jobs, while the other retrieves product specifications. There is no overlap in functionality, making it impossible for an agent to confuse them.

Naming Consistency3/5

Both tools use a verb-object naming pattern, but they mix conventions: 'calculate-print-job-cost' uses kebab-case, while 'get-product-details' uses hyphenation inconsistently with the first. The verbs 'calculate' and 'get' are clear but not perfectly aligned in style.

Tool Count2/5

With only two tools, the server feels thin for a print service domain. It lacks essential operations like creating print jobs, managing orders, or handling payments, which are core to such a service. The count is too low for the apparent scope.

Completeness2/5

The tool surface is severely incomplete for a print service. It covers cost calculation and product details but misses critical operations such as job creation, order submission, status tracking, and payment processing, leaving significant gaps that will cause agent failures.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Connect AI agents to physical printers. Print receipts, shipping labels, and packing slips to your existing BizPrint-connected printers from Claude and other MCP clients.
    7
    1
    MIT
  • 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.
    112
    GPL 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/devlimelabs/lulu-print-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server