Model Context Protocol

Flowtly MCP

Connect Claude, ChatGPT, or Claude Code to Flowtly and work with your data in plain language — read your finances and projects, and take a curated set of actions.

Connect

claude mcp add --transport http flowtly https://mcp.flowtly.eu/mcp

Or add https://mcp.flowtly.eu/mcp as a connector in Claude or ChatGPT and sign in to Flowtly. OAuth scopes access to a single organization; every call forwards your own Flowtly token, so the backend enforces your permissions — the connector grants no extra rights.

Tools 153 · 91 read · 62 write · generated live

Finance & accountancy

Invoices, transactions, contracts, suppliers and the ledger primitives.

bankAccounts_create write

Create a bank account (type, name, currency, defaultImportFormat required). Write.

bank string | null
type* string
default boolean
hidden boolean
name* string
number string | null
prefix string | null
currency* string | null
defaultImportFormat* string
bankAccounts_get read

Get one bank account by id — name, currency, bank, and the format its statements are imported in.

id* string | integer
bankAccounts_list read

List the org's bank accounts. Filter by bank, or set hidden to include archived ones. Use it to resolve the bankAccount id that transactions_list filters on.

bank any
hidden any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
bankAccounts_update write

Update a bank account by id. Write.

bank string | null
type string
default boolean
hidden boolean
name string
number string | null
prefix string | null
currency string | null
defaultImportFormat string
id* string | integer
contracts_create write

Create a contract. Write.

name string
direction string
counterparty string | null
project string | null
currency string
totalAmount string | null
dateFrom string | null
dateTo string | null
cyclic boolean
Marks the contract as a recurring/ongoing relationship rather than a one-shot deal — e.g. a monthly retainer, ongoing security service, or indefinite tenancy. When true, dateTo is conventionally left null (open-ended) until the contract is actually terminated. The flag is advisory: the system doesn't auto-generate PaymentScheduleLines from a cadence; consumers (UI badges, calendar rendering) decide how to present cyclic contracts.
notes string | null
description string | null
signatureEnvelopeId string | null
signatureStatus string | null
signatureSentAt string | null
signatureCompletedAt string | null
contracts_delete write

Delete a contract by id. Write.

id* string | integer
contracts_get read

Get one contract by id — parties, direction, value, cyclic terms and dates.

id* string | integer
contracts_list read

List contracts. Filter by direction (incoming / outgoing), counterparty, project, cyclic, name or tags. Use it to resolve the contract id that contracts_paymentScheduleLines reads and that deals_win can link a won deal to.

direction any
project any
counterparty any
cyclic any
name string
tags string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
contracts_paymentScheduleLines read

List a contract's payment schedule — the instalments it is expected to be invoiced or paid in. Pass contractId from contracts_list. This is the plan, not the actuals: compare it against transactions_list to see what has really been paid.

contract any
contract.budgetContracts.budget any
contractId* string | integer
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
contracts_update write

Update a contract by id. Write.

name string
direction string
counterparty string | null
project string | null
currency string
totalAmount string | null
dateFrom string | null
dateTo string | null
cyclic boolean
Marks the contract as a recurring/ongoing relationship rather than a one-shot deal — e.g. a monthly retainer, ongoing security service, or indefinite tenancy. When true, dateTo is conventionally left null (open-ended) until the contract is actually terminated. The flag is advisory: the system doesn't auto-generate PaymentScheduleLines from a cadence; consumers (UI badges, calendar rendering) decide how to present cyclic contracts.
notes string | null
description string | null
signatureEnvelopeId string | null
signatureStatus string | null
signatureSentAt string | null
signatureCompletedAt string | null
id* string | integer
costGroups_create write

Create a cost group / cost center (name + type required). Write.

type* string
name* string
description string | null
icon string | null
accoutancy_reference string | null
costGroups_list read

List cost groups / cost centres — the buckets that costs, suppliers and incoming invoices are filed under. Use it to resolve the costGroup id that suppliers_create requires and that incoming-invoice suggestions propose.

order.name string
order.description string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
costGroups_update write

Update a cost group / cost center's name or type by id. Write.

type string
name string
description string | null
icon string | null
accoutancy_reference string | null
id* string | integer
counterparties_get read

Get one counterparty by id.

id* string | integer
counterparties_list read

List counterparties — every party the org transacts with. The supplier and client flags say which side(s) a counterparty plays, and one record can be both. This is the party on a bank transaction, so it is what incoming invoices and transactions are matched against. Filter by type, supplier, client, cyclic or budgetNeutral.

type any
supplier any
client any
cyclic any
budgetNeutral any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
invoices_export read

Start a zip export of ISSUED invoices for a period (from/to, both YYYY-MM-DD, inclusive) filtered on SALE DATE — not issue or creation date. Only ISSUED invoices are included; drafts and unsent invoices are excluded, but corrections ARE included. Optional client restricts to one client (id or IRI from clients_list). Max 200 invoices per export — if the period has more, narrow it (e.g. export one month at a time); a period with 0 issued invoices is rejected too. This call only enqueues the job (rendering a month can take minutes) — it does NOT return a download link. Poll invoices_exportStatus with the returned exportId until it reports "ready". Write.

from* string
Start of the export period (inclusive), YYYY-MM-DD. Filters on invoice SALE DATE, not issue/creation date.
to* string
End of the export period (inclusive), YYYY-MM-DD. Filters on invoice SALE DATE, not issue/creation date.
client string | integer
Optional: restrict the export to one client — an id or IRI from clients_list.
invoices_exportStatus read

Poll the status of a zip export started by invoices_export, by exportId. Once status is "ready", the response includes downloadUrl (a short-lived signed link — expires in 1 hour, see expiresAt), filename, and byteSize; the file's bytes are never returned through this tool. If status is "failed", failureReason explains why.

exportId* string
Export job id returned by invoices_export.
invoices_get read

Get one outgoing (sales) invoice by id — client, rows, totals, sale and issue dates, status.

id* string | integer
invoices_list read

List outgoing (sales) invoices. Filter by client, tags, search, or a saleDate range. Note that saleDate — not issue date and not creation date — is the field invoices_export filters on, so use the same one here when reconciling an export.

client any
name string
id string
tags string
saleDate.before string
saleDate.strictly_before string
saleDate.after string
saleDate.strictly_after string
search string
Free-text search over invoice number and client name.
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
suppliers_create write

Create a new supplier/contractor record (name, tinType, costGroup required). Write.

costGroup* string
allowDuplicate boolean | null
Not persisted (no ORM\Column): an escape hatch for POST /contractors only, mirroring Client::$allowDuplicate. When true, ContractorCreateProcessor:: refuseIfDuplicate() skips the duplicate-party guard so a genuinely distinct same-name contractor can be created on purpose.
ownerEmployee string | null
tinType* string
tin string | null
tinCountry string | null
cyclic boolean
paymentDeadline integer | null
name* string
description string | null
matchRegex string | null
requireAttachment boolean | null
taxAmount string | null
notIncludeInChart boolean
eInvoicingReferenceNumber string | null
eInvoicingSourceXmlUrl string | null
eInvoicingVisualUrl string | null
contractorGroup string | null
suppliers_list read

List suppliers/contractors — served from /contractors, so "supplier" and "contractor" are the same record. Filter by cyclic for recurring suppliers. Use it to resolve the supplier that a cost, a contract or an incoming invoice is filed against.

cyclic any
order.name string
order.description string
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
suppliers_update write

Update a supplier/contractor's details (name, tax id, payment terms, etc.) by id. Write.

costGroup string
ownerEmployee string | null
tinType string
tin string | null
tinCountry string | null
cyclic boolean
paymentDeadline integer | null
name string
description string | null
matchRegex string | null
requireAttachment boolean | null
taxAmount string | null
notIncludeInChart boolean
eInvoicingReferenceNumber string | null
eInvoicingSourceXmlUrl string | null
eInvoicingVisualUrl string | null
contractorGroup string | null
id* string | integer
taxGroups_create write

Create a tax group (name + type required). Write.

name* string
isDefault boolean
taxGroups_list read

List tax groups. Use it to resolve the taxGroup id that taxRules_list filters on and that invoice rows carry.

order.name string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
taxGroups_update write

Update a tax group's name or type by id. Write.

name string
isDefault boolean
id* string | integer
transactions_list read

List bank transactions — the bank feed that incoming invoices are matched against. Filter by bankAccount, counterpartyRole, cost, ignored, hasDetectedProblems, an orderDate/execDate range, or amount.between. Note orderDate and execDate are different: a payment can be ordered in one month and execute in the next.

cost any
bankAccount any
counterpartyRole any
ignored any
hasDetectedProblems boolean
orderDate.before string
orderDate.strictly_before string
orderDate.after string
orderDate.strictly_after string
execDate.before string
execDate.strictly_before string
execDate.after string
execDate.strictly_after string
amount.between string
amount.gt string
amount.gte string
amount.lt string
amount.lte string
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
search string
Free-text search over transaction description, operation number, note and counterparty name.
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
transactions_suggestions read

Read Flowtly's proposals for one bank transaction — which counterparty, cost group or document it should be filed against. The mirror image of incomingInvoices_suggestions, from the money side.

cost any
bankAccount any
counterpartyRole any
ignored any
hasDetectedProblems boolean
orderDate.before string
orderDate.strictly_before string
orderDate.after string
orderDate.strictly_after string
execDate.before string
execDate.strictly_before string
execDate.after string
execDate.strictly_after string
amount.between string
amount.gt string
amount.gte string
amount.lt string
amount.lte string
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
search string
Free-text search over transaction description, operation number, note and counterparty name.
refresh boolean
Force a rebuild instead of returning the cached suggestions. Suggestions are cached; this is the only way to regenerate ones that are stale or wrong. The transaction-match rebuild runs synchronously; the OCR/LLM rebuild is dispatched async.
id* string | integer
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.

Projects & tasks

Projects, tasks, boards and comments.

projects_create write

Create a project (name + type required; type = fixed-price|time-and-material|non-billable|internal; optional dateFrom/dateTo, client, publicDescription, notes, priceNet). Write.

parent any
client string | null
currency string | null
dateFrom string | null
dateTo string | null
name* string
publicDescription string | null
type* string
clientHash string
notes string | null
icon string | null
priceNet string | null
taxGroup string | null
attributeSet string | null
taskCreatePolicy string
taskVisibility string
projects_get read

Get one project by id — name, type, client, dates, description and price.

id* string | integer
projects_list read

List projects. Filter by type (fixed-price | time-and-material | non-billable | internal), client.name, employee, name, or dateFrom/dateTo ranges. Use it to resolve the project id that tasks, work-time logging, budgets and contracts all take.

project string
Filter projects by status based on dateTo. Accepts a single value or multiple (CSV, e.g. "active,finished").
employee string
Filter projects assigned to employee
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
dateFrom.before string
dateFrom.strictly_before string
dateFrom.after string
dateFrom.strictly_after string
dateTo.before string
dateTo.strictly_before string
dateTo.after string
dateTo.strictly_after string
name string
type any
client.name string
budgetProjects.budget.name any
search string
Free-text search over the project's name and client name.
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
projects_update write

Update a project by id (name, type, dates, description, etc.). Write.

parent any
client string | null
currency string | null
dateFrom string | null
dateTo string | null
name string
publicDescription string | null
type string
clientHash string
notes string | null
color string
icon string | null
priceNet string | null
taxGroup string | null
attributeSet string | null
taskCreatePolicy string
taskVisibility string
id* string | integer
taskComments_create write

Add a comment to a project task (task id + content). Write.

task* string | integer
Task id or IRI to comment on (see tasks_list).
content* string
Comment text.
taskComments_list read

List comments on project tasks, oldest first. Filter by task to read one task's discussion.

task any
order.createdAt string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
taskLists_list read

List task lists — the board columns/sections tasks are filed into. Filter by project. tasks_create takes a list id from here.

project any
name string
order.position string
order.name string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
tasks_create write

Create a project task (title + project required; optional status, list, assignees, dueAt, priority). Write.

title* string
Task title.
project* string | integer
Project id or IRI the task belongs to (see projects_list).
status string | integer
Task status / board column id or IRI (see taskStatuses_list). Move here to change status or mark done.
list string | integer
Task list / board id or IRI (see taskLists_list).
description string
Task description.
priority string
Task priority (e.g. low, medium, high) — backend-validated.
startAt string
Start date-time (ISO 8601).
dueAt string
Due date-time (ISO 8601).
assignees array
Employee ids or IRIs to assign (see projects_list / employees).
tasks_get read

Get one project task by id — title, project, status, list, assignees, dates and recurrence.

id* string | integer
tasks_list read

List project tasks. Filter by project, list, status, assignees, isTemplate, or startAt/dueAt ranges. Recurring tasks expose recurrenceParent and recurrenceRule, so a generated occurrence can be traced back to the rule that produced it. To decide whether a task is DONE, compare its status against taskStatuses_list (isClosed) rather than matching on the status name.

project any
list any
status any
assignees any
subscribers any
recurrenceParent any
recurrenceRule any
isTemplate any
asset any
startAt.before string
startAt.strictly_before string
startAt.after string
startAt.strictly_after string
dueAt.before string
dueAt.strictly_before string
dueAt.after string
dueAt.strictly_after string
completedAt.before string
completedAt.strictly_before string
completedAt.after string
completedAt.strictly_after string
exists.dueAt boolean
exists.assignees boolean
search string
Free-text search over task title and description.
order.position string
order.dueAt string
order.startAt string
order.createdAt string
order.title string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
tasks_update write

Update a project task by id — change status (incl. mark done), assignees, dueAt, title, etc. Write.

id* string | integer
Task id or IRI to update (see tasks_list).
title string
New task title.
status string | integer
Task status / board column id or IRI (see taskStatuses_list). Move here to change status or mark done.
list string | integer
Task list / board id or IRI (see taskLists_list).
description string
Task description.
priority string
Task priority (e.g. low, medium, high) — backend-validated.
startAt string
Start date-time (ISO 8601).
dueAt string
Due date-time (ISO 8601).
assignees array
Employee ids or IRIs to assign (see projects_list / employees).
taskStatuses_list read

List the project task statuses, in board order. isClosed marks the done states and isDefault the status a new task gets. Read this before interpreting a task's status — the names are org-configurable, so "Done" is not a reliable string to match on.

name string
isClosed any
isDefault any
order.position string
order.name string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.

Time

Log work time and read it back.

workTimes_get read

Get a single work-time entry by id — date, minutes, project, notes and the employee it belongs to.

id* string | integer
workTimes_list read

List work-time (logged hours) entries. Filter by date range (date.after / date.before, YYYY-MM-DD) and optionally by employee or project; page with cursor. Each row carries employeeId/employeeName and projectId/projectName, so this is how you export all logged hours for a period. IMPORTANT: org-wide results require ROLE_WORKING_HOURS_VIEWER. Without it the backend does NOT error — it silently returns only the connected user's own entries, so an "everyone's hours" export can come back containing one person and look perfectly fine. If every row belongs to one employee and you did not filter by employee, the response carries a scopeWarning saying so — surface it to the user rather than presenting the result as org-wide.

employee any
project any
date.before string
date.strictly_before string
date.after string
date.strictly_after string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
workTimes_log write

Log a work-time entry for the connected Flowtly user (date, durationMinutes, project, notes). Write.

date* string
Work day, YYYY-MM-DD.
durationMinutes* integer
Minutes worked (1–1440).
project* string | integer
Project id or (unique) name.
notes* string
What the time was spent on.

More

allocations_list read

List resourcing allocations — date-ranged assignments of a position on a project to an employee (or to nobody yet, an open role). No filters; page with cursor. Each item carries employeeId/employeeName and projectId/projectName already resolved (null employeeId means an open role); positionId is bare — resolve its name via positions_list. source distinguishes sheet-imported rows from ones created directly in Flowtly. Use this to reconcile a resourcing sheet import: read back what landed and compare against what was submitted.

cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
clientContacts_create write

Create a contact person for a client (client, type, name, email required). Write.

client string
type* string
position integer
email* string
name* string
title string | null
phone string | null
clients_create write

Create a new client record (name, country, currency, status, tinType required). Write.

country* string
currency* string
defaultCost string | null
status* string
attributeSet string | null
name* string
dueDays integer
tinType* string
tinCountry string | null
tin string | null
externalPaymentCustomerId string | null
invoiceComment string | null
defaultTaxRate string | null
documentsLanguage string
addressPhoneNumber string | null
addressCity string | null
addressPostCode string | null
addressStreetLine string | null
addressBuildingNumber string | null
addressLocaleNumber string | null
addressCountry string | null
clientContacts array
allowDuplicate boolean | null
Not persisted (no ORM\Column): an escape hatch for POST /clients only, mirroring CounterpartyCreateByTypeInput::allowDuplicate. When true, ClientCreateProcessor::refuseIfDuplicate() skips the duplicate-party guard, matching the human-facing PATCH-and-attach pattern in CounterpartyCreateByTypeProcessor.
vatNumber string | null
clients_get read

Get one client by id — name, country, currency, tax id and status.

id* string | integer
clients_list read

List clients (the org's customers). Filter by status, or by externalPaymentCustomerId to find the client behind a payment-provider id. Use it to resolve the client id that invoices_list, deals_list, projects_list and contracts_list all filter on.

properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
externalPaymentCustomerId any
status any
order.name string
order.status string
order.tin string
order.tinCountry string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
clients_update write

Update a client record by id. Write.

country string
currency string
defaultCost string | null
status string
attributeSet string | null
name string
dueDays integer
tinType string
tinCountry string | null
tin string | null
externalPaymentCustomerId string | null
invoiceComment string | null
defaultTaxRate string | null
documentsLanguage string
addressPhoneNumber string | null
addressCity string | null
addressPostCode string | null
addressStreetLine string | null
addressBuildingNumber string | null
addressLocaleNumber string | null
addressCountry string | null
clientContacts array
vatNumber string | null
id* string | integer
configKeys_catalog read

List every organization config key the backend recognises, with its type and allowed values. This is the catalog of what is configurable — read it before configs_get or configs_update rather than guessing a key name. Permission is enforced per key by the backend, so a key appearing here does not guarantee the connected user may write it.

cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
configs_get read

Read one organization config value by id, where the id is a key from configKeys_catalog (e.g. organization-logo-url, organization-icon-url).

id* string | integer
configs_update write

Update an organization config value by id (type + name required; permission is enforced per config key by the backend). Write.

type string
name string
value string
id* string | integer
counterpartyBankAccounts_create write

Attach a bank account to a counterparty (counterparty + accountNumber). Write.

counterparty string
accountNumber string
crmNotes_create write

Add a note to a lead or a deal (body + exactly one of lead/deal). Author is the connected user. Write.

body* string
lead string | null
deal string | null
crmNotes_delete write

Delete a CRM note by id. Write.

id* string | integer
crmNotes_get read

Get one CRM note by id.

id* string | integer
crmNotes_list read

List notes written on leads and deals. Filter by lead or deal to read the running commentary on one record.

lead any
deal any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
crmNotes_update write

Update a CRM note’s body by id. Write.

body string
id* string | integer
dealLostReasons_get read

Get one deal lost-reason by id.

id* string | integer
dealLostReasons_list read

List the reasons a deal can be marked lost, in order. deals_lose requires a lostReasonId from here.

order.position string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
deals_create write

Create a deal/opportunity (title, client, stage required; amountMinor, currency, expectedCloseDate, owner, contact optional). Write.

title* string
client string | null
contact string | null
stage* string
amountMinor string | null
currency string | null
expectedCloseDate string | null
owner string | null
lead string | null
deals_delete write

Delete a deal by id (soft delete). Write.

id* string | integer
deals_get read

Get one deal by id — title, client, stage, amount, owner, contact, expected and actual close dates.

id* string | integer
deals_list read

List deals/opportunities — the sales pipeline. Filter by status (open / won / lost), stage, owner, client, lead, or by expectedCloseDate / closedAt ranges. Amounts are minor units with an explicit currency; do not assume the org's default.

status any
stage any
owner any
client any
lead any
title string
closedAt.before string
closedAt.strictly_before string
closedAt.after string
closedAt.strictly_after string
expectedCloseDate.before string
expectedCloseDate.strictly_before string
expectedCloseDate.after string
expectedCloseDate.strictly_after string
createdAt.before string
createdAt.strictly_before string
createdAt.after string
createdAt.strictly_after string
order.createdAt string
order.expectedCloseDate string
order.amountMinor string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
deals_lose read

Mark a deal lost — requires lostReasonId (from dealLostReasons_list); optional lostReasonNote. Write.

title* string
client string | null
contact string | null
stage* string
amountMinor string | null
currency string | null
expectedCloseDate string | null
owner string | null
lead string | null
id* string | integer
deals_reopen read

Reopen a won/lost deal back to open. Write.

title* string
client string | null
contact string | null
stage* string
amountMinor string | null
currency string | null
expectedCloseDate string | null
owner string | null
lead string | null
id* string | integer
deals_update write

Update a deal by id (title, stage, amount, close date, owner, contact). Moving the stage is logged automatically. Write.

title string
client string | null
contact string | null
stage string
amountMinor string | null
currency string | null
expectedCloseDate string | null
owner string | null
lead string | null
id* string | integer
deals_win read

Mark a deal won — moves it to a won stage and stamps it closed; optional contractId links an existing contract. Write.

title* string
client string | null
contact string | null
stage* string
amountMinor string | null
currency string | null
expectedCloseDate string | null
owner string | null
lead string | null
id* string | integer
dealStageHistories_get read

Get one deal stage-change record by id.

id* string | integer
dealStageHistories_list read

List a deal's stage transitions, newest first. Filter by deal. Every deals_update that moves the stage is logged here automatically, so this is how you reconstruct how long a deal sat in each stage — the deal itself only carries its current one.

deal any
order.changedAt string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
incomingInvoices_acceptAllSuggestions read

Accept every pending suggestion on an incoming invoice in one call — what a human does with the app's "accept all" button. The server applies, rebuilds, and applies again until nothing new appears: the transaction match does NOT exist until the supplier and amount are applied, so a single pass would leave the document unattached. Returns a report (what was applied, what was refused and why, and the transaction it ended up filed against). Pass dryRun to preview without writing. Never accepts supplier_create or a duplicate warning. Write.

dryRun boolean | null
Preview only: report what WOULD be applied, write nothing.
id* string | integer
incomingInvoices_applySuggestion read

Accept one of Flowtly's own suggestions on an incoming invoice — the same proposals a human sees in the app (supplier match, cost group, matching bank transaction, duplicate warning). Read them first with incomingInvoices_suggestions, then apply one by its id. Prefer this over guessing: Flowtly's matcher, not the agent, decides what is plausible. Write.

suggestionId string | null
action string | null
overrides array | null
id* string | integer
incomingInvoices_checkEInvoices read

Pull any new KSeF e-invoices into the org — what the app's "Sprawdź e-faktury" button does. Call this before concluding that a supplier's invoice is missing: without it you cannot tell "the supplier never sent it" from "our sync has not run yet". Returns once the fetch is queued; re-read incomingInvoices_list afterwards to see what arrived. Write.

No parameters.

incomingInvoices_create write

File an incoming (supplier) invoice or supporting document into accountancy — pass the bytes as base64 with a fileName and receivedAt. Flowtly OCRs it and suggests a supplier and a matching bank transaction. The file is fingerprinted as externalId 'upload_sha256:<sha256 of the bytes>': to avoid a duplicate, hash the bytes and check incomingInvoices_list for that externalId BEFORE uploading. Write.

fileBase64* string
The document's bytes, base64-encoded (a PDF, image, or XML invoice).
fileName* string
Filename for the upload, e.g. Invoice-2026-07-0007.pdf.
receivedAt* string
When the document reached the org (ISO-8601) — e.g. the date of the email that carried it.
mimeType string
MIME type of the bytes, e.g. application/pdf.
type string
invoice = the cost document itself. supporting_document = a payment receipt or annex filed alongside one.
contractor string | integer
Supplier this invoice is from — an id or IRI from suppliers_list. Optional: omit it and Flowtly's OCR suggests a supplier for a human to confirm.
transaction string | integer
Bank transaction this document settles — an id or IRI from transactions_list. Optional: omit it and Flowtly suggests a match.
currency string
Currency IRI, e.g. /currencies/1. Optional.
relatedMonth string
Accounting month this cost belongs to (ISO-8601 date). Optional.
dueDate string
Payment due date (ISO-8601). Optional.
note string
Free-text note. Optional.
incomingInvoices_get read

Get one incoming (supplier) invoice or supporting document by id, with its OCR'd fields and current match state.

id* string | integer
incomingInvoices_list read

List incoming (supplier) invoices and supporting documents — the accountancy inbox. An incoming invoice IS a document attached to a bank transaction, so exists.transaction=false is how you find documents that are not yet matched to a payment. Filter also by status, relatedMonth, counterparty, project, tags, or hasDetectedProblems. Each document is fingerprinted as externalId 'upload_sha256:<sha256 of the bytes>' — hash a file and look for that externalId here BEFORE incomingInvoices_create, or you will file a duplicate.

exists.transaction boolean
hasDetectedProblems boolean
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
status string
Filter transaction attachment by status based on custom logic
relatedMonth string
tags string
order.receivedAt string
order.name string
order.amount string
name string
counterparty any
project string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
incomingInvoices_matchCandidates read

List the bank transactions that could be the payment for this incoming invoice, ranked by the backend's own matcher. Reach for it when a document has no transaction attached and you need to choose one; prefer these candidates over guessing from amounts yourself.

exists.transaction boolean
hasDetectedProblems boolean
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
status string
Filter transaction attachment by status based on custom logic
relatedMonth string
tags string
order.receivedAt string
order.name string
order.amount string
name string
counterparty any
project string
id* string | integer
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
incomingInvoices_suggestions read

Read Flowtly's own proposals for an incoming invoice — supplier match, cost group, matching bank transaction, duplicate warning. These are exactly the proposals a human sees in the app. Read them first, then apply one by id with incomingInvoices_applySuggestion, or take them all with acceptAllSuggestions. Pass refresh to recompute rather than serve the cached set.

exists.transaction boolean
hasDetectedProblems boolean
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
status string
Filter transaction attachment by status based on custom logic
relatedMonth string
tags string
order.receivedAt string
order.name string
order.amount string
name string
counterparty any
project string
refresh boolean
Force a rebuild instead of returning the cached suggestions. Suggestions are cached; this is the only way to regenerate ones that are stale or wrong. The transaction-match rebuild runs synchronously; the OCR/LLM rebuild is dispatched async.
id* string | integer
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
incomingInvoices_suggestionsDebug read

Explain WHY an incoming invoice's suggestions came out as they did — the matcher's scoring, for diagnosing a missing or wrong suggestion. Diagnostic only; use incomingInvoices_suggestions for normal work.

id* string | integer
leadActivities_create write

Log ONE outreach touch on a lead — an invite sent, an invite accepted, a message, a reply, a call, a follow-up (lead + type + occurredAt required; channel, contact, body optional). THIS is where a prospect's outreach history belongs: a crmNote is freeform commentary, an activity is the structured, filterable touch-log the prospecting queue timeline renders. Do NOT narrate touches into a note. type: invite_sent | invite_accepted | message_sent | reply_received | call | meeting | follow_up | …; channel: linkedin | email | phone | …. Write.

lead* string
contact string | null
type* string
channel string | null
occurredAt* string
body string | null
externalId string | null
threadId string | null
fromMailbox string | null
leadActivities_delete write

Delete a logged outreach activity by id. Write.

id* string | integer
leadActivities_get read

Get one lead activity (outreach touch) by id.

id* string | integer
leadActivities_list read

List a lead's outreach touches — its activity timeline (invite sent, replies, calls, follow-ups). Filter by lead to read one prospect's history. This is the structured counterpart to crmNotes_list: activities are the typed, dated touch-log; notes are freeform commentary.

lead any
contact any
type any
channel any
externalId any
threadId any
occurredAt.before string
occurredAt.strictly_before string
occurredAt.after string
occurredAt.strictly_after string
order.occurredAt string
order.type string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
leadActivities_update write

Update a logged outreach activity by id (type, channel, occurredAt, body). Write.

contact string | null
type string
channel string | null
occurredAt string
body string | null
externalId string | null
threadId string | null
fromMailbox string | null
id* string | integer
leadContacts_create write

Add a contact person to a lead (lead + name required; email, phone, role, linkedinUrl, isPrimary optional). A contact's LinkedIn URL belongs in linkedinUrl, NOT in a crmNote. Write.

lead string
name* string
email string | null
phone string | null
linkedinUrl string | null
role string | null
isPrimary boolean
leadContacts_delete write

Delete a lead contact by id. Write.

id* string | integer
leadContacts_get read

Get one lead contact by id.

id* string | integer
leadContacts_list read

List the contact people attached to leads. Filter by lead to read one prospect's contacts, or by email to find which lead a message came from.

lead any
email any
linkedinUrl any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
leadContacts_update write

Update a lead contact by id — e.g. set linkedinUrl / email / phone once you find them. Write.

lead string
name string
email string | null
phone string | null
linkedinUrl string | null
role string | null
isPrimary boolean
id* string | integer
leadListMemberships_create write

Add a lead to an outbound list (list + lead required; status optional). Write.

list* string
lead* string
status string
lastContactedAt string | null
leadListMemberships_delete write

Remove a lead from an outbound list. Write.

id* string | integer
leadListMemberships_get read

Get one lead-to-list membership by id.

id* string | integer
leadListMemberships_list read

List which leads sit on which outbound prospecting lists, with each one's outreach status (contacted / replied / bounced). Filter by list, lead or status — this is how you read the state of a campaign.

list any
lead any
status any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
leadListMemberships_update write

Update a lead’s membership in a list — e.g. set outreach status (contacted/replied/bounced). Write.

list string
lead string
status string
lastContactedAt string | null
id* string | integer
leadLists_create write

Create an outbound prospecting list (name required). Write.

name* string
description string | null
owner string | null
channel string | null
status string
segment string | null
leadLists_delete write

Delete an outbound list by id. Write.

id* string | integer
leadLists_get read

Get one outbound prospecting list by id.

id* string | integer
leadLists_list read

List outbound prospecting lists. Use it to resolve the list id that leadListMemberships_create takes.

status any
channel any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
leadLists_update write

Update an outbound list by id. Write.

name string
description string | null
owner string | null
channel string | null
status string
segment string | null
id* string | integer
leadLostReasons_get read

Get one lead lost-reason by id.

id* string | integer
leadLostReasons_list read

List the reasons a lead can be marked lost, in order.

order.position string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
leads_bulkImport read

Import many leads in ONE call, each with its contacts, list membership and outreach activities nested — the server creates the lead then threads its id into the children, so you never juggle intermediate IRIs. Idempotent by natural keys (companyName / email / (list,lead) / (type,occurredAt,contact)): safe to re-run and to chunk (≤100 leads/call). This is the bulk path a campaign import should use instead of N leads_create calls. Write.

list object
leads* array
leads_convert read

Convert a qualified lead into a Client + one contact per lead-contact + an open Deal. Requires an existing client (the lead’s client or a clientId in the body). Write.

companyName string | null
website string | null
source string | null
owner string | null
client string | null
industry string | null
linkedinUrl string | null
doNotContact boolean
getDoNotContact(), NOT isDoNotContact() — see the property's comment. An is*() accessor is invisible to API Platform's readability check and the flag would be silently dropped from every payload.
companySize string | null
stage string | null
id* string | integer
leads_create write

Create a lead (outbound/inbound prospect target; companyName, source, status, owner, linked client optional). Write.

companyName string | null
website string | null
source string | null
owner string | null
client string | null
industry string | null
linkedinUrl string | null
doNotContact boolean
getDoNotContact(), NOT isDoNotContact() — see the property's comment. An is*() accessor is invisible to API Platform's readability check and the flag would be silently dropped from every payload.
companySize string | null
stage string | null
leads_dedupeCheck read

Check whether a prospect is already in the CRM, using the same filters as leads_list (companyName, source, owner, …). Call this BEFORE leads_create: a duplicate lead splits the outreach history across two records, and nothing downstream will merge them for you.

status any
source any
owner any
client any
companyName string
linkedinUrl any
doNotContact boolean
createdAt.before string
createdAt.strictly_before string
createdAt.after string
createdAt.strictly_after string
closedAt.before string
closedAt.strictly_before string
closedAt.after string
closedAt.strictly_after string
order.createdAt string
order.companyName string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
leads_delete write

Delete a lead by id (soft delete). Write.

id* string | integer
leads_get read

Get one lead by id — company, website, source, status, owner and the client it converted to, if any.

id* string | integer
leads_list read

List leads — prospect targets, before qualification. Filter by status, source, owner, client, companyName, or createdAt/closedAt ranges. A qualified lead becomes a Client plus an open Deal via leads_convert; until then it lives only here, not in clients_list.

status any
source any
owner any
client any
companyName string
linkedinUrl any
doNotContact boolean
createdAt.before string
createdAt.strictly_before string
createdAt.after string
createdAt.strictly_after string
closedAt.before string
closedAt.strictly_before string
closedAt.after string
closedAt.strictly_after string
order.createdAt string
order.companyName string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
leads_update write

Update a lead by id (company, website, source, status, owner, linked client). Write.

companyName string | null
website string | null
source string | null
owner string | null
client string | null
industry string | null
linkedinUrl string | null
doNotContact boolean
getDoNotContact(), NOT isDoNotContact() — see the property's comment. An is*() accessor is invisible to API Platform's readability check and the flag would be silently dropped from every payload.
companySize string | null
stage string | null
id* string | integer
leadStages_get read

Get one lead stage by id.

id* string | integer
leadStages_list read

List the stages a lead moves through, in order. Leads have their own stage set — deals use stages_list, which is a different thing.

order.position string
order.label string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
organization_whoami read

Return the organization this MCP connection is bound to — { orgId, name, slug, userId }. Call it to confirm WHICH tenant you are about to write into before any create/update: the connection is pinned to exactly one org by the token, and writing prospects/records into the wrong org is a real incident. Read-only.

No parameters.

organizationIcon_upload read

Upload/replace the organization's icon/favicon (base64 image + contentType + filename). Read the current one via configs_get organization-icon-url. Write.

bytesBase64* string
The image file bytes, base64-encoded.
contentType* string
The image MIME type, e.g. image/png, image/jpeg, image/svg+xml.
filename* string
A filename for the upload, e.g. logo.png.
organizationLogo_upload read

Upload/replace the organization's logo (base64 image + contentType + filename). Read the current one via configs_get organization-logo-url. Write.

bytesBase64* string
The image file bytes, base64-encoded.
contentType* string
The image MIME type, e.g. image/png, image/jpeg, image/svg+xml.
filename* string
A filename for the upload, e.g. logo.png.
organizationMailFooter_get read

Read the organization's outgoing-mail footer text (the block appended to mail Flowtly sends on the org's behalf).

No parameters.

organizationMailFooter_update write

Update the organization's outgoing-mail footer text. Write.

mailFooter string
organizations_get read

Get an organization by id. WARNING — this does NOT tell you which organization you are connected to. An OAuth connection is pinned to exactly one org (token-bound), but this endpoint returns any org the connected USER is a member of, so a successful read here reads like confirmation you are working in that org when you may not be. To verify the tenant you are actually operating on, read tenant-scoped data instead — people_list or clients_list — and never start a bulk write on the strength of this call alone.

id* string | integer
people_create write

Create a person/employee record (firstname + lastname required; optional companyEmail, contactEmail, contactPhone). Write.

companyEmail string | null
contactEmail string | null
contactPhone string | null
birthday string | null
firstname* string | null
lastname* string | null
phoneTextAllowed boolean
tracksTime boolean
Whether this employee is expected to log working time. When false, the time-tracking dashboard widgets (project timer + monthly working-hours) are hidden for them. Defaults to true so existing employees keep their current behaviour.
department string | null
reportsTo any
defaultProject string | null
Project this employee's working time is assigned to by default when not logged against a specific project. Stored only for now — no automatic assignment is wired up yet.
people_delete write

Delete an employee/person record by id (e.g. to remove a placeholder/dummy employee). Requires ROLE_EMPLOYEES_MANAGER; the backend runs a delete processor that also detaches related records. High-impact, irreversible. Write.

id* string | integer
people_get read

Get one person/employee record by id — names, emails, phone, manager, and whether they are active.

id* string | integer
people_list read

List people/employees. Filter by isActive, reportsTo (a manager's id), projectMembers.project, or search; page with cursor. People and employees share the same id, so this is how you resolve the employee id that work time, responsibilities, project membership and permission tools all expect.

isActive boolean
id any
firstname string
lastname string
reportsTo any
projectMembers.project any
exists.userId boolean
exists.reportsTo boolean
exists.companyEmail boolean
search string
Free-text search over employee name and company email.
properties array
Allows you to reduce the response to contain only the properties you need. If your desired property is nested, you can address it using nested arrays. Example: properties[]={propertyName}&properties[]={anotherPropertyName}&properties[{nestedPropertyParent}][]={nestedProperty}
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
people_setPermissionGroups read

Set (replace) a person's permission groups by numeric group ids (see permissionGroups_list — e.g. the "Business Owner" group grants ROLE_ADMIN). Grants access; does NOT create a login or email the person. Write.

id* string | integer
Person/employee id (or IRI). people and employees share the same id.
groupIds* array
Numeric permission-group ids the person should have (see permissionGroups_list). REPLACES their current set — pass every group they should keep. Empty array removes all groups.
people_update write

Update a person/employee record by id (name, companyEmail, contactEmail, contactPhone, etc.). Write.

companyEmail string | null
contactEmail string | null
contactPhone string | null
birthday string | null
firstname string | null
lastname string | null
phoneTextAllowed boolean
tracksTime boolean
Whether this employee is expected to log working time. When false, the time-tracking dashboard widgets (project timer + monthly working-hours) are hidden for them. Defaults to true so existing employees keep their current behaviour.
department string | null
reportsTo any
defaultProject string | null
Project this employee's working time is assigned to by default when not logged against a specific project. Stored only for now — no automatic assignment is wired up yet.
id* string | integer
permissionGroups_create write

Create a permission group (name required; roles = list of ROLE_* strings it grants). Write.

code string | null
Stable code for default seed groups; null for org-created custom groups.
name* string
description string | null
roles array
ROLE_* string values
permissionGroups_get read

Get one permission group by id, including the ROLE_* strings it grants.

id* string | integer
permissionGroups_list read

List the org's permission groups and the roles each one grants — e.g. the "Business Owner" group grants ROLE_ADMIN. Read this before people_setPermissionGroups: the roles in the response are the authority on what a group actually permits, so you never have to guess from its name.

cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
permissionGroups_update write

Update a permission group's name, description, or granted roles by id. Write.

name string
description string | null
roles array
ROLE_* string values
id* string | integer
pipelines_get read

Get one sales pipeline by id.

id* string | integer
pipelines_list read

List sales pipelines. A pipeline owns an ordered set of stages — read them with stages_list filtered by pipeline.

cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
positions_list read

List positions — the named roles (e.g. "Backend Engineer") that a project allocation fills. No filters; Position has pagination disabled, so this always returns the org's full role catalog in one call. Each item is {id, name, roles}. Use it to resolve the position name behind an allocations_list row's positionId, and to find the position id a resourcing import must match against.

order.name string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
resourcing_importTimeline read

Import a resourcing allocation timeline sheet (fetch it via the Drive MCP, pass its CSV verbatim). This is a FULL-REPLACE mirror of the org's Allocation rows for `year`: rows in the sheet are created/updated, and any existing row for that year absent from the sheet is DELETED — not a merge. DRY-RUN BY DEFAULT: an omitted dryRun previews and writes nothing; pass dryRun:false to apply. The report gives `created` / `replaced` plus `unmatchedPeople` / `unmatchedProjects`. TWO THINGS ARE EASY TO MISS: a sheet row whose project does not resolve is SKIPPED while the call still reports success, so a green result can hide a partial import; and a role code the position catalogue does not already hold is CREATED as a new position rather than rejected — see `createdPositions`. Both are called out in `warnings` when they happen; surface that to the user rather than reporting only `created`. A sheet that parses to zero rows is refused (it looks exactly like a bad read about to wipe the whole timeline) unless you pass force:true. Read allocations_list afterwards to see what landed. High-impact. Write.

csv* string
The allocation-timeline sheet as CSV (fetch it via the Drive MCP). A role code the position catalogue does not already hold is CREATED as a new position rather than rejected — check `createdPositions` and `warnings` in the report.
dryRun boolean
Preview only; report what WOULD change and write nothing. Default true.
force boolean
Allow an apply whose parse produced zero rows (would otherwise refuse to wipe).
year number
Planning year the day columns fall in.
responsibilities_create write

Create a responsibility inside a group (responsibilityGroup = group id or IRI, + name, required; optional description; optional parent = another responsibility IRI for nesting). Assign people to it via responsibilityEmployees_create. Write.

parent any
responsibilityGroup* string
name* string
description string
children array
responsibilities_get read

Get one responsibility by id.

id* string | integer
responsibilities_list read

List responsibilities inside a RACI group. Filter by responsibilityGroup. Responsibilities can nest via parent; people are assigned to them through responsibilityEmployees, not directly.

responsibilityGroup any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
responsibilities_update write

Update a responsibility by id (name, description, parent, responsibilityGroup = group id or IRI). Write.

parent any
responsibilityGroup string
name string
description string
children array
id* string | integer
responsibilityEmployees_create write

Assign an employee to a responsibility (responsibility = responsibility id or IRI, employee = employee id or IRI, percentage 0-100, all required; optional targets and description). Write.

responsibility* string | null
employee* string | null
percentage* integer
targets string
description string
responsibilityEmployees_delete write

Remove an employee's assignment from a responsibility by id. Write.

id* string | integer
responsibilityEmployees_get read

Get one responsibility assignment by id.

id* string | integer
responsibilityEmployees_list read

List who is assigned to which responsibility, and at what percentage. Filter by employee to read one person's entire RACI load across every group.

employee any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
responsibilityEmployees_update write

Update a responsibility assignment by id (percentage, targets, description). Write.

responsibility string | null
employee string | null
percentage integer
targets string
description string
id* string | integer
responsibilityGroups_create write

Create a responsibility group / RACI area (name required; optional description and responsibleEmployee = the accountable person, given as a plain employee id like 6 (from people_list) or the /people/6 IRI). This is the top-level 'Odpowiedzialności' item. Add individual responsibilities under it via responsibilities_create. Write.

responsibleEmployee* string | null
name* string
description string
responsibilities array
responsibilityGroups_get read

Get one responsibility group by id.

id* string | integer
responsibilityGroups_list read

List responsibility groups / RACI areas — the top-level "Odpowiedzialności" items, each with an accountable person. Individual responsibilities hang underneath them.

cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
responsibilityGroups_update write

Update a responsibility group by id (name, description, responsibleEmployee = employee id or IRI). Write.

responsibleEmployee string | null
name string
description string
responsibilities array
id* string | integer
stages_get read

Get one deal stage by id.

id* string | integer
stages_list read

List deal stages, in order. Filter by pipeline. deals_create requires a stage id from here, and moving a deal between stages is what dealStageHistories records.

pipeline any
order.position string
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
tagDefinitions_create write

Create a tag definition (name, level, tagGroup required) within a tag group. Write.

name* string
level* integer
label string
tagGroup* string
tagDefinitions_list read

List tag definitions — the tags that can be attached to records, each inside a tag group. tags_create takes a tagDefinition id from here plus the record to attach it to.

cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
tagGroups_create write

Create a tag group (name required) to organize related tag definitions. Write.

name* string
allowedRelations array | null
tagGroups_list read

List tag groups — the containers that organize tag definitions.

cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
tags_create write

Attach a tag definition to a record (tagDefinition + relationName + relationId; e.g. relationName "counterparty" to tag a supplier/vendor). Write.

tagDefinition* string
relationName string
relationId* string
weight string
taxRules_create write

Create a tax rule. Write.

taxGroup* string
country* string
taxAmount* string
taxRules_list read

List tax rules — the rates and the periods they apply to. Filter by taxGroup.

taxGroup any
cursor string
Opaque pagination token from a previous response's nextCursor. Omit for the first page. When present, other filters are ignored — the cursor already encodes them.
itemsPerPage integer
Page size (max 100). Ignored when cursor is set.
taxRules_update write

Update a tax rule by id. Write.

taxGroup string
country string
taxAmount string
id* string | integer