Skip to content

Reading Data

This page covers how to read Runnit data: projects, users, tasks, clients, briefs, jobs, schedules, costs, and more.

Connect over the MCP server with a user-scoped token, then call the read tools. Every tool is:

  • Organisation-scoped to the connected user: results reflect that user’s permissions. A forbidden or empty result is expected when the user lacks access; it is not an error to retry.
  • Read-only and returns safe fields only: never passwords, tokens, embeddings, or rate-card internals.

Authentication follows the two modes in MCP Tools: bearer-header clients omit apiKey; payload-based workflows pass the user-scoped token as apiKey on every call.

{
"tool": "list_projects",
"arguments": { "status": "active", "limit": 50 }
}
ToolPurposeKey arguments
list_projectsList projects in the organisation. Pass jobNumber to find one project by its exact job number (case-insensitive, includes archived projects), or search to match part of a project name or job number.status, jobNumber, search, includeArchived, limit (default 100, max 500)
get_projectGet one project by id.id
list_project_membersMembers assigned to a project.projectId, limit (default 200, max 500)
list_milestonesProject milestones.projectId, limit (default 200, max 1000)
list_project_historyA project’s activity/changelog feed.projectId, taskId, categories[], eventTypes[], limit (default 100, max 200)
list_project_commentsAll discussion on a project, newest first: the project’s own chat thread plus the comments on its tasks. Each row has source (project or task), body, authorType, user, createdAt, and task details on task rows.projectId, scope (all, project, tasks), limit (default 100, max 500)
ToolPurposeKey arguments
list_master_projectsList master projects.status, clientOrganizationId, limit (default 100, max 500)
get_master_projectGet one master project by id.id
ToolPurposeKey arguments
list_tasksList project tasks. Assignment, estimate, and planned dates can be null. Use scheduled: false for backlog work without a complete planned window.projectId, assigneeId, status, scheduled, openOnly, completedSince, dueOn, limit (default 200, max 1000)
get_taskGet one task by id.id
list_task_countsPer-project task totals in one call (avoids per-project loops).projectIds[]
list_task_commentsComments for a task, or every comment across a project. Comments are the entries in each task’s chat thread. For a project’s whole discussion, including its own project-level chat, use list_project_comments.one of taskId / projectId, limit (default 100, max 500)
list_table_columnsThe custom task-table columns a project sees, including columns inherited from its client or the organisation. Task values for these columns sit in task metadata under tableValues, keyed by column key. Also reports defaultColumns and defaultColumnsSource: the default visible column set configured for the project’s table (from its kanban board, else the organisation setting), or null.projectId
ToolPurposeKey arguments
list_usersOrganisation members (team).role, isActive, limit (default 200, max 1000)
get_userGet one user by id.userId
list_clientsClient organisations you have a relationship with. With no status filter (or active), the first entry is the virtual internal client (id: "internal", isInternal: true): your own organisation, used for internal work.relationshipStatus, limit (default 200, max 1000)
get_clientGet one client organisation. Your own organisation’s id resolves to the internal client (isInternal: true).clientOrganizationId
list_client_teamThe client’s default staffing pool for AI and initial planning. When hasRestrictions is true, start with the returned members. An existing project’s owner and active project members remain eligible for that project, including project-only additions.clientOrganizationId
ToolPurposeKey arguments
list_briefsBrief builder sessions.isComplete, isArchived (default false), clientOrganizationId, masterProjectId, limit (default 100, max 500)
get_briefGet one brief (includes its current brief markdown).id
list_jobsBackground/agent jobs.status, jobType, userId, projectId, since, until, limit (default 100, max 500)
ToolPurposeKey arguments
list_schedule_entriesPlanned task time slots (calendar/Gantt/utilisation). Returns exact totalCount, totalMinutes, totalHours and a truncated flag for the whole filtered set, plus server-side groups when you pass groupBy.taskId, userId, projectId, since, until, limit (default 500, max 5000), groupBy (day, week, month, user, project)
check_team_availabilityReal free capacity for users over a date range, evaluated against their existing bookings across all projects (8 working hours per weekday). Organisation closure dates and fully blocked days are excluded from free capacity, partially blocked days subtract their blocked hours, and each user’s blocked dates in the window are reported: fully blocked days as blockedDates and partial days as partialBlockedDates ({date, hoursUnavailable, remainingHours}). Reports availability status, scheduled hours, free hours vs requiredHours, and conflicts per user.startDate, endDate (both YYYY-MM-DD, required), requiredHours, userIds, projectId (evaluates that project’s team; omit both for the whole organisation)
get_blocked_datesDate ranges users have blocked out as unavailable (leave, appointments). Each row carries hoursUnavailable: null means the whole day is blocked and the scheduler never books work on it; a number means only that many hours per day are unavailable. Defaults to the requesting user; reading other users’ blocks requires schedule view access. Free-text reasons are returned only for the requesting user’s own blocks unless the caller has schedule management access.userIds[], startDate, endDate (window, both YYYY-MM-DD, optional)
list_time_entriesLogged time: the source for hours completed/timesheets. Returns exact totalCount, totalMinutes, totalHours and a truncated flag for the whole filtered set, plus server-side groups when you pass groupBy.projectId, taskId, userId, since, until, billableOnly, status, limit (default 500, max 5000), groupBy (day, week, month, user, project, task)
get_project_costAccurate cost rollup for one project (totals + by user/role/month).projectId, since, until
list_project_costsPer-project cost summary across the organisation. totals, totalCount, and truncated cover every matching project even when the rows array is paged.since, until, clientOrganizationId, status, limit (default 200, max 1000)
ToolPurposeKey arguments
list_files / read_file / search_assetsRead files and assets. See MCP Tools.varies

If you’d rather call HTTP endpoints directly, the public REST API at /api/v1 covers projects, tasks, master projects, organisations, clients, users, reports, schedules, closure and blocked dates, collections, assets, permissions, and search, authenticated with the same rnk_ API keys that work here.

A few specialised capabilities also have their own documented endpoints: