blue/.blue/docs/spikes/2026-01-26T1700Z-mcp-project-detection.wip.md
Eric Garcia 0fea499957 feat: lifecycle suffixes for all document states + resolve all clippy warnings
Every document filename now mirrors its lifecycle state with a status
suffix (e.g., .draft.md, .wip.md, .accepted.md). No more bare .md for
tracked document types. Also renamed all from_str methods to parse to
avoid FromStr trait confusion, introduced StagingDeploymentParams struct,
and fixed all 19 clippy warnings across the codebase.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 12:19:46 -05:00

94 lines
3 KiB
Markdown

# Spike: MCP Project Detection
| | |
|---|---|
| **Status** | In Progress |
| **Date** | 2026-01-26 |
| **Time Box** | 30 minutes |
---
## Question
Why does the Blue MCP server fail to detect the project directory, and what's the correct solution?
---
## Investigation
### Current Behavior
1. Claude Code starts Blue MCP server via `blue mcp`
2. Server starts with unknown working directory
3. First tool call without `cwd` param fails: "Blue not detected in this directory"
4. Tool call with explicit `cwd` works
### Root Cause Analysis
**Hypothesis 1: Process working directory**
- MCP servers are child processes of Claude Code
- Working directory may be Claude Code's install location, not project
**Hypothesis 2: MCP protocol provides workspace info**
- MCP spec has `roots` capability for filesystem boundaries
- Claude Code may send roots during initialize or via `roots/list`
**Hypothesis 3: Environment variables**
- Claude Code sets `CLAUDECODE=1`, `CLAUDE_CODE_SSE_PORT`, `CLAUDE_CODE_ENTRYPOINT`
- No project path variable observed
### MCP Protocol Research
Per [MCP Specification](https://modelcontextprotocol.io/specification/2025-11-25):
1. **Roots** - Servers can request roots from clients
2. **Initialize params** - May contain client capabilities but not workspace path
3. **No standard workspace field** - Unlike LSP's `rootUri`/`workspaceFolders`
### Attempted Fixes
| Attempt | Result |
|---------|--------|
| Fall back to `current_dir()` | Failed - wrong directory |
| Parse `roots` from initialize | Unknown - needs testing |
| Walk up directory tree | Implemented but untested |
### Key Finding
**The MCP protocol does not provide a standard way for servers to know the user's project directory.** This is a gap compared to LSP.
### Options Discovered
1. **Require `cwd` in every tool call** - Current workaround, verbose
2. **Walk up directory tree** - Find `.blue/` from process cwd
3. **Use MCP roots** - Request roots from client, use first root
4. **Wrapper script** - Shell wrapper that sets cwd before starting server
5. **Config file** - Store project path in `~/.blue/projects.json`
---
## Alignment Dialogue Result
6 experts, 98% convergence on **Option 1: C → B → fail**
| Round | Result |
|-------|--------|
| R1 | B (3), C (2), Combined (1) |
| R2 | Option 1 (3), Option 2 (2), Option 3 (1) |
| R3 | Option 1 unanimous |
**Consensus**: MCP roots first → Walk tree fallback → Fail with guidance
The current code already implements this. The remaining issue is that:
1. Claude Code may not send roots during initialize
2. Process cwd starts outside project tree (e.g., $HOME)
---
## Conclusion
**Root cause**: Claude Code starts MCP servers from a non-project directory and doesn't send MCP roots.
**Solution**: The C → B fallback chain is correct. Need to verify Claude Code sends roots, or ensure walk-tree can find project from wherever the process starts.
**Recommended next step**: Draft RFC to formalize the detection algorithm and add better error messaging.