{"actions":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Owner read. List the current user's documents; set archived=true for archived documents. Draft edits and saved versions are separate document states.","input_schema":{"properties":{"archived":{"description":"List archived documents instead of active documents.","type":"boolean"}},"type":"object"},"name":"list_documents"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Owner read. List workspaces visible to the current user before creating or moving workspace files, assets, or Markdown documents.","input_schema":{"properties":{},"type":"object"},"name":"list_workspaces"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:admin:read","description":"Admin read. List organisations the current user can manage before using organisation or workspace administration tools.","input_schema":{"properties":{},"type":"object"},"name":"list_organisations"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:admin:read","description":"Admin read. Get organisation members and open invites for a manageable organisation before inviting, revoking, changing roles, or removing members.","input_schema":{"properties":{"organisation_id":{"description":"Organisation UUID.","type":"string"}},"required":["organisation_id"],"type":"object"},"name":"get_organisation_settings"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin write. Rename a manageable organisation only after the user confirms the organisation and new name.","input_schema":{"properties":{"name":{"description":"Organisation name.","type":"string"},"organisation_id":{"description":"Organisation UUID.","type":"string"}},"required":["organisation_id","name"],"type":"object"},"name":"update_organisation"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin external write. Invite a member with optional pending workspace roles. ALWAYS sends email; show the complete email, subject and recipients and obtain explicit final sending authorisation. Access starts on acceptance.","input_schema":{"properties":{"email":{"description":"Invitee email address.","type":"string"},"organisation_id":{"description":"Organisation UUID.","type":"string"},"role":{"description":"Organisation admins already access all workspaces.","enum":["member","admin"],"type":"string"},"workspaces":{"description":"Pending workspace assignments for members. Empty for organisation admins. Only workspaces in this organisation are allowed.","items":{"properties":{"role":{"enum":["viewer","reviewer","editor","admin"],"type":"string"},"workspace_id":{"format":"uuid","type":"string"}},"required":["workspace_id","role"],"type":"object"},"maxItems":200,"type":"array"}},"required":["organisation_id","email","role"],"type":"object"},"name":"invite_organisation_member"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin write. Replace a pending invitation's organisation role and workspace assignments after checking current settings. Keeps the link valid and sends no email. Existing memberships are preserved on acceptance.","input_schema":{"properties":{"invite_id":{"description":"Invite UUID.","type":"string"},"organisation_id":{"description":"Organisation UUID.","type":"string"},"role":{"description":"Organisation role. Admins already access all workspaces.","enum":["member","admin"],"type":"string"},"workspaces":{"description":"Pending workspace assignments for members. Empty for organisation admins. Only workspaces in this organisation are allowed.","items":{"properties":{"role":{"enum":["viewer","reviewer","editor","admin"],"type":"string"},"workspace_id":{"format":"uuid","type":"string"}},"required":["workspace_id","role"],"type":"object"},"maxItems":200,"type":"array"}},"required":["organisation_id","invite_id","role","workspaces"],"type":"object"},"name":"update_organisation_invite"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin destructive write. Revoke an open organisation invite so the invitee can no longer accept it.","input_schema":{"properties":{"invite_id":{"description":"Invite UUID.","type":"string"},"organisation_id":{"description":"Organisation UUID.","type":"string"}},"required":["organisation_id","invite_id"],"type":"object"},"name":"revoke_organisation_invite"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin destructive write. Change a member's organisation role; confirm user and role because this can reduce access.","input_schema":{"properties":{"organisation_id":{"description":"Organisation UUID.","type":"string"},"role":{"description":"Organisation role: member or admin.","type":"string"},"user_id":{"description":"Member user UUID.","type":"string"}},"required":["organisation_id","user_id","role"],"type":"object"},"name":"update_organisation_member"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin destructive write. Remove a member from a manageable organisation after explicit confirmation.","input_schema":{"properties":{"organisation_id":{"description":"Organisation UUID.","type":"string"},"user_id":{"description":"Member user UUID.","type":"string"}},"required":["organisation_id","user_id"],"type":"object"},"name":"remove_organisation_member"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:admin:read","description":"Admin read. List workspaces in a manageable organisation before creating workspaces or changing workspace membership.","input_schema":{"properties":{"organisation_id":{"description":"Organisation UUID.","type":"string"}},"required":["organisation_id"],"type":"object"},"name":"list_organisation_workspaces"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin write. Create a workspace inside a manageable organisation after confirming the organisation and workspace name.","input_schema":{"properties":{"name":{"description":"Workspace name.","type":"string"},"organisation_id":{"description":"Organisation UUID.","type":"string"}},"required":["organisation_id","name"],"type":"object"},"name":"create_workspace"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:admin:read","description":"Admin read. Get workspace settings, members, and eligible organisation members before changing workspace access.","input_schema":{"properties":{"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id"],"type":"object"},"name":"get_workspace_settings"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin write. Rename a workspace the current user can administer after confirming the workspace and new name.","input_schema":{"properties":{"name":{"description":"Workspace name.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","name"],"type":"object"},"name":"update_workspace"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin write. Add an organisation member to a workspace with a confirmed workspace role.","input_schema":{"properties":{"role":{"description":"Workspace role: viewer, reviewer, editor, or admin.","type":"string"},"user_id":{"description":"Member user UUID.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","user_id","role"],"type":"object"},"name":"add_workspace_member"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin destructive write. Change a workspace member role; confirm user, workspace, and role because this can reduce access.","input_schema":{"properties":{"role":{"description":"Workspace role: viewer, reviewer, editor, or admin.","type":"string"},"user_id":{"description":"Member user UUID.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","user_id","role"],"type":"object"},"name":"update_workspace_member"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:admin:write","description":"Admin destructive write. Remove a member from a workspace after explicit confirmation.","input_schema":{"properties":{"user_id":{"description":"Member user UUID.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","user_id"],"type":"object"},"name":"remove_workspace_member"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Workspace read. Browse one workspace folder with pagination so agents can inspect direct child files/folders without loading a huge nested tree.","input_schema":{"properties":{"cursor":{"description":"Opaque next_cursor from a previous response.","type":"string"},"include_all_folders":{"description":"Also return all folders in the workspace for move-target pickers; omit for normal browsing.","type":"boolean"},"include_archived":{"description":"Include archived Markdown documents in results.","type":"boolean"},"kind":{"description":"Optional file kind filter: folder, markdown, or asset.","type":"string"},"limit":{"description":"Maximum direct child entries to return, 1-200. Defaults to 100.","type":"integer"},"parent_id":{"description":"Optional folder UUID.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id"],"type":"object"},"name":"list_workspace_files"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Workspace read. List immutable asset revisions, newest first, 50 per page. Use before_revision for older history. Returns uploader, checksum, messages, restored-from provenance and authenticated original-file download URLs. To pin bytes in authored Markdown, append ?rev=N to the asset path using a returned revision_number; omit rev to follow latest, even in saved/shared documents. N must be one canonical positive decimal integer; invalid or missing pins never fall back. This does not grant public access.","input_schema":{"properties":{"before_revision":{"description":"Optional exclusive revision cursor for older history.","minimum":1,"type":"integer"},"file_id":{"description":"Existing asset UUID.","type":"string"},"workspace_id":{"description":"Current workspace UUID.","type":"string"}},"required":["workspace_id","file_id"],"type":"object"},"name":"list_workspace_asset_revisions"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Workspace read. Resolve a read-only asset preview and original download URL for current or an exact revision. Returned URLs pin the resolved revision with ?rev=N and require workspace access. Its revision_number JSON argument selects an asset revision; authored Markdown instead uses ?rev=N on the asset path, with omitted rev following latest. Invalid or missing pins never fall back. Office/spreadsheet preparation populates a derived cache; pending/running/failed/limited states are explicit. Image, text, PDF and browser-supported audio/video use read-only viewers.","input_schema":{"properties":{"file_id":{"description":"Asset UUID.","type":"string"},"revision_number":{"description":"Optional exact asset revision. Omit to resolve current; returned URLs pin that resolved revision.","minimum":1,"type":"integer"},"workspace_id":{"description":"Current workspace UUID.","type":"string"}},"required":["workspace_id","file_id"],"type":"object"},"name":"get_workspace_asset_preview"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Workspace write. Restore an asset revision as a new current revision with a restored-from back-reference. Requires expected_revision; stale requests fail. Reuse request_id for retries to return the original result. Existing history and workspace filename remain intact.","input_schema":{"properties":{"expected_revision":{"description":"Expected current revision.","minimum":1,"type":"integer"},"file_id":{"description":"Existing asset UUID.","type":"string"},"message":{"description":"Optional version message.","maxLength":2000,"type":"string"},"request_id":{"description":"New operation UUID; reuse for retries.","type":"string"},"revision_number":{"description":"Revision to restore.","minimum":1,"type":"integer"},"workspace_id":{"description":"Current workspace UUID.","type":"string"}},"required":["workspace_id","file_id","revision_number","expected_revision","request_id"],"type":"object"},"name":"restore_workspace_asset_revision"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Workspace read. Search a workspace-wide flat file index with pagination and filters so agents can discover exact file/document IDs without loading folder trees. Use for large or batch discovery; combine kind, path_prefix, query, and cursor pagination as needed.","input_schema":{"properties":{"cursor":{"description":"Opaque next_cursor from a previous response.","type":"string"},"include_archived":{"description":"Include archived Markdown documents in results.","type":"boolean"},"kind":{"description":"Optional file kind filter: folder, markdown, or asset.","type":"string"},"limit":{"description":"Maximum matching entries to return, 1-200. Defaults to 100.","type":"integer"},"path_prefix":{"description":"Optional workspace path prefix such as /Help Desk.","type":"string"},"query":{"description":"Optional case-insensitive search over file names and paths.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id"],"type":"object"},"name":"search_workspace_files"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Owner read. List links and images in an owned document draft, including Markdown tables. Resolve relative paths against the document folder and leading-slash paths against the workspace root. Return resolved_path, canonical rendered_url, file_exists and rendered_link_valid. Asset references also return revision_mode (latest, pinned or invalid), requested_revision when validly pinned, current_revision, resolved_revision when available and revision_available. Author ?rev=N in Markdown to pin an asset revision; omit rev to follow latest, including in saved/shared Markdown. N must be one canonical positive decimal integer; invalid_revision and revision_not_found are explicit unresolved reasons with no latest fallback. Resolved asset metadata describes the selected bytes. An unavailable pin can retain its canonical rendered_url for an explicit HTTP 404. Metadata and route checks do not validate HTTP delivery or stored bytes; external URLs are listed separately and not validated.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"list_document_references"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Workspace read. Get metadata for explicit documents before edits, saves/publishes, review links, or share workflows. Returns file/path, version, archived, draft, and has_draft_changes_since_latest state; does not return Markdown.","input_schema":{"properties":{"document_ids":{"description":"Document UUIDs to inspect; max 100. For batch edits or publishing, inspect all target documents and check has_draft_changes_since_latest before update_document_draft or save_document_version.","items":{"type":"string"},"type":"array"}},"required":["document_ids"],"type":"object"},"name":"get_document_details"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Workspace read. Return the mutable accepted draft Markdown and metadata for an accessible document. Draft edits are separate from saved versions and shared proposals.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"get_document"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner write. Create an Edith Markdown document draft. Markdown content may be empty. Optional file_name must have no extension or a .md extension. This does not save an immutable version or create review/share links. Asset links/images in authored Markdown follow latest unless explicitly pinned with ?rev=N, for example ![Diagram](assets/diagram.png?rev=3). N is one canonical positive asset revision_number; missing/invalid pins never fall back. Saving/sharing does not automatically pin assets. Use list_workspace_asset_revisions to choose a revision and list_document_references to verify it.","input_schema":{"properties":{"file_name":{"description":"Optional Markdown document file name. Use no extension or a .md extension. Defaults from first H1 or Untitled document.","type":"string"},"markdown":{"description":"Draft Markdown. May be empty.","type":"string"},"parent_id":{"description":"Optional target folder UUID.","type":"string"},"workspace_id":{"description":"Optional target workspace UUID. Defaults to personal workspace.","type":"string"}},"type":"object"},"name":"create_document"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Workspace destructive write. Replace the mutable document draft Markdown without saving/publishing a version. Use expected_version unless the user asks to force. Asset links/images in authored Markdown follow latest unless explicitly pinned with ?rev=N, for example ![Diagram](assets/diagram.png?rev=3). N is one canonical positive asset revision_number; missing/invalid pins never fall back. Saving/sharing does not automatically pin assets. Use list_workspace_asset_revisions to choose a revision and list_document_references to verify it.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"},"expected_version":{"description":"Optional current draft version for conflict detection.","type":"integer"},"force":{"description":"When true, ignore expected_version.","type":"boolean"},"markdown":{"description":"Draft Markdown.","type":"string"}},"required":["document_id","markdown"],"type":"object"},"name":"update_document_draft"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner destructive write. Restore the mutable draft to the latest saved version and drop unsaved draft changes; no new version is saved.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"discard_document_draft"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Workspace write. Save/publish the current draft as a new immutable version checkpoint with an optional message. This publishes all current draft changes; use get_document_details first when publishing many documents or when unrelated pending draft changes would matter.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"},"message":{"description":"Optional Git-style multiline checkpoint message; max 2,000 characters.","type":"string"}},"required":["document_id"],"type":"object"},"name":"save_document_version"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Owner read. List immutable saved versions for a document; these are separate from the current mutable draft.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"list_document_versions"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Owner read. Return the current mutable draft Markdown for a document; this may differ from the latest saved version.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"export_document_draft"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Owner read. Return Markdown for one immutable saved document version selected by revision_number.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"},"revision_number":{"description":"Saved version number.","type":"integer"}},"required":["document_id","revision_number"],"type":"object"},"name":"export_document_version"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner destructive write. Archive an owned document and remove it from active document workflows without deleting it.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"archive_document"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner write. Restore an archived owned document to active document workflows.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"unarchive_document"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner destructive write. Permanently delete an owned document only after confirming its current file name.","input_schema":{"properties":{"confirm_file_name":{"description":"Current document file name, required to confirm deletion.","type":"string"},"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id","confirm_file_name"],"type":"object"},"name":"delete_document"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner write. Create a folder in a workspace; list workspaces/files first so the folder target is explicit.","input_schema":{"properties":{"name":{"description":"Folder name.","type":"string"},"parent_id":{"description":"Optional parent folder UUID.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","name"],"type":"object"},"name":"create_workspace_folder"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner write. Rename a workspace file, folder, asset, or Markdown document file after confirming the file_id and new name.","input_schema":{"properties":{"document_id":{"description":"Optional document UUID when renaming a Markdown document file.","type":"string"},"file_id":{"description":"Workspace file UUID.","type":"string"},"name":{"description":"New file or folder name.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","file_id","name"],"type":"object"},"name":"rename_workspace_file"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner write. Move a workspace file, folder, asset, or Markdown document file after confirming source and destination IDs.","input_schema":{"properties":{"destination_parent_id":{"description":"Optional destination folder UUID. Omit to move to destination workspace root.","type":"string"},"destination_workspace_id":{"description":"Optional destination workspace UUID. Defaults to source workspace.","type":"string"},"file_id":{"description":"Workspace file UUID.","type":"string"},"workspace_id":{"description":"Source workspace UUID.","type":"string"}},"required":["workspace_id","file_id"],"type":"object"},"name":"move_workspace_file"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Workspace write. Start an Edith-server upload session. PUT exact bytes to the returned URL with its headers, then complete_workspace_file_upload. Omit target_file_id to create a separate file (new text .md files become documents). Set target_file_id and expected_revision to upload a new immutable asset version, preserving its workspace name. Matching names or hashes never infer replacement. Matching current bytes produce no redundant revision.","input_schema":{"properties":{"byte_size":{"description":"Exact byte size, max 500 MB.","type":"integer"},"checksum_sha256":{"description":"Lowercase SHA-256 of the exact bytes. A replacement matching current bytes succeeds without a redundant revision.","type":"string"},"content_type":{"description":"MIME type for the upload Content-Type header.","type":"string"},"expected_revision":{"description":"Required with target_file_id. Current asset revision; concurrent changes cause a conflict.","minimum":1,"type":"integer"},"file_name":{"description":"Upload filename. New text .md uploads become Markdown documents; other files become assets. A replacement retains the target asset's workspace filename.","type":"string"},"message":{"description":"Optional version message.","maxLength":2000,"type":"string"},"parent_id":{"description":"Optional parent folder for a new file.","type":"string"},"target_file_id":{"description":"Optional existing asset UUID to upload a new version. Omit to create a separate file; matching names or hashes never silently replace.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","file_name","content_type","byte_size","checksum_sha256"],"type":"object"},"name":"start_workspace_file_upload"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Workspace write. Complete an upload after PUT. Verifies exact size/checksum, detected type, safe SVG and access. Asset completion is retry-safe: reuse upload_session_id to return the original completed revision even after later updates. unchanged=true means bytes matched current and no revision was created. Markdown import completion retains its existing pending-only contract.","input_schema":{"properties":{"upload_session_id":{"description":"Workspace file upload session UUID.","type":"string"}},"required":["upload_session_id"],"type":"object"},"name":"complete_workspace_file_upload"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner write. Abort a pending Edith-server workspace file upload and delete its uploaded object if present; this does not delete completed workspace files.","input_schema":{"properties":{"upload_session_id":{"description":"Workspace file upload session UUID.","type":"string"}},"required":["upload_session_id"],"type":"object"},"name":"abort_workspace_file_upload"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:documents:write","description":"Owner destructive write. Delete a workspace file, folder, asset, or Markdown document file after confirming its exact current name; this can remove nested files.","input_schema":{"properties":{"confirm_file_name":{"description":"Current file, folder, asset, or document file name, required to confirm deletion.","type":"string"},"file_id":{"description":"Workspace file UUID.","type":"string"},"workspace_id":{"description":"Workspace UUID.","type":"string"}},"required":["workspace_id","file_id","confirm_file_name"],"type":"object"},"name":"delete_workspace_file"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:shares:write","description":"Owner write. Create a read-only public share link pinned to the latest or selected saved version; this does not create a review/comment workflow.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"},"revision_number":{"description":"Optional saved version number. Defaults to latest saved version.","type":"integer"}},"required":["document_id"],"type":"object"},"name":"create_share_link"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:shares:read","description":"Owner read. List read-only share links for a document, including the saved revision number each link is pinned to.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"list_share_links"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:shares:write","description":"Owner destructive write. Revoke a read-only share link by URL or sh_ token so it can no longer be used.","input_schema":{"properties":{"share_token":{"description":"Share token beginning sh_.","type":"string"},"share_url":{"description":"Full share URL.","type":"string"}},"type":"object"},"name":"revoke_share_link"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:contacts:read","description":"Owner read. List saved reviewer contacts for review-link workflows; contacts are distinct from review identities.","input_schema":{"properties":{"query":{"description":"Optional search query.","type":"string"}},"type":"object"},"name":"list_contacts"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:contacts:write","description":"Owner write. Create or update a saved reviewer contact by email for future review-link workflows.","input_schema":{"properties":{"email":{"description":"Contact email address.","type":"string"},"name":{"description":"Optional contact name.","type":"string"}},"required":["email"],"type":"object"},"name":"upsert_contact"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:contacts:write","description":"Owner write. Update a saved reviewer contact by ID after confirming the new email and optional name.","input_schema":{"properties":{"contact_id":{"description":"Contact UUID.","type":"string"},"email":{"description":"Contact email address.","type":"string"},"name":{"description":"Optional contact name.","type":"string"}},"required":["contact_id","email"],"type":"object"},"name":"update_contact"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:contacts:write","description":"Owner destructive write. Archive a saved reviewer contact by ID; use only after explicit confirmation.","input_schema":{"properties":{"contact_id":{"description":"Contact UUID.","type":"string"}},"required":["contact_id"],"type":"object"},"name":"archive_contact"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:shares:read","description":"Workspace read. Check a named recipient's relationship and effective access to the document's current workspace. Requires sender edit access. Returns destination_type, capabilities, email_purpose and expected_target. No token, link or email is created; unrelated account details are not exposed.","input_schema":{"additionalProperties":false,"properties":{"document_id":{"description":"Document UUID in the sender's current accessible workspace.","type":"string"},"recipient_email":{"description":"Named recipient's email address.","type":"string"}},"required":["document_id","recipient_email"],"type":"object"},"name":"get_document_share_target"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false},"api_scope":"api:shares:write","description":"Workspace external write. ALWAYS SENDS EMAIL to recipient_email. Before calling, show the complete email, subject and recipients and obtain explicit final sending authorisation. First call get_document_share_target and use its expected_target. Existing workspace access uses an internal document link with no role change or review quota; others receive an external review link. Reuse request_id on double clicks, replays and retries. Retry only email_status=failed with the returned attempt as expected_attempt; sending/uncertain must not be automatically resent. Changed recipient access requires a fresh preflight and renewed authorisation.","input_schema":{"additionalProperties":false,"properties":{"document_id":{"description":"Document UUID in the sender's current accessible workspace.","type":"string"},"expected_attempt":{"description":"0 initially. Explicit failed-delivery retry uses returned attempt; never retry sending/uncertain automatically.","minimum":0,"type":"integer"},"expected_target":{"description":"Exact expected_target from get_document_share_target, checked before obtaining final email sending authorisation.","type":"string"},"recipient_email":{"description":"Named recipient's email address.","type":"string"},"request_id":{"description":"New UUID for one authorised email; reuse on replays and failed-delivery retries.","type":"string"}},"required":["document_id","recipient_email","expected_target","request_id"],"type":"object"},"name":"share_document"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Workspace write. Create an unnamed public rw_ review link after saving the draft. Shows the current review state, not a pinned revision. Sends no email. Named recipients must use share_document.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"create_public_review_link"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:reviews:read","description":"Owner read. List document-scoped review links and active/revoked status for an owned document; review links are distinct from share links.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"get_review_status"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Owner destructive write. Revoke a document-scoped rw_ review link so reviewers can no longer use it.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"},"review_link_id":{"description":"Review link UUID.","type":"string"}},"required":["document_id","review_link_id"],"type":"object"},"name":"revoke_review_link"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:documents:read","description":"Owner read. Return the latest saved Markdown version for an owned document, not the mutable draft.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"get_final_markdown"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:reviews:read","description":"Workspace read. Return the shared proposal head for a document visible with workspace read capability. The response includes shared-head Markdown, current accepted draft and proposal versions, safe attribution, and source-hunk state and ranges. Reading leaves the accepted draft, proposal, and saved versions unchanged.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"get_document_proposal"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Workspace write. Add this workspace user's proposed Markdown to the shared proposal head. proposed_markdown, expected_draft_version, and expected_proposal_version are required. A stale version fails without mutation; the accepted draft and saved versions remain unchanged. Asset links/images in authored Markdown follow latest unless explicitly pinned with ?rev=N, for example ![Diagram](assets/diagram.png?rev=3). N is one canonical positive asset revision_number; missing/invalid pins never fall back. Saving/sharing does not automatically pin assets. Use list_workspace_asset_revisions to choose a revision and list_document_references to verify it.","input_schema":{"additionalProperties":false,"properties":{"document_id":{"description":"Document UUID in an accessible workspace.","type":"string"},"expected_draft_version":{"description":"Current accepted document draft version returned by a proposal read.","type":"integer"},"expected_proposal_version":{"description":"Current shared proposal version returned by a proposal read.","type":"integer"},"proposed_markdown":{"description":"Complete proposed Markdown based on the shared proposal head.","type":"string"}},"required":["document_id","proposed_markdown","expected_draft_version","expected_proposal_version"],"type":"object"},"name":"update_document_proposal"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Workspace destructive write. Atomically apply selected pending proposed changes to the accepted draft. Both current concurrency versions are required. Selecting overlapping alternatives returns a conflict without mutation; apply either alternative alone. Saved versions remain unchanged until save_document_version runs.","input_schema":{"additionalProperties":false,"properties":{"document_id":{"description":"Document UUID in an editable workspace.","type":"string"},"expected_draft_version":{"description":"Current accepted document draft version returned by a proposal read.","type":"integer"},"expected_proposal_version":{"description":"Current shared proposal version returned by a proposal read.","type":"integer"},"proposed_change_ids":{"description":"Proposed change UUIDs to decide atomically. Selected changes must not overlap.","items":{"type":"string"},"minItems":1,"type":"array","uniqueItems":true}},"required":["document_id","proposed_change_ids","expected_draft_version","expected_proposal_version"],"type":"object"},"name":"apply_proposed_changes"},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Workspace destructive write. Atomically reject selected unresolved proposed changes. Both current concurrency versions are required. The accepted draft and saved versions remain unchanged, and the proposal version advances.","input_schema":{"additionalProperties":false,"properties":{"document_id":{"description":"Document UUID in an editable workspace.","type":"string"},"expected_draft_version":{"description":"Current accepted document draft version returned by a proposal read.","type":"integer"},"expected_proposal_version":{"description":"Current shared proposal version returned by a proposal read.","type":"integer"},"proposed_change_ids":{"description":"Proposed change UUIDs to decide atomically.","items":{"type":"string"},"minItems":1,"type":"array","uniqueItems":true}},"required":["document_id","proposed_change_ids","expected_draft_version","expected_proposal_version"],"type":"object"},"name":"reject_proposed_changes"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:reviews:read","description":"Owner read. Return visible comment threads for an owned document with explicit safe thread, source-selector, author-display, and comment fields.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id"],"type":"object"},"name":"list_comment_threads"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Owner write. Create a whole-document discussion thread without changing the accepted draft, shared proposal, or saved versions.","input_schema":{"properties":{"body":{"description":"Comment body.","type":"string"},"document_id":{"description":"Document UUID.","type":"string"}},"required":["document_id","body"],"type":"object"},"name":"create_document_comment"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Owner write. Create a content-anchored discussion thread from an immutable source snapshot byte range without changing document content.","input_schema":{"properties":{"body":{"description":"Comment body.","type":"string"},"document_id":{"description":"Document UUID.","type":"string"},"source_end_byte":{"description":"Exclusive UTF-8 byte end in the exact LF-normalised snapshot Markdown.","type":"integer"},"source_snapshot_id":{"description":"Immutable source snapshot UUID returned with the Markdown.","type":"string"},"source_start_byte":{"description":"Zero-based UTF-8 byte start in the exact LF-normalised snapshot Markdown.","type":"integer"}},"required":["document_id","source_snapshot_id","source_start_byte","source_end_byte","body"],"type":"object"},"name":"create_content_comment"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Owner write. Create or extend the discussion attached to a pending proposed change. Edith attaches the discussion to the same visible proposed-change group used by the browser UI.","input_schema":{"additionalProperties":false,"properties":{"body":{"description":"Comment body.","type":"string"},"document_id":{"description":"Document UUID in an accessible workspace.","type":"string"},"proposed_change_id":{"description":"Pending proposed change UUID returned by get_document_proposal.","type":"string"}},"required":["document_id","proposed_change_id","body"],"type":"object"},"name":"create_proposed_change_comment"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Owner write. Reply to an existing comment thread on an owned document without saving a document version.","input_schema":{"properties":{"body":{"description":"Reply body.","type":"string"},"document_id":{"description":"Document UUID.","type":"string"},"thread_id":{"description":"Comment thread UUID.","type":"string"}},"required":["document_id","thread_id","body"],"type":"object"},"name":"reply_comment_thread"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Owner write. Resolve a comment thread on an owned document without changing draft content or saving a version.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"},"thread_id":{"description":"Comment thread UUID.","type":"string"}},"required":["document_id","thread_id"],"type":"object"},"name":"resolve_comment_thread"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviews:write","description":"Owner write. Reopen a resolved comment thread on an owned document when more discussion is needed.","input_schema":{"properties":{"document_id":{"description":"Document UUID.","type":"string"},"thread_id":{"description":"Comment thread UUID.","type":"string"}},"required":["document_id","thread_id"],"type":"object"},"name":"reopen_comment_thread"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:reviewer:read","description":"Reviewer-token read. Return the current accepted review document and safe reviewer context for an active rw_ token. The response excludes token hashes, contact details, and internal identity records.","input_schema":{"properties":{"review_token":{"description":"Review token beginning rw_.","type":"string"}},"required":["review_token"],"type":"object"},"name":"get_review_document"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:reviewer:read","description":"Reviewer-token read. Return the document's shared proposal head through an active review token. The response includes shared-head Markdown, current accepted draft and proposal versions, safe attribution, and source-hunk state and ranges. Reading leaves all document state unchanged.","input_schema":{"properties":{"review_token":{"description":"Review token beginning rw_.","type":"string"}},"required":["review_token"],"type":"object"},"name":"get_review_proposal"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviewer:write","description":"Reviewer-token write. Add this signed-in review identity's proposed Markdown to the shared proposal head through an active review token. proposed_markdown, expected_draft_version, and expected_proposal_version are required. A stale version fails without mutation; the accepted draft and saved versions remain unchanged. Preserve authored asset ?rev=N selectors; omitted rev follows latest and invalid/missing pins never fall back. Reviewer tokens do not grant workspace asset-history enumeration or owner-only list_document_references access.","input_schema":{"additionalProperties":false,"properties":{"expected_draft_version":{"description":"Current accepted document draft version returned by a proposal read.","type":"integer"},"expected_proposal_version":{"description":"Current shared proposal version returned by a proposal read.","type":"integer"},"proposed_markdown":{"description":"Complete proposed Markdown based on the shared proposal head.","type":"string"},"review_token":{"description":"Active review token beginning rw_.","type":"string"}},"required":["review_token","proposed_markdown","expected_draft_version","expected_proposal_version"],"type":"object"},"name":"update_review_proposal"},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"api_scope":"api:reviewer:read","description":"Reviewer-token read. List comment threads visible through an rw_ review token before replying or adding feedback.","input_schema":{"properties":{"review_token":{"description":"Review token beginning rw_.","type":"string"}},"required":["review_token"],"type":"object"},"name":"list_review_comment_threads"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviewer:write","description":"Reviewer-token write. Create a whole-document comment through an rw_ token for questions or general feedback, not as a substitute for proposed edits.","input_schema":{"properties":{"body":{"description":"Comment body.","type":"string"},"review_token":{"description":"Review token beginning rw_.","type":"string"}},"required":["review_token","body"],"type":"object"},"name":"create_review_document_comment"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviewer:write","description":"Reviewer-token write. Create a content-anchored discussion from an immutable source snapshot byte range through an active rw_ token without changing document content.","input_schema":{"properties":{"body":{"description":"Comment body.","type":"string"},"review_token":{"description":"Review token beginning rw_.","type":"string"},"source_end_byte":{"description":"Exclusive UTF-8 byte end in the exact LF-normalised snapshot Markdown.","type":"integer"},"source_snapshot_id":{"description":"Immutable source snapshot UUID returned with the review Markdown.","type":"string"},"source_start_byte":{"description":"Zero-based UTF-8 byte start in the exact LF-normalised snapshot Markdown.","type":"integer"}},"required":["review_token","source_snapshot_id","source_start_byte","source_end_byte","body"],"type":"object"},"name":"create_review_content_comment"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviewer:write","description":"Reviewer-token write. Create or extend the discussion attached to a pending proposed change through an active rw_ token. Edith attaches the discussion to the same visible proposed-change group used by the browser UI.","input_schema":{"additionalProperties":false,"properties":{"body":{"description":"Comment body.","type":"string"},"proposed_change_id":{"description":"Pending proposed change UUID returned by get_review_proposal.","type":"string"},"review_token":{"description":"Active review token beginning rw_.","type":"string"}},"required":["review_token","proposed_change_id","body"],"type":"object"},"name":"create_review_proposed_change_comment"},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"api_scope":"api:reviewer:write","description":"Reviewer-token write. Reply to an existing comment thread visible through an rw_ review token.","input_schema":{"properties":{"body":{"description":"Reply body.","type":"string"},"review_token":{"description":"Review token beginning rw_.","type":"string"},"thread_id":{"description":"Comment thread UUID.","type":"string"}},"required":["review_token","thread_id","body"],"type":"object"},"name":"reply_review_comment_thread"}]}
