The discourse-mcp was BLOCKED with a TypeScript TS2345 error caused by
the Dockerfile forcing SDK ^1.23.0 via `pnpm add`, while the upstream
code requires the lockfile's v1.17.3. Removed the override to use
`pnpm install --frozen-lockfile`.
The upstream server does not read environment variables directly — it
requires CLI args (--auth-pairs, --site) or a --profile JSON file. Added
a docker-entrypoint.sh that converts DISCOURSE_URL, DISCOURSE_API_KEY,
and DISCOURSE_API_USERNAME env vars into a profile JSON with auth_pairs
and site tethering.
Validated end-to-end: MCP handshake passes, site auto-tethers on startup,
live tool calls (discourse_search, discourse_filter_topics) return real
data from community.turnsys.com.
Updates STATUS.md and README.md to reflect discourse-mcp as production
ready. Adds JOURNAL.md entries for discourse-cli, discourse-mcp fix, and
protocol improvements.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
41 lines
1.2 KiB
Docker
41 lines
1.2 KiB
Docker
FROM node:24-alpine
|
|
|
|
WORKDIR /app
|
|
|
|
# Install pnpm as upstream requires
|
|
RUN corepack enable && corepack prepare pnpm@10.14.0 --activate
|
|
|
|
COPY package.json pnpm-lock.yaml ./
|
|
|
|
# Install dependencies from lockfile (pins SDK to upstream-compatible version)
|
|
RUN pnpm install --frozen-lockfile
|
|
|
|
COPY . .
|
|
|
|
RUN pnpm build
|
|
|
|
# Entrypoint script converts env vars to CLI args (profile JSON file)
|
|
RUN cat <<'ENTRYEOF' > /docker-entrypoint.sh
|
|
#!/bin/sh
|
|
set -e
|
|
if [ -n "${DISCOURSE_URL}" ] && [ -n "${DISCOURSE_API_KEY}" ]; then
|
|
echo -n '{"auth_pairs":[{"site":"' > /tmp/profile.json
|
|
echo -n "${DISCOURSE_URL}" >> /tmp/profile.json
|
|
echo -n '","api_key":"' >> /tmp/profile.json
|
|
echo -n "${DISCOURSE_API_KEY}" >> /tmp/profile.json
|
|
echo -n '"' >> /tmp/profile.json
|
|
if [ -n "${DISCOURSE_API_USERNAME}" ]; then
|
|
echo -n ',"api_username":"' >> /tmp/profile.json
|
|
echo -n "${DISCOURSE_API_USERNAME}" >> /tmp/profile.json
|
|
echo -n '"' >> /tmp/profile.json
|
|
fi
|
|
echo -n '}]}' >> /tmp/profile.json
|
|
exec node dist/index.js --profile /tmp/profile.json --site "${DISCOURSE_URL}" --allow-writes --read-only false "$@"
|
|
else
|
|
exec node dist/index.js "$@"
|
|
fi
|
|
ENTRYEOF
|
|
RUN chmod +x /docker-entrypoint.sh
|
|
|
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|