Skip to main content

MCP Server

Bob Studio exposes an MCP (Model Context Protocol) server that lets external AI tools -- such as Cursor, Claude Desktop, or custom agents -- interact with your workspace data.

Base URL

All MCP communication happens over a single endpoint:

https://api-bobstudio.original.land/mcp

The server is stateless -- every request is self-contained and authenticated via API key. No sessions or persistent connections required.

MethodPurpose
POST /mcpSend JSON-RPC messages (initialize or call tools)

Authentication

Every request must include the x-api-key header with a valid API key. API keys are created in Settings > API Keys and are scoped to a workspace (and optionally to a single company).

HeaderRequiredDescription
x-api-keyAlwaysYour API key (format: bsk_...). Determines workspace and company scope.

How it works

The server is fully stateless. Each POST /mcp request:

  1. Validates the API key and extracts the workspace/company scope.
  2. Builds a fresh MCP server with all available tools.
  3. Handles the JSON-RPC message and returns the response.

There are no sessions to manage, no SSE streams, and no cleanup required. This makes it compatible with horizontally-scaled deployments and simple to integrate.

Available tools

Projects

ToolDescriptionParameters
list_projectsList all projects in the workspacestatus? (in_progress, completed, invoiced)
get_projectGet full project details by IDprojectId (UUID)
create_projectCreate a new projectname (string), plus optional: clientId, companyId, description, startDate, endDate, budget, estimatedHours, notes, currency
update_projectUpdate project fieldsprojectId (UUID), plus optional: name, description, status, startDate, endDate, budget, estimatedHours, notes, taskPrefix
update_project_statusChange project statusprojectId (UUID), status (in_progress, completed, invoiced)

Tasks

ToolDescriptionParameters
list_tasksList top-level tasks (includes childTaskCount for each)projectId? (UUID, filter by project)
get_taskGet full task details including subtasks, comments, and assigneestaskId (UUID)
create_taskCreate a new top-level tasktitle (string), plus optional: description, status, priority, estimatedHours, dueDate, projectId, assigneeIds
create_subtaskCreate a subtask under a parent task (inherits project, max 1 level)parentTaskId (UUID), title (string), plus optional: description, status, priority, estimatedHours, dueDate, assigneeIds, isPrivate
list_subtasksList all subtasks of a parent taskparentTaskId (UUID)
update_taskUpdate task fields (works for both tasks and subtasks)taskId (UUID), plus optional: title, description, status, priority, estimatedHours, actualHours, dueDate, sortOrder, projectId, assigneeIds, isPrivate
update_task_statusChange task status (works for both tasks and subtasks)taskId (UUID), status (todo, in_progress, done)

Clients

ToolDescriptionParameters
create_clientCreate a new clientcompanyName (string), plus optional: firstName, lastName, email, phone, vatNumber, address, postalCode, city, country, companyId

Offers

ToolDescriptionParameters
create_offerCreate a new offer/quoteOptional: subject, description, clientId, companyId, offerDate, validUntil, currency, notes

Invoices

ToolDescriptionParameters
create_invoiceCreate a new invoiceOptional: clientId, companyId, projectId, subject, description, invoiceDate, dueDate, currency, notes, paymentMethod

Ideas

ToolDescriptionParameters
create_ideaCreate a new idea/proposaltitle (string), plus optional: description, estimatedBudget, currency, priority, notes, companyId, clientId

Contacts

ToolDescriptionParameters
create_contactCreate a new business contactOptional: companyName, contactName, email, phone, website, address, city, country, source, status, notes, nextFollowUp

Recordings

ToolDescriptionParameters
list_recordingsList the most recent audio recordings for the current userlimit? (number, default 10, max 10)
get_recordingGet one recording with summary, action items, notes, and transcriptionrecordingId (UUID)

Time Logs

ToolDescriptionParameters
list_time_logsList the current user's time logsstartDate? (YYYY-MM-DD), endDate? (YYYY-MM-DD)
create_time_logCreate a new time log for the current userdate (YYYY-MM-DD), startTime (HH:MM), endTime (HH:MM), taskId (UUID), plus optional: description, isBillable, hourlyRate
update_time_logUpdate an existing time logtimeLogId (UUID), plus optional: date, startTime, endTime, description, taskId, isBillable, hourlyRate
delete_time_logDelete an existing time logtimeLogId (UUID)

Appointments

ToolDescriptionParameters
list_calendarsList calendars available to the current userNone
list_appointmentsList the current user's appointmentsstartDate? (YYYY-MM-DD), endDate? (YYYY-MM-DD)
create_appointmentCreate a new appointment in the current workspacedate (YYYY-MM-DD), startTime (HH:MM), endTime (HH:MM), plus optional: title, clientName, clientEmail, clientPhone, isAllDay, location (studio, online, home), address, onlinePlatform, onlineLink, notes, status, projectId
update_appointmentUpdate an existing appointmentappointmentId (UUID), plus optional: title, clientName, clientEmail, date, startTime, endTime, isAllDay, location, address, onlinePlatform, onlineLink, notes, status, projectId
info

The create_task, create_subtask, create_offer, create_idea, list_recordings, get_recording, list_time_logs, create_time_log, update_time_log, delete_time_log, list_calendars, list_appointments, create_appointment, and update_appointment tools require user context and are only available when called internally by the AI Copilot. They are not available via external API keys.

Quick example

Initialize the connection and list all in-progress projects in a single request flow:

// POST /mcp
// Headers: x-api-key: bsk_your_api_key_here

{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26",
"capabilities": {},
"clientInfo": {
"name": "my-client",
"version": "1.0.0"
}
}
}

Then call a tool (same endpoint, same header):

// POST /mcp
// Headers: x-api-key: bsk_your_api_key_here

{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "list_projects",
"arguments": {
"status": "in_progress"
}
}
}

The server responds with a JSON array of project summaries (id, name, status, budget, client, etc.).

Security

  • Workspace isolation -- The API key determines which workspace data is accessible. Tools can only read/write data within that workspace.
  • Company scoping -- If the API key is scoped to a specific company, tools will only return and accept modifications to data belonging to that company.
  • Key rotation -- API keys can be revoked at any time from Settings. Create new keys and revoke old ones to rotate credentials.