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
Findings (1)
- LOWin kantata_list_timesheet_submissions
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (12)
🟢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
Evidence