@respira/wordpress-mcp-server 3.3.6 → 4.0.1

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 CHANGED
@@ -62,7 +62,7 @@
62
62
  | Inventory and stock tools | Yes (add-on) | No |
63
63
  | Sales reports and inventory intelligence | Yes (add-on) | No |
64
64
 
65
- ### Tool Inventory (v3.3)
65
+ ### Tool Inventory (v4.0)
66
66
 
67
67
  - `82` always-on `wordpress_*` tools
68
68
  - `21` conditional `woocommerce_*` tools (only when WooCommerce add-on is installed and licensed)
@@ -116,6 +116,8 @@ WooCommerce add-on details: [respira.press/addons/woocommerce](https://respira.p
116
116
 
117
117
  ### Step 2: Configure Your AI Tool
118
118
 
119
+ For agencies or anyone managing multiple connected sites, use the dedicated hosted setup page at [respira.press/dashboard/mcp](https://www.respira.press/dashboard/mcp). It generates the all-sites config, one-time install command, and AI setup prompt from your account inventory.
120
+
119
121
  <details>
120
122
  <summary><b>Cursor</b></summary>
121
123
 
@@ -184,7 +186,7 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
184
186
 
185
187
  </details>
186
188
 
187
- ### Step 3: Add Your Site
189
+ ### Step 3: Add Your Site (Manual / Advanced)
188
190
 
189
191
  Create `~/.respira/config.json`:
190
192
  ```json
@@ -203,6 +205,13 @@ Create `~/.respira/config.json`:
203
205
 
204
206
  **Done!** Restart your AI tool and start editing.
205
207
 
208
+ ### Guided Agency Setup
209
+
210
+ - Download client-specific config from [respira.press/dashboard/mcp](https://www.respira.press/dashboard/mcp)
211
+ - Or copy the one-time installer command:
212
+ - `npx -y @respira/wordpress-mcp-server --install-config --client codex --install-token <token>`
213
+ - Treat exported configs and install commands like passwords. They grant access to connected sites. Never commit them to git or paste them into public chats or tickets.
214
+
206
215
  ---
207
216
 
208
217
  ## Safe Editing (Unique to Respira)
@@ -412,6 +421,34 @@ npx -y @respira/wordpress-mcp-server
412
421
  npx -y @smithery/cli install @respira/wordpress-mcp-server --client claude
413
422
  ```
414
423
 
424
+ ### Publish on Smithery
425
+
426
+ Use Smithery's **GitHub / local deployment** flow for this repo, not the external URL form. Respira is a stdio-first MCP package, and Smithery can host the transport layer directly from the repository.
427
+
428
+ Respira's longer-term Smithery architecture is a separate **remote MCP** hosted on `mcp.respira.press` with Respira OAuth and server-side entitlement checks. That remote path is the official commercial direction for Smithery because it keeps the paywall on the server. The local/package-hosted Smithery path in this repo remains the manual fallback and development path until the remote service is live.
429
+
430
+ Recommended Smithery settings for this monorepo:
431
+
432
+ 1. Repository: `webmyc/respira-wordpress`
433
+ 2. Base directory: `mcp-server`
434
+ 3. Config file: `mcp-server/smithery.yaml`
435
+ 4. Runtime: `typescript` (picked up from `smithery.yaml`)
436
+
437
+ Smithery session config fields:
438
+
439
+ - `wordpressUrl` - normal single-site setup
440
+ - `apiKey` - Respira plugin key (`respira_...`) or dashboard site token (`respira_site_...`)
441
+ - `siteName` - optional display label
442
+ - `siteId` - optional stable site identifier
443
+ - `respiraConfigB64` - advanced dashboard export for multi-site setups
444
+
445
+ Notes:
446
+
447
+ - Smithery is best treated as a single-site connection for Respira today.
448
+ - For agency multi-site work, use the dedicated export flow at [respira.press/dashboard/mcp](https://www.respira.press/dashboard/mcp).
449
+ - Treat Smithery config values like passwords. They grant access to connected WordPress sites.
450
+ - When the remote Smithery service launches, prefer the OAuth-backed `mcp.respira.press` connection over pasted site tokens.
451
+
415
452
  ### Interactive Setup Wizard
416
453
  ```bash
417
454
  npx @respira/wordpress-mcp-server --setup
@@ -441,8 +478,8 @@ npx @respira/wordpress-mcp-server --help # Show help
441
478
 
442
479
  ### Environment Variables (Alternative to config file)
443
480
  ```bash
444
- export WP_SITE_URL=https://your-site.com
445
- export WP_API_KEY=respira_your-api-key
481
+ export WORDPRESS_URL=https://your-site.com
482
+ export WORDPRESS_API_KEY=respira_your-api-key
446
483
  ```
447
484
 
448
485
  ---
package/dist/config.d.ts CHANGED
@@ -2,15 +2,34 @@
2
2
  * Configuration management
3
3
  */
4
4
  import type { RespiraConfig, WordPressSiteConfig } from './types/index.js';
5
+ export declare const CONFIG_DIR: string;
6
+ export declare const CONFIG_FILE: string;
7
+ export declare function validateAndFixSiteUrl(url: string): {
8
+ url: string;
9
+ fixed: boolean;
10
+ };
11
+ export declare function normalizeConfig(config: RespiraConfig, sourceLabel: string, persistPath?: string): RespiraConfig;
12
+ export declare function readConfigFromBase64(encoded: string): RespiraConfig;
5
13
  /**
6
- * Load configuration from file or environment variables.
7
- * When WORDPRESS_URL and WORDPRESS_API_KEY are set (e.g. from MCP client env), use those.
14
+ * Load configuration from inline base64, explicit file path, default file, or env vars.
15
+ *
16
+ * Precedence by default:
17
+ * 1. RESPIRA_CONFIG_B64
18
+ * 2. RESPIRA_CONFIG_FILE
19
+ * 3. ~/.respira/config.json
20
+ * 4. WORDPRESS_URL + WORDPRESS_API_KEY
21
+ *
22
+ * Set RESPIRA_CONFIG_MODE=env to force env-only mode for single-site setups.
8
23
  */
9
24
  export declare function loadConfig(): RespiraConfig;
10
25
  /**
11
- * Save configuration to file
26
+ * Save configuration to the default Respira config file.
12
27
  */
13
28
  export declare function saveConfig(config: RespiraConfig): void;
29
+ /**
30
+ * Save configuration to an explicit file path.
31
+ */
32
+ export declare function saveConfigToPath(config: RespiraConfig, path: string): void;
14
33
  /**
15
34
  * Add a new site to configuration
16
35
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAa3E;;;GAGG;AACH,wBAAgB,UAAU,IAAI,aAAa,CAoL1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAWtD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAevD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAgB/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBnD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBlE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,eAAO,MAAM,UAAU,QAA8B,CAAC;AACtD,eAAO,MAAM,WAAW,QAAkC,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAoElF;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,CA0Cf;AAQD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAInE;AAiED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,IAAI,aAAa,CA2C1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAOtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAO1E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAavD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAe/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAYnD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBlE"}
package/dist/config.js CHANGED
@@ -2,205 +2,250 @@
2
2
  * Configuration management
3
3
  */
4
4
  import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'fs';
5
- import { join } from 'path';
5
+ import { join, dirname } from 'path';
6
6
  import { homedir } from 'os';
7
- const CONFIG_DIR = join(homedir(), '.respira');
8
- const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
9
- const DEFAULT_CONFIG = {
10
- sites: [],
11
- preferences: {
12
- autoDuplicate: true,
13
- securityChecks: true,
14
- },
15
- };
16
- /**
17
- * Load configuration from file or environment variables.
18
- * When WORDPRESS_URL and WORDPRESS_API_KEY are set (e.g. from MCP client env), use those.
19
- */
20
- export function loadConfig() {
21
- const envUrl = process.env.WORDPRESS_URL?.trim();
22
- const envKey = process.env.WORDPRESS_API_KEY?.trim();
23
- if (envUrl && envKey && envKey.startsWith('respira_')) {
24
- const url = envUrl.replace(/\/$/, '');
7
+ export const CONFIG_DIR = join(homedir(), '.respira');
8
+ export const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
9
+ export function validateAndFixSiteUrl(url) {
10
+ let fixedUrl = (url || '').trim();
11
+ let fixed = false;
12
+ const dupProtocolMatch = fixedUrl.match(/^(https?:\/\/){2,}/i);
13
+ if (dupProtocolMatch) {
14
+ const firstProtocol = fixedUrl.startsWith('https') ? 'https://' : 'http://';
15
+ fixedUrl = fixedUrl.replace(/^(https?:\/\/)+/i, firstProtocol);
16
+ fixed = true;
17
+ }
18
+ if (fixedUrl.match(/^http:\/\/https:\/\//i)) {
19
+ fixedUrl = fixedUrl.replace(/^http:\/\/https:\/\//i, 'https://');
20
+ fixed = true;
21
+ }
22
+ if (fixedUrl.match(/^https:\/\/http:\/\//i)) {
23
+ fixedUrl = fixedUrl.replace(/^https:\/\/http:\/\//i, 'https://');
24
+ fixed = true;
25
+ }
26
+ if (fixedUrl.match(/^(https?)\/\//i)) {
27
+ fixedUrl = fixedUrl.replace(/^(https?)\/\//i, '$1://');
28
+ fixed = true;
29
+ }
30
+ if (fixedUrl.match(/^(https?:\/\/)\//)) {
31
+ fixedUrl = fixedUrl.replace(/^(https?:\/\/)\//, '$1');
32
+ fixed = true;
33
+ }
34
+ const protocolMatch = fixedUrl.match(/^(https?:\/\/)(.*)$/i);
35
+ if (protocolMatch) {
36
+ const protocol = protocolMatch[1];
37
+ const path = protocolMatch[2];
38
+ const fixedPath = path.replace(/\/+/g, '/');
39
+ fixedUrl = protocol + fixedPath;
40
+ if (path !== fixedPath) {
41
+ fixed = true;
42
+ }
43
+ }
44
+ if (!fixedUrl.match(/^https?:\/\//i)) {
45
+ const host = fixedUrl.split('/')[0]?.split(':')[0] || '';
46
+ const isLocal = /^(localhost|127\.0\.0\.1|.*\.local|.*\.localdomain|.*\.lndo\.site)$/i.test(host);
47
+ fixedUrl = `${isLocal ? 'http' : 'https'}://${fixedUrl}`;
48
+ fixed = true;
49
+ }
50
+ const urlObj = new URL(fixedUrl);
51
+ if (urlObj.protocol !== 'http:' && urlObj.protocol !== 'https:') {
52
+ throw new Error(`Invalid URL protocol: ${urlObj.protocol}`);
53
+ }
54
+ if (!urlObj.hostname || urlObj.hostname.length === 0) {
55
+ throw new Error('Invalid hostname');
56
+ }
57
+ if (urlObj.port === '80' && urlObj.protocol === 'http:') {
58
+ urlObj.port = '';
59
+ }
60
+ if (urlObj.port === '443' && urlObj.protocol === 'https:') {
61
+ urlObj.port = '';
62
+ }
63
+ return {
64
+ url: urlObj.toString().replace(/\/$/, ''),
65
+ fixed,
66
+ };
67
+ }
68
+ export function normalizeConfig(config, sourceLabel, persistPath) {
69
+ if (!config?.sites || config.sites.length === 0) {
70
+ throw new Error(`No WordPress sites configured in ${sourceLabel}`);
71
+ }
72
+ let changed = false;
73
+ const normalizedSites = config.sites.map((site, index) => {
74
+ if (!site.id || !site.name || !site.url || !site.apiKey) {
75
+ throw new Error(`Site ${index + 1} is missing required fields (id, name, url, apiKey)`);
76
+ }
77
+ const validated = validateAndFixSiteUrl(site.url);
78
+ if (validated.fixed) {
79
+ changed = true;
80
+ console.warn(`Warning: Site "${site.name}" had malformed URL: ${site.url}`);
81
+ console.warn(` Auto-fixed to: ${validated.url}`);
82
+ }
83
+ if (!site.apiKey.startsWith('respira_')) {
84
+ console.warn(`Warning: API key for "${site.name}" doesn't start with "respira_" prefix`);
85
+ }
25
86
  return {
26
- sites: [
27
- {
28
- id: 'env-site',
29
- name: 'WordPress (from env)',
30
- url,
31
- apiKey: envKey,
32
- default: true,
33
- },
34
- ],
35
- preferences: {
36
- autoDuplicate: true,
37
- securityChecks: true,
38
- },
87
+ ...site,
88
+ url: validated.url,
39
89
  };
90
+ });
91
+ const normalizedConfig = {
92
+ ...config,
93
+ sites: normalizedSites,
94
+ preferences: {
95
+ autoDuplicate: config.preferences?.autoDuplicate ?? true,
96
+ securityChecks: config.preferences?.securityChecks ?? true,
97
+ },
98
+ };
99
+ if (changed && persistPath) {
100
+ writeConfig(normalizedConfig, persistPath);
40
101
  }
41
- if (!existsSync(CONFIG_FILE)) {
42
- console.error('No configuration file found. Creating default configuration...');
43
- console.error(`Please edit ${CONFIG_FILE} to add your WordPress sites.`);
44
- // Create directory if it doesn't exist
45
- if (!existsSync(CONFIG_DIR)) {
46
- mkdirSync(CONFIG_DIR, { recursive: true });
47
- }
48
- // Create default config
49
- const exampleConfig = {
50
- sites: [
51
- {
52
- id: 'example-site',
53
- name: 'My WordPress Site',
54
- url: 'https://example.com',
55
- apiKey: 'respira_your-api-key-here',
56
- default: true,
57
- },
58
- ],
59
- preferences: {
60
- autoDuplicate: true,
61
- securityChecks: true,
102
+ return normalizedConfig;
103
+ }
104
+ function readConfigFromPath(path, sourceLabel, persistFixes = false) {
105
+ const configData = readFileSync(path, 'utf-8');
106
+ const parsed = JSON.parse(configData);
107
+ return normalizeConfig(parsed, sourceLabel, persistFixes ? path : undefined);
108
+ }
109
+ export function readConfigFromBase64(encoded) {
110
+ const raw = Buffer.from(encoded, 'base64').toString('utf8');
111
+ const parsed = JSON.parse(raw);
112
+ return normalizeConfig(parsed, 'RESPIRA_CONFIG_B64');
113
+ }
114
+ function ensureDefaultConfigFile() {
115
+ console.error('No configuration file found. Creating default configuration...');
116
+ console.error(`Please edit ${CONFIG_FILE} to add your WordPress sites.`);
117
+ if (!existsSync(CONFIG_DIR)) {
118
+ mkdirSync(CONFIG_DIR, { recursive: true });
119
+ }
120
+ saveConfig({
121
+ sites: [
122
+ {
123
+ id: 'example-site',
124
+ name: 'My WordPress Site',
125
+ url: 'https://example.com',
126
+ apiKey: 'respira_your-api-key-here',
127
+ default: true,
62
128
  },
63
- };
64
- saveConfig(exampleConfig);
65
- throw new Error(`Configuration file created at ${CONFIG_FILE}\n` +
66
- 'Please update it with your WordPress site URL and API key, then run again.');
129
+ ],
130
+ preferences: {
131
+ autoDuplicate: true,
132
+ securityChecks: true,
133
+ },
134
+ });
135
+ throw new Error(`Configuration file created at ${CONFIG_FILE}\n` +
136
+ 'Please update it with your WordPress site URL and API key, then run again.');
137
+ }
138
+ function loadEnvSingleSiteConfig() {
139
+ const envUrl = process.env.WORDPRESS_URL?.trim();
140
+ const envKey = process.env.WORDPRESS_API_KEY?.trim();
141
+ if (!envUrl || !envKey) {
142
+ return null;
143
+ }
144
+ const validated = validateAndFixSiteUrl(envUrl);
145
+ return {
146
+ sites: [
147
+ {
148
+ id: 'env-site',
149
+ name: 'WordPress (from env)',
150
+ url: validated.url,
151
+ apiKey: envKey,
152
+ default: true,
153
+ },
154
+ ],
155
+ preferences: {
156
+ autoDuplicate: true,
157
+ securityChecks: true,
158
+ },
159
+ };
160
+ }
161
+ function writeConfig(config, path) {
162
+ const targetDir = dirname(path);
163
+ if (!existsSync(targetDir)) {
164
+ mkdirSync(targetDir, { recursive: true });
67
165
  }
166
+ writeFileSync(path, JSON.stringify(config, null, 2));
167
+ }
168
+ /**
169
+ * Load configuration from inline base64, explicit file path, default file, or env vars.
170
+ *
171
+ * Precedence by default:
172
+ * 1. RESPIRA_CONFIG_B64
173
+ * 2. RESPIRA_CONFIG_FILE
174
+ * 3. ~/.respira/config.json
175
+ * 4. WORDPRESS_URL + WORDPRESS_API_KEY
176
+ *
177
+ * Set RESPIRA_CONFIG_MODE=env to force env-only mode for single-site setups.
178
+ */
179
+ export function loadConfig() {
180
+ const forcedMode = process.env.RESPIRA_CONFIG_MODE?.trim();
68
181
  try {
69
- const configData = readFileSync(CONFIG_FILE, 'utf-8');
70
- const config = JSON.parse(configData);
71
- // Validate configuration
72
- if (!config.sites || config.sites.length === 0) {
73
- throw new Error('No WordPress sites configured in config.json');
74
- }
75
- // Validate each site
76
- config.sites.forEach((site, index) => {
77
- if (!site.id || !site.name || !site.url || !site.apiKey) {
78
- throw new Error(`Site ${index + 1} is missing required fields (id, name, url, apiKey)`);
79
- }
80
- if (!site.apiKey.startsWith('respira_')) {
81
- console.warn(`Warning: API key for "${site.name}" doesn't start with "respira_" prefix`);
82
- }
83
- // Validate and fix URL
84
- let fixedUrl = site.url.trim();
85
- let urlFixed = false;
86
- // Fix duplicate protocols (https://https://, http://http://, etc.) - preserve original protocol
87
- const dupProtocolMatch = fixedUrl.match(/^(https?:\/\/){2,}/i);
88
- if (dupProtocolMatch) {
89
- const firstProtocol = fixedUrl.startsWith('https') ? 'https://' : 'http://';
90
- fixedUrl = fixedUrl.replace(/^(https?:\/\/)+/i, firstProtocol);
91
- urlFixed = true;
92
- }
93
- // Fix mixed protocols (http://https://, https://http://)
94
- if (fixedUrl.match(/^http:\/\/https:\/\//i)) {
95
- fixedUrl = fixedUrl.replace(/^http:\/\/https:\/\//i, 'https://');
96
- urlFixed = true;
97
- }
98
- if (fixedUrl.match(/^https:\/\/http:\/\//i)) {
99
- fixedUrl = fixedUrl.replace(/^https:\/\/http:\/\//i, 'https://');
100
- urlFixed = true;
101
- }
102
- // Fix malformed protocols (https//, http//)
103
- if (fixedUrl.match(/^(https?)\/\//i)) {
104
- fixedUrl = fixedUrl.replace(/^(https?)\/\//i, '$1://');
105
- urlFixed = true;
106
- }
107
- // Fix triple slashes (https:///example.com)
108
- if (fixedUrl.match(/^(https?:\/\/)\//)) {
109
- fixedUrl = fixedUrl.replace(/^(https?:\/\/)\//, '$1');
110
- urlFixed = true;
182
+ if (forcedMode === 'env') {
183
+ const envConfig = loadEnvSingleSiteConfig();
184
+ if (!envConfig) {
185
+ throw new Error('RESPIRA_CONFIG_MODE=env requires WORDPRESS_URL and WORDPRESS_API_KEY.');
111
186
  }
112
- // Remove multiple consecutive slashes (except after protocol)
113
- // Split by protocol, fix slashes in path, then rejoin
114
- const protocolMatch = fixedUrl.match(/^(https?:\/\/)(.*)$/i);
115
- if (protocolMatch) {
116
- const protocol = protocolMatch[1];
117
- const path = protocolMatch[2];
118
- const fixedPath = path.replace(/\/+/g, '/');
119
- fixedUrl = protocol + fixedPath;
120
- if (path !== fixedPath) {
121
- urlFixed = true;
122
- }
123
- }
124
- // Validate URL format
125
- try {
126
- // Add protocol if missing - use http for local dev (Local, Lando, etc.)
127
- if (!fixedUrl.match(/^https?:\/\//i)) {
128
- const host = fixedUrl.split('/')[0]?.split(':')[0] || '';
129
- const isLocal = /^(localhost|127\.0\.0\.1|.*\.local|.*\.localdomain|.*\.lndo\.site)$/i.test(host);
130
- fixedUrl = `${isLocal ? 'http' : 'https'}://${fixedUrl}`;
131
- urlFixed = true;
132
- }
133
- const urlObj = new URL(fixedUrl);
134
- // Ensure protocol is http or https
135
- if (urlObj.protocol !== 'http:' && urlObj.protocol !== 'https:') {
136
- throw new Error(`Site ${index + 1} ("${site.name}") has invalid URL protocol: ${urlObj.protocol}`);
137
- }
138
- // Validate hostname
139
- if (!urlObj.hostname || urlObj.hostname.length === 0) {
140
- throw new Error(`Site ${index + 1} ("${site.name}") has invalid hostname`);
141
- }
142
- // Remove default ports
143
- if (urlObj.port === '80' && urlObj.protocol === 'http:') {
144
- urlObj.port = '';
145
- }
146
- if (urlObj.port === '443' && urlObj.protocol === 'https:') {
147
- urlObj.port = '';
148
- }
149
- // Update site URL if it was fixed
150
- if (urlFixed) {
151
- const normalizedUrl = urlObj.toString().replace(/\/$/, '');
152
- console.warn(`Warning: Site "${site.name}" had malformed URL: ${site.url}`);
153
- console.warn(` Auto-fixed to: ${normalizedUrl}`);
154
- site.url = normalizedUrl;
155
- // Save fixed config back
156
- saveConfig(config);
157
- }
158
- }
159
- catch (e) {
160
- if (e instanceof TypeError && e.message.includes('Invalid URL')) {
161
- throw new Error(`Site ${index + 1} ("${site.name}") has invalid URL: ${site.url}`);
162
- }
163
- throw e;
187
+ return envConfig;
188
+ }
189
+ const inlineConfig = process.env.RESPIRA_CONFIG_B64?.trim();
190
+ if (inlineConfig) {
191
+ return readConfigFromBase64(inlineConfig);
192
+ }
193
+ const explicitPath = process.env.RESPIRA_CONFIG_FILE?.trim();
194
+ if (explicitPath) {
195
+ if (!existsSync(explicitPath)) {
196
+ throw new Error(`RESPIRA_CONFIG_FILE points to a missing file: ${explicitPath}`);
164
197
  }
165
- });
166
- return config;
198
+ return readConfigFromPath(explicitPath, explicitPath, true);
199
+ }
200
+ if (existsSync(CONFIG_FILE)) {
201
+ return readConfigFromPath(CONFIG_FILE, CONFIG_FILE, true);
202
+ }
203
+ const envConfig = loadEnvSingleSiteConfig();
204
+ if (envConfig) {
205
+ return envConfig;
206
+ }
207
+ return ensureDefaultConfigFile();
167
208
  }
168
209
  catch (error) {
169
- if (error.code === 'ENOENT') {
170
- return DEFAULT_CONFIG;
171
- }
172
210
  if (error instanceof SyntaxError) {
173
- throw new Error(`Invalid JSON in config file: ${CONFIG_FILE}\n${error.message}`);
211
+ throw new Error(`Invalid JSON in configuration: ${error.message}`);
174
212
  }
175
213
  const errorMessage = error?.message || error?.toString() || 'Unknown error';
176
- throw new Error(`Failed to load configuration from ${CONFIG_FILE}: ${errorMessage}`);
214
+ throw new Error(`Failed to load Respira configuration: ${errorMessage}`);
177
215
  }
178
216
  }
179
217
  /**
180
- * Save configuration to file
218
+ * Save configuration to the default Respira config file.
181
219
  */
182
220
  export function saveConfig(config) {
183
221
  try {
184
- if (!existsSync(CONFIG_DIR)) {
185
- mkdirSync(CONFIG_DIR, { recursive: true });
186
- }
187
- writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
222
+ writeConfig(config, CONFIG_FILE);
188
223
  console.error(`Configuration saved to ${CONFIG_FILE}`);
189
224
  }
190
225
  catch (error) {
191
226
  throw new Error(`Failed to save configuration: ${error.message}`);
192
227
  }
193
228
  }
229
+ /**
230
+ * Save configuration to an explicit file path.
231
+ */
232
+ export function saveConfigToPath(config, path) {
233
+ try {
234
+ writeConfig(config, path);
235
+ console.error(`Configuration saved to ${path}`);
236
+ }
237
+ catch (error) {
238
+ throw new Error(`Failed to save configuration to ${path}: ${error.message}`);
239
+ }
240
+ }
194
241
  /**
195
242
  * Add a new site to configuration
196
243
  */
197
244
  export function addSite(site) {
198
245
  const config = loadConfig();
199
- // Check for duplicate ID
200
- if (config.sites.some((s) => s.id === site.id)) {
246
+ if (config.sites.some((existing) => existing.id === site.id)) {
201
247
  throw new Error(`Site with ID "${site.id}" already exists`);
202
248
  }
203
- // If this is the first site, make it default
204
249
  if (config.sites.length === 0) {
205
250
  site.default = true;
206
251
  }
@@ -212,13 +257,12 @@ export function addSite(site) {
212
257
  */
213
258
  export function removeSite(siteId) {
214
259
  const config = loadConfig();
215
- const index = config.sites.findIndex((s) => s.id === siteId);
260
+ const index = config.sites.findIndex((site) => site.id === siteId);
216
261
  if (index === -1) {
217
262
  throw new Error(`Site with ID "${siteId}" not found`);
218
263
  }
219
264
  config.sites.splice(index, 1);
220
- // If we removed the default site, make the first site default
221
- if (config.sites.length > 0 && !config.sites.some((s) => s.default)) {
265
+ if (config.sites.length > 0 && !config.sites.some((site) => site.default)) {
222
266
  config.sites[0].default = true;
223
267
  }
224
268
  saveConfig(config);
@@ -228,15 +272,13 @@ export function removeSite(siteId) {
228
272
  */
229
273
  export function setDefaultSite(siteId) {
230
274
  const config = loadConfig();
231
- const site = config.sites.find((s) => s.id === siteId);
275
+ const site = config.sites.find((candidate) => candidate.id === siteId);
232
276
  if (!site) {
233
277
  throw new Error(`Site with ID "${siteId}" not found`);
234
278
  }
235
- // Remove default from all sites
236
- config.sites.forEach((s) => {
237
- s.default = false;
279
+ config.sites.forEach((candidate) => {
280
+ candidate.default = false;
238
281
  });
239
- // Set new default
240
282
  site.default = true;
241
283
  saveConfig(config);
242
284
  }
@@ -245,7 +287,7 @@ export function setDefaultSite(siteId) {
245
287
  */
246
288
  export async function testConnection(siteId) {
247
289
  const config = loadConfig();
248
- const site = config.sites.find((s) => s.id === siteId);
290
+ const site = config.sites.find((candidate) => candidate.id === siteId);
249
291
  if (!site) {
250
292
  throw new Error(`Site with ID "${siteId}" not found`);
251
293
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -71,12 +71,12 @@ export async function discoverAbilities(siteUrl, apiKey) {
71
71
  result.message =
72
72
  'This site has the WordPress Abilities API and MCP Adapter installed. ' +
73
73
  'Respira abilities are registered and discoverable through the official adapter. ' +
74
- 'You can use either this standalone MCP server or the WordPress MCP Adapter path.';
74
+ 'You can use the standalone MCP server, the adapter default/public server, or the dedicated Respira adapter server side by side.';
75
75
  }
76
76
  else if (result.abilitiesApiAvailable && !result.respiraAbilitiesRegistered) {
77
77
  result.message =
78
78
  'This site has the WordPress Abilities API but Respira abilities are not registered. ' +
79
- 'Update the Respira plugin to v2.0+ to register abilities automatically.';
79
+ 'Update the Respira plugin to a current 4.x build so abilities are registered automatically.';
80
80
  }
81
81
  else if (result.abilitiesApiAvailable) {
82
82
  result.message =