Atlas / MCP servers / imagewize / wp-ops

wp-opsBLOCK

mcp/imagewize/wp-ops

CLI and MCP server for WordPress operations — Trellis/Bedrock deployments, backups, security scanning, and monitoring — plus the scripts and guides they wrap

Verdict
BLOCK
Grade
F
Trust score
54 /100
Exposed tools
20 11r · 9w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

WP OPS

[](https://github.com/imagewize/wp-ops/releases) [](https://github.com/imagewize/wp-ops/releases) [](LICENSE.md)

wp-ops is a CLI for WordPress operations — deployments, database and files backup, security scanning, monitoring, and content workflows — backed by manifest-driven scripts, Ansible playbooks, and guides, optimized for Trellis/Bedrock workflows.

Contents

  • wp-ops CLI
  • Trellis
  • Bedrock
  • WP-CLI
  • Nginx
  • Scripts
  • MCP Server
  • WordPress Utilities
  • Troubleshooting

wp-ops CLI

The single entry point for everything in this repo — a single binary that auto-discovers commands across every category, groups them by domain, and renders real --help, guided prompts, and shell completions from each command's manifest.

# Recommended: Homebrew
brew install imagewize/tap/wp-ops
wp-ops init                  # install shell completions (one-time)

# Without Homebrew, build from source (needs Go 1.26+):
git clone https://github.com/imagewize/wp-ops.git && cd wp-ops
go build -o wp-ops ./go
sudo mv wp-ops /usr/local/bin/   # or ~/.local/bin, or anywhere on your PATH
wp-ops init

wp-ops                       # interactive picker
wp-ops --help                # list all categories
wp-ops ba
Read from source at commit d18f39d2f775OBSERVED · 2026-10-11
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add wp-ops-pattern-screenshots --env WP_OPS_ABUSEIPDB_KEY=${WP_OPS_ABUSEIPDB_KEY} --env WP_OPS_MCP_TOKEN=${WP_OPS_MCP_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "wp-ops-pattern-screenshots": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "WP_OPS_ABUSEIPDB_KEY": "${WP_OPS_ABUSEIPDB_KEY}",
        "WP_OPS_MCP_TOKEN": "${WP_OPS_MCP_TOKEN}"
      }
    }
  }
}
03

Exposed tools (20)

11 read · 9 write · 0 destructive.

ToolRiskDescription
admin_user_createwriteCreate a temporary WordPress administrator via WP-CLI — for lockout recovery (lost admin password,
broken_link_auditreadCheck a site
command_runwriteRun a wp-ops catalog command found via command_search, passing args as separate tokens.
command_searchreadSearch the full wp-ops command catalog (~74 commands: backups, monitoring, SEO and security
db_backupreadExport and gzip the WordPress database for a configured site/environment. Local sites are exported
db_pullreadPull a site
files_pullwriteSync a site
ip_reputation_checkreadCheck IP addresses against AbuseIPDB threat intelligence (score, report count, ISP, Tor). Pass
monitorwriteRun combined traffic, security, AI-crawler, and error-log monitoring against a site
publish_postwritePublish or update a WordPress blog post from a local HTML draft carrying the
redirect_auditreadAudit one or more URLs for redirect-chain issues: HTTPS status/redirect count, HTTP→HTTPS and
remote_ttfb_auditreadMeasure TTFB (time to first byte) from the server itself — via SSH, so DNS/network distance from
schema_auditreadAudit JSON-LD schema markup (Organization, LocalBusiness, Product, Article, etc.) across key pages
scp_filereadCopy a single file to (direction
security_scanwriteRun the wp-ops WordPress security scanners (targeted and/or general malware detection)
server_statusreadLive CPU, memory, disk, top processes, PHP-FPM, MySQL/MariaDB, Nginx, and recent OOM-killer snapshot
ssh_commandwriteRun one ad-hoc shell command on the registered remote host over SSH. Commands are split into
url_auditreadAudit wp_posts.post_content for hardcoded dev URLs (e.g.
verify_postwriteVerify that a published WordPress post survived the write intact: compares what is STORED in
wp_cliwriteRun a WP-CLI command against a configured site/environment. Pass args as separate tokens
04

Trust audit

BLOCKgrade F · trust 54/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (16 observation(s))
Network
declared (12 observation(s))
Shell
declared (4 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
mcp-server/src/tools/dbPull.ts:123
const importResult = await exec(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/monitoring/updown-webhook-receiver.php:123
exec($command . ' > /dev/null 2>&1 &');
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
wp-cli/content-creation/wp-cli-pattern-validate.php:321
exec( 'diff -u ' . escapeshellarg( $old_file ) . ' ' . escapeshellarg( $new_file ), $output );
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
wp-cli/content-creation/wp-cli-pattern-validate.php:388
exec( $cmd, $output, $code );
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp-server/src/tools/sshPassthrough.ts:109
/(^|\/)id_rsa/,
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp-server/src/tools/sshPassthrough.ts:110
/(^|\/)id_ed25519/,
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp-server/src/tools/sshPassthrough.ts:111
/(^|\/)id_ecdsa/,
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp-server/src/tools/sshPassthrough.ts:113
/(^|\/)authorized_keys$/,
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
mcp-server/src/tools/sshPassthrough.ts:114
/(^|\/)\.netrc$/,
Why it matters. touches a credential store
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
trellis/security/check-ips.sh:27
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.vibe/config.toml:35
api_base = "http://127.0.0.1:8080/v1"
LOWInventory / provenance · inv.hidden_file · CWE-1104
.goreleaser.yml
.goreleaser.yml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
go/internal/manifest/manifest_test.go:114
repoRoot := "../../.." // go/internal/manifest -> repo root
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
go/internal/manifest/manifest_test.go:140
errs := Lint(cmd, "../../..")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
go/internal/manifest/manifest_test.go:166
errs := Lint(cmd, "../../..")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
go/internal/manifest/manifest_test.go:209
errs := Lint(cmd, "../../..")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
mcp-server/src/tools/brokenLinkAudit.ts:6
const SCRIPT_PATH = path.resolve(__dirname, "../../../scripts/monitoring/404-checker.sh");
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
mcp-server/package.json
@modelcontextprotocol/sdk, express, zod, @types/express, @types/node, tsx, typescript
Why it matters. 7 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
scripts/patterns/package.json
playwright, sharp
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/troubleshooting/MAIL.md:160
WordPress sends emails to the configured admin email address (e.g., site registration notifications, password resets, user notifications). If this email address doesn't exist, emails will bounce with
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
CHANGELOG.md:188
`cat web/wp-config.php` or `cat ~/.ssh/id_rsa` through with no `confirm: true` step,
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
CHANGELOG.md:192
describes: "once it has local file access, it can find your ssh credential... the
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
CHANGELOG.md:422
the VM, so the host's `wp` read the site's `.env` credentials, aimed them at
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/troubleshooting/MAIL.md:10
- No sudo access (passwordless)
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/troubleshooting/MAIL.md:14
- Full sudo access with password
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha d18f39d2f775full audit observations/trust-audit/mcp-server/imagewize__wp-ops.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11d18f39d2f775BLOCKF54first audit
06

Questions

What is the wp-ops MCP server?

CLI and MCP server for WordPress operations — Trellis/Bedrock deployments, backups, security scanning, and monitoring — plus the scripts and guides they wrap

What tools does wp-ops expose?

20 in total: 11 read-only, 9 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is wp-ops safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (54/100) and found 10 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does wp-ops need?

It reads WP_OPS_ABUSEIPDB_KEY and WP_OPS_MCP_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does wp-ops run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as wp-ops-pattern-screenshots at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (d18f39d2f775), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement