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_get | One 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_list | 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. |
Bank Accounts_get
Tools
| bankAccounts_get | Get one bank account by id — name, currency, bank, and the format its statements are imported in. |
Bank Accounts_list
Tools
| bankAccounts_list | 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. |
Clients_get
Tools
| clients_get | Get one client by id — name, country, currency, tax id and status. |
Clients_list
Tools
| clients_list | 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. |
Config Keys_catalog
Tools
| configKeys_catalog | 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. |
Configs_get
Tools
| configs_get | Read 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_get | Get one contract by id — parties, direction, value, cyclic terms and dates. |
Contracts_list
Tools
| contracts_list | 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. |
Contracts_payment Schedule Lines
Tools
| contracts_paymentScheduleLines | 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. |
Cost Groups_list
Tools
| costGroups_list | 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. |
Counterparties_get
Tools
| counterparties_get | Get one counterparty by id. |
Counterparties_list
Tools
| counterparties_list | 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. |
CRM Notes_get
Tools
| crmNotes_get | Get one CRM note by id. |
CRM Notes_list
Tools
| crmNotes_list | List 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_get | Get one deal lost-reason by id. |
Deal Lost Reasons_list
Tools
| dealLostReasons_list | List the reasons a deal can be marked lost, in order. deals_lose requires a lostReasonId from here. |
Deals_get
Tools
| deals_get | Get one deal by id — title, client, stage, amount, owner, contact, expected and actual close dates. |
Deals_list
Tools
| deals_list | 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. |
Deal Stage Histories_get
Tools
| dealStageHistories_get | Get one deal stage-change record by id. |
Deal Stage Histories_list
Tools
| dealStageHistories_list | 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. |
Holiday Requests_list
Tools
| holidayRequests_list | Leave 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_active | Who 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_get | One 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_list | Booked 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_get | Get one incoming (supplier) invoice or supporting document by id, with its OCR'd fields and current match state. |
Incoming Invoices_list
Tools
| incomingInvoices_list | 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. |
Incoming Invoices_match Candidates
Tools
| incomingInvoices_matchCandidates | 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. |
Incoming Invoices_suggestions
Tools
| incomingInvoices_suggestions | 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. |
Incoming Invoices_suggestions Debug
Tools
| incomingInvoices_suggestionsDebug | 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. |
Invoices_get
Tools
| invoices_get | Get one outgoing (sales) invoice by id — client, rows, totals, sale and issue dates, status. |
Invoices_list
Tools
| invoices_list | 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. |
Lead Activities_get
Tools
| leadActivities_get | Get one lead activity (outreach touch) by id. |
Lead Activities_list
Tools
| leadActivities_list | 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 Contacts_get
Tools
| leadContacts_get | Get one lead contact by id. |
Lead Contacts_list
Tools
| leadContacts_list | 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 List Memberships_get
Tools
| leadListMemberships_get | Get one lead-to-list membership by id. |
Lead List Memberships_list
Tools
| leadListMemberships_list | 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. |
Lead Lists_get
Tools
| leadLists_get | Get one outbound prospecting list by id. |
Lead Lists_list
Tools
| leadLists_list | List outbound prospecting lists. Use it to resolve the list id that leadListMemberships_create takes. |
Lead Lost Reasons_get
Tools
| leadLostReasons_get | Get one lead lost-reason by id. |
Lead Lost Reasons_list
Tools
| leadLostReasons_list | List the reasons a lead can be marked lost, in order. |
Leads_dedupe Check
Tools
| leads_dedupeCheck | 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. |
Leads_get
Tools
| leads_get | Get one lead by id — company, website, source, status, owner and the client it converted to, if any. |
Leads_list
Tools
| leads_list | 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. |
Lead Stages_get
Tools
| leadStages_get | Get one lead stage by id. |
Lead Stages_list
Tools
| leadStages_list | List the stages a lead moves through, in order. Leads have their own stage set — deals use stages_list, which is a different thing. |
Organizations_get
Tools
| organizations_get | 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. |
People_get
Tools
| people_get | Get one person/employee record by id — names, emails, phone, manager, and whether they are active. |
People_list
Tools
| people_list | 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. |
Permission Groups_get
Tools
| permissionGroups_get | Get one permission group by id, including the ROLE_* strings it grants. |
Permission Groups_list
Tools
| permissionGroups_list | 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. |
Pipelines_get
Tools
| pipelines_get | Get one sales pipeline by id. |
Pipelines_list
Tools
| pipelines_list | List sales pipelines. A pipeline owns an ordered set of stages — read them with stages_list filtered by pipeline. |
Positions_list
Tools
| positions_list | 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. |
Projects_get
Tools
| projects_get | Get one project by id — name, type, client, dates, description and price. |
Projects_list
Tools
| projects_list | 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. |
Resource Request Candidates_get
Tools
| resourceRequestCandidates_get | One recruitment candidate by id. The id comes from resourceRequestCandidates_list. Needs ROLE_HR_MANAGER. Read-only. |
Resource Request Candidates_list
Tools
| resourceRequestCandidates_list | The 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_get | One 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_list | Open 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_list | Open 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_list | What 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_get | Get one responsibility by id. |
Responsibilities_list
Tools
| responsibilities_list | List 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_get | Get one responsibility assignment by id. |
Responsibility Employees_list
Tools
| responsibilityEmployees_list | 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. |
Responsibility Groups_get
Tools
| responsibilityGroups_get | Get one responsibility group by id. |
Responsibility Groups_list
Tools
| responsibilityGroups_list | List 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_get | One schedule-to-employee assignment by id. The id comes from scheduleEmployees_list. Needs ROLE_SCHEDULES_MANAGER. Read-only. |
Schedule Employees_list
Tools
| scheduleEmployees_list | Which 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_list | The 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_get | One schedule time range by id. The id comes from scheduleRanges_list. Needs ROLE_SCHEDULES_MANAGER. Read-only. |
Schedule Ranges_list
Tools
| scheduleRanges_list | The 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_get | One 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_list | Working-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_get | Get one deal stage by id. |
Stages_list
Tools
| stages_list | 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. |
Suppliers_list
Tools
| suppliers_list | 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. |
Tag Definitions_list
Tools
| tagDefinitions_list | 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. |
Tag Groups_list
Tools
| tagGroups_list | List tag groups — the containers that organize tag definitions. |
Task Comments_list
Tools
| taskComments_list | List comments on project tasks, oldest first. Filter by task to read one task's discussion. |
Task Lists_list
Tools
| taskLists_list | List 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_get | Get one project task by id — title, project, status, list, assignees, dates and recurrence. |
Tasks_list
Tools
| tasks_list | 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. |
Task Statuses_list
Tools
| taskStatuses_list | 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. |
Tax Groups_list
Tools
| taxGroups_list | List tax groups. Use it to resolve the taxGroup id that taxRules_list filters on and that invoice rows carry. |
Tax Rules_list
Tools
| taxRules_list | List tax rules — the rates and the periods they apply to. Filter by taxGroup. |
Transactions_list
Tools
| transactions_list | 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. |
Transactions_suggestions
Tools
| transactions_suggestions | 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. |
Work Times_get
Tools
| workTimes_get | Get a single work-time entry by id — date, minutes, project, notes and the employee it belongs to. |
Work Times_list
Tools
| workTimes_list | 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. |
Work Times_log
Tools
| workTimes_log | Log a work-time entry for the connected Flowtly user (date, durationMinutes, project, notes). Write. |
Tasks_create
Tools
| tasks_create | Create a project task (title + project required; optional status, list, assignees, dueAt, priority). Write. |
Tasks_update
Tools
| tasks_update | Update a project task by id — change status (incl. mark done), assignees, dueAt, title, etc. Write. |
Task Comments_create
Tools
| taskComments_create | Add a comment to a project task (task id + content). Write. |
Suppliers_create
Tools
| suppliers_create | Create a new supplier/contractor record (name, tinType, costGroup required). Write. |
Suppliers_update
Tools
| suppliers_update | Update a supplier/contractor's details (name, tax id, payment terms, etc.) by id. Write. |
People_create
Tools
| people_create | Create a person/employee record (firstname + lastname required; optional companyEmail, contactEmail, contactPhone). Write. |
People_update
Tools
| people_update | Update a person/employee record by id (name, companyEmail, contactEmail, contactPhone, etc.). Write. |
People_delete
Tools
| people_delete | 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. |
Cost Groups_create
Tools
| costGroups_create | Create a cost group / cost center (name + type required). Write. |
Cost Groups_update
Tools
| costGroups_update | Update a cost group / cost center's name or type by id. Write. |
Tag Groups_create
Tools
| tagGroups_create | Create a tag group (name required) to organize related tag definitions. Write. |
Tag Definitions_create
Tools
| tagDefinitions_create | Create a tag definition (name, level, tagGroup required) within a tag group. Write. |
Clients_create
Tools
| clients_create | Create a new client record (name, country, currency, status, tinType required). Write. |
Clients_update
Tools
| clients_update | Update a client record by id. Write. |
Client Contacts_create
Tools
| clientContacts_create | Create a contact person for a client (client, type, name, email required). Write. |
Bank Accounts_create
Tools
| bankAccounts_create | Create a bank account (type, name, currency, defaultImportFormat required). Write. |
Bank Accounts_update
Tools
| bankAccounts_update | Update a bank account by id. Write. |
Counterparty Bank Accounts_create
Tools
| counterpartyBankAccounts_create | Attach a bank account to a counterparty (counterparty + accountNumber). Write. |
Contracts_create
Tools
| contracts_create | Create a contract. Write. |
Contracts_update
Tools
| contracts_update | Update a contract by id. Write. |
Contracts_delete
Tools
| contracts_delete | Delete a contract by id. Write. |
Tax Groups_create
Tools
| taxGroups_create | Create a tax group (name + type required). Write. |
Tax Groups_update
Tools
| taxGroups_update | Update a tax group's name or type by id. Write. |
Tax Rules_create
Tools
| taxRules_create | Create a tax rule. Write. |
Tax Rules_update
Tools
| taxRules_update | Update a tax rule by id. Write. |
Configs_update
Tools
| configs_update | Update an organization config value by id (type + name required; permission is enforced per config key by the backend). Write. |
Permission Groups_create
Tools
| permissionGroups_create | Create a permission group (name required; roles = list of ROLE_* strings it grants). Write. |
Permission Groups_update
Tools
| permissionGroups_update | Update a permission group's name, description, or granted roles by id. Write. |
People_set Permission Groups
Tools
| people_setPermissionGroups | 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. |
Projects_create
Tools
| projects_create | Create 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_update | Update a project by id (name, type, dates, description, etc.). Write. |
Responsibility Groups_create
Tools
| responsibilityGroups_create | 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. |
Responsibility Groups_update
Tools
| responsibilityGroups_update | Update a responsibility group by id (name, description, responsibleEmployee = employee id or IRI). Write. |
Responsibilities_create
Tools
| responsibilities_create | 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. |
Responsibilities_update
Tools
| responsibilities_update | Update a responsibility by id (name, description, parent, responsibilityGroup = group id or IRI). Write. |
Responsibility Employees_create
Tools
| responsibilityEmployees_create | 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 Employees_update
Tools
| responsibilityEmployees_update | Update a responsibility assignment by id (percentage, targets, description). Write. |
Responsibility Employees_delete
Tools
| responsibilityEmployees_delete | Remove an employee's assignment from a responsibility by id. Write. |
Leads_create
Tools
| leads_create | Create a lead (outbound/inbound prospect target; companyName, source, status, owner, linked client optional). Write. |
Leads_update
Tools
| leads_update | Update a lead by id (company, website, source, status, owner, linked client). Write. |
Leads_delete
Tools
| leads_delete | Delete a lead by id (soft delete). Write. |
Leads_convert
Tools
| leads_convert | 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. |
Lead Activities_create
Tools
| leadActivities_create | 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 Activities_update
Tools
| leadActivities_update | Update a logged outreach activity by id (type, channel, occurredAt, body). Write. |
Lead Activities_delete
Tools
| leadActivities_delete | Delete a logged outreach activity by id. Write. |
Lead Contacts_create
Tools
| leadContacts_create | 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 Contacts_update
Tools
| leadContacts_update | Update a lead contact by id — e.g. set linkedinUrl / email / phone once you find them. Write. |
Lead Contacts_delete
Tools
| leadContacts_delete | Delete a lead contact by id. Write. |
Deals_create
Tools
| deals_create | Create a deal/opportunity (title, client, stage required; amountMinor, currency, expectedCloseDate, owner, contact optional). Write. |
Deals_update
Tools
| deals_update | Update a deal by id (title, stage, amount, close date, owner, contact). Moving the stage is logged automatically. Write. |
Deals_delete
Tools
| deals_delete | Delete a deal by id (soft delete). Write. |
Deals_win
Tools
| deals_win | Mark a deal won — moves it to a won stage and stamps it closed; optional contractId links an existing contract. Write. |
Deals_lose
Tools
| deals_lose | Mark a deal lost — requires lostReasonId (from dealLostReasons_list); optional lostReasonNote. Write. |
Deals_reopen
Tools
| deals_reopen | Reopen a won/lost deal back to open. Write. |
Lead Lists_create
Tools
| leadLists_create | Create an outbound prospecting list (name required). Write. |
Lead Lists_update
Tools
| leadLists_update | Update an outbound list by id. Write. |
Lead Lists_delete
Tools
| leadLists_delete | Delete an outbound list by id. Write. |
Lead List Memberships_create
Tools
| leadListMemberships_create | Add a lead to an outbound list (list + lead required; status optional). Write. |
Lead List Memberships_update
Tools
| leadListMemberships_update | Update a lead’s membership in a list — e.g. set outreach status (contacted/replied/bounced). Write. |
Lead List Memberships_delete
Tools
| leadListMemberships_delete | Remove a lead from an outbound list. Write. |
CRM Notes_create
Tools
| crmNotes_create | Add 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_update | Update a CRM note’s body by id. Write. |
CRM Notes_delete
Tools
| crmNotes_delete | Delete a CRM note by id. Write. |
Organization Logo_upload
Tools
| organizationLogo_upload | Upload/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_upload | Upload/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_create | 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. |
Invoices_export
Tools
| invoices_export | 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. |
Invoices_export Status
Tools
| invoices_exportStatus | 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. |
Invoices_import
Tools
| invoices_import | File 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_create | Record 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_update | Update 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_applySuggestion | 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. |
Incoming Invoices_accept All Suggestions
Tools
| incomingInvoices_acceptAllSuggestions | 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. |
Incoming Invoices_check EInvoices
Tools
| incomingInvoices_checkEInvoices | 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. |
Resourcing_import Timeline
Tools
| resourcing_importTimeline | 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. |
Transactions_import Statement
Tools
| transactions_importStatement | Import 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_whoami | 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. |
Resourcing Actuals_get
Tools
| resourcingActuals_get | Reported 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_get | Who 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_get | The 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_bulkImport | 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. |