@fourier-labs/harbour-contracts 0.99.0 → 0.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/contract-release.json +24 -24
  2. package/dist/gen-ts/app-integrations-declaration.d.ts +59 -2
  3. package/dist/gen-ts/contract-release.d.ts +6 -6
  4. package/dist/gen-ts/contract-release.js +6 -6
  5. package/dist/gen-ts/data-grant-v2.d.ts +64 -14
  6. package/dist/gen-ts/integration-error-details.d.ts +1 -1
  7. package/dist/gen-ts/integration-execute-input-rules.d.ts +20 -0
  8. package/dist/gen-ts/integration-execute-input-rules.js +8 -0
  9. package/dist/gen-ts/integration-execute-request.d.ts +17 -3
  10. package/dist/gen-ts/integration-execute-result.d.ts +27 -0
  11. package/dist/gen-ts/integration-operations.d.ts +8 -0
  12. package/dist/gen-ts/integration-operations.js +10 -0
  13. package/dist/gen-ts/saas-connection.d.ts +3 -3
  14. package/gen-ts/app-integrations-declaration.ts +59 -2
  15. package/gen-ts/contract-release.ts +6 -6
  16. package/gen-ts/data-grant-v2.ts +65 -13
  17. package/gen-ts/integration-error-details.ts +11 -1
  18. package/gen-ts/integration-execute-input-rules.ts +8 -0
  19. package/gen-ts/integration-execute-request.ts +18 -3
  20. package/gen-ts/integration-execute-result.ts +29 -0
  21. package/gen-ts/integration-operations.ts +10 -0
  22. package/gen-ts/saas-connection.ts +3 -0
  23. package/package.json +1 -1
  24. package/schema/app-integrations-declaration.schema.json +219 -3
  25. package/schema/data-grant-v2.schema.json +75 -0
  26. package/schema/integration-error-details.schema.json +11 -1
  27. package/schema/integration-execute-request.schema.json +79 -8
  28. package/schema/integration-execute-result.schema.json +97 -0
  29. package/schema/saas-connection.schema.json +15 -0
@@ -57,13 +57,13 @@ export interface SaasConnection {
57
57
  * @minItems 1
58
58
  * @maxItems 92
59
59
  */
60
- operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.invoice.markSent' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read')[];
60
+ operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.invoice.markSent' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read' | 'mcp.tool.call')[];
61
61
  /**
62
62
  * Explicit user-mode operations eligible for automatic app access, subject to the connection operation ceiling and personal consent. Empty means review all; absent inherits company defaults or the existing userModeApproval migration rule. Governance validates provider and mode compatibility. Background execution still requires personal background consent, not a separate admin grant.
63
63
  *
64
64
  * @maxItems 92
65
65
  */
66
- automaticUserOperations?: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.invoice.markSent' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read')[];
66
+ automaticUserOperations?: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.invoice.markSent' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read' | 'mcp.tool.call')[];
67
67
  /**
68
68
  * Reusable permissions for admitted builders on explicit shared SaaS resources. Governance checks registered resources, provider/mode compatibility and the connection operation ceiling. Connection version and audit record changes; no per-entry approval metadata.
69
69
  *
@@ -170,7 +170,7 @@ export interface ReusableSaasAccess {
170
170
  * @minItems 1
171
171
  * @maxItems 92
172
172
  */
173
- operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.invoice.markSent' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read')[];
173
+ operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.invoice.markSent' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read' | 'mcp.tool.call')[];
174
174
  }
175
175
  export interface DevelopmentPreapproval {
176
176
  /**
@@ -100,9 +100,11 @@ export type DeclaredConnection = {
100
100
  'zohobooks.invoice.markSent'?: UserModeChannelOperation;
101
101
  'zohobooks.creditnote.create'?: UserModeChannelOperation;
102
102
  'zohobooks.creditnote.read'?: UserModeChannelOperation;
103
+ 'mcp.tool.call'?: McpUserOperation;
103
104
  };
105
+ mcp?: McpToolSelection;
104
106
  };
105
- export type IntegrationConnectionKind = 'saas' | 'database' | 'service';
107
+ export type IntegrationConnectionKind = 'saas' | 'database' | 'service' | 'mcp';
106
108
  /**
107
109
  * Whose authority an operation runs under. Fixed per operation, except the declared-mode Slack operations (slack.message.post; since 0.71.0 also slack.channel.history, slack.message.update, slack.message.delete): declared per app for the access request, and named per call among the app's approved modes (execute request `mode`, 0.55.0).
108
110
  */
@@ -120,9 +122,13 @@ export type ResourceNames = IntegrationAlias[];
120
122
  * A plain warehouse column identifier, or `*` as the sole selection when IT exposed all current and future columns.
121
123
  */
122
124
  export type ColumnName = string;
125
+ /**
126
+ * Opaque, case-sensitive provider tool name. Never interpreted as a source alias or endpoint.
127
+ */
128
+ export type McpToolName = string;
123
129
 
124
130
  /**
125
- * Committed `.isomorph/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (eighty-one operations since 0.86.0, ADR 0018, ADR 0022, ADR 0024, ADR 0028, ADR 0029 and ADR 0032). Each operation carries a fixed identity mode — slack.dm.send=app, slack.user.lookup=app, every gmail.* operation=user, every basecamp.* operation=user, every sharepoint.* operation=user, every calendar.*, drive.*, docs.*, sheets.*, outlook.*, onedrive.*, excel.* and teams.* operation=user (0.86.0), warehouse.view.read=app, service.request=app — except the declared-mode Slack operations (slack.message.post, and since 0.71.0 slack.channel.history, slack.message.update and slack.message.delete), whose mode the app DECLARES: `app` acts as the company's Slack app (the one audited bot identity; a post goes out under the IT-approved per-app display name when the connection declares `presentation`), `user` acts as the signed-in person after their own consent (reads what they can read, edits what they wrote). The declared mode is the one the app requests access for; an app may hold approved grants for both modes after two requests, and each declared-mode call names which approved mode it runs under (`mode` on the execute request, 0.55.0) — a mode IT did not approve is refused, never swapped for the other. A `saas` connection may declare only the Slack, Gmail, Basecamp, SharePoint, phone, Google Workspace (calendar, drive, docs, sheets) and Microsoft 365 (outlook, onedrive, excel, teams) operations and a `database` connection only warehouse.view.read; `presentation` is a `saas` connection's optional per-app display name and icon for app-mode Slack posts, shown to IT at approval time and applied only from the approved grant. Gmail is user-mode only (reads, one send); its single resource is the fixed `inbox` alias. Basecamp (0.76.0, ADR 0022) is user-mode only too: basecamp.project.list runs on the fixed `account` alias (the company's pinned Basecamp account) and every other basecamp.* operation on a project alias IT mapped in the connection's `channels` map, so Basecamp itself refuses an id outside that project. SharePoint (0.78.0, ADR 0024) is user-mode only as well: every sharepoint.* operation runs on a site alias IT mapped in the connection's `channels` map (a Microsoft Graph site id), so Graph itself refuses a list, item or file outside that site. Google Workspace and Microsoft 365 (0.86.0, ADR 0032) are user-mode only too: every calendar.*, drive.*, docs.*, sheets.*, outlook.*, onedrive.* and excel.* operation runs on the provider's one fixed alias for the signed-in person's own data (governance resolves it, the way Gmail's is `inbox`; the contract does not pin the literal), and every teams.* operation on a channel alias IT mapped in the connection's `channels` map (a Teams team and channel id), so Graph itself refuses a message outside that channel. slack.dm.send and slack.user.lookup address people by email rather than a channel, so their single resource is the fixed `workspace` alias (the connection's installed workspace), the way Gmail's is `inbox`. This file also owns the shared IntegrationOperation / IntegrationIdentityMode / IntegrationEnvironment / IntegrationConnectionKind / IntegrationPresentation definitions referenced by the other integration schemas.
131
+ * Committed `.isomorph/integrations.json`: the app's declared use of tenant-wide integration connections. Keys are logical connection aliases (the governance sourceId); resources are logical names (Slack channel alias, warehouse view name), never IDs, tokens or URLs. The operation set is closed (eighty-one operations since 0.86.0, ADR 0018, ADR 0022, ADR 0024, ADR 0028, ADR 0029 and ADR 0032). Each operation carries a fixed identity mode — slack.dm.send=app, slack.user.lookup=app, every gmail.* operation=user, every basecamp.* operation=user, every sharepoint.* operation=user, every calendar.*, drive.*, docs.*, sheets.*, outlook.*, onedrive.*, excel.* and teams.* operation=user (0.86.0), warehouse.view.read=app, service.request=app — except the declared-mode Slack operations (slack.message.post, and since 0.71.0 slack.channel.history, slack.message.update and slack.message.delete), whose mode the app DECLARES: `app` acts as the company's Slack app (the one audited bot identity; a post goes out under the IT-approved per-app display name when the connection declares `presentation`), `user` acts as the signed-in person after their own consent (reads what they can read, edits what they wrote). The declared mode is the one the app requests access for; an app may hold approved grants for both modes after two requests, and each declared-mode call names which approved mode it runs under (`mode` on the execute request, 0.55.0) — a mode IT did not approve is refused, never swapped for the other. A `saas` connection may declare only the Slack, Gmail, Basecamp, SharePoint, phone, Google Workspace (calendar, drive, docs, sheets) and Microsoft 365 (outlook, onedrive, excel, teams) operations and a `database` connection only warehouse.view.read; `presentation` is a `saas` connection's optional per-app display name and icon for app-mode Slack posts, shown to IT at approval time and applied only from the approved grant. Gmail is user-mode only (reads, one send); its single resource is the fixed `inbox` alias. Basecamp (0.76.0, ADR 0022) is user-mode only too: basecamp.project.list runs on the fixed `account` alias (the company's pinned Basecamp account) and every other basecamp.* operation on a project alias IT mapped in the connection's `channels` map, so Basecamp itself refuses an id outside that project. SharePoint (0.78.0, ADR 0024) is user-mode only as well: every sharepoint.* operation runs on a site alias IT mapped in the connection's `channels` map (a Microsoft Graph site id), so Graph itself refuses a list, item or file outside that site. Google Workspace and Microsoft 365 (0.86.0, ADR 0032) are user-mode only too: every calendar.*, drive.*, docs.*, sheets.*, outlook.*, onedrive.* and excel.* operation runs on the provider's one fixed alias for the signed-in person's own data (governance resolves it, the way Gmail's is `inbox`; the contract does not pin the literal), and every teams.* operation on a channel alias IT mapped in the connection's `channels` map (a Teams team and channel id), so Graph itself refuses a message outside that channel. slack.dm.send and slack.user.lookup address people by email rather than a channel, so their single resource is the fixed `workspace` alias (the connection's installed workspace), the way Gmail's is `inbox`. This file also owns the shared IntegrationOperation / IntegrationIdentityMode / IntegrationEnvironment / IntegrationConnectionKind / IntegrationPresentation definitions referenced by the other integration schemas. Remote MCP connections add one generic user-only mcp.tool.call on server with exact accepted descriptors; an operation alone never authorizes every provider tool.
126
132
  */
127
133
  export interface AppIntegrationsDeclaration {
128
134
  schema: 'isomorph.app-integrations/2.0';
@@ -189,3 +195,54 @@ export interface ServiceOperation {
189
195
  */
190
196
  resources: 'api'[];
191
197
  }
198
+ export interface McpUserOperation {
199
+ identity: 'user';
200
+ /**
201
+ * @minItems 1
202
+ * @maxItems 1
203
+ */
204
+ resources: 'server'[];
205
+ }
206
+ /**
207
+ * Exact accepted tool selection. Runtime rejects duplicate names and bounds all selected descriptors across the app to 128 KiB serialized.
208
+ */
209
+ export interface McpToolSelection {
210
+ /**
211
+ * @minItems 1
212
+ * @maxItems 64
213
+ */
214
+ tools: McpSelectedTool[];
215
+ }
216
+ /**
217
+ * Runtime verifies name equals descriptor.name and hash is SHA256 of canonical {name,inputSchema,outputSchema?}; annotations and explanatory text are excluded.
218
+ */
219
+ export interface McpSelectedTool {
220
+ name: McpToolName;
221
+ contractHash: string;
222
+ descriptor: McpToolDescriptor;
223
+ }
224
+ /**
225
+ * Accepted provider descriptor. MCP schema dialect validation, in-document references and 64 KiB serialized descriptor bound are runtime checks; no remote references are fetched.
226
+ */
227
+ export interface McpToolDescriptor {
228
+ name: McpToolName;
229
+ title?: string;
230
+ description?: string;
231
+ inputSchema: {
232
+ [k: string]: unknown;
233
+ };
234
+ outputSchema?: {
235
+ [k: string]: unknown;
236
+ };
237
+ annotations?: McpToolAnnotations;
238
+ }
239
+ /**
240
+ * Provider hints pinned with the accepted descriptor; never proof of authorization or safety.
241
+ */
242
+ export interface McpToolAnnotations {
243
+ title?: string;
244
+ readOnlyHint?: boolean;
245
+ destructiveHint?: boolean;
246
+ idempotentHint?: boolean;
247
+ openWorldHint?: boolean;
248
+ }
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
- export const ContractRepositoryVersion = "0.99.0.0" as const;
5
- export const ContractPublishVersion = "0.99.0" as const;
6
- export const ContractPublishTag = "v0.99.0" as const;
7
- export const ContractSchemasDigest = "sha256:cc0771713c8d57b755587400cf5f7145cfd835a8d78647f105b305dbbc4d28cb" as const;
4
+ export const ContractRepositoryVersion = "0.101.0.0" as const;
5
+ export const ContractPublishVersion = "0.101.0" as const;
6
+ export const ContractPublishTag = "v0.101.0" as const;
7
+ export const ContractSchemasDigest = "sha256:118e26d89366b59b34be7a93b65227b53f28b3b00e9fc125a3674413f259390e" as const;
8
8
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
9
- export const ContractGeneratedGoDigest = "sha256:907ba331a26386dd7b2b6f651988ee441da125b1949f287e376d0551626afd93" as const;
10
- export const ContractGeneratedTypeScriptDigest = "sha256:a13398995bbac4f876d8b39cbb40cadcc8d166b6cc582975c13f8322d08632d9" as const;
9
+ export const ContractGeneratedGoDigest = "sha256:65a05c14375ba051c5232229628e4667531556867bed8f98cb7fdc3f6992c16a" as const;
10
+ export const ContractGeneratedTypeScriptDigest = "sha256:30141cde6863f104be2dbdf77c948daf81d14c0cfc60cf4afb48561a42cb055d" as const;
@@ -1,20 +1,10 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
- /**
5
- * Grant lifecycle state. Legal edges live in x-transitions; DENIED and REVOKED are terminal.
6
- */
7
- export type DataGrantV2Status = 'REQUESTED' | 'GRANTED' | 'DENIED' | 'REVOKED';
8
- /**
9
- * Provider-side work for the current approved scope (credential mint, cleanup, installation check).
10
- */
11
- export type DataGrantV2ProvisioningStatus = 'NONE' | 'PENDING' | 'FAILED' | 'DONE';
12
- export type DataGrantV2CleanupStatus = 'PENDING' | 'FAILED' | 'DONE';
13
-
14
4
  /**
15
5
  * An app's integration grant for one connection, environment and identity mode (control table sk APP#<appId>#IGRANT#<environment>#<sourceId>#<mode>; grantId = base64url(JSON ["v2",appId,environment,sourceId,mode])). Additive to the legacy DataGrant (data-grant.schema.json), which is never consulted by v2 paths. A fresh REQUESTED record carries empty `operations`/`resources` until the attached request is approved; approved resources are structured `{name, columns?}` entries (a Slack channel alias, the fixed Gmail `inbox` alias, a Basecamp project alias or the fixed Basecamp `account` alias, a SharePoint site alias, a Google Workspace or Microsoft 365 provider's fixed alias or a Teams channel alias (0.86.0), or a warehouse view alias with its approved columns). Expiry is enforced from UTC time on every call and SDK calls never extend it; `expiredAt` is stamped by the recovery sweep afterwards. Status edges live in x-transitions; DENIED and REVOKED are terminal (a regrant after revocation is a new REQUESTED record once cleanup is DONE). Database grants add credentialRef/mintedPrincipal; both hold references only. An app-mode Slack grant may carry `presentation` (0.53.0): the IT-approved display name and icon the app's posts go out under, copied from the approved request and read by every post — never from the call. `identityMode` and `installation` are the deprecated 0.45.0 spellings: the record carries `mode`, and a SaaS grant runs on the connection's single installation.
16
6
  */
17
- export interface DataGrantV2 {
7
+ export type DataGrantV2 = {
18
8
  schema: 'harbour.data-grant/2.0';
19
9
  tenantId: string;
20
10
  appId: string;
@@ -30,7 +20,7 @@ export interface DataGrantV2 {
30
20
  * Whose authority an operation runs under. Fixed per operation, except the declared-mode Slack operations (slack.message.post; since 0.71.0 also slack.channel.history, slack.message.update, slack.message.delete): declared per app for the access request, and named per call among the app's approved modes (execute request `mode`, 0.55.0).
31
21
  */
32
22
  mode: 'app' | 'user';
33
- kind: 'saas' | 'database' | 'service';
23
+ kind: 'saas' | 'database' | 'service' | 'mcp';
34
24
  status: DataGrantV2Status;
35
25
  /**
36
26
  * Approved operations; each must match this grant's mode. Empty until the first approval. At most the seventy-eight SaaS operations (0.86.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, two phone, forty-five Google Workspace and Microsoft 365); a database grant holds up to two (warehouse.view.read, warehouse.table.append).
@@ -133,6 +123,7 @@ export interface DataGrantV2 {
133
123
  | 'zohobooks.invoice.markSent'
134
124
  | 'zohobooks.creditnote.create'
135
125
  | 'zohobooks.creditnote.read'
126
+ | 'mcp.tool.call'
136
127
  )[];
137
128
  /**
138
129
  * Approved logical resources. Never inherited by wildcard. Empty until the first approval.
@@ -140,6 +131,7 @@ export interface DataGrantV2 {
140
131
  * @maxItems 64
141
132
  */
142
133
  resources: IntegrationResource[];
134
+ mcp?: McpToolSelection;
143
135
  reviewedScope?: ReviewedIntegrationScope;
144
136
  /**
145
137
  * Absent only for explicitly approved ongoing production access.
@@ -181,7 +173,17 @@ export interface DataGrantV2 {
181
173
  * Deprecated: a SaaS grant runs on the connection's single installation; the control plane never writes it.
182
174
  */
183
175
  installation?: string;
184
- }
176
+ };
177
+ /**
178
+ * Grant lifecycle state. Legal edges live in x-transitions; DENIED and REVOKED are terminal.
179
+ */
180
+ export type DataGrantV2Status = 'REQUESTED' | 'GRANTED' | 'DENIED' | 'REVOKED';
181
+ /**
182
+ * Provider-side work for the current approved scope (credential mint, cleanup, installation check).
183
+ */
184
+ export type DataGrantV2ProvisioningStatus = 'NONE' | 'PENDING' | 'FAILED' | 'DONE';
185
+ export type DataGrantV2CleanupStatus = 'PENDING' | 'FAILED' | 'DONE';
186
+
185
187
  /**
186
188
  * One approved logical resource: a Slack channel alias, the fixed Gmail `inbox` alias, a Basecamp project alias or the fixed Basecamp `account` alias (0.76.0), a SharePoint site alias (0.78.0), a phone number alias (0.82.0), or a warehouse view alias with the approved columns.
187
189
  */
@@ -198,6 +200,55 @@ export interface IntegrationResource {
198
200
  */
199
201
  columns?: string[];
200
202
  }
203
+ /**
204
+ * Exact accepted tool selection. Runtime rejects duplicate names and bounds all selected descriptors across the app to 128 KiB serialized.
205
+ */
206
+ interface McpToolSelection {
207
+ /**
208
+ * @minItems 1
209
+ * @maxItems 64
210
+ */
211
+ tools: McpSelectedTool[];
212
+ }
213
+ /**
214
+ * Runtime verifies name equals descriptor.name and hash is SHA256 of canonical {name,inputSchema,outputSchema?}; annotations and explanatory text are excluded.
215
+ */
216
+ interface McpSelectedTool {
217
+ /**
218
+ * Opaque, case-sensitive provider tool name. Never interpreted as a source alias or endpoint.
219
+ */
220
+ name: string;
221
+ contractHash: string;
222
+ descriptor: McpToolDescriptor;
223
+ }
224
+ /**
225
+ * Accepted provider descriptor. MCP schema dialect validation, in-document references and 64 KiB serialized descriptor bound are runtime checks; no remote references are fetched.
226
+ */
227
+ interface McpToolDescriptor {
228
+ /**
229
+ * Opaque, case-sensitive provider tool name. Never interpreted as a source alias or endpoint.
230
+ */
231
+ name: string;
232
+ title?: string;
233
+ description?: string;
234
+ inputSchema: {
235
+ [k: string]: unknown;
236
+ };
237
+ outputSchema?: {
238
+ [k: string]: unknown;
239
+ };
240
+ annotations?: McpToolAnnotations;
241
+ }
242
+ /**
243
+ * Provider hints pinned with the accepted descriptor; never proof of authorization or safety.
244
+ */
245
+ interface McpToolAnnotations {
246
+ title?: string;
247
+ readOnlyHint?: boolean;
248
+ destructiveHint?: boolean;
249
+ idempotentHint?: boolean;
250
+ openWorldHint?: boolean;
251
+ }
201
252
  /**
202
253
  * Only for SaaS grants mixing reviewed and automatic access: the previously human-reviewed scope. The remaining scope must satisfy current automatic rules. Homogeneous grants continue using approvedBy alone. Governance validates this is a subset of the grant; database behaviour is unchanged.
203
254
  */
@@ -301,6 +352,7 @@ export interface ReviewedIntegrationScope {
301
352
  | 'zohobooks.invoice.markSent'
302
353
  | 'zohobooks.creditnote.create'
303
354
  | 'zohobooks.creditnote.read'
355
+ | 'mcp.tool.call'
304
356
  )[];
305
357
  /**
306
358
  * @maxItems 64
@@ -40,7 +40,17 @@ export type IntegrationErrorCode =
40
40
  | 'UNAVAILABLE'
41
41
  | 'MODE_NOT_GRANTED'
42
42
  | 'MODE_REQUIRED'
43
- | 'SAMPLE_ROWS_NOT_ALLOWED';
43
+ | 'SAMPLE_ROWS_NOT_ALLOWED'
44
+ | 'CALL_IN_PROGRESS'
45
+ | 'CALL_OUTCOME_UNKNOWN'
46
+ | 'KEY_REUSED'
47
+ | 'MCP_TOOL_NOT_GRANTED'
48
+ | 'MCP_ARGUMENTS_INVALID'
49
+ | 'MCP_OUTPUT_INVALID'
50
+ | 'MCP_CONNECTION_FAILED'
51
+ | 'MCP_TOOL_ERROR'
52
+ | 'MCP_BUSY'
53
+ | 'MCP_OAUTH_SETUP_REQUIRED';
44
54
 
45
55
  /**
46
56
  * The `error` member of an integration failure response `{error, requestId}` on the execute/connect routes; the SDK maps it onto IsomorphError(category, message, details). `category` is the app-SDK IsomorphErrorCategory (not the deployment pipeline's dot-path error-category registry), with the HTTP status fixed per category: 401 AUTH_REQUIRED, 403 FORBIDDEN (denied/revoked/expired), 404 NOT_FOUND (unknown app/connection/resource), 409 CONFLICT (pending provisioning/consent/concurrent request), 400 or 413 VALIDATION_FAILED (invalid input / size overflow), 429 RATE_LIMITED (+ Retry-After header), 503 UNAVAILABLE. `details.code` is the closed stable reason set; `message` is human-facing and never carries provider error bodies, tokens or SQL.
@@ -779,6 +779,7 @@ export const IntegrationExecuteInputRules = {
779
779
  fields: {
780
780
  customerId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
781
781
  pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
782
+ orderStatus: { kind: "enum", required: false, values: ["all"] },
782
783
  },
783
784
  },
784
785
  "zohobooks.salesorder.read": {
@@ -821,6 +822,13 @@ export const IntegrationExecuteInputRules = {
821
822
  documentId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
822
823
  },
823
824
  },
825
+ "mcp.tool.call": {
826
+ idempotencyKey: false,
827
+ fields: {
828
+ tool: { kind: "string", required: true, minLength: 1, maxLength: 128 },
829
+ arguments: { kind: "object", required: true },
830
+ },
831
+ },
824
832
  } as const satisfies Record<string, IntegrationExecuteOperationRule>;
825
833
 
826
834
  export type IntegrationExecuteOperation = keyof typeof IntegrationExecuteInputRules;
@@ -107,7 +107,8 @@ export type IntegrationExecuteRequest = {
107
107
  | 'zohobooks.invoice.reviseDraft'
108
108
  | 'zohobooks.invoice.markSent'
109
109
  | 'zohobooks.creditnote.create'
110
- | 'zohobooks.creditnote.read';
110
+ | 'zohobooks.creditnote.read'
111
+ | 'mcp.tool.call';
111
112
  /**
112
113
  * Tenant-wide logical alias of a connection (governance sourceId) or of a resource under it.
113
114
  */
@@ -477,13 +478,27 @@ export type IntegrationExecuteRequest = {
477
478
  lineItemId?: string;
478
479
  salesOrderItemId?: string;
479
480
  }[];
481
+ /**
482
+ * Opaque, case-sensitive provider tool name. Never interpreted as a source alias or endpoint.
483
+ */
484
+ tool?: string;
485
+ /**
486
+ * Validated against the accepted tool inputSchema at runtime; arbitrary nested provider arguments are permitted only here.
487
+ */
488
+ arguments?: {
489
+ [k: string]: unknown;
490
+ };
491
+ /**
492
+ * Zoho salesorder.list: include closed and previously invoiced orders for read-only historical reconciliation; omitted keeps open orders only.
493
+ */
494
+ orderStatus?: 'all';
480
495
  };
481
496
  /**
482
- * UUID of one explicit Send action; required for the sends (slack.message.post, slack.dm.send, gmail.message.send), the receipted Basecamp writes (basecamp.todo.create, basecamp.message.post, basecamp.comment.post, basecamp.campfire.post; 0.76.0) the receipted SharePoint writes (sharepoint.item.create, sharepoint.file.upload; 0.78.0) the receipted warehouse append (warehouse.table.append; 0.82.0, where it is also the BigQuery load job id) and the receipted Google Workspace and Microsoft 365 writes (0.86.0: calendar.event.create, drive.file.upload, drive.folder.create, docs.document.create, sheets.values.append, sheets.spreadsheet.create, outlook.message.send, outlook.message.reply, outlook.event.create, onedrive.file.upload, onedrive.folder.create, excel.row.add, excel.worksheet.add, teams.message.post, teams.reply.post), refused everywhere else. The same key with the same payload and subject returns the recorded outcome for seven days.
497
+ * UUID of one explicit Send action; required for the sends (slack.message.post, slack.dm.send, gmail.message.send), the receipted Basecamp writes (basecamp.todo.create, basecamp.message.post, basecamp.comment.post, basecamp.campfire.post; 0.76.0) the receipted SharePoint writes (sharepoint.item.create, sharepoint.file.upload; 0.78.0) the receipted warehouse append (warehouse.table.append; 0.82.0, where it is also the BigQuery load job id) and the receipted Google Workspace and Microsoft 365 writes (0.86.0: calendar.event.create, drive.file.upload, drive.folder.create, docs.document.create, sheets.values.append, sheets.spreadsheet.create, outlook.message.send, outlook.message.reply, outlook.event.create, onedrive.file.upload, onedrive.folder.create, excel.row.add, excel.worksheet.add, teams.message.post, teams.reply.post), refused everywhere else. The same key with the same payload and subject returns the recorded outcome for seven days. MCP permits omission only for an accepted readOnlyHint=true descriptor; runtime requires the UUID for unknown/write tools.
483
498
  */
484
499
  idempotencyKey?: string;
485
500
  /**
486
- * The declared-mode Slack operations only (slack.message.post since 0.55.0; slack.channel.history, slack.message.update and slack.message.delete since 0.71.0): which of the app's IT-approved modes this call runs under — app (the company's Slack app; a post goes out under the grant's per-app name and the footer) or user (the signed-in person, after their consent; no name, no footer). Required when the app holds approved grants for both modes (else MODE_REQUIRED); may be omitted when it holds one, which is then used. A named mode without an approved grant is refused with MODE_NOT_GRANTED; governance never falls back to the other mode. Every other operation's mode is fixed, so the field is refused there.
501
+ * The declared-mode Slack operations only (slack.message.post since 0.55.0; slack.channel.history, slack.message.update and slack.message.delete since 0.71.0): which of the app's IT-approved modes this call runs under — app (the company's Slack app; a post goes out under the grant's per-app name and the footer) or user (the signed-in person, after their consent; no name, no footer). Required when the app holds approved grants for both modes (else MODE_REQUIRED); may be omitted when it holds one, which is then used. A named mode without an approved grant is refused with MODE_NOT_GRANTED; governance never falls back to the other mode. Every other operation's mode is fixed, so the field is refused there. MCP accepts explicit user only; shared app mode is deferred.
487
502
  */
488
503
  mode?: 'app' | 'user';
489
504
  /**
@@ -384,11 +384,40 @@ export type IntegrationExecuteResult = {
384
384
  }[];
385
385
  referenceNumber?: string;
386
386
  }[];
387
+ mcp?: McpToolResult;
387
388
  };
388
389
  /**
389
390
  * An event's state (0.86.0): confirmed (Google `confirmed`, Graph not cancelled and not tentative), tentative, or cancelled.
390
391
  */
391
392
  export type CalendarEventStatus = 'confirmed' | 'tentative' | 'cancelled';
393
+ /**
394
+ * Bounded MCP CallToolResult. Content blocks are SDK-validated and redacted before delivery. Small results may be replayed in full; incomplete replay returns an explicit completion summary rather than executing again.
395
+ */
396
+ export type McpToolResult = McpToolResult1 & {
397
+ /**
398
+ * @maxItems 256
399
+ */
400
+ content?: {
401
+ [k: string]: unknown;
402
+ }[];
403
+ structuredContent?: {
404
+ [k: string]: unknown;
405
+ };
406
+ isError?: boolean;
407
+ replay?: {
408
+ complete: boolean;
409
+ summary?: string;
410
+ };
411
+ };
412
+ export type McpToolResult1 =
413
+ | {
414
+ [k: string]: unknown;
415
+ }
416
+ | {
417
+ replay: {
418
+ complete?: false;
419
+ };
420
+ };
392
421
 
393
422
  export interface ChannelMessage {
394
423
  id: string;
@@ -861,5 +861,15 @@ export const IntegrationOperations = {
861
861
  "readOnly": true,
862
862
  "declaredMode": false,
863
863
  "idempotencyKey": false
864
+ },
865
+ "mcp.tool.call": {
866
+ "kind": "mcp",
867
+ "identities": [
868
+ "user"
869
+ ],
870
+ "readOnly": false,
871
+ "declaredMode": false,
872
+ "idempotencyKey": false,
873
+ "runtimeIdempotency": true
864
874
  }
865
875
  } as const;
@@ -171,6 +171,7 @@ export interface SaasConnection {
171
171
  | 'zohobooks.invoice.markSent'
172
172
  | 'zohobooks.creditnote.create'
173
173
  | 'zohobooks.creditnote.read'
174
+ | 'mcp.tool.call'
174
175
  )[];
175
176
  /**
176
177
  * Explicit user-mode operations eligible for automatic app access, subject to the connection operation ceiling and personal consent. Empty means review all; absent inherits company defaults or the existing userModeApproval migration rule. Governance validates provider and mode compatibility. Background execution still requires personal background consent, not a separate admin grant.
@@ -273,6 +274,7 @@ export interface SaasConnection {
273
274
  | 'zohobooks.invoice.markSent'
274
275
  | 'zohobooks.creditnote.create'
275
276
  | 'zohobooks.creditnote.read'
277
+ | 'mcp.tool.call'
276
278
  )[];
277
279
  /**
278
280
  * Reusable permissions for admitted builders on explicit shared SaaS resources. Governance checks registered resources, provider/mode compatibility and the connection operation ceiling. Connection version and audit record changes; no per-entry approval metadata.
@@ -476,6 +478,7 @@ export interface ReusableSaasAccess {
476
478
  | 'zohobooks.invoice.markSent'
477
479
  | 'zohobooks.creditnote.create'
478
480
  | 'zohobooks.creditnote.read'
481
+ | 'mcp.tool.call'
479
482
  )[];
480
483
  }
481
484
  export interface DevelopmentPreapproval {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.99.0",
3
+ "version": "0.101.0",
4
4
  "description": "Single source of truth for every data shape that crosses a boundary between Isomorph components.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,