zola-mcp 1.0.6 → 1.0.7

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.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "Zola wedding planning tools for Claude Code",
10
- "version": "0.2.0"
10
+ "version": "1.0.7"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,14 +15,23 @@
15
15
  "displayName": "Zola",
16
16
  "source": "./",
17
17
  "description": "Zola wedding planning tools for Claude — vendors, budget, guests, seating, events, registry, inquiries, and more via MCP",
18
- "version": "0.2.0",
18
+ "version": "1.0.7",
19
19
  "author": {
20
20
  "name": "Chris Chall"
21
21
  },
22
22
  "homepage": "https://github.com/chrischall/zola-mcp",
23
23
  "repository": "https://github.com/chrischall/zola-mcp",
24
24
  "license": "MIT",
25
- "keywords": ["zola", "wedding", "vendors", "guests", "budget", "seating", "registry", "mcp"],
25
+ "keywords": [
26
+ "zola",
27
+ "wedding",
28
+ "vendors",
29
+ "guests",
30
+ "budget",
31
+ "seating",
32
+ "registry",
33
+ "mcp"
34
+ ],
26
35
  "category": "productivity"
27
36
  }
28
37
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zola",
3
3
  "displayName": "Zola",
4
- "version": "0.2.0",
4
+ "version": "1.0.7",
5
5
  "description": "Zola wedding planning tools for Claude — vendors, budget, guests, seating, events, registry, inquiries, and more via MCP",
6
6
  "author": {
7
7
  "name": "Chris Chall",
@@ -10,7 +10,16 @@
10
10
  "homepage": "https://github.com/chrischall/zola-mcp",
11
11
  "repository": "https://github.com/chrischall/zola-mcp",
12
12
  "license": "MIT",
13
- "keywords": ["zola", "wedding", "vendors", "guests", "budget", "seating", "registry", "mcp"],
13
+ "keywords": [
14
+ "zola",
15
+ "wedding",
16
+ "vendors",
17
+ "guests",
18
+ "budget",
19
+ "seating",
20
+ "registry",
21
+ "mcp"
22
+ ],
14
23
  "skills": "./skills/",
15
24
  "mcp": "./.mcp.json"
16
25
  }
package/dist/bundle.js CHANGED
@@ -30118,9 +30118,18 @@ import { fileURLToPath } from "url";
30118
30118
  try {
30119
30119
  const { config: config2 } = await import("dotenv");
30120
30120
  const __dirname = dirname(fileURLToPath(import.meta.url));
30121
- config2({ path: join(__dirname, "..", ".env"), override: false });
30121
+ config2({ path: join(__dirname, "..", ".env"), override: false, quiet: true });
30122
30122
  } catch {
30123
30123
  }
30124
+ function readVar(key) {
30125
+ const raw = process.env[key];
30126
+ if (typeof raw !== "string") return void 0;
30127
+ const trimmed = raw.trim();
30128
+ if (trimmed.length === 0) return void 0;
30129
+ if (trimmed === "undefined" || trimmed === "null") return void 0;
30130
+ if (/^\$\{[^}]*\}$/.test(trimmed)) return void 0;
30131
+ return trimmed;
30132
+ }
30124
30133
  var MOBILE_BASE_URL = "https://mobile-api.zola.com";
30125
30134
  function decodeJwtExp(token) {
30126
30135
  const parts = token.split(".");
@@ -30164,8 +30173,8 @@ var ZolaClient = class {
30164
30173
  */
30165
30174
  async getContext() {
30166
30175
  if (this.cachedContext) return this.cachedContext;
30167
- const envAccountId = process.env.ZOLA_ACCOUNT_ID;
30168
- const envRegistryId = process.env.ZOLA_REGISTRY_ID;
30176
+ const envAccountId = readVar("ZOLA_ACCOUNT_ID");
30177
+ const envRegistryId = readVar("ZOLA_REGISTRY_ID");
30169
30178
  if (envAccountId && envRegistryId) {
30170
30179
  this.cachedContext = {
30171
30180
  weddingAccountId: Number(envAccountId),
@@ -30227,7 +30236,7 @@ var ZolaClient = class {
30227
30236
  if (this.sessionExpiry.getTime() - Date.now() > 5 * 60 * 1e3) return;
30228
30237
  }
30229
30238
  if (this.sessionToken === null) {
30230
- const envSession = process.env.ZOLA_SESSION_TOKEN;
30239
+ const envSession = readVar("ZOLA_SESSION_TOKEN");
30231
30240
  if (envSession) {
30232
30241
  try {
30233
30242
  const exp = decodeJwtExp(envSession);
@@ -30248,7 +30257,7 @@ var ZolaClient = class {
30248
30257
  * Returns a new session_token (30-min) and optionally a new refresh_token.
30249
30258
  */
30250
30259
  async refresh() {
30251
- const refreshToken = process.env.ZOLA_REFRESH_TOKEN;
30260
+ const refreshToken = readVar("ZOLA_REFRESH_TOKEN");
30252
30261
  if (!refreshToken) throw new Error("ZOLA_REFRESH_TOKEN must be set");
30253
30262
  const response = await fetch(`${MOBILE_BASE_URL}/v3/sessions/refresh`, {
30254
30263
  method: "POST",
@@ -30986,7 +30995,7 @@ function registerDiscoverTools(server2) {
30986
30995
  // src/index.ts
30987
30996
  var server = new McpServer({
30988
30997
  name: "zola-mcp",
30989
- version: "1.0.6"
30998
+ version: "1.0.7"
30990
30999
  });
30991
31000
  registerVendorTools(server);
30992
31001
  registerBudgetTools(server);
package/dist/client.js CHANGED
@@ -3,11 +3,29 @@ import { fileURLToPath } from 'url';
3
3
  try {
4
4
  const { config } = await import('dotenv');
5
5
  const __dirname = dirname(fileURLToPath(import.meta.url));
6
- config({ path: join(__dirname, '..', '.env'), override: false });
6
+ config({ path: join(__dirname, '..', '.env'), override: false, quiet: true });
7
7
  }
8
8
  catch {
9
9
  // bundled mode — rely on process.env
10
10
  }
11
+ /**
12
+ * Read an env var, trim whitespace, and treat as unset if blank or if the value
13
+ * looks like an unsubstituted shell placeholder (e.g. `${FOO}`) — defends
14
+ * against MCP hosts that pass .mcp.json env blocks through unexpanded.
15
+ */
16
+ function readVar(key) {
17
+ const raw = process.env[key];
18
+ if (typeof raw !== 'string')
19
+ return undefined;
20
+ const trimmed = raw.trim();
21
+ if (trimmed.length === 0)
22
+ return undefined;
23
+ if (trimmed === 'undefined' || trimmed === 'null')
24
+ return undefined;
25
+ if (/^\$\{[^}]*\}$/.test(trimmed))
26
+ return undefined;
27
+ return trimmed;
28
+ }
11
29
  const MOBILE_BASE_URL = 'https://mobile-api.zola.com';
12
30
  function decodeJwtExp(token) {
13
31
  const parts = token.split('.');
@@ -54,8 +72,8 @@ export class ZolaClient {
54
72
  async getContext() {
55
73
  if (this.cachedContext)
56
74
  return this.cachedContext;
57
- const envAccountId = process.env.ZOLA_ACCOUNT_ID;
58
- const envRegistryId = process.env.ZOLA_REGISTRY_ID;
75
+ const envAccountId = readVar('ZOLA_ACCOUNT_ID');
76
+ const envRegistryId = readVar('ZOLA_REGISTRY_ID');
59
77
  // If both env vars are set, skip the API call
60
78
  if (envAccountId && envRegistryId) {
61
79
  this.cachedContext = {
@@ -123,7 +141,7 @@ export class ZolaClient {
123
141
  }
124
142
  // Check for session token in env (first load only)
125
143
  if (this.sessionToken === null) {
126
- const envSession = process.env.ZOLA_SESSION_TOKEN;
144
+ const envSession = readVar('ZOLA_SESSION_TOKEN');
127
145
  if (envSession) {
128
146
  try {
129
147
  const exp = decodeJwtExp(envSession);
@@ -146,7 +164,7 @@ export class ZolaClient {
146
164
  * Returns a new session_token (30-min) and optionally a new refresh_token.
147
165
  */
148
166
  async refresh() {
149
- const refreshToken = process.env.ZOLA_REFRESH_TOKEN;
167
+ const refreshToken = readVar('ZOLA_REFRESH_TOKEN');
150
168
  if (!refreshToken)
151
169
  throw new Error('ZOLA_REFRESH_TOKEN must be set');
152
170
  const response = await fetch(`${MOBILE_BASE_URL}/v3/sessions/refresh`, {
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import { registerEventTools } from './tools/events.js';
9
9
  import { registerDiscoverTools } from './tools/discover.js';
10
10
  const server = new McpServer({
11
11
  name: 'zola-mcp',
12
- version: '1.0.6',
12
+ version: '1.0.7',
13
13
  });
14
14
  registerVendorTools(server);
15
15
  registerBudgetTools(server);
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "zola-mcp",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
+ "mcpName": "io.github.chrischall/zola-mcp",
4
5
  "description": "Zola wedding MCP server for Claude",
5
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
6
7
  "repository": {
@@ -27,7 +28,8 @@
27
28
  "dist",
28
29
  ".claude-plugin",
29
30
  "skills",
30
- ".mcp.json"
31
+ ".mcp.json",
32
+ "server.json"
31
33
  ],
32
34
  "engines": {
33
35
  "node": ">=20.6.0"
package/server.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.chrischall/zola-mcp",
4
+ "description": "Zola wedding planning for Claude — vendors, budget, guests, seating, registry, and RSVPs",
5
+ "repository": {
6
+ "url": "https://github.com/chrischall/zola-mcp",
7
+ "source": "github"
8
+ },
9
+ "version": "1.0.7",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "identifier": "zola-mcp",
14
+ "version": "1.0.7",
15
+ "transport": {
16
+ "type": "stdio"
17
+ },
18
+ "environmentVariables": [
19
+ {
20
+ "name": "ZOLA_REFRESH_TOKEN",
21
+ "description": "Zola refresh token JWT (~1 year lifetime). Run npm run auth to capture via browser login.",
22
+ "isRequired": true,
23
+ "format": "string",
24
+ "isSecret": true
25
+ }
26
+ ]
27
+ }
28
+ ]
29
+ }