MCP Server
Connect Claude, ChatGPT, Cursor, VS Code, or any MCP client directly to your workspace.
This is the strategic way to use Sois: bring your own agent. Your Sois AI workspace is a full MCP server, so the AI agent you already use connects and reasons over your workspace tools directly. Increasingly, people never log into the Sois console at all. They tell their own Claude, ChatGPT, Cursor or Gemini what they need, and it operates Sois on their behalf over MCP. The console becomes a place to view and manage agent activity, not the primary way work gets done.
Any client that speaks the Model Context Protocol can connect and use your workspace tools: search contacts, create tasks, send emails, manage documents, and more, without writing a single integration. Because your own agent does the reasoning, Sois spends no AI on your behalf.
One endpoint. Standard protocol. Every tool your account is allowed to use, available to any compatible client.
The one URL
Your workspace exposes a single MCP endpoint:
https://<your-workspace>.sois.ai/api/mcp
The server identifies itself with your workspace brand (for example "Acme"), so it shows up under your own name in the client. Everything below hangs off that one URL.
There are two ways to authenticate. OAuth is the recommended path and is what the in-app connectors in Claude and ChatGPT use: you paste the URL, approve once, and there is no token to copy or rotate by hand. A Bearer token plus API key is also supported for scripts, servers, and clients that do not do OAuth.
Option A: OAuth 2.1 (recommended, nothing to paste)
Modern MCP connectors discover and complete the whole sign-in for you. You only provide the URL.
1. In your client (for example Claude or ChatGPT), add a custom connector and paste your MCP URL: https://<your-workspace>.sois.ai/api/mcp
2. The client calls the endpoint with no token and receives a 401 carrying a discovery challenge:
WWW-Authenticate: Bearer resource_metadata="https://<your-workspace>.sois.ai/.well-known/oauth-protected-resource"
3. The client reads that metadata, finds your workspace's authorization server, registers itself automatically (Dynamic Client Registration), and opens the sign-in and consent screen.
4. You approve the connection in your Sois account. The client receives a token over PKCE (with a rotating refresh token) and starts working. No token is ever copied by hand.
Why this is safe. The authorization server is your own workspace domain, so tokens are tenant-scoped and never leave your network. Authorization is your role: a granted token can never do more than you can, because every tool call is permission-checked at execution. The scope strings are coarse on purpose; the real boundary is your per-user permissions.
What the authorization server advertises:
| Property |
Value |
| Authorization endpoint |
/oauth/authorize |
| Token endpoint |
/oauth/token |
| Registration endpoint |
/oauth/register (Dynamic Client Registration) |
| Grant types |
authorization_code, refresh_token |
| PKCE |
required (S256) |
| Scopes |
mcp, mcp:read, mcp:write, offline_access |
You do not normally call these yourself; a compliant MCP client walks the flow automatically once it has the URL.
Option B: Bearer token + API key (direct or server-side)
For scripts, servers, or any client that does not implement OAuth. You generate two credentials and send them as headers on every request.
1. Open Settings > Connect your Agent in your Sois AI workspace.
2. Choose your client (Claude Desktop, Cursor, VS Code, or Generic) and click Generate Credentials to get a Bearer token, an API key, and a ready-made config snippet.
3. Paste the config into your client.
{
"mcpServers": {
"sois-workspace": {
"url": "https://<your-workspace>.sois.ai/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_TOKEN",
"X-Api-Key": "YOUR_API_KEY"
}
}
}
}
Cursor uses the same shape in .cursor/mcp.json; VS Code nests it under "mcp": { "servers": { ... } } with "type": "http".
| Header |
Value |
Purpose |
Authorization |
Bearer <token> |
Identity (Sanctum token, 90-day expiry) |
X-Api-Key |
sois_... |
Budget and usage tracking |
Two credentials because identity and spend are separate: a token proves who you are, the key controls and meters cost, and either one alone is useless. (OAuth tokens carry their authorization differently, so a connector on Option A does not need the X-Api-Key header.)
Generate the pair programmatically when you are automating onboarding:
curl -X POST "https://<your-workspace>.sois.ai/api/mcp/quick-setup" \
-H "Authorization: Bearer YOUR_EXISTING_TOKEN" \
-H "Content-Type: application/json" \
-d '{"client": "generic"}'
Discovery endpoints
A client can learn everything it needs from three public documents at your workspace root:
| Endpoint |
Purpose |
/.well-known/mcp.json |
Server card: name, version, protocol version, and the OAuth metadata locations |
/.well-known/oauth-protected-resource |
RFC 9728: which authorization server protects this resource |
/.well-known/oauth-authorization-server |
RFC 8414: the authorize, token, and registration endpoints, grants, and PKCE method |
The server card reports authentication.type as oauth2 and links to the two OAuth documents, which is how a connector knows to start the flow in Option A.
Protocol details
The endpoint speaks Streamable HTTP with JSON-RPC 2.0 (spec version 2025-06-18).
Session lifecycle
| Step |
Request |
Notes |
| Initialize |
POST /api/mcp method initialize |
Negotiates capabilities; the response carries an Mcp-Session-Id header |
| List tools |
POST /api/mcp method tools/list |
Returns every tool your account is allowed to use |
| Call a tool |
POST /api/mcp method tools/call |
params.name + params.arguments |
| Keep-alive |
GET /api/mcp with Mcp-Session-Id |
Opens an SSE stream for server-to-client messages |
| Teardown |
DELETE /api/mcp with Mcp-Session-Id |
Ends the session |
Include the Mcp-Session-Id from the initialize response on every later request.
Supported methods
| Method |
Description |
initialize |
Start a session, negotiate capabilities |
ping |
Health check |
tools/list |
List available tools with schemas |
tools/call |
Execute a tool by name with arguments |
notifications/initialized |
Client confirms initialization (no response) |
notifications/cancelled |
Client cancels a pending request (no response) |
What tools are available
tools/list returns everything your account can do inside Sois AI, filtered to your permissions:
- Contacts: search, create, update, summarise
- Tasks: create, assign, update status, search
- Calendar: list, create, update events, check availability
- Documents: search, create, update content
- Files: browse, upload, download
- Inbox: read, compose, send
- Departments and team: list and manage (admin)
- Installed apps: every tool added by the extensions you have installed (CRM, invoicing, warehouse, custom entities, and so on)
The exact list depends on the authenticated user's role and installed apps. Tools are permission-filtered and fail closed, so a connection can never call something the user is not allowed to use.
Full tool reference
Generated from the live tool definitions, so it never drifts from what tools/list returns. 622 tools across 47 areas. Your own connection shows a subset: tools are filtered by your role and by which apps you have installed.
Apps built for a single customer add their own tools. Those are documented inside that workspace, on Settings → Connect your Agent, not here.
Accounting (44)
| Tool |
What it does |
addCorporateEvent |
Set a reminder for a company filing or add an ad hoc corporate deadline. |
applyPurchaseCreditToFinancial |
Apply a purchase credit note reduction against a financial cost line. |
approveInvoice |
Approve and publish an invoice. |
createCharge |
Create a charge (revenue — for sales invoices/quotes) or cost (expense — for purchase invoices). |
createFinancial |
Create a financial allocation record with buy/sell pricing. |
createInvoice |
Create a new invoice (any type). |
createQuote |
Create a new quote for a customer. |
examineCorporateRegister |
Examine the corporate register: answers "anything due for any of my companies?". |
extractPurchaseBillDocument |
Extract an uploaded supplier bill document (PDF, image, scan) into a structured purchase invoice proposal — supplier, invoice number, dates, currency, line items, tax, totals, plus a confidence sco. |
getAccountingSummary |
Examine accounting status: invoice counts by status/type, recent invoices, outstanding amounts, overdue invoices, unclaimed charges/costs summary. |
getAccountingSyncErrors |
List the cloud-accounting documents/contacts that FAILED to sync to the vendor (Xero / QuickBooks / Sage), with the error code, message, and any amount-drift detail — so you can explain WHY a sync . |
getAccountingSyncStatus |
Report the cloud-accounting sync status (Xero / QuickBooks / Sage) for this workspace. |
getCompanyFilings |
List filing deadlines for one registered company: answers "when is X due for company Y?". |
getFinancialsSummary |
Get aggregated financial summary: total revenue, cost, profit, average margin, counts by status. |
getMatchedFinancialLines |
List the financial cost lines matched to a purchase invoice, each with its estimated cost, actual (billed) cost, variance, and resulting profit/margin. |
getSupplierDefaults |
Get a supplier contact's accounting defaults — billing currency, invoice/payment terms, credit facility, outstanding balance, and the is_supplier / is_active flags. |
getUnmatchedInvoiceLines |
List the bill lines on a purchase invoice that are not yet matched to a financial cost line, plus the remaining unmatched amount/tax. |
listBankAccounts |
List all bank accounts configured in tenant settings. |
listFinancials |
List financial allocation records with optional filters. |
listUnclaimedCharges |
List charges (revenue) or costs (expense) not yet claimed by an invoice or quote. |
manageCompanyDomain |
Add, update or remove a domain on a registered company: registrar, renewal date, auto-renew, DNS provider. |
manageInvoice |
Void an invoice, raise a credit note against it, apply a credit note, or add a note. |
manageQuote |
Send, accept, decline, or convert a quote to invoice. |
markFilingComplete |
Mark a corporate filing event as filed (done) or waived (not applicable). |
matchPurchaseInvoiceLineToFinancial |
Match a purchase invoice line to a financial cost line. |
postPurchaseInvoice |
Post a purchase invoice or purchase credit note for payment. |
previewCurrencyConversion |
Preview a currency conversion — the exchange rate and converted amount for an amount in one currency into another, via the accounting FX rates at a given date. |
previewPurchaseInvoiceTotals |
Preview the subtotal, tax total and gross total of draft purchase invoice lines WITHOUT creating anything — plus base-currency equivalents when the currency differs from the tenant base. |
previewTaxBreakdown |
Preview the tax breakdown of draft lines — net and tax aggregated per distinct tax rate — without creating anything. |
reconcilePurchaseInvoiceTotal |
Reconcile a purchase invoice gross total against the total printed on the supplier bill. |
recordPayment |
Record a payment against an invoice. |
registerCompany |
Register a new company on the corporate register. |
retryAccountingSyncs |
Re-queue FAILED cloud-accounting syncs (Xero / QuickBooks / Sage) for another attempt — the user-initiated force-retry. |
searchCandidateFinancials |
List open financial cost lines that are candidates for matching against a supplier bill. |
searchInvoices |
Search invoices by number, reference, contact, amount, status, type, date range. |
searchPurchaseInvoices |
Find supplier bills (purchase invoices and purchase credit notes) by status, supplier, date or amount. |
searchQuotes |
Search quotes by number, reference, contact, amount, status, date range. |
sendInvoice |
Email an invoice to recipients WITH the invoice PDF attached. |
setFilingReminders |
Configure reminder rules for corporate filing deadlines: day offsets before each due date, delivery channels (email via the network sender, in-app notification) and email recipient lists. |
unmatchPurchaseInvoiceLine |
Release a purchase-invoice line from its financial cost line. |
updateInvoice |
Update invoice fields or add/remove/modify lines. |
updateQuote |
Update quote fields or lines. |
updateRegisteredCompany |
Update a registered company on the corporate register: rename, change status (active/dormant/dissolved), set the website, accounting period end, or jurisdiction onboarding answers (e.g. |
validatePurchaseInvoiceProposal |
Validate a purchase-invoice proposal (the structure returned by extract_purchase_bill_document) before turning it into a draft — checks required fields, line-sum vs subtotal, currency shape, and co. |
Agent Web Browser (2)
| Tool |
What it does |
webExtract |
Extract the main text content from a URL. |
webSearch |
Search the web for real-time information. |
Listeners (12)
| Tool |
What it does |
activateListener |
Activate a listener so it starts responding to triggers. |
createListener |
Create a new automation listener. |
disableListener |
Disable a listener permanently until manually re-activated. |
getListener |
Get full details of a specific automation listener including flow schema and run history. |
getListenerHelp |
Get the user-facing help guide for the Listeners feature. |
getListenerRuns |
Get recent execution runs for a listener with status and cost info. |
listListeners |
List all automation listeners for the current user. |
pauseListener |
Pause an active listener temporarily. |
searchEntities |
Fuzzy lookup of a NAMED thing ACROSS BOTH contacts and tasks at once, returning ranked matches (each with its type and a clickable link) and flagging same-name duplicates. |
triggerListener |
Manually trigger a listener to execute its flow immediately. |
updateListener |
Update a listener name, description, trigger type, or trigger config. |
updateListenerFlow |
Update the flow schema (visual flowchart) for a listener. |
Tasks (33)
| Tool |
What it does |
addTaskStep |
Add a new step to a task's kanban board. |
combineFiles |
Combine multiple task output files into a single markdown document. |
copyTaskToNewDraft |
Copy a task to a new draft task with a given name. |
createTask |
Create a new ONE-OFF Agent Task — work the agent does once and finishes (e.g. |
createTaskFromTemplate |
Create a new task from a saved template. |
deleteScheduledTask |
Delete a scheduled task permanently. |
disableScheduledTask |
Disable an active scheduled task so it stops running. |
enableScheduledTask |
Enable a disabled scheduled task so it resumes running on its schedule. |
getScheduledTask |
Get full details of a scheduled task including run history stats, costs (total, last run, average), schedule config, and any errors. |
getScheduledTaskHistory |
Get the last 10 runs of a scheduled task with per-run status and cost breakdown. |
getTask |
Get a task's details and steps. |
getTaskStepDetail |
Get the current step's full details including checklist, links, attachments, and status. |
getTaskSteps |
List all steps on a task's kanban board. |
linkEntityToTaskStep |
Link an entity (contact, document, task, etc) to the current step card. |
listScheduledTasks |
List all scheduled tasks for the current user. |
listTasks |
List tasks with optional status filter. |
moveTaskStepColumn |
Move a task step card to a different column (e.g. |
pauseTask |
Pause a running/queued agent task ("pause that task"). |
removeTaskStep |
Remove a step from a task's kanban board. |
reorderTaskSteps |
Reorder steps on a task board by providing the step IDs in the desired order. |
rerunTask |
Re-run a completed, failed, or cancelled task. |
resumeTask |
Resume a paused or failed agent task ("resume it", "try that task again from where it stopped"). |
revertTaskToDraft |
Revert a task to draft so it can be edited and run again. |
saveTaskAsTemplate |
Save a task as a reusable template. |
shareTask |
Share a task with other team members. |
skipTaskStep |
Toggle whether a task step is skipped. |
startTask |
Start a task running in the background. |
steerTask |
Steer a running agent task with new instructions WITHOUT restarting it ("tell the task to also include X", "focus on GB suppliers only"). |
updateTask |
Update a task's name or objective. |
updateTaskInstructions |
Update instructions for a running task (steering). |
updateTaskStepCard |
Update a task step card's fields (title, description, priority, labels, due_date). |
updateTaskStepChecklist |
Toggle a checklist item on the current step card. |
writeFile |
Save a file to a task's output folder. |
Teams (9)
| Tool |
What it does |
createAgentTeam |
Create a new autonomous AI agent team. |
fireTeamMember |
DESTRUCTIVE: Permanently remove a member from an agent team. |
getAgentTeamStatus |
Get an overview of all agent teams: list of teams with status, budget usage, member count, and active project count. |
getProjectMessages |
Get recent messages/discussion in a team project. |
getTeamProjects |
List all projects for an agent team. |
hireTeamMember |
Add a new AI member to an agent team. |
reassignMemberKits |
Reassign toolkit kits between team members. |
sendTeamPrompt |
Send a prompt/instruction to the team lead. |
updateAgentTeam |
Update an agent team's settings (name, status, budget, methodology). |
Blog (17)
| Tool |
What it does |
clearBlogCache |
Full rebuild — regenerates all published posts, index, RSS, and redeploys entire site. |
createBlogComment |
Create a comment on a blog post. |
createBlogPost |
Create a new blog post as draft. |
deleteBlogPost |
Delete a draft blog post. |
generateBlogContentImage |
Generate an inline image for use inside a blog post's body content. |
generateBlogImage |
Generate a featured header image for a blog post using AI. |
getBlogSummary |
Examine blog status: post counts by status, recent posts, deployment status, blog URL, dev/live mode, comment stats. |
getPostTranslations |
Get the translation status for a blog post — lists available translations and their publish status. |
listBlogCategories |
List all existing blog categories with post counts. |
listBlogComments |
List comments for a specific post or by status across all posts. |
polishBlogPost |
Proofread and polish a blog post — fixes grammar, spelling, punctuation and improves clarity. |
publishBlogPost |
Publish a blog post and deploy to Cloudflare Pages. |
searchBlogPosts |
Search blog posts by title, content, tags, status, or date range. |
shareBlogPost |
Share a published blog post on connected social media channels. |
translateBlogPost |
Translate a blog post into a target language. |
unpublishBlogPost |
Unpublish a blog post — sets status to draft and redeploys site without it. |
updateBlogPost |
Update an existing blog post. |
Agent Browser Tab (5)
| Tool |
What it does |
browserExamine |
Get the current page snapshot with interactive elements and refs. |
browserExtract |
Extract clean, readable text from the current browser page. |
browserInteract |
Perform an action using element refs from the last snapshot. |
browserNavigate |
Navigate to a URL. Creates a session if needed. |
startBrowserSession |
Launch an autonomous Agent Browser session that researches the web and PRODUCES assets (a document/report, tasks, or emails) saved to the session. |
Calendars (8)
| Tool |
What it does |
checkAvailability |
Find free time slots across one or more users in a given date range. |
checkEventRsvpStatus |
Check if attendees have replied to a calendar event invite by scanning the organizer's inbox for RSVP responses. |
createCalendarEvent |
Create a new calendar event. |
getCalendarSummary |
MANDATORY FIRST CALL for any calendar operation. |
manageCalendar |
Create, rename, recolor, share, or delete a personal calendar. |
searchCalendarEvents |
Search events across ALL of the user's calendars by keyword, date range, or attendee. |
sendCalendarInvite |
Send email invitations for a calendar event to specified recipients. |
updateCalendarEvent |
Update an existing calendar event. |
Contacts (25)
| Tool |
What it does |
createContact |
Create a contact (company/person) and open it. |
examineContact |
Get a complete 360° snapshot of ONE contact in a single call — profile, account health, credit check, recent history, upcoming events, and attachments — instead of calling getContact + getContactHe. |
getContact |
Get a contact, including markdown profile. |
getContactAttachments |
List documents and files linked to a contact. |
getContactCreditCheck |
Run a credit check on a contact. |
getContactHealth |
Get the account health data for a contact. |
getContactHistory |
Get the version history for a contact. |
getContactOwnershipHistory |
Show who has held each ownership role (owner / account / sales / operations manager) on a contact, and the date interval they held it. |
getContactUpcomingEvents |
Get upcoming calendar events linked to a contact (via key contacts with user_id or email match). |
linkDocumentToContact |
Attach a document to a contact. |
linkFileToContact |
Attach a file to a contact. |
listContactFiles |
List files stored for a contact. |
listContacts |
List contacts with optional filtering. |
lookupCountry |
Search countries by ISO code, name, currency, or dial code. |
mergeContacts |
Merge two contacts. If conflicts exist, a conflict resolution tab opens for the user to review. |
queryContacts |
Granular structured query for contacts. |
restoreContact |
Restore a recently deleted contact by name ("bring back the contact I just deleted", "restore Acme Ltd"). |
searchContactEmails |
Contact email search: find emails in connected inboxes involving a CONTACT (by the contact's primary email and key contact emails). |
searchContacts |
Search for existing contacts by name, company, email, or any data field (city, country, address, tags, etc.). |
shareContact |
Share a contact with specific team members or with everyone ("share the Acme contact with Sarah"). |
transferContactAccounts |
Reassign a departing team member's entire book of customer accounts to a successor (the "salesperson leaves" handover). |
updateConflictResolution |
Update the resolution choice for a merge conflict field. |
updateContact |
Update contact data. CRITICAL: When the user asks to update a contact from a document, resume, or file context, extract ALL available data and populate every relevant field — email, phone, company,. |
updateContactHealth |
Update account health data for a contact. |
updateKeyContacts |
Add, remove, or replace key contacts (people) on a contact. |
Customer Service (7)
| Tool |
What it does |
addMyTicketComment |
Add a customer-side comment / reply to one of YOUR OWN open customer-service tickets. |
createCustomerServiceTicket |
Open a new support / help ticket with the tenant's customer-service team. |
escalateTicket |
Escalate a customer service ticket to human support when the issue is too complex, requires manual intervention, or the customer needs specialised attention. |
getCustomerServiceOverview |
Get an overview of customer service tickets including counts by status, recent tickets, and unseen response counts. |
getSupportSummary |
Get a summary of support tickets for the current tenant: open count, recent tickets, unseen responses. |
respondToTicket |
Add a response to a customer service ticket as the support team. |
searchTickets |
Search customer service tickets by status, customer name, or subject. |
Deals Pipeline (29)
| Tool |
What it does |
briefDealPipeline |
Brief the deal pipeline — a glanceable summary of deal count, total value, and age by stage. |
controlDealFinder |
Control a deal finder: pause, resume, start, or cancel it. |
controlReachoutCampaign |
Control a Reachout campaign: start, pause, resume or cancel it. |
createDeal |
Create a new deal/prospect in a pipeline. |
createDealFinder |
Create and launch an agentic deal finder that scrapes the web (via Tavily) for businesses matching a STRICT brief, runs each candidate through a confidence harness, and adds only qualifying leads i. |
createPipeline |
Create a new sales pipeline with stages. |
createReachoutCampaign |
Create a Reachout email-outreach campaign that works a slice of the deals pipeline. |
getDeal |
Get a deal by name or ID, including data, key contacts, activity, and pipeline/stage. |
getDealFinder |
Get one deal finder in full — its brief, criteria, live progress, spend, pause reason, candidate counts and the most recent candidates the qualification harness evaluated (with confidence and why e. |
getDealFollowUpsDue |
Get all deals with follow-ups due today or overdue. |
getInboxMessage |
Get the full details of a single email message including its body content (HTML stripped to text for readability), all recipients, attachments list, and contact match info. |
getPipelineOverview |
Get an overview of all pipelines with stage counts, total values, and deal summaries. |
getReachoutCampaign |
Get one Reachout campaign in full — its recipient query, outbox, template, collateral/tool config, counts and spend. |
listDealFinders |
List deal finders — the agentic scrapers that populate the pipeline with qualified deals. |
listDeals |
List deals with optional pipeline/stage filter. |
listReachoutCampaigns |
List Reachout email-outreach campaigns that work the deals pipeline. |
logDealContact |
Log that a prospect was contacted (email sent, call made, meeting held). |
moveDealStage |
Move a deal to a different pipeline stage. |
openDeal |
Open a deal in an app tab. |
openDeals |
Open the deals pipeline view. |
previewReachoutRecipients |
Preview how many deals a recipient query would reach — total matching deals and how many are emailable (have an email). |
replyEmail |
Reply to an email. Preserves the original HTML body as a quoted block and pre-fills the To field with the original sender. |
requestDealInfoEmail |
Call Center → Reachout handoff. |
scheduleDealFollowUp |
Schedule a follow-up for a deal/prospect. |
searchDeals |
Search for deals by name, company, or value. |
searchMail |
Paginated email search. |
sendDraft |
Send an existing email draft immediately. |
shareDeal |
Share a deal with team members or everyone (owner only). |
updateDeal |
Update a deal's data fields (deep-merged). |
Departments (10)
| Tool |
What it does |
addMemberToDepartment |
Add a team member to a department. |
createDepartment |
Create a new department and open it. |
deleteDepartment |
Delete (deactivate) a department. |
getDepartment |
Get full details of a department including members, data, and activity. |
linkContactToDepartment |
Link a contact (company/person) to a department. |
listDepartments |
List all departments in the organisation. |
removeMemberFromDepartment |
Remove a team member from a department. |
searchDepartments |
Search for departments by name. |
unlinkContactFromDepartment |
Remove the link between a contact and a department. |
updateDepartment |
Update a department's name, description, or data fields. |
Agent Dialer (7)
| Tool |
What it does |
endCall |
End an active call by call ID. |
getCallDetail |
Get full call details including transcript, summary, sentiment, follow-up actions, and cost breakdown. |
getDialerSummary |
Examiner tool: Get dialer status overview — recent calls, any active call, credit balance available for calls, and per-minute cost. |
leaveVoicemail |
Leave a voicemail for a team member (or for the current user). |
makeCall |
HIGH RISK — Initiate an AI voice call to a phone number. |
manageDoNotCall |
Add, remove or check a phone number on the do-not-call (DNC) list. |
searchCallLogs |
Search call history by contact, date range, status, or keyword in transcripts. |
Documents (8)
| Tool |
What it does |
createDocument |
Create a new rich-text document. |
createDocumentFolder |
Create a folder in the Documents extension to organise documents. |
deleteDocument |
Soft-delete a document or folder from the Documents extension. |
exportDocumentToPdf |
Export a document to a PDF file with optional company letterhead header, footer text, and page numbers. |
getDocument |
Read a document's full content, metadata, and activity log by ID. |
listDocuments |
List documents and folders at a given level in the Documents extension. |
moveDocument |
Move a document or folder to a different parent folder in the Documents extension. |
updateDocument |
Update a document's name or content. |
Events (19)
| Tool |
What it does |
addEventAttendee |
Add an attendee to an event. |
addEventSession |
Add a session/agenda item to an event (talk, panel, break, workshop, etc). |
addEventSupplier |
Link a contact as a supplier/vendor to an event with role and contract details. |
analyzeEventBudget |
Analyse an event budget and suggest how to spread costs to stay within it. |
commitAttendeeImport |
Commit a validated attendee import to the event. |
createEvent |
Create a new event. Auto-assigns to default pipeline and first stage if not specified. |
createEventPipeline |
Create a new event pipeline with customisable stages. |
getEvent |
Get full event details by ID including data, key_contacts, activity, attendees, sessions, suppliers, and pipeline/stage info. |
getEventBudgetSummary |
Get the granular budget breakdown for an event: total budget vs spend, the split across travel/food/accommodation/other (each vs its allocation), per-traveller allowance and its % of budget, and re. |
getEventPlanningOverview |
Examiner tool: Get a summary of all event pipelines with stage counts, event distribution, upcoming events, and budget totals. |
listEventAttendees |
List attendees for an event with optional role/RSVP filters. |
listEvents |
List events with optional pipeline/stage/type filters. |
moveEventStage |
Move an event to a different pipeline stage. |
openEvent |
Open an event in a new tab for the user to view/edit. |
openEvents |
Open the Events pipeline view in the UI. |
searchEvents |
Search events by name, type, venue, or description. |
updateEvent |
Update event data (deep-merge into data JSON). |
updateEventAttendee |
Update an event attendee (RSVP status, role, travel details, etc). |
validateAttendeeImport |
Crunch a raw attendee list (pasted text or CSV) and VALIDATE it WITHOUT writing anything. |
Expedia (11)
| Tool |
What it does |
getExpediaActivityOffers |
Get available time slots and offers for a specific Expedia activity. |
getExpediaPropertyDetails |
Get full content for an Expedia property: photos, amenities, descriptions, ratings. |
getExpediaSummary |
Get an overview of all saved Expedia items: properties, activities, cars, and flights. |
saveExpediaActivity |
Save an Expedia activity from the most recent search results. |
saveExpediaCar |
Save an Expedia car from the most recent search results. |
saveExpediaFlight |
Save an Expedia flight from the most recent search results. |
saveExpediaProperty |
Save an Expedia property from the most recent search results. |
searchExpediaActivities |
Search for activities, tours, and experiences via Expedia. |
searchExpediaCars |
Search for rental cars via Expedia Rapid API. |
searchExpediaFlights |
Search for flights via Expedia Rapid API. |
searchExpediaProperties |
Search for hotels and properties via Expedia Rapid API. |
Extension Builder (15)
| Tool |
What it does |
beginBundleUpload |
CHUNKED UPLOAD — LAST-RESORT FALLBACK. |
createExtensionProject |
DEPRECATED — prefer proposeBrief. |
finalizeChunkedUpload |
CHUNKED UPLOAD — assemble all chunks into a zip, verify sha256, run the static gate, submit for review. |
getExtensionBuilderOverview |
Get summary of all extension builds for this tenant: total builds, statuses, recent activity. |
getExtensionFrameSpec |
Return the host frame contract for local preview: the window.AppExtension.mount signature, the --ext-* theme tokens, the axios-style REST api shape, the vanilla-JS bundle format, and the simplified. |
getExtensionRules |
Return the canonical SOIS extension build rules (manifest schema, table naming, migration safety, permissions, toolkit/examiner pattern, i18n prefixing, UI/theme tokens, bundle format, extension ty. |
getExtensionStatus |
Get the lifecycle status, latest validation report, reviewer feedback reason, AND the current bundle-buffer state (files staged, total bytes, list of relative paths) for one of your projects. |
getPlatformDataShapes |
Return the canonical shapes of the SOIS-built-in tenant data your app can WIRE INTO (Contacts, Calendars, Tasks, Documents, Departments). |
getSupportedLocales |
List the locales SOIS supports out of the box. |
listExtensionBuilds |
List extension builds with optional status filter. |
proposeBrief |
Submit a proposed brief for the user to review and approve. |
pushBundleChunks |
FALLBACK PATH — pushes base64 chunk data inside MCP tool arguments. |
setExtensionMeta |
Update the branding + display metadata for one of your projects: name, title, description, release_notes (changelog for the CURRENT version, shown in the dev console version pill and the marketplac. |
uploadExtensionLogo |
LAST-RESORT FALLBACK only — pushes raster logo (PNG/JPEG/WebP) as base64 in tool args. |
validateExtensionBundle |
Run the free static gate on a bundle and return issues to fix. |
Files (15)
| Tool |
What it does |
copyFile |
Copy a file from one S3 location to another. |
createFileEntity |
Create / upload a file into the Files extension. |
createFileFolder |
Create a new folder in the Files extension. |
deleteFileEntity |
Delete a file from the Files extension. |
downloadFileEntity |
Generate a presigned download URL for a file. |
emailFileAsAttachment |
Create an email compose draft with a file from the Files extension pre-attached. |
getFileEntity |
Read a file entity's metadata, extraction status, summary, and activity log by ID. |
getFileWorkingPath |
Get the current working path (folder context) in the Files extension. |
listFiles |
List or search the Files library ("what files do I have?", "find the licence agreement pdf", "how many files are in Contracts?"). |
moveFile |
Move a file from one S3 location to another. |
moveFileEntity |
Move a file to a different folder in the Files extension. |
readFileContent |
Read any file's content as structured Markdown. |
renameFileEntity |
Rename a file in the Files extension. |
saveChatUploadToFiles |
Save a file uploaded in chat to the Files entity. |
saveFileToContact |
Save an uploaded file under a contact. |
Flights and Stays (8)
| Tool |
What it does |
bookmarkFlightOffer |
Duffel provider: save a flight offer from the most recent findFlightOffers (Duffel) results. |
bookmarkStayOffer |
Save a hotel/stay offer from the most recent stays search results. |
findFlightOffers |
Flight search (Duffel provider). |
findStayOffers |
Search for hotels and accommodation. |
getTravelOverview |
Get an overview of saved flights and stays: counts by status, upcoming departures/check-ins, and recent saves. |
prepareFlightBooking |
Prepare a flight booking for the user to confirm and pay — the agentic-booking entry point (works in voice chat too). |
prepareStayBooking |
Prepare a hotel/stay booking for the user to confirm and pay — the agentic-booking entry point for stays (works in voice chat too). |
updateTravelBooking |
Update the status of a saved flight or stay. |
Form Builder (18)
| Tool |
What it does |
addFieldGroup |
Add a group of fields to an existing form template. |
createFormTemplate |
Create a new form template with field definitions. |
examineForms |
Check form builder status — template counts by status, recent submissions, popular forms. |
exportSubmissionPdf |
Export a form submission as an A4 PDF document. |
generateChoiceFields |
Generate choice/selection fields (select, autocomplete, radio_group, checkbox, checkbox_group, switch) for a form. |
generateLayoutFields |
Generate layout/structural elements (paragraph, section_divider) for a form. |
generateMediaFields |
Generate media/capture fields (file_upload, signature, date) for a form. |
generateTextFields |
Generate text input fields (text_field, textarea, number) for a form. |
getFormSchema |
Get the full field schema of a form template for reading/modifying. |
lockSubmission |
Lock or finalise a form submission, making it read-only. |
manageFormTemplate |
Publish, archive or duplicate a form template. |
removeFormFields |
Remove fields from a form template by their IDs. |
reorderFormFields |
Reorder fields in a form template. |
searchFormSubmissions |
Search form submissions by template, entity scope, status, date range, or full-text across responses. |
searchFormTemplates |
Search form templates by name, status, or extension scope. |
submitForm |
Submit a form with response values. |
updateFormFields |
Replace the entire field schema of a form template. |
updateFormTemplate |
Update an existing form template — name, description, or fields. |
Google Meet (1)
| Tool |
What it does |
createGoogleMeetMeeting |
Create a Google Meet meeting and return its join URL. |
Group Accounts (14)
| Tool |
What it does |
createGroupAccount |
Create a new group account. |
examineGroupAccount |
Get a complete 360° snapshot of ONE group account in a single call — profile (with linked contacts/users), upcoming events, attachments and recent emails — instead of calling getGroupAccount + getG. |
getGroupAccount |
Get full details of a group account including its linked contacts and users. |
getGroupAccountAttachments |
List documents and files linked to a group account. |
getGroupAccountUpcomingEvents |
Get upcoming calendar events linked to a group account (via linked users and contacts). |
getMyBillingOverview |
Return the calling client-portal user's billing overview: linked account, Stripe customer status, current balance, recent charges. |
linkContactToGroupAccount |
Link a contact to a group account. |
linkDocumentToGroupAccount |
Attach a document to a group account. |
linkFileToGroupAccount |
Attach a file to a group account. |
listGroupAccounts |
List all active group accounts. |
searchGroupAccountEmails |
Group-account email search: find emails in connected inboxes involving a GROUP ACCOUNT (by addresses from the group account's data and linked contacts). |
searchGroupAccounts |
Search for group accounts by name. |
unlinkContactFromGroupAccount |
Remove the link between a contact and a group account. |
updateGroupAccount |
Update group account data. |
HR (40)
| Tool |
What it does |
addTrainingRecord |
Record completed training. |
approveLeaveRequest |
Approve a pending leave request. |
clockIn |
Clock an employee in (creates an open time entry). |
clockOut |
Close the active time entry; computes hours worked. |
createEmployee |
Create an employee. Example: createEmployee({ name: "Alex", email: "alex [at] example.com", job_title: "Engineer" }). |
createHiringCandidate |
Create a new hiring candidate. |
createHiringPipeline |
Create a new hiring pipeline with custom stages. |
createReview |
Create a review for an employee under a cycle. |
denyLeaveRequest |
Deny a pending leave request. |
examineEmployee |
Get a complete 360° snapshot of ONE employee in a single call — profile, leave balance, onboarding checklist, training records and time entries — instead of calling getEmployee + getLeaveBalance + . |
fileGrievance |
File a new grievance on behalf of an employee. |
getEmployee |
Get full employee profile (job, compensation, contact). |
getGrievances |
List grievances. Example: getGrievances({ status: "open" }). |
getHiringCandidate |
Get full candidate details by ID. |
getHiringPipelineOverview |
Examiner: pipeline stage counts, candidate distribution, recruitment funnel. |
getHrDashboard |
Examiner tool: HR snapshot — headcount, open positions, pending leave, active onboarding, pending reviews, today's attendance, open grievances, published policies. |
getLeaveBalance |
Get an employee's leave balances. |
getLeaveRequests |
List leave requests, optionally filtered. |
getOnboardingChecklist |
List active onboarding checklists or templates. |
getPolicies |
List policies. Example: getPolicies({ status: "published" }). |
getPolicyAcknowledgments |
List employees who acknowledged a policy. |
getReviewCycles |
List performance review cycles. |
getTimeEntries |
List time entries with optional filters. |
getTrainingRecords |
List training records, optionally for one employee. |
inviteEmployeeToTeam |
Create a User account for an unlinked employee and link them. |
listEmployees |
List employees with optional status filter. |
listHiringCandidates |
List hiring candidates with optional pipeline/stage filters. |
moveHiringCandidateStage |
Move a candidate to a different stage. |
openEmployee |
Open the employee profile tab. |
openHiringCandidate |
Open a candidate tab. |
openHumanResources |
Open the Human Resources view in the UI. |
searchEmployees |
Search the employee directory by name, email, title, or department. |
searchHiringCandidates |
Search hiring candidates by name, role title, email, or skills. |
startOnboarding |
Kick off an onboarding instance from a template. |
submitAssessment |
Submit a self or manager assessment. |
submitLeaveRequest |
Submit a leave request. |
toggleOnboardingItem |
Toggle an onboarding checklist item. |
updateEmployee |
Update employee fields. |
updateGrievance |
Update grievance status, resolution, or add a timeline note. |
updateHiringCandidate |
Deep-merge data into a candidate. |
Email Inbox (12)
| Tool |
What it does |
findAndReadEmail |
ONE-SHOT: search inboxes for an email AND return the full body of the top match. |
forwardEmail |
Forward an email to one or more recipients. |
getDraft |
Get a specific email draft including its full HTML body content. |
getEmailSignature |
Read the email signature configured for one of the user's connected inboxes (the signature appended to emails they send). |
getInboxFolders |
Get the mail folders (Inbox, Sent, Drafts, etc.) for a specific connected email inbox. |
getInboxMessages |
Get paginated messages from a specific mail folder. |
listDrafts |
List the current user's email drafts. |
listInboxes |
List the user's connected email inboxes (Microsoft/Gmail accounts). |
openInboxSettings |
Open the Inbox Settings tab where the user can connect a new email account (Microsoft, Google, Zoho) or manage agent access for existing inboxes. |
resendEmail |
Resend a previously sent email. |
updateDraft |
Update an existing email draft. |
updateEmailSignature |
Update the email signature for one of the user's connected inboxes ("update my email signature to ..."). |
Marketing (46)
| Tool |
What it does |
activateEmailSequence |
GATED: Activate an email sequence — starts enrolling segment contacts and sending drip emails. |
createDesign |
Design a branded graphic on the Design Studio canvas from a plain-language brief, using the brand kit for colours, tone and logo. |
createEmailSequence |
Create an email drip sequence with steps. |
createLandingPage |
Create a single-page campaign landing page (saved as a draft). |
createMarketingCampaign |
Create a new marketing campaign. |
createMarketingContent |
Manually create a content piece in the library (not AI-generated). |
createMarketingPlan |
Create a strategic marketing plan document. |
createMarketingSegment |
Create an audience segment. |
deleteDesignAsset |
GATED: Delete a Design Studio asset (soft delete). |
deleteEmailSequence |
GATED: Delete an email sequence (soft delete). |
deleteMarketingCampaign |
GATED: Delete a marketing campaign (soft delete). |
deleteMarketingContent |
GATED: Delete a content piece from the library (soft delete). |
deleteMarketingSegment |
GATED: Delete an audience segment (soft delete). |
enrollInEmailSequence |
Enroll one or more contacts in an email sequence (drip). |
generateDesignImage |
Generate an AI image (text-free photographic background) and save it as a Design Studio asset the team can use in posts and pages. |
generateMarketingContent |
AI-powered content generation using copywriting frameworks (AIDA, PAS, BAB, 4Ps, Storytelling). |
generateMarketingStrategy |
AI-powered CMO strategy generation based on a marketing plan. |
generateSequenceStep |
AI-generate a single email step for a sequence based on context. |
getBrandKit |
Read the tenant Brand Kit so you produce ON-BRAND content and landing pages: brand name, tagline, logo URL, website, contact email/phone, and physical address. |
getCampaignPerformance |
Get detailed performance metrics for a specific campaign. |
getEmailSequence |
Get full email sequence details including steps and subscriber stats. |
getMarketingAnalytics |
Get overall marketing analytics: open/click/conversion rates, deliverability (bounce/unsubscribe rates), content performance by type, top acquisition sources (attribution + revenue), audience segme. |
getMarketingCampaign |
Get full campaign details with associated content, sequences, and performance. |
getMarketingContent |
Get full content piece details by ID. |
getMarketingDashboard |
Examine marketing status: active campaigns, content pipeline counts, email sequence stats, recent performance metrics, AI spend summary. |
getMarketingPlan |
Get full marketing plan details by ID. |
getMarketingRecommendations |
CMO-level AI recommendations based on current performance data and full-funnel analysis (awareness→retention). |
launchMarketingCampaign |
GATED: Launch a campaign — activates scheduled content and sequences. |
listCampaignSuggestions |
Account-wide triage: which active campaigns have pending closed-loop optimizer suggestions (A/B winner, low engagement, deliverability), with each suggestion's type and reason plus the campaign aut. |
listDesignAssets |
List the marketing Design Studio assets (reusable graphics/images the team uses in social posts, landing pages, and campaigns). |
listMarketingSegments |
List audience segments with contact counts. |
listSocialAccounts |
List the tenant's connected social accounts (id, platform, handle, status). |
pauseMarketingCampaign |
GATED: Pause an active campaign — stops scheduled content and sequences. |
previewSegmentContacts |
Preview which contacts match a segment. |
publishMarketingContent |
GATED: Publish content — for blog_draft type, creates a post via the blog extension. |
refineDesign |
Change an existing Design Studio design from a plain-language instruction (e.g. |
scheduleSocialPost |
GATED: Schedule (or draft) a social post to a connected account. |
searchMarketingCampaigns |
Search marketing campaigns by name, channel, status, or date range. |
searchMarketingContent |
Search content library by title, type, status, or campaign. |
setCampaignAutonomy |
GATED: Set a campaign's closed-loop autonomy and run an immediate optimization pass. |
updateEmailSequence |
Update an email sequence. |
updateLandingPage |
Update an existing landing page (title, HTML, slug, SEO, or status). |
updateMarketingCampaign |
Update an existing campaign. |
updateMarketingContent |
Update an existing content piece. |
updateMarketingPlan |
Update an existing marketing plan. |
updateMarketingSegment |
Update a segment. Can update name, rules, or contact list. |
MCP Gateway (5)
| Tool |
What it does |
getMcpGatewayOverview |
Get overview of configured MCP servers including total counts by status and recently connected servers. |
mcpCallTool |
Execute a tool on a remote MCP server. |
mcpDiscoverTools |
Connect to an MCP server and discover its available tools and resources. |
mcpListServers |
List all configured MCP servers with their status, tool counts, and connection info. |
mcpReadResource |
Read a resource from an MCP server by URI. |
Notifications (9)
| Tool |
What it does |
cancelWatcher |
Cancel an active background watcher by its id. |
createNotification |
Create and broadcast a notification. |
createWatcher |
Register a "wake me when X happens" background watcher. |
examineNotifications |
Examiner tool: Check notification stats — unread count, recent activity, type breakdown (urgent/everyone/user), and delivery summary. |
listNotifications |
List notifications with optional filters. |
listWatchers |
List the user's background watchers. |
openNotifications |
Open the Notifications centre tab in the UI. |
searchNotifications |
Search notifications by keyword in title or body. |
updateNotification |
Mark notification(s) as read or dismissed. |
Credential Vaults (2)
| Tool |
What it does |
vaultList |
List vaults the user has access to, or list entries in a specific vault. |
vaultLookup |
Search the encrypted credential vault by hostname, label, email, or entry ID. |
People Tracker (1)
| Tool |
What it does |
examineTeamLocations |
Where is/was a team member: read the People Tracker location log ("where was Jessica on Monday?", "who was on site last week?", "where is the team today?"). |
Personal Assistant (11)
| Tool |
What it does |
paAdjustSchedule |
Adjust an existing scheduled goal's cadence based on updated dates, follow-up state, source status, failures, or changed context. |
paAnswerBrief |
Record the user's answer to the assistant's current clarifying question and advance the brief (entities, locale confirmation, recurrence, notification channels, follow-up strategy). |
paApproveAndSchedule |
After the user has reviewed a test run and approves, convert the tested task into a reusable template and schedule it with the chosen wake-up cadence. |
paGetGoal |
Get the current state of a personal-assistant goal (stage, plan facts, pending question, governance) so you can continue the dance. |
paGovernanceCheck |
Diff the tools the goal needs against what the user is already granted. |
paListGoalTasks |
List the agent tasks a personal-assistant goal has spawned (test, production, and sub-tasks) with their current status. |
paListGoals |
Answer "what are you currently managing for me?" — summarise everything the personal assistant has on the go (what it is watching, the cadence, whether it is scheduled or still being set up). |
paResearchGoal |
Research how the goal can be achieved using knowledge search and web search: relevant sources (e.g. |
paRunTest |
Run a READINESS AUDIT of the assembled goal (NOT an execution): do we have the tools, governance, stored logins, channels, budget and extensions to run this if enabled?. |
paStartBrief |
Start a new ONGOING Personal Assistant goal from the user's brief — something they want kept an eye on / monitored / reminded about on a recurring schedule (NOT a one-off job). |
paWatchTest |
Return the goal's latest readiness-audit result (ready + per-check list). |
Platform (58)
| Tool |
What it does |
addTeamCardComment |
Post a comment on a team card. |
approvePortalUser |
Approve a pending user's request to access a client portal. |
assessFeasibility |
Run a feasibility / do-able rating on the current brief draft. |
checkOtpCode |
Check the hidden OTP vault for a fresh (<10 min) one-time login code the user supplied for a service, to clear a second-factor prompt while logging in. |
checkRates |
Check the current pricing rates and Account balance for this account. |
composeExtensionBuildPrompt |
Turn an idea (or one of the developer's briefs) into a structured, ready-to-paste prompt the developer hands to their OWN local MCP client (Claude/Cursor) to build the SOIS extension. |
createSupportTicket |
Create a new support ticket to contact the network admin. |
deleteDraft |
Delete an UNSENT email draft (removes it from the provider and the drafts list). |
deleteStoredApi |
Delete stored API credentials. |
executeApiCall |
Execute an HTTP request to a stored API. |
findIntegrationsByTag |
Search remembered integrations by tag. |
gatherMobileBuildConfig |
Validate + normalize a proposed build brief (app name, bundle identifier, audience, brand colour, store listing) and echo it back with any issues. |
getActivityDetail |
Get detailed breakdown of a specific agent interaction by trace ID. |
getAvailableAgentToolkits |
List the OTHER extensions installed in this sector whose toolkits give YOU (the agent) capabilities you can use to populate the user's app on demand. |
getBillingSummary |
Get billing summary for the current user's client account: outstanding balance, this month's charges, amount paid this month, and a 6-month payment trend chart. |
getCountriesByRegion |
List all countries in a region or subregion. |
getCountryBankConfig |
Get the bank account form configuration for a country — returns the required banking fields (e.g. |
getMobileAppInfra |
Return the infrastructure facts your agent needs to plan a branded mobile app: the workspace API base + deep-link scheme, the auth model, that the app is a Capacitor wrap of the SOIS web app (so in. |
getMobileBrandingToolkit |
Return the workspace branding defaults (current logo, theme/brand colour, app name) plus the icon/splash asset spec (square PNG, 512px+) so your agent can propose branding for the app. |
getMyExtensionBrief |
Read one of the developer's own extension briefs in detail (name, description, status, plan, and lifecycle history) so the co-pilot can discuss or refine it. |
getPortalSummary |
Get a summary of all client portals configured for this tenant: how many portals exist, their access modes, how many users are linked, and how many pending approvals. |
getPromotableItems |
Read marketing-ready items from one promotable source returned by listPromotableSources: name, description, price and image where the extension stores them. |
getRecentActivity |
Get a summary of recent agent interactions. |
getStoreGuidelines |
Return the Apple App Store Review + Google Play policy essentials and mobile UX laws the app and its store listing must honour (privacy, account deletion, login, metadata accuracy, sign-in options,. |
getSupportTicket |
Get full details of a support ticket including all responses. |
getTeamBoard |
View a team's Kanban board. |
getToolReliability |
Check which agent capabilities have been reliable vs having issues recently. |
linkUserToPortal |
Grant a user (customer/client) access to a client portal. |
listExtensionProjects |
List your extension projects with their current status. |
listInstalledExtensions |
List installed extensions/integrations for this tenant. |
listMyExtensionBriefs |
List the developer's own extension briefs (apps) with status and version, so the co-pilot can reference what they are building. |
listPromotableSources |
List the real things this workspace can promote, discovered from the extensions it has installed (e.g. |
listRememberedIntegrations |
List all remembered API integrations with their tags and capabilities. |
listStoredApis |
List all APIs the user has stored credentials for. |
manageExtensionData |
Create, read, update, or delete records in a user-built extension's data table. |
manifestTraining |
MANDATORY pre-build read. |
markEmailRead |
Mark an email message as read. |
openExtension |
Open an installed extension/integration in an app tab. |
openPDFPreview |
Pop a PDF (or document) open in a floating preview dialog in the user's app so they can read it inline WITHOUT leaving the conversation. |
rejectPortalUser |
Reject a pending user's request to access a client portal. |
rememberIntegration |
Store metadata about an API integration in memory (NOT the credentials). |
requestBundleUploadUrl |
PRIMARY UPLOAD PATH — try this first. |
requestLogoUploadUrl |
PRIMARY logo upload path. |
respondToSupportTicket |
Add a response to an existing support ticket. |
saveEmailAttachmentToFiles |
Save an attachment from an email into the tenant Files library (S3-backed, text-extracted, linkable to contacts). |
searchMemory |
Search knowledge base files for specific information. |
searchMemorySemantic |
Search learned memories using natural language. |
searchSupportTickets |
Search support tickets by keyword, status, or both. |
searchTools |
Discover MORE tools when your current toolset lacks what the task needs. |
set_user_name_preference |
Save the user's preferred form of address and an optional phonetic pronunciation hint. |
storeApiCredentials |
Securely store API credentials for later use. |
submitMobileBuild |
Submit the brief to build the branded mobile app. |
submitOtpCode |
Store a short-lived one-time login / OTP / 2FA / verification code the user just gave you, so a running task can use it to finish logging in somewhere. |
unlinkUserFromPortal |
Revoke a user's access to a client portal. |
updateTeamCard |
Update a card on a team board. |
updateTeamChecklist |
Add, toggle (complete/uncomplete), or remove a checklist item on a team card. |
updateUserData |
Update metadata (custom data fields) for a client user. |
uploadExtensionBundleFromUrl |
Step 3 of the PRIMARY path — companion to requestBundleUploadUrl. |
Reports (5)
| Tool |
What it does |
listReportSources |
List the data sources you can build tabular reports from, with their available dimensions (group-by fields), measures (aggregates like count/sum), and filters. |
listSavedReports |
List saved report templates visible to the current user (their own plus shared). |
runReportQuery |
Run an ad-hoc tabular report against a whitelisted source. |
runSavedReport |
Re-run a saved report template by id (the Run button). |
saveReportTemplate |
Save a report query you designed as a reusable template. |
Signatures (10)
| Tool |
What it does |
addSignatureRecipient |
Add a recipient (signer, approver, viewer, or CC) to a signature envelope. |
createEnvelope |
Create a new signature envelope draft. |
getEnvelope |
Get full details of a signature envelope including recipients, fields, and status. |
getEnvelopeAudit |
Get the complete audit trail for a signature envelope. |
getSignaturesSummary |
Examine signature envelope status: counts by status (draft, sent, completed, declined, expired, voided), recent envelopes, pending actions, completion rates. |
listEnvelopes |
List signature envelopes with optional status filter. |
remindEnvelope |
Chase outstanding signatures: send a reminder to everyone still pending on an envelope, or to one recipient by name/email. |
searchEnvelopes |
Search signature envelopes by name, recipient email, status, or date range. |
sendEnvelope |
Send a signature envelope for signing. |
voidEnvelope |
Void/cancel an active signature envelope. |
Slack (8)
| Tool |
What it does |
slackFindUser |
Find Slack workspace members by name or email, returning their Slack user id (for @-mentions) and display name. |
slackLatestMessages |
Get the latest messages across the channels the workspace bot is in, newest first, merged from multiple channels. |
slackListChannels |
List channels in a connected Slack workspace (name, topic, member count). |
slackListWorkspaces |
List the Slack workspaces connected to this organisation (name, id, channel count, status). |
slackReadChannel |
Read recent messages from one Slack channel (most recent first), with author names resolved. |
slackSearchMessages |
Search Slack message history for a query and return matching messages with channel + author. |
slackSendMessage |
Post a message to a Slack channel on behalf of the organisation. |
slackShareCard |
Send a rich card to a Slack channel: a titled block with optional subtitle, labelled fields, a link button, and @-mentions. |
Team Members (7)
| Tool |
What it does |
getTeamMember |
Get detailed information about a specific team member by their user ID. |
getTeamMemberProfile |
Get a team member's profile sections (travel preferences, medical info, dietary requirements, hobbies, next of kin, etc.). |
inviteTeamMember |
Invite a new team member (non-super-admin) by name and email. |
listTeamMembers |
List all team members in the current organisation. |
removeTeamMemberSection |
Remove a profile section from a team member. |
resetTeamMemberPassword |
Reset a team member's password and generate a new temporary password. |
updateTeamMemberSection |
Add or update a profile section on a team member. |
Microsoft Teams (1)
| Tool |
What it does |
createTeamsMeeting |
Create a Microsoft Teams meeting and return its join URL. |
Todo Lists (8)
| Tool |
What it does |
addTodoListItems |
Add new items to an EXISTING todo list without replacing the current items. |
createTodoList |
Create a NEW todo list. |
deleteTodoList |
Delete a todo list permanently. |
getTodoListDetails |
Get full details of a specific todo list including all checklist items, their completion status, priorities, and due dates. |
getTodoListOverview |
Get a summary overview of the user's todo lists: total count, breakdown by status (active/completed/archived), and the 5 most recently updated lists. |
searchTodoLists |
Search todo lists by name or filter by status. |
shareTodoList |
Share a todo list with team members or everyone (creator only). |
updateTodoList |
Update an existing todo list: rename it, change its status, or replace all checklist items. |
Destinations (3)
| Tool |
What it does |
getDestinationsSummary |
Get an overview of saved destinations: counts by status and type (POI/activity), recent saves. |
saveDestinationItem |
Save a destination item (POI or activity) from the most recent search results. |
searchDestinations |
Search for points of interest and activities near a city. |
Flights (3)
| Tool |
What it does |
getFlightsSummary |
Get an overview of saved flights: counts by status, upcoming departures, and recent saves. |
saveFlightOffer |
Amadeus provider: save a flight offer from the most recent searchFlights (Amadeus) results. |
searchFlights |
Flight search (Amadeus provider). |
Hotels (3)
| Tool |
What it does |
getHotelsSummary |
Get an overview of saved hotels: counts by status, upcoming stays, and recent saves. |
saveHotelOffer |
Save a hotel offer from the most recent search results. |
searchHotels |
Search for hotels in a city. |
Travel Planner (20)
| Tool |
What it does |
checkInsuranceCoverage |
Check travel insurance coverage for a traveller. |
checkPassportValidity |
Check passport validity for a traveller. |
checkTravellerAvailability |
Check whether a traveller is FREE to travel over a date window before you book flights/hotels — and report where they already are on those dates. |
checkVisaRequirements |
Research visa requirements for a specific nationality entering a destination country. |
createTravelCard |
Create a new task card on a travel request sub-board. |
createTravelProfile |
Create a traveller profile with passport details, preferences, and frequent flyer info. |
createTravelRequest |
Create a new travel request — call this ONLY once you are confident you have the core payload. |
findTraveller |
Resolve who is travelling by name, email, or company across BOTH the team (users) and contacts (which includes customers and suppliers). |
getTravelPlannerOverview |
Examiner tool: Get an overview of travel requests — total counts by status, recent requests, active alerts (passport expiry, visa issues), and pipeline summary. |
getTravelRequestCards |
Get all task cards for a specific travel request. |
moveTravelCard |
Move a travel card to a different status column. |
resolveTravelOrigin |
Resolve the origin airport for a travel request from prior trips or profile home airport. |
searchFlightsForCard |
Search available flights for a travel card. |
searchHotelsForCard |
Search available hotels for a travel card, linked to the card. |
searchTransfersForCard |
Search ground transport options — airport transfers, taxis, car rentals — linked to the card. |
searchTravelProfiles |
Search traveller profiles by name, email, or passport nationality. |
searchTravelRequests |
Search and filter travel requests by traveller name, destination, status, or date range. |
updateTravelCard |
Update a travel request task card — status, assignee, result data, checklist. |
updateTravelProfile |
Update an existing traveller profile. |
updateTravelRequest |
Update an existing travel request. |
Transfers (3)
| Tool |
What it does |
getTransfersSummary |
Get an overview of saved transfers: counts by status and type, recent saves. |
saveTransferOffer |
Save a transfer offer from the most recent search results. |
searchTransfers |
Search for airport/city transfers. |
Trips (3)
| Tool |
What it does |
getRecommendations |
Get personalised destination recommendations based on an origin city. |
getTripsSummary |
Get an overview of saved trip predictions and recommendations: counts by type and status, recent saves. |
predictTripPurpose |
Predict whether a trip is for business or leisure, and get destination recommendations. |
Client Users (1)
| Tool |
What it does |
inviteUser |
Invite a new app user (customer/client). |
Warehouse (42)
| Tool |
What it does |
autoGenerateLocations |
Auto-generate all locations for a warehouse based on its aisle configuration. |
cancelStockCount |
Cancel an in-progress or draft stock count session without applying any adjustments. |
createLocation |
Create a single warehouse location with aisle/row/column coordinates and optional dimensions. |
createStockAdjustment |
Set the quantity of a stock record to a new value (manual adjustment). |
createWarehouse |
Create a new warehouse with optional aisle configuration. |
deleteLocation |
Soft-delete a warehouse location. |
deleteWarehouse |
Soft-delete a warehouse and all its locations. |
dispatchStock |
Dispatch stock from a warehouse location. |
getBillingCharges |
List warehouse billing charges (the open-transaction ledger) — what has accrued for a customer. |
getBillingInvoices |
List warehouse billing invoices with their period, total, and status. |
getCapacitySummary |
Get warehouse capacity utilisation metrics: total locations, occupied, empty, full, reserved, utilisation percentage. |
getCatalogItem |
Get one catalogue item by its SKU number or catalogue id, including its on-hand stock summary across all warehouses. |
getGoodsReceipts |
List warehouse goods received notes (GRN — the inbound delivery workflow). |
getInventoryValuation |
Sum the monetary value of all on-hand stock as quantity × unit_cost (taken from stock.data.unit_cost). |
getLocation |
Get details of a specific warehouse location including dimensions and capacity. |
getLowStock |
List stock items at or below their reorder threshold. |
getMyStock |
List stock items belonging to the calling client-portal user's linked contact(s). |
getMyStockTransactions |
Transaction history (movements, receipts, putaways) for stock belonging to the calling client-portal user's linked contact(s). |
getOutOfStock |
List stock rows with available quantity of zero (quantity - reserved_quantity ≤ 0). |
getPickLists |
List warehouse pick lists (the outbound pick/pack/dispatch workflow). |
getStockAtLocation |
List all stock items at a specific warehouse location with quantities and availability. |
getStockDiscrepancies |
List variance lines from recent completed stock counts. |
getStockSummary |
Get a summary of all stock across all warehouses — total items, quantities, locations with stock, reservations. |
getTransactionHistory |
Get the transaction history for a warehouse, location, or specific stock item. |
getWarehouse |
Get full details of a warehouse including its aisle configuration and location summary. |
getWarehouseSummary |
Examine warehouse status: total warehouses, location counts per warehouse, capacity utilisation, empty vs occupied locations. |
listLocations |
List locations within a warehouse, optionally filtered by aisle number. |
moveStock |
Move stock from one warehouse location to another. |
putAwayStock |
Guided one-shot putaway: asks suggestPutaway for the best location for a known product and quantity, then receives the stock there. |
receiveStock |
Receive stock into a warehouse location. |
recordStockCount |
Record the counted quantity for a single stock item in an active count session. |
releaseReservation |
Release a previously made stock reservation. |
requestStockCollection |
Raise a request for the calling client-portal user to collect stock they hold in the warehouse. |
reserveStock |
Reserve (earmark) stock at a location for future dispatch. |
searchCatalogue |
Search the stock catalogue (the SKU register) by name, SKU, or barcode. |
searchStock |
Search stock by item name across all warehouses. |
searchWarehouses |
Search warehouses by name or company. |
setProductDimensions |
Store or update physical dimensions for a product in the global registry. |
startStockCount |
Create and start a new stock count session for a warehouse. |
submitStockCountResult |
Complete a stock count session: applies every line variance as a stock adjustment with reason "Stock count adjustment" and references the count_id in the audit log. |
suggestPutaway |
Get AI-suggested warehouse locations for putting away incoming stock. |
updateWarehouse |
Update warehouse details (name, address, contact info). |
WhatsApp Messaging (3)
| Tool |
What it does |
get_whatsapp_status |
Check WhatsApp connection status and view the current whitelist of allowed phone numbers. |
send_whatsapp |
Send a WhatsApp message to a whitelisted phone number. |
test_whatsapp_connection |
Test the WhatsApp connection by verifying the API token and phone number ID are valid. |
Zoom (1)
| Tool |
What it does |
createZoomMeeting |
Create a Zoom video meeting and return its join URL. |
The app builder runs over this same endpoint
There is no separate MCP server for building apps. The extension-builder tools ship as part of the same workspace MCP server and appear in the same tools/list, with one condition: they are admin-gated, so they surface only for builder-capable accounts. If your account can build apps, your tool list also includes:
getExtensionRules, getExtensionFrameSpec (what an app must look like)
createExtensionProject, listExtensionProjects, getExtensionStatus
validateExtensionBundle, uploadExtensionBundle
So building an app is the same act as everything else: you connect your agent to your workspace once, and if you are a builder it can scaffold, validate, and publish an app alongside running your business, all through the one /api/mcp endpoint. See Build an app for the workflow.
(Not to be confused with the public, read-only build-context connector an operator can add to advertise a network's capabilities; that is a separate, unauthenticated endpoint on the network domain, not your workspace MCP server.)
Budget, limits, and errors
| What |
Value |
| Rate limit |
120 requests/minute |
| Tool-call cost |
metered as AI credits |
| Budget |
per API key (Option B) or per workspace; you set the cap |
| Token expiry |
90 days (Option B Sanctum token); OAuth tokens refresh automatically |
Standard JSON-RPC errors apply, plus a few specific codes:
| Code |
Meaning |
-32001 |
Unauthorized or session expired (Option A connectors get the OAuth challenge here) |
-32002 |
Insufficient AI credits |
-32003 |
Tool not permitted for this account |
-32004 |
Budget cap reached |
Test your connection
curl -X POST "https://<your-workspace>.sois.ai/api/mcp/test" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Api-Key: YOUR_API_KEY"
Returns whether the credentials work and how many tools are visible to them.
Per-client setup
Connecting Sois is identical at the protocol level (paste your MCP URL → OAuth or Bearer auth) but each client has its own config file and reload procedure. Pick yours:
Claude Desktop
- Open Claude Desktop → Settings → Developer → Edit Config (or open
~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows, ~/.config/Claude/claude_desktop_config.json on Linux).
- Add an
mcpServers entry pointing at your workspace MCP URL with the mcp-remote stdio bridge (or use the in-app Add custom connector flow if your Claude Desktop version exposes it — that path uses OAuth and skips the JSON file entirely).
- Quit Claude Desktop completely (⌘Q on macOS, Alt+F4 on Windows) and reopen it.
- Open the plug menu in any chat. Your workspace should appear in the list.
ChatGPT
- ChatGPT Desktop → Settings → Apps → Advanced settings → Create app.
- Turn on Developer mode (acknowledge the warning), then click Create app.
- Name it "Sois", set Connection to Server URL, paste your MCP URL.
- For Authentication, choose OAuth. ChatGPT discovers the Sois OAuth endpoints automatically and walks you through the sign-in + consent flow on first use.
Cursor
- Create or open
~/.cursor/mcp.json (or .cursor/mcp.json in a repo root for project scope).
- Add an
mcpServers entry with your workspace MCP URL + bearer headers.
- Restart Cursor. Sois should appear in the MCP panel.
VS Code Copilot Chat
- Open the command palette → Preferences: Open User Settings (JSON).
- Add a top-level
mcp block with your workspace URL + headers.
- Reload the window. Sois tools appear in the Copilot tray.
Other MCP-capable clients
Any client that supports remote MCP over HTTP with a bearer token can connect. Use the URL + headers from your workspace's Connect your agent view and follow the client's "Add remote MCP server" docs.
Enable autonomous bundle uploads (Claude Desktop)
When you want your agent to push a finished extension bundle to Sois itself (rather than uploading via the dev console's drop-zone), the agent's bash / code-execution sandbox must be allowed to reach the Sois host. Claude Desktop is the only client today that has a per-app domain allowlist sitting in front of the bash tool — and by default it does not include user domains.
To enable autonomous uploads from a Claude Desktop agent:
Claude Desktop → Settings → Capabilities.
Under Code execution and file creation, enable both Cloud code execution and file creation and Allow network egress.
Domain allowlist → choose Custom (or Package managers only with additional allowed domains).
Add these production hosts under Additional allowed domains (paste each, click Add):
*.sois.ai
app.sois.ai
sois.ai
Quit and reopen Claude Desktop. Your agent's bash / curl can now reach Sois.
Without this allowlist, the agent's PUT to the presigned-upload URL will fail with a host-not-allowed / DNS error, and uploads will silently hang or never leave the client.
Cursor / VS Code Copilot / ChatGPT do not need this — Cursor's agent uses your local shell directly (no per-app sandbox), and ChatGPT custom connectors route network calls through the OAuth-bound MCP transport, not a separate sandbox. Autonomous uploads from those clients work without additional setup.
Bringing your own agent is the strategic path. The MCP Server lets your own AI client reason over your Sois tools directly, so Sois spends no AI on your behalf. The Chat Agent Gateway is the on-ramp for callers that have no agent: plain-English messages over HTTP, where Sois's own agent does the reasoning. Use whichever fits your caller, or both.
Want to connect Sois to external MCP servers instead? See the MCP Gateway for outbound connections.