confirm argument, the dry-run preview, tool annotations and per-user
access levels. For the plain-language safety model, see
Handlinger & guardrails.
Each connector is its own MCP server at
https://mcp.consile.ai/<id>/mcp with
only its own tools. Write tools are called on the connector endpoint. The
aggregate https://mcp.consile.ai/mcp is the Consile Concierge, which has no
connector tools. Tool names carry the endpoint’s id as a prefix,
<id>__<tool>, for example economic__create_draft_invoice,
shopify__set_product_status or linkedin-ads__set_campaign_status. An extra
portal has its own endpoint and prefix, for example
https://mcp.consile.ai/economic-2/mcp with economic-2__create_draft_invoice.
Only the connect_account system tool has no prefix. The AI calls these names on
your behalf.Which connectors have write tools
Every tool on a read-only endpoint is a read. Everything below applies to the seven
write-capable connectors.
The three guardrail rules
The write-capable connectors follow three rules. Whether a particular call is guarded depends on the tool and its arguments, as listed per connector below.- New objects are created paused or as drafts by default. Meta Ads objects
are created
PAUSED. New LinkedIn Ads objects and posts, Shopify products and HubSpot pages and blog posts are drafts. e-conomic invoices, credit notes and journal entries are unbooked drafts, Uniconta journal lines are unposted, and a new HubSpot marketing email cannot send. A create call that asks for a live status (ACTIVE, orPUBLISHEDfor a LinkedIn post) needsconfirm: true. - Spending, destructive and public actions need
confirm: true. That covers setting a campaign or adACTIVE, changing a budget or bid, changing a price or inventory, publishing to a live website, sending a marketing email, publishing organic social content, booking to the ledger, and archiving or deleting. - Without
confirm: true, a guarded call is a dry-run. It returns a preview of exactly what would happen and writes nothing at the provider. Nothing changes until a call carriesconfirm: true. The AI normally shows you the preview and then repeats the same call withconfirm: true.
confirm: true.
Default status: DRAFT / PAUSED
By default, creating an object does not make it live:- Meta Ads:
create_campaign,create_ad_setandcreate_adcreate the object asPAUSED. It exists, but does not deliver and spends nothing. Passingstatus: "ACTIVE"(or"ARCHIVED") at creation needsconfirm: true; with it, the object is created in that status. - LinkedIn Ads:
create_campaign_groupandcreate_campaigncreate the object asDRAFT.PAUSEDis also applied directly, whileACTIVEorARCHIVEDneedsconfirm: true.create_organization_postandcreate_member_postcreate aDRAFTpost, andlifecycleState: "PUBLISHED"needsconfirm: true. - Shopify:
create_productcreates the product asDRAFT, not published to any sales channel.ACTIVEorARCHIVEDat creation needsconfirm: true. - HubSpot CMS: new pages and blog posts are forced to draft. HubDB row writes land in the table’s draft.
- HubSpot Marketing Email: new emails are forced to state
DRAFT, and the create and update tools never acceptstate,publishDateorsendOnPublish, so they cannot send or schedule an email. - e-conomic:
create_draft_invoice,duplicate_invoiceandcreate_credit_notecreate unbooked drafts, andcreate_journal_entriescreates unbooked journal entries. Every e-conomic write needsconfirm: true, including these. - Uniconta:
create_journal_linescreates unposted lines in the daily journal (kassekladde). Every Uniconta write needsconfirm: true, including this one.
create_product_variant applies directly, including the new
variant’s price; there is no confirmation step. On a product that is already
ACTIVE and published, the new variant is available in the store right away.
Taking an object live (setting it ACTIVE, publishing or sending) needs the
relevant tool and confirm: true, because those steps spend money or change what
the public sees (rule 2).
The confirm argument
Guarded tools accept an optional boolean confirm argument.
boolean
Optional. Set
true to apply the change. Omit it (or send false) and a guarded
call returns a dry-run preview and writes nothing at the provider. Leaving it out
is not a validation error. The HubSpot CMS and HubSpot Marketing Email draft tools
(create_page_draft, update_page_draft, create_blog_post_draft,
update_blog_post_draft, upsert_hubdb_row_draft, create_email,
update_email_draft, clone_email, create_email_ab_variation) have no
confirm argument; they always apply directly.confirm: true to apply) when it would:
- spend money: set a campaign, campaign group, ad set, ad or creative to
ACTIVE, at creation or later (Meta Ads, LinkedIn Ads); - change a budget or bid: Meta Ads
update_budget, LinkedIn Adsupdate_campaignwith a budget orunitCostAmount, andupdate_campaign_groupwithtotalBudgetAmount; - change a price or inventory: a Shopify variant’s
priceorcompareAtPrice,set_inventory_quantityandadjust_inventory_quantity; - publish to or withdraw from a live surface: the HubSpot CMS publish tools, HubSpot
Marketing Email
publish_emailandunpublish_email, a LinkedIn post set toPUBLISHEDor with changed text, LinkedIn comments and reactions, and Shopifypublish_product,unpublish_productor statusACTIVE; - change or discard saved HubSpot work: HubSpot Marketing Email
update_email,reset_email_draftand the two revision restores, and HubSpot CMSreset_hubdb_draft; - archive or delete an object (LinkedIn Ads
delete_reactionis the exception); - book to the ledger: e-conomic
book_journal_entriesand Unicontapost_journal_lines.
confirm: true, with no exceptions.
Writes that apply without confirm
These writes are applied on the first call, without a preview. Some of them change something that is already live:- HubSpot CMS:
create_page_draft,update_page_draft,create_blog_post_draft,update_blog_post_draftandupsert_hubdb_row_draft. Nothing reaches the live website before a publish. - HubSpot Marketing Email:
create_email,update_email_draft,clone_emailandcreate_email_ab_variation. A draft cannot send. - Meta Ads: creating campaigns, ad sets and ads as
PAUSED, andupdate_statustoPAUSED. - LinkedIn Ads: creating campaign groups and campaigns as
DRAFTorPAUSED, including a budget set at creation;update_campaign_groupthat changes only the name or end date;update_campaignthat changes only the name ortargetingCriteria, also on an active campaign;set_campaign_group_status,set_campaign_statusandset_creative_statustoDRAFTorPAUSED;create_conversion_rule,update_conversion_ruleandassociate_campaign_conversion; posts created asDRAFT;update_postthat only setslifecycleState: "DRAFT"; anddelete_reaction. - Shopify:
create_productasDRAFT;update_productwithout a status change toACTIVEorARCHIVED(on a live product, the new title, description, vendor, type or tags show in the store right away);set_product_statusorupdate_producttoDRAFT, which takes a live product off sale;create_product_variant, including its price and also on a live product; andupdate_product_variantwithout apriceorcompareAtPricechange. - e-conomic: none.
- Uniconta: none.
The dry-run preview
A guarded call withoutconfirm: true returns a normal tool result, not an error.
The preview object is in structuredContent and, serialized as JSON, in the text
content block. Every write connector uses the same envelope; what goes inside
request differs per connector:
Dry-run preview (no confirm)
object
Present only on a dry-run. Nothing was written.
string
The tool that produced the preview, e.g.
update_status or publish_email.string
A readable description of the intended change.
object
The exact write that would be sent. e-conomic, Uniconta, Meta Ads, LinkedIn Ads,
HubSpot CMS and HubSpot Marketing Email give
method, path and body
(e-conomic leaves out body on a DELETE; Uniconta’s DELETE carries the line
to delete). Shopify gives method: "GRAPHQL", mutation and
variables. An e-conomic write that takes several steps (for example
create_delivery_location that also sets the customer’s default) also returns
preview.plan with every step in order; request is the first step.object
Only on e-conomic
book_journal_entries and Uniconta post_journal_lines:
{ "expectedState": "..." }, which the confirming call must send back as the
expectedState argument.string
How to apply the change.
confirm: true:
Confirmed write (executes upstream)
The AI runs these calls for you. It is expected to show you the preview and get
your go-ahead before it repeats the call with
confirm: true. Treat the preview
as the moment to review before any spend, publish, send or booking.Tool annotations
Every tool intools/list carries MCP annotations, so a client can tell reads from
writes without calling anything:
The tool’s
title is also repeated in annotations.title. Some clients use these
hints; Claude, for example, may ask you to approve each call to a tool marked
destructiveHint. The hints describe the tool. Whether a particular call also needs
confirm: true depends on its arguments, as described above.
Per-user access levels
Some connectors have access levels. An administrator of the Consile account chooses one per user on the Team page of the portal (see Team). Today e-conomic and Uniconta have them:
The counts are the connector’s full set. Every level only gives tools that the
organization has switched on: a tool released after the organization bought the
connector (on Uniconta, for example, the six daily-journal tools for an organization
that bought Uniconta before they were released) stays off until an administrator
activates it on the connector’s page. See Tools and new tools.
Both levels cost the same. For a user on Read only, Consile blocks all write
operations on the server, on top of the confirm guardrail:
tools/liston the user’s endpoints for that connector lists only the read tools (28 on e-conomic, 21 on Uniconta), plus theconnect_accountsystem tool.- A
tools/callto a write tool is refused before anything is sent to the provider. The result hasisError: trueand starts withThis tool is not enabled for your user on <id>, so it cannot be used in this session. Nothing was changed.The rest of the text says that an administrator decides which tools are switched on for the organization and which each user may use, under Team in the portal, and that every level costs the same. - The
initializeresult carriesinstructionstelling the model that the session can only read, so it does not offer changes it cannot make. A session that sees only some of the tools but still has a write tool (for example a Tilpasset list) gets instructions to treat the listed tools as the complete surface instead. - The level is set per connector and applies to all of the account’s portals of that connector. It is set per user in Consile and does not change the provider connection, which the whole organization shares.
- A change takes effect within seconds, without a new sign-in. A client that cached
tools/listin an open conversation can still show the write tools, but calls to them are refused. Start a new conversation, or calltools/listagain, to refresh the list. In the Microsoft 365 Copilot agent (pilot, e-conomic only), a Read only user also still sees the write tools, and calls to them are refused in the same way.
e-conomic write tools
e-conomic exposes 12 write tools (of 40). Every one needsconfirm: true, with no
exceptions: a call without it never writes and returns a preview.
book_journal_entries always takes two calls, because the confirming call must send
back the expectedState from a preview.
For
update_customer, update_draft_invoice and update_journal_entries, the
confirming call applies your changes to the record as it is at that moment.
Invoices and credit notes are only created and edited as drafts; no tool books or
sends them. A draft does not affect the accounts until someone books it in
e-conomic. Booked data cannot be edited or deleted; corrections are new entries.
Booking journal entries
- Call
book_journal_entrieswithjournalNumberand the exactentryNumbers(1-50). Only those entries are booked, never the whole journal. - The preview lists every entry (number, type, amount, currency, date and text)
with a total per currency, and returns
preview.state.expectedState. - To book, repeat the call with
confirm: trueandexpectedStateset to that value. A confirming call withoutexpectedStateis refused. - If any entry was changed, deleted or booked after the preview, the call is
refused and nothing is booked. Run it again without
confirmto see the current state. A number that is not an unbooked entry in that journal is named in the error, and nothing is booked.
Tool invocation failed.; check
list_account_entries before you retry, because the entries may already be booked.
A user on Read only does not get these tools (see
Per-user access levels). Parameters and examples are in
the e-conomic reference.
Uniconta write tools
Uniconta exposes 4 write tools (of 25), all in the daily journal (kassekladde). Every one needsconfirm: true, with no exceptions: a call without it never writes
and returns a preview. post_journal_lines always takes two calls, because the
confirming call must send back the expectedState from a preview.
A
lineId is the line’s RowId from list_journal_lines, always within the one
journal named in journal. A journal that is blocked in Uniconta is refused. No
tool changes master data (debtors, creditors, items), invoices, orders or posted
ledger rows, and the read tools, including query and aggregate, cannot write.
The Server-Login User’s rights in Uniconta also apply. Read access is enough for
the read tools; to create, change and post lines the user needs write access to the
daily journal and the right to post. When Uniconta refuses a write, the result has
isError: true and the text
Uniconta refused <METHOD> <path>: <reason>. Nothing was changed.
Posting journal lines
- Call
post_journal_lineswithjournaland the exactlineIds(1-50). Only those lines are posted, never the whole journal. - The preview lists every line (id, date, accounts, amount and text) with debit,
credit and net totals, says how many other unposted lines in the journal are not
included, and returns
preview.state.expectedState. - To post, repeat the call with
confirm: trueandexpectedStateset to that value. A confirming call withoutexpectedStateis refused. - If any line was changed, deleted or posted after the preview, the call is
refused, the changed line ids are named, and nothing is posted. Run it again
without
confirmto see the current state. - After posting, the connector reads the journal again and returns
posted,stillUnposted,remainingUnpostedLinesInJournaland, when a selected line is still unposted, awarning.
Tool invocation failed.; check
list_journal_lines before you retry, because the lines may already be posted.
A user on Read only does not get these tools (see
Per-user access levels). Parameters and examples are in
the Uniconta reference.
Shopify write tools
Shopify exposes 10 write tools (of 50), limited to the three write permissions Consile requests: products, publication to sales channels, and inventory.- Orders, draft orders, customers and discounts are read-only.
graphql_queryaccepts a single read-onlyqueryoperation and refuses mutations and subscriptions. - New products are created
DRAFT. Publishing, unpublishing, setting statusACTIVEorARCHIVED, changing a variant’spriceorcompareAtPrice, setting or adjusting inventory and deleting variants needconfirm: true; without it the call returns a dry-run preview. - These apply directly, with no confirmation step:
create_product_variant(including the price of new variants),update_productwithout a status change toACTIVEorARCHIVED,update_product_variantwithout a price field, and setting statusDRAFT. On a product that is already live, these changes show in the store right away, and statusDRAFTtakes the product off sale. - There is no tool that deletes a product.
- A write Shopify rejects (with
userErrors) never looks like a success. The result isTool invocation failed., without Shopify’s message.
HubSpot CMS write tools
HubSpot CMS exposes 9 write tools (of 23).- Draft writes apply directly and have no
confirmargument:create_page_draft,update_page_draft,create_blog_post_draft,update_blog_post_draftandupsert_hubdb_row_draft. A draft never touches the live website. - Actions that change the live site or discard work need
confirm: true:publish_page,publish_blog_post,publish_hubdb_tableandreset_hubdb_draft. Without it the call returns a preview and writes nothing to HubSpot. - HubDB row writes land in the table’s draft and stay invisible on live pages until
publish_hubdb_tableruns. There is no delete tool.
HubSpot Marketing Email write tools
HubSpot Marketing Email exposes 11 write tools (of 19).- Draft writes (4):
create_email,update_email_draft,clone_emailandcreate_email_ab_variation. They apply directly, have noconfirmargument and cannot send. New emails are forced to stateDRAFT. - Confirm-gated writes (7):
update_email(changes the live version),publish_email(sends a real email),unpublish_email,delete_email(archives the email),reset_email_draft,restore_email_revisionandrestore_email_revision_to_draft. Withoutconfirm: truethey return a dry-run preview. Email reaches recipients only through a confirmedpublish_email.
Meta Ads write tools
Meta Ads exposes 5 write tools (of 39). Amounts are in minor units of the ad account’s currency.LinkedIn Ads write tools
LinkedIn Ads exposes 19 write tools (of 64): 11 for ad management and 8 for organic social.Why read-only connectors are different
Google Search Console, CVR, Dinero, Billy, Ordrestyring and Business Central ship no write tools at all. Their safety is structural: there is no write tool to gate. For example, the Billy toolbilly__list_daybook_transactions only reads daybook
entries, and no Billy tool posts an entry or edits a record.
The generic query tools on read-only connectors can only read as well, and so can
Uniconta’s query and aggregate. Two more examples:
- Ordrestyring’s
graphql_querytakes a GraphQL document, but it accepts only a single read-onlyqueryoperation; a mutation or subscription is refused. Shopify’sgraphql_queryworks the same way. - Business Central: Microsoft offers no read-only permission for Business Central,
so the consent also covers writing, but the Consile connector only reads, and
query_entityaccepts only an allow-listed set of standard entities. See the Business Central reference.
A write the provider rejects comes back as a tool result with
isError: true.
e-conomic includes a readable validation message (for example the rejected
field), and Uniconta returns
Uniconta refused <METHOD> <path>: <reason>. Nothing was changed., so the AI can
correct the call and try again. For Meta Ads, LinkedIn Ads,
Shopify, HubSpot CMS and HubSpot Marketing Email the result text is
Tool invocation failed. and does not include the provider’s status code or
message. An expired or rejected connection usually returns a message asking for a
reconnect instead. See Errors & limits.