Skip to content
Merged
Show file tree
Hide file tree
Changes from 109 commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
cbd02bb
Combine workspace and project clean tool
cameroncooke Aug 8, 2025
d6cb2b7
chore: move list_schems_proj test to unified location
cameroncooke Aug 10, 2025
a2a17c1
test: adapt list_schemes tests for unified project/workspace support
cameroncooke Aug 10, 2025
2a8dd97
chore: clean up old workspace test for list_schemes
cameroncooke Aug 10, 2025
490a667
docs: remove unified references from test descriptions
cameroncooke Aug 10, 2025
4eb0f9f
feat: create unified show_build_settings tool with XOR validation
cameroncooke Aug 10, 2025
329def3
chore: move show_build_set_proj test to unified location
cameroncooke Aug 10, 2025
419ae31
test: adapt show_build_settings tests for project/workspace support
cameroncooke Aug 10, 2025
2ae03eb
feat: add show_build_settings re-exports to workflow groups
cameroncooke Aug 10, 2025
8e83fcc
chore: remove old project/workspace show_build_set files
cameroncooke Aug 10, 2025
91d9e31
fix: resolve TypeScript typing issue in show_build_settings content a…
cameroncooke Aug 10, 2025
08178cd
feat: create unified build_device tool with XOR validation
cameroncooke Aug 10, 2025
b9664e1
chore: move build_dev test to unified location
cameroncooke Aug 10, 2025
4776c3c
test: adapt build_device tests for project/workspace support
cameroncooke Aug 10, 2025
8642431
feat: add build_device re-exports to device workflows
cameroncooke Aug 10, 2025
32de599
chore: remove old build_dev project/workspace files
cameroncooke Aug 10, 2025
bc6aaa6
feat: create unified build_macos tool with XOR validation
cameroncooke Aug 10, 2025
18f2408
chore: move build_mac test to unified location
cameroncooke Aug 10, 2025
3fce9c1
test: adapt build_macos tests for project/workspace support
cameroncooke Aug 10, 2025
6cd07e2
feat: add build_macos re-exports to macos workflows
cameroncooke Aug 10, 2025
1583258
chore: remove old build_mac project/workspace files
cameroncooke Aug 10, 2025
9fb89de
fix: update re-exports test to use unified build_macos tool
cameroncooke Aug 10, 2025
45c4e91
feat: create unified build_simulator_id tool with XOR validation
cameroncooke Aug 10, 2025
fcf5f36
chore: move build_sim_id test to unified location
cameroncooke Aug 10, 2025
701cb6e
test: adapt build_simulator_id tests for project/workspace support
cameroncooke Aug 10, 2025
0e2f4d3
feat: add build_simulator_id re-exports to simulator workflows
cameroncooke Aug 10, 2025
08bac7c
chore: remove old build_sim_id project/workspace files
cameroncooke Aug 10, 2025
05f910a
test: fix build_simulator_id test expectations for unified tool
cameroncooke Aug 10, 2025
b68280b
feat: create unified build_simulator_name tool with XOR validation
cameroncooke Aug 10, 2025
84441ff
chore: move build_sim_name test to unified location
cameroncooke Aug 10, 2025
94f595a
test: adapt build_simulator_name tests for project/workspace support
cameroncooke Aug 10, 2025
8c6e13b
feat: add build_simulator_name re-exports to simulator workflows
cameroncooke Aug 10, 2025
f263620
chore: remove old build_sim_name project/workspace files
cameroncooke Aug 10, 2025
797123c
fix: correct test expectations for build_simulator_name
cameroncooke Aug 10, 2025
febea01
feat: create unified test_device tool with XOR validation
cameroncooke Aug 10, 2025
dad8428
chore: move test_device test to unified location
cameroncooke Aug 10, 2025
536ff17
test: adapt test_device tests for project/workspace support
cameroncooke Aug 10, 2025
e462a0c
feat: add test_device re-exports to device workflows
cameroncooke Aug 10, 2025
89ae624
chore: remove old test_device project/workspace files
cameroncooke Aug 10, 2025
04dce75
fix: update XOR validation test to avoid real executor calls
cameroncooke Aug 10, 2025
dac4fd6
feat: create unified get_device_app_path tool with XOR validation
cameroncooke Aug 10, 2025
bbf8489
chore: move get_device_app_path test to unified location
cameroncooke Aug 10, 2025
d1ef10a
test: adapt get_device_app_path tests for project/workspace support
cameroncooke Aug 10, 2025
dabc6c5
feat: add get_device_app_path re-exports to device workflows
cameroncooke Aug 10, 2025
069f50b
chore: remove old get_device_app_path project/workspace files
cameroncooke Aug 10, 2025
a9b0dc9
feat: create unified build_run_macos tool with XOR validation
cameroncooke Aug 10, 2025
11e7da2
chore: move build_run_mac test to unified location
cameroncooke Aug 10, 2025
601b535
test: adapt build_run_macos tests for project/workspace support
cameroncooke Aug 10, 2025
de0a066
feat: add build_run_macos re-exports to macos workflows
cameroncooke Aug 10, 2025
5690262
chore: remove old build_run_mac project/workspace files
cameroncooke Aug 10, 2025
fe6b19e
feat: create unified build_run_simulator_id tool with XOR validation
cameroncooke Aug 10, 2025
37918d1
chore: move build_run_sim_id test to unified location
cameroncooke Aug 10, 2025
0f71511
test: adapt build_run_simulator_id tests for project/workspace support
cameroncooke Aug 10, 2025
b59f91f
feat: add build_run_simulator_id re-exports to simulator workflows
cameroncooke Aug 10, 2025
637b4a9
chore: remove old build_run_sim_id project/workspace files
cameroncooke Aug 10, 2025
07dcfbd
feat: create unified build_run_simulator_name tool with XOR validation
cameroncooke Aug 10, 2025
58a4258
chore: move build_run_sim_name test to unified location
cameroncooke Aug 10, 2025
f56fe37
test: adapt build_run_simulator_name tests for project/workspace support
cameroncooke Aug 10, 2025
6ee7b33
feat: add build_run_simulator_name re-exports to simulator workflows
cameroncooke Aug 10, 2025
85307a8
chore: remove old build_run_sim_name project/workspace files
cameroncooke Aug 10, 2025
692762a
feat: create unified get_macos_app_path tool with XOR validation
cameroncooke Aug 10, 2025
76ba9b3
chore: move get_mac_app_path test to unified location
cameroncooke Aug 10, 2025
6b55f82
test: adapt get_macos_app_path tests for project/workspace support
cameroncooke Aug 10, 2025
ad73385
feat: add get_macos_app_path re-exports to macos workflows
cameroncooke Aug 10, 2025
5af3678
chore: remove old get_mac_app_path project/workspace files
cameroncooke Aug 10, 2025
dbc1fea
feat: create unified get_simulator_app_path_id tool with XOR validation
cameroncooke Aug 10, 2025
9bea854
chore: move get_sim_app_path_id test to unified location
cameroncooke Aug 10, 2025
0b3742f
test: adapt get_simulator_app_path_id tests for project/workspace sup…
cameroncooke Aug 10, 2025
1fc1c48
feat: add get_simulator_app_path_id re-exports to simulator workflows
cameroncooke Aug 10, 2025
ac1563f
chore: remove old get_sim_app_path_id project/workspace files
cameroncooke Aug 10, 2025
bc9fa18
feat: create unified get_simulator_app_path_name tool with XOR valida…
cameroncooke Aug 10, 2025
a4d3025
chore: move get_sim_app_path_name test to unified location
cameroncooke Aug 10, 2025
9db8a3c
test: adapt get_simulator_app_path_name tests for project/workspace s…
cameroncooke Aug 10, 2025
d5bb22f
feat: add get_simulator_app_path_name re-exports to simulator workflows
cameroncooke Aug 10, 2025
7b8c4a4
chore: remove old get_sim_app_path_name project/workspace files
cameroncooke Aug 10, 2025
d77c4ac
feat: create unified test_macos tool with XOR validation
cameroncooke Aug 10, 2025
88375a4
chore: move test_macos test to unified location
cameroncooke Aug 10, 2025
8cc8c6f
test: adapt test_macos tests for project/workspace support
cameroncooke Aug 10, 2025
e7ff083
feat: add test_macos re-exports to macos workflows
cameroncooke Aug 10, 2025
8ea23aa
chore: remove old test_macos project/workspace files
cameroncooke Aug 10, 2025
e91d82f
feat: create unified test_simulator_id tool with XOR validation
cameroncooke Aug 10, 2025
1863d13
chore: move test_sim_id test to unified location
cameroncooke Aug 10, 2025
16f82cc
test: adapt test_simulator_id tests for project/workspace support
cameroncooke Aug 10, 2025
b0abb73
feat: add test_simulator_id re-exports to simulator workflows
cameroncooke Aug 10, 2025
9eba30e
chore: remove old test_sim_id project/workspace files
cameroncooke Aug 10, 2025
e40ea2b
consolidate: create unified test_simulator_name tool and move test file
cameroncooke Aug 10, 2025
7f61095
consolidate: complete test_simulator_name unification
cameroncooke Aug 10, 2025
ed59b9b
fix: update test_simulator_name handler to avoid TypeScript issues
cameroncooke Aug 10, 2025
fe5235c
feat: complete Phase 1 and Phase 2 tool consolidation
cameroncooke Aug 11, 2025
dc6f988
chore: move build_simulator_name to unified build_simulator
cameroncooke Aug 11, 2025
d47a455
feat: consolidate build_simulator_id/name into unified build_simulato…
cameroncooke Aug 11, 2025
6a294ce
chore: move build_run_simulator_name to unified build_run_simulator
cameroncooke Aug 12, 2025
d31e83d
feat: consolidate build_run_simulator_id/name into unified build_run_…
cameroncooke Aug 12, 2025
74929d5
chore: rename test_simulator_name.ts to test_simulator.ts for consoli…
cameroncooke Aug 12, 2025
0b21460
feat: consolidate test_simulator_id/name into unified test_simulator
cameroncooke Aug 12, 2025
af2473d
chore: rename get_simulator_app_path_name.ts to get_simulator_app_pat…
cameroncooke Aug 12, 2025
5c784fa
feat: consolidate get_simulator_app_path_id/name into unified get_sim…
cameroncooke Aug 12, 2025
bcf430e
fix: correct import path for createMockExecutor in simulator-utils test
cameroncooke Aug 12, 2025
23c7ee9
test: fix test failures and remove obsolete test files
cameroncooke Aug 12, 2025
0d6cb4a
docs: improve parameter descriptions to clearly indicate XOR requirem…
cameroncooke Aug 12, 2025
f257016
feat: add visibility hints to boot and launch simulator tools
cameroncooke Aug 12, 2025
20b3d3a
docs: update TOOLS.md to reflect unified project/workspace tools
cameroncooke Aug 13, 2025
172eceb
feat: Add cli tool for generating TOOLS.md using static analysis
cameroncooke Aug 13, 2025
8945b06
Remove unused docs
cameroncooke Aug 13, 2025
da42459
Fix failing tests
cameroncooke Aug 13, 2025
d5c9e4e
Refactor: Consolidate schema helpers and update tool references
cursoragent Aug 13, 2025
cfb0d02
Add type assertion to createTypedTool handlers for improved type safety
cursoragent Aug 14, 2025
6f95e41
Refactor tool interfaces, improve error handling, and update tool ref…
cursoragent Aug 14, 2025
e609e68
Update app path function names in test and build utility files
cursoragent Aug 14, 2025
21c6628
Improve Xcode build path parsing and add workspace build test
cursoragent Aug 14, 2025
dcbf963
Fix regex for extracting Xcode build settings with whitespace
cursoragent Aug 14, 2025
25d637b
feat: optimize tool hints and unify naming conventions
cameroncooke Aug 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions docs/MANUAL_TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,8 @@ fi
- `discover_projs` - Project/workspace paths

2. **Discovery Tools** (provide metadata for build tools):
- `list_schems_proj` / `list_schems_ws` - Scheme names
- `show_build_set_proj` / `show_build_set_ws` - Build settings
- `list_schemes` - Scheme names
- `show_build_settings` - Build settings

3. **Build Tools** (create artifacts for install tools):
- `build_*` tools - Create app bundles
Expand Down Expand Up @@ -518,7 +518,7 @@ done < /tmp/project_paths.txt
while IFS= read -r workspace_path; do
if [ -n "$workspace_path" ]; then
echo "Getting schemes for: $workspace_path"
npx reloaderoo@latest inspect call-tool "list_schems_ws" --params "{\"workspacePath\": \"$workspace_path\"}" -- node build/index.js 2>/dev/null > /tmp/ws_schemes_$$.json
npx reloaderoo@latest inspect call-tool "list_schemes" --params "{\"workspacePath\": \"$workspace_path\"}" -- node build/index.js 2>/dev/null > /tmp/ws_schemes_$$.json
SCHEMES=$(jq -r '.content[1].text' /tmp/ws_schemes_$$.json 2>/dev/null || echo "NoScheme")
echo "$workspace_path|$SCHEMES" >> /tmp/workspace_schemes.txt
echo "Schemes captured for $workspace_path: $SCHEMES"
Expand Down Expand Up @@ -557,7 +557,7 @@ npx reloaderoo@latest inspect call-tool "list_schems_proj" --params '{"projectPa
# [Record scheme names from response for build tools]

# STEP 3: Test workspace tools (use discovered workspace paths)
npx reloaderoo@latest inspect call-tool "list_schems_ws" --params '{"workspacePath": "/actual/path/from/discover_projs.xcworkspace"}' -- node build/index.js
npx reloaderoo@latest inspect call-tool "list_schemes" --params '{"workspacePath": "/actual/path/from/discover_projs.xcworkspace"}' -- node build/index.js
# [Record scheme names from response for build tools]

# STEP 4: Test simulator tools (use captured simulator UUIDs from step 1)
Expand Down
321 changes: 321 additions & 0 deletions docs/PHASE1-TASKS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,321 @@
## Phase 1: Tool Consolidation Plan

### Overview
Consolidate all project/workspace tool pairs (e.g., `tool_proj` and `tool_ws`) into single canonical tools with XOR validation for `projectPath` vs `workspacePath`. Each unified tool will be re-exported to maintain compatibility with existing workflow groups.

### Consolidation Strategy

#### Tool Implementation Pattern
1. **Create unified tool** with XOR validation:
- Accept both `projectPath` and `workspacePath` as optional parameters
- Add validation to ensure exactly one is provided (mutually exclusive)
- Use helper function to convert empty strings to undefined
- Maintain all existing business logic unchanged

2. **Placement**: Put canonical tool in most logical workflow:
- `utilities/` for general tools (clean)
- `project-discovery/` for discovery tools (list_schemes, show_build_set)
- Tool-specific workflow for specialized tools

3. **Re-exports**: Create `toolname.ts` re-export in each workflow that needs it:
```typescript
// Re-export unified tool for [workflow-name] workflow
export { default } from '../[canonical-location]/[toolname].js';
```

4. **Cleanup**: Delete old `tool_proj.ts` and `tool_ws.ts` files from all locations

#### Test Preservation Strategy (CRITICAL)
**DO NOT REWRITE TESTS** - Preserve existing test coverage by migrating and adapting:

1. **Choose base test file**: Select the more comprehensive test between `_proj` and `_ws` versions

2. **Move test file FIRST (before any edits)**:
```bash
# Use git mv to preserve history
git mv src/mcp/tools/[location]/__tests__/tool_proj.test.ts \
src/mcp/tools/[canonical-location]/__tests__/tool.test.ts

# Stage the move immediately
git add -A

# IMPORTANT: Commit the move BEFORE making any edits
git commit -m "chore: move tool_proj test to unified location"
```

3. **THEN make surgical edits** (as a separate commit):
- Update imports to reference unified tool
- Add XOR validation tests (neither/both parameter cases)
- Adapt existing tests to handle both project and workspace paths
- Keep all existing test logic and assertions intact

4. **Commit the adaptations separately**:
```bash
git add src/mcp/tools/[canonical-location]/__tests__/tool.test.ts
git commit -m "test: adapt tool tests for unified project/workspace support"
```

**Why this matters**: Git tracks file moves better when the move is committed before edits. If you edit first or create a new file, Git sees it as a delete + add, losing history.

### Tools to Consolidate

#### ✅ Completed

**Consolidation Tools:**
1. **clean** (utilities/) - DONE
- [x] Unified tool created
- [x] Re-exported to 6 workflows
- [x] Old files deleted
- [x] Tests created

2. **list_schemes** (project-discovery/) - DONE
- [x] Unified tool created
- [x] Re-exported to 6 workflows
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

3. **show_build_settings** (project-discovery/) - DONE
- [x] Unified tool created
- [x] Re-exported to 6 workflows
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

**Build Tools:**
4. **build_device** (device-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to device-project and device-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

5. **build_macos** (macos-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to macos-project and macos-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

6. **build_simulator_id** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

7. **build_simulator_name** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

**Build & Run Tools:**
8. **build_run_macos** (macos-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to macos-project and macos-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

9. **build_run_simulator_id** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

10. **build_run_simulator_name** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

**App Path Tools:**
11. **get_device_app_path** (device-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to device-project and device-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

12. **get_macos_app_path** (macos-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to macos-project and macos-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

13. **get_simulator_app_path_id** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

14. **get_simulator_app_path_name** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

**Test Tools:**
15. **test_device** (device-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to device-project and device-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

16. **test_macos** (macos-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to macos-project and macos-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

17. **test_simulator_id** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

18. **test_simulator_name** (simulator-shared/) - DONE
- [x] Unified tool created
- [x] Re-exported to simulator-project and simulator-workspace
- [x] Old files deleted
- [x] Tests preserved using git mv + adaptations

#### 🔄 In Progress
None currently

#### 📋 Remaining Tools
None - All tools have been successfully consolidated!

### Workflow for Each Tool

1. **Analyze existing implementations**:
```bash
# Compare project and workspace versions
diff src/mcp/tools/*/tool_proj.ts src/mcp/tools/*/tool_ws.ts

# Check which test is more comprehensive
wc -l src/mcp/tools/*/__tests__/tool_proj.test.ts
wc -l src/mcp/tools/*/__tests__/tool_ws.test.ts
```

2. **Create unified tool**:
- Copy more complete version as base
- Add XOR validation for projectPath/workspacePath
- Adjust logic to handle both cases
- Commit this change first

3. **Preserve tests (CRITICAL ORDER)**:
```bash
# Step 3a: Move test file WITHOUT any edits
git mv src/mcp/tools/[location]/__tests__/tool_proj.test.ts \
src/mcp/tools/[canonical]/__tests__/tool.test.ts

# Step 3b: Stage and commit the move IMMEDIATELY
git add -A
git commit -m "chore: move tool_proj test to unified location"

# Step 3c: NOW make edits to the moved file
# - Update imports
# - Add XOR validation tests
# - Adapt for both project/workspace

# Step 3d: Commit the edits as a separate commit
git add src/mcp/tools/[canonical]/__tests__/tool.test.ts
git commit -m "test: adapt tool tests for unified project/workspace"
```

4. **Create re-exports**:
```bash
# For each workflow that had the tool
for workflow in device-project device-workspace macos-project macos-workspace simulator-project simulator-workspace; do
echo "// Re-export unified tool for $workflow workflow" > \
src/mcp/tools/$workflow/tool.ts
echo "export { default } from '../[canonical]/tool.js';" >> \
src/mcp/tools/$workflow/tool.ts
done
```

5. **Clean up old files**:
```bash
# Delete old tool files
git rm src/mcp/tools/*/tool_proj.ts
git rm src/mcp/tools/*/tool_ws.ts

# Delete the test file that wasn't moved
git rm src/mcp/tools/*/__tests__/tool_ws.test.ts

# Commit the cleanup
git commit -m "chore: remove old project/workspace specific tool files"
```

6. **Validate**:
```bash
npm run build
npm run test -- src/mcp/tools/[canonical]/__tests__/tool.test.ts
npm run lint
npm run format

# If all passes, commit any formatting changes
git add -A
git commit -m "chore: format unified tool code"
```

### Common Patterns

#### XOR Validation Helper
```typescript
// Convert empty strings to undefined
function nullifyEmptyStrings(value: unknown): unknown {
if (value && typeof value === 'object' && !Array.isArray(value)) {
const copy: Record<string, unknown> = { ...(value as Record<string, unknown>) };
for (const key of Object.keys(copy)) {
const v = copy[key];
if (typeof v === 'string' && v.trim() === '') copy[key] = undefined;
}
return copy;
}
return value;
}
```

#### Schema Pattern
```typescript
const baseSchema = z.preprocess(nullifyEmptyStrings, baseSchemaObject);

const toolSchema = baseSchema
.refine((val) => val.projectPath !== undefined || val.workspacePath !== undefined, {
message: 'Either projectPath or workspacePath is required.',
})
.refine((val) => !(val.projectPath !== undefined && val.workspacePath !== undefined), {
message: 'projectPath and workspacePath are mutually exclusive. Provide only one.',
});
```

#### Test Adaptation Pattern
```typescript
// Add to existing test file after moving with mv:

describe('XOR Validation', () => {
it('should error when neither projectPath nor workspacePath provided', async () => {
const result = await plugin.handler({});
expect(result.isError).toBe(true);
expect(result.content[0].text).toContain('Either projectPath or workspacePath is required');
});

it('should error when both provided', async () => {
const result = await plugin.handler({
projectPath: '/path/project.xcodeproj',
workspacePath: '/path/workspace.xcworkspace',
});
expect(result.isError).toBe(true);
expect(result.content[0].text).toContain('mutually exclusive');
});
});
```

### Success Criteria
- [x] All project/workspace tool pairs consolidated
- [x] Tests preserved (not rewritten) with high coverage
- [x] No regressions in functionality
- [x] All workflow groups maintain same tool availability
- [x] Build, lint, and tests pass
- [x] Tool count reduced by ~50% (from pairs to singles)

### Notes
- Phase 2 will consolidate workflow groups themselves
- Tool names may be refined during consolidation for clarity
- Empty string handling is critical for MCP clients that send "" instead of undefined
Loading
Loading