MCP tools

The tools the Osorik MCP server exposes to agents.

Tools run as the signed-in member, in the team chosen when the client connected, with that member's role. Each tool does the same as the matching REST API endpoint and returns the same data, as both text and structured content.

Tools that read data need the read scope and are marked read-only. Tools that create or change data need the write scope. Data follows the API conventions: IDs are strings, amounts are decimal strings, and absent values are null. List tools return { "data": [...], "nextCursor": ... }; pass nextCursor back as cursor for the next page.

ToolScopeREST equivalent
get_teamreadGET /v1/team
list_contactsreadGET /v1/contacts
get_contactreadGET /v1/contacts/{contactId}
create_contactwritePOST /v1/contacts
update_contactwritePATCH /v1/contacts/{contactId}
list_categoriesreadGET /v1/categories
create_categorywritePOST /v1/categories
list_bank_accountsreadGET /v1/bank-accounts
list_transactionsreadGET /v1/transactions
get_transactionreadGET /v1/transactions/{transactionId}
update_transactionwritePATCH /v1/transactions/{transactionId}
list_invoicesreadGET /v1/invoices
get_invoicereadGET /v1/invoices/{invoiceId}
create_invoice_draftwritePOST /v1/invoices
update_invoice_draftwritePATCH /v1/invoices/{invoiceId}
delete_invoice_draftwriteDELETE /v1/invoices/{invoiceId}
get_invoice_settingsreadGET /v1/invoice-settings
list_expensesreadGET /v1/expenses
get_expensereadGET /v1/expenses/{expenseId}
update_expensewritePATCH /v1/expenses/{expenseId}
list_projectsreadGET /v1/projects
get_projectreadGET /v1/projects/{projectId}
create_projectwritePOST /v1/projects
update_projectwritePATCH /v1/projects/{projectId}
list_time_tasksreadGET /v1/projects/{projectId}/tasks
create_time_taskwritePOST /v1/projects/{projectId}/tasks
list_time_entriesreadGET /v1/time-entries
create_time_entrywritePOST /v1/time-entries
update_time_entrywritePATCH /v1/time-entries/{entryId}
delete_time_entrywriteDELETE /v1/time-entries/{entryId}
get_timerreadGET /v1/timer
start_timerwritePOST /v1/timer/start
stop_timerwritePOST /v1/timer/stop

Team

get_team

Returns the team (workspace) the connection acts in.

PropertyValue
ArgumentsNone
Scoperead
REST equivalentGET /v1/team

Team

FieldTypeDescription
idstringTeam ID
namestringTeam name
emailstring or nullContact email
taxIdstring or nullTax identification number
addressstring or nullStreet address
zipCodestring or nullPostal code
citystring or nullCity
statestring or nullState or region
countrystringISO 3166-1 alpha-2 country code, such as PT
timeZonestringIANA time zone, such as Europe/Lisbon
websitestring or nullWebsite URL
logoUrlstring or nullURL of the team logo
roleowner, admin, or memberYour role in the team

Contacts

Contacts are the people and organizations the team pays (payees) or bills (clients).

list_contacts

Lists contacts by name, or by relevance when search is set.

PropertyValue
Argumentssearch, role (client or payee), limit, cursor
Scoperead
REST equivalentGET /v1/contacts

get_contact

Returns one contact.

PropertyValue
ArgumentscontactId
Scoperead
REST equivalentGET /v1/contacts/{contactId}

create_contact

Creates a contact. If the team already has a contact with the same tax ID and country, email, or legal name, that contact is returned instead.

PropertyValue
Argumentsname (required), entityType, industry, isClient, isPayee, and any contact field below
Scopewrite
REST equivalentPOST /v1/contacts

update_contact

Changes the fields sent. null clears an optional field; bankAccount and billing replace the whole object.

PropertyValue
ArgumentscontactId and any field to change
Scopewrite
REST equivalentPATCH /v1/contacts/{contactId}

Contact

FieldTypeDescription
idstringContact ID
namestringDisplay name
legalNamestringRegistered name
entityTypestringorganization, individual, government, nonprofit, or other
industrystringIndustry, such as software_and_cloud
isClientbooleanWhether the team bills this contact
isPayeebooleanWhether the team pays this contact
email, phone, websitestring or nullContact details
address, city, state, zipCodestring or nullPostal address
countrystring or nullISO 3166-1 alpha-2 country code
taxIdstring or nullTax identification number
notestring or nullInternal note
categoryIdstring or nullDefault category for the contact's transactions
bankAccountobject or nullbankName, country, currency, accountNumber, accountNumberType (iban or local), bic
billingobject or nullFor clients: email, bccEmails, address, city, state, zipCode, country, defaultCurrency, paymentTermsDays, reference, portalEnabled
createdAtstringISO 8601 timestamp

Categories

Accounting categories classify transactions, contacts and invoices. Only team owners and admins can create them.

list_categories

Lists the team's categories, grouped by type and sorted by name. A team has at most 100 categories, so nextCursor is always null.

PropertyValue
ArgumentsincludeArchived (boolean, default false): also return archived categories
Scoperead
REST equivalentGET /v1/categories

create_category

Creates a custom category and returns it. Fails with CATEGORY_MANAGEMENT_FORBIDDEN for members and CATEGORY_LIMIT_REACHED when the team already has 100 categories.

PropertyValue
Argumentsname (required, up to 100 characters), description (required, up to 240 characters), type (required: income, expense, asset, tax, financing, owner, transfer or other), accountingCode (up to 32 characters)
Scopewrite
REST equivalentPOST /v1/categories

Category

FieldTypeDescription
idstringCategory ID
namestringCategory name
descriptionstring or nullWhat belongs in the category
typeincome, expense, asset, tax, financing, owner, transfer, or otherAccounting type
accountingCodestring or nullCode in the accountant's chart of accounts
archivedbooleanWhether the category is archived
systemRoleinternal_transfer or nullWorkflow role of a required category; null for ordinary categories

Bank accounts

list_bank_accounts

Lists the team's bank accounts with their account number, currency and last reported balance. All accounts come back in one page, so nextCursor is always null.

PropertyValue
ArgumentsNone
Scoperead
REST equivalentGET /v1/bank-accounts

Bank account

Each item in data:

FieldTypeDescription
idstringBank account ID; use it as bankAccountId to filter transactions
displayNamestring or nullName the team gave the account
accountHolderNamestring or nullAccount holder
bankNamestring or nullBank name
accountTypestring or nullAccount nature, such as current, savings or card
accountNumberstring or nullAccount number, such as an IBAN
accountNumberTypestring or nulliban, bban, sort-code-account-number, us-routing-account-number, pan, masked-pan, msisdn or other
bicstring or nullSwift/BIC code
currencystring or nullISO 4217 currency code
balancestring or nullLast balance the bank reported, as a decimal string in currency

Transactions

list_transactions

Lists the team's booked bank transactions, newest first. Archived transactions are left out unless archived is true. A page can hold fewer items than limit before the last one, so keep following nextCursor until it is null.

PropertyValue
Argumentssearch, bankAccountId, categoryId (an ID or uncategorized), projectId, dateFrom, dateTo (YYYY-MM-DD), direction (credit or debit), status, archived, limit (1–100, default 25), cursor; all optional
Scoperead
REST equivalentGET /v1/transactions

get_transaction

Returns one transaction with its category, contact, project, note and bookkeeping status.

PropertyValue
ArgumentstransactionId
Scoperead
REST equivalentGET /v1/transactions/{transactionId}

update_transaction

Sets the category, contact, project, note or archive flag of a transaction and keeps the fields not sent; null clears one. A category on one side of a linked transfer applies to both sides, debits cannot take income categories, and transfer categories cannot be combined with a project. Setting or clearing projectId needs the owner or admin role.

PropertyValue
ArgumentstransactionId; optional categoryId, note (up to 500 characters), contactId, projectId, archived
Scopewrite
REST equivalentPATCH /v1/transactions/{transactionId}

Transaction

FieldTypeDescription
idstringTransaction ID
datestringBooking date, YYYY-MM-DD
directioncredit, debit, or unknownWhether money came in or went out
amountstringAbsolute amount as a decimal string in currency
currencystringAccount currency
instructedAmountstring or nullOriginal amount when paid in another currency
instructedCurrencystring or nullCurrency of instructedAmount
titlestring or nullDisplay title, usually the counterparty
subtitlestring or nullSecondary description
bankAccountIdstringBank account ID
categoryIdstring or nullCategory ID
contactIdstring or nullCounterparty contact ID
contactNamestring or nullCounterparty contact name
projectIdstring or nullProject ID
notestring or nullTeam note
statusuncategorized, in_progress, complete, needs_review, or no_impactBookkeeping status
reconciliationStatusstring or nullunmatched, partial, matched, difference_accepted or review
internalbooleanA transfer between the team's own accounts
archivedbooleanHidden from default lists
createdAtstringISO 8601 time Osorik first imported it

Invoices

Outgoing invoices the team bills its clients. Agents can read every invoice and create, change and delete drafts. Issuing, voiding and sending invoices stays in Osorik. Amounts are decimal strings in the invoice currency, such as 1250.00.

list_invoices

Lists invoices without their lines, newest first or by relevance when search is set.

PropertyValue
Argumentsstatus (optional array of draft, issuing, issue_failed, issued, void), clientId (optional), search (optional), limit (1 to 100, default 25), cursor (optional)
Scoperead
REST equivalentGET /v1/invoices

Returns { data, nextCursor }, where data is a list of invoices and nextCursor is null on the last page.

get_invoice

Returns one invoice with its lines and, once it is issued, a PDF download URL.

PropertyValue
ArgumentsinvoiceId
Scoperead
REST equivalentGET /v1/invoices/{invoiceId}

Returns an invoice with lines.

create_invoice_draft

Creates an unnumbered invoice draft for a client, filling left-out fields from the client's billing defaults and the team's invoice settings.

PropertyValue
Argumentstitle, clientId, lines (1 to 200 of { description, quantity, unitPrice }), issueDate, and optional categoryId, bankAccountId, currency, dueDate, discountPercentage (0 to 100), note
Scopewrite
REST equivalentPOST /v1/invoices

quantity and unitPrice are decimal strings with up to 6 decimals. Left-out fields default as in the invoice editor:

  • currency: the client's currency, then the bank account's currency, then the team currency.
  • dueDate: issueDate plus the client's payment terms, then the settings' payment terms (30 days unless changed).
  • categoryId: the settings' category. It must be an active income category.
  • bankAccountId: the settings' account, then the first account with payment instructions.
  • note: the settings' note.

Returns the new invoice with lines.

update_invoice_draft

Changes the fields sent on a draft and keeps the rest; lines replaces every line.

PropertyValue
ArgumentsinvoiceId, and any of title, clientId, lines, issueDate, dueDate, categoryId, bankAccountId, currency, discountPercentage, note
Scopewrite
REST equivalentPATCH /v1/invoices/{invoiceId}

null clears discountPercentage or note. Invoices that are no longer drafts fail with INVOICE_IMMUTABLE. Returns the updated invoice with lines.

delete_invoice_draft

Permanently deletes a draft that was never numbered, with its lines.

PropertyValue
ArgumentsinvoiceId
Scopewrite
REST equivalentDELETE /v1/invoices/{invoiceId}

Returns { id, deleted: true }. Issued, voided and numbered invoices fail with INVOICE_IMMUTABLE.

get_invoice_settings

Returns the team's invoice number prefix and the defaults new drafts use.

PropertyValue
ArgumentsNone
Scoperead
REST equivalentGET /v1/invoice-settings

Invoice

FieldTypeDescription
idstringInvoice ID
numberstring or nullInvoice number, such as INV-2026-0001; null for drafts
titlestringInvoice title
statusdraft, issuing, issue_failed, issued, or voidLifecycle state; only drafts can be changed or deleted
deliveryStatusnot_sent, queued, sent, or failedEmail delivery state
paymentStatusunmatched, partial, matched, difference_accepted, or reviewHow far bank payments cover the total
clientIdstringContact the invoice bills
clientNamestringClient name, frozen when the invoice is issued
categoryIdstringIncome category ID
bankAccountIdstringID of the bank account the client pays into
currencystringISO 4217 currency code, such as EUR
issueDatestringIssue date as YYYY-MM-DD
dueDatestringDue date as YYYY-MM-DD
discountPercentagenumber or nullDiscount on the line subtotal, from 0 to 100
discountAmountstring or nullDiscount amount; null without a discount
totalAmountstringTotal after discount
paidAmountstringAmount matched to bank payments so far
notestring or nullNote printed on the invoice
issuedAtstring or nullWhen the invoice was issued, ISO 8601
voidedAtstring or nullWhen the invoice was voided, ISO 8601
createdAtstringWhen the invoice was created, ISO 8601
updatedAtstringWhen the invoice last changed, ISO 8601

Invoice with lines

Every invoice field, plus:

FieldTypeDescription
linesarrayInvoice lines in order, each with the fields below
lines[].descriptionstringLine description
lines[].quantitystringDecimal quantity
lines[].unitPricestringDecimal unit price
lines[].lineTotalstringQuantity times unit price, rounded to the currency
pdfUrlstring or nullTemporary download URL of the issued PDF; null until it is rendered

Invoice settings

FieldTypeDescription
prefixstringPrefix of invoice numbers, such as INV
defaultPaymentTermsDaysnumberDays from issue date to due date for new drafts
defaultCategoryIdstring or nullIncome category for new drafts
defaultBankAccountIdstring or nullBank account for new drafts
defaultNotestring or nullNote for new drafts

Expenses

list_expenses

Lists the team's expenses, the bills and receipts it uploaded, newest first. Archived expenses are left out unless archived is true. A page can hold fewer items than limit before the last one, so keep following nextCursor until it is null.

PropertyValue
Argumentsstatus (list of statuses), archived, search, payeeId, limit (1–100, default 25), cursor; all optional
Scoperead
REST equivalentGET /v1/expenses

get_expense

Returns one expense with its extracted details and a short-lived documentUrl to download the uploaded document.

PropertyValue
ArgumentsexpenseId
Scoperead
REST equivalentGET /v1/expenses/{expenseId}

update_expense

Changes the fields sent and keeps the rest; null clears an optional field. Details can change only while the expense is unmatched (otherwise EXPENSE_NOT_EDITABLE); archived can change in any status.

PropertyValue
ArgumentsexpenseId; optional payeeId, reference, date, dueDate, currency, amount, taxType, taxAmount, archived
Scopewrite
REST equivalentPATCH /v1/expenses/{expenseId}

Expense

FieldTypeDescription
idstringExpense ID
statusprocessing, failed, unmatched, partial, matched, or difference_acceptedDocument reading and matching state
payeeIdstring or nullPayee contact ID
payeeNamestring or nullPayee name
referencestring or nullInvoice or receipt number
datestring or nullIssue date, YYYY-MM-DD
dueDatestring or nullDue date, YYYY-MM-DD
currencystring or nullISO 4217 currency code
amountstring or nullTotal including tax, as a decimal string
taxTypestring or nullTax kind, such as vat
taxAmountstring or nullTax amount, as a decimal string
reconciledAmountstringPart of amount matched to bank transactions
archivedbooleanHidden from default lists
documentIdstringID of the uploaded document
extractionErrorstring or nullWhy reading the document failed
createdAtstringISO 8601 upload time
documentUrlstring or nullget_expense only: short-lived link to the document

Projects

Projects group client or internal work for time tracking and cash flow. Every member can read them; only team owners and admins can create or change them.

list_projects

Lists the team's projects, most recently updated first, or by relevance when search is set.

PropertyValue
Argumentsstatus (planned, active, on_hold, completed or cancelled), clientId, search, limit (1 to 100, default 25), cursor
Scoperead
REST equivalentGET /v1/projects

get_project

Returns one project with its assigned team members. Members' hourly rates are shown only to owners and admins.

PropertyValue
ArgumentsprojectId (required)
Scoperead
REST equivalentGET /v1/projects/{projectId}

create_project

Creates a project in the planned state, assigns you to it at billableRate and returns it with its members. clientId must be a contact marked as a client.

PropertyValue
Argumentsname (required, up to 120 characters), currency (required, ISO 4217), billableRate (required decimal string, 0 when not charged), description, clientId, startDate, targetEndDate (on or after startDate), timeRoundingMinutes (0, 5, 10, 15 or 30, default 15)
Scopewrite
REST equivalentPOST /v1/projects

update_project

Changes the fields sent and keeps the rest; null clears description, clientId, startDate or targetEndDate. completed and cancelled close the project. A closed project must be reopened before its other fields change, which can happen in the same call. The client and currency cannot change once time is tracked (PROJECT_TIME_IDENTITY_LOCKED).

PropertyValue
ArgumentsprojectId (required), name, description, clientId, currency, startDate, targetEndDate, timeRoundingMinutes, status
Scopewrite
REST equivalentPATCH /v1/projects/{projectId}

Project

list_projects returns these fields; get_project, create_project and update_project add members.

FieldTypeDescription
idstringProject ID
namestringProject name
descriptionstring or nullProject description
statusplanned, active, on_hold, completed, or cancelledLifecycle state
clientIdstring or nullClient contact ID; null for internal work
currencystringISO 4217 currency code
startDatestring or nullStart date, YYYY-MM-DD
targetEndDatestring or nullPlanned end date, YYYY-MM-DD
timeRoundingMinutes0, 5, 10, 15, 30, or nullRounding applied to billable time entries
closedAtstring or nullWhen the project was completed or cancelled (ISO 8601)
createdAtstringCreation time (ISO 8601)
updatedAtstringLast change (ISO 8601)
membersarray of ProjectMemberAssigned team members (single-project tools only)

Project member

FieldTypeDescription
userIdstringUser ID of the member
namestring or nullMember's name
billableRatestring or nullHourly rate as a decimal string in the project currency; null unless you are an owner or admin

Time

Time is tracked against reusable tasks on projects. Members log time only on projects they are assigned to, and see and change only their own entries; owners and admins see everyone's entries and billable rates.

list_time_tasks

Lists a project's tasks, up to 200, on a single page (nextCursor is always null). Archived tasks are left out unless includeArchived is true.

PropertyValue
ArgumentsprojectId (required), includeArchived
Scoperead
REST equivalentGET /v1/projects/{projectId}/tasks

create_time_task

Adds a task to an open project. Task names are unique within a project, ignoring case and spacing, and a project holds at most 200 tasks.

PropertyValue
ArgumentsprojectId, name (required); description
Scopewrite
REST equivalentPOST /v1/projects/{projectId}/tasks

list_time_entries

Lists entries that start between from and to, which can be at most 62 days apart. Returns up to 1000 entries; truncated is true when more matched, so narrow the range or add filters. Members always get only their own entries.

PropertyValue
Argumentsfrom, to (required, ISO 8601 date-times); projectId, clientId, memberId (owners and admins), taskId, billable
Scoperead
REST equivalentGET /v1/time-entries

create_time_entry

Records completed time for you on an active task of a project you are assigned to. Billable minutes follow the project's rounding, and billable time takes your project rate, which must be set.

PropertyValue
ArgumentsprojectId, taskId, startAt, endAt (ISO 8601 date-times), billable, all required
Scopewrite
REST equivalentPOST /v1/time-entries

update_time_entry

Changes the fields sent on a completed entry and recalculates its minutes and rate. Owners and admins can move an entry to another assigned member with memberId. Stop a running timer before editing it.

PropertyValue
ArgumentsentryId and any of projectId, taskId, startAt, endAt, billable, memberId
Scopewrite
REST equivalentPATCH /v1/time-entries/{entryId}

delete_time_entry

Permanently deletes a time entry and returns { id, deleted: true }.

PropertyValue
ArgumentsentryId
Scopewrite
REST equivalentDELETE /v1/time-entries/{entryId}

get_timer

Returns your running timer as { entry }, with entry: null when none is running. Each member has at most one timer.

PropertyValue
ArgumentsNone
Scoperead
REST equivalentGET /v1/timer

start_timer

Starts a timer for you now and returns the running entry. Fails with TIME_TIMER_RUNNING when one is already running.

PropertyValue
ArgumentsprojectId, taskId, billable, all required
Scopewrite
REST equivalentPOST /v1/timer/start

stop_timer

Stops your running timer now and returns the completed entry. Fails with TIME_TIMER_NOT_FOUND when no timer is running.

PropertyValue
ArgumentsNone
Scopewrite
REST equivalentPOST /v1/timer/stop

Time task

FieldTypeDescription
idstringTask ID
projectIdstringProject the task belongs to
namestringTask name
descriptionstring or nullDescription
archivedbooleanArchived tasks keep their history but take no new time

Time entry

FieldTypeDescription
idstringEntry ID
projectIdstringProject ID
projectNamestring or nullProject name
taskIdstringTask ID
taskNamestring or nullTask name
clientId, clientNamestring or nullClient of the project; null for internal projects
memberobjectid and name of the member the time belongs to
statusstringrunning or completed
startAtstringISO 8601 timestamp
endAtstring or nullISO 8601 timestamp; null while running
actualMinutesnumber or nullTracked minutes; null while running
billableMinutesnumber or nullMinutes after the project's rounding; null while running
billablebooleanWhether the time is billable
billableRatestring or nullHourly rate as a decimal string, such as 100.00; null for non-billable time and for members
currencystringISO 4217 currency code of the rate

Errors

When a tool fails, the result has isError: true and a text message in the form CODE: message, such as INSUFFICIENT_SCOPE: This requires the "write" scope. or PROJECT_MANAGEMENT_FORBIDDEN: Only owners and admins can manage projects. See the error codes.

On this page