settings.json file. Environment variables take precedence, so you can keep a base file and override specific values at runtime.
Environment variables
* Required as a pair. This is the authentication method.
Configuration file
Createsettings.json in one of these locations, checked in order:
./settings.json(the server’s working directory)~/.config/mainwp-mcp/settings.json
@mainwp/mcp 1.2.0, a working-directory settings.json cannot loosen security settings: requireUserConfirmation: false, skipSslVerify: true, and allowHttp: true are ignored there, with a warning on stderr. Set those through environment variables or the per-user file.
settings.schema.json for IDE autocompletion.
Field mapping
If both credential methods are present, the username plus Application Password pair takes precedence over
apiToken.
Multiple Dashboards
Give each Dashboard its own folder containing its ownsettings.json, then point each MCP server entry at the right folder with cwd in your AI client’s configuration:
./settings.json is checked first, each server instance picks up the credentials from its own working directory.
First-run setup
As of@mainwp/mcp 1.3.0, a server started without a Dashboard URL or credentials does not fail to launch. It connects to your AI client in setup mode: the MainWP tools stay hidden and two setup tools take their place, so you can finish configuration in the conversation instead of hunting through stderr.
mainwp_get_setup_statusreports what is missing and returns setup instructions for your assistant to relay. If credentials are present but the Dashboard was unreachable at startup, calling it again retries the connection with the credentials already loaded.mainwp_configuretakes a Dashboard URL, username, and Application Password, verifies them against the Dashboard, and saves them.
MAINWP_URL, MAINWP_USER, and MAINWP_APP_PASSWORD in the env block of this server’s entry in your MCP client config, or in ~/.config/mainwp-mcp/settings.json, then restart the client. The password never passes through the conversation.
Pasting them in chat is also fine. Your assistant collects the three values and calls mainwp_configure. The server verifies them, writes them to ~/.config/mainwp-mcp/settings.json with owner-only permissions (0600, in a 0700 directory), and scrubs the password from its own logs and from every response. An Application Password is separate from your WordPress login password and you can revoke it from your profile at any time.
Worth knowing before you choose: a password pasted in chat also becomes part of your chat history, which your AI client and provider may retain. If that bothers you later, revoke the password and create a new one.
mainwp_configure refuses rather than saving something that would be ignored or overridden:
- Any connection environment variable (
MAINWP_URL,MAINWP_USER,MAINWP_APP_PASSWORD,MAINWP_TOKEN) is set. Environment variables outrank the file it writes, so finish setup there. - A
settings.jsonexists in the server’s working directory. That file is loaded first and would permanently shadow the saved credentials. - The server already has credentials loaded, whether or not they are currently working. See the next section.
mainwp_configure through blockedTools removes chat-based setup entirely while leaving the manual path available.
Why setup will not replace credentials you already have
Chat-based setup can get you connected the first time, but it can never overwrite a connection you set up yourself. That line is deliberate, and it is worth knowing where it costs you something. The reason is that an assistant acts on text, and text can come from places you did not intend. A page it read, a site name, or an ability description returned by a server could carry instructions aimed at the assistant rather than at you. If setup could overwrite a working configuration, that kind of injected instruction could quietly repoint your server at someone else’s Dashboard, and every command you ran afterwards would go there. Restricting setup to the case where there is nothing to overwrite removes that possibility, because a server that has no credentials has nothing worth stealing. A tempting middle ground is to allow it when the stored credentials are provably wrong, since the Dashboard rejected them with an authentication error. We do not do that, because it would let the remote side decide when your local configuration may be replaced: a Dashboard that had been compromised, or a connection someone was tampering with, could reject a valid login on purpose to unlock the replacement path, without ever knowing your password. The cost is real, and it lands in one place. If you rotate the Application Password in WordPress, or the stored one is wrong for any other reason, retrying will not help, because the retry reuses the same credentials the Dashboard is already refusing. You have to put the new password in~/.config/mainwp-mcp/settings.json or your client’s env block yourself and restart the client. That is the same edit you would have made to set the server up manually in the first place, and it takes a minute.
Behavior settings
safeModeblocks every destructive operation at the server. Explained on Safety & Permissions.requireUserConfirmationcontrols the two-step preview/confirm flow for destructive operations (default on). Also on Safety & Permissions.allowedTools/blockedToolsfilter the tool catalog. See Restrict Available Tools.schemaVerbositytrades tool-description detail for context tokens. See Optimize Token Usage.abilityNamespacescontrols which plugins’ abilities are exposed. See Use Abilities from Other Plugins.responseFormatswitches tool response JSON betweencompact(default) andpretty.
Resource limits
These guard against runaway operations and oversized responses.Retry logic
Transient errors (HTTP 5xx, HTTP 429, network resets) are retried with exponential backoff and jitter. Only read-only operations are retried, which preserves idempotency; writes fail immediately. Permanent errors (4xx other than 429, authentication failures) are never retried. Total time across retries never exceedsrequestTimeout, and retries bypass the rate limiter to avoid deadlocks.
Disable for automation or testing with retryEnabled: false.
SSL
The server verifies certificates and refuses plain HTTP by default.skipSslVerify and allowHttp exist for local development against self-signed or HTTP-only environments.
