MCP server

Connect AI tools to Flowtly through the Model Context Protocol at mcp.flowtly.eu.

Connect

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

On this page

Allocations_get

Tools

allocations_getOne allocation by id — a single person's booking on a project, with its dates and percentage. allocations_list finds the id; this reads the full record. An allocation with no employee is an OPEN role (unfilled demand), not a booking. Needs the resourcing module. Read-only.

Allocations_list

Tools

allocations_listList 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.

Bank Accounts_get

Tools

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

Bank Accounts_list

Tools

bankAccounts_listList 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.

Clients_get

Tools

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

Clients_list

Tools

clients_listList 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.

Config Keys_catalog

Tools

configKeys_catalogList 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.

Configs_get

Tools

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

Contracts_get

Tools

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

Contracts_list

Tools

contracts_listList 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.

Contracts_payment Schedule Lines

Tools

contracts_paymentScheduleLinesList 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.

Cost Groups_list

Tools

costGroups_listList 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.

Counterparties_get

Tools

counterparties_getGet one counterparty by id.

Counterparties_list

Tools

counterparties_listList 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.

CRM Notes_get

Tools

crmNotes_getGet one CRM note by id.

CRM Notes_list

Tools

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

Deal Lost Reasons_get

Tools

dealLostReasons_getGet one deal lost-reason by id.

Deal Lost Reasons_list

Tools

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

Deals_get

Tools

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

Deals_list

Tools

deals_listList 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.

Deal Stage Histories_get

Tools

dealStageHistories_getGet one deal stage-change record by id.

Deal Stage Histories_list

Tools

dealStageHistories_listList 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.

Holiday Requests_list

Tools

holidayRequests_listLeave REQUESTS and where they stand — pending, approved, rejected. Distinct from holidays_list, which is booked leave: a request still awaiting a decision is not yet an absence, so plan against holidays_list and use this one to see what is waiting on someone. Supplies the holidayRequestId that holidays_approve and holidays_bulkApprove take. Read-only.

Holidays_active

Tools

holidays_activeWho is off RIGHT NOW — every currently-running leave, org-wide, for everyone. This is the tool for 'who is out today', and the one to cross-check before treating resourcingBench_get's freePercent as availability, because the bench does not subtract leave. Unlike holidays_list it applies no project scoping and needs no permission beyond being signed in, so its answer covers the whole organisation. Returns each absence with its type and dates. Read-only.

Holidays_get

Tools

holidays_getOne leave record by id, with its type, dates and duration. Get the id from holidays_list or holidays_active. Read-only.

Holidays_list

Tools

holidays_listBooked leave over a period — the planning view, where holidays_active answers only about today. Filter by employee, by date range, or by project. WHAT YOU SEE DEPENDS ON YOUR PERMISSIONS, and a short list is not proof nobody is off: a holidays manager or accountancy viewer gets the organisation, while a project lead or viewer MUST pass a project filter (or ask about themselves) and is refused outright without one — that refusal is a permission boundary, not an empty calendar. Read-only.

Incoming Invoices_get

Tools

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

Incoming Invoices_list

Tools

incomingInvoices_listList 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.

Incoming Invoices_match Candidates

Tools

incomingInvoices_matchCandidatesList 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.

Incoming Invoices_suggestions

Tools

incomingInvoices_suggestionsRead 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.

Incoming Invoices_suggestions Debug

Tools

incomingInvoices_suggestionsDebugExplain 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.

Invoices_get

Tools

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

Invoices_list

Tools

invoices_listList 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.

Lead Activities_get

Tools

leadActivities_getGet one lead activity (outreach touch) by id.

Lead Activities_list

Tools

leadActivities_listList 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 Contacts_get

Tools

leadContacts_getGet one lead contact by id.

Lead Contacts_list

Tools

leadContacts_listList 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 List Memberships_get

Tools

leadListMemberships_getGet one lead-to-list membership by id.

Lead List Memberships_list

Tools

leadListMemberships_listList 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.

Lead Lists_get

Tools

leadLists_getGet one outbound prospecting list by id.

Lead Lists_list

Tools

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

Lead Lost Reasons_get

Tools

leadLostReasons_getGet one lead lost-reason by id.

Lead Lost Reasons_list

Tools

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

Leads_dedupe Check

Tools

leads_dedupeCheckCheck 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.

Leads_get

Tools

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

Leads_list

Tools

leads_listList 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.

Lead Stages_get

Tools

leadStages_getGet one lead stage by id.

Lead Stages_list

Tools

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

Organization Mail Footer_get

Tools

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

Organizations_get

Tools

organizations_getGet 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.

People_get

Tools

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

People_list

Tools

people_listList 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.

Permission Groups_get

Tools

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

Permission Groups_list

Tools

permissionGroups_listList 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.

Pipelines_get

Tools

pipelines_getGet one sales pipeline by id.

Pipelines_list

Tools

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

Positions_list

Tools

positions_listList 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.

Projects_get

Tools

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

Projects_list

Tools

projects_listList 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.

Resource Request Candidates_get

Tools

resourceRequestCandidates_getOne recruitment candidate by id. The id comes from resourceRequestCandidates_list. Needs ROLE_HR_MANAGER. Read-only.

Resource Request Candidates_list

Tools

resourceRequestCandidates_listThe candidates put forward against hiring requests — people in a recruitment pipeline, not employees available for allocation. Filter by the request id from resourceRequests_list. Needs ROLE_HR_MANAGER. Read-only.

Resource Requests_get

Tools

resourceRequests_getOne hiring request by id, with its position and status. Get the id from resourceRequests_list. HR/recruitment, not resourcing allocation. Needs ROLE_HR_MANAGER. Read-only.

Resource Requests_list

Tools

resourceRequests_listOpen hiring requests — a request to recruit for a position, in the HR domain. Despite the name this is NOT resourcing allocation demand: it is recruitment. Returns the collection; resourceRequests_get reads one, and resourceRequestCandidates_list gives the people put forward for it. Needs ROLE_HR_MANAGER. Read-only.

Resourcing Requests_list

Tools

resourcingRequests_listOpen resourcing requests — someone asking for a person to be allocated to a project, which is the demand side of resourcing. This is the flow the Resourcing UI's Requests view renders. Do NOT confuse it with resourceRequests_list: that one is HR RECRUITMENT (hiring for a position). Pair it with resourcingRequestsHistory_list for what has already been decided, and resourcingBench_get for who could satisfy a request. Needs the resourcing module and ROLE_RESOURCING_MANAGER. Read-only.

Resourcing Requests History_list

Tools

resourcingRequestsHistory_listWhat has already happened to resourcing requests — the decision trail (confirmed, declined, changed) behind the open requests in resourcingRequests_list. Reach for it to answer 'was this already asked for and turned down?' before proposing the same allocation again. Needs the resourcing module and ROLE_RESOURCING_MANAGER. Read-only.

Responsibilities_get

Tools

responsibilities_getGet one responsibility by id.

Responsibilities_list

Tools

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

Responsibility Employees_get

Tools

responsibilityEmployees_getGet one responsibility assignment by id.

Responsibility Employees_list

Tools

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

Responsibility Groups_get

Tools

responsibilityGroups_getGet one responsibility group by id.

Responsibility Groups_list

Tools

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

Schedule Employees_get

Tools

scheduleEmployees_getOne schedule-to-employee assignment by id. The id comes from scheduleEmployees_list. Needs ROLE_SCHEDULES_MANAGER. Read-only.

Schedule Employees_list

Tools

scheduleEmployees_listWhich employees are assigned to which working-time schedules. Use it to go from a schedule (schedules_list) to its people, or to find the schedule a given employee follows. Needs ROLE_SCHEDULES_MANAGER. Read-only.

Schedule Plan_list

Tools

schedulePlan_listThe schedules in force on ONE given date — pass the date in the path. Reach for it to answer 'who is working today / on this date' without reading every schedule and resolving its ranges yourself. Unlike the other schedule reads this only needs ROLE_USER, so it is the one available to an ordinary employee. Read-only.

Schedule Ranges_get

Tools

scheduleRanges_getOne schedule time range by id. The id comes from scheduleRanges_list. Needs ROLE_SCHEDULES_MANAGER. Read-only.

Schedule Ranges_list

Tools

scheduleRanges_listThe time ranges that make up working-time schedules — the actual hours a schedule covers. Read the parent with schedules_get first; this expands its ranges. Needs ROLE_SCHEDULES_MANAGER. Read-only.

Schedules_get

Tools

schedules_getOne working-time schedule by id, with its ranges and assigned employees. The id comes from schedules_list; scheduleRanges_list and scheduleEmployees_list read its parts. Needs ROLE_SCHEDULES_MANAGER. Read-only.

Schedules_list

Tools

schedules_listWorking-time schedules — the shift/working patterns an org defines, NOT project allocation. Use resourcingSchedule_get for who is booked on what; use this for the working patterns themselves. schedules_get reads one by id. Needs ROLE_SCHEDULES_MANAGER. Read-only.

Stages_get

Tools

stages_getGet one deal stage by id.

Stages_list

Tools

stages_listList 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.

Suppliers_list

Tools

suppliers_listList 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.

Tag Definitions_list

Tools

tagDefinitions_listList 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.

Tag Groups_list

Tools

tagGroups_listList tag groups — the containers that organize tag definitions.

Task Comments_list

Tools

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

Task Lists_list

Tools

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

Tasks_get

Tools

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

Tasks_list

Tools

tasks_listList 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.

Task Statuses_list

Tools

taskStatuses_listList 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.

Tax Groups_list

Tools

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

Tax Rules_list

Tools

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

Transactions_list

Tools

transactions_listList 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.

Transactions_suggestions

Tools

transactions_suggestionsRead 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.

Work Times_get

Tools

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

Work Times_list

Tools

workTimes_listList 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.

Work Times_log

Tools

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

Tasks_create

Tools

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

Tasks_update

Tools

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

Task Comments_create

Tools

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

Suppliers_create

Tools

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

Suppliers_update

Tools

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

People_create

Tools

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

People_update

Tools

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

People_delete

Tools

people_deleteDelete 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.

Cost Groups_create

Tools

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

Cost Groups_update

Tools

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

Tag Groups_create

Tools

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

Tag Definitions_create

Tools

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

Tags_create

Tools

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

Clients_create

Tools

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

Clients_update

Tools

clients_updateUpdate a client record by id. Write.

Client Contacts_create

Tools

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

Bank Accounts_create

Tools

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

Bank Accounts_update

Tools

bankAccounts_updateUpdate a bank account by id. Write.

Counterparty Bank Accounts_create

Tools

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

Contracts_create

Tools

contracts_createCreate a contract. Write.

Contracts_update

Tools

contracts_updateUpdate a contract by id. Write.

Contracts_delete

Tools

contracts_deleteDelete a contract by id. Write.

Tax Groups_create

Tools

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

Tax Groups_update

Tools

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

Tax Rules_create

Tools

taxRules_createCreate a tax rule. Write.

Tax Rules_update

Tools

taxRules_updateUpdate a tax rule by id. Write.

Configs_update

Tools

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

Organization Mail Footer_update

Tools

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

Permission Groups_create

Tools

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

Permission Groups_update

Tools

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

People_set Permission Groups

Tools

people_setPermissionGroupsSet (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.

Projects_create

Tools

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

Projects_update

Tools

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

Responsibility Groups_create

Tools

responsibilityGroups_createCreate 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.

Responsibility Groups_update

Tools

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

Responsibilities_create

Tools

responsibilities_createCreate 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.

Responsibilities_update

Tools

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

Responsibility Employees_create

Tools

responsibilityEmployees_createAssign 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 Employees_update

Tools

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

Responsibility Employees_delete

Tools

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

Leads_create

Tools

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

Leads_update

Tools

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

Leads_delete

Tools

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

Leads_convert

Tools

leads_convertConvert 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.

Lead Activities_create

Tools

leadActivities_createLog 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 Activities_update

Tools

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

Lead Activities_delete

Tools

leadActivities_deleteDelete a logged outreach activity by id. Write.

Lead Contacts_create

Tools

leadContacts_createAdd 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 Contacts_update

Tools

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

Lead Contacts_delete

Tools

leadContacts_deleteDelete a lead contact by id. Write.

Deals_create

Tools

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

Deals_update

Tools

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

Deals_delete

Tools

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

Deals_win

Tools

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

Deals_lose

Tools

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

Deals_reopen

Tools

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

Lead Lists_create

Tools

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

Lead Lists_update

Tools

leadLists_updateUpdate an outbound list by id. Write.

Lead Lists_delete

Tools

leadLists_deleteDelete an outbound list by id. Write.

Lead List Memberships_create

Tools

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

Lead List Memberships_update

Tools

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

Lead List Memberships_delete

Tools

leadListMemberships_deleteRemove a lead from an outbound list. Write.

CRM Notes_create

Tools

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

CRM Notes_update

Tools

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

CRM Notes_delete

Tools

crmNotes_deleteDelete a CRM note by id. Write.

Organization Logo_upload

Tools

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

Organization Icon_upload

Tools

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

Incoming Invoices_create

Tools

incomingInvoices_createFile 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.

Invoices_export

Tools

invoices_exportStart 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.

Invoices_export Status

Tools

invoices_exportStatusPoll 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.

Invoices_import

Tools

invoices_importFile an ALREADY-ISSUED outgoing (sales) invoice into the org — for bringing invoice history in when onboarding. The external invoice number you pass is preserved verbatim, the buyer is resolved by tax id (created if absent), and the invoice lands as issued WITHOUT rendering a PDF, emailing the client, or submitting to KSeF. Importing a number that already exists is a no-op that reports the existing invoice, so a bulk import is safe to re-run — but that guarantee holds for sequential calls only; two genuinely concurrent imports of the same number can both land. Pass expectedGrossTotal (the gross printed on the source document) and the import is rejected if it disagrees with the total computed from the rows. buyer.tin is required — the buyer is never matched by name. Use invoices_create, not this, to raise a genuine new invoice. Write.

Invoice Transactions_create

Tools

invoiceTransactions_createRecord a payment against an outgoing (sales) invoice. `invoice` is an invoice IRI from invoices_list; `date` is when the payment is treated as made. `transaction` is optional — omit it to record settlement with no bank line, which is what you want for historical invoices whose bank statement was never imported. `amount` is optional and defaults to the invoice's outstanding amount. Recording a payment is what stops an issued, past-due invoice being treated as unpaid, so it is also what stops payment reminders being queued for it. Nothing prevents recording two payments against one invoice, so read invoices_get first if you are unsure whether one is already settled. Write.

Invoice Transactions_update

Tools

invoiceTransactions_updateUpdate an existing invoice-payment record by id (from invoices_get's invoiceTransactions, or by paging invoiceTransactions). The most common use: point a payment recorded with no bank line at a transaction you just imported via transactions_importStatement, by setting `transaction` to a transaction IRI/id from transactions_list. THE FOOTGUN: this is a PATCH, but the backend still requires `invoice` and `date` on every call — it does NOT merge in the existing values for you. Read the record first (or already have it from the create call) and resend its `invoice` and `date` unchanged alongside whatever you actually mean to change, or the update is rejected. `transaction` accepts null to unlink a payment from a bank line. `amount` is optional. Write.

Incoming Invoices_apply Suggestion

Tools

incomingInvoices_applySuggestionAccept 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.

Incoming Invoices_accept All Suggestions

Tools

incomingInvoices_acceptAllSuggestionsAccept 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.

Incoming Invoices_check EInvoices

Tools

incomingInvoices_checkEInvoicesPull 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.

Resourcing_import Timeline

Tools

resourcing_importTimelineImport 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.

Transactions_import Statement

Tools

transactions_importStatementImport a bank statement file (e.g. an MT940 .sta file) — pass each file's raw text content verbatim (NOT base64) with a filename. THERE IS NO bankAccount PARAMETER: the backend routes a file by stripping all non-digit characters from your bank accounts' numbers and from the file's bytes, and importing into every account whose digits appear anywhere in the file — so one file can land in several accounts, and a statement for an account that is not set up in Flowtly (or whose number is recorded differently than the bank writes it) imports into none of them, failing with an error that explains exactly why — read that message, it is the only diagnostic this endpoint gives you. On success the response is `{ imported, matching }`: `matching: "in_progress"` means contractor/attachment matching for the new rows is still running after this call returns, so an immediate transactions_list may show rows not yet matched — re-read a little later for the final state. Re-importing the same statement does not create duplicate rows; the importer recognizes transactions it has already seen. Once a statement is in, point an existing no-bank-line payment at one of its rows with…

Organization_whoami

Tools

organization_whoamiReturn 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.

Resourcing Actuals_get

Tools

resourcingActuals_getReported hours vs the plan, per person per week, over a from/to window — the 'is the team actually on plan?' question, which NO other resourcing tool answers: allocations tell you what was PLANNED, this tells you what was DELIVERED. Returns week columns plus one row per person (planned %, reported %, variance, totals, and a per-project breakdown). reportedPercent null means 'no contract that week' and 0 means 'a contract existed and nothing was reported' — do NOT collapse the two. Pass financials for revenue/cost/margin, which are omitted otherwise. Needs the resourcing module and ROLE_RESOURCING_MANAGER. Read-only.

Resourcing Bench_get

Tools

resourcingBench_getWho is NOT staffed over a from/to window — the bench. Reach for it when asked who to put on a new project or where capacity is going unused; resourcingActuals_get tells you how loaded people are, this tells you who has no load at all. IT DOES NOT KNOW ABOUT LEAVE: freePercent is 100 minus confirmed allocations, nothing else, so someone on three weeks' approved holiday reads 100% free and no field on the response says otherwise. Answering 'who is available' from this alone will put people on projects while they are away — cross-check holidays_active or holidays_list. Needs the resourcing module. Read-only.

Resourcing Schedule_get

Tools

resourcingSchedule_getThe planned resourcing schedule over a from/to window — the allocation timeline as the planner shows it. Use it for what is BOOKED going forward; use resourcingActuals_get for what was actually reported against it. Needs the resourcing module and ROLE_RESOURCING_MANAGER. Read-only.

Leads_bulk Import

Tools

leads_bulkImportImport 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.