Connecting clients
This page shows how to register the Smily MCP server with the most common MCP clients. In every case you need:
- The endpoint:
https://www.bookingsync.com/mcp - An MCP token: see Authentication → Obtaining a token.
Throughout, replace mcp_YOUR_TOKEN with your actual token.
Clients that can send custom headers should use Authorization: Bearer mcp_YOUR_TOKEN. Clients that
can only be given a URL (notably Claude Cowork) use the ?token=mcp_YOUR_TOKEN query parameter
instead. Both are explained in Authentication.
If your token can reach multiple accounts, pin
the active one per request — add account_id to the tool arguments, or set an
X-BookingSync-Account-ID header (most clients let you add static headers alongside Authorization).
Single-account tokens need none of this.
Claude Code
Claude Code supports remote HTTP MCP servers natively. Add the server with one command:
claude mcp add --transport http smily https://www.bookingsync.com/mcp \
--header "Authorization: Bearer mcp_YOUR_TOKEN"
The server name (smily) and URL must come before the --header flag.
To keep the token out of your shell history, reference an environment variable instead:
export SMILY_MCP_TOKEN="mcp_YOUR_TOKEN"
claude mcp add --transport http smily https://www.bookingsync.com/mcp \
--header "Authorization: Bearer $SMILY_MCP_TOKEN"
Project-scoped configuration (.mcp.json)
To share the server with a project (committed to source control, token kept out of it), add an
.mcp.json at the project root:
{
"mcpServers": {
"smily": {
"type": "http",
"url": "https://www.bookingsync.com/mcp",
"headers": {
"Authorization": "Bearer mcp_YOUR_TOKEN"
}
}
}
}
Verify the connection with claude mcp list, then in a session run /mcp to see the available
tools (api_v3_resources, api_v3_resource_schema, api_v3_list, api_v3_get).
Claude Cowork
Claude Cowork (and the connector experience on claude.ai, Claude Desktop, and the mobile apps) adds
remote MCP servers as custom connectors by URL. These clients connect to your server from
Anthropic's cloud, and at the time of writing Claude Cowork does not let you specify request
headers — so you can't send Authorization: Bearer. The only option there is to put the token in
the URL:
Putting the token in the URL is less secure than a header (see Authentication →
prefer headers) and is not
recommended in general. Use it only with clients like Claude Cowork that can't send headers. Where
your client supports headers (Claude Code, Codex, MCP Inspector), use Authorization: Bearer
instead.
- Open Customize → Connectors (or the + next to Connectors).
- Click Add custom connector.
- Name:
Smily - URL:
https://www.bookingsync.com/mcp?token=mcp_YOUR_TOKEN - Save. Leave the OAuth Client ID / Secret fields empty — the Smily MCP server authenticates via the token in the URL, not OAuth.
- In a conversation, enable the connector from the + → Connectors menu.
Because the token is embedded in the URL, treat the whole connector URL as a credential. Smily
redacts the token parameter from its own logs and error tracking, but anyone who can see the
connector configuration can read the token. Revoke and replace it if it leaks.
Custom connectors connect from Anthropic's infrastructure over the public internet —
www.bookingsync.com is publicly reachable, so no firewall changes are needed.
OpenAI Codex
Codex CLI stores MCP servers in ~/.codex/config.toml (or a project-scoped .codex/config.toml in
trusted projects). It supports streamable HTTP servers directly.
[mcp_servers.smily]
url = "https://www.bookingsync.com/mcp"
bearer_token_env_var = "SMILY_MCP_TOKEN"
bearer_token_env_var names an environment variable whose value Codex sends as the
Authorization: Bearer token, so the secret stays out of the config file:
export SMILY_MCP_TOKEN="mcp_YOUR_TOKEN"
If your Codex version supports arbitrary headers, you can instead use:
[mcp_servers.smily]
url = "https://www.bookingsync.com/mcp"
http_headers = { Authorization = "Bearer mcp_YOUR_TOKEN" }
Other clients (mcp-remote bridge)
For an MCP client that only speaks stdio (e.g. older Claude Desktop configurations, or clients
without native HTTP transport), bridge to the HTTP endpoint with the
mcp-remote adapter:
{
"mcpServers": {
"smily": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://www.bookingsync.com/mcp",
"--header", "Authorization: Bearer mcp_YOUR_TOKEN"
]
}
}
}
This works with any client that accepts a command/args stdio server definition.
Verifying with raw HTTP
You don't need a client to test the server — curl works. See
Protocol & transport for a full initialize →
tools/list → tools/call walkthrough. The quickest smoke test is the unauthenticated health
probe:
curl https://www.bookingsync.com/mcp/health
# => {"status":"ok","server":"bookingsync-mcp","version":"1.0.0","protocol_version":"2025-06-18"}
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
Unauthorized (-32000) | Missing, invalid, expired, or revoked token. | Check the token; generate a new one if needed. See Authentication. |
Session not found or expired (-32001) | Client didn't echo Mcp-Session-Id, or the 1-hour session expired. | Re-initialize. Most clients do this automatically. See Protocol → Sessions. |
Rate limit exceeded (-32029, HTTP 429) | More than 1,000 requests in an hour. | Wait for Retry-After seconds. See Authentication → Rate limiting. |
| Connector can't reach the server | Header-based auth on a header-less client. | Use the ?token= URL form (Claude Cowork). |
account_id is required for this token (-32602) | Multi-account token without an account pinned. | Pass account_id (or the X-BookingSync-Account-ID header). See account selection. |
Invalid params (-32602) | Unknown resource, attribute, operator, or field. | Call api_v3_resources / api_v3_resource_schema to get valid values. |