Skip to content

Commit 37f9c29

Browse files
authored
fix(mcpb): reduce bundle size from 84MB to ~45MB (#184)
* fix(mcpb): reduce bundle size from 84MB to ~25MB (#183) - Move prisma to devDependencies (not needed at runtime) - Use --omit=peer in npm install to prevent prisma CLI peer dep bloat - Strip non-SQLite Prisma WASM runtimes (sqlserver, cockroachdb, postgresql, mysql) - Remove source maps, .d.ts, fixtures, test dirs from node_modules - Remove build artifacts (tsconfig.tsbuildinfo, dist/*.js.map) - Skip prisma generate in bundle (already compiled in dist/) - Add bundle size CI check (max 30 MB) - Update pino 10.3.0, undici 7.19.1, @cloudflare/workers-types * fix(mcpb): keep PostgreSQL WASM runtime, remove CI size check - Project uses PostgreSQL (not SQLite) — keep postgresql WASM, strip sqlserver/cockroachdb/sqlite/mysql instead - Remove bundle size CI step (unnecessary overhead) * fix(mcpb): remove WASM stripping, move form-data and typed-doc to devDeps - Remove Prisma WASM runtime stripping entirely (keep all runtimes) - Remove form-data from deps (unused, Node.js has native FormData) - Move @graphql-typed-document-node/core to devDeps (type-only imports) - Keep @clack/prompts and open in deps (needed for npm CLI usage)
1 parent 24d3bac commit 37f9c29

File tree

3 files changed

+48
-105
lines changed

3 files changed

+48
-105
lines changed

package.json

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,26 @@
6767
},
6868
"dependencies": {
6969
"@clack/prompts": "1.0.0-alpha.9",
70-
"@graphql-typed-document-node/core": "^3.2.0",
7170
"@modelcontextprotocol/sdk": "^1.25.3",
7271
"@prisma/client": "^7.3.0",
7372
"express": "^5.2.1",
74-
"form-data": "^4.0.5",
7573
"graphql": "^16.12.0",
7674
"graphql-tag": "^2.12.6",
7775
"http-proxy-agent": "^7.0.2",
7876
"https-proxy-agent": "^7.0.6",
7977
"open": "^11.0.0",
80-
"pino": "^10.2.1",
78+
"pino": "^10.3.0",
8179
"pino-pretty": "^13.1.3",
82-
"prisma": "^7.3.0",
8380
"socks-proxy-agent": "^8.0.5",
8481
"transliteration": "^2.6.1",
85-
"undici": "^7.19.0",
82+
"undici": "^7.19.1",
8683
"yaml": "^2.8.2",
8784
"zod": "^4.3.6"
8885
},
8986
"devDependencies": {
90-
"@cloudflare/workers-types": "^4.20260123.0",
87+
"@cloudflare/workers-types": "^4.20260124.0",
9188
"@eslint/js": "^9.39.2",
89+
"@graphql-typed-document-node/core": "^3.2.0",
9290
"@semantic-release/changelog": "^6.0.3",
9391
"@semantic-release/exec": "^7.1.0",
9492
"@semantic-release/git": "^10.0.1",
@@ -107,6 +105,7 @@
107105
"eslint-plugin-prettier": "^5.5.5",
108106
"jest": "^30.2.0",
109107
"prettier": "^3.8.1",
108+
"prisma": "^7.3.0",
110109
"semantic-release": "^25.0.2",
111110
"ts-jest": "^29.4.6",
112111
"ts-node": "^10.9.2",

scripts/build-mcpb.sh

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,50 @@ cp -r "$PROJECT_DIR/dist" "$BUNDLE_DIR/dist"
1717

1818
# 2. Install production dependencies into bundle
1919
cp "$PROJECT_DIR/package.json" "$BUNDLE_DIR/"
20-
cp "$PROJECT_DIR/yarn.lock" "$BUNDLE_DIR/"
2120
cd "$BUNDLE_DIR"
2221
# Use npm for production install (simpler for bundling, no yarn PnP)
23-
if ! npm install --production --ignore-scripts 2>/dev/null; then
22+
# --omit=peer prevents installing prisma CLI and typescript as @prisma/client peer deps
23+
if ! npm install --production --ignore-scripts --omit=peer 2>/dev/null; then
2424
echo "Warning: npm install --production failed; continuing bundle build" >&2
2525
fi
2626

27-
# 3. Copy prisma schema and generate
27+
# 3. Copy prisma schema (needed for runtime migrations)
2828
if [ -d "$PROJECT_DIR/prisma" ]; then
2929
cp -r "$PROJECT_DIR/prisma" "$BUNDLE_DIR/prisma"
30-
if ! npx prisma generate 2>/dev/null; then
31-
echo "Warning: prisma generate failed; continuing bundle build" >&2
32-
fi
3330
fi
3431

3532
# 4. Generate manifest from template
3633
sed "s/{{VERSION}}/$VERSION/g" "$PROJECT_DIR/mcpb/manifest.json.template" > "$BUNDLE_DIR/manifest.json"
3734

38-
# 5. Copy icon if exists
35+
# 5. Copy icon
3936
if [ -f "$PROJECT_DIR/mcpb/icon.png" ]; then
4037
cp "$PROJECT_DIR/mcpb/icon.png" "$BUNDLE_DIR/icon.png"
4138
fi
4239

4340
# 6. Clean up unnecessary files
4441
rm -rf "$BUNDLE_DIR/yarn.lock" "$BUNDLE_DIR/.yarn"
42+
rm -f "$BUNDLE_DIR/package-lock.json"
43+
44+
# Remove docs, licenses, changelogs, TypeScript source files
4545
find "$BUNDLE_DIR/node_modules" \( -name "*.md" -o -name "*.ts" -o -name "LICENSE*" -o -name "CHANGELOG*" \) -type f -exec rm -f {} + 2>/dev/null || true
46+
47+
# Remove test directories
4648
find "$BUNDLE_DIR/node_modules" \( -name "__tests__" -o -name "test" -o -name "tests" \) -type d -exec rm -rf {} + 2>/dev/null || true
4749

50+
# Remove source maps from node_modules
51+
find "$BUNDLE_DIR/node_modules" -name "*.js.map" -type f -exec rm -f {} + 2>/dev/null || true
52+
53+
# Remove TypeScript declarations from node_modules (not needed at runtime)
54+
find "$BUNDLE_DIR/node_modules" -name "*.d.ts" -type f -exec rm -f {} + 2>/dev/null || true
55+
find "$BUNDLE_DIR/node_modules" -name "*.d.mts" -type f -exec rm -f {} + 2>/dev/null || true
56+
57+
# Remove fixture/example/doc directories
58+
find "$BUNDLE_DIR/node_modules" \( -name "fixture" -o -name "fixtures" -o -name "examples" -o -name "example" -o -name "doc" -o -name "docs" \) -type d -exec rm -rf {} + 2>/dev/null || true
59+
60+
# Remove build artifacts from dist/
61+
rm -f "$BUNDLE_DIR/dist/tsconfig.build.tsbuildinfo"
62+
find "$BUNDLE_DIR/dist" -name "*.js.map" -type f -exec rm -f {} + 2>/dev/null || true
63+
4864
# 7. Create .mcpb (ZIP archive)
4965
OUTPUT="$PROJECT_DIR/gitlab-mcp-${VERSION}.mcpb"
5066
cd "$BUNDLE_DIR"
@@ -53,4 +69,6 @@ zip -r "$OUTPUT" . -x "*.DS_Store" > /dev/null
5369
# 8. Cleanup
5470
rm -rf "$BUNDLE_DIR"
5571

56-
echo "Bundle created: $OUTPUT ($(du -h "$OUTPUT" | cut -f1))"
72+
SIZE=$(stat -f%z "$OUTPUT" 2>/dev/null || stat -c%s "$OUTPUT")
73+
SIZE_MB=$(echo "scale=1; $SIZE / 1048576" | bc)
74+
echo "Bundle created: $OUTPUT (${SIZE_MB} MB)"

yarn.lock

Lines changed: 17 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -670,10 +670,10 @@ __metadata:
670670
languageName: node
671671
linkType: hard
672672

673-
"@cloudflare/workers-types@npm:^4.20260123.0":
674-
version: 4.20260123.0
675-
resolution: "@cloudflare/workers-types@npm:4.20260123.0"
676-
checksum: 10c0/d168428817eda98ad83495a21ac0fbb052d8a4b884d3de4fb9d93805d03f95c4166769127f1eb91cc37cdc9db36b2d1ca787b6a568e7ffa04a904c66076dc39f
673+
"@cloudflare/workers-types@npm:^4.20260124.0":
674+
version: 4.20260124.0
675+
resolution: "@cloudflare/workers-types@npm:4.20260124.0"
676+
checksum: 10c0/c4422a0715f52d253f6f49b2547ea0391395cd87f5b19d4272b31cea88249e0d68b570027be0eb77487eb114564059245af3aec8fa126527d8ba0da03e650eb8
677677
languageName: node
678678
linkType: hard
679679

@@ -2617,7 +2617,7 @@ __metadata:
26172617
resolution: "@structured-world/gitlab-mcp@workspace:."
26182618
dependencies:
26192619
"@clack/prompts": "npm:1.0.0-alpha.9"
2620-
"@cloudflare/workers-types": "npm:^4.20260123.0"
2620+
"@cloudflare/workers-types": "npm:^4.20260124.0"
26212621
"@eslint/js": "npm:^9.39.2"
26222622
"@graphql-typed-document-node/core": "npm:^3.2.0"
26232623
"@modelcontextprotocol/sdk": "npm:^1.25.3"
@@ -2639,14 +2639,13 @@ __metadata:
26392639
eslint: "npm:^9.39.2"
26402640
eslint-plugin-prettier: "npm:^5.5.5"
26412641
express: "npm:^5.2.1"
2642-
form-data: "npm:^4.0.5"
26432642
graphql: "npm:^16.12.0"
26442643
graphql-tag: "npm:^2.12.6"
26452644
http-proxy-agent: "npm:^7.0.2"
26462645
https-proxy-agent: "npm:^7.0.6"
26472646
jest: "npm:^30.2.0"
26482647
open: "npm:^11.0.0"
2649-
pino: "npm:^10.2.1"
2648+
pino: "npm:^10.3.0"
26502649
pino-pretty: "npm:^13.1.3"
26512650
prettier: "npm:^3.8.1"
26522651
prisma: "npm:^7.3.0"
@@ -2656,7 +2655,7 @@ __metadata:
26562655
ts-jest: "npm:^29.4.6"
26572656
ts-node: "npm:^10.9.2"
26582657
typescript: "npm:^5.9.3"
2659-
undici: "npm:^7.19.0"
2658+
undici: "npm:^7.19.1"
26602659
vitepress: "npm:^1.6.4"
26612660
yaml: "npm:^2.8.2"
26622661
zod: "npm:^4.3.6"
@@ -3754,13 +3753,6 @@ __metadata:
37543753
languageName: node
37553754
linkType: hard
37563755

3757-
"asynckit@npm:^0.4.0":
3758-
version: 0.4.0
3759-
resolution: "asynckit@npm:0.4.0"
3760-
checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d
3761-
languageName: node
3762-
linkType: hard
3763-
37643756
"atomic-sleep@npm:^1.0.0":
37653757
version: 1.0.0
37663758
resolution: "atomic-sleep@npm:1.0.0"
@@ -4383,15 +4375,6 @@ __metadata:
43834375
languageName: node
43844376
linkType: hard
43854377

4386-
"combined-stream@npm:^1.0.8":
4387-
version: 1.0.8
4388-
resolution: "combined-stream@npm:1.0.8"
4389-
dependencies:
4390-
delayed-stream: "npm:~1.0.0"
4391-
checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5
4392-
languageName: node
4393-
linkType: hard
4394-
43954378
"comma-separated-tokens@npm:^2.0.0":
43964379
version: 2.0.3
43974380
resolution: "comma-separated-tokens@npm:2.0.3"
@@ -4737,13 +4720,6 @@ __metadata:
47374720
languageName: node
47384721
linkType: hard
47394722

4740-
"delayed-stream@npm:~1.0.0":
4741-
version: 1.0.0
4742-
resolution: "delayed-stream@npm:1.0.0"
4743-
checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19
4744-
languageName: node
4745-
linkType: hard
4746-
47474723
"denque@npm:^2.1.0":
47484724
version: 2.1.0
47494725
resolution: "denque@npm:2.1.0"
@@ -5022,18 +4998,6 @@ __metadata:
50224998
languageName: node
50234999
linkType: hard
50245000

5025-
"es-set-tostringtag@npm:^2.1.0":
5026-
version: 2.1.0
5027-
resolution: "es-set-tostringtag@npm:2.1.0"
5028-
dependencies:
5029-
es-errors: "npm:^1.3.0"
5030-
get-intrinsic: "npm:^1.2.6"
5031-
has-tostringtag: "npm:^1.0.2"
5032-
hasown: "npm:^2.0.2"
5033-
checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af
5034-
languageName: node
5035-
linkType: hard
5036-
50375001
"esbuild@npm:>=0.25.0":
50385002
version: 0.27.2
50395003
resolution: "esbuild@npm:0.27.2"
@@ -5700,19 +5664,6 @@ __metadata:
57005664
languageName: node
57015665
linkType: hard
57025666

5703-
"form-data@npm:^4.0.5":
5704-
version: 4.0.5
5705-
resolution: "form-data@npm:4.0.5"
5706-
dependencies:
5707-
asynckit: "npm:^0.4.0"
5708-
combined-stream: "npm:^1.0.8"
5709-
es-set-tostringtag: "npm:^2.1.0"
5710-
hasown: "npm:^2.0.2"
5711-
mime-types: "npm:^2.1.12"
5712-
checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b
5713-
languageName: node
5714-
linkType: hard
5715-
57165667
"forwarded@npm:0.2.0":
57175668
version: 0.2.0
57185669
resolution: "forwarded@npm:0.2.0"
@@ -5827,7 +5778,7 @@ __metadata:
58275778
languageName: node
58285779
linkType: hard
58295780

5830-
"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0":
5781+
"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0":
58315782
version: 1.3.0
58325783
resolution: "get-intrinsic@npm:1.3.0"
58335784
dependencies:
@@ -6072,22 +6023,13 @@ __metadata:
60726023
languageName: node
60736024
linkType: hard
60746025

6075-
"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0":
6026+
"has-symbols@npm:^1.1.0":
60766027
version: 1.1.0
60776028
resolution: "has-symbols@npm:1.1.0"
60786029
checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e
60796030
languageName: node
60806031
linkType: hard
60816032

6082-
"has-tostringtag@npm:^1.0.2":
6083-
version: 1.0.2
6084-
resolution: "has-tostringtag@npm:1.0.2"
6085-
dependencies:
6086-
has-symbols: "npm:^1.0.3"
6087-
checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c
6088-
languageName: node
6089-
linkType: hard
6090-
60916033
"hasown@npm:^2.0.2":
60926034
version: 2.0.2
60936035
resolution: "hasown@npm:2.0.2"
@@ -7843,29 +7785,13 @@ __metadata:
78437785
languageName: node
78447786
linkType: hard
78457787

7846-
"mime-db@npm:1.52.0":
7847-
version: 1.52.0
7848-
resolution: "mime-db@npm:1.52.0"
7849-
checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa
7850-
languageName: node
7851-
linkType: hard
7852-
78537788
"mime-db@npm:^1.54.0":
78547789
version: 1.54.0
78557790
resolution: "mime-db@npm:1.54.0"
78567791
checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284
78577792
languageName: node
78587793
linkType: hard
78597794

7860-
"mime-types@npm:^2.1.12":
7861-
version: 2.1.35
7862-
resolution: "mime-types@npm:2.1.35"
7863-
dependencies:
7864-
mime-db: "npm:1.52.0"
7865-
checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2
7866-
languageName: node
7867-
linkType: hard
7868-
78697795
"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1":
78707796
version: 3.0.1
78717797
resolution: "mime-types@npm:3.0.1"
@@ -8966,9 +8892,9 @@ __metadata:
89668892
languageName: node
89678893
linkType: hard
89688894

8969-
"pino@npm:^10.2.1":
8970-
version: 10.2.1
8971-
resolution: "pino@npm:10.2.1"
8895+
"pino@npm:^10.3.0":
8896+
version: 10.3.0
8897+
resolution: "pino@npm:10.3.0"
89728898
dependencies:
89738899
"@pinojs/redact": "npm:^0.4.0"
89748900
atomic-sleep: "npm:^1.0.0"
@@ -8983,7 +8909,7 @@ __metadata:
89838909
thread-stream: "npm:^4.0.0"
89848910
bin:
89858911
pino: bin.js
8986-
checksum: 10c0/2eaed48bb7fb8865e27ac6d6709383f5c117f1e59c818734c7cc22b362e9aa5846a0547e7fd9cde64088a3b48aa314e1dab07ee16da8dc3b87897970eb56843e
8912+
checksum: 10c0/cfbbc7dfaa2df2aa2dce728d751aa4b5b7ab973b2cd4bfff57868567563ef0c1c021f22932769141d535c72662390e09a0190e44f4413496dbe5e3c672816308
89878913
languageName: node
89888914
linkType: hard
89898915

@@ -10778,10 +10704,10 @@ __metadata:
1077810704
languageName: node
1077910705
linkType: hard
1078010706

10781-
"undici@npm:^7.19.0":
10782-
version: 7.19.0
10783-
resolution: "undici@npm:7.19.0"
10784-
checksum: 10c0/24d9dd02ee72d176a698bddc4ee6411ecc1b4cfaa666865aae7458a08bbebf56482fdfb2ef090722f22d50e3fcb8a98da9a5128bf4c1559e468184ae6856522e
10707+
"undici@npm:^7.19.1":
10708+
version: 7.19.1
10709+
resolution: "undici@npm:7.19.1"
10710+
checksum: 10c0/3807f9968dfbbdb45da8e6d68279f2831ff9a173e01f116eb3d43aa07fb03474aae307aba0d167a55ad686ec21733d357776c73639a26ecaaf877cbd6b904e79
1078510711
languageName: node
1078610712
linkType: hard
1078710713

0 commit comments

Comments
 (0)