MCP
Scopes and permissions
Scopes decide what a connected client may try. Your permissions in Neno decide what you can do. Every tool call has to pass both.
Scopes
| Scope | Access | Tools |
|---|---|---|
| workspaces:read | Read | list_workspaces |
| transactions:read | Read | list_transactions list_unreconciled_transactions |
| bills:read | Read | get_bill_status get_vendor_spend list_bills list_vault_files |
| bills:write | Write | create_bill_upload get_bill_forwarding_address upload_bill |
| tasks:read | Read | list_open_tasks |
| tasks:write | Write | create_task respond_to_task |
| reports:read | Read | get_management_report |
| invoices:read | Read | get_invoice_summary |
| invoices:write | Write |
A scope covers every tool listed against it. get_bill_forwarding_address only reads, but it sits under bills:write because it's part of filing a bill.
Two checks on every call
- Scope. Checked before the tool runs. If the grant doesn't hold the tool's scope, the request fails with
403andinsufficient_scope, naming every scope the call needs. - Permission. Checked against your role in that company. If you don't have it, the call returns an error the model can read, and nothing changes.
A grant can only narrow what you're able to do. It never gives a client more access than you have yourself.
What a grant covers
When you sign in through a client, you choose the companies it may use. A client that doesn't ask for particular scopes gets the read scopes only. The first time it calls a write tool, the 403 prompts it to ask you again with the write scope added.
An API key covers one company and exactly the scopes chosen when it was created.
Permissions per tool
| Tool | Scope | Permission in Neno |
|---|---|---|
| create_bill_upload | bills:write | neno.manageDocuments |
| create_task | tasks:write | neno.admin swan.legalRepresentative |
| get_bill_forwarding_address | bills:write | neno.manageDocuments |
| get_bill_status | bills:read | neno.viewDocuments |
| get_invoice_summary | invoices:read | neno.viewInvoicing |
| get_management_report | reports:read | neno.viewReconciliation |
| get_vendor_spend | bills:read | neno.viewDocuments |
| list_bills | bills:read | neno.viewDocuments |
| list_open_tasks | tasks:read | neno.viewTasks |
| list_transactions | transactions:read | neno.admin swan.legalRepresentative swan.canViewAccount neno.viewReconciliation |
| list_unreconciled_transactions | transactions:read | neno.viewReconciliation |
| list_vault_files | bills:read | neno.viewDocuments |
| list_workspaces | workspaces:read | None. Bounded by the grant. |
| respond_to_task | tasks:write | neno.viewTasks |
| upload_bill | bills:write | neno.manageDocuments |
Where a tool lists several permissions, any one of them is enough. Tools that read the bank feed are only offered for companies with a connected bank account: list_transactions, list_unreconciled_transactions.
How long access lasts
| Credential | Lifetime |
|---|---|
| Access token | One hour, renewed with the refresh token |
| OAuth grant | 180 days, or 30 days without being used |
| API key | Until its expiry date, if it has one, or until it's revoked |