47 lines
2.1 KiB
Bash
Executable File
47 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#ddev-generated
|
|
# Keeps Claude Code's MCP config in step with the opt-in headless browser.
|
|
#
|
|
# Enabled (.ddev/docker-compose.claude-browser.yaml exists): registers the
|
|
# "playwright" MCP server at user scope, and refreshes an add-on-managed compose
|
|
# copy from the template after an add-on upgrade. Disabled: removes the
|
|
# registration, but only if it is still the one this script created.
|
|
#
|
|
# Called by install.sh with HOME already pointing at the persisted profile. Never
|
|
# fatal: a browser problem must not fail "ddev start" or "ddev claude".
|
|
set -uo pipefail
|
|
|
|
DDEV_DIR="${DDEV_APPROOT}/.ddev"
|
|
TEMPLATE="${DDEV_DIR}/claude-code/browser/docker-compose.claude-browser.yaml"
|
|
ENABLED="${DDEV_DIR}/docker-compose.claude-browser.yaml"
|
|
NAME="playwright"
|
|
URL="http://claude-browser:8931/mcp"
|
|
CLAUDE_JSON="${HOME}/.claude.json"
|
|
|
|
if ! command -v jq >/dev/null 2>&1; then
|
|
[ -f "${ENABLED}" ] && echo "claude-browser: jq missing, skipping MCP registration" >&2
|
|
exit 0
|
|
fi
|
|
|
|
# Read ~/.claude.json directly: "claude mcp get" would try to connect.
|
|
registered=0
|
|
jq -e --arg n "${NAME}" '.mcpServers[$n]' "${CLAUDE_JSON}" >/dev/null 2>&1 && registered=1
|
|
current_url="$(jq -r --arg n "${NAME}" '.mcpServers[$n].url // empty' "${CLAUDE_JSON}" 2>/dev/null)"
|
|
|
|
if [ -f "${ENABLED}" ]; then
|
|
if [ -f "${TEMPLATE}" ] && grep -q '#ddev-generated' "${ENABLED}" && ! cmp -s "${TEMPLATE}" "${ENABLED}"; then
|
|
cat "${TEMPLATE}" >"${ENABLED}"
|
|
echo "claude-browser: refreshed .ddev/docker-compose.claude-browser.yaml from the add-on; run 'ddev restart' to apply" >&2
|
|
fi
|
|
if [ "${registered}" -eq 0 ]; then
|
|
claude mcp add --transport http --scope user "${NAME}" "${URL}" >/dev/null \
|
|
&& echo "claude-browser: registered MCP server '${NAME}' (${URL})"
|
|
elif [ "${current_url}" != "${URL}" ]; then
|
|
echo "claude-browser: an MCP server named '${NAME}' already exists and is not the add-on's; leaving it alone" >&2
|
|
fi
|
|
elif [ "${registered}" -eq 1 ] && [ "${current_url}" = "${URL}" ]; then
|
|
claude mcp remove "${NAME}" -s user >/dev/null \
|
|
&& echo "claude-browser: unregistered MCP server '${NAME}'"
|
|
fi
|
|
exit 0
|