Skip to main content
Glama

작업 오케스트레이터

작업 오케스트레이션 및 관리를 위한 MCP(Model Context Protocol) 서버입니다. 이 도구는 목표를 관리 가능한 작업으로 세분화하고 진행 상황을 추적하는 데 도움을 줍니다.

사용 방법

이상적으로는 LLM이 이 MCP 도구를 언제 사용해야 하는지 이해할 수 있어야 합니다. 하지만 샘플 프롬프트로 다음과 같은 형식을 사용할 수 있습니다.

"새로운 개발 목표를 만들어 줘. 목표는 '사용자 인증 구현'이고 'my-web-app' 저장소를 위한 거야."

문제가 발생하면 상단 'Discussions' 탭에서 새 이슈를 생성하여 알려주세요.

Related MCP server: Jotdown

주요 기능

  • 목표 생성 및 관리

  • 목표를 계층적 작업으로 세분화

  • 작업 완료 상태 추적

  • 하위 작업 지원 및 상위 작업과 하위 작업 간의 종속성 관리

  • LokiDB를 사용한 영구 저장소

로드맵

  • 복잡한 작업/목표 간 상호 종속성 오케스트레이션

  • 목표 삭제

  • 완료 처리

  • 진행 상황 시각화를 위한 UI

API 참조

작업 ID 명명 규칙

작업 ID는 점 표기법(예: "1", "1.1", "1.1.1")을 사용하며, 각 세그먼트는 계층 구조의 레벨을 나타냅니다.

  • 각 새 목표에 대해 최상위 작업 ID는 "1"로 시작하며 순차적으로 증가합니다(예: "1", "2", "3").

  • 하위 작업은 상위 작업 ID에 새 세그먼트를 추가하여 형성된 ID를 가집니다(예: "1.1"은 "1"의 하위 작업).

  • goalIdtaskId의 조합은 고유함이 보장됩니다.

도구

서버는 다음 도구를 제공합니다(build/index.js 기준):

  1. create_goal

    • 새 목표 생성

    • 매개변수:

      {
        description: string;  // The goal description
        repoName: string;     // The repository name associated with this goal
      }
    • 샘플 입력:

      {
        "description": "Implement user authentication",
        "repoName": "example/auth-service"
      }
    • 반환값: { goalId: number }

  2. add_tasks

    • 목표에 여러 작업을 추가합니다. 작업은 계층 구조로 제공될 수 있습니다. 기존 작업의 하위 작업인 경우 parentId 필드를 사용하세요. 이 작업은 트랜잭션 방식으로 처리됩니다. 즉, 배치 내의 모든 작업이 성공하거나 전체 작업이 실패합니다.

    • 매개변수:

      {
        goalId: number; // ID of the goal to add tasks to (number)
        tasks: Array<{
          title: string; // Title of the task (string)
          description: string; // Detailed description of the task (string)
          parentId?: string | null; // Optional parent task ID for tasks that are children of *existing* tasks. Do not use for new subtasks defined hierarchically within this batch.
          subtasks?: Array<any>; // An array of nested subtask objects to be created under this task.
        }>;
      }
    • 샘플 입력:

      {
        "goalId": 1,
        "tasks": [
          {
            "title": "Design database schema",
            "description": "Define tables for users, roles, and permissions",
            "subtasks": [
              {
                "title": "Create ERD",
                "description": "Draw entity-relationship diagram"
              }
            ]
          },
          {
            "title": "Implement user registration",
            "description": "Create API endpoint for new user signup",
            "parentId": "1"
          }
        ]
      }
    • 반환값: HierarchicalTaskResponse[]. HierarchicalTaskResponse 객체는 단순화되어 있으며 createdAt, updatedAt, parentId를 포함하지 않습니다.

  3. remove_tasks

    • 목표에서 여러 작업을 소프트 삭제합니다. 작업은 삭제된 것으로 표시되지만 시스템에 남아 있습니다. 기본적으로 하위 작업이 있는 상위 작업은 하위 작업을 명시적으로 삭제하지 않으면 소프트 삭제할 수 없습니다. 소프트 삭제된 작업은 includeDeletedTasks가 true로 설정되지 않는 한 기본적으로 get_tasks 결과에서 제외됩니다.

    • 매개변수:

      {
        goalId: number; // ID of the goal to remove tasks from
        taskIds: string[]; // IDs of the tasks to remove (array of strings). Task IDs use dot-notation (e.g., "1", "1.1").
        deleteChildren?: boolean; // Whether to delete child tasks along with the parent (boolean). Defaults to false. If false, attempting to delete a parent task with existing subtasks will throw an error.
      }
    • 샘플 입력 (하위 작업 삭제 안 함):

      {
        "goalId": 1,
        "taskIds": ["2", "3"]
      }
    • 샘플 입력 (하위 작업 삭제 포함):

      {
        "goalId": 1,
        "taskIds": ["1"],
        "deleteChildren": true
      }
    • 반환값: { removedTasks: TaskResponse[], completedParents: TaskResponse[] }. TaskResponse 객체는 단순화되어 있으며 createdAt, updatedAt, parentId를 포함하지 않습니다.

  4. get_tasks

    • 목표에 대한 작업을 가져옵니다. 작업 ID는 점 표기법(예: "1", "1.1", "1.1.1")을 사용합니다. includeSubtasks가 지정되면 응답은 계층적 작업 객체를 반환합니다. 그렇지 않으면 createdAt, updatedAt, parentId가 없는 단순화된 작업 객체가 반환됩니다.

    • 매개변수:

      {
        goalId: number; // ID of the goal to get tasks for (number)
        taskIds?: string[]; // Optional: IDs of tasks to fetch (array of strings). If null or empty, all tasks for the goal will be fetched.
        includeSubtasks?: "none" | "first-level" | "recursive"; // Level of subtasks to include: "none" (only top-level tasks), "first-level" (top-level tasks and their direct children), or "recursive" (all nested subtasks). Defaults to "none".
        includeDeletedTasks?: boolean; // Whether to include soft-deleted tasks in the results (boolean). Defaults to false.
      }
    • 샘플 입력:

      {
        "goalId": 1,
        "includeSubtasks": "recursive",
        "includeDeletedTasks": true
      }
    • 반환값: TaskResponse[]. TaskResponse 객체는 단순화되어 있으며 createdAt, updatedAt, parentId를 포함하지 않습니다.

  5. complete_task_status

    • 작업을 완료로 표시합니다. 기본적으로 상위 작업은 완료되지 않은 하위 작업이 있는 경우 완료로 표시할 수 없습니다.

    • 매개변수:

      {
        goalId: number; // ID of the goal containing the tasks
        taskIds: string[]; // IDs of the tasks to update (array of strings). Task IDs use dot-notation (e.g., "1", "1.1").
        completeChildren?: boolean; // Whether to complete all child tasks recursively (boolean). Defaults to false. If false, a task can only be completed if all its subtasks are already complete.
      }
    • 샘플 입력 (하위 작업 완료 안 함):

      {
        "goalId": 1,
        "taskIds": ["1", "2"]
      }
    • 샘플 입력 (하위 작업 완료 포함):

      {
        "goalId": 1,
        "taskIds": ["1"],
        "completeChildren": true
      }
    • 반환값: TaskResponse[]. TaskResponse 객체는 단순화되어 있으며 createdAt, updatedAt, parentId를 포함하지 않습니다.

사용 예시

목표 및 작업 생성

// Create a new goal. Its top-level tasks will start with ID "1".
const goal = await callTool('create_goal', {
  description: 'Implement user authentication',
  repoName: 'user/repo'
});

// Add a top-level task
const task1 = await callTool('add_tasks', {
  goalId: goal.goalId,
  tasks: [
    {
      title: 'Set up authentication middleware',
      description: 'Implement JWT-based authentication'
    }
  ]
});
// task1.addedTasks[0].id will be "1"

// Add a subtask to the previously created task "1"
const task2 = await callTool('add_tasks', {
  goalId: goal.goalId,
  tasks: [
    {
      title: 'Create login endpoint',
      description: 'Implement POST /auth/login',
      parentId: "1"  // ParentId must refer to an *already existing* task ID
    }
  ]
});
// task2.addedTasks[0].id will be "1.1"

작업 상태 관리

// Mark a parent task as complete, which will also complete its children
await callTool('complete_task_status', {
  goalId: 1,
  taskIds: ["1"],
  completeChildren: true
});

// Get all tasks including subtasks recursively
const allTasks = await callTool('get_tasks', {
  goalId: 1,
  includeSubtasks: "recursive"
});

작업 제거

// Attempt to remove a parent task without deleting children (will fail if it has subtasks)
try {
  await callTool('remove_tasks', {
    goalId: 1,
    taskIds: ["1"]
  });
} catch (error) {
  console.error(error.message); // Expected to throw an error if subtasks exist
}

// Remove a parent task and its children
await callTool('remove_tasks', {
  goalId: 1,
  taskIds: ["1"],
  deleteChildren: true
});

개발

사전 요구 사항

  • Node.js 18+

  • pnpm

설정

  1. 의존성 설치:

    pnpm install
  2. 프로젝트 빌드:

    pnpm build
  3. 테스트 실행:

    pnpm test

프로젝트 구조

  • src/ - 소스 코드

    • index.ts - 메인 서버 구현

    • storage.ts - 데이터 지속성 계층

    • types.ts - TypeScript 타입 정의

    • prompts.ts - AI 프롬프트 템플릿

    • __tests__/ - 테스트 파일

라이선스

MIT

Install Server
A
license - permissive license
B
quality
C
maintenance

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/coderexpert123/task-orchestrator'

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