feat: Add tool annotations for improved LLM tool understanding (#1543)

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: triepod-ai <noreply@github.com>
Co-authored-by: Ralph Khreish <35776126+Crunchyman-ralph@users.noreply.github.com>
Co-authored-by: triepod-ai <199543909+triepod-ai@users.noreply.github.com>
This commit is contained in:
Bryan Thompson
2026-01-02 05:45:28 -06:00
committed by GitHub
parent 1d8d72315f
commit 9a6fa1bd2a
47 changed files with 192 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
---
"task-master-ai": patch
---
feat: Add tool annotations for improved LLM tool understanding
Added MCP tool annotations (readOnlyHint, destructiveHint, title) to all 12 tools to help LLMs better understand tool behavior and make safer decisions about tool execution.

View File

@@ -25,6 +25,10 @@ export function registerAutopilotAbortTool(server: FastMCP) {
description: description:
'Abort the current TDD workflow and clean up workflow state. This will remove the workflow state file but will NOT delete the git branch or any code changes.', 'Abort the current TDD workflow and clean up workflow state. This will remove the workflow state file but will NOT delete the git branch or any code changes.',
parameters: AbortSchema, parameters: AbortSchema,
annotations: {
title: 'Abort Autopilot Workflow',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-abort', 'autopilot-abort',
async (args: AbortArgs, { log, tmCore }: ToolContext) => { async (args: AbortArgs, { log, tmCore }: ToolContext) => {

View File

@@ -36,6 +36,10 @@ export function registerAutopilotCommitTool(server: FastMCP) {
description: description:
'Create a git commit with automatic staging, message generation, and metadata embedding. Generates appropriate commit messages based on subtask context and TDD phase.', 'Create a git commit with automatic staging, message generation, and metadata embedding. Generates appropriate commit messages based on subtask context and TDD phase.',
parameters: CommitSchema, parameters: CommitSchema,
annotations: {
title: 'Commit Autopilot Changes',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-commit', 'autopilot-commit',
async (args: CommitArgs, { log, tmCore }: ToolContext) => { async (args: CommitArgs, { log, tmCore }: ToolContext) => {

View File

@@ -33,6 +33,10 @@ export function registerAutopilotCompleteTool(server: FastMCP) {
description: description:
'Complete the current TDD phase (RED or GREEN) with test result validation. RED phase: expects failures (if 0 failures, feature is already implemented and subtask auto-completes). GREEN phase: expects all tests passing. For COMMIT phase, use autopilot_commit instead.', 'Complete the current TDD phase (RED or GREEN) with test result validation. RED phase: expects failures (if 0 failures, feature is already implemented and subtask auto-completes). GREEN phase: expects all tests passing. For COMMIT phase, use autopilot_commit instead.',
parameters: CompletePhaseSchema, parameters: CompletePhaseSchema,
annotations: {
title: 'Complete Autopilot Phase',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-complete-phase', 'autopilot-complete-phase',
async (args: CompletePhaseArgs, { log, tmCore }: ToolContext) => { async (args: CompletePhaseArgs, { log, tmCore }: ToolContext) => {

View File

@@ -25,6 +25,10 @@ export function registerAutopilotFinalizeTool(server: FastMCP) {
description: description:
'Finalize and complete the workflow. Validates that all changes are committed and working tree is clean before marking workflow as complete.', 'Finalize and complete the workflow. Validates that all changes are committed and working tree is clean before marking workflow as complete.',
parameters: FinalizeSchema, parameters: FinalizeSchema,
annotations: {
title: 'Finalize Autopilot Workflow',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-finalize', 'autopilot-finalize',
async (args: FinalizeArgs, { log, tmCore }: ToolContext) => { async (args: FinalizeArgs, { log, tmCore }: ToolContext) => {

View File

@@ -25,6 +25,10 @@ export function registerAutopilotNextTool(server: FastMCP) {
description: description:
'Get the next action to perform in the TDD workflow. Returns detailed context about what needs to be done next, including the current phase, subtask, and expected actions.', 'Get the next action to perform in the TDD workflow. Returns detailed context about what needs to be done next, including the current phase, subtask, and expected actions.',
parameters: NextActionSchema, parameters: NextActionSchema,
annotations: {
title: 'Get Next Autopilot Action',
readOnlyHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-next', 'autopilot-next',
async (args: NextActionArgs, { log, tmCore }: ToolContext) => { async (args: NextActionArgs, { log, tmCore }: ToolContext) => {

View File

@@ -25,6 +25,10 @@ export function registerAutopilotResumeTool(server: FastMCP) {
description: description:
'Resume a previously started TDD workflow from saved state. Restores the workflow state machine and continues from where it left off.', 'Resume a previously started TDD workflow from saved state. Restores the workflow state machine and continues from where it left off.',
parameters: ResumeWorkflowSchema, parameters: ResumeWorkflowSchema,
annotations: {
title: 'Resume Autopilot Workflow',
readOnlyHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-resume', 'autopilot-resume',
async (args: ResumeWorkflowArgs, { log, tmCore }: ToolContext) => { async (args: ResumeWorkflowArgs, { log, tmCore }: ToolContext) => {

View File

@@ -39,6 +39,10 @@ export function registerAutopilotStartTool(server: FastMCP) {
description: description:
'Initialize and start a new TDD workflow for a task. Creates a git branch and sets up the workflow state machine.', 'Initialize and start a new TDD workflow for a task. Creates a git branch and sets up the workflow state machine.',
parameters: StartWorkflowSchema, parameters: StartWorkflowSchema,
annotations: {
title: 'Start Autopilot Workflow',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-start', 'autopilot-start',
async (args: StartWorkflowArgs, { log, tmCore }: ToolContext) => { async (args: StartWorkflowArgs, { log, tmCore }: ToolContext) => {

View File

@@ -25,6 +25,10 @@ export function registerAutopilotStatusTool(server: FastMCP) {
description: description:
'Get comprehensive workflow status including current phase, progress, subtask details, and activity history.', 'Get comprehensive workflow status including current phase, progress, subtask details, and activity history.',
parameters: StatusSchema, parameters: StatusSchema,
annotations: {
title: 'Get Autopilot Status',
readOnlyHint: true
},
execute: withToolContext( execute: withToolContext(
'autopilot-status', 'autopilot-status',
async (args: StatusArgs, { log, tmCore }: ToolContext) => { async (args: StatusArgs, { log, tmCore }: ToolContext) => {

View File

@@ -33,6 +33,10 @@ export function registerGenerateTool(server: FastMCP) {
description: description:
'Generates individual task files in tasks/ directory based on tasks.json. Only works with local file storage.', 'Generates individual task files in tasks/ directory based on tasks.json. Only works with local file storage.',
parameters: GenerateSchema, parameters: GenerateSchema,
annotations: {
title: 'Generate Task Files',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'generate', 'generate',
async (args: GenerateArgs, { log, tmCore }: ToolContext) => { async (args: GenerateArgs, { log, tmCore }: ToolContext) => {

View File

@@ -38,6 +38,10 @@ export function registerGetTaskTool(server: FastMCP) {
name: 'get_task', name: 'get_task',
description: 'Get detailed information about a specific task', description: 'Get detailed information about a specific task',
parameters: GetTaskSchema, parameters: GetTaskSchema,
annotations: {
title: 'Get Task',
readOnlyHint: true
},
execute: withToolContext( execute: withToolContext(
'get-task', 'get-task',
async (args: GetTaskArgs, { log, tmCore }: ToolContext) => { async (args: GetTaskArgs, { log, tmCore }: ToolContext) => {

View File

@@ -40,6 +40,10 @@ export function registerGetTasksTool(server: FastMCP) {
description: description:
'Get all tasks from Task Master, optionally filtering by status and including subtasks.', 'Get all tasks from Task Master, optionally filtering by status and including subtasks.',
parameters: GetTasksSchema, parameters: GetTasksSchema,
annotations: {
title: 'Get Tasks',
readOnlyHint: true
},
execute: withToolContext( execute: withToolContext(
'get-tasks', 'get-tasks',
async (args: GetTasksArgs, { log, tmCore }: ToolContext) => { async (args: GetTasksArgs, { log, tmCore }: ToolContext) => {

View File

@@ -34,6 +34,10 @@ export function registerSetTaskStatusTool(server: FastMCP) {
name: 'set_task_status', name: 'set_task_status',
description: 'Set the status of one or more tasks or subtasks.', description: 'Set the status of one or more tasks or subtasks.',
parameters: SetTaskStatusSchema, parameters: SetTaskStatusSchema,
annotations: {
title: 'Set Task Status',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'set-task-status', 'set-task-status',
async (args: SetTaskStatusArgs, { log, tmCore }: ToolContext) => { async (args: SetTaskStatusArgs, { log, tmCore }: ToolContext) => {

View File

@@ -33,6 +33,10 @@ export function registerAddDependencyTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Add Dependency',
destructiveHint: true
},
execute: withToolContext( execute: withToolContext(
'add-dependency', 'add-dependency',
async (args, { log, session }) => { async (args, { log, session }) => {

View File

@@ -62,6 +62,10 @@ export function registerAddSubtaskTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Add Subtask',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
const resolvedTag = resolveTag({ const resolvedTag = resolveTag({

View File

@@ -50,6 +50,10 @@ export function registerAddTagTool(server) {
.string() .string()
.describe('The directory of the project. Must be an absolute path.') .describe('The directory of the project. Must be an absolute path.')
}), }),
annotations: {
title: 'Add Tag',
destructiveHint: false
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting add-tag with args: ${JSON.stringify(args)}`); log.info(`Starting add-tag with args: ${JSON.stringify(args)}`);

View File

@@ -65,6 +65,10 @@ export function registerAddTaskTool(server) {
.optional() .optional()
.describe('Whether to use research capabilities for task creation') .describe('Whether to use research capabilities for task creation')
}), }),
annotations: {
title: 'Add Task',
destructiveHint: false
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting add-task with args: ${JSON.stringify(args)}`); log.info(`Starting add-task with args: ${JSON.stringify(args)}`);

View File

@@ -75,6 +75,10 @@ export function registerAnalyzeProjectComplexityTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Analyze Project Complexity',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
const toolName = 'analyze_project_complexity'; // Define tool name for logging const toolName = 'analyze_project_complexity'; // Define tool name for logging

View File

@@ -39,6 +39,10 @@ export function registerClearSubtasksTool(server) {
message: "Either 'id' or 'all' parameter must be provided", message: "Either 'id' or 'all' parameter must be provided",
path: ['id', 'all'] path: ['id', 'all']
}), }),
annotations: {
title: 'Clear Subtasks',
destructiveHint: true
},
execute: withToolContext('clear-subtasks', async (args, context) => { execute: withToolContext('clear-subtasks', async (args, context) => {
try { try {
context.log.info( context.log.info(

View File

@@ -33,6 +33,10 @@ export function registerComplexityReportTool(server) {
.string() .string()
.describe('The directory of the project. Must be an absolute path.') .describe('The directory of the project. Must be an absolute path.')
}), }),
annotations: {
title: 'Complexity Report',
readOnlyHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info( log.info(

View File

@@ -36,6 +36,10 @@ export function registerCopyTagTool(server) {
.string() .string()
.describe('The directory of the project. Must be an absolute path.') .describe('The directory of the project. Must be an absolute path.')
}), }),
annotations: {
title: 'Copy Tag',
destructiveHint: false
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting copy-tag with args: ${JSON.stringify(args)}`); log.info(`Starting copy-tag with args: ${JSON.stringify(args)}`);

View File

@@ -34,6 +34,10 @@ export function registerDeleteTagTool(server) {
.string() .string()
.describe('The directory of the project. Must be an absolute path.') .describe('The directory of the project. Must be an absolute path.')
}), }),
annotations: {
title: 'Delete Tag',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting delete-tag with args: ${JSON.stringify(args)}`); log.info(`Starting delete-tag with args: ${JSON.stringify(args)}`);

View File

@@ -64,6 +64,10 @@ export function registerExpandAllTool(server) {
), ),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Expand All Tasks',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info( log.info(

View File

@@ -52,6 +52,10 @@ export function registerExpandTaskTool(server) {
.describe('Force expansion even if subtasks exist'), .describe('Force expansion even if subtasks exist'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Expand Task',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting expand-task with args: ${JSON.stringify(args)}`); log.info(`Starting expand-task with args: ${JSON.stringify(args)}`);

View File

@@ -24,6 +24,10 @@ export function registerFixDependenciesTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Fix Dependencies',
destructiveHint: true
},
execute: withToolContext('fix-dependencies', async (args, context) => { execute: withToolContext('fix-dependencies', async (args, context) => {
try { try {
context.log.info( context.log.info(

View File

@@ -15,6 +15,10 @@ export function registerGetOperationStatusTool(server, asyncManager) {
parameters: z.object({ parameters: z.object({
operationId: z.string().describe('The ID of the operation to check.') operationId: z.string().describe('The ID of the operation to check.')
}), }),
annotations: {
title: 'Get Operation Status',
readOnlyHint: true
},
execute: async (args, { log }) => { execute: async (args, { log }) => {
try { try {
const { operationId } = args; const { operationId } = args;

View File

@@ -56,6 +56,10 @@ export function registerInitializeProjectTool(server) {
`List of rule profiles to include at initialization. If omitted, defaults to Cursor profile only. Available options: ${RULE_PROFILES.join(', ')}` `List of rule profiles to include at initialization. If omitted, defaults to Cursor profile only. Available options: ${RULE_PROFILES.join(', ')}`
) )
}), }),
annotations: {
title: 'Initialize Project',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, context) => { execute: withNormalizedProjectRoot(async (args, context) => {
const { log } = context; const { log } = context;
const session = context.session; const session = context.session;

View File

@@ -33,6 +33,10 @@ export function registerListTagsTool(server) {
.string() .string()
.describe('The directory of the project. Must be an absolute path.') .describe('The directory of the project. Must be an absolute path.')
}), }),
annotations: {
title: 'List Tags',
readOnlyHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting list-tags with args: ${JSON.stringify(args)}`); log.info(`Starting list-tags with args: ${JSON.stringify(args)}`);

View File

@@ -79,6 +79,10 @@ export function registerModelsTool(server) {
'Custom base URL for providers that support it (e.g., https://api.example.com/v1).' 'Custom base URL for providers that support it (e.g., https://api.example.com/v1).'
) )
}), }),
annotations: {
title: 'Models',
destructiveHint: true
},
execute: withToolContext('models', async (args, context) => { execute: withToolContext('models', async (args, context) => {
try { try {
context.log.info( context.log.info(

View File

@@ -54,6 +54,10 @@ export function registerMoveTaskTool(server) {
.optional() .optional()
.describe('Break cross-tag dependencies during move') .describe('Break cross-tag dependencies during move')
}), }),
annotations: {
title: 'Move Task',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
// Check if this is a cross-tag move // Check if this is a cross-tag move

View File

@@ -38,6 +38,10 @@ export function registerNextTaskTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Next Task',
readOnlyHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Finding next task with args: ${JSON.stringify(args)}`); log.info(`Finding next task with args: ${JSON.stringify(args)}`);

View File

@@ -65,6 +65,10 @@ export function registerParsePRDTool(server) {
.optional() .optional()
.describe('Append generated tasks to existing file.') .describe('Append generated tasks to existing file.')
}), }),
annotations: {
title: 'Parse PRD',
destructiveHint: true
},
execute: withNormalizedProjectRoot( execute: withNormalizedProjectRoot(
async (args, { log, session, reportProgress }) => { async (args, { log, session, reportProgress }) => {
try { try {

View File

@@ -31,6 +31,10 @@ export function registerRemoveDependencyTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Remove Dependency',
destructiveHint: true
},
execute: withToolContext('remove-dependency', async (args, context) => { execute: withToolContext('remove-dependency', async (args, context) => {
try { try {
const resolvedTag = resolveTag({ const resolvedTag = resolveTag({

View File

@@ -48,6 +48,10 @@ export function registerRemoveSubtaskTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Remove Subtask',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
const resolvedTag = resolveTag({ const resolvedTag = resolveTag({

View File

@@ -42,6 +42,10 @@ export function registerRemoveTaskTool(server) {
'Specify which tag context to operate on. Defaults to the current active tag.' 'Specify which tag context to operate on. Defaults to the current active tag.'
) )
}), }),
annotations: {
title: 'Remove Task',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Removing task(s) with ID(s): ${args.id}`); log.info(`Removing task(s) with ID(s): ${args.id}`);

View File

@@ -31,6 +31,10 @@ export function registerRenameTagTool(server) {
.string() .string()
.describe('The directory of the project. Must be an absolute path.') .describe('The directory of the project. Must be an absolute path.')
}), }),
annotations: {
title: 'Rename Tag',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting rename-tag with args: ${JSON.stringify(args)}`); log.info(`Starting rename-tag with args: ${JSON.stringify(args)}`);

View File

@@ -66,6 +66,11 @@ export function registerResearchTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Research',
destructiveHint: true,
openWorldHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
const resolvedTag = resolveTag({ const resolvedTag = resolveTag({

View File

@@ -22,6 +22,10 @@ export function registerResponseLanguageTool(server) {
'The new response language to set. like "中文" "English" or "español".' 'The new response language to set. like "中文" "English" or "español".'
) )
}), }),
annotations: {
title: 'Response Language',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info( log.info(

View File

@@ -43,6 +43,10 @@ export function registerRulesTool(server) {
'DANGEROUS: Force removal even if it would leave no rule profiles. Only use if you are absolutely certain.' 'DANGEROUS: Force removal even if it would leave no rule profiles. Only use if you are absolutely certain.'
) )
}), }),
annotations: {
title: 'Rules',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info( log.info(

View File

@@ -50,6 +50,10 @@ export function registerScopeDownTool(server) {
.optional() .optional()
.describe('Whether to use research capabilities for scoping') .describe('Whether to use research capabilities for scoping')
}), }),
annotations: {
title: 'Scope Down Task',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting scope-down with args: ${JSON.stringify(args)}`); log.info(`Starting scope-down with args: ${JSON.stringify(args)}`);

View File

@@ -50,6 +50,10 @@ export function registerScopeUpTool(server) {
.optional() .optional()
.describe('Whether to use research capabilities for scoping') .describe('Whether to use research capabilities for scoping')
}), }),
annotations: {
title: 'Scope Up Task',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting scope-up with args: ${JSON.stringify(args)}`); log.info(`Starting scope-up with args: ${JSON.stringify(args)}`);

View File

@@ -51,6 +51,10 @@ export function registerSetTaskStatusTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Optional tag context to operate on') tag: z.string().optional().describe('Optional tag context to operate on')
}), }),
annotations: {
title: 'Set Task Status',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info( log.info(

View File

@@ -38,6 +38,10 @@ export function registerUpdateSubtaskTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Update Subtask',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
const toolName = 'update_subtask'; const toolName = 'update_subtask';

View File

@@ -47,6 +47,10 @@ export function registerUpdateTaskTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Update Task',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
const toolName = 'update_task'; const toolName = 'update_task';
try { try {

View File

@@ -47,6 +47,10 @@ export function registerUpdateTool(server) {
), ),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Update Tasks',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
const toolName = 'update'; const toolName = 'update';
const { from, prompt, research, file, projectRoot, tag } = args; const { from, prompt, research, file, projectRoot, tag } = args;

View File

@@ -30,6 +30,10 @@ export function registerUseTagTool(server) {
.string() .string()
.describe('The directory of the project. Must be an absolute path.') .describe('The directory of the project. Must be an absolute path.')
}), }),
annotations: {
title: 'Use Tag',
destructiveHint: true
},
execute: withNormalizedProjectRoot(async (args, { log, session }) => { execute: withNormalizedProjectRoot(async (args, { log, session }) => {
try { try {
log.info(`Starting use-tag with args: ${JSON.stringify(args)}`); log.info(`Starting use-tag with args: ${JSON.stringify(args)}`);

View File

@@ -25,6 +25,10 @@ export function registerValidateDependenciesTool(server) {
.describe('The directory of the project. Must be an absolute path.'), .describe('The directory of the project. Must be an absolute path.'),
tag: z.string().optional().describe('Tag context to operate on') tag: z.string().optional().describe('Tag context to operate on')
}), }),
annotations: {
title: 'Validate Dependencies',
readOnlyHint: true
},
execute: withToolContext( execute: withToolContext(
'validate-dependencies', 'validate-dependencies',
async (args, { log, session }) => { async (args, { log, session }) => {