Endpoint
Access is limited to Lawtte Studio accounts. A principal that resolves to any
other kind of firm authenticates fine and still gets
401 — the server exposes
nothing to it.Discovery
The server implements OAuth 2.0 Protected Resource Metadata (RFC 9728). An unauthenticated request returns401 with the pointer in WWW-Authenticate:
OAuth 2.1
The authorization server publishes standard metadata at/.well-known/oauth-authorization-server and supports:
Because registration is dynamic, a client needs no pre-issued credentials. The flow:
1
Register
POST to the registration_endpoint from the authorization server metadata.
You get a client_id back.2
Authorize
Send the user to the
authorization_endpoint with PKCE. Request
offline_access if you want a refresh token.3
The user picks a receptionist
Lawtte shows its own consent screen: the user signs in, chooses one Studio
calling agent, and approves the call tools. That choice is stored as a grant
against your
client_id and their user — it’s what the server later resolves a
token to.4
Exchange and call
Swap the code at the
token_endpoint and send the access token as
Authorization: Bearer <token> on every MCP request.One grant is one receptionist. A token never spans two Studio accounts, and a user
who wants to switch re-approves. Grants are revocable at any time from
Dashboard → Connect, and revocation takes effect immediately.
API-key authentication
For clients that can’t do OAuth — a localmcp-remote setup, a script, CI — the
server also accepts a Lawtte API key as a bearer token:
Tools
Three tools, described in plain language in connector tools. The schemas, for a client that needs them:place_call carries destructiveHint: true; the other two carry
readOnlyHint: true. A client that surfaces those hints should require confirmation
before place_call — it dials a real person.
Results come back as a text content block holding JSON. Trailing whitespace and key
order aren’t guaranteed; parse it, don’t pattern-match it.
Errors
Business-rule refusals are not HTTP errors. A call blocked by the Do Not Call
list, the daily cap, the two-hour repeat rule, or calling hours returns a normal
tool result with the reason in it — surface that text to the user rather than
treating it as a failure. See limits and safety.
Connecting a client
MCP Inspector
MCP Inspector
Point it at
https://www.lawtte.ai/api/mcp with an Authorization: Bearer <key>
header, or let it run the OAuth flow. Good for confirming the tool list and
running a dry_run before you write any code.mcp-remote (stdio clients)
mcp-remote (stdio clients)
For clients that only speak stdio:The header file holds one line:
Authorization: Bearer lawtte_sk_…Your own client
Your own client
Any MCP SDK works. Connect over streamable HTTP to the server URL, attach the
bearer token, and call
tools/list to confirm you see place_call,
get_call_result, and list_calls. If the list is empty, the principal resolved
to something that isn’t a configured Studio account.Before you go to production
Run
place_call with dry_run: true first. It performs every check — number
validation, Do Not Call, quota, calling hours — and dials nothing, so you can prove
your integration end to end without calling anyone.
