Scopes and audit
Connecting an AI assistant to Notifizz over MCP — the Model Context Protocol, the open standard an assistant uses to call outside tools — hands software the ability to change your configuration. This page is the answer to the reasonable follow-up question: bounded by what, exactly? Written for the Dev and for Product/Ops — the two roles who have to be able to answer that question. Nothing here needs to be configured to be true; it is enforced on every call.TL;DR
- Three permissions:
read:data(plain reads),write:setup(configuration writes and access to environment secrets),write:campaign(the campaign journey). - A credential from the browser consent carries all three. A credential can be narrowed to a subset; a tool outside it is refused with a payload that names the missing permission.
- A credential belongs to one person and one organisation. The organisation is resolved from the credential itself, never from a tool argument — there is no parameter through which an assistant could reach another organisation.
- Time-bounded: access 7 days with silent refresh, refresh chain 90 days, an authorisation code 10 minutes and single-use. Revocation takes effect on the next call.
- Every write is recorded — who, which credential, which tool, which campaign, and whether it succeeded, was refused or errored. Plain reads are not, on volume grounds. The record is kept for one year.
- Payloads are never recorded. The trail says what was called, not what was in it.
The three permissions
Two tools sit outside the model entirely and need no permission:
quickstart and email_templates_migration. Both are read-only entry points that hand back a plan — and the plan gates every write inside it behind your explicit confirmation.
Tool by permission
read:data — 8 tools
read:data — 8 tools
campaign_get_status · campaign_list_tasks · campaign_get_test_activity · sandbox_verify_tracking · sandbox_verify_discovery · channels_webpush_verify_setup · library_list · email_templates_analyzewrite:setup — 10 tools
write:setup — 10 tools
vocabulary_upsert · link_route_upsert · env_variable_upsert · sandbox_get_config · sandbox_run_discovery · channels_upsert_identity · channels_notification_center_upsert_auth · channels_webpush_setup · library_upload_asset · library_upsert_componentwrite:campaign — 7 tools
write:campaign — 7 tools
campaign_create · campaign_answer · campaign_approve · campaign_implement · campaign_send_to_review · campaign_send_test_event · campaign_archiveNo permission required — 2 tools
No permission required — 2 tools
quickstart · email_templates_migration — the two guided plans. They read nothing of consequence and write nothing at all.What a narrowed credential looks like in practice
A credential obtained through the browser consent requests one umbrella permission, which maps to all three. A credential deliberately restricted to a subset behaves differently: the tools it does not cover are not hidden — they are refused, and the refusal is legible:Limits that are not permissions
Permissions decide which tools. Four other boundaries decide how far, and none of them can be widened by a scope. One organisation. The organisation is bound to the credential at consent time and resolved server-side on every call. No tool takes an organisation argument. An assistant holding a credential for organisation A cannot address organisation B, regardless of what it is asked to do. One person, one credential per organisation. Credentials are per user × per organisation. Issuing a new one replaces the previous one for that pair, so a person never accumulates live credentials behind their own back. Production is not a dev toy.sandbox_get_config returns non-production environments only. There is no path through MCP to a production environment’s keys.
Publishing Live has no tool. Not a permission that is off by default — an absence. A campaign goes Live from the dashboard, by a person. Two other actions keep a human in the loop by design: approving a proposed flow, and confirming an archive (which returns a confirmation prompt on the first call and only acts on the second).
Credential lifetime
Two more properties of how credentials are held:
- Only a one-way fingerprint is stored for authentication. The credential itself is not kept in a form that could be read back out and replayed.
- Logs and the audit trail identify a credential by a masked handle — its first twelve and last four characters — never by its value.
The one short-lived exception
An email-template migration has to submit a whole corpus of HTML, which cannot travel through an assistant’s context window. The migration plan therefore embeds a single-purpose ticket: valid for one hour, carryingread:data and nothing else, accepted by the corpus-analysis endpoint and by no other route. It is deliberately enumerated rather than derived, so a permission added to the product tomorrow does not quietly fall to it. Like every other credential, only its fingerprint is stored.
What gets recorded
Every write — which by the definition above includes the secret-returningsandbox_get_config — appends one entry:
Three things this trail deliberately does not contain:
- No payloads. The vocabulary you pushed, the campaign brief, the template HTML — none of it is copied into the record. It says a write happened, by whom, on what.
- No plain reads. Reads are high-volume and change nothing; recording them would bury the writes that matter.
- No end-customer data. Notifizz holds none to begin with — see privacy friendly.
The trail is recorded against your organisation and kept for a year. There is no self-service viewer on the Settings → AI tools screen today — if you need the record, ask your Notifizz contact.
FAQ
Can I give an assistant read-only access?
Can I give an assistant read-only access?
Yes — that is exactly what a credential narrowed to
read:data does. Every write tool then answers insufficient_scope while status, tasks, test activity and the diagnosis tools keep working. It is a sensible setup for an assistant you want to observe with, not act with.Why is fetching sandbox keys classed as a write?
Why is fetching sandbox keys classed as a write?
Because the risk it carries is a write’s risk, not a read’s. Filing it under
read:data would mean that the least privileged credential you can issue also hands out environment secrets — which would make the whole distinction decorative. Reading a secret is a setup privilege.Someone left the team. What do I do?
Someone left the team. What do I do?
Their credential is theirs alone — per person, per organisation — so revoking it removes exactly their access and nobody else’s. Their past actions stay in the trail, attributed to them, for the full year.
Can an assistant reach another organisation I belong to?
Can an assistant reach another organisation I belong to?
No. The organisation is resolved from the credential, and no tool accepts one as an argument. Working on a second organisation means a second consent, and therefore a second credential.
Could something in a campaign brief make the assistant do something I did not ask for?
Could something in a campaign brief make the assistant do something I did not ask for?
That is precisely why content coming from your own organisation — briefs, campaign names, questions raised by the copilot or the orchestrator — is returned to the assistant explicitly marked as content to relay or display, never as instructions to follow, whatever it happens to say. Combined with the human gates (approve, confirm an archive, publish Live), the destructive end of the surface is not reachable by text alone.
What happens if my token expires mid-session?
What happens if my token expires mid-session?
Your tool refreshes it and carries on; you see nothing. If the whole chain has lapsed — 90 days idle — the next call fails cleanly and your tool walks you through the same one-time consent again.
See also
Connect your AI tool
The one-time consent that issues the credential.
MCP tools
What each tool actually does.
API keys
The other Notifizz secrets, and where each one belongs.
Privacy friendly
Why there is no customer data to leak in the first place.