# MCP Server Refactoring Checklist

**Goal**: Extract all tools, resources, and prompts from `server.py` into dedicated modules while maintaining a single shared `mcp` instance from `protocol.py`.

**Current State**: `server.py` now imports shared tools/resources/prompts modules; legacy `@mcp.tool`, `@mcp.resource`, and `@mcp.prompt` handlers have been removed from server.py; duplicate registration warnings are resolved.

**Target Architecture**:
```
mcp/
├── protocol.py          # Single shared FastMCP instance (mcp)
├── server.py            # Server entrypoint, helpers, models (~5000 lines target)
├── tools/               # Tool registrations only
│   ├── __init__.py      # register_tools() function
│   ├── analyze.py       # analyze_code
│   ├── security.py      # security_scan, unified_sink_detect, type_evaporation_scan, scan_dependencies
│   ├── extraction.py    # extract_code, rename_symbol, update_symbol
│   ├── symbolic.py      # symbolic_execute, generate_unit_tests, simulate_refactor
│   ├── context.py       # crawl_project, get_file_context, get_symbol_references
│   ├── graph.py         # get_call_graph, get_graph_neighborhood, get_project_map, get_cross_file_dependencies, cross_file_security_scan
│   └── policy.py        # validate_paths,, code_policy_check
|   └── validate_paths.py  # validate_paths tool
     verify_policy_integrity.py  
├── resources.py         # All @mcp.resource handlers
├── prompts.py           # All @mcp.prompt handlers
├── models/              # Pydantic response models
│   ├── __init__.py
│   └── core.py
└── helpers/             # Helper functions extracted from server.py
    ├── __init__.py
    ├── analyze_helpers.py
    ├── security_helpers.py
    └── ...
```

---

## Phase 0: Preparation

### 0.1 Consolidate MCP Instance
- [x] **COPY**: Verify `protocol.py` has the shared `mcp = FastMCP(...)` instance
- [x] **UPDATE**: In `server.py`, replace `mcp = FastMCP(...)` with `from code_scalpel.mcp.protocol import mcp`
- [x] **DELETE**: Remove the duplicate `mcp = FastMCP(...)` definition from server.py (lines ~2616-2665)
- [x] **TEST**: Run `python -c "from code_scalpel.mcp.server import mcp; print(mcp)"` to verify import works

### 0.2 Update Tool Registration
- [x] **UPDATE**: Ensure `run_server()` calls `register_tools()` before `mcp.run()`
- [x] **UPDATE**: Ensure `run_server()` imports resources and prompts modules
- [x] **TEST**: Start server with `python -m code_scalpel.mcp.server` and verify no duplicate tool warnings

**Phase 0 Status**: ✅ COMPLETE (2026-01-15)
- Server now uses single shared `mcp` instance from `protocol.py`
- `register_tools()`, `resources.py`, and `prompts.py` are imported in `run_server()`
- Duplicate registration warnings resolved after removing legacy handlers from server.py

---

## Phase 1: Analysis Tools

### Tool 1: `analyze_code` (lines 4229-4273)
**Target Module**: `tools/analyze.py`
**Helper Function**: `_analyze_code_sync` (lines 3799-4226)

- [x] **COPY**: Copy `_analyze_code_sync` and all its dependencies to `helpers/analyze_helpers.py`
- [x] **UPDATE**: Update `tools/analyze.py` to import from `helpers/analyze_helpers.py` instead of `server`
- [x] **DELETE**: Remove `@mcp.tool() async def analyze_code(...)` from server.py (lines 4229-4273)
- [x] **TEST**: Call `analyze_code` tool and verify it works

**Dependencies to extract**:
- `_analyze_java_code` (lines 3257-3293)
- `_analyze_javascript_code` (lines 3297-3472)
- `_walk_ts_tree` (lines 3476-3479)
- `_detect_frameworks_from_code` (lines 3491-3538)
- `_detect_dead_code_hints_python` (lines 3542-3618)
- `_summarize_decorators_python` (lines 3622-3646)
- `_summarize_types_python` (lines 3650-3718)
- `_compute_api_surface_from_symbols` (lines 3724-3736)
- `_priority_sort` (lines 3740-3760)
- `_update_and_get_complexity_trends` (lines 3770-3793)
- Complexity helpers (lines 2934-3086)
- Tier-gated metrics helpers (lines 3091-3253)

---

## Phase 2: Security Tools (Complete)

### Tool 2: `security_scan` (lines 8135-8199)
**Target Module**: `tools/security.py`
**Helper Function**: `_security_scan_sync` (lines 4283-4926)

- [x] **COPY**: Copy `_security_scan_sync` to `helpers/security_helpers.py`
- [x] **UPDATE**: Update `tools/security.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def security_scan(...)` from server.py (lines 8135-8199)
- [x] **TEST**: Call `security_scan` tool and verify it works

### Tool 3: `unified_sink_detect` (lines 5676-5730)
**Target Module**: `tools/security.py`
**Helper Function**: `_unified_sink_detect_sync` (lines 5343-5673)

- [x] **COPY**: Copy `_unified_sink_detect_sync` and helpers to `helpers/security_helpers.py`
- [x] **DELETE**: Remove `@mcp.tool() async def unified_sink_detect(...)` from server.py (lines 5676-5730)
- [x] **TEST**: Call `unified_sink_detect` tool and verify it works


**Dependencies**:
- `_sink_coverage_summary` (lines 4965-4978)
- `_get_cwe_for_sink` (lines 4987-5012)
- `_analyze_sink_context` (lines 5020-5098)
- `_detect_framework_sinks` (lines 5102-5157)
- `_build_sink_compliance_mapping` (lines 5161-5228)
- `_build_historical_comparison` (lines 5232-5267)
- `_generate_sink_remediation` (lines 5274-5333)

### Tool 4: `type_evaporation_scan` (lines 6927-7017)
**Target Module**: `tools/security.py`
**Helper Function**: `_type_evaporation_scan_sync` (lines 5878-6129)

- [x] **COPY**: Copy `_type_evaporation_scan_sync` and Pro/Enterprise helpers to `helpers/security_helpers.py`
- [x] **DELETE**: Remove `@mcp.tool() async def type_evaporation_scan(...)` from server.py (lines 6927-7017)
- [x] **TEST**: Call `type_evaporation_scan` tool and verify it works


**Dependencies** (Pro tier):
- `_detect_implicit_any` (lines 6138-6174)
- `_detect_network_boundaries` (lines 6178-6208)
- `_detect_library_boundaries` (lines 6212-6241)
- `_detect_json_parse_locations` (lines 6245-6265)
- `_detect_boundary_violations` (lines 6271-6298)

**Dependencies** (Enterprise tier):
- `_generate_zod_schemas` (lines 6310-6341)
- `_ts_type_to_zod` (lines 6345-6385)
- `_extract_interface_fields` (lines 6389-6400)
- `_ts_primitive_to_zod` (lines 6404-6426)
- `_generate_validation_code` (lines 6430-6467)
- `_generate_pydantic_models` (lines 6474-6495)
- `_ts_type_to_pydantic` (lines 6499-6526)
- `_ts_to_python_type` (lines 6530-6545)
- `_validate_api_contract` (lines 6553-6599)
- `_generate_remediation_suggestions` (lines 6612-6700)
- `_check_custom_type_rules` (lines 6708-6788)
- `_generate_type_compliance_report` (lines 6797-6924)

### Tool 5: `scan_dependencies` (lines 8060-8132)
**Target Module**: `tools/security.py`
**Helper Function**: `_scan_dependencies_sync` (lines 7626-7906)

- [x] **COPY**: Copy `_scan_dependencies_sync` and related helpers to `helpers/security_helpers.py`
- [x] **UPDATE**: Update `tools/security.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def scan_dependencies(...)` from server.py (lines 8060-8132)
- [x] **TEST**: Call `scan_dependencies` tool and verify it works

**Dependencies**:
- `DependencyVulnerability` model (lines 7027-7043)
- `DependencyInfo` model (lines 7047-7078)
- `DependencyScanResult` model (lines 7082-7118)
- `VulnerabilityFindingModel` model (lines 7122-7140)
- `DependencyScanResultModel` model (lines 7144-7165)
- `_analyze_reachability` (lines 7169-7223)
- `_fetch_package_license` (lines 7227-7272)
- `_check_license_compliance` (lines 7276-7322)
- `_check_typosquatting` (lines 7326-7424)
- `_calculate_supply_chain_risk` (lines 7436-7498)
- `_generate_compliance_report` (lines 7507-7573)
- `_generate_compliance_recommendations` (lines 7581-7614)
- `_extract_severity` (lines 7910-7961)
- `_extract_fixed_version` (lines 7965-7972)

---

## Phase 3: Symbolic & Testing Tools (Complete)

### Tool 6: `symbolic_execute` (lines 8779-8831)
**Target Module**: `tools/symbolic.py`
**Helper Function**: `_symbolic_execute_sync` (lines 8569-8753)

- [x] **COPY**: Copy `_symbolic_execute_sync` to `helpers/symbolic_helpers.py`
- [x] **UPDATE**: Update `tools/symbolic.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def symbolic_execute(...)` from server.py (lines 8779-8831)
- [x] **TEST**: Call `symbolic_execute` tool and verify it works

**Dependencies**:
- `_basic_symbolic_analysis` (lines 8332-8381)
- `_build_path_prioritization` (lines 8388-8429)
- `_build_concolic_results` (lines 8433-8459)
- `_build_state_space_analysis` (lines 8465-8506)
- `_build_memory_model` (lines 8510-8558)
- `_add_tier_features_to_result` (lines 8759-8776)
- `_detect_requested_constraint_types` (lines 8274-8328)

### Tool 7: `generate_unit_tests` (lines 9010-9199)
**Target Module**: `tools/symbolic.py`
**Helper Function**: `_generate_tests_sync` (lines 8848-9007)

- [x] **COPY**: Copy `_generate_tests_sync` to `helpers/symbolic_helpers.py`
- [x] **UPDATE**: Update `tools/symbolic.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def generate_unit_tests(...)` from server.py (lines 9010-9199)
- [x] **TEST**: Call `generate_unit_tests` tool and verify it works

### Tool 8: `simulate_refactor` (lines 9370-9445)
**Target Module**: `tools/symbolic.py`
**Helper Function**: `_simulate_refactor_sync` (lines 9217-9367)

- [x] **COPY**: Copy `_simulate_refactor_sync` to `helpers/symbolic_helpers.py`
- [x] **UPDATE**: Update `tools/symbolic.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def simulate_refactor(...)` from server.py (lines 9370-9445)
- [x] **TEST**: Call `simulate_refactor` tool and verify it works

---

## Phase 4: Extraction & Modification Tools (Complete)

### Tool 9: `extract_code` (lines 10615-11076)
**Target Module**: `tools/extraction.py`
**Helper Functions**: Multiple (lines 10337-10612)

- [x] **COPY**: Copy extraction helpers to `helpers/extraction_helpers.py`
- [x] **UPDATE**: Update `tools/extraction.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def extract_code(...)` from server.py (lines 10615-11076)
- [x] **TEST**: Call `extract_code` tool and verify it works

**Dependencies**:
- `_extraction_error` (lines 10345-10360)
- `_extract_polyglot` (lines 10371-10458)
- `_create_extractor` (lines 10464-10497)
- `_extract_method` (lines 10501-10507)
- `_perform_extraction` (lines 10519-10575)
- `_process_cross_file_context` (lines 10579-10599)
- `_build_full_code` (lines 10605-10612)
- Advanced extraction functions (lines 12311-12858)

### Tool 10: `rename_symbol` (lines 11079-11209)
**Target Module**: `tools/extraction.py`

- [x] **COPY**: Copy `rename_symbol` logic to `helpers/extraction_helpers.py`
- [x] **UPDATE**: Update `tools/extraction.py` to use helpers
- [x] **DELETE**: Remove `@mcp.tool() async def rename_symbol(...)` from server.py (lines 11079-11209)
- [x] **TEST**: Call `rename_symbol` tool and verify it works

### Tool 11: `update_symbol` (lines 11693-12308)
**Target Module**: `tools/extraction.py`
**Helper Functions**: Multiple async helpers

- [x] **COPY**: Copy `update_symbol` helpers to `helpers/extraction_helpers.py`
- [x] **UPDATE**: Update `tools/extraction.py` to use helpers
- [x] **DELETE**: Remove `@mcp.tool() async def update_symbol(...)` from server.py (lines 11693-12308)
- [x] **TEST**: Call `update_symbol` tool and verify it works

**Dependencies**:
- `_perform_atomic_git_refactor` (lines 11215-11329)
- `_update_cross_file_references` (lines 11335-11439)
- `_check_code_review_approval` (lines 11449-11496)
- `_check_compliance` (lines 11505-11558)
- `_run_pre_update_hook` (lines 11568-11624)
- `_run_post_update_hook` (lines 11634-11690)

---

## Phase 5: Context & Discovery Tools (Complete)

### Tool 12: `crawl_project` (lines 12861-13053)
**Target Module**: `tools/context.py`
**Helper Function**: `_crawl_project_sync` (lines 9718-10333)

- [x] **COPY**: Copy `_crawl_project_sync` to `helpers/context_helpers.py`
- [x] **UPDATE**: Update `tools/context.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def crawl_project(...)` from server.py (lines 12861-13053)
- [x] **TEST**: Call `crawl_project` tool and verify it works

**Dependencies**:
- `_crawl_project_discovery` (lines 9456-9705)

### Tool 13: `get_file_context` (lines 15267-15316)
**Target Module**: `tools/context.py`
**Helper Function**: `_get_file_context_sync` (lines 14356-14765)

- [x] **COPY**: Copy `_get_file_context_sync` to `helpers/context_helpers.py`
- [x] **UPDATE**: Update `tools/context.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def get_file_context(...)` from server.py (lines 15267-15316)
- [x] **TEST**: Call `get_file_context` tool and verify it works

**Dependencies**:
- `_count_complexity_node` (lines 14769-14776)
- `_detect_code_smells` (lines 14785-14882)
- `_get_nesting_depth` (lines 14886-14892)
- `_calculate_doc_coverage` (lines 14898-14926)
- `_calculate_maintainability_index` (lines 14932-14961)
- `_load_custom_metadata` (lines 14968-14995)
- `_detect_compliance_flags` (lines 14999-15040)
- `_calculate_technical_debt` (lines 15049-15073)
- `_get_code_owners` (lines 15077-15102)
- `_parse_codeowners` (lines 15108-15132)
- `_codeowners_pattern_matches` (lines 15136-15156)
- `_get_historical_metrics` (lines 15160-15264)

### Tool 14: `get_symbol_references` (lines 16120-16243)
**Target Module**: `tools/context.py`
**Helper Function**: `_get_symbol_references_sync` (lines 15333-16117)

- [x] **COPY**: Copy `_get_symbol_references_sync` to `helpers/context_helpers.py`
- [x] **UPDATE**: Update `tools/context.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def get_symbol_references(...)` from server.py (lines 16120-16243)
- [x] **TEST**: Call `get_symbol_references` tool and verify it works

---

## Phase 6: Graph Tools (Complete)

### Tool 15: `get_call_graph` (lines 16662-16776)
**Target Module**: `tools/graph.py`
**Helper Function**: `_get_call_graph_sync` (lines 16393-16659)

- [x] **COPY**: Copy `_get_call_graph_sync` to `helpers/graph_helpers.py`
- [x] **UPDATE**: Update `tools/graph.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def get_call_graph(...)` from server.py (lines 16662-16776)
- [x] **TEST**: Call `get_call_graph` tool and verify it works

**Dependencies**:
- `CallContextModel` (lines 16253-16270)
- `CallNodeModel` (lines 16274-16289)
- `CallEdgeModel` (lines 16293-16312)
- `CallGraphResultModel` (lines 16316-16378)

### Tool 16: `get_graph_neighborhood` (lines 17003-17496)
**Target Module**: `tools/graph.py`
**Helper Functions**: Multiple

- [x] **COPY**: Copy graph neighborhood helpers to `helpers/graph_helpers.py`
- [x] **UPDATE**: Update `tools/graph.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def get_graph_neighborhood(...)` from server.py (lines 17003-17496)
- [x] **TEST**: Call `get_graph_neighborhood` tool and verify it works

**Dependencies**:
- `NeighborhoodNodeModel` (lines 16785-16792)
- `NeighborhoodEdgeModel` (lines 16796-16801)
- `GraphNeighborhoodResult` (lines 16805-16864)
- `_generate_neighborhood_mermaid` (lines 16872-16900)
- `_normalize_graph_center_node_id` (lines 16904-16943)
- `_fast_validate_python_function_node_exists` (lines 16949-17000)

### Tool 17: `get_project_map` (lines 18637-18761)
**Target Module**: `tools/graph.py`
**Helper Function**: `_get_project_map_sync` (lines 17734-18634)

- [x] **COPY**: Copy `_get_project_map_sync` to `helpers/graph_helpers.py`
- [x] **UPDATE**: Update `tools/graph.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def get_project_map(...)` from server.py (lines 18637-18761)
- [x] **TEST**: Call `get_project_map` tool and verify it works

**Dependencies**:
- `ModuleInfo` (lines 17505-17519)
- `PackageInfo` (lines 17523-17530)
- `ProjectMapResult` (lines 17534-17720)

### Tool 18: `get_cross_file_dependencies` (lines 19831-19932)
**Target Module**: `tools/graph.py`
**Helper Function**: `_get_cross_file_dependencies_sync` (lines 19075-19828)

- [x] **COPY**: Copy `_get_cross_file_dependencies_sync` to `helpers/graph_helpers.py`
- [x] **UPDATE**: Update `tools/graph.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def get_cross_file_dependencies(...)` from server.py (lines 19831-19932)
- [x] **TEST**: Call `get_cross_file_dependencies` tool and verify it works

**Dependencies**:
- `ImportNodeModel` (lines 18770-18778)
- `SymbolDefinitionModel` (lines 18782-18788)
- `ExtractedSymbolModel` (lines 18792-18810)
- `AliasResolutionModel` (lines 18814-18826)
- `WildcardExpansionModel` (lines 18830-18836)
- `ReexportChainModel` (lines 18840-18844)
- `ChainedAliasResolutionModel` (lines 18848-18860)
- `CouplingViolationModel` (lines 18864-18877)
- `ArchitecturalViolationModel` (lines 18881-18892)
- `BoundaryAlertModel` (lines 18896-18902)
- `CrossFileDependenciesResult` (lines 18906-19059)

### Tool 19: `cross_file_security_scan` (lines 20409-20498)
**Target Module**: `tools/graph.py`
**Helper Function**: `_cross_file_security_scan_sync` (lines 20066-20406)

- [x] **COPY**: Copy `_cross_file_security_scan_sync` to `helpers/graph_helpers.py`
- [x] **UPDATE**: Update `tools/graph.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def cross_file_security_scan(...)` from server.py (lines 20409-20498)
- [x] **TEST**: Call `cross_file_security_scan` tool and verify it works

**Dependencies**:
- `TaintFlowModel` (lines 19941-19952)
- `CrossFileVulnerabilityModel` (lines 19956-19966)
- `CrossFileSecurityResult` (lines 19970-20050)

---

## Phase 7: Policy Tools (Legacy handlers removed from server.py)

### Tool 20: `validate_paths` (lines 20838-20906)
**Target Module**: `tools/policy.py`
**Helper Function**: `_validate_paths_sync` (lines 20577-20835)

- [x] **COPY**: Copy `_validate_paths_sync` to `helpers/policy_helpers.py`
- [x] **UPDATE**: Update `tools/policy.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def validate_paths(...)` from server.py (lines 20838-20906)
- [x] **TEST**: Call `validate_paths` tool and verify it works

**Dependencies**:
- `PathValidationResult` (lines 20507-20568)

### Tool 21: `verify_policy_integrity` (lines 21145-21218)
**Target Module**: `tools/policy.py`
**Helper Function**: `_verify_policy_integrity_sync` (lines 20962-21142)

- [x] **COPY**: Copy `_verify_policy_integrity_sync` to `helpers/policy_helpers.py`
- [x] **UPDATE**: Update `tools/policy.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def verify_policy_integrity(...)` from server.py (lines 21145-21218)
- [x] **TEST**: Call `verify_policy_integrity` tool and verify it works

**Dependencies**:
- `PolicyVerificationResult` (lines 20916-20953)

### Tool 22: `code_policy_check` (lines 21365-21494)
**Target Module**: `tools/policy.py`
**Helper Function**: `_code_policy_check_sync` (lines 21295-21362)

- [x] **COPY**: Copy `_code_policy_check_sync` to `helpers/policy_helpers.py`
- [x] **UPDATE**: Update `tools/policy.py` to import from helpers
- [x] **DELETE**: Remove `@mcp.tool() async def code_policy_check(...)` from server.py (lines 21365-21494)
- [x] **TEST**: Call `code_policy_check` tool and verify it works

**Dependencies**:
- `CodePolicyCheckResult` (lines 21229-21284)

---

## Phase 8: Resources (Complete)

### Resources to verify in `resources.py` (11 total)
- [x] `scalpel://project/call-graph` (server.py line 13061)
- [x] `scalpel://project/dependencies` (server.py line 13082)
- [x] `scalpel://project/structure` (server.py line 13097)
- [x] `scalpel://version` (server.py line 13135)
- [x] `scalpel://health` (server.py line 13153)
- [x] `scalpel://capabilities` (server.py line 13177)
- [x] `scalpel://file/{path}` (server.py line 13223)
- [x] `scalpel://analysis/{path}` (server.py line 13263)
- [x] `scalpel://symbol/{file_path}/{symbol_name}` (server.py line 13417)
- [x] `scalpel://security/{path}` (server.py line 13482)
- [x] `code:///{language}/{module}/{symbol}` (server.py line 13528)

**After verification**:
- [x] **DELETE**: Remove all `@mcp.resource(...)` decorated functions from server.py (lines 13061-13654)

---

## Phase 9: Prompts (Complete)

### Prompts to verify in `prompts.py` (8 total)
- [x] `Code Review` (server.py line 13662)
- [x] `Security Audit` (server.py line 13685)
- [x] `Refactor Function` (server.py line 13713)
- [x] `Debug Vulnerability` (server.py line 13797)
- [x] `Analyze Codebase` (server.py line 13892)
- [x] `Extract and Test` (server.py line 14004)
- [x] `Security Audit Workflow` (server.py line 14107)
- [x] `Safe Refactor Workflow` (server.py line 14206)

**After verification**:
- [x] **DELETE**: Remove all `@mcp.prompt(...)` decorated functions from server.py (lines 13662-14345)

---

## Phase 10: Final Cleanup (Legacy handlers removed from server.py)

### 10.1 Clean up server.py
- [x] Remove orphaned helper functions no longer needed in server.py
- [x] Remove unused imports from server.py
- [x] Verify server.py is < 6000 lines (current: 5642 lines)
- [x] Run linter/formatter on server.py

### 10.2 Update `tools/__init__.py`
- [x] Ensure `register_tools()` imports all tool modules
- [x] Ensure `register_tools()` imports resources.py
- [x] Ensure `register_tools()` imports prompts.py

### 10.3 Update `run_server()` in server.py
- [x] Import and call `register_tools()` before `mcp.run()`
- [x] Verify single `mcp` instance is used throughout

### 10.4 Final Testing
- [x] Start server: `python -m code_scalpel.mcp.server`
- [x] Verify all 22 tools are registered (no duplicates)
- [x] Verify all 11 resources are registered
- [x] Verify all 8 prompts are registered
- [x] Run test suite: 112 passed, 16 failed (non-refactoring related - tier/path validation)

---

## Progress Tracking

| Phase | Status | Tools Completed | Notes |
|-------|--------|-----------------|-------|
| 0 | ✅ Complete | - | Preparation - Single mcp instance |
| 1 | ✅ Complete | 1/1 | Analysis |
| 2 | ✅ Complete | 4/4 | Security |
| 3 | ✅ Complete | 3/3 | Symbolic |
| 4 | ✅ Complete | 3/3 | Extraction |
| 5 | ✅ Complete | 3/3 | Context |
| 6 | ✅ Complete | 5/5 | Graph |
| 7 | ✅ Complete | 3/3 | Policy |
| 8 | ✅ Complete | 11/11 | Resources |
| 9 | ✅ Complete | 8/8 | Prompts |
| 10 | ✅ Complete | - | Final Cleanup (server.py: 5642 lines) |

**Total Tools**: 22
**Total Resources**: 11
**Total Prompts**: 8

---

## Notes

### 2026-01-15
- Fixed PatchResultModel schema warnings for `rename_symbol` and `update_symbol` by importing `PatchResultModel` in tools/extraction.py and using concrete return annotations.

### Pattern for each tool extraction:
```python
# In helpers/<category>_helpers.py
def _tool_name_sync(...) -> ResultModel:
    """Implementation logic."""
    ...

# In tools/<category>.py
from code_scalpel.mcp.protocol import mcp
from code_scalpel.mcp.helpers.<category>_helpers import _tool_name_sync

@mcp.tool()
async def tool_name(...) -> ResultModel:
    """Docstring with full description."""
    return await asyncio.to_thread(_tool_name_sync, ...)
```

### Key files after refactoring:
- `server.py`: ~5000 lines (server config, models, shared utilities)
- `helpers/*.py`: ~12000 lines (implementation logic)
- `tools/*.py`: ~1500 lines (tool registrations only)
- `resources.py`: ~600 lines
- `prompts.py`: ~700 lines
- `models/`: Pydantic models

### Testing commands:
```bash
# Start server
python -m code_scalpel.mcp.server

# Quick tool test
python -c "from code_scalpel.mcp.tools import register_tools; register_tools(); print('OK')"

# Full test suite
pytest tests/mcp/ -v
```
