Skip to content

fix(gsd): auto-prepare workflow MCP across providers - #731

Draft
jeremymcs wants to merge 3 commits into
mainfrom
fix/mcp-auto-init-paths-v2
Draft

fix(gsd): auto-prepare workflow MCP across providers#731
jeremymcs wants to merge 3 commits into
mainfrom
fix/mcp-auto-init-paths-v2

Conversation

@jeremymcs

@jeremymcs jeremymcs commented Jun 14, 2026

Copy link
Copy Markdown
Member

Intent

Ensure the GSD MCP Server auto-initializes on correct paths for all providers. Three fixes: (1) Added missing cwd to PATH lookup fallback. (2) Removed provider gate — always returns true. (3) Added .gsd directory gate to avoid dirtying non-GSD repos. User chose fix per review finding.

What Changed

  • Auto-prepares the GSD workflow MCP config regardless of the active model provider, while gating writes to projects that already have a .gsd directory.
  • Ensures PATH-discovered gsd-mcp-server launches use the resolved workflow project root as cwd.
  • Updates workflow MCP auto-prep tests around provider-independent prep, non-GSD project skipping, and initialized GSD project setup.

Risk Assessment

✅ Low: The branch is narrowly scoped to MCP auto-prep gating/path wiring and the changed behavior is covered by nearby callers without a substantiated blocking regression in the reviewed diff.

Testing

After confirming the target commit was not already merged, I restored minimal local setup, ran focused MCP auto-prep and launch-config regression selectors, and generated reviewer-visible evidence showing an OpenAI-provider GSD project auto-created project-scoped .mcp.json/Claude settings while a non-GSD project created no files; broad hook-level test attempts were blocked by missing broader workspace dist setup rather than behavior assertions, and transient node_modules/dist artifacts were removed before finish.

Evidence: MCP auto-init transcript
# MCP auto-init evidence

Active provider: openai
shouldAutoPrepareWorkflowMcp: true
GSD project root: /var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider
prepareWorkflowMcpForProject result: created
notification: info: GSD MCP Server Prepared at /var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider/.mcp.json

Generated GSD project files:
- /var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider/.mcp.json
- /var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider/.claude/settings.local.json

Workflow MCP server entry:
`` `json
{
  "command": "/opt/homebrew/Cellar/node/26.0.0/bin/node",
  "args": [
    "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/packages/mcp-server/src/cli.ts"
  ],
  "cwd": "/var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider",
  "env": {
    "GSD_CLI_PATH": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/scripts/dev-cli.js",
    "GSD_BIN_PATH": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/scripts/dev-cli.js",
    "GSD_WORKFLOW_EXECUTORS_MODULE": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/src/resources/extensions/gsd/tools/workflow-tool-executors.ts",
    "GSD_WORKFLOW_WRITE_GATE_MODULE": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/src/resources/extensions/gsd/bootstrap/write-gate.ts",
    "NODE_OPTIONS": "--experimental-strip-types --import=file:///Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/src/resources/extensions/gsd/tests/resolve-ts.mjs",
    "GSD_PERSIST_WRITE_GATE_STATE": "1",
    "GSD_WORKFLOW_PROJECT_ROOT": "/var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider"
  }
}
`` `

Enabled Claude MCP servers:
`` `json
[
  "gsd-workflow",
  "gsd-browser"
]
`` `

Non-GSD project root: /var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/plain-repo-openai-provider
prepareWorkflowMcpForProject result: null
non-GSD .mcp.json exists: false
non-GSD .claude/settings.local.json exists: false
Evidence: Generated .mcp.json
{
  "mcpServers": {
    "gsd-workflow": {
      "command": "/opt/homebrew/Cellar/node/26.0.0/bin/node",
      "args": [
        "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/packages/mcp-server/src/cli.ts"
      ],
      "cwd": "/var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider",
      "env": {
        "GSD_CLI_PATH": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/scripts/dev-cli.js",
        "GSD_BIN_PATH": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/scripts/dev-cli.js",
        "GSD_WORKFLOW_EXECUTORS_MODULE": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/src/resources/extensions/gsd/tools/workflow-tool-executors.ts",
        "GSD_WORKFLOW_WRITE_GATE_MODULE": "/Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/src/resources/extensions/gsd/bootstrap/write-gate.ts",
        "NODE_OPTIONS": "--experimental-strip-types --import=file:///Users/jeremymcspadden/.no-mistakes/worktrees/c2f4d848183f/01KV39RZV8E1TXXZH40KY6WV6X/src/resources/extensions/gsd/tests/resolve-ts.mjs",
        "GSD_PERSIST_WRITE_GATE_STATE": "1",
        "GSD_WORKFLOW_PROJECT_ROOT": "/var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider"
      }
    },
    "gsd-browser": {
      "command": "gsd-browser",
      "args": [
        "mcp",
        "--session",
        "gsd-gsd-project-openai-provider-f584368c",
        "--identity-scope",
        "project",
        "--identity-key",
        "gsd-gsd-project-openai-provider-f584368c",
        "--identity-project",
        "gsd-gsd-project-openai-provider-f584368c"
      ],
      "cwd": "/var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-scenario/gsd-project-openai-provider"
    }
  }
}
Evidence: Generated Claude local settings
{
  "enabledMcpjsonServers": [
    "gsd-workflow",
    "gsd-browser"
  ]
}

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • git status --short --branch && git rev-parse HEAD && git branch --show-current && git merge-base --is-ancestor HEAD origin/main; echo $?
  • sed -n '1,220p' CONTRIBUTING.md
  • git diff --stat 4eeef20030eeadeb444e0f0faac7dca10d439fd1..4a4fce7907a63c565e2329b50f2d004386766841 && git diff --name-only 4eeef20030eeadeb444e0f0faac7dca10d439fd1..4a4fce7907a63c565e2329b50f2d004386766841
  • pnpm install --frozen-lockfile (setup attempt; stopped after postinstall hung in unrelated optional setup)
  • PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 GSD_SKIP_RTK_INSTALL=1 pnpm install --frozen-lockfile (setup retry; stopped after postinstall stayed in unrelated repair path)
  • pnpm --filter @opengsd/contracts run build
  • node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts (broad attempt exposed missing workspace dist for hook-only cases)
  • node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test --test-name-pattern 'shouldAutoPrepareWorkflowMcp enables prep for any provider|prepareWorkflowMcpForProject skips non-GSD projects|prepareWorkflowMcpForProject uses the selected unit model' src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts
  • node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test --test-name-pattern 'detectWorkflowMcpLaunchConfig prefers explicit env override|detectWorkflowMcpLaunchConfig resolves the bundled server relative to the package without env hints' src/resources/extensions/gsd/tests/workflow-mcp.test.ts
  • node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --input-type=module evidence script creating an OpenAI-provider GSD project and a non-GSD project under the evidence directory
  • sed -n '1,220p' /var/folders/ts/yrrr1_453qz_str8lsryw04m0000gn/T/no-mistakes-evidence/01KV39RZV8E1TXXZH40KY6WV6X/mcp-auto-init-transcript.md
  • rm -rf node_modules packages/contracts/dist packages/gsd-agent-core/dist && git status --short --ignored=matching node_modules packages/contracts/dist packages/gsd-agent-core/dist | head -80 && git status --short
⏭️ **Document** - skipped

Step was skipped.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.


Note

Low Risk
Narrow MCP config gating and launch cwd wiring with updated unit tests; no auth or core workflow execution changes.

Overview
Workflow MCP auto-prep no longer depends on the active model provider or Claude-specific transport checks: shouldAutoPrepareWorkflowMcp always allows prep so project .mcp.json can be written for direct claude CLI use even when the session runs on another provider.

Writes are gated to repos that already have a .gsd directory, so auto-prep does not add .mcp.json / .claude/settings.local.json to unrelated projects. Model-override merging in prepareWorkflowMcpForProject is removed in favor of that simpler gate.

Launch config sets cwd to the resolved workflow project root when gsd-mcp-server is discovered on PATH, matching other discovery paths.

Tests cover provider-independent prep, skipping non-GSD roots, and initialized GSD project setup.

Reviewed by Cursor Bugbot for commit 4a4fce7. Bugbot is set up for automated code reviews on this repo. Configure here.


View with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is enabled.

@github-actions

Copy link
Copy Markdown
Contributor

🟢 PR Risk Report — LOW

Files changed 3
Systems affected 0
Overall risk 🟢 LOW

@jeremymcs

Copy link
Copy Markdown
Member Author

Started an automated PR update.

Accepted review feedback is being applied.
Progress and final results will be posted in the related review thread(s).

jeremymcs added a commit that referenced this pull request Jul 7, 2026
jeremymcs added a commit that referenced this pull request Jul 7, 2026
@jeremymcs
jeremymcs force-pushed the fix/mcp-auto-init-paths-v2 branch from 32de603 to 75aac57 Compare July 7, 2026 21:38
jeremymcs added 3 commits July 8, 2026 22:06
- Add missing cwd to PATH lookup fallback in detectWorkflowMcpLaunchConfig
- Remove provider=claude-code gate from shouldAutoPrepareWorkflowMcp
- Gate auto-prep on .gsd directory existence to avoid dirtying non-GSD repos
- Simplify prepareWorkflowMcpForProject by removing dead model-override plumbing
@jeremymcs
jeremymcs force-pushed the fix/mcp-auto-init-paths-v2 branch from 75aac57 to 6d9924d Compare July 9, 2026 03:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant