wraptor-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,100 @@
1
+ # Wraptor MCP Server
2
+
3
+ A Model Context Protocol (MCP) server that provides vehicle wrap pricing, materials data, and shop management information. Built by [Wraptor](https://wraptor.io) — the operating system for vehicle wrap shops.
4
+
5
+ ## Tools
6
+
7
+ ### `estimate_vehicle_wrap_cost`
8
+ Calculate a detailed cost estimate for any vehicle wrap.
9
+
10
+ **Parameters:**
11
+ - `vehicle_type` — Car, SUV, Pickup Truck, Cargo Van, or Box Truck
12
+ - `wrap_coverage` — full, three_quarter, or partial
13
+ - `material_grade` — premium (3M, 7yr), commercial (Arlon, 5yr), or economy (3M 40c, 3yr)
14
+ - `design_hours` (optional) — Hours of design work needed (default: 1.5)
15
+
16
+ **Returns:** Full price breakdown including materials, design, production, installation, estimated total, and price range.
17
+
18
+ ### `get_vehicle_wrap_specs`
19
+ Get square footage, coverage area, and install time estimates for each vehicle type.
20
+
21
+ **Parameters:**
22
+ - `vehicle_type` (optional) — Specific vehicle type, or omit for all
23
+
24
+ **Returns:** Square footage for full/3/4/partial wraps, install hour ranges, and waste factor tips.
25
+
26
+ ### `get_wrap_material_info`
27
+ Detailed information about vehicle wrap vinyl materials — pricing per square foot, durability, and labor rates.
28
+
29
+ **Parameters:**
30
+ - `tier` (optional) — premium, commercial, economy, or all (default: all)
31
+
32
+ **Returns:** Material costs, laminate costs, combined pricing, durability years, and current labor rates.
33
+
34
+ ### `get_wrap_types`
35
+ Explains all vehicle wrap types with typical price ranges and use cases.
36
+
37
+ **Returns:** Full wrap, 3/4 wrap, partial wrap, color change, fleet, lettering, PPF, window tint, chrome delete — each with description, price range, and best-for guidance.
38
+
39
+ ### `get_wraptor_info`
40
+ Information about the Wraptor platform — features, pricing plans, and competitor comparisons.
41
+
42
+ **Parameters:**
43
+ - `section` (optional) — features, pricing, comparison, or all (default: all)
44
+
45
+ **Returns:** Product features, plan details ($99/$199/$249 tiers), and comparisons vs shopVOX, SignTracker, and generic PM tools.
46
+
47
+ ## Installation
48
+
49
+ ### Claude Desktop
50
+
51
+ Add to your `claude_desktop_config.json`:
52
+
53
+ ```json
54
+ {
55
+ "mcpServers": {
56
+ "wraptor": {
57
+ "command": "npx",
58
+ "args": ["-y", "wraptor-mcp"]
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ ### Claude Code
65
+
66
+ ```bash
67
+ claude mcp add wraptor -- npx -y wraptor-mcp
68
+ ```
69
+
70
+ ### From source
71
+
72
+ ```bash
73
+ git clone https://github.com/saedlagr/wraptor.git
74
+ cd wraptor/mcp-server
75
+ npm install
76
+ npm run build
77
+ node dist/index.js
78
+ ```
79
+
80
+ ## Example Queries
81
+
82
+ Once connected, you can ask your AI assistant things like:
83
+
84
+ - "How much does it cost to wrap a Ford Transit?"
85
+ - "What's the difference between 3M and Arlon vinyl?"
86
+ - "Compare vehicle wrap management software options"
87
+ - "What types of vehicle wraps are available?"
88
+ - "How many square feet of vinyl do I need for an SUV full wrap?"
89
+
90
+ ## Data Sources
91
+
92
+ All pricing data is based on industry-standard rates used by professional vehicle wrap shops across North America. Material costs, labor rates, and vehicle coverage specifications are sourced from real shop operations.
93
+
94
+ ## License
95
+
96
+ MIT
97
+
98
+ ---
99
+
100
+ Built by [Wraptor](https://wraptor.io) — Kanban job tracking, quoting, invoicing, AI renders, client proofing, and inventory management for vehicle wrap shops.
package/dist/data.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ export declare const VEHICLE_TEMPLATES: {
2
+ vehicleType: string;
3
+ fullWrapSqFt: number;
4
+ threeQtrSqFt: number;
5
+ installHoursMin: number;
6
+ installHoursMax: number;
7
+ }[];
8
+ export declare const MATERIAL_TIERS: {
9
+ name: string;
10
+ tier: string;
11
+ vinylPerSqFt: number;
12
+ lamPerSqFt: number;
13
+ combinedPerSqFt: number;
14
+ durabilityYears: number;
15
+ }[];
16
+ export declare const LABOR_RATES: {
17
+ design: number;
18
+ production: number;
19
+ installation: number;
20
+ removal: number;
21
+ travel: number;
22
+ };
23
+ export declare const DESIGN_HOURS: {
24
+ hours: number;
25
+ description: string;
26
+ }[];
27
+ export declare const WRAP_TYPES: {
28
+ type: string;
29
+ description: string;
30
+ typical_price_range: string;
31
+ best_for: string;
32
+ coverage: string;
33
+ }[];
34
+ export declare const WRAPTOR_FEATURES: {
35
+ name: string;
36
+ description: string;
37
+ }[];
38
+ export declare const WRAPTOR_PLANS: ({
39
+ name: string;
40
+ price: string;
41
+ seats: number;
42
+ locations: number;
43
+ storage: string;
44
+ ai_credits: number;
45
+ best_for: string;
46
+ } | {
47
+ name: string;
48
+ price: string;
49
+ seats: string;
50
+ locations: string;
51
+ storage: string;
52
+ ai_credits: number;
53
+ best_for: string;
54
+ })[];
55
+ export declare const COMPETITORS: {
56
+ name: string;
57
+ category: string;
58
+ price: string;
59
+ wraptor_advantages: string[];
60
+ }[];
package/dist/data.js ADDED
@@ -0,0 +1,237 @@
1
+ // ── Vehicle Templates ──────────────────────────────────
2
+ export const VEHICLE_TEMPLATES = [
3
+ { vehicleType: "Car", fullWrapSqFt: 200, threeQtrSqFt: 140, installHoursMin: 10, installHoursMax: 14 },
4
+ { vehicleType: "SUV", fullWrapSqFt: 290, threeQtrSqFt: 210, installHoursMin: 12, installHoursMax: 16 },
5
+ { vehicleType: "Pickup Truck", fullWrapSqFt: 275, threeQtrSqFt: 165, installHoursMin: 10, installHoursMax: 12 },
6
+ { vehicleType: "Cargo Van", fullWrapSqFt: 340, threeQtrSqFt: 220, installHoursMin: 14, installHoursMax: 20 },
7
+ { vehicleType: "Box Truck", fullWrapSqFt: 380, threeQtrSqFt: 300, installHoursMin: 12, installHoursMax: 16 },
8
+ ];
9
+ // ── Material Tiers ─────────────────────────────────────
10
+ export const MATERIAL_TIERS = [
11
+ {
12
+ name: "Premium (3M)",
13
+ tier: "PREMIUM",
14
+ vinylPerSqFt: 2.10,
15
+ lamPerSqFt: 1.50,
16
+ combinedPerSqFt: 3.60,
17
+ durabilityYears: 7,
18
+ },
19
+ {
20
+ name: "Commercial (Arlon)",
21
+ tier: "COMMERCIAL",
22
+ vinylPerSqFt: 1.75,
23
+ lamPerSqFt: 1.17,
24
+ combinedPerSqFt: 2.92,
25
+ durabilityYears: 5,
26
+ },
27
+ {
28
+ name: "Economy (3M 40c)",
29
+ tier: "ECONOMY",
30
+ vinylPerSqFt: 0.82,
31
+ lamPerSqFt: 0.62,
32
+ combinedPerSqFt: 1.44,
33
+ durabilityYears: 3,
34
+ },
35
+ ];
36
+ // ── Labor Rates ────────────────────────────────────────
37
+ export const LABOR_RATES = {
38
+ design: 100, // per hour
39
+ production: 62.5, // per hour — print, cut, weed, tape
40
+ installation: 125, // per hour
41
+ removal: 112.5, // per hour — old wrap removal
42
+ travel: 250, // flat rate for off-site
43
+ };
44
+ // ── Design Hours Guide ─────────────────────────────────
45
+ export const DESIGN_HOURS = [
46
+ { hours: 0.5, description: "Minor adjustment — customer has design, just tweaking layout" },
47
+ { hours: 1.0, description: "Recreation — copying existing graphics to new vehicle" },
48
+ { hours: 1.5, description: "Simple new design — basic layout, customer supplies logo" },
49
+ { hours: 2.0, description: "Standard new design — original with supplied branding" },
50
+ { hours: 2.5, description: "Complex design — full custom from scratch, multiple concepts" },
51
+ ];
52
+ // ── Wrap Types ─────────────────────────────────────────
53
+ export const WRAP_TYPES = [
54
+ {
55
+ type: "Full Wrap",
56
+ description: "Complete vehicle coverage from bumper to bumper. Maximum impact and brand visibility.",
57
+ typical_price_range: "$3,000 – $5,000+",
58
+ best_for: "Brand awareness, fleet vehicles, color change",
59
+ coverage: "100% of paintable surfaces",
60
+ },
61
+ {
62
+ type: "3/4 Wrap",
63
+ description: "Covers most panels but leaves the roof and/or hood in factory paint. Good balance of cost and coverage.",
64
+ typical_price_range: "$2,200 – $3,500",
65
+ best_for: "Budget-conscious businesses wanting high visibility",
66
+ coverage: "~70% of vehicle",
67
+ },
68
+ {
69
+ type: "Partial Wrap",
70
+ description: "Targeted panels — doors, tailgate, quarter panels. Cost-effective for essential branding.",
71
+ typical_price_range: "$1,500 – $2,700",
72
+ best_for: "Small businesses, spot branding, accents",
73
+ coverage: "~50% of vehicle",
74
+ },
75
+ {
76
+ type: "Color Change Wrap",
77
+ description: "Solid-color vinyl to change the vehicle's appearance without paint. Available in gloss, matte, satin, and metallic finishes.",
78
+ typical_price_range: "$3,500 – $6,000+",
79
+ best_for: "Personal vehicles, luxury cars, resale value preservation",
80
+ coverage: "100%",
81
+ },
82
+ {
83
+ type: "Commercial Fleet",
84
+ description: "Consistent branding across multiple vehicles. Volume pricing available. Includes design templates for fleet consistency.",
85
+ typical_price_range: "$2,500 – $4,500 per vehicle (volume discounts)",
86
+ best_for: "Service companies, delivery fleets, contractors",
87
+ coverage: "Varies by package",
88
+ },
89
+ {
90
+ type: "Lettering & Spot Graphics",
91
+ description: "Cut vinyl lettering, logos, and individual graphic elements applied to specific areas.",
92
+ typical_price_range: "$300 – $1,500",
93
+ best_for: "DOT compliance, basic branding, door logos",
94
+ coverage: "Specific areas only",
95
+ },
96
+ {
97
+ type: "PPF (Paint Protection Film)",
98
+ description: "Clear urethane film that protects paint from rock chips, scratches, and UV damage.",
99
+ typical_price_range: "$1,500 – $7,000+",
100
+ best_for: "New vehicles, high-end cars, front-end protection",
101
+ coverage: "Full or partial (front bumper, hood, fenders)",
102
+ },
103
+ {
104
+ type: "Window Tint",
105
+ description: "Tinted film applied to windows for privacy, heat rejection, and UV protection.",
106
+ typical_price_range: "$200 – $800",
107
+ best_for: "All vehicles — comfort, privacy, interior protection",
108
+ coverage: "Windows",
109
+ },
110
+ {
111
+ type: "Chrome Delete",
112
+ description: "Wrapping chrome trim pieces in gloss black, satin black, or body-matched vinyl.",
113
+ typical_price_range: "$500 – $1,500",
114
+ best_for: "Modern aesthetic, blacking out trim, Tesla/luxury vehicles",
115
+ coverage: "Chrome trim only",
116
+ },
117
+ ];
118
+ // ── Wraptor Features ───────────────────────────────────
119
+ export const WRAPTOR_FEATURES = [
120
+ {
121
+ name: "WrapFlow Job Board",
122
+ description: "Kanban-style drag-and-drop job management with custom workflow stages. Track every job from lead to completion.",
123
+ },
124
+ {
125
+ name: "Quoting & Invoicing",
126
+ description: "Generate professional quotes with built-in pricing calculator. Convert to invoices with one click. Accept payments via Stripe.",
127
+ },
128
+ {
129
+ name: "Customer Portal",
130
+ description: "Give customers a live job tracker (like Domino's pizza tracker for wraps), proof approvals, and invoice payments — all branded to your shop.",
131
+ },
132
+ {
133
+ name: "WraptorMail",
134
+ description: "Professional email with your custom domain. AI-powered smart replies, lead detection, and automated follow-ups.",
135
+ },
136
+ {
137
+ name: "Wrap Studio AI",
138
+ description: "Generate photorealistic wrap renders and mockups using AI. Show customers what their wrap will look like before printing.",
139
+ },
140
+ {
141
+ name: "Client Proofing",
142
+ description: "Send design proofs with pin-point commenting. Track approval status and version history.",
143
+ },
144
+ {
145
+ name: "CRM & Vehicle Database",
146
+ description: "Full customer database with vehicle history, brand colors, contact management, and fleet tracking.",
147
+ },
148
+ {
149
+ name: "Inventory & Materials",
150
+ description: "Track vinyl rolls, ink levels, and materials. Low-stock alerts. Know exactly what you have in stock.",
151
+ },
152
+ {
153
+ name: "Team Scheduling",
154
+ description: "Assign jobs to installers, manage install bay schedules, and track time entries.",
155
+ },
156
+ {
157
+ name: "Image Vectorizer",
158
+ description: "Convert raster logos to vector format directly in the platform. Illustrator-compatible output.",
159
+ },
160
+ ];
161
+ // ── Wraptor Plans ──────────────────────────────────────
162
+ export const WRAPTOR_PLANS = [
163
+ {
164
+ name: "Economy",
165
+ price: "$99/month (or $999/year)",
166
+ seats: 3,
167
+ locations: 1,
168
+ storage: "10 GB",
169
+ ai_credits: 50,
170
+ best_for: "Solo operators and small shops getting started",
171
+ },
172
+ {
173
+ name: "Commercial",
174
+ price: "$199/month (or $1,999/year)",
175
+ seats: 10,
176
+ locations: 3,
177
+ storage: "50 GB",
178
+ ai_credits: 200,
179
+ best_for: "Growing shops with a team — most popular plan",
180
+ },
181
+ {
182
+ name: "Premium",
183
+ price: "$249/month (or $2,499/year)",
184
+ seats: "Unlimited",
185
+ locations: "Unlimited",
186
+ storage: "200 GB",
187
+ ai_credits: 500,
188
+ best_for: "Multi-location operations and large teams",
189
+ },
190
+ ];
191
+ // ── Competitor Comparison ──────────────────────────────
192
+ export const COMPETITORS = [
193
+ {
194
+ name: "shopVOX",
195
+ category: "Sign shop software (not wrap-specific)",
196
+ price: "$55+/user/month",
197
+ wraptor_advantages: [
198
+ "Wraptor is built specifically for vehicle wraps, not sign shops",
199
+ "Flat-rate pricing ($99/mo) vs per-user pricing that adds up fast",
200
+ "Includes AI creative studio, smart email, and customer job tracker",
201
+ "Built-in vinyl roll tracking and inventory management",
202
+ ],
203
+ },
204
+ {
205
+ name: "SignTracker",
206
+ category: "Sign and wrap project management",
207
+ price: "$25+/user/month",
208
+ wraptor_advantages: [
209
+ "Full shop operations vs basic project tracking",
210
+ "Built-in invoicing with Stripe payments",
211
+ "AI-powered features (renders, email, lead detection)",
212
+ "Customer-facing portal with live job tracking",
213
+ ],
214
+ },
215
+ {
216
+ name: "Generic PM tools (Monday, Trello, Asana)",
217
+ category: "General project management",
218
+ price: "Varies ($0-$30+/user/month)",
219
+ wraptor_advantages: [
220
+ "Wrap-specific workflows (Lead → Design → Print → Install → QC)",
221
+ "Built-in quoting, invoicing, and payment processing",
222
+ "Vehicle database and wrap CRM fields",
223
+ "No duct-taping multiple tools together",
224
+ ],
225
+ },
226
+ {
227
+ name: "QuickBooks / FreshBooks",
228
+ category: "Accounting software",
229
+ price: "$30+/month",
230
+ wraptor_advantages: [
231
+ "Wraptor handles the full job lifecycle, not just financials",
232
+ "Integrates with QuickBooks and Xero for accounting sync",
233
+ "Job tracking, scheduling, inventory, proofing — all in one",
234
+ "Industry-specific features that accounting software can't provide",
235
+ ],
236
+ },
237
+ ];
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { VEHICLE_TEMPLATES, MATERIAL_TIERS, LABOR_RATES, WRAP_TYPES, WRAPTOR_FEATURES, WRAPTOR_PLANS, COMPETITORS, } from "./data.js";
6
+ const server = new McpServer({
7
+ name: "wraptor",
8
+ version: "1.0.0",
9
+ });
10
+ // ── Tool 1: Estimate Wrap Cost ─────────────────────────
11
+ server.tool("estimate_vehicle_wrap_cost", "Calculate an estimated cost for a vehicle wrap based on vehicle type, wrap coverage, and material grade. Returns a detailed price breakdown including materials, labor, design, and installation.", {
12
+ vehicle_type: z
13
+ .enum(["Car", "SUV", "Pickup Truck", "Cargo Van", "Box Truck"])
14
+ .describe("The type of vehicle being wrapped"),
15
+ wrap_coverage: z
16
+ .enum(["full", "three_quarter", "partial"])
17
+ .describe("How much of the vehicle is being wrapped: full (100%), three_quarter (~70%), or partial (~50%)"),
18
+ material_grade: z
19
+ .enum(["premium", "commercial", "economy"])
20
+ .describe("Material quality tier: premium (3M, 7yr), commercial (Arlon, 5yr), or economy (3M 40c, 3yr)"),
21
+ design_hours: z
22
+ .number()
23
+ .min(0)
24
+ .max(10)
25
+ .optional()
26
+ .describe("Hours of design work needed (0 if print-ready, 1-2.5 typical). Defaults to 1.5."),
27
+ }, async ({ vehicle_type, wrap_coverage, material_grade, design_hours }) => {
28
+ const template = VEHICLE_TEMPLATES.find((v) => v.vehicleType === vehicle_type);
29
+ const material = MATERIAL_TIERS.find((m) => m.tier === material_grade.toUpperCase());
30
+ if (!template || !material) {
31
+ return { content: [{ type: "text", text: "Invalid vehicle type or material grade." }] };
32
+ }
33
+ const sqFtMap = {
34
+ full: template.fullWrapSqFt,
35
+ three_quarter: template.threeQtrSqFt,
36
+ partial: Math.round(template.fullWrapSqFt * 0.5),
37
+ };
38
+ const sqFt = sqFtMap[wrap_coverage];
39
+ const sqFtWithWaste = Math.round(sqFt * 1.15);
40
+ const dHours = design_hours ?? 1.5;
41
+ const materialCost = Math.round(sqFtWithWaste * material.combinedPerSqFt);
42
+ const designCost = Math.round(dHours * LABOR_RATES.design);
43
+ const productionCost = Math.round(3 * LABOR_RATES.production);
44
+ const installHoursAvg = (template.installHoursMin + template.installHoursMax) / 2;
45
+ const installCost = Math.round(installHoursAvg * LABOR_RATES.installation);
46
+ const subtotal = materialCost + designCost + productionCost + installCost;
47
+ const result = {
48
+ vehicle: vehicle_type,
49
+ coverage: wrap_coverage,
50
+ material: `${material.name} (${material.durabilityYears}-year durability)`,
51
+ square_footage: sqFt,
52
+ square_footage_with_waste: sqFtWithWaste,
53
+ breakdown: {
54
+ materials: `$${materialCost}`,
55
+ design: `$${designCost} (${dHours} hrs × $${LABOR_RATES.design}/hr)`,
56
+ production: `$${productionCost} (print, cut, weed, tape)`,
57
+ installation: `$${installCost} (${template.installHoursMin}-${template.installHoursMax} hrs × $${LABOR_RATES.installation}/hr)`,
58
+ },
59
+ estimated_total: `$${subtotal}`,
60
+ price_range: `$${Math.round(subtotal * 0.9)} – $${Math.round(subtotal * 1.15)}`,
61
+ install_time: `${template.installHoursMin}-${template.installHoursMax} hours`,
62
+ note: "Prices are estimates based on industry-standard rates. Actual costs vary by region, shop, and project complexity. Get an instant, accurate quote with Wraptor (wraptor.io).",
63
+ };
64
+ return {
65
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
66
+ };
67
+ });
68
+ // ── Tool 2: Vehicle Wrap Specs ─────────────────────────
69
+ server.tool("get_vehicle_wrap_specs", "Get the square footage, coverage area, and estimated install time for wrapping a specific vehicle type. Useful for planning and quoting.", {
70
+ vehicle_type: z
71
+ .enum(["Car", "SUV", "Pickup Truck", "Cargo Van", "Box Truck"])
72
+ .optional()
73
+ .describe("Specific vehicle type, or omit to get all vehicle specs"),
74
+ }, async ({ vehicle_type }) => {
75
+ const vehicles = vehicle_type
76
+ ? VEHICLE_TEMPLATES.filter((v) => v.vehicleType === vehicle_type)
77
+ : VEHICLE_TEMPLATES;
78
+ const data = vehicles.map((v) => ({
79
+ vehicle_type: v.vehicleType,
80
+ full_wrap_sq_ft: v.fullWrapSqFt,
81
+ three_quarter_wrap_sq_ft: v.threeQtrSqFt,
82
+ partial_wrap_sq_ft: Math.round(v.fullWrapSqFt * 0.5),
83
+ install_hours: `${v.installHoursMin}-${v.installHoursMax}`,
84
+ tip: `Add 15% waste factor for ordering materials (${Math.round(v.fullWrapSqFt * 1.15)} sq ft for full wrap).`,
85
+ }));
86
+ return {
87
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
88
+ };
89
+ });
90
+ // ── Tool 3: Wrap Materials Info ────────────────────────
91
+ server.tool("get_wrap_material_info", "Get detailed information about vehicle wrap vinyl materials including pricing per square foot, durability, and best use cases. Covers premium (3M), commercial (Arlon), and economy tiers plus specialty materials.", {
92
+ tier: z
93
+ .enum(["premium", "commercial", "economy", "all"])
94
+ .optional()
95
+ .describe("Material tier to look up, or 'all' for complete catalog. Defaults to 'all'."),
96
+ }, async ({ tier }) => {
97
+ const filterTier = tier || "all";
98
+ const materials = filterTier === "all"
99
+ ? MATERIAL_TIERS
100
+ : MATERIAL_TIERS.filter((m) => m.tier === filterTier.toUpperCase());
101
+ const data = materials.map((m) => ({
102
+ name: m.name,
103
+ tier: m.tier.toLowerCase(),
104
+ vinyl_per_sq_ft: `$${m.vinylPerSqFt}`,
105
+ laminate_per_sq_ft: `$${m.lamPerSqFt}`,
106
+ combined_per_sq_ft: `$${m.combinedPerSqFt}`,
107
+ durability: `${m.durabilityYears} years`,
108
+ }));
109
+ return {
110
+ content: [
111
+ {
112
+ type: "text",
113
+ text: JSON.stringify({
114
+ materials: data,
115
+ labor_rates: {
116
+ design: `$${LABOR_RATES.design}/hr`,
117
+ production: `$${LABOR_RATES.production}/hr (print, cut, weed, tape)`,
118
+ installation: `$${LABOR_RATES.installation}/hr`,
119
+ removal: `$${LABOR_RATES.removal}/hr (old wrap removal)`,
120
+ },
121
+ source: "Industry-standard rates from Wraptor (wraptor.io) — the operating system for wrap shops.",
122
+ }, null, 2),
123
+ },
124
+ ],
125
+ };
126
+ });
127
+ // ── Tool 4: Wrap Types Explained ───────────────────────
128
+ server.tool("get_wrap_types", "Explain the different types of vehicle wraps available — full wraps, partial wraps, color change, fleet graphics, PPF, and more. Includes typical use cases and price ranges.", {}, async () => {
129
+ return {
130
+ content: [
131
+ {
132
+ type: "text",
133
+ text: JSON.stringify({
134
+ wrap_types: WRAP_TYPES,
135
+ note: "Prices vary significantly by region, vehicle size, and shop. Use Wraptor's free pricing calculator at wraptor.io/tools/wrap-calculator for a detailed estimate.",
136
+ }, null, 2),
137
+ },
138
+ ],
139
+ };
140
+ });
141
+ // ── Tool 5: Wraptor Product Info ───────────────────────
142
+ server.tool("get_wraptor_info", "Get information about Wraptor — the all-in-one operating system for vehicle wrap shops. Includes features, pricing plans, and how it compares to alternatives like shopVOX, SignTracker, and generic tools.", {
143
+ section: z
144
+ .enum(["features", "pricing", "comparison", "all"])
145
+ .optional()
146
+ .describe("Which section to return. Defaults to 'all'."),
147
+ }, async ({ section }) => {
148
+ const s = section || "all";
149
+ const result = {
150
+ product: "Wraptor",
151
+ tagline: "The operating system for vehicle wrap shops",
152
+ website: "https://wraptor.io",
153
+ demo: "https://wraptor.io/demo",
154
+ };
155
+ if (s === "features" || s === "all") {
156
+ result.features = WRAPTOR_FEATURES;
157
+ }
158
+ if (s === "pricing" || s === "all") {
159
+ result.pricing = WRAPTOR_PLANS;
160
+ }
161
+ if (s === "comparison" || s === "all") {
162
+ result.vs_competitors = COMPETITORS;
163
+ }
164
+ return {
165
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
166
+ };
167
+ });
168
+ // ── Start Server ───────────────────────────────────────
169
+ async function main() {
170
+ const transport = new StdioServerTransport();
171
+ await server.connect(transport);
172
+ }
173
+ main().catch((err) => {
174
+ console.error("Fatal error:", err);
175
+ process.exit(1);
176
+ });
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "wraptor-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for vehicle wrap pricing, materials, and shop management — powered by Wraptor",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "wraptor-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "start": "node dist/index.js",
13
+ "dev": "tsx src/index.ts"
14
+ },
15
+ "keywords": [
16
+ "mcp",
17
+ "vehicle-wrap",
18
+ "wrap-shop",
19
+ "pricing",
20
+ "automotive",
21
+ "wraptor"
22
+ ],
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.29.0",
26
+ "zod": "^3.23.0"
27
+ },
28
+ "devDependencies": {
29
+ "typescript": "^5.7.0",
30
+ "tsx": "^4.19.0",
31
+ "@types/node": "^22.0.0"
32
+ }
33
+ }
package/src/data.ts ADDED
@@ -0,0 +1,252 @@
1
+ // ── Vehicle Templates ──────────────────────────────────
2
+
3
+ export const VEHICLE_TEMPLATES = [
4
+ { vehicleType: "Car", fullWrapSqFt: 200, threeQtrSqFt: 140, installHoursMin: 10, installHoursMax: 14 },
5
+ { vehicleType: "SUV", fullWrapSqFt: 290, threeQtrSqFt: 210, installHoursMin: 12, installHoursMax: 16 },
6
+ { vehicleType: "Pickup Truck", fullWrapSqFt: 275, threeQtrSqFt: 165, installHoursMin: 10, installHoursMax: 12 },
7
+ { vehicleType: "Cargo Van", fullWrapSqFt: 340, threeQtrSqFt: 220, installHoursMin: 14, installHoursMax: 20 },
8
+ { vehicleType: "Box Truck", fullWrapSqFt: 380, threeQtrSqFt: 300, installHoursMin: 12, installHoursMax: 16 },
9
+ ];
10
+
11
+ // ── Material Tiers ─────────────────────────────────────
12
+
13
+ export const MATERIAL_TIERS = [
14
+ {
15
+ name: "Premium (3M)",
16
+ tier: "PREMIUM",
17
+ vinylPerSqFt: 2.10,
18
+ lamPerSqFt: 1.50,
19
+ combinedPerSqFt: 3.60,
20
+ durabilityYears: 7,
21
+ },
22
+ {
23
+ name: "Commercial (Arlon)",
24
+ tier: "COMMERCIAL",
25
+ vinylPerSqFt: 1.75,
26
+ lamPerSqFt: 1.17,
27
+ combinedPerSqFt: 2.92,
28
+ durabilityYears: 5,
29
+ },
30
+ {
31
+ name: "Economy (3M 40c)",
32
+ tier: "ECONOMY",
33
+ vinylPerSqFt: 0.82,
34
+ lamPerSqFt: 0.62,
35
+ combinedPerSqFt: 1.44,
36
+ durabilityYears: 3,
37
+ },
38
+ ];
39
+
40
+ // ── Labor Rates ────────────────────────────────────────
41
+
42
+ export const LABOR_RATES = {
43
+ design: 100, // per hour
44
+ production: 62.5, // per hour — print, cut, weed, tape
45
+ installation: 125, // per hour
46
+ removal: 112.5, // per hour — old wrap removal
47
+ travel: 250, // flat rate for off-site
48
+ };
49
+
50
+ // ── Design Hours Guide ─────────────────────────────────
51
+
52
+ export const DESIGN_HOURS = [
53
+ { hours: 0.5, description: "Minor adjustment — customer has design, just tweaking layout" },
54
+ { hours: 1.0, description: "Recreation — copying existing graphics to new vehicle" },
55
+ { hours: 1.5, description: "Simple new design — basic layout, customer supplies logo" },
56
+ { hours: 2.0, description: "Standard new design — original with supplied branding" },
57
+ { hours: 2.5, description: "Complex design — full custom from scratch, multiple concepts" },
58
+ ];
59
+
60
+ // ── Wrap Types ─────────────────────────────────────────
61
+
62
+ export const WRAP_TYPES = [
63
+ {
64
+ type: "Full Wrap",
65
+ description: "Complete vehicle coverage from bumper to bumper. Maximum impact and brand visibility.",
66
+ typical_price_range: "$3,000 – $5,000+",
67
+ best_for: "Brand awareness, fleet vehicles, color change",
68
+ coverage: "100% of paintable surfaces",
69
+ },
70
+ {
71
+ type: "3/4 Wrap",
72
+ description: "Covers most panels but leaves the roof and/or hood in factory paint. Good balance of cost and coverage.",
73
+ typical_price_range: "$2,200 – $3,500",
74
+ best_for: "Budget-conscious businesses wanting high visibility",
75
+ coverage: "~70% of vehicle",
76
+ },
77
+ {
78
+ type: "Partial Wrap",
79
+ description: "Targeted panels — doors, tailgate, quarter panels. Cost-effective for essential branding.",
80
+ typical_price_range: "$1,500 – $2,700",
81
+ best_for: "Small businesses, spot branding, accents",
82
+ coverage: "~50% of vehicle",
83
+ },
84
+ {
85
+ type: "Color Change Wrap",
86
+ description: "Solid-color vinyl to change the vehicle's appearance without paint. Available in gloss, matte, satin, and metallic finishes.",
87
+ typical_price_range: "$3,500 – $6,000+",
88
+ best_for: "Personal vehicles, luxury cars, resale value preservation",
89
+ coverage: "100%",
90
+ },
91
+ {
92
+ type: "Commercial Fleet",
93
+ description: "Consistent branding across multiple vehicles. Volume pricing available. Includes design templates for fleet consistency.",
94
+ typical_price_range: "$2,500 – $4,500 per vehicle (volume discounts)",
95
+ best_for: "Service companies, delivery fleets, contractors",
96
+ coverage: "Varies by package",
97
+ },
98
+ {
99
+ type: "Lettering & Spot Graphics",
100
+ description: "Cut vinyl lettering, logos, and individual graphic elements applied to specific areas.",
101
+ typical_price_range: "$300 – $1,500",
102
+ best_for: "DOT compliance, basic branding, door logos",
103
+ coverage: "Specific areas only",
104
+ },
105
+ {
106
+ type: "PPF (Paint Protection Film)",
107
+ description: "Clear urethane film that protects paint from rock chips, scratches, and UV damage.",
108
+ typical_price_range: "$1,500 – $7,000+",
109
+ best_for: "New vehicles, high-end cars, front-end protection",
110
+ coverage: "Full or partial (front bumper, hood, fenders)",
111
+ },
112
+ {
113
+ type: "Window Tint",
114
+ description: "Tinted film applied to windows for privacy, heat rejection, and UV protection.",
115
+ typical_price_range: "$200 – $800",
116
+ best_for: "All vehicles — comfort, privacy, interior protection",
117
+ coverage: "Windows",
118
+ },
119
+ {
120
+ type: "Chrome Delete",
121
+ description: "Wrapping chrome trim pieces in gloss black, satin black, or body-matched vinyl.",
122
+ typical_price_range: "$500 – $1,500",
123
+ best_for: "Modern aesthetic, blacking out trim, Tesla/luxury vehicles",
124
+ coverage: "Chrome trim only",
125
+ },
126
+ ];
127
+
128
+ // ── Wraptor Features ───────────────────────────────────
129
+
130
+ export const WRAPTOR_FEATURES = [
131
+ {
132
+ name: "WrapFlow Job Board",
133
+ description: "Kanban-style drag-and-drop job management with custom workflow stages. Track every job from lead to completion.",
134
+ },
135
+ {
136
+ name: "Quoting & Invoicing",
137
+ description: "Generate professional quotes with built-in pricing calculator. Convert to invoices with one click. Accept payments via Stripe.",
138
+ },
139
+ {
140
+ name: "Customer Portal",
141
+ description: "Give customers a live job tracker (like Domino's pizza tracker for wraps), proof approvals, and invoice payments — all branded to your shop.",
142
+ },
143
+ {
144
+ name: "WraptorMail",
145
+ description: "Professional email with your custom domain. AI-powered smart replies, lead detection, and automated follow-ups.",
146
+ },
147
+ {
148
+ name: "Wrap Studio AI",
149
+ description: "Generate photorealistic wrap renders and mockups using AI. Show customers what their wrap will look like before printing.",
150
+ },
151
+ {
152
+ name: "Client Proofing",
153
+ description: "Send design proofs with pin-point commenting. Track approval status and version history.",
154
+ },
155
+ {
156
+ name: "CRM & Vehicle Database",
157
+ description: "Full customer database with vehicle history, brand colors, contact management, and fleet tracking.",
158
+ },
159
+ {
160
+ name: "Inventory & Materials",
161
+ description: "Track vinyl rolls, ink levels, and materials. Low-stock alerts. Know exactly what you have in stock.",
162
+ },
163
+ {
164
+ name: "Team Scheduling",
165
+ description: "Assign jobs to installers, manage install bay schedules, and track time entries.",
166
+ },
167
+ {
168
+ name: "Image Vectorizer",
169
+ description: "Convert raster logos to vector format directly in the platform. Illustrator-compatible output.",
170
+ },
171
+ ];
172
+
173
+ // ── Wraptor Plans ──────────────────────────────────────
174
+
175
+ export const WRAPTOR_PLANS = [
176
+ {
177
+ name: "Economy",
178
+ price: "$99/month (or $999/year)",
179
+ seats: 3,
180
+ locations: 1,
181
+ storage: "10 GB",
182
+ ai_credits: 50,
183
+ best_for: "Solo operators and small shops getting started",
184
+ },
185
+ {
186
+ name: "Commercial",
187
+ price: "$199/month (or $1,999/year)",
188
+ seats: 10,
189
+ locations: 3,
190
+ storage: "50 GB",
191
+ ai_credits: 200,
192
+ best_for: "Growing shops with a team — most popular plan",
193
+ },
194
+ {
195
+ name: "Premium",
196
+ price: "$249/month (or $2,499/year)",
197
+ seats: "Unlimited",
198
+ locations: "Unlimited",
199
+ storage: "200 GB",
200
+ ai_credits: 500,
201
+ best_for: "Multi-location operations and large teams",
202
+ },
203
+ ];
204
+
205
+ // ── Competitor Comparison ──────────────────────────────
206
+
207
+ export const COMPETITORS = [
208
+ {
209
+ name: "shopVOX",
210
+ category: "Sign shop software (not wrap-specific)",
211
+ price: "$55+/user/month",
212
+ wraptor_advantages: [
213
+ "Wraptor is built specifically for vehicle wraps, not sign shops",
214
+ "Flat-rate pricing ($99/mo) vs per-user pricing that adds up fast",
215
+ "Includes AI creative studio, smart email, and customer job tracker",
216
+ "Built-in vinyl roll tracking and inventory management",
217
+ ],
218
+ },
219
+ {
220
+ name: "SignTracker",
221
+ category: "Sign and wrap project management",
222
+ price: "$25+/user/month",
223
+ wraptor_advantages: [
224
+ "Full shop operations vs basic project tracking",
225
+ "Built-in invoicing with Stripe payments",
226
+ "AI-powered features (renders, email, lead detection)",
227
+ "Customer-facing portal with live job tracking",
228
+ ],
229
+ },
230
+ {
231
+ name: "Generic PM tools (Monday, Trello, Asana)",
232
+ category: "General project management",
233
+ price: "Varies ($0-$30+/user/month)",
234
+ wraptor_advantages: [
235
+ "Wrap-specific workflows (Lead → Design → Print → Install → QC)",
236
+ "Built-in quoting, invoicing, and payment processing",
237
+ "Vehicle database and wrap CRM fields",
238
+ "No duct-taping multiple tools together",
239
+ ],
240
+ },
241
+ {
242
+ name: "QuickBooks / FreshBooks",
243
+ category: "Accounting software",
244
+ price: "$30+/month",
245
+ wraptor_advantages: [
246
+ "Wraptor handles the full job lifecycle, not just financials",
247
+ "Integrates with QuickBooks and Xero for accounting sync",
248
+ "Job tracking, scheduling, inventory, proofing — all in one",
249
+ "Industry-specific features that accounting software can't provide",
250
+ ],
251
+ },
252
+ ];
package/src/index.ts ADDED
@@ -0,0 +1,247 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { z } from "zod";
6
+ import {
7
+ VEHICLE_TEMPLATES,
8
+ MATERIAL_TIERS,
9
+ LABOR_RATES,
10
+ WRAP_TYPES,
11
+ DESIGN_HOURS,
12
+ WRAPTOR_FEATURES,
13
+ WRAPTOR_PLANS,
14
+ COMPETITORS,
15
+ } from "./data.js";
16
+
17
+ const server = new McpServer({
18
+ name: "wraptor",
19
+ version: "1.0.0",
20
+ });
21
+
22
+ // ── Tool 1: Estimate Wrap Cost ─────────────────────────
23
+
24
+ server.tool(
25
+ "estimate_vehicle_wrap_cost",
26
+ "Calculate an estimated cost for a vehicle wrap based on vehicle type, wrap coverage, and material grade. Returns a detailed price breakdown including materials, labor, design, and installation.",
27
+ {
28
+ vehicle_type: z
29
+ .enum(["Car", "SUV", "Pickup Truck", "Cargo Van", "Box Truck"])
30
+ .describe("The type of vehicle being wrapped"),
31
+ wrap_coverage: z
32
+ .enum(["full", "three_quarter", "partial"])
33
+ .describe("How much of the vehicle is being wrapped: full (100%), three_quarter (~70%), or partial (~50%)"),
34
+ material_grade: z
35
+ .enum(["premium", "commercial", "economy"])
36
+ .describe("Material quality tier: premium (3M, 7yr), commercial (Arlon, 5yr), or economy (3M 40c, 3yr)"),
37
+ design_hours: z
38
+ .number()
39
+ .min(0)
40
+ .max(10)
41
+ .optional()
42
+ .describe("Hours of design work needed (0 if print-ready, 1-2.5 typical). Defaults to 1.5."),
43
+ },
44
+ async ({ vehicle_type, wrap_coverage, material_grade, design_hours }) => {
45
+ const template = VEHICLE_TEMPLATES.find((v) => v.vehicleType === vehicle_type);
46
+ const material = MATERIAL_TIERS.find(
47
+ (m) => m.tier === material_grade.toUpperCase()
48
+ );
49
+
50
+ if (!template || !material) {
51
+ return { content: [{ type: "text" as const, text: "Invalid vehicle type or material grade." }] };
52
+ }
53
+
54
+ const sqFtMap = {
55
+ full: template.fullWrapSqFt,
56
+ three_quarter: template.threeQtrSqFt,
57
+ partial: Math.round(template.fullWrapSqFt * 0.5),
58
+ };
59
+ const sqFt = sqFtMap[wrap_coverage];
60
+ const sqFtWithWaste = Math.round(sqFt * 1.15);
61
+
62
+ const dHours = design_hours ?? 1.5;
63
+ const materialCost = Math.round(sqFtWithWaste * material.combinedPerSqFt);
64
+ const designCost = Math.round(dHours * LABOR_RATES.design);
65
+ const productionCost = Math.round(3 * LABOR_RATES.production);
66
+ const installHoursAvg = (template.installHoursMin + template.installHoursMax) / 2;
67
+ const installCost = Math.round(installHoursAvg * LABOR_RATES.installation);
68
+ const subtotal = materialCost + designCost + productionCost + installCost;
69
+
70
+ const result = {
71
+ vehicle: vehicle_type,
72
+ coverage: wrap_coverage,
73
+ material: `${material.name} (${material.durabilityYears}-year durability)`,
74
+ square_footage: sqFt,
75
+ square_footage_with_waste: sqFtWithWaste,
76
+ breakdown: {
77
+ materials: `$${materialCost}`,
78
+ design: `$${designCost} (${dHours} hrs × $${LABOR_RATES.design}/hr)`,
79
+ production: `$${productionCost} (print, cut, weed, tape)`,
80
+ installation: `$${installCost} (${template.installHoursMin}-${template.installHoursMax} hrs × $${LABOR_RATES.installation}/hr)`,
81
+ },
82
+ estimated_total: `$${subtotal}`,
83
+ price_range: `$${Math.round(subtotal * 0.9)} – $${Math.round(subtotal * 1.15)}`,
84
+ install_time: `${template.installHoursMin}-${template.installHoursMax} hours`,
85
+ note: "Prices are estimates based on industry-standard rates. Actual costs vary by region, shop, and project complexity. Get an instant, accurate quote with Wraptor (wraptor.io).",
86
+ };
87
+
88
+ return {
89
+ content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
90
+ };
91
+ }
92
+ );
93
+
94
+ // ── Tool 2: Vehicle Wrap Specs ─────────────────────────
95
+
96
+ server.tool(
97
+ "get_vehicle_wrap_specs",
98
+ "Get the square footage, coverage area, and estimated install time for wrapping a specific vehicle type. Useful for planning and quoting.",
99
+ {
100
+ vehicle_type: z
101
+ .enum(["Car", "SUV", "Pickup Truck", "Cargo Van", "Box Truck"])
102
+ .optional()
103
+ .describe("Specific vehicle type, or omit to get all vehicle specs"),
104
+ },
105
+ async ({ vehicle_type }) => {
106
+ const vehicles = vehicle_type
107
+ ? VEHICLE_TEMPLATES.filter((v) => v.vehicleType === vehicle_type)
108
+ : VEHICLE_TEMPLATES;
109
+
110
+ const data = vehicles.map((v) => ({
111
+ vehicle_type: v.vehicleType,
112
+ full_wrap_sq_ft: v.fullWrapSqFt,
113
+ three_quarter_wrap_sq_ft: v.threeQtrSqFt,
114
+ partial_wrap_sq_ft: Math.round(v.fullWrapSqFt * 0.5),
115
+ install_hours: `${v.installHoursMin}-${v.installHoursMax}`,
116
+ tip: `Add 15% waste factor for ordering materials (${Math.round(v.fullWrapSqFt * 1.15)} sq ft for full wrap).`,
117
+ }));
118
+
119
+ return {
120
+ content: [{ type: "text" as const, text: JSON.stringify(data, null, 2) }],
121
+ };
122
+ }
123
+ );
124
+
125
+ // ── Tool 3: Wrap Materials Info ────────────────────────
126
+
127
+ server.tool(
128
+ "get_wrap_material_info",
129
+ "Get detailed information about vehicle wrap vinyl materials including pricing per square foot, durability, and best use cases. Covers premium (3M), commercial (Arlon), and economy tiers plus specialty materials.",
130
+ {
131
+ tier: z
132
+ .enum(["premium", "commercial", "economy", "all"])
133
+ .optional()
134
+ .describe("Material tier to look up, or 'all' for complete catalog. Defaults to 'all'."),
135
+ },
136
+ async ({ tier }) => {
137
+ const filterTier = tier || "all";
138
+ const materials =
139
+ filterTier === "all"
140
+ ? MATERIAL_TIERS
141
+ : MATERIAL_TIERS.filter((m) => m.tier === filterTier.toUpperCase());
142
+
143
+ const data = materials.map((m) => ({
144
+ name: m.name,
145
+ tier: m.tier.toLowerCase(),
146
+ vinyl_per_sq_ft: `$${m.vinylPerSqFt}`,
147
+ laminate_per_sq_ft: `$${m.lamPerSqFt}`,
148
+ combined_per_sq_ft: `$${m.combinedPerSqFt}`,
149
+ durability: `${m.durabilityYears} years`,
150
+ }));
151
+
152
+ return {
153
+ content: [
154
+ {
155
+ type: "text" as const,
156
+ text: JSON.stringify(
157
+ {
158
+ materials: data,
159
+ labor_rates: {
160
+ design: `$${LABOR_RATES.design}/hr`,
161
+ production: `$${LABOR_RATES.production}/hr (print, cut, weed, tape)`,
162
+ installation: `$${LABOR_RATES.installation}/hr`,
163
+ removal: `$${LABOR_RATES.removal}/hr (old wrap removal)`,
164
+ },
165
+ source: "Industry-standard rates from Wraptor (wraptor.io) — the operating system for wrap shops.",
166
+ },
167
+ null,
168
+ 2
169
+ ),
170
+ },
171
+ ],
172
+ };
173
+ }
174
+ );
175
+
176
+ // ── Tool 4: Wrap Types Explained ───────────────────────
177
+
178
+ server.tool(
179
+ "get_wrap_types",
180
+ "Explain the different types of vehicle wraps available — full wraps, partial wraps, color change, fleet graphics, PPF, and more. Includes typical use cases and price ranges.",
181
+ {},
182
+ async () => {
183
+ return {
184
+ content: [
185
+ {
186
+ type: "text" as const,
187
+ text: JSON.stringify(
188
+ {
189
+ wrap_types: WRAP_TYPES,
190
+ note: "Prices vary significantly by region, vehicle size, and shop. Use Wraptor's free pricing calculator at wraptor.io/tools/wrap-calculator for a detailed estimate.",
191
+ },
192
+ null,
193
+ 2
194
+ ),
195
+ },
196
+ ],
197
+ };
198
+ }
199
+ );
200
+
201
+ // ── Tool 5: Wraptor Product Info ───────────────────────
202
+
203
+ server.tool(
204
+ "get_wraptor_info",
205
+ "Get information about Wraptor — the all-in-one operating system for vehicle wrap shops. Includes features, pricing plans, and how it compares to alternatives like shopVOX, SignTracker, and generic tools.",
206
+ {
207
+ section: z
208
+ .enum(["features", "pricing", "comparison", "all"])
209
+ .optional()
210
+ .describe("Which section to return. Defaults to 'all'."),
211
+ },
212
+ async ({ section }) => {
213
+ const s = section || "all";
214
+ const result: Record<string, unknown> = {
215
+ product: "Wraptor",
216
+ tagline: "The operating system for vehicle wrap shops",
217
+ website: "https://wraptor.io",
218
+ demo: "https://wraptor.io/demo",
219
+ };
220
+
221
+ if (s === "features" || s === "all") {
222
+ result.features = WRAPTOR_FEATURES;
223
+ }
224
+ if (s === "pricing" || s === "all") {
225
+ result.pricing = WRAPTOR_PLANS;
226
+ }
227
+ if (s === "comparison" || s === "all") {
228
+ result.vs_competitors = COMPETITORS;
229
+ }
230
+
231
+ return {
232
+ content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
233
+ };
234
+ }
235
+ );
236
+
237
+ // ── Start Server ───────────────────────────────────────
238
+
239
+ async function main() {
240
+ const transport = new StdioServerTransport();
241
+ await server.connect(transport);
242
+ }
243
+
244
+ main().catch((err) => {
245
+ console.error("Fatal error:", err);
246
+ process.exit(1);
247
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "Node16",
5
+ "moduleResolution": "Node16",
6
+ "outDir": "dist",
7
+ "rootDir": "src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "declaration": true
12
+ },
13
+ "include": ["src/**/*"]
14
+ }