Replies: 2 comments
-
|
Thanks for opening this — great framing of the three questions. Here's my take from running this server in production behind an OAuth gateway (streamable-http transport, network-bound, multi-session). Q1: Flip default to Streamable HTTP — YesWe've been running On client compatibility:
I'm not aware of any current MCP client that requires SSE specifically. The SDK's transport negotiation ( Suggestion: flip chart + Dockerfile to Q2: Keep accepting
|
Beta Was this translation helpful? Give feedback.
-
|
The auth/bind matrix is a strong control because it makes unsafe deployment shapes fail loudly instead of depending on documentation. For the next iteration, I would add one more dimension: tool capability class. A GitLab MCP server exposes tools with very different risk profiles. Read-only project metadata, issue creation, repository write actions, CI variable access, and pipeline trigger operations should not all inherit the same exposure policy just because they share the same transport. A practical matrix could classify tools as:
Then the startup gate can enforce stricter requirements for higher-risk classes: network-bound and unauthenticated should always fail; network-bound with weak token handling should fail for write/admin tools; localhost-only may be acceptable for development but should still warn when high-risk tools are enabled. That would make the threat model more precise without making operators reason through every individual tool manually. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Background
PR #58 closed GHSA-8jr5-6gvj-rfpf — CWE-306, unauthenticated network exposure of the GitLab tool surface. The post-mortem produced an
auth × bind matrixinSECURITY.md, enforced at three layers: the runtime startup gate (src/transport.ts:60+src/index.ts:169-178), the chart'sauth-validation.yamlfail-loud guard, and the CI negative tests added in #56.The matrix lives in
SECURITY.mdand isn't restated here. This thread is for the next-iteration questions where operator and security-researcher perspective adds the most value, plus one discipline note from this round of CI tests that's worth baking in.What's locked in across deployment surfaces
AUTH_MODEdefaultHOSTdefault.env.example(local dev)pat127.0.0.1helm install(chartvalues.yaml)oauth0.0.0.0USE_SSE=truedocker run(Dockerfile ENV)pat127.0.0.1USE_SSE=true(#57)Every default combination either ships safe or refuses to start.
Three open questions
Modernize to Streamable HTTP as the default transport
Chart and Dockerfile both default
USE_SSE=true. Streamable HTTP is the spec-approved successor; SSE is the legacy MCP transport. @ecthelion77 raised this in #57 as a future modernization — flippingchart/values.yamltoUSE_SSE=false, USE_STREAMABLE_HTTP=trueand updating the Dockerfile ENV to match. The piece I can't resolve alone is client compatibility — whether any current Claude Desktop / Cursor / Zed / VS Code build still needs SSE specifically, or whether Streamable HTTP is a clean cutover today. Operator data on this is the missing input.Localhost name-resolution caveat
isLoopbackHostinsrc/transport.ts:28-40accepts the literal stringlocalhost(case-insensitive) but doesn't resolve through DNS or/etc/hosts. Commit0baa230flagged this asymmetry inSECURITY.mdand recommended the IP literal for hardening configs. The open call is whether the safety guard should rejectlocalhostentirely and require the IP literal. Stricter is more rigorous against hosts-file mistakes downstream; looser keeps any operator script that uses the hostname working. Lower-priority than question 1, but worth a decision before the next minor.Substring-anchoring discipline for future chart CI tests
#56 added six negative tests for the chart's fail-loud guards. One assertion substring (
config.AUTH_MODE must be one of) broke between Helm 3 and Helm 4 becausegojsonschemareworded its enum-violation message between majors. The fix was to anchor on Helm's stable wrapper (values don't meet the specifications) instead of the inner library's text.Going forward when adding chart CI assertions: anchor on the tool's own wrapper — Helm's
Error:prefix, templateexecution error atprefix, schemavalues don't meet the specificationsprefix — rather than the wrapped library's wording. The wrapped library may rephrase across versions; the wrapper usually doesn't. CI usesazure/setup-helm@v4which resolves to Helm 4.1.4 as of May 2026; bumps land via Dependabot, so the test surface has to stay version-stable. Worth folding into a one-paragraph note inCONTRIBUTING.mdor the chart README before the next test contribution.Invitation
@ecthelion77 — you've walked the transport, chart, and Docker surfaces. Question 1 is the most concrete; question 2 is a security-rigor judgment call. No timeline. Anyone else with operator-side or security-researcher context welcome.
Beta Was this translation helpful? Give feedback.
All reactions