Skip to main content
Glama

spec-status

Check specification progress and completion status to resume work efficiently. Shows completed phases and task implementation details for structured development workflows.

Instructions

Display comprehensive specification progress overview.

Instructions

Call when resuming work on a spec or checking overall completion status. Shows which phases are complete and task implementation progress. After viewing status, read tasks.md directly to see all tasks and their status markers ([ ] pending, [-] in-progress, [x] completed).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
projectPathNoAbsolute path to the project root (optional - uses server context path if not provided)
specNameYesName of the specification

Implementation Reference

  • The specStatusHandler function implements the core logic for the 'spec-status' tool. It parses the specification directory structure, determines phase completion status, computes task progress, and returns a comprehensive status report with next steps.
    export async function specStatusHandler(args: any, context: ToolContext): Promise<ToolResponse> {
      const { specName } = args;
      
      // Use context projectPath as default, allow override via args
      const projectPath = args.projectPath || context.projectPath;
      
      if (!projectPath) {
        return {
          success: false,
          message: 'Project path is required but not provided in context or arguments'
        };
      }
    
      try {
        // Translate path at tool entry point (components expect pre-translated paths)
        const translatedPath = PathUtils.translatePath(projectPath);
        const parser = new SpecParser(translatedPath);
        const spec = await parser.getSpec(specName);
        
        if (!spec) {
          return {
            success: false,
            message: `Specification '${specName}' not found`,
            nextSteps: [
              'Check spec name',
              'Use spec-list for available specs',
              'Create spec with create-spec-doc'
            ]
          };
        }
    
        // Determine current phase and overall status
        let currentPhase = 'not-started';
        let overallStatus = 'not-started';
        
        if (!spec.phases.requirements.exists) {
          currentPhase = 'requirements';
          overallStatus = 'requirements-needed';
        } else if (!spec.phases.design.exists) {
          currentPhase = 'design';
          overallStatus = 'design-needed';
        } else if (!spec.phases.tasks.exists) {
          currentPhase = 'tasks';
          overallStatus = 'tasks-needed';
        } else if (spec.taskProgress && spec.taskProgress.pending > 0) {
          currentPhase = 'implementation';
          overallStatus = 'implementing';
        } else if (spec.taskProgress && spec.taskProgress.total > 0 && spec.taskProgress.completed === spec.taskProgress.total) {
          currentPhase = 'completed';
          overallStatus = 'completed';
        } else {
          currentPhase = 'implementation';
          overallStatus = 'ready-for-implementation';
        }
    
        // Phase details
        const phaseDetails = [
          {
            name: 'Requirements',
            status: spec.phases.requirements.exists ? (spec.phases.requirements.approved ? 'approved' : 'created') : 'missing',
            lastModified: spec.phases.requirements.lastModified
          },
          {
            name: 'Design',
            status: spec.phases.design.exists ? (spec.phases.design.approved ? 'approved' : 'created') : 'missing',
            lastModified: spec.phases.design.lastModified
          },
          {
            name: 'Tasks',
            status: spec.phases.tasks.exists ? (spec.phases.tasks.approved ? 'approved' : 'created') : 'missing',
            lastModified: spec.phases.tasks.lastModified
          },
          {
            name: 'Implementation',
            status: spec.phases.implementation.exists ? 'in-progress' : 'not-started',
            progress: spec.taskProgress
          }
        ];
    
        // Next steps based on current phase
        const nextSteps = [];
        switch (currentPhase) {
          case 'requirements':
            nextSteps.push('Read template: .spec-workflow/templates/requirements-template-v*.md');
            nextSteps.push('Create: .spec-workflow/specs/{name}/requirements.md');
            nextSteps.push('Request approval');
            break;
          case 'design':
            nextSteps.push('Read template: .spec-workflow/templates/design-template-v*.md');
            nextSteps.push('Create: .spec-workflow/specs/{name}/design.md');
            nextSteps.push('Request approval');
            break;
          case 'tasks':
            nextSteps.push('Read template: .spec-workflow/templates/tasks-template-v*.md');
            nextSteps.push('Create: .spec-workflow/specs/{name}/tasks.md');
            nextSteps.push('Request approval');
            break;
          case 'implementation':
            if (spec.taskProgress && spec.taskProgress.pending > 0) {
              nextSteps.push(`Read tasks: .spec-workflow/specs/${specName}/tasks.md`);
              nextSteps.push('Edit tasks.md: Change [ ] to [-] for task you start');
              nextSteps.push('Implement the task code');
              nextSteps.push('Edit tasks.md: Change [-] to [x] when completed');
            } else {
              nextSteps.push(`Read tasks: .spec-workflow/specs/${specName}/tasks.md`);
              nextSteps.push('Begin implementation by marking first task [-]');
            }
            break;
          case 'completed':
            nextSteps.push('All tasks completed (marked [x])');
            nextSteps.push('Run tests');
            break;
        }
    
        return {
          success: true,
          message: `Specification '${specName}' status: ${overallStatus}`,
          data: {
            name: specName,
            description: spec.description,
            currentPhase,
            overallStatus,
            createdAt: spec.createdAt,
            lastModified: spec.lastModified,
            phases: phaseDetails,
            taskProgress: spec.taskProgress || {
              total: 0,
              completed: 0,
              pending: 0
            }
          },
          nextSteps,
          projectContext: {
            projectPath,
            workflowRoot: PathUtils.getWorkflowRoot(projectPath),
            currentPhase,
            dashboardUrl: context.dashboardUrl
          }
        };
        
      } catch (error) {
        const errorMessage = error instanceof Error ? error.message : String(error);
        return {
          success: false,
          message: `Failed to get specification status: ${errorMessage}`,
          nextSteps: [
            'Check if the specification exists',
            'Verify the project path',
            'List directory .spec-workflow/specs/ to see available specifications'
          ]
        };
      }
    }
  • The tool definition including name, description, and inputSchema for validating arguments to the spec-status tool.
    export const specStatusTool: Tool = {
      name: 'spec-status',
      description: `Display comprehensive specification progress overview.
    
    # Instructions
    Call when resuming work on a spec or checking overall completion status. Shows which phases are complete and task implementation progress. After viewing status, read tasks.md directly to see all tasks and their status markers ([ ] pending, [-] in-progress, [x] completed).`,
      inputSchema: {
        type: 'object',
        properties: {
          projectPath: { 
            type: 'string',
            description: 'Absolute path to the project root (optional - uses server context path if not provided)'
          },
          specName: { 
            type: 'string',
            description: 'Name of the specification'
          }
        },
        required: ['specName']
      }
    };
  • Registration of the specStatusTool in the array returned by registerTools(), making it available to the MCP server.
    export function registerTools(): Tool[] {
      return [
        specWorkflowGuideTool,
        steeringGuideTool,
        specStatusTool,
        approvalsTool,
        logImplementationTool
      ];
    }
  • Handler dispatch for 'spec-status' tool call in the central handleToolCall switch statement.
    case 'spec-status':
      response = await specStatusHandler(args, context);
      break;
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It describes what the tool does (displays progress overview, shows completion status) and mentions the relationship to tasks.md for detailed task status. However, it doesn't disclose important behavioral aspects like whether this is a read-only operation, what format the output takes, whether it requires specific permissions, or if there are any rate limits or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized with two main sections: a purpose statement and usage instructions. The first sentence clearly states the core function. The instructions section is useful but could be more concise. Overall, most sentences earn their place, though the relationship to tasks.md could be integrated more smoothly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with no annotations and no output schema, the description provides adequate but incomplete context. It explains the purpose and usage scenarios well, but doesn't describe the output format or behavioral constraints. Given the tool's moderate complexity (status overview with parameters), the description should ideally provide more information about what the agent can expect as a result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description doesn't add any meaningful parameter semantics beyond what's in the schema - it doesn't explain how 'projectPath' and 'specName' interact, what format 'specName' should take, or provide examples. The baseline of 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Display comprehensive specification progress overview' with specific verbs ('display', 'shows') and resources ('specification progress overview', 'phases', 'task implementation progress'). It distinguishes from potential siblings by focusing on status overview rather than approvals, logging, or guidance functions. However, it doesn't explicitly differentiate from all sibling tools by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: 'when resuming work on a spec or checking overall completion status.' It also provides guidance on next steps: 'After viewing status, read tasks.md directly to see all tasks and their status markers.' However, it doesn't explicitly state when NOT to use this tool or name specific alternatives among the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Pimzino/spec-workflow-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server