Kantata MCP by usefulapi

Read workspaces, tasks and time entries, create and update tasks, and log time in Kantata.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
89%
Naming quality
78%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'kantata_list_timesheet_submissions' name length outside 3-30 rangein kantata_list_timesheet_submissions

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,689Tokens (tool definitions)
~1.8 KBTypical response size
Significant attention impact (2.10% 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": {
    "kantata": {
      "url": "https://kantata.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://kantata.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (12)

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

Return the Kantata OX user that the token belongs to, with name, email, role and account membership. Good first call to confirm the connection. Kantata API: GET /api/v1/users/me.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_list_users(search, page, per_page)

List the users visible to the token, optionally filtered by a search string. Use the returned user ids in other tools. Kantata API: GET /api/v1/users.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "description": "Match on name or email.",
      "type": "string"
    },
    "page": {
      "description": "Page number for pagination (default 1).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page (default 20).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_list_organizations(matching, type, page, per_page)

List client and partner organizations visible to the token. Kantata API: GET /api/v1/organizations.

Input Schema

{
  "type": "object",
  "properties": {
    "matching": {
      "description": "Match on the organization name.",
      "type": "string"
    },
    "type": {
      "description": "Organization type as Kantata OX stores it (for example, a client type).",
      "type": "string"
    },
    "page": {
      "description": "Page number for pagination (default 1).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page (default 20).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_list_workspaces(search, include_archived, page, per_page)

List workspaces (projects) visible to the token, with title, dates, status and participants. Kantata API: GET /api/v1/workspaces.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "description": "Match on the workspace title.",
      "type": "string"
    },
    "include_archived": {
      "description": "Include archived workspaces (default false).",
      "type": "boolean"
    },
    "page": {
      "description": "Page number for pagination (default 1).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page (default 20).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_get_workspace(workspace_id)

Get one workspace (project) by id, with title, dates, budget fields and participants. Kantata API: GET /api/v1/workspaces/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "pattern": "^\\d+$",
      "description": "The workspace id (from kantata_list_workspaces)."
    }
  },
  "required": [
    "workspace_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_list_stories(workspace_id, search, assigned_to_current_user, completed, uncompleted, ...)

List stories (tasks) with title, status, due date, assignees and completion. Filter by workspace, assignee, completion or due dates. Kantata API: GET /api/v1/stories.

Input Schema

{
  "type": "object",
  "properties": {
    "workspace_id": {
      "description": "Only stories in this workspace id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "search": {
      "description": "Match on the story title.",
      "type": "string"
    },
    "assigned_to_current_user": {
      "description": "true = only stories assigned to the token's user.",
      "type": "boolean"
    },
    "completed": {
      "description": "true = only completed stories.",
      "type": "boolean"
    },
    "uncompleted": {
      "description": "true = only open stories.",
      "type": "boolean"
    },
    "due_after": {
      "description": "Only stories due after this date (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "due_before": {
      "description": "Only stories due before this date (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "updated_after": {
      "description": "Only stories updated after this date (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "page": {
      "description": "Page number for pagination (default 1).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page (default 20).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_get_story(story_id)

Get one story (task) by id, with its description, dates, assignees, status and checklist. Kantata API: GET /api/v1/stories/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "story_id": {
      "type": "string",
      "pattern": "^\\d+$",
      "description": "The story id (from kantata_list_stories)."
    }
  },
  "required": [
    "story_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kantata_create_story(workspace_id, title, description, start_date, due_date, ...)

Create a story (task) in a workspace. Writes data: creates a new task each call. Kantata API: POST /api/v1/stories.

Input Schema

{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The workspace (project) id, from kantata_list_workspaces."
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "description": "The task title."
    },
    "description": {
      "description": "The task description.",
      "type": "string"
    },
    "start_date": {
      "description": "Start date (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "due_date": {
      "description": "Due date (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "parent_id": {
      "description": "Parent story id, to make this a subtask.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "assignee_ids": {
      "description": "User ids to assign.",
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    }
  },
  "required": [
    "workspace_id",
    "title"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kantata_update_story(story_id, title, description, start_date, due_date)

Change the title, description or dates of an existing story (task). Only the fields you pass change. Writes data. Kantata API: PUT /api/v1/stories/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "story_id": {
      "type": "string",
      "pattern": "^\\d+$",
      "description": "The story id to change."
    },
    "title": {
      "description": "New title.",
      "type": "string",
      "minLength": 1
    },
    "description": {
      "description": "New description.",
      "type": "string"
    },
    "start_date": {
      "description": "New start date (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "due_date": {
      "description": "New due date (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    }
  },
  "required": [
    "story_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_list_time_entries(workspace_id, created_by, on_my_account, date_performed_between, page, ...)

List logged time entries with minutes, date performed, user, story and billable flag. Filter by workspace, user or date range. Kantata API: GET /api/v1/time_entries.

Input Schema

{
  "type": "object",
  "properties": {
    "workspace_id": {
      "description": "Only entries in this workspace id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "created_by": {
      "description": "Only entries created by this user id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "on_my_account": {
      "description": "true = only entries on the token's account.",
      "type": "boolean"
    },
    "date_performed_between": {
      "description": "Work dates from and to, as yyyy-mm-dd:yyyy-mm-dd.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}:\\d{4}-\\d{2}-\\d{2}$"
    },
    "page": {
      "description": "Page number for pagination (default 1).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page (default 20).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kantata_list_timesheet_submissions(workspace_id, user_ids, statuses, start_date, end_date, ...)

List timesheet submissions with their status and period, filtered by workspace, user or dates. Kantata API: GET /api/v1/timesheet_submissions.

Input Schema

{
  "type": "object",
  "properties": {
    "workspace_id": {
      "description": "Only submissions in this workspace id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "user_ids": {
      "description": "Comma-separated user ids.",
      "type": "string"
    },
    "statuses": {
      "description": "Comma-separated submission statuses as Kantata OX stores them.",
      "type": "string"
    },
    "start_date": {
      "description": "Period start (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "end_date": {
      "description": "Period end (yyyy-mm-dd).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "page": {
      "description": "Page number for pagination (default 1).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "per_page": {
      "description": "Results per page (default 20).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kantata_log_time(workspace_id, date_performed, time_in_minutes, story_id, notes, ...)

Log a time entry against a workspace, optionally a story. Writes data: creates a new entry each call, so do not retry it blindly. Kantata API: POST /api/v1/time_entries.

Input Schema

{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The workspace (project) id, from kantata_list_workspaces."
    },
    "date_performed": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "The date the work was done (yyyy-mm-dd)."
    },
    "time_in_minutes": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Minutes worked."
    },
    "story_id": {
      "description": "Story id to log against (optional).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "notes": {
      "description": "Free-text note for the entry.",
      "type": "string"
    },
    "billable": {
      "description": "Whether the time is billable.",
      "type": "boolean"
    }
  },
  "required": [
    "workspace_id",
    "date_performed",
    "time_in_minutes"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded12 tools