222 lines
6.7 KiB
Markdown
222 lines
6.7 KiB
Markdown
---
|
|
story_id: story_14
|
|
sprint_id: sprint_5
|
|
parent_story_id: story_0
|
|
status: not_started
|
|
priority: P0
|
|
assignee: backend
|
|
created_date: 2025-11-09
|
|
estimated_days: 10
|
|
phase: 2
|
|
---
|
|
|
|
# Story 14: Tool Migration to SDK Attributes
|
|
|
|
**Parent Epic**: [Story 0](sprint_5_story_0.md) - Integrate Microsoft .NET MCP SDK
|
|
**Phase**: 2 - Tool Migration (Week 3-4)
|
|
**Priority**: P0 - Critical
|
|
**Estimated Effort**: 10 days (2 weeks)
|
|
**Dependencies**: Story 13 (Foundation must be complete)
|
|
|
|
## User Story
|
|
|
|
**As** a backend developer,
|
|
**I want** to migrate all 10 MCP Tools from custom implementation to SDK attribute-based registration,
|
|
**So that** we reduce boilerplate code and improve maintainability while preserving DiffPreview integration.
|
|
|
|
## Business Value
|
|
|
|
- **Code Reduction**: Remove 300-400 lines of custom Tool infrastructure
|
|
- **Developer Experience**: Attribute-based registration is cleaner and more intuitive
|
|
- **Performance**: SDK optimizations improve Tool execution by 20-30%
|
|
- **Maintainability**: Microsoft maintains protocol layer, we focus on business logic
|
|
|
|
## Tools to Migrate (10 Total)
|
|
|
|
### High Priority Tools (P0)
|
|
1. `create_issue` - Create Epic/Story/Task
|
|
2. `update_status` - Change issue status
|
|
3. `add_comment` - Add comment to issue
|
|
4. `assign_issue` - Assign issue to user
|
|
|
|
### Medium Priority Tools (P1)
|
|
5. `create_sprint` - Create new Sprint
|
|
6. `update_sprint` - Update Sprint details
|
|
7. `log_decision` - Log architecture decision
|
|
|
|
### Low Priority Tools (P2)
|
|
8. `generate_prd` - AI-generate PRD from description
|
|
9. `split_epic` - Split Epic into Stories
|
|
10. `detect_risks` - Detect project risks
|
|
|
|
## Migration Pattern
|
|
|
|
### Before (Custom Implementation)
|
|
```csharp
|
|
public class CreateIssueTool : IMcpTool
|
|
{
|
|
public string Name => "create_issue";
|
|
public string Description => "Create a new issue";
|
|
public McpToolInputSchema InputSchema => new()
|
|
{
|
|
Type = "object",
|
|
Properties = new Dictionary<string, object>
|
|
{
|
|
["projectId"] = new { type = "string", format = "uuid" },
|
|
["title"] = new { type = "string", minLength = 1 }
|
|
},
|
|
Required = new[] { "projectId", "title" }
|
|
};
|
|
|
|
public async Task<McpToolResult> ExecuteAsync(
|
|
McpToolCall toolCall,
|
|
CancellationToken ct)
|
|
{
|
|
// Manual parameter extraction
|
|
var projectId = GetParam<Guid>(toolCall.Arguments, "projectId");
|
|
var title = GetParam<string>(toolCall.Arguments, "title");
|
|
|
|
// Business logic...
|
|
}
|
|
}
|
|
```
|
|
|
|
### After (SDK Attributes)
|
|
```csharp
|
|
[McpTool(
|
|
Name = "create_issue",
|
|
Description = "Create a new issue (Epic/Story/Task) with Diff Preview"
|
|
)]
|
|
public class CreateIssueTool
|
|
{
|
|
private readonly IDiffPreviewService _diffPreview;
|
|
private readonly IPendingChangeService _pendingChange;
|
|
|
|
public CreateIssueTool(
|
|
IDiffPreviewService diffPreview,
|
|
IPendingChangeService pendingChange)
|
|
{
|
|
_diffPreview = diffPreview;
|
|
_pendingChange = pendingChange;
|
|
}
|
|
|
|
[McpToolParameter(Required = true)]
|
|
public Guid ProjectId { get; set; }
|
|
|
|
[McpToolParameter(Required = true, MinLength = 1, MaxLength = 200)]
|
|
public string Title { get; set; } = string.Empty;
|
|
|
|
[McpToolParameter]
|
|
public string? Description { get; set; }
|
|
|
|
[McpToolParameter]
|
|
public string Priority { get; set; } = "Medium";
|
|
|
|
public async Task<McpToolResult> ExecuteAsync(
|
|
McpContext context,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
// Parameters auto-bound by SDK
|
|
|
|
// Generate Diff Preview (preserve existing logic)
|
|
var diff = await _diffPreview.GeneratePreviewAsync(
|
|
null, // CREATE operation
|
|
new { ProjectId, Title, Description, Priority },
|
|
"CREATE",
|
|
cancellationToken);
|
|
|
|
// Create PendingChange (preserve existing workflow)
|
|
var pendingChange = await _pendingChange.CreateAsync(
|
|
"create_issue",
|
|
diff,
|
|
cancellationToken);
|
|
|
|
return McpToolResult.Success(new
|
|
{
|
|
PendingChangeId = pendingChange.Id,
|
|
Message = "Issue creation pending approval",
|
|
DiffPreview = diff
|
|
});
|
|
}
|
|
}
|
|
```
|
|
|
|
## Key Changes
|
|
|
|
### What Changes
|
|
- ✅ Tool registration (custom → SDK attributes)
|
|
- ✅ Parameter declaration (schema → properties)
|
|
- ✅ Parameter validation (manual → SDK automatic)
|
|
- ✅ Error handling (custom → SDK standard)
|
|
|
|
### What Stays the Same
|
|
- ✅ DiffPreviewService integration (preserved)
|
|
- ✅ PendingChangeService workflow (preserved)
|
|
- ✅ TenantContext access (preserved via McpContext)
|
|
- ✅ API Key authentication (preserved)
|
|
- ✅ Business logic (unchanged)
|
|
|
|
## Acceptance Criteria
|
|
|
|
- [ ] All 10 Tools migrated to `[McpTool]` attributes
|
|
- [ ] DiffPreview workflow works for all write operations
|
|
- [ ] PendingChange creation works correctly
|
|
- [ ] Tool parameter validation automatic (SDK-based)
|
|
- [ ] Integration tests pass (>80% coverage)
|
|
- [ ] Performance improved by ≥20% (measured)
|
|
- [ ] Claude Desktop can call all migrated Tools
|
|
- [ ] Zero breaking changes for MCP clients
|
|
|
|
## Tasks Breakdown
|
|
|
|
- [ ] [Task 1](sprint_5_story_14_task_1.md) - Migrate P0 Tools (create_issue, update_status, add_comment, assign_issue) - 3 days
|
|
- [ ] [Task 2](sprint_5_story_14_task_2.md) - Migrate P1 Tools (create_sprint, update_sprint, log_decision) - 2 days
|
|
- [ ] [Task 3](sprint_5_story_14_task_3.md) - Migrate P2 Tools (generate_prd, split_epic, detect_risks) - 2 days
|
|
- [ ] [Task 4](sprint_5_story_14_task_4.md) - Update integration tests for all Tools - 2 days
|
|
- [ ] [Task 5](sprint_5_story_14_task_5.md) - Performance testing and optimization - 1 day
|
|
|
|
**Progress**: 0/5 tasks completed (0%)
|
|
|
|
## Testing Strategy
|
|
|
|
### Unit Tests (Per Tool)
|
|
- Parameter validation (required, types, ranges)
|
|
- DiffPreview generation correctness
|
|
- PendingChange creation
|
|
- Error handling (invalid params, missing tenant)
|
|
|
|
### Integration Tests (End-to-End)
|
|
- Claude Desktop Tool calls
|
|
- Diff Preview workflow
|
|
- Approval/rejection flow
|
|
- Multi-tenant isolation
|
|
|
|
### Performance Tests
|
|
- Benchmark each Tool (before/after)
|
|
- Target: 20-30% improvement
|
|
- Memory profiling
|
|
|
|
## Success Metrics
|
|
|
|
- **Code Reduction**: -300 lines (Tool infrastructure)
|
|
- **Performance**: +20-30% faster Tool execution
|
|
- **Test Coverage**: Maintain 80%+
|
|
- **Developer Time**: 50% faster to add new Tools
|
|
|
|
## Definition of Done
|
|
|
|
- [ ] All 10 Tools migrated to SDK attributes
|
|
- [ ] DiffPreview integration verified (all Tools)
|
|
- [ ] Integration tests pass (>80% coverage)
|
|
- [ ] Performance benchmarks show ≥20% improvement
|
|
- [ ] Code reviewed and approved
|
|
- [ ] Documentation updated
|
|
|
|
---
|
|
|
|
**Created**: 2025-11-09 by Product Manager Agent
|
|
**Owner**: Backend Team
|
|
**Start Date**: 2025-12-09 (Week 3)
|
|
**Target Date**: 2025-12-20 (End of Week 4)
|
|
**Status**: Not Started
|