MCP

Model Context Protocol

Connect Claude, ChatGPT, Cursor or any MCP client to Pixelbase and let it work in your business — customers, orders, catalog, staff and the ledger — with exactly the permissions you give it.

The Model Context Protocol is how an AI assistant connects to a system it wasn't built with. Point Claude, ChatGPT, Cursor or any other MCP client at the endpoint below, sign in when it asks, and it can read and work in your companies as part of a conversation — no copy-paste, no export.

https://www.pxb.app/mcp

It reads, and it can change what you let it. list_* tools and get_api_resource read. The rest — create_customer, send_invoice_email, void_invoice — change real data as you, and an assistant only sees them for the permissions you gave it. Writes that delete, void or archive are marked so your client asks you before running them.

Some things it can't do at all, whatever you grant: move money out of the company, change the card Pixelbase bills, buy a domain, add a billed location or mailbox, hire an AI agent, invite someone into the company, change who can reach the API, send a campaign to a whole audience, or file a legal entity. Those happen in the console, where you can see what you're agreeing to.

You decide what it can reach. Connecting an assistant opens a Pixelbase page where you choose which of your companies it may reach and how much it may do there: Read-only (it can look things up, nothing more), Can make changes (it can also create, update and send — only what you can do yourself, and never the sensitive things like access, billing or money out), or Custom, which opens the full list of permissions to pick from. It starts on Read-only, and you're only ever offered what you hold at that company. The server builds its tool list from that, so an assistant you gave customers alone is never even shown the ledger. If it later needs more, it asks you for exactly that — you don't have to hunt for settings.

Three things worth knowing before you connect:

  • Calls act as you, and your own per-location access applies on top of what you granted. Lose a permission and the assistant loses it with you; leave a company and it can no longer reach that company at all.
  • Your company decides whether assistants may connect at all: an admin can turn it off for everyone, and every connection to that company stops.
  • Change what an assistant can do, or disconnect it, under Dev Tools → MCP. Changes apply on its next request.
  • Every tool call is a public API request, so it counts toward your API usage and rate limit like any other.

Quick start

Add the server, then authenticate. Your browser opens on Pixelbase to choose which of your companies the assistant may reach and what it may do in each.

bash
claude mcp add --transport http pxb https://www.pxb.app/mcp
# then /mcp → pxb → Authenticate

Claude.ai, Cursor and other clients are on Connect an assistant.

What an assistant can read

One tool per collection, and each one appears only when you granted its scope. This table is generated from the same registry the server builds its tools from, so it can't fall out of step.

ToolReturnsScopeLocation
list_agentsThe AI agents the company has hired, one per role at most. `minutesAccrued` is what each has worked this cycle.agents:read—
list_appointmentsBooked appointments at one location — who is coming, for which service, and when.appointments:readRequired
list_appointment_availabilityThe weekly windows a location accepts appointments in. Read this before reasoning about whether a time is bookable.appointments:readRequired
list_appointment_servicesThe services a location can be booked for, with their duration and price.appointments:readRequired
list_audit_logsThe security audit trail: who did what in this company and when. Reach for it to answer "who changed this" rather than to read the records themselves.security:read—
list_benefitsThe benefits the company offers — the catalog, not who is enrolled. `_count.employeeBenefits` says how many people are enrolled in each.hr:read—
list_blog_postsPosts on a location's public blog. An unpublished post is a draft and is not live on the site.blog:readRequired
list_build_deploymentsRecent Vercel deployments of the platform and portals projects, newest first — every branch push, not only Builder’s. `state` is Vercel’s lifecycle word (BUILDING, READY, ERROR…); a still-building row has `buildingAt` and no `durationMs`. Pixelbase engineers only.builder:engineer—
list_build_sessionsBuilder sessions — one agent working one change to the Pixelbase repository, usually from a ticket. `progress` says what it is doing in words (`phrase`) and whether the next move is yours (`awaitingReply`); `deployment` is the branch’s preview build with `elapsedMs` ticking while it builds; `pullRequests` carry state and checks health. Engineers see every session, everyone else their own and the bot’s; pass `ticketId` to get_api_resource on build-sessions to see a ticket’s whatever its owner. Read the transcript at build-sessions/<id>/messages.builder:read—
list_calendar_eventsWhat is on the company's calendar — meetings, reviews and time blocks, with who was invited and whether they accepted. A recurring event is one record carrying its rule, not one per occurrence.calendar:read—
list_call_scriptsThe branching scripts reps follow on a call at one location. `_count.runs` says how often each has actually been used.call-scripts:readRequired
list_campaignsMarketing sends — one message written once and sent to an audience of a location's customers. `status` says where it is between drafted and sent; an SMS one also waits on a carrier registration.campaigns:readRequired
list_conversationsThe channels, DMs and group chats this token's employee belongs to. Membership is the access rule, so this is their inbox rather than the company's — a channel they are not in is simply absent. Each row carries the person's own read state: `unreadCount` (what the Threads badge shows; thread replies included), `markedUnread`, `lastReadAt`, `unreadThreadCount` (threads with replies they have not opened), `isMuted`, `isFavorite`. Pass unread=true for what needs catching up on (muted conversations never count), and type, favorite or isArchived to narrow. Read one with get_conversation, its messages with list_conversation_messages, and send with send_conversation_message.threads:read—
list_customersA location's customers — the people it sells to or serves. This is the CRM record: name, contact details, and status.customers:readRequired
list_customer_custom_fieldsThe extra fields this location defines on its customers. Read it to interpret custom values on a customer record.customer:custom-fields:readRequired
list_departmentsHow the company divides its staff — the departments employees belong to.company-structure:read—
list_dealsPotential sales moving through a location's pipeline — the cards on the kanban board. `value` is cents. Read `get_api_resource` on pipelines first if you need the stage ids.deals:readRequired
list_domainsDomain names the company has registered or connected, and whether email runs on each.domains:read—
list_email_addressesCompany mailboxes — the addresses staff send and receive from.email:addresses:read—
list_emailsMail in the person's own mailboxes — sent to or from an address assigned to them, and nothing else; the result names the mailboxes it searched, so pass `mailbox` to pick one (support@, say) and check `searchedMailboxes` when a page is empty. Rows are summaries: who it is between, the subject, a ~300-character `snippet`, `unread`, `direction`, `threadId`. `includeText` adds the body; HTML and raw headers never come in a list. Read one message in full with get_email, or a whole back-and-forth with get_email_thread.email:messages:read—
list_email_draftsMail written but not sent, held in the person's Drafts. This is how an assistant writes mail: create_email_draft proposes it, the person reads it (here or in the console), and only send_email_draft — a step marked as reaching outside the company — puts it in somebody's inbox. A draft can be changed any number of times first.email:messages:read—
list_email_foldersWhere mail is filed and where it arrives: the four system folders (inbox, archive, junk, trash — pass the id back as `folder` on list_emails), the company's custom folders, and `mailboxes`, the addresses assigned to this person with how much is unread in each. A mailbox missing here is one nobody has assigned them.email:messages:read—
list_employeesThe people who work for the company, with their status and role. Not customers — those are `list_customers`.employees:read—
list_employee_invitationsOutstanding invitations to join the company as an employee.employee:invitations:read—
list_employee_onboardingsWhere each new hire has got to in onboarding.employee:onboardings:read—
list_gallery_photosPhotos published on a location's public page.gallery:readRequired
list_invoicesInvoices the company has issued to its customers, with what each is for and whether it has been paid. `dueNowAmount` is the deposit collected on the first visit to the pay link. Not what the company owes — that is `list_payables`.invoices:read—
list_ip_whitelist_entriesThe IP addresses allowed to reach this company on the API. Whether the list is enforced at all is the `enabled` flag beside it, not whether it is empty.security:read—
list_job_titlesThe job titles the company defines, which employees are assigned to.company-structure:read—
list_leadsProspects a location has contact details for but no relationship with yet. A lead with an `accountId` has already become a customer; the customer record is the one to read from then on.leads:readRequired
list_legal_entitiesThe registered companies behind the business — LLCs and corporations, with their address state and EIN status. A company has at most one.settings:read—
list_location_hoursOne location's opening times for the week.location:hours:readRequired
list_locationsThe places the company operates from. Call this first: every location-scoped tool needs one of these ids.locations:read—
list_meeting_recordingsRecordings of meetings the token can reach, newest first. They live with the video provider rather than in the database, so this is a slower read than most.meetings:read—
list_meeting_roomsVideo meeting rooms — scheduled or recurring — with who is invited and where each stands. A HUDDLE room is a one-off call started from a conversation rather than a scheduled meeting.meetings:read—
list_milestonesA themed body of work inside one project, and the level the roadmap is plotted at. Read this to name the theme a ticket belongs to; a ticket can also sit outside every milestone.projects:read—
list_newsletter_subscriptionsPeople who subscribed to the company newsletter.newsletter:subscriptions:readRequired
list_notificationsWhat the platform has flagged for this person, their company and the locations they reach — the dashboard's notifications. `unread` means nobody has handled it yet. `source.kind` says which part of the product raised it (support, thread, task, order…), `source.link` opens it, and `audience` says who it was raised for. Pass `unread=true` for what still needs doing, `type` for one kind.notifications:read—
list_ordersSales orders placed at a location — what was bought, by whom, and what it came to.orders:readRequired
list_payment_methodsThe cards on file that Pixelbase bills this company on. Not the customer payment methods behind an order — those live on the order.billing:read—
list_payablesBills the company still owes — expenses and deductions that have not settled. Reach for it to answer what is going out, and by when.payables:read—
list_payoutsMoney moved out of a legal entity's Stripe balance to its bank account. Needs a `legalEntityId`: a payout only means something against the account it left.payouts:read—
list_performance_reviewsPerformance reviews, kept as history so somebody's progress can be read across review dates. A DRAFT has not been shared with the person it is about.hr:read—
list_productsWhat a location sells: its catalog, with prices and stock.products:readRequired
list_projectsThe containers the company's work is filed in — one per initiative, client, release or season. A project holds its own tickets, milestones and goals; its `key` prefixes every ticket id in it (APOLLO-14). The work itself is `tickets`.projects:read—
list_ticketsThe company's tracked work — what is planned, who it sits with, and where it has got to. There is one level of it: a ticket's breakdown is a checklist on the record (`subtaskCount`), not more tickets. One with a null `goalId` is in its project's backlog. Use it to answer what someone is working on or what is overdue.projects:read—
list_project_labelsEach project's own tag vocabulary. Every label names its `projectId`; pass one to list a single project's. Read it to interpret the labels on a ticket.projects:read—
list_qa_checksQuality line checks — the periodic measurements taken on a production line. `status` is computed against the shift session's spec, so OUT_OF_TOLERANCE means the spec said so. Anything beyond weight and volume — counts, readings, pass/fail tests — is the plant's own, and hangs off the check rather than sitting on it.quality:checks:readRequired
list_qa_corrective_actionsWhat was done about a quality problem: the issue, the suspected cause, the action taken, and whether it is closed. `category` is what the Pareto of recurring failure modes counts.quality:actions:readRequired
list_qa_shift_sessionsOne run of one production line against one product spec — the thing every line check hangs off. A SIGNED_OFF session takes no more checks.quality:checks:readRequired
list_qa_specsProduct specifications: the target weight and volume and the tolerance bands a line check is judged against. Read one before interpreting a check.quality:specs:readRequired
list_shiftsThe planned work schedule: who is covering a location, and when. Not hours actually worked — that is `list_time_clock_entries`.schedule:read—
list_support_conversationsEvery customer company's Support channel — the line between them and Pixelbase — for the support rota. `status` is whose turn it is, read off the last message: `awaiting-reply` means a customer spoke last and we owe them, `awaiting-customer` means we spoke last, `quiet` means nobody has yet, `closed` means archived. Pass `status=awaiting-reply` for the queue. Read one with get_support_conversation, which returns every message marked ours or theirs. Pixelbase staff only.internal:support:read—
list_tax_filingsTax returns the company has prepared, and how far each has got — drafted, reviewed, filed, accepted. One per legal entity, year and form type.taxes:read—
list_time_clock_entriesHours actually worked: clock-in and clock-out records. An entry with a null `clockOutAt` is somebody currently on the clock.hr:read—
list_time_off_requestsWho is away and when, plus what is still waiting on a decision. A request with a `startsAt` covers only that window (in its `timezone`) rather than whole days. A request with a null `reviewedById` but an APPROVED status was auto-approved — the requester has no manager to wait on.hr:read—
list_vault_credentialsStored passwords, cards, API keys and notes — metadata only. The secret itself is never in a list; fetch one by id to reveal it, which is audited.vault:admin—
list_vault_documentsFiles, folders, documents and spreadsheets in the company Vault. What comes back is filtered per item — a folder mirroring a Threads channel is visible only to its members — so a count here is what this token may actually open.vault:admin—
list_vault_foldersEvery Vault folder the token can reach, flat — assemble the tree from `parentId`. `systemType` marks the folders the platform manages itself.vault:admin—
list_transactionsMoney in and out — the ledger. Each record carries an amount in cents, a type, a status, and its IRS category.transactions:read—
list_unread_threadsThreads this token’s employee follows that have replies they have not read — the Threads Catch-up list, most recent reply first, across every conversation they are in (muted and archived ones never appear). Each row is the thread’s root message with its `conversationId`, `replyCount`, `lastReplyAt` and `unreadReplyCount`. Read one with get_message_thread, and clear it with mark_thread_read.threads:read—
get_build_sessionBuilder sessions — one agent working one change to the Pixelbase repository, usually from a ticket. `progress` says what it is doing in words (`phrase`) and whether the next move is yours (`awaitingReply`); `deployment` is the branch’s preview build with `elapsedMs` ticking while it builds; `pullRequests` carry state and checks health. Engineers see every session, everyone else their own and the bot’s; pass `ticketId` to get_api_resource on build-sessions to see a ticket’s whatever its owner. Read the transcript at build-sessions/<id>/messages.builder:read—
get_conversationThe channels, DMs and group chats this token's employee belongs to. Membership is the access rule, so this is their inbox rather than the company's — a channel they are not in is simply absent. Each row carries the person's own read state: `unreadCount` (what the Threads badge shows; thread replies included), `markedUnread`, `lastReadAt`, `unreadThreadCount` (threads with replies they have not opened), `isMuted`, `isFavorite`. Pass unread=true for what needs catching up on (muted conversations never count), and type, favorite or isArchived to narrow. Read one with get_conversation, its messages with list_conversation_messages, and send with send_conversation_message.threads:read—
get_emailMail in the person's own mailboxes — sent to or from an address assigned to them, and nothing else; the result names the mailboxes it searched, so pass `mailbox` to pick one (support@, say) and check `searchedMailboxes` when a page is empty. Rows are summaries: who it is between, the subject, a ~300-character `snippet`, `unread`, `direction`, `threadId`. `includeText` adds the body; HTML and raw headers never come in a list. Read one message in full with get_email, or a whole back-and-forth with get_email_thread.email:messages:read—
get_email_draftMail written but not sent, held in the person's Drafts. This is how an assistant writes mail: create_email_draft proposes it, the person reads it (here or in the console), and only send_email_draft — a step marked as reaching outside the company — puts it in somebody's inbox. A draft can be changed any number of times first.email:messages:read—
get_email_threadOne back-and-forth in full, oldest first, each message as text: who spoke last (`lastDirection`) says whose turn it is.email:messages:read—
get_ticketThe company's tracked work — what is planned, who it sits with, and where it has got to. There is one level of it: a ticket's breakdown is a checklist on the record (`subtaskCount`), not more tickets. One with a null `goalId` is in its project's backlog. Use it to answer what someone is working on or what is overdue.projects:read—
get_support_conversationEvery customer company's Support channel — the line between them and Pixelbase — for the support rota. `status` is whose turn it is, read off the last message: `awaiting-reply` means a customer spoke last and we owe them, `awaiting-customer` means we spoke last, `quiet` means nobody has yet, `closed` means archived. Pass `status=awaiting-reply` for the queue. Read one with get_support_conversation, which returns every message marked ours or theirs. Pixelbase staff only.internal:support:read—
list_ticket_commentsThe discussion on one ticket, oldest first — the thread a person would read before replying. Mentions are inline as <@employeeId>, and mentionedEmployeeIds repeats them. Attachment urls are short-lived: read them now rather than keeping them. ticketId is the ticket’s id from list_tickets or get_ticket, not its APOLLO-14 key. To reply, comment_on_ticket.projects:read—
list_conversation_messagesA conversation’s top-level messages — a channel’s, a DM’s or a group’s. Newest first by default; pass before=<nextCursor> to go further back. To read forward from what this person has not seen, pass unreadOnly=true (starts after their own lastReadAt) or after=<messageId>; those come back oldest first, with nextCursor to hand back as after. Thread replies are not included: a message with replyCount above zero has them (read with get_message_thread), and its unreadReplyCount says how many are new to this person. Reading does not mark anything read — mark_conversation_read does.threads:read—
get_message_threadOne thread: the root message and its replies, oldest first, with when this person last read it (lastReadAt). messageId is the root’s id — a top-level message from list_conversation_messages or list_unread_threads — and the conversation must be the one it belongs to. Reading does not mark it read — mark_thread_read does. To reply in it, send_conversation_message with parentMessageId set to the root’s id.threads:read—

Plus whoami, which reports the companies and what each allows, and get_api_resource, which reads a single record or any API path without a tool of its own.

What an assistant can change

One tool per write the API implements, each listed only where you granted its scope. Destructive ones are marked so your client asks before running them. Generated from the same registry as the server's catalog.

ToolDoesScope
update_appointment_statusUpdate appointment statusappointments:write
create_appointment_availabilityCreate availability windowappointments:write
delete_appointment_availabilitydestructiveDelete availability windowappointments:write
create_appointment_serviceCreate appointment serviceappointments:write
update_appointment_serviceUpdate appointment serviceappointments:write
delete_appointment_servicedestructiveDelete appointment serviceappointments:write
create_benefitCreate a benefithr:write
update_benefitUpdate a benefithr:write
delete_benefitdestructiveDelete a benefithr:write
create_blog_postCreate a blog postblog:write
update_blog_postUpdate a blog postblog:write
delete_blog_postdestructiveDelete a blog postblog:write
create_build_sessionStart a build sessionbuilder:write
delete_build_sessiondestructiveDelete a build sessionbuilder:engineer
message_build_sessionMessage the agentbuilder:write
interrupt_build_sessionStop the agentbuilder:write
retry_build_session_startRetry starting the agentbuilder:write
archive_build_sessiondestructiveArchive a build sessionbuilder:write
reopen_build_sessionReopen an archived sessionbuilder:engineer
approve_build_session_planApprove the planbuilder:write
set_build_session_auto_modeSet auto modebuilder:write
create_calendar_eventCreate a calendar eventcalendar:write
update_calendar_eventUpdate a calendar eventcalendar:write
delete_calendar_eventdestructiveDelete a calendar eventcalendar:write
rsvp_calendar_eventAnswer a calendar invitationcalendar:write
create_call_scriptCreate a call scriptcall-scripts:write
update_call_scriptUpdate a call scriptcall-scripts:write
delete_call_scriptdestructiveDelete a call scriptcall-scripts:write
create_campaignCreate a campaigncampaigns:write
update_campaignUpdate a campaigncampaigns:write
delete_campaigndestructiveDelete a campaigncampaigns:write
update_company_settingsUpdate company settingssettings:write
submit_contact_inquirySend the Pixelbase team a requestinquiries:write
send_conversation_messageSend a messagethreads:write
mark_conversation_readMark a conversation readthreads:write
mark_conversation_unreadMark a conversation unreadthreads:write
mark_thread_readMark a thread readthreads:write
create_customerCreate a customercustomers:write
update_customerUpdate a customercustomers:write
set_customer_custom_fieldsdestructiveSet customer custom field valuescustomer:custom-fields:write
create_customer_custom_fieldCreate a customer custom fieldcustomer:custom-fields:write
update_customer_custom_fieldUpdate a customer custom fieldcustomer:custom-fields:write
delete_customer_custom_fielddestructiveDelete a customer custom fieldcustomer:custom-fields:write
create_departmentCreate a departmentcompany-structure:write
update_departmentUpdate a departmentcompany-structure:write
delete_departmentdestructiveDelete a departmentcompany-structure:write
create_dealCreate a dealdeals:write
update_dealUpdate a dealdeals:write
delete_dealdestructiveArchive a dealdeals:write
move_dealMove a deal to another stagedeals:write
close_dealdestructiveWin, lose or re-open a dealdeals:write
delete_email_addressdestructiveDelete an email addressemail:addresses:write
update_emailUpdate an emailemail:messages:write
create_email_draftCreate an email draftemail:messages:write
update_email_draftUpdate an email draftemail:messages:write
delete_email_draftdestructiveDelete an email draftemail:messages:write
send_email_draftSend an email draftemail:messages:write
create_email_folderCreate an email folderemail:messages:write
delete_gallery_photodestructiveDelete a gallery photogallery:write
create_invoiceCreate an invoiceinvoices:write
delete_invoicedestructiveDelete an invoiceinvoices:write
void_invoicedestructiveVoid an invoiceinvoices:write
send_invoice_emailEmail an invoiceinvoices:write
create_job_titleCreate a job titlecompany-structure:write
update_job_titleUpdate a job titlecompany-structure:write
delete_job_titledestructiveDelete a job titlecompany-structure:write
create_leadCreate a leadleads:write
update_leadUpdate a leadleads:write
delete_leaddestructiveDelete a leadleads:write
convert_leadConvert a lead to a customerleads:write
set_location_hoursdestructiveUpdate location hourslocation:hours:write
update_locationUpdate a locationlocations:write
archive_locationdestructiveArchive a locationlocations:admin
create_meeting_roomCreate a meeting roommeetings:write
update_meeting_roomUpdate a meeting roommeetings:write
delete_meeting_roomdestructiveDelete a meeting roommeetings:write
create_milestoneCreate a milestoneprojects:write
update_milestoneUpdate a milestoneprojects:write
delete_milestonedestructiveDelete a milestoneprojects:admin
delete_newsletter_subscriptiondestructiveRemove a newsletter subscriptionnewsletter:subscriptions:write
handle_notificationMark notification as handlednotifications:write
update_notification_preferencesUpdate notification preferencesnotifications:write
create_performance_reviewWrite a performance reviewhr:write
create_productCreate a productproducts:write
update_productUpdate a productproducts:write
delete_productdestructiveDelete a productproducts:write
create_projectCreate a projectprojects:admin
update_projectUpdate a projectprojects:admin
delete_projectdestructiveDelete a projectprojects:admin
create_ticketCreate a ticketprojects:write
update_ticketUpdate a ticketprojects:write
delete_ticketdestructiveDelete a ticketprojects:admin
comment_on_ticketComment on a ticketprojects:write
create_project_labelCreate a project labelprojects:admin
delete_project_labeldestructiveDelete a project labelprojects:admin
create_qa_checkRecord a QA line checkquality:checks:write
create_qa_corrective_actionOpen or update a corrective actionquality:actions:write
create_qa_specCreate or update a QA product specquality:specs:write
create_shiftCreate a shiftschedule:write
update_shiftUpdate a shiftschedule:write
delete_shiftdestructiveDelete a shiftschedule:write
update_tax_filingUpdate a tax filingtaxes:write
create_time_clock_entryClock inhr:write
clock_out_time_clock_entryClock outhr:write
create_time_off_requestRequest time offhr:write
review_time_off_requestApprove or deny time offhr:write
cancel_time_off_requestdestructiveWithdraw a time-off requesthr:write
create_vault_documentCreate a Vault document or foldervault:admin
update_vault_documentUpdate a Vault documentvault:admin
delete_vault_documentdestructiveArchive or delete a Vault documentvault:admin
create_transactionRecord a transactiontransactions:write
update_transactionUpdate a transactiontransactions:write
delete_transactiondestructiveVoid a transactiontransactions:admin
mark_transaction_paidMark a transaction paidtransactions:write

Never offered, whatever you grant — these happen in the console:

  • email.create — sends an email with no draft for the person to read first
  • payout.create — moves money out of the company
  • payment-method.set-default — changes the card Pixelbase bills
  • domain.create — buys a domain
  • location.create — adds a monthly location fee
  • email-address.create — adds a billed mailbox
  • agent.create — hires an agent that bills by the hour
  • agent.update — changes an agent’s billed hours
  • agent.delete — removes a hired agent
  • ip-whitelist.create — changes who can reach the API
  • ip-whitelist.delete — changes who can reach the API
  • employee-invitation.create — invites somebody into the company
  • employee-invitation.delete — withdraws an invitation
  • campaign.send — messages a whole audience of customers
  • legal-entity.create — files a legal entity
  • legal-entity.amend — amends a legal filing

Topics

For agents

The whole reference as one document, so an agent can read it in a single fetch.

bash
curl https://www.pxb.app/docs/mcp/docs.md
curl https://www.pxb.app/docs/mcp/docs.json