AI connectors (MCP)

The reads on these pages, offered to an AI client as tools. A client is pointed at one URL, signs a person in through BrizoConsol itself, and then sees only the reads that person's connection was allowed. Nothing here writes.

An MCP client - Claude, ChatGPT, or anything else that speaks the protocol - answers a question by calling these tools instead of being handed the data. Each tool is one read on this same API, answering the same figure the screen shows, so a question about a month's revenue and the report for that month do not disagree.

What the client is told

This is the connector's identity: what a person sees when they add it, and what a model reads before it chooses a tool.

WhatValue
EndpointPOST https://…/mcp - the URL the AI Access screen states, JSON-RPC over HTTP, no server-to-client stream
NameBrizoConsol
Version1.0.0
DescriptionThe text under The description, verbatim
ToolsTwenty-one, listed under The tools. A tool whose scope the connection does not hold is not offered at all, so what a given client sees is usually shorter

The description

Stated once, when the connection is opened, before any tool is called:

Financial reads for the companies this connection was approved for. Start
with list_organisations: its ids are what every other tool takes as
organisation_id, and a company that is not in that list answers not_found.
A month is asked for as `Mon-YYYY` such as `Sep-2026`, except
get_operation_data, which takes `YYYY-MM`; list_periods answers the months a
company accepts. Lists page with page and per_page (50 by default, at most
200). Every read is one company's: ask for the group's own id when the
question is about consolidated figures. Nothing here writes.

A description of its own sits beside every tool, and what is written under The tools is that description unchanged. It is how a model chooses between two tools that sound alike - the ledger or the reported statement, the document or the ledger line behind it - and how it learns what a tool refuses.

How it is discovered

A client is not configured on a screen here first. It reads what it needs from the endpoint itself:

StepCallAnswers
ProbeGET /mcp401 with a challenge naming the document below; a caller that is already known is told 405, because the transport offers no stream
Who guards itGET /.well-known/oauth-protected-resourceThe authorization server this endpoint belongs to
How to authenticateGET /.well-known/oauth-authorization-serverThe authorization, token and registration endpoints, PKCE S256, and the client authentication methods accepted
RegisterPOST /oauth/registerA client_id, registered as the client arrives
Sign inGET /oauth/authorizeThe person's BrizoConsol sign-in, then a code sent to the client's redirect URL
TokenPOST /oauth/tokenAn access token for one hour and a refresh token for thirty days
UsePOST /mcpinitialize, then tools/list and tools/call

That answer is one header, and it is the whole discovery: WWW-Authenticate: Bearer realm="mcp", with resource_metadata pointing at https://…/.well-known/oauth-protected-resource. Everything below is read from there.

There is no consent page between the sign-in and the code. An administrator has already said what an AI connection may read, and a person approving one chooses nothing of their own, so a second confirmation would only ask them to approve what they were never able to change.

Turning it on

AI Access, in the sidebar under Integrations, for an administrator of the group. Three things are saved together, and an allowance with no company or no scope is refused rather than saved as a switch that answers nothing:

SettingWhat it decides
Allow AI connectionsOff, an approved client is refused on every call
CompaniesThe companies a connection may read, the group's own company among them - consolidated figures belong to it, so a connection allowed only subsidiaries answers no group question
Read scopesWhich reads are offered at all: a scope not held means its tools are never listed

This is a ceiling, not a grant. A person approving a client gets the intersection of it with their own deployment, so someone deployed to one company reads that one company even when the ceiling names eight. Both are re-read on every call: closing the switch, narrowing a scope or moving a person ends the access at their next call rather than when their token expires.

AI access has its own switch and does not wait for API access to be turned on. What the two share is the subscription edition that offers either, and the read scopes listed on Endpoints.

What is recorded, and what ends it

Every call is logged - the person, the client, the tool, the company, and whether it was answered, refused for its scope, or denied for the company. AI Access lists the same calls, and the connections themselves.

Ending a connection removes the approval, every registration that person's client made, and the tokens the client already holds, so the next call is refused rather than waiting out the hour.

What it never does

The tools

Twenty-one tools over twelve read scopes. Everything that reads a company's data takes organisation_id - the id list_organisations answers, as it does on the endpoints themselves - and states what it takes where the endpoint does. tools/list pages fifteen tools at a time, answering a cursor for the rest, so a client that reads one page sees a partial surface.

ping no scope
Answers with the person the connection acts for, the companies it was approved for and the scopes it holds. Use it before reporting figures so the answer names whose data it is, and when a call is refused, to see what the connection actually carries.
list_organisations reference.read
Lists the companies this connection may read, each with its currency, fiscal month start and reporting month. Start here: the id is the organisation_id every other tool takes, and a company that is not in this list will answer not_found.
list_account_types reference.read
Lists the system account types every account is classified by, each with the side a positive balance sits on (debit or credit) and the statement it is reported in. Use it to interpret the `type` filter of list_accounts and the section names get_statement answers. It reads no figures.
list_sections reference.read
Lists the statement sections a figure is reported in, for one statement or for both. These are the section names get_statement returns, and the name to pass as `section` when asking get_statement with detail=true. It reads no figures.
list_tags reference.read
Lists the tags of the accounting standards this group reports under, each classified by the statement it feeds. Use it to explain what a tagged figure means; no read takes a tag as a filter, so figures are asked for by company, month and account. It reads no figures.
list_currencies reference.read
Lists the currencies in play for this group and whether a stored rate exists for each. Use it before presenting a figure in another currency: a code with has_rate false is refused as a presentation currency unless it is the company's own, and a missing rate is the usual reason a translated figure cannot be answered.
list_kpis reference.read
Lists the KPI names this group defines. A name here is what get_kpi_value takes as `metric`; a metric that is not in this list is answered not_found. It reads no figures.
list_periods reference.read
Lists the months one company can report, oldest first, as `Mon-YYYY`. Use it to pick a period for a figure read. A month it does not list is still accepted - it simply has no figures - so this list is where the data is, not a filter the read enforces.
list_years reference.read
Lists the fiscal years one company can report, the forecast year first, as the reports label them. Use it when a question is asked by year: read one month with number_of_months (up to 120) to get a run of months in a single call, or ask get_consolidation with basis YTD for a year to date.
list_accounts accounts.read
Lists one company's chart of accounts: code, name, class, type, status and standard tags, narrowed by status, system account type or code. Use the code with get_trial_balance or list_transactions to narrow to one account, and this list to answer what an account is rather than what it holds.
get_trial_balance trial_balance.read
Reads one company's ledger account by account for a month, or the months ending at it: debit, credit, movement, balance and average for each account, in the currency and scenario asked for. This is the ledger itself; use get_statement for the reported sections, and get_statement with detail=true for the accounts behind one section. `period` answers the reporting month when omitted, `scenario` answers Actual.
get_statement statements.read
Reads one company's reported statement for a month. `statement`: profit-loss or balance-sheet answers the sections with their movement and balance; add detail=true and a `section` for the accounts inside it; cash-flow answers its lines for the month, or the year to date with is_ytd. Only cash-flow takes is_ytd, and only the other two take number_of_months, scenario, detail and section - a parameter the chosen statement does not take is refused.
list_transactions transactions.read
Lists one company's journal lines for a month: the lines the trial balance is built from, narrowed to one journal, one account code or one document. Use it to explain a movement or trace it to its journal rather than to total a month; totals belong to get_trial_balance. `period` answers the reporting month when omitted.
get_exchange_rate exchange_rates.read
Reads the stored rate for one currency pair and month, with its type (average or closing) and its source. Use it to explain how a translated figure was arrived at. `from` and `to` are required three-letter codes; a pair with no stored rate answers not_found.
get_kpi_value kpis.read
Reads one KPI of one company for a month: this month, the year to date, last month, the change from last month, the target and the variance. `metric` is a name from list_kpis. Use it for a ratio the reports define rather than for a ledger figure, which is get_trial_balance.
list_invoices invoices.read
Lists one company's invoices for a month: totals, tax, discounts, amount due and paid, and the posted status. This is the document view; use list_transactions for the ledger lines an invoice produced, and get_trial_balance for the receivable balance it sits in.
list_bills bills.read
Lists one company's bills for a month: totals, tax, discounts, amount due and paid, and the posted status. This is the document view; use list_transactions for the ledger lines a bill produced, and get_trial_balance for the payable balance it sits in.
list_operation_datasets operation_data.read
Lists the operational datasets one company holds - the non-ledger feeds it loads, such as headcount or units. A name here is what get_operation_data takes as `dataset`. It reads no figures.
get_operation_data operation_data.read
Reads one operational dataset of one company for a month: the rows as they were loaded, for one scenario, optionally narrowed to one value of the first dimension. Use it for the non-ledger feed behind a cost or volume, not for a balance - those are in get_trial_balance. `period` is required and is `YYYY-MM`, as list_operation_datasets and the reports state it.
get_consolidation consolidation.read
Reads one group-level figure for a month, chosen by `dataset`: cta is the currency translation reserve report, nci the non-controlling interest report, journal-vouchers the consolidation journals, adjustments the adjusting entries, intercompany the intercompany analysis above a materiality threshold. Parameters are per dataset: cta takes period, scenario, basis, flag, subsidiary_id; nci and journal-vouchers take period, scenario, basis, subsidiary_id; adjustments takes period, scenario; intercompany takes period, scenario, flag, materiality - one it does not take is refused. Defaults: period is the reporting month, scenario Actual, basis YTD, flag local, materiality 0.5.
list_intercompany_transactions intercompany.read
Lists the intercompany postings of a group for a month: the elimination entries that take one company's balance against another's, each naming the two companies, the amount, the line count and the accounts it touches. Use it to explain why a consolidated figure differs from the subsidiaries added up - revenue lower than the parts, a loan that nets out - rather than to total a month. A subsidiary holds none of these; ask for the group's own id. `period` answers the reporting month when omitted.