Skip to content

Reading Data

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

For the current user’s actionable work, call call_public_api with GET /tasks/my. Draft-project assignments stay out of that list and its totals. list_tasks and list_schedule_entries include planning work so you can review it before activation. See Tasks API and Scheduling API.

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 }
}

For the roles shown beside project tasks, use call_public_api with GET /projects/<project-id>/details. The response includes selected project role names and staff role titles for people assigned to tasks. A read does not add project membership or change saved rates. See project details for the fields and the project-role update request. This generic bridge remains unavailable to client-scoped sessions.

For a client-scoped session, list_projects and get_project only read projects for the selected active client. An Internal session only reads projects without a client. Search, job-number lookup, counts and limits use the same boundary. Membership in another project does not widen it. An out-of-scope detail returns project: null; an inactive or removed client relationship refuses the call.

The same boundary applies to list_tasks, get_task, list_task_counts, list_milestones, list_project_members, list_project_contributors, list_client_contributors, list_task_comments, list_project_comments, list_project_history, list_schedule_entries, list_time_entries, get_project_cost, list_project_costs and get_project_assets. Counts, time groups and cost totals include only matching projects before limits are applied. A known task or cost detail outside the scope returns null; lists are empty. Project files stay within the selected client even when your agency owns the file. Cost and file reads still require their usual permissions.

A project moved to another client stops appearing on later reads with the same connection. Supplying another client or organisation in tool arguments cannot expand the connection’s scope. Unscoped user-generated connections retain their ordinary access and can use the public API bridge.

list_projects uses project access and active organisation membership. Freelancers can use it without permission to browse assets. Client staffing lists and explicit project membership determine which projects appear; budget figures still require financial visibility. Staffing and permission changes apply to later calls with the same token.

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)

Project record summaries follow financial permissions. If a form contains a budget mapping that the connected user cannot read, its completeness is null and completenessFinanciallyRedacted is true. Treat the status as unavailable. See the record response contract.

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 across the organisation in one call. Assignment, estimate, and planned dates can be null. Use scheduled: false for backlog work without a complete planned window, overdue: true for open tasks past their due date (each task then reports daysOverdue), compact: true for a short record per task, and groupBy: "assignee" to get one group per person with taskCount and overdueCount. Every task includes assigneeName. Full records also include budgetLineId (UUID or null when unmapped); compact records omit it.projectId, assigneeId, status, scheduled, openOnly, overdue, completedSince, dueOn, compact, groupBy, limit (default 200, max 1000)
get_taskGet one task by id, including nullable budgetLineId without budget amounts.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)
get_jobGet one job by id: status, progress, and, for planning jobs, the projectId once the draft project exists. Use it to poll a job started by start_brief_planning or create_from_capture. The job’s error detail is returned only to the person who started it.id
ToolPurposeKey arguments
list_schedule_entriesPlanned task time slots, including tentative and held capacity. Each row includes projectStatus and bookingState. Personal calendars include only confirmed entries outside draft. 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)
get_work_patternHow many hours a person works on each weekday, plus the history of earlier patterns and the organisation’s default day. Returns null when nobody has set a pattern, which means every weekday uses the organisation default. Defaults to the requesting user; reading another person’s requires schedule view access.userId (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 / read_document / search_assetsList or search files, read a known file, or extract document text. Private-file reads, listings and search follow the connected user’s current source access. Expense receipts also require the claim’s permissions. See MCP Tools.varies
get_indexing_healthWhether the files the caller can search are actually indexed: counts by status and index quality (content vs metadata only), scanned documents awaiting OCR, and the last background sweep. Organisation-wide, or one collection.collectionId (optional)

For invoice reads, check kind before treating amountDue as debt. Credit notes carry document amounts, return zero daysOverdue in invoice lists and are never eligible for payment. get_payment_status returns nothing_due for them. See Invoices and credit notes.

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:

For SVG files, read_file and read_file_by_job include isBinary: true means base64 content, false means raw XML. fileSize counts decoded bytes. See SVG file content for downloads and reuse.

get_profitability honours project/client financial grants when you name the subject. It returns the same permitted metric cells as the public metrics API, including cost-only amounts. Client-bound sessions stay within their client; job-bound sessions cannot use this report. See scoped profitability for the result and validation contract.

Supplier-uploaded invoice originals and proposals follow current cost access to all linked purchase records, or organisation cost access when unattached. Linked acceptance needs readable source costs. Named file readers, discovery and the public API bridge preserve these restrictions. See Supplier invoice originals and Supplier upload cost scope.

Supplier-payment recording and reversal keep action permission separate from amount visibility. Response totals need all contributing bill cost scopes; recording also checks selected bills that receive no allocation. Remainders need organisation cost access. Authorised writes can succeed with payment identity and hidden amounts. See supplier payment visibility.

Inclusive credit lines returned by get_invoice or call_public_api keep the original line’s remaining net and tax allocation. The selected amount still includes tax. Partial credits can split net and tax differently from a fresh calculation; read the returned figures. Allocation amounts follow price access. See credit-note entry.

Named record tools accept your generated connection. Client-scoped record reads remain within the selected active client; Internal scope selects projects without a client. Form definitions and record changes require an unscoped connection. See project record tools.