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 --buildURL: http://localhost:8767/mcp
Authorization: Bearer dev-mcp-tokenHealth check:
curl http://localhost:8767/healthzClient 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 toolsbreeks.project.getGet Project
Retrieve one project by project scope.
breeks.project.get_recent_activityGet Recent Project Activity
Retrieve recent audit/activity entries for the project.
breeks.project.get_situationGet 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.
breeks.project.list_tagsList Tags
List the tag catalog.
breeks.project.add_memberAdd Project Member
Add a user as a project member, optionally with assignment scope context.
Members
3 toolsbreeks.member.resolve_identityResolve Member Identity
Resolve or create a channel identity for a project user.
breeks.member.searchSearch Members
Search project members by text, role, status, scope, or Breeks perceival.
breeks.member.getGet Member
Retrieve one project member by member ID or user ID, including scope and Breeks perceival.
Documents
22 toolsbreeks.document.list_versionsList Drawing Versions
List one drawing chain, newest first. Requires document_id; drawing documents only.
breeks.document.compare_versionsCompare 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.
breeks.document.mark_currentMark 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.
breeks.document.preview_carry_forwardPreview 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.
breeks.document.carry_forwardCarry 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.
breeks.document.searchSearch 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.
breeks.document.listList 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.
breeks.document.getGet Document
Retrieve document metadata, comments, tags, and activity.
breeks.document.get_pagesGet Document Pages
Retrieve page metadata for a document.
breeks.document.get_processing_statusGet Document Processing Status
Retrieve processing status and extraction summary for a document.
breeks.document.get_activityGet Document Activity
Retrieve audit activity for a document.
breeks.document.get_annotationsGet Document Annotations
List annotations for a document or page.
breeks.document.get_annotation_requestGet Annotation Request
Check question progress and saved annotation IDs for an annotation request.
breeks.document.revoke_annotation_requestRevoke Annotation Request
Revoke an active annotation request; requires confirm=true.
breeks.document.updateUpdate Document
Update a document's title, folder, status, or custom field values (custom_values_json), including drawing number, revision, trade and level.
breeks.document.add_commentAdd Document Comment
Add a comment to a document.
breeks.document.reprocessReprocess Document
Enqueue document reprocessing.
breeks.document.tagTag Document
Apply a tag to a document.
breeks.document.untagUntag Document
Remove a tag from a document.
breeks.document.create_annotationCreate Document Annotation
Create a normalized page annotation on a document.
breeks.document.update_annotationUpdate Document Annotation
Update a document annotation.
breeks.document.delete_annotationDelete Document Annotation
Delete a document annotation; requires confirm=true.
Record Types
2 toolsbreeks.record_type.listList Record Types
List active project record type definitions.
breeks.record_type.get_blueprintGet Record Type Blueprint
Retrieve a record type definition and fields.
Records
20 toolsbreeks.record.createCreate 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.
breeks.record.searchSearch 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.
breeks.record.listList 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.
breeks.record.getGet Record
Retrieve one record with comments, linked documents, tasks, and activity.
breeks.record.get_activityGet Record Activity
Retrieve audit activity for a record.
breeks.record.prepare_draftPrepare Record Draft
Prepare or resume the actor's private draft based on current published content. Requires record_id.
breeks.record.get_draftGet Record Draft
Read only the actor's working draft and its save_version.
breeks.record.updateEdit 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.
breeks.record.publishPublish 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.
breeks.record.revisionsRecord History
Read ordered published revision history. Requires record_id.
breeks.record.get_revisionRead Record Revision
Read a historical snapshot by record_id and revision_id.
breeks.record.restoreRestore 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.
breeks.record.review_currentReview Current Revision
After explicitly reviewing competing content, retain the actor's draft against expected_current_revision_id. Requires expected_save_version.
breeks.record.discard_draftDiscard Record Draft
Discard only the actor's draft after confirmation. Requires expected_save_version and expected_current_revision_id; published history remains.
breeks.record.withdrawWithdraw Record
Withdraw shared content after confirmation. Requires project.manage and expected_current_revision_id; retains history.
breeks.record.add_commentAdd Record Comment
Add a comment to a record.
breeks.record.tagTag Record
Apply a tag to a record.
breeks.record.untagUntag Record
Remove a tag from a record.
breeks.record.set_parentSet 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.
breeks.record.link_documentLink Record Document
Link a document, page, or annotation to a record.
Tasks
17 toolsbreeks.task.createCreate 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.
breeks.task.searchSearch Tasks
Search tasks by text, hierarchy, and metadata filters. Optional limit (max 50) and offset; results report has_more.
breeks.task.getGet Task
Retrieve one task with comments and direct children.
breeks.task.updateUpdate 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.
breeks.task.prepare_draftPrepare Task Draft
Prepare or resume the actor's private draft based on current published content. Requires task_id.
breeks.task.get_draftGet Task Draft
Read only the actor's working draft and its save_version.
breeks.task.publishPublish 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.
breeks.task.revisionsTask History
Read ordered published revision history. Requires task_id.
breeks.task.get_revisionRead Task Revision
Read a historical snapshot by task_id and revision_id.
breeks.task.restoreRestore 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.
breeks.task.review_currentReview Current Revision
After explicitly reviewing competing content, retain the actor's draft against expected_current_revision_id. Requires expected_save_version.
breeks.task.discard_draftDiscard Task Draft
Discard only the actor's draft after confirmation. Requires expected_save_version and expected_current_revision_id; published history remains.
breeks.task.withdrawWithdraw Task
Withdraw shared content after confirmation. Requires project.manage and expected_current_revision_id; retains history.
breeks.task.assignAssign 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.
breeks.task.move_statusMove Task Status
Move a published task between Kanban statuses immediately, retaining a revision. Requires expected_current_revision_id and request_id.
breeks.task.link_documentLink Task Document
Link a document, page, or annotation to a task.
breeks.task.add_commentAdd Task Comment
Add a comment to a task.
Notifications
1 toolbreeks.notification.sendSend Notification
Queue a project notification.
Schedules
6 toolsbreeks.memory.searchSearch 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.
breeks.memory.getRead Project Memory
Read one active project memory with source quotes, authors, dates and review status. Requires memory_id.
breeks.memory.createShare 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.
breeks.task_model.get_blueprintGet Task Model
Retrieve the project task model, built-in field configuration and typed custom fields before creating or updating tasks.
breeks.schedule.create_reminderCreate Reminder
Create a scheduled reminder.
breeks.schedule.cancel_reminderCancel Reminder
Cancel a scheduled reminder.
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}/activityTokens
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-tokenRetired 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.