Ganty MCP

Gantt chart SaaS with server-side critical path and dependency-aware shift-impact tools, plus CRUD.

Should I use this

Quality & Safety

A
Description quality
99%
Schema completeness
87%
Naming quality
99%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,880Tokens (tool definitions)
~1.0 KBTypical response size
Moderate attention impact (1.47% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mcp-server": {
      "url": "https://ganty.app/api/mcp"
    }
  }
}

Remote endpoints

https://ganty.app/api/mcpstreamable-http

What it can do

Tool inventory

Tools (15)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_workspaces

Get all workspaces the authenticated user is a member of.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
🟢list_projects(workspaceId)

List all projects in a workspace (excluding archived).

Input Schema

{
  "type": "object",
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Workspace ID (UUID)"
    }
  },
  "required": [
    "workspaceId"
  ],
  "additionalProperties": false
}
🟡create_project(workspaceId, name, description, color, startDate, ...)

Create a new project in a workspace. Returns the created project. Subject to plan-based project count limits.

Input Schema

{
  "type": "object",
  "properties": {
    "workspaceId": {
      "type": "string",
      "description": "Workspace ID (UUID)"
    },
    "name": {
      "type": "string",
      "description": "Project name"
    },
    "description": {
      "type": "string"
    },
    "color": {
      "type": "string",
      "description": "Hex color (e.g. #3b82f6). Defaults to blue."
    },
    "startDate": {
      "type": "string",
      "description": "YYYY-MM-DD. Defaults to today."
    },
    "endDate": {
      "type": "string",
      "description": "YYYY-MM-DD. Optional."
    }
  },
  "required": [
    "workspaceId",
    "name"
  ],
  "additionalProperties": false
}
🔴delete_project(projectId)

Permanently delete a project. All tasks, milestones, and dependencies inside the project are also removed. This cannot be undone.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "additionalProperties": false
}
🟢list_tasks(projectId, search, status, assigneeId)

List tasks in a project. Supports optional filtering by name (search), status, and assignee.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string",
      "description": "Project ID (UUID)"
    },
    "search": {
      "type": "string",
      "description": "Filter task name by case-insensitive substring"
    },
    "status": {
      "type": "string",
      "enum": [
        "not_started",
        "in_progress",
        "done",
        "on_hold"
      ]
    },
    "assigneeId": {
      "type": "string",
      "description": "Filter by assignee profile ID"
    }
  },
  "required": [
    "projectId"
  ],
  "additionalProperties": false
}
🟢get_task(taskId)

Get detailed information about a single task, including assignees and dependencies.

Input Schema

{
  "type": "object",
  "properties": {
    "taskId": {
      "type": "string",
      "description": "Task ID (UUID)"
    }
  },
  "required": [
    "taskId"
  ],
  "additionalProperties": false
}
🟢list_milestones(projectId)

List milestones in a project (key dates such as launch or review gates).

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string"
    }
  },
  "required": [
    "projectId"
  ],
  "additionalProperties": false
}
🟡create_milestone(projectId, name, date, color)

Add a milestone (key date) to a project.

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "date": {
      "type": "string",
      "description": "YYYY-MM-DD"
    },
    "color": {
      "type": "string",
      "description": "Hex color (defaults to #f59e0b)"
    }
  },
  "required": [
    "projectId",
    "name",
    "date"
  ],
  "additionalProperties": false
}
🟡create_task(projectId, name, startDate, endDate, description, ...)

Create a new task in a project. Dates must be in YYYY-MM-DD format. End date is exclusive (a 1-day task has end = start + 1 day).

Input Schema

{
  "type": "object",
  "properties": {
    "projectId": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "startDate": {
      "type": "string",
      "description": "YYYY-MM-DD"
    },
    "endDate": {
      "type": "string",
      "description": "YYYY-MM-DD (exclusive end)"
    },
    "description": {
      "type": "string"
    },
    "parentId": {
      "type": "string",
      "description": "Parent task ID for hierarchy"
    },
    "assigneeId": {
      "type": "string",
      "description": "Profile ID of the assignee"
    },
    "progress": {
      "type": "number",
      "minimum": 0,
      "maximum": 100
    },
    "status": {
      "type": "string",
      "enum": [
        "not_started",
        "in_progress",
        "done",
        "on_hold"
      ]
    },
    "color": {
      "type": "string",
      "description": "Hex color (e.g. #3b82f6)"
    }
  },
  "required": [
    "projectId",
    "name",
    "startDate",
    "endDate"
  ],
  "additionalProperties": false
}
🟡update_task(taskId, name, description, startDate, endDate, ...)

Update fields of an existing task. Only provided fields will be modified.

Input Schema

{
  "type": "object",
  "properties": {
    "taskId": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "startDate": {
      "type": "string",
      "description": "YYYY-MM-DD"
    },
    "endDate": {
      "type": "string",
      "description": "YYYY-MM-DD"
    },
    "progress": {
      "type": "number",
      "minimum": 0,
      "maximum": 100
    },
    "status": {
      "type": "string",
      "enum": [
        "not_started",
        "in_progress",
        "done",
        "on_hold"
      ]
    },
    "color": {
      "type": "string"
    },
    "assigneeId": {
      "type": [
        "string",
        "null"
      ],
      "description": "null to unassign"
    }
  },
  "required": [
    "taskId"
  ],
  "additionalProperties": false
}
🟡set_task_progress(taskId, progress)

Update the progress percentage of a task (0-100). Status is auto-derived: 0=not_started, 1-99=in_progress, 100=done.

Input Schema

{
  "type": "object",
  "properties": {
    "taskId": {
      "type": "string"
    },
    "progress": {
      "type": "number",
      "minimum": 0,
      "maximum": 100
    }
  },
  "required": [
    "taskId",
    "progress"
  ],
  "additionalProperties": false
}
🟡add_dependency(predecessorId, successorId, lagDays)

Add a finish-to-start dependency between two tasks in the same project.

Input Schema

{
  "type": "object",
  "properties": {
    "predecessorId": {
      "type": "string",
      "description": "Task that must finish first"
    },
    "successorId": {
      "type": "string",
      "description": "Task that can start after predecessor finishes"
    },
    "lagDays": {
      "type": "number",
      "description": "Optional lag in days after predecessor finishes"
    }
  },
  "required": [
    "predecessorId",
    "successorId"
  ],
  "additionalProperties": false
}
🔴delete_task(taskId)

Delete a task. Child tasks and dependencies are removed as well.

Input Schema

{
  "type": "object",
  "properties": {
    "taskId": {
      "type": "string"
    }
  },
  "required": [
    "taskId"
  ],
  "additionalProperties": false
}
🟢get_critical_path(project_id, as_of_date, business_days)

Calculate the critical path of a project on the Ganty side and return it as data (don't ask the model to reason over raw task lists). Uses forward/backward CPM with progress-aware remaining duration. Returns critical_path tasks in order, per-task earliest/latest start/finish + slack, project_end_date, and total_duration_days. v1 limitations: Finish-to-Start dependencies only (Ganty has no other types), calendar days by default (business_days=true skips Sat/Sun but no holiday table), ignores multi-period segments, no resource calendars. Returns { error: 'cyclic_dependency', cycle } if a cycle is detected.

Input Schema

{
  "type": "object",
  "properties": {
    "project_id": {
      "type": "string",
      "description": "Project ID (UUID)"
    },
    "as_of_date": {
      "type": "string",
      "description": "YYYY-MM-DD. Start point for projecting remaining work. Defaults to today."
    },
    "business_days": {
      "type": "boolean",
      "description": "If true, skip Saturday and Sunday in duration calculations. National holidays are still treated as working days (v1 has no holiday table). Defaults to false."
    }
  },
  "required": [
    "project_id"
  ],
  "additionalProperties": false
}
🟡reschedule_and_propagate(task_id, shift, new_start_date, mode, respect_dependencies, ...)

Compute the downstream impact of shifting a single task. Default is dry_run (no DB writes); set mode='commit' to actually persist the changes. Cascades forward only (no pull): successors are pushed only if their predecessor's new end + lag would violate their current start. Tasks with progress=100 are treated as pinned; pass pinned_task_ids for additional pins. When a pin would be violated, the change is recorded in 'conflicts' and not propagated further. In mode='commit', if any conflicts exist nothing is written (all-or-nothing transaction). Same v1 limitations as get_critical_path: FS only, calendar days by default, no holiday table, ignores multi-period segments.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "type": "string",
      "description": "Task ID (UUID) to shift"
    },
    "shift": {
      "type": "string",
      "description": "Relative shift like '+3d' (push back) or '-2d' (pull earlier). Specify exactly one of shift or new_start_date."
    },
    "new_start_date": {
      "type": "string",
      "description": "Absolute new start date as YYYY-MM-DD. Specify exactly one of shift or new_start_date."
    },
    "mode": {
      "type": "string",
      "enum": [
        "dry_run",
        "commit"
      ],
      "description": "dry_run (default): compute and return; do not modify DB. commit: write to DB in a single transaction, but only if no conflicts. Audit logged on commit."
    },
    "respect_dependencies": {
      "type": "boolean",
      "description": "If false, only the named task moves; successors are not cascaded. Default true."
    },
    "pinned_task_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Additional task IDs to treat as pinned (in addition to progress=100 tasks)."
    },
    "business_days": {
      "type": "boolean",
      "description": "If true, skip Sat/Sun in duration math. Defaults to false."
    }
  },
  "required": [
    "task_id"
  ],
  "additionalProperties": false
}

Recommended Prompts

explore_workflow
List available [items], then get details for each one using Ganty MCP
Expected tools: list_workspacesget_task
fetch_info
Fetch [information type] using Ganty MCP
Expected tools: get_task
browse_collection
Show me the [collection] from Ganty MCP
Expected tools: list_workspaces
retrieve_data
Get details about [item] from Ganty MCP
Expected tools: get_task
list_items
List all [items] available in Ganty MCP
Expected tools: list_workspaces

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded15 tools
verifiedversion not recorded15 tools
verifiedversion not recorded15 tools
verifiedversion not recorded15 tools
verifiedversion not recorded15 tools
verifiedversion not recorded15 tools