localwp-mcp 0.1.2 → 0.1.4

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.
Files changed (52) hide show
  1. package/LICENSE +15 -15
  2. package/README.md +254 -221
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.js +2 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/local-graphql.d.ts +8 -0
  7. package/dist/local-graphql.js +78 -0
  8. package/dist/local-graphql.js.map +1 -0
  9. package/dist/local-sites.js +17 -11
  10. package/dist/local-sites.js.map +1 -1
  11. package/dist/platform-paths.d.ts +1 -0
  12. package/dist/platform-paths.js +8 -0
  13. package/dist/platform-paths.js.map +1 -1
  14. package/dist/site-files.d.ts +196 -0
  15. package/dist/site-files.js +417 -0
  16. package/dist/site-files.js.map +1 -0
  17. package/dist/site-lifecycle.d.ts +33 -0
  18. package/dist/site-lifecycle.js +66 -0
  19. package/dist/site-lifecycle.js.map +1 -0
  20. package/dist/tool-schemas.d.ts +1 -0
  21. package/dist/tool-schemas.js +4 -0
  22. package/dist/tool-schemas.js.map +1 -1
  23. package/dist/tools/delete-site-file.d.ts +2 -0
  24. package/dist/tools/delete-site-file.js +29 -0
  25. package/dist/tools/delete-site-file.js.map +1 -0
  26. package/dist/tools/index.js +16 -0
  27. package/dist/tools/index.js.map +1 -1
  28. package/dist/tools/list-site-files.d.ts +2 -0
  29. package/dist/tools/list-site-files.js +46 -0
  30. package/dist/tools/list-site-files.js.map +1 -0
  31. package/dist/tools/read-site-file.d.ts +2 -0
  32. package/dist/tools/read-site-file.js +30 -0
  33. package/dist/tools/read-site-file.js.map +1 -0
  34. package/dist/tools/restart-local-site.d.ts +2 -0
  35. package/dist/tools/restart-local-site.js +19 -0
  36. package/dist/tools/restart-local-site.js.map +1 -0
  37. package/dist/tools/search-site-files.d.ts +2 -0
  38. package/dist/tools/search-site-files.js +57 -0
  39. package/dist/tools/search-site-files.js.map +1 -0
  40. package/dist/tools/start-local-site.d.ts +2 -0
  41. package/dist/tools/start-local-site.js +19 -0
  42. package/dist/tools/start-local-site.js.map +1 -0
  43. package/dist/tools/stop-local-site.d.ts +2 -0
  44. package/dist/tools/stop-local-site.js +19 -0
  45. package/dist/tools/stop-local-site.js.map +1 -0
  46. package/dist/tools/write-site-file.d.ts +2 -0
  47. package/dist/tools/write-site-file.js +30 -0
  48. package/dist/tools/write-site-file.js.map +1 -0
  49. package/dist/types.d.ts +11 -0
  50. package/dist/wp-cli.js +20 -0
  51. package/dist/wp-cli.js.map +1 -1
  52. package/package.json +61 -61
package/LICENSE CHANGED
@@ -1,15 +1,15 @@
1
- ISC License
2
-
3
- Copyright (c) 2026
4
-
5
- Permission to use, copy, modify, and/or distribute this software for any
6
- purpose with or without fee is hereby granted, provided that the above
7
- copyright notice and this permission notice appear in all copies.
8
-
9
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
- PERFORMANCE OF THIS SOFTWARE.
1
+ ISC License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ PERFORMANCE OF THIS SOFTWARE.
package/README.md CHANGED
@@ -1,221 +1,254 @@
1
- # localwp-mcp
2
-
3
- `localwp-mcp` gives AI agents direct access to LocalWP sites through MCP.
4
-
5
- It automatically finds your Local sites, uses the correct Local PHP and MySQL runtimes for each one, and lets an agent work with WordPress through WP-CLI, MySQL, logs, diagnostics, backups, and restore flows.
6
-
7
- ## What You Can Do
8
-
9
- - inspect Local sites and their runtime details
10
- - run WP-CLI against the correct site
11
- - query the WordPress database
12
- - allow full database writes when you want unrestricted local development
13
- - read recent logs and run site health checks
14
- - export, import, back up, and restore LocalWP sites
15
-
16
- ## Install
17
-
18
- Use `npx` in your MCP client:
19
-
20
- ```json
21
- {
22
- "mcpServers": {
23
- "localwp": {
24
- "command": "npx",
25
- "args": ["localwp-mcp"],
26
- "env": {
27
- "LOCALWP_MCP_PROFILE": "safe"
28
- }
29
- }
30
- }
31
- }
32
- ```
33
-
34
- You can also install it globally:
35
-
36
- ```bash
37
- npm install -g localwp-mcp
38
- ```
39
-
40
- Then use:
41
-
42
- ```json
43
- {
44
- "mcpServers": {
45
- "localwp": {
46
- "command": "localwp-mcp",
47
- "env": {
48
- "LOCALWP_MCP_PROFILE": "safe"
49
- }
50
- }
51
- }
52
- }
53
- ```
54
-
55
- If you want the MCP to focus on one site by default, set:
56
-
57
- ```json
58
- {
59
- "LOCAL_SITE_NAME": "example-site"
60
- }
61
- ```
62
-
63
- ## Access Modes
64
-
65
- `localwp-mcp` has 2 access modes:
66
-
67
- - `safe`
68
- Best default for most people. Safe WordPress inspection commands, diagnostics, logs, database reads, and backup/export flows.
69
- - `full-access`
70
- Best when you want the agent to fully work on your local site, including SQL writes, imports, and restore operations.
71
-
72
- `safe` is the default.
73
-
74
- To enable full local access:
75
-
76
- ```json
77
- {
78
- "LOCALWP_MCP_PROFILE": "full-access"
79
- }
80
- ```
81
-
82
- ## First Things To Try
83
-
84
- Start with:
85
-
86
- - `local_environment_check`
87
- - `local_doctor`
88
- - `list_local_sites`
89
-
90
- Those will tell you:
91
-
92
- - which Local sites were discovered
93
- - whether the site is running
94
- - which Local runtimes were resolved
95
- - whether WP-CLI and MySQL are reachable
96
-
97
- ## Common Workflows
98
-
99
- ### Inspect a Site
100
-
101
- Use:
102
-
103
- - `local_site_info`
104
- - `local_doctor`
105
- - `local_logs`
106
-
107
- ### Work With WordPress
108
-
109
- Use:
110
-
111
- - `execute_wp_cli`
112
-
113
- Examples:
114
-
115
- - list plugins
116
- - inspect options
117
- - list posts or users
118
- - run plugin-specific WP-CLI commands
119
-
120
- ### Work With the Database
121
-
122
- Use:
123
-
124
- - `mysql_query`
125
- Read-only SQL in `safe`
126
- - `mysql_execute`
127
- Full SQL execution in `full-access`
128
- - `mysql_schema`
129
- Table listing and table description helpers
130
-
131
- ### Back Up or Restore a Site
132
-
133
- Use:
134
-
135
- - `backup_site`
136
- - `db_export`
137
- - `db_import`
138
- - `restore_backup`
139
-
140
- `backup_site` supports:
141
-
142
- - `database`
143
- - `full`
144
-
145
- The `full` backup format is folder-based and includes the site's `app`, `conf`, and `logs` directories plus a fresh SQL dump.
146
-
147
- ## Built-In Capabilities
148
-
149
- ### Tools
150
-
151
- - `list_local_sites`
152
- - `local_environment_check`
153
- - `local_doctor`
154
- - `local_logs`
155
- - `local_site_info`
156
- - `execute_wp_cli`
157
- - `mysql_query`
158
- - `mysql_execute`
159
- - `mysql_schema`
160
- - `db_export`
161
- - `db_import`
162
- - `backup_site`
163
- - `restore_backup`
164
-
165
- ### MCP Resources
166
-
167
- - `localwp://sites`
168
- - `localwp://sites/{siteName}/summary`
169
- - `localwp://sites/{siteName}/doctor`
170
- - `localwp://sites/{siteName}/logs`
171
-
172
- ### MCP Prompts
173
-
174
- - `diagnose_local_site`
175
- - `restore_local_site`
176
-
177
- ## Platform Support
178
-
179
- `localwp-mcp` is designed for:
180
-
181
- - macOS
182
- - Windows
183
- - Linux
184
-
185
- It supports both current Local `lightning-services` layouts and older `site-binaries` layouts.
186
-
187
- ## Useful Environment Variables
188
-
189
- Most users only need these:
190
-
191
- - `LOCALWP_MCP_PROFILE`
192
- - `LOCAL_SITE_NAME`
193
- - `LOCAL_SITE_ID`
194
- - `LOCALWP_MCP_BACKUPS_DIR`
195
-
196
- Advanced override variables also exist for custom Local layouts, but most installations do not need them.
197
-
198
- ## Troubleshooting
199
-
200
- If the MCP does not find your site or cannot run WP-CLI/MySQL:
201
-
202
- 1. Start the site in Local.
203
- 2. Run `local_environment_check`.
204
- 3. Run `local_doctor`.
205
- 4. Check `local_logs`.
206
-
207
- Those tools are the fastest way to see whether the problem is:
208
-
209
- - site selection
210
- - Local metadata resolution
211
- - WP-CLI resolution
212
- - MySQL connectivity
213
- - missing or stopped Local services
214
-
215
- ## For Contributors
216
-
217
- Contributor and maintainer docs live outside the main user guide:
218
-
219
- - [CONTRIBUTING.md](./CONTRIBUTING.md)
220
- - [SECURITY.md](./SECURITY.md)
221
- - [Maintainer Docs](./docs/maintainers/README.md)
1
+ # localwp-mcp
2
+
3
+ `localwp-mcp` gives AI agents direct access to LocalWP sites through MCP.
4
+
5
+ It automatically finds your Local sites, uses the correct Local PHP and MySQL runtimes for each one, and lets an agent work with WordPress through WP-CLI, MySQL, logs, diagnostics, backups, and restore flows.
6
+
7
+ ## What You Can Do
8
+
9
+ - inspect Local sites and their runtime details
10
+ - start, stop, and restart Local sites
11
+ - list, read, search, write, and delete files inside a selected Local site
12
+ - run WP-CLI against the correct site
13
+ - query the WordPress database
14
+ - allow full database writes when you want unrestricted local development
15
+ - read recent logs and run site health checks
16
+ - export, import, back up, and restore LocalWP sites
17
+
18
+ ## Install
19
+
20
+ Use `npx` in your MCP client:
21
+
22
+ ```json
23
+ {
24
+ "mcpServers": {
25
+ "localwp": {
26
+ "command": "npx",
27
+ "args": ["localwp-mcp"],
28
+ "env": {
29
+ "LOCALWP_MCP_PROFILE": "safe"
30
+ }
31
+ }
32
+ }
33
+ }
34
+ ```
35
+
36
+ You can also install it globally:
37
+
38
+ ```bash
39
+ npm install -g localwp-mcp
40
+ ```
41
+
42
+ Then use:
43
+
44
+ ```json
45
+ {
46
+ "mcpServers": {
47
+ "localwp": {
48
+ "command": "localwp-mcp",
49
+ "env": {
50
+ "LOCALWP_MCP_PROFILE": "safe"
51
+ }
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ If you want the MCP to focus on one site by default, set:
58
+
59
+ ```json
60
+ {
61
+ "LOCAL_SITE_NAME": "example-site"
62
+ }
63
+ ```
64
+
65
+ ## Access Modes
66
+
67
+ `localwp-mcp` has 2 access modes:
68
+
69
+ - `safe`
70
+ Best default for most people. Safe WordPress inspection commands, diagnostics, logs, database reads, and backup/export flows.
71
+ - `full-access`
72
+ Best when you want the agent to fully work on your local site, including SQL writes, imports, and restore operations.
73
+
74
+ `safe` is the default.
75
+
76
+ To enable full local access:
77
+
78
+ ```json
79
+ {
80
+ "LOCALWP_MCP_PROFILE": "full-access"
81
+ }
82
+ ```
83
+
84
+ ## First Things To Try
85
+
86
+ Start with:
87
+
88
+ - `local_environment_check`
89
+ - `local_doctor`
90
+ - `list_local_sites`
91
+
92
+ Those will tell you:
93
+
94
+ - which Local sites were discovered
95
+ - whether the site is running
96
+ - which Local runtimes were resolved
97
+ - whether WP-CLI and MySQL are reachable
98
+
99
+ ## Common Workflows
100
+
101
+ ### Inspect a Site
102
+
103
+ Use:
104
+
105
+ - `local_site_info`
106
+ - `local_doctor`
107
+ - `local_logs`
108
+
109
+ ### Work With Site Files
110
+
111
+ Use:
112
+
113
+ - `list_site_files`
114
+ - `read_site_file`
115
+ - `search_site_files`
116
+ - `write_site_file`
117
+ - `delete_site_file`
118
+
119
+ These tools are always scoped to the selected site's root directory.
120
+
121
+ - In `safe`, you can list, read, and search files.
122
+ - In `full-access`, you can also write and delete files.
123
+
124
+ ### Control a Local Site
125
+
126
+ Use:
127
+
128
+ - `start_local_site`
129
+ - `stop_local_site`
130
+ - `restart_local_site`
131
+
132
+ ### Work With WordPress
133
+
134
+ Use:
135
+
136
+ - `execute_wp_cli`
137
+
138
+ Examples:
139
+
140
+ - list plugins
141
+ - inspect options
142
+ - list posts or users
143
+ - run plugin-specific WP-CLI commands
144
+
145
+ ### Work With the Database
146
+
147
+ Use:
148
+
149
+ - `mysql_query`
150
+ Read-only SQL in `safe`
151
+ - `mysql_execute`
152
+ Full SQL execution in `full-access`
153
+ - `mysql_schema`
154
+ Table listing and table description helpers
155
+
156
+ ### Back Up or Restore a Site
157
+
158
+ Use:
159
+
160
+ - `backup_site`
161
+ - `db_export`
162
+ - `db_import`
163
+ - `restore_backup`
164
+
165
+ `backup_site` supports:
166
+
167
+ - `database`
168
+ - `full`
169
+
170
+ The `full` backup format is folder-based and includes the site's `app`, `conf`, and `logs` directories plus a fresh SQL dump.
171
+
172
+ ## Built-In Capabilities
173
+
174
+ ### Tools
175
+
176
+ - `list_local_sites`
177
+ - `start_local_site`
178
+ - `stop_local_site`
179
+ - `restart_local_site`
180
+ - `local_environment_check`
181
+ - `local_doctor`
182
+ - `local_logs`
183
+ - `local_site_info`
184
+ - `list_site_files`
185
+ - `read_site_file`
186
+ - `search_site_files`
187
+ - `write_site_file`
188
+ - `delete_site_file`
189
+ - `execute_wp_cli`
190
+ - `mysql_query`
191
+ - `mysql_execute`
192
+ - `mysql_schema`
193
+ - `db_export`
194
+ - `db_import`
195
+ - `backup_site`
196
+ - `restore_backup`
197
+
198
+ ### MCP Resources
199
+
200
+ - `localwp://sites`
201
+ - `localwp://sites/{siteName}/summary`
202
+ - `localwp://sites/{siteName}/doctor`
203
+ - `localwp://sites/{siteName}/logs`
204
+
205
+ ### MCP Prompts
206
+
207
+ - `diagnose_local_site`
208
+ - `restore_local_site`
209
+
210
+ ## Platform Support
211
+
212
+ `localwp-mcp` is designed for:
213
+
214
+ - macOS
215
+ - Windows
216
+ - Linux
217
+
218
+ It supports both current Local `lightning-services` layouts and older `site-binaries` layouts.
219
+
220
+ ## Useful Environment Variables
221
+
222
+ Most users only need these:
223
+
224
+ - `LOCALWP_MCP_PROFILE`
225
+ - `LOCAL_SITE_NAME`
226
+ - `LOCAL_SITE_ID`
227
+ - `LOCALWP_MCP_BACKUPS_DIR`
228
+
229
+ Advanced override variables also exist for custom Local layouts, but most installations do not need them.
230
+
231
+ ## Troubleshooting
232
+
233
+ If the MCP does not find your site or cannot run WP-CLI/MySQL:
234
+
235
+ 1. Start the site in Local.
236
+ 2. Run `local_environment_check`.
237
+ 3. Run `local_doctor`.
238
+ 4. Check `local_logs`.
239
+
240
+ Those tools are the fastest way to see whether the problem is:
241
+
242
+ - site selection
243
+ - Local metadata resolution
244
+ - WP-CLI resolution
245
+ - MySQL connectivity
246
+ - missing or stopped Local services
247
+
248
+ ## For Contributors
249
+
250
+ Contributor and maintainer docs live outside the main user guide:
251
+
252
+ - [CONTRIBUTING.md](./CONTRIBUTING.md)
253
+ - [SECURITY.md](./SECURITY.md)
254
+ - [Maintainer Docs](./docs/maintainers/README.md)
package/dist/config.d.ts CHANGED
@@ -9,6 +9,7 @@ export declare const config: {
9
9
  readonly localLightningServicesDirs: string[];
10
10
  readonly localSitesJson: string;
11
11
  readonly localSiteStatusesJson: string;
12
+ readonly localGraphqlConnectionInfoJson: string;
12
13
  readonly localWpCliPharCandidates: string[];
13
14
  readonly localWpCliConfigCandidates: string[];
14
15
  readonly localHelperBinDirCandidates: string[];
package/dist/config.js CHANGED
@@ -27,6 +27,8 @@ export const config = {
27
27
  path.join(process.env.LOCAL_APP_SUPPORT_DIR || defaultLocalAppSupportDir, "sites.json"),
28
28
  localSiteStatusesJson: process.env.LOCAL_SITE_STATUSES_JSON ||
29
29
  path.join(process.env.LOCAL_APP_SUPPORT_DIR || defaultLocalAppSupportDir, "site-statuses.json"),
30
+ localGraphqlConnectionInfoJson: process.env.LOCAL_GRAPHQL_CONNECTION_INFO ||
31
+ path.join(process.env.LOCAL_APP_SUPPORT_DIR || defaultLocalAppSupportDir, "graphql-connection-info.json"),
30
32
  localWpCliPharCandidates: process.env.LOCAL_WP_CLI_PHAR
31
33
  ? [process.env.LOCAL_WP_CLI_PHAR]
32
34
  : getWpCliPharCandidates(platform, localExtraResourcesDirs),
@@ -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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"}
@@ -0,0 +1,8 @@
1
+ import type { LocalSiteLifecycleMutationResult } from "./types.js";
2
+ interface LocalGraphqlError {
3
+ message?: string;
4
+ }
5
+ export declare function startLocalSite(siteId: string): Promise<LocalSiteLifecycleMutationResult>;
6
+ export declare function stopLocalSite(siteId: string): Promise<LocalSiteLifecycleMutationResult>;
7
+ export declare function formatLocalGraphqlErrors(errors?: LocalGraphqlError[]): string;
8
+ export {};
@@ -0,0 +1,78 @@
1
+ import { readFile } from "fs/promises";
2
+ import { config } from "./config.js";
3
+ import { assertReadable } from "./process-utils.js";
4
+ export async function startLocalSite(siteId) {
5
+ return runSiteLifecycleMutation("startSite", siteId);
6
+ }
7
+ export async function stopLocalSite(siteId) {
8
+ return runSiteLifecycleMutation("stopSite", siteId);
9
+ }
10
+ export function formatLocalGraphqlErrors(errors = []) {
11
+ const messages = errors
12
+ .map((error) => error.message?.trim())
13
+ .filter((message) => Boolean(message));
14
+ return messages.join("; ") || "Local GraphQL request failed.";
15
+ }
16
+ async function runSiteLifecycleMutation(mutationName, siteId) {
17
+ const query = `mutation ($siteID: ID!) { ${mutationName}(id: $siteID) { id name status } }`;
18
+ const payload = await requestLocalGraphql(query, { siteID: siteId });
19
+ const result = payload[mutationName];
20
+ if (!result) {
21
+ throw new Error(`Local GraphQL did not return '${mutationName}' data.`);
22
+ }
23
+ return result;
24
+ }
25
+ async function requestLocalGraphql(query, variables) {
26
+ const connection = await readLocalGraphqlConnectionInfo();
27
+ let response;
28
+ try {
29
+ response = await fetch(connection.url, {
30
+ method: "POST",
31
+ headers: {
32
+ "content-type": "application/json",
33
+ authorization: `Bearer ${connection.authToken}`,
34
+ },
35
+ body: JSON.stringify({ query, variables }),
36
+ });
37
+ }
38
+ catch (error) {
39
+ const message = error instanceof Error ? error.message : String(error);
40
+ throw new Error(`Failed to reach Local's GraphQL API at ${connection.url}. Make sure the Local app is running. ${message}`);
41
+ }
42
+ if (!response.ok) {
43
+ throw new Error(`Local GraphQL API responded with HTTP ${response.status} ${response.statusText}.`);
44
+ }
45
+ const payload = (await response.json());
46
+ if (payload.errors?.length) {
47
+ throw new Error(formatLocalGraphqlErrors(payload.errors));
48
+ }
49
+ if (!payload.data) {
50
+ throw new Error("Local GraphQL API returned no data.");
51
+ }
52
+ return payload.data;
53
+ }
54
+ async function readLocalGraphqlConnectionInfo() {
55
+ await assertReadable(config.localGraphqlConnectionInfoJson, "Local GraphQL connection info is not readable. Open the Local app first");
56
+ let parsed;
57
+ try {
58
+ parsed = JSON.parse(await readFile(config.localGraphqlConnectionInfoJson, "utf8"));
59
+ }
60
+ catch (error) {
61
+ const message = error instanceof Error ? error.message : String(error);
62
+ throw new Error(`Failed to read Local GraphQL connection info from '${config.localGraphqlConnectionInfoJson}': ${message}`);
63
+ }
64
+ if (!isLocalGraphqlConnectionInfo(parsed)) {
65
+ throw new Error(`Local GraphQL connection info is invalid: ${config.localGraphqlConnectionInfoJson}`);
66
+ }
67
+ return parsed;
68
+ }
69
+ function isLocalGraphqlConnectionInfo(value) {
70
+ if (!value || typeof value !== "object") {
71
+ return false;
72
+ }
73
+ const candidate = value;
74
+ return (typeof candidate.port === "number" &&
75
+ typeof candidate.authToken === "string" &&
76
+ typeof candidate.url === "string");
77
+ }
78
+ //# sourceMappingURL=local-graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-graphql.js","sourceRoot":"","sources":["../src/local-graphql.ts"],"names":[],"mappings":"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"}