MCPcopy Create free account
hub / github.com/bytebase/bytebase / handleChange

Method handleChange

backend/api/mcp/tool_change.go:157–288  ·  view source on GitHub ↗
(ctx context.Context, req *mcp.CallToolRequest, input ChangeInput)

Source from the content-addressed store, hash-verified

155}
156
157func (s *Server) handleChange(ctx context.Context, req *mcp.CallToolRequest, input ChangeInput) (*mcp.CallToolResult, any, error) {
158 // Step 1: Validate input.
159 if input.Database == "" {
160 return nil, nil, errors.New("database is required")
161 }
162 if input.SQL == "" {
163 return nil, nil, errors.New("sql is required")
164 }
165 if input.Title == "" {
166 return nil, nil, errors.New("title is required")
167 }
168
169 changeType := input.ChangeType
170 if changeType == "" {
171 changeType = changeTypeMigrate
172 }
173 if changeType != changeTypeMigrate && changeType != changeTypeSDL {
174 return formatToolError(&toolError{
175 Code: "INVALID_ARGUMENT",
176 Message: fmt.Sprintf("invalid changeType %q", changeType),
177 Suggestion: "allowed values: MIGRATE, SDL",
178 }), nil, nil
179 }
180
181 var warnings []string
182 reason := input.Reason
183 runes := []rune(reason)
184 if len(runes) > reasonMaxLen {
185 reason = string(runes[:reasonMaxLen-3]) + "..."
186 warnings = append(warnings, "reason truncated to 1000 chars")
187 }
188
189 // Step 2: Resolve database.
190 resolved, resolveResult := s.resolveChangeTarget(ctx, req, input)
191 if resolveResult != nil {
192 return resolveResult, nil, nil
193 }
194
195 // Step 3: Use project from resolved database.
196 // When input.Project is set, the resolver already filtered by it.
197 project := resolved.project
198
199 // Step 4: Create sheet.
200 sheetName, err := s.createSheet(ctx, project, input.SQL)
201 if err != nil {
202 return formatChangeStepError(err, "SHEET_CREATE_FAILED", "bb.sheets.create", nil), nil, nil
203 }
204
205 // Step 5: Create plan.
206 planName, err := s.createPlan(ctx, project, input.Title, resolved.resourceName, sheetName)
207 if err != nil {
208 return formatChangeStepError(err, "PLAN_CREATE_FAILED", "bb.plans.create", map[string]string{"sheet": sheetName}), nil, nil
209 }
210
211 // Step 6: Run plan checks (hybrid async, 10s budget).
212 planChecks := s.runPlanChecks(ctx, planName)
213
214 // Step 7: Create issue.

Calls 14

resolveChangeTargetMethod · 0.95
createSheetMethod · 0.95
createPlanMethod · 0.95
runPlanChecksMethod · 0.95
createIssueMethod · 0.95
createRolloutMethod · 0.95
buildResourceURLMethod · 0.95
formatToolErrorFunction · 0.85
formatChangeStepErrorFunction · 0.85
deriveNextActionFunction · 0.85
planChecksHaveErrorsFunction · 0.85