ChatGPT connector setup
ChatGPT can connect to Slab5 through hosted MCP OAuth or through an MCP server configuration. Use OAuth for shared workspaces and static workspace tokens only for controlled workspace testing.
Status
Slab5 exposes a remote MCP server with workspace-scoped URLs, OAuth discovery, initialization, tool listing, and structured tool output schemas.
Every connection targets one workspace by address — https://mcp.slab5.com/v1/w/{workspace-slug} — and the same address serves both OAuth and static-token connections. Personal accounts and organizations connect the same way.
Custom connector contract
The connector should expose the same Slab5 backend contract:
- Workspace-scoped authentication.
- Stable tool names and schemas from
mcp-tools.json. - Input schemas and output schemas for every tool.
- Required scopes for every tool.
- Structured errors from
errors.json. - Request IDs in responses.
- Audit and usage events for every call.
The connector should not introduce separate business logic or hidden LLM behavior. ChatGPT provides the reasoning; Slab5 provides deterministic tools and state.
Authentication
Use hosted OAuth for production ChatGPT connections. OAuth still requires the signed-in user to have active Slab5 workspace membership. Workspace owners and admins can add explicit OAuth workspace grants to narrow the scopes available to ChatGPT for a specific OAuth subject.
For controlled testing with static credentials, use a workspace token as the connector credential:
Authorization: Bearer YOUR_SLAB5_TOKEN
For an initial connector setup, use limited scopes:
crm:readcrm:writetasks:writeactivity:write
Hosted OAuth setup
Copy the workspace MCP server URL from the MCP Clients page. The server URL names the workspace; the metadata URL does not:
Server URL:
https://mcp.slab5.com/v1/w/your-workspace-slug
Protected resource metadata:
https://mcp.slab5.com/v1/.well-known/oauth-protected-resourceBoth keep the /v1 base path. If the advanced OAuth settings show a protected-resource or OIDC-related URL without /v1, correct it before testing — discovery is served under /v1, not at the origin root.
Do not add a workspace to the metadata URL. There is one protected resource for the whole server, https://mcp.slab5.com/v1, and it is the value the authorization server has registered. A per-workspace resource identifier is not registered and the connection fails at the callback with invalid_target.
The server URL must name a workspace, though. A connector pointed at the bare /v1 address is refused for OAuth: the token identifies a person, who may belong to several workspaces, and Slab5 will not pick one for you.
Connecting more than one workspace
Add one connector per workspace, each with its own URL and its own sign-in. ChatGPT treats them as separate servers, so both can be connected at once and neither can read the other's data — which is the reason the workspace is a path segment rather than a query parameter. Clients normalise or drop query strings when deciding whether two servers are the same, so the older ?workspace_id= form collapsed two workspaces into a single connection.
If a connector shows no tools after a successful sign-in, see Troubleshooting.
Local MCP config shape
For static-token testing, add Slab5 as a trusted MCP server using the workspace MCP URL and a token created from the workspace. Keep write scopes narrow and require user confirmation for write actions.
{
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"name": : var(--shiki-token-string)">"Slab5 sandbox",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"server_url": : var(--shiki-token-string)">"https://mcp.slab5.com/v1/w/your-workspace-slug",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"authorization": : var(--shiki-token-string)">"Bearer ${SLAB5_WORKSPACE_MCP_TOKEN}",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"transport": : var(--shiki-token-string)">"streamable_http",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"scopes": [
: var(--shiki-token-string)">"crm:read",
: var(--shiki-token-string)">"crm:write",
: var(--shiki-token-string)">"tasks:write",
: var(--shiki-token-string)">"activity:write"
],
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"approval": {
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"read": : var(--shiki-token-string)">"automatic",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"write": : var(--shiki-token-string)">"always"
}
}Use a read-only connector when ChatGPT should inspect Slab5 but not change workspace state:
{
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"name": : var(--shiki-token-string)">"Slab5 read-only",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"server_url": : var(--shiki-token-string)">"https://mcp.slab5.com/v1/w/your-workspace-slug",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"authorization": : var(--shiki-token-string)">"Bearer ${SLAB5_READONLY_TOKEN}",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"transport": : var(--shiki-token-string)">"streamable_http",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"scopes": [: var(--shiki-token-string)">"crm:read", : var(--shiki-token-string)">"tasks:read", : var(--shiki-token-string)">"activity:read"],
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"approval": {
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"read": : var(--shiki-token-string)">"automatic",
: var(--shiki-token-string)">"color: var(--shiki-token-parameter)">: var(--shiki-token-string)">"write": : var(--shiki-token-string)">"disabled"
}
}API tool config
For API-driven experiments with a runtime that supports remote MCP calls, pass Slab5 as a remote MCP tool in the model request and send the workspace token per request. Set SLAB5_MCP_URL to the workspace address, https://mcp.slab5.com/v1/w/{workspace-slug}:
import OpenAI from 'openai'
const client = new OpenAI()
const response = await client.responses.create({
model: 'MODEL_NAME',
input:
'Use Slab5 to create a contact for Jane Doe at Acme Corp and create a follow-up task.',
tools: [
{
type: 'mcp',
server_label: 'slab5',
server_url: process.env.SLAB5_MCP_URL,
authorization: process.env.SLAB5_WORKSPACE_MCP_TOKEN,
require_approval: {
always: {
tool_names: ['create_contact', 'create_task', 'log_activity'],
},
},
},
],
})
console.log(response.output_text)Output schemas
Slab5 includes outputSchema for every MCP tool in tools/list. ChatGPT may recommend output schemas when a cached tool definition was fetched before the current server metadata or when the client has not refreshed the MCP server metadata.
To verify the server metadata, inspect tools/list and confirm each tool has outputSchema. A CRM write tool should report a structured result with at least status, tool, workspace_id, and request_id.
First workflow
The first ChatGPT workflow should match the MCP quickstart:
Create a contact named Jane Doe at Acme Corp with email jane@acme.com. Then create a follow-up task for next Friday and log the activity.
Expected backend operations:
create_contactcreate_tasklog_activity