Breeks Docs

MCP Connection

Connect agent gateways and MCP clients to Breeks through the standalone Streamable HTTP adapter.

Breeks exposes agent access through a standalone MCP adapter. The MCP service is a thin adapter over Breeks API: it forwards every tool call to /api/agent/tools/{tool_name}, while the API resolves the organization from the project and still owns project isolation, actor permissions, tool-call logging, and audit logs. The adapter never reads or writes the database directly.

Local endpoint

Start the local stack, then connect to the MCP endpoint.

cp .env.example .env
docker compose up --build
URL: http://localhost:8767/mcp
Authorization: Bearer dev-mcp-token

Health check:

curl http://localhost:8767/healthz

Client config

Exact config keys vary by MCP client. The required values are Streamable HTTP transport, the MCP URL, and the bearer token.

{
  "mcpServers": {
    "breeks": {
      "type": "http",
      "url": "http://localhost:8767/mcp",
      "headers": {
        "Authorization": "Bearer dev-mcp-token"
      }
    }
  }
}

Tool envelope

Every Breeks MCP tool call carries project, actor, and input fields. The organization is resolved from the project server-side and is never a client parameter.

{
  "project_id": "project_tower",
  "actor": {
    "user_id": "user_site",
    "channel": "web"
  },
  "input": {}
}

MCP tools

The Breeks MCP adapter currently exposes 76 tools. Every tool name is prefixed with breeks. at the MCP boundary and is forwarded to the matching Breeks API tool contract without the prefix.

Project

5 tools
breeks.project.get

Get Project

Retrieve one project by project scope.

read-only
breeks.project.get_recent_activity

Get Recent Project Activity

Retrieve recent audit/activity entries for the project.

read-only
breeks.project.get_situation

Get Project Situation

Retrieve project context: the project, active members, active record types, matching shared memory (optional memory_query) and what needs attention now, computed by Core from published work the actor can view (overdue, due soon, high priority, help requested, blocked, unassigned, links to superseded drawings, drawing revisions awaiting review, schedule slips, records awaiting a response and conflicting memory reports). Optional reasons, assignee_id and limit (max 50) filter the attention list.

read-only
breeks.project.list_tags

List Tags

List the tag catalog.

read-only
breeks.project.add_member

Add Project Member

Add a user as a project member, optionally with assignment scope context.

write

Members

3 tools
breeks.member.resolve_identity

Resolve Member Identity

Resolve or create a channel identity for a project user.

write
breeks.member.search

Search Members

Search project members by text, role, status, scope, or Breeks perceival.

read-only
breeks.member.get

Get Member

Retrieve one project member by member ID or user ID, including scope and Breeks perceival.

read-only

Documents

22 tools
breeks.document.list_versions

List Drawing Versions

List one drawing chain, newest first. Requires document_id; drawing documents only.

read-only
breeks.document.compare_versions

Compare Drawing Versions

Read comparison metadata and page availability for document_id and other_document_id in the same drawing chain. Visual comparison is page-number aligned.

read-only
breeks.document.mark_current

Mark Drawing Current

Explicitly promote a processed pending drawing revision. Requires document_id and expected_current_document_id from the reviewed history. A stale current ID returns conflict; refresh and obtain a new confirmation.

write
breeks.document.preview_carry_forward

Preview Drawing Carry Forward

Preview tags, annotations, record links, task links and blocked page mappings from document_id to target_document_id in the same drawing chain.

read-only
breeks.document.carry_forward

Carry Drawing Relationships Forward

Copy only explicitly selected project_tag_ids, annotation_ids, record_link_ids and task_ids from document_id to target_document_id. Preserves historical relationships; blocked selections fail atomically.

writeidempotent
breeks.document.search

Search Documents

Search project documents with text and metadata filters. trade, storey, document_subtype, author and revision filter the well-known custom fields; filters.custom matches any other custom field.

read-only
breeks.document.list

List Documents

List project documents without a search query, newest updated first. Optional top-level filters: document_type, status, folder_id, tag, tag_id, trade, storey, document_subtype, author, revision and custom. Current drawings only by default; include_versions=true requires document_type=drawing. limit defaults to 20 (1–50); offset defaults to 0. Returns results, limit, offset and has_more.

read-only
breeks.document.get

Get Document

Retrieve document metadata, comments, tags, and activity.

read-only
breeks.document.get_pages

Get Document Pages

Retrieve page metadata for a document.

read-only
breeks.document.get_processing_status

Get Document Processing Status

Retrieve processing status and extraction summary for a document.

read-only
breeks.document.get_activity

Get Document Activity

Retrieve audit activity for a document.

read-only
breeks.document.get_annotations

Get Document Annotations

List annotations for a document or page.

read-only
breeks.document.get_annotation_request

Get Annotation Request

Check question progress and saved annotation IDs for an annotation request.

read-only
breeks.document.revoke_annotation_request

Revoke Annotation Request

Revoke an active annotation request; requires confirm=true.

writedestructive
breeks.document.update

Update Document

Update a document's title, folder, status, or custom field values (custom_values_json), including drawing number, revision, trade and level.

write
breeks.document.add_comment

Add Document Comment

Add a comment to a document.

write
breeks.document.reprocess

Reprocess Document

Enqueue document reprocessing.

write
breeks.document.tag

Tag Document

Apply a tag to a document.

writeidempotent
breeks.document.untag

Untag Document

Remove a tag from a document.

writedestructive
breeks.document.create_annotation

Create Document Annotation

Create a normalized page annotation on a document.

write
breeks.document.update_annotation

Update Document Annotation

Update a document annotation.

write
breeks.document.delete_annotation

Delete Document Annotation

Delete a document annotation; requires confirm=true.

writedestructive

Record Types

2 tools
breeks.record_type.list

List Record Types

List active project record type definitions.

read-only
breeks.record_type.get_blueprint

Get Record Type Blueprint

Retrieve a record type definition and fields.

read-only

Records

20 tools
breeks.record.create

Create Record

Create a project record draft, including RFI records. Type-specific values such as trade, location_text and an RFI response go in custom_values_json. Optional start_date (YYYY-MM-DD) plus duration_days (inclusive calendar days) derive due_date. Optional parent_record_id nests it under a published record on the Gantt.

write
breeks.record.search

Search Records

Search published records by text, number or ID, type, status, priority, assignee, trade custom field, or tag. Optional limit/offset return results, limit, offset and has_more.

read-only
breeks.record.list

List Records

List published project records without a search query, newest created first. Optional top-level filters: record_type, status, priority, assigned_to, trade, tag and tag_id. Excludes archived records unless status=archived; private drafts and withdrawn records are omitted. limit defaults to 20 (1–50); offset defaults to 0. Returns results, limit, offset and has_more.

read-only
breeks.record.get

Get Record

Retrieve one record with comments, linked documents, tasks, and activity.

read-only
breeks.record.get_activity

Get Record Activity

Retrieve audit activity for a record.

read-only
breeks.record.prepare_draft

Prepare Record Draft

Prepare or resume the actor's private draft based on current published content. Requires record_id.

write
breeks.record.get_draft

Get Record Draft

Read only the actor's working draft and its save_version.

read-only
breeks.record.update

Edit Record Draft

Save private draft changes; requires expected_save_version from record.prepare_draft or record.get_draft. Does not publish. A sent due_date recalculates duration_days from start_date; a sent start_date or duration_days moves due_date.

write
breeks.record.publish

Publish Record

Explicitly publish a saved draft as Shared, not Official. Requires record_id, expected_current_revision_id (null for first publication), expected_save_version, request_id and optional change_note. Recheck closure permissions and obtain confirmation for restricted actions.

write
breeks.record.revisions

Record History

Read ordered published revision history. Requires record_id.

read-only
breeks.record.get_revision

Read Record Revision

Read a historical snapshot by record_id and revision_id.

read-only
breeks.record.restore

Restore Record to Draft

Prepare a private draft from revision_id; does not publish. Requires expected_current_revision_id, and expected_save_version plus replace_existing_draft=true to replace an existing draft.

write
breeks.record.review_current

Review Current Revision

After explicitly reviewing competing content, retain the actor's draft against expected_current_revision_id. Requires expected_save_version.

write
breeks.record.discard_draft

Discard Record Draft

Discard only the actor's draft after confirmation. Requires expected_save_version and expected_current_revision_id; published history remains.

writedestructive
breeks.record.withdraw

Withdraw Record

Withdraw shared content after confirmation. Requires project.manage and expected_current_revision_id; retains history.

writedestructive
breeks.record.add_comment

Add Record Comment

Add a comment to a record.

write
breeks.record.tag

Tag Record

Apply a tag to a record.

writeidempotent
breeks.record.untag

Untag Record

Remove a tag from a record.

writedestructive
breeks.record.set_parent

Set Record Parent

Nest a record under a published parent record, or move it to the top level with parent_record_id=null. Requires record_id. Saves at once without a revision; cycles are rejected.

write
breeks.record.link_document

Link Record Document

Link a document, page, or annotation to a record.

write

Tasks

17 tools
breeks.task.create

Create Task

Create a private task draft or nested subtask. Publish explicitly with task.publish before sharing. Retrieve task_model.get_blueprint first; configured custom fields go in custom_values_json. Supports optional start_date, duration_days (inclusive calendar days) and due_date (YYYY-MM-DD) for the Gantt; start plus duration derives the due date.

write
breeks.task.search

Search Tasks

Search tasks by text, hierarchy, and metadata filters. Optional limit (max 50) and offset; results report has_more.

read-only
breeks.task.get

Get Task

Retrieve one task with comments and direct children.

read-only
breeks.task.update

Update Task

Save private draft changes and merge configured custom_values_json. Requires expected_save_version from task.prepare_draft or task.get_draft. Does not publish content. Structural-only parent_task_id, sort_order, related_record_id or related_document_id updates save immediately without a content revision. Retrieve task_model.get_blueprint first. Supports start_date, duration_days and due_date (YYYY-MM-DD). A sent due_date recalculates the duration; a sent start or duration moves the due date. Start must not be after due.

write
breeks.task.prepare_draft

Prepare Task Draft

Prepare or resume the actor's private draft based on current published content. Requires task_id.

write
breeks.task.get_draft

Get Task Draft

Read only the actor's working draft and its save_version.

read-only
breeks.task.publish

Publish Task

Explicitly publish a saved draft as Shared, not Official. Requires task_id, expected_current_revision_id (null for first publication), expected_save_version, request_id and optional change_note. Obtain confirmation for due-date changes and cross-company reassignment.

write
breeks.task.revisions

Task History

Read ordered published revision history. Requires task_id.

read-only
breeks.task.get_revision

Read Task Revision

Read a historical snapshot by task_id and revision_id.

read-only
breeks.task.restore

Restore Task to Draft

Prepare a private draft from revision_id; does not publish. Requires expected_current_revision_id, and expected_save_version plus replace_existing_draft=true to replace an existing draft.

write
breeks.task.review_current

Review Current Revision

After explicitly reviewing competing content, retain the actor's draft against expected_current_revision_id. Requires expected_save_version.

write
breeks.task.discard_draft

Discard Task Draft

Discard only the actor's draft after confirmation. Requires expected_save_version and expected_current_revision_id; published history remains.

writedestructive
breeks.task.withdraw

Withdraw Task

Withdraw shared content after confirmation. Requires project.manage and expected_current_revision_id; retains history.

writedestructive
breeks.task.assign

Assign Task

Assign a published task to a project member immediately, retaining a revision. Requires expected_current_revision_id and request_id. Confirm cross-company reassignment.

write
breeks.task.move_status

Move Task Status

Move a published task between Kanban statuses immediately, retaining a revision. Requires expected_current_revision_id and request_id.

write
breeks.task.link_document

Link Task Document

Link a document, page, or annotation to a task.

write
breeks.task.add_comment

Add Task Comment

Add a comment to a task.

write

Notifications

1 tool
breeks.notification.send

Send Notification

Queue a project notification.

write

Schedules

6 tools
breeks.memory.search

Search Project Memory

Search source-backed shared project reports and conflicts. Optional query, source_id, category, status (reported, auto_approved or confirmed), since, until, limit and offset. Reported information is not confirmed project truth; reports awaiting review are never returned.

read-only
breeks.memory.get

Read Project Memory

Read one active project memory with source quotes, authors, dates and review status. Requires memory_id.

read-only
breeks.memory.create

Share Project Memory

Explicitly save the supplied text as a note shared with project members. Requires text and a stable request_id; memory.create permission required. Never copy private conversation history without requester approval.

writeidempotent
breeks.task_model.get_blueprint

Get Task Model

Retrieve the project task model, built-in field configuration and typed custom fields before creating or updating tasks.

read-only
breeks.schedule.create_reminder

Create Reminder

Create a scheduled reminder.

write
breeks.schedule.cancel_reminder

Cancel Reminder

Cancel a scheduled reminder.

writedestructive

Use breeks.record.list and breeks.document.list to browse project content without a search query. Both return results, limit, offset, and has_more; limit defaults to 20 (maximum 50) and offset defaults to 0. To retrieve the next page, increase offset by limit while has_more is true.

List filters are top-level fields inside input. Record filters include record_type, status, priority, assigned_to, trade, tag, and tag_id. Document filters include document_type, status, folder_id, tag, tag_id, drawing metadata shorthands (trade, storey, document_subtype, author, revision), and custom for exact custom-field matches.

Records are ordered by creation time and documents by update time, newest first. Record lists contain published content and exclude private drafts and withdrawn records. Archived items are excluded unless explicitly filtered with status: "archived". Document lists omit deleted documents and show current drawings by default; request include_versions: true with document_type: "drawing" to include historical and pending revisions. Use the search tools for text and relevance matching, and the get tools to inspect an individual result.

Resources

breeks://projects/{project_id}/actors/{actor_user_id}/context
breeks://projects/{project_id}/actors/{actor_user_id}/records
breeks://projects/{project_id}/actors/{actor_user_id}/tasks
breeks://projects/{project_id}/actors/{actor_user_id}/documents
breeks://projects/{project_id}/actors/{actor_user_id}/members
breeks://projects/{project_id}/actors/{actor_user_id}/activity

Tokens

The MCP client authenticates with MCP_ACCESS_TOKEN. The MCP service uses AGENT_TOOL_SERVICE_TOKEN to call the API. Use long random values outside local development.

MCP_ACCESS_TOKEN=dev-mcp-token
AGENT_TOOL_SERVICE_TOKEN=dev-agent-tool-token

Retired annotation requests

Guided "Ask for markup" creation and the request_missing_drawing_information prompt have been removed from MCP. The breeks.document.get_annotation_request and breeks.document.revoke_annotation_request tools remain for authorized historical access; revocation requires confirm=true. New collaboration starts with Share. Existing tokens are not converted, and the old public request, image, and answer routes return 410 Gone.