Koskamo

Zovo Project Timeline MCP

A Gantt chart maker and critical path calculator that works inside the chat. It computes schedules using the critical path method, handles business days and holidays, and exports CSV, calendar, and SVG files.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Zovo Project Timeline MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://gantt-timeline.zovo.one/mcp
Vendor documentation

What you can do with it

  • Compute project schedules with critical path method
  • Generate interactive Gantt charts with dependency arrows
  • Export schedules to CSV, .ics calendar, and SVG images
  • Test what-if scenarios for task slippage

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
gantt-timeline 1.0.0
MCP protocol
2025-06-18
Tools
2 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Zovo Project Timeline schedules a task list with the critical path method: earliest and latest start and finish, total and free float, the critical path and the end date, on business days with public holidays or on calendar days. It draws a Gantt chart and exports CSV, calendar (.ics) and SVG files. Use plan_project_timeline for a schedule and compare_timeline_scenarios for what-if slips. It does not store projects, sync with project tools, or assign people.

Tools

2 advertised

plan_project_timeline — Plan project timeline
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants a Gantt chart, project timeline, project schedule or project plan with milestones from a task list, wants to find the critical path and project duration, or asks for early start, early finish, late start, late finish, total float or free float (critical path method). Takes tasks with durations (days or weeks), finish-to-start dependencies with optional lags, optional start-no-earlier-than dates, owners and milestones, plus a start date and a business-day calendar with country public holidays or calendar days. Returns every task's dates and float, the critical path, milestones and the end date, an interactive Gantt chart, and CSV, .ics and SVG downloads. Detects dependency loops and unknown task names. Does not save projects, sync with project tools, track progress, or level resources. Do not use for a single date difference or for daily to-do planning.

plan_project_timeline input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "tasks"
  ],
  "properties": {
    "tasks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 40,
            "description": "Optional short unique id used in depends_on, e.g. \"A\" or \"design\". Defaults to the task name."
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Task name, e.g. \"Design mockups\"."
          },
          "owner": {
            "type": "string",
            "maxLength": 40,
            "description": "Person or team responsible, e.g. \"Ana\". Shown in the chart and CSV."
          },
          "duration": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "maxLength": 30
              }
            ],
            "description": "Length in working days (calendar days in calendar_days mode), e.g. 5. Use 0 for a milestone. For weeks set duration_unit to weeks (e.g. 2) or pass \"2 weeks\"."
          },
          "milestone": {
            "type": "boolean",
            "description": "true for a zero-length checkpoint such as Launch or Sign-off, drawn as a diamond."
          },
          "depends_on": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 90
                },
                "maxItems": 40
              },
              {
                "type": "string",
                "maxLength": 400
              }
            ],
            "description": "Tasks that must finish before this one starts (finish-to-start), by id, name or row number, e.g. [\"A\", \"Design\"]. Add a lag with +N or a lead with -N working days, e.g. \"Design+2\"."
          },
          "duration_unit": {
            "enum": [
              "days",
              "weeks"
            ],
            "type": "string",
            "description": "Unit of duration for this task: days (default) or weeks (5 working days, or 7 days in calendar_days mode)."
          },
          "start_no_earlier_than": {
            "type": "string",
            "maxLength": 40,
            "description": "Earliest allowed start date YYYY-MM-DD, e.g. 2026-11-16 (a fixed kickoff or delivery date)."
          }
        }
      },
      "maxItems": 150,
      "description": "Tasks in any order (1 to 150), e.g. [{\"id\":\"A\",\"name\":\"Design\",\"duration\":5},{\"id\":\"B\",\"name\":\"Build\",\"duration\":10,\"depends_on\":[\"A\"]}]."
    },
    "country": {
      "type": "string",
      "maxLength": 40,
      "description": "Country whose public holidays are skipped in business_days mode, as a 2-letter code or name, e.g. US, GB, DE, PL."
    },
    "calendar": {
      "enum": [
        "business_days",
        "calendar_days"
      ],
      "type": "string",
      "description": "business_days (default) counts Monday to Friday and skips public holidays of country; calendar_days counts every day."
    },
    "start_date": {
      "type": "string",
      "maxLength": 40,
      "description": "Project start date YYYY-MM-DD, e.g. 2026-11-02. Defaults to today. Convert relative dates (\"next Monday\") to a date first."
    },
    "subdivision": {
      "type": "string",
      "maxLength": 40,
      "description": "State or region code for regional holidays, e.g. CA for California or BY for Bavaria."
    },
    "project_name": {
      "type": "string",
      "maxLength": 80,
      "description": "Project title for the chart and files, e.g. \"Website relaunch\"."
    },
    "duration_unit": {
      "enum": [
        "days",
        "weeks"
      ],
      "type": "string",
      "description": "Default unit for every task duration: days (default) or weeks."
    },
    "non_working_dates": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      },
      "maxItems": 200,
      "description": "Extra days off such as a company shutdown, YYYY-MM-DD, e.g. [\"2026-12-28\", \"2026-12-29\"]."
    }
  }
}
plan_project_timeline output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "project_name",
    "start_date",
    "end_date",
    "working_days",
    "calendar_days",
    "calendar",
    "critical_path",
    "milestones",
    "tasks",
    "request",
    "warnings",
    "downloads"
  ],
  "properties": {
    "tasks": {
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "request": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "calendar": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "end_date": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "downloads": {
      "type": "object",
      "properties": {
        "csv": {
          "type": "string"
        },
        "ics": {
          "type": "string"
        },
        "svg": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "milestones": {
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "start_date": {
      "type": "string"
    },
    "project_name": {
      "type": "string"
    },
    "working_days": {
      "type": "number"
    },
    "calendar_days": {
      "type": "number"
    },
    "critical_path": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
plan_project_timeline annotations
{
  "title": "Plan project timeline",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_timeline_scenarios — Compare timeline what-ifs
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user asks what happens to a project schedule if a task slips, takes longer or shorter, or starts later: for example "if Design slips 5 days, when do we finish?" or "does the critical path change?". Takes the same task list and calendar as plan_project_timeline plus 1 to 4 scenarios, each with changes (extra_days, a new duration, or a new start-no-earlier-than date). Returns the baseline and each scenario's end date, the delay in working and calendar days, the new critical path, tasks that became or stopped being critical, and how much of each slip was absorbed by float. Does not change or save the plan. Do not use for the first schedule of a project (use plan_project_timeline).

compare_timeline_scenarios input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "tasks",
    "scenarios"
  ],
  "properties": {
    "tasks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "id": {
            "type": "string",
            "maxLength": 40,
            "description": "Optional short unique id used in depends_on, e.g. \"A\" or \"design\". Defaults to the task name."
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Task name, e.g. \"Design mockups\"."
          },
          "owner": {
            "type": "string",
            "maxLength": 40,
            "description": "Person or team responsible, e.g. \"Ana\". Shown in the chart and CSV."
          },
          "duration": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "maxLength": 30
              }
            ],
            "description": "Length in working days (calendar days in calendar_days mode), e.g. 5. Use 0 for a milestone. For weeks set duration_unit to weeks (e.g. 2) or pass \"2 weeks\"."
          },
          "milestone": {
            "type": "boolean",
            "description": "true for a zero-length checkpoint such as Launch or Sign-off, drawn as a diamond."
          },
          "depends_on": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 90
                },
                "maxItems": 40
              },
              {
                "type": "string",
                "maxLength": 400
              }
            ],
            "description": "Tasks that must finish before this one starts (finish-to-start), by id, name or row number, e.g. [\"A\", \"Design\"]. Add a lag with +N or a lead with -N working days, e.g. \"Design+2\"."
          },
          "duration_unit": {
            "enum": [
              "days",
              "weeks"
            ],
            "type": "string",
            "description": "Unit of duration for this task: days (default) or weeks (5 working days, or 7 days in calendar_days mode)."
          },
          "start_no_earlier_than": {
            "type": "string",
            "maxLength": 40,
            "description": "Earliest allowed start date YYYY-MM-DD, e.g. 2026-11-16 (a fixed kickoff or delivery date)."
          }
        }
      },
      "maxItems": 150,
      "description": "Tasks in any order (1 to 150), e.g. [{\"id\":\"A\",\"name\":\"Design\",\"duration\":5},{\"id\":\"B\",\"name\":\"Build\",\"duration\":10,\"depends_on\":[\"A\"]}]."
    },
    "country": {
      "type": "string",
      "maxLength": 40,
      "description": "Country whose public holidays are skipped in business_days mode, as a 2-letter code or name, e.g. US, GB, DE, PL."
    },
    "calendar": {
      "enum": [
        "business_days",
        "calendar_days"
      ],
      "type": "string",
      "description": "business_days (default) counts Monday to Friday and skips public holidays of country; calendar_days counts every day."
    },
    "scenarios": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "changes"
        ],
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 40,
            "description": "Short scenario name, e.g. \"Design slips a week\"."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "task"
              ],
              "properties": {
                "task": {
                  "type": "string",
                  "maxLength": 90,
                  "description": "Task id or name to change, e.g. \"Design\"."
                },
                "duration": {
                  "type": "number",
                  "description": "New duration in days instead of extra_days, e.g. 12."
                },
                "extra_days": {
                  "type": "number",
                  "description": "Working days added to the task's duration (a slip), e.g. 5; negative to shorten it, e.g. -2."
                },
                "start_no_earlier_than": {
                  "type": "string",
                  "maxLength": 40,
                  "description": "New earliest start date YYYY-MM-DD, e.g. 2026-11-30 (a late delivery)."
                }
              }
            },
            "maxItems": 10,
            "description": "Changes to apply, e.g. [{\"task\":\"Design\",\"extra_days\":5}]."
          }
        }
      },
      "maxItems": 4,
      "description": "1 to 4 what-if scenarios compared with the baseline plan, e.g. [{\"label\":\"Design +5\",\"changes\":[{\"task\":\"Design\",\"extra_days\":5}]}]."
    },
    "start_date": {
      "type": "string",
      "maxLength": 40,
      "description": "Project start date YYYY-MM-DD, e.g. 2026-11-02. Defaults to today. Convert relative dates (\"next Monday\") to a date first."
    },
    "subdivision": {
      "type": "string",
      "maxLength": 40,
      "description": "State or region code for regional holidays, e.g. CA for California or BY for Bavaria."
    },
    "project_name": {
      "type": "string",
      "maxLength": 80,
      "description": "Project title for the chart and files, e.g. \"Website relaunch\"."
    },
    "duration_unit": {
      "enum": [
        "days",
        "weeks"
      ],
      "type": "string",
      "description": "Default unit for every task duration: days (default) or weeks."
    },
    "non_working_dates": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      },
      "maxItems": 200,
      "description": "Extra days off such as a company shutdown, YYYY-MM-DD, e.g. [\"2026-12-28\", \"2026-12-29\"]."
    }
  }
}
compare_timeline_scenarios output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "project_name",
    "baseline",
    "scenarios",
    "latest_finish",
    "warnings"
  ],
  "properties": {
    "baseline": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "scenarios": {
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      }
    },
    "project_name": {
      "type": "string"
    },
    "latest_finish": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
compare_timeline_scenarios annotations
{
  "title": "Compare timeline what-ifs",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

gantt-timeline-widget — Zovo Project Timeline view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo Project Timeline.

gantt-timeline-widget URI
ui://widget/gantt-timeline-v4-1.0.0-c0101539189a510e3502b2f2384207b0190b27a21ffb76118f05bd10b04fd424.html

MIME type: text/html;profile=mcp-app

gantt-timeline-widget-legacy — Zovo Project Timeline view (previous versions)

Advertised by the server during the last successful anonymous check.

gantt-timeline-widget-legacy URI template
ui://widget/gantt-timeline-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
687 ms
95th percentile latency
687 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 687 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http zovo-project-timeline-mcp https://gantt-timeline.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add zovo-project-timeline-mcp --url https://gantt-timeline.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zovo-project-timeline-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zovo-project-timeline-mcp": {
      "url": "https://gantt-timeline.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zovo-project-timeline-mcp": {
      "type": "streamableHttp",
      "url": "https://gantt-timeline.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-project-timeline-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-project-timeline-mcp": {
      "type": "http",
      "url": "https://gantt-timeline.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http zovo-project-timeline-mcp https://gantt-timeline.zovo.one/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "zovo-project-timeline-mcp": {
      "url": "https://gantt-timeline.zovo.one/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "zovo-project-timeline-mcp": {
      "serverUrl": "https://gantt-timeline.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Zovo Project Timeline MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.