Using the MCP
Worked examples — real customer questions mapped to tool calls, chaining patterns, and how to test the server by hand.
This guide assumes your client is already connected — see MCP Server for the endpoint and connect instructions. Here we cover what to actually do with the six tools: which one answers which question, how they chain together, and how to verify the server by hand.
From question to tool call
Every tool returns the same JSON as its REST counterpart, so the examples below show the tool arguments and the shape that comes back.
"Are you available in my state?"
Call list_states with no arguments. It returns every state with bookable
care:
{ "states": [{ "code": "OH", "name": "Ohio", "appointmentTypeCount": 6 }, ...] }If the customer's state is in the list, care is bookable there. Every other
tool is scoped by these code values.
"Do you take Aetna?"
Call list_insurances with the customer's state:
// arguments
{ "state": "OH" }
// result
{ "state": "OH", "insurances": ["Aetna", "Blue Cross Blue Shield", "Cigna", ...] }To go one step further — which clinicians take that plan — call
search_providers with both filters:
{ "state": "OH", "insurance": "Aetna" }"Who would I be seeing?"
search_providers returns { total, providers } where each provider carries a
slug, displayName, credentials, providerType, gender, and bio.
Optional filters: state, insurance, providerType
(physician / nursePractitioner), gender, plus limit / offset for
paging.
For one clinician's full public profile — education, certifications, clinical
interests, insurance accepted by state — pass their slug to get_provider:
{ "slug": "barbra-hanna" }"What kind of visit should I book?"
Call list_appointment_types, optionally scoped by state. Each entry has a
numeric id, a name, a patient-friendly description, its modality
(video or async), and whether it's newPatientEligible:
{
"state": "OH",
"appointmentTypes": [
{ "id": 24, "name": "Annual Well-Woman Visit", "modality": "video", "newPatientEligible": true, ... }
]
}"How soon can I be seen?"
Call check_availability — state is required, and you can narrow by
appointmentType (the numeric id from list_appointment_types), a
provider slug, horizonDays, or limit:
// arguments
{ "state": "OH", "appointmentType": 24 }
// result
{
"nextAvailable": "2026-08-04T20:20:00Z",
"slots": [{ "startTime": "2026-08-04T20:20:00Z", "providerSlug": "liz-hederman" }, ...]
}Times are UTC (ISO 8601) — convert to the customer's timezone before quoting one.
Chaining tools
Two arguments come from earlier calls rather than from the customer:
slug(forget_provider,check_availability'sprovider) comes from asearch_providersresult or an availability slot'sproviderSlug.appointmentType(forcheck_availability) is the numericidfromlist_appointment_types.
So the natural flows are search_providers → get_provider and
list_appointment_types → check_availability.
Fin makes one connector call per turn
Intercom Fin won't chain two tool calls in a single reply. Broad tools
(list_states, list_insurances) usually answer the question outright in
one call; multi-step flows resolve naturally across turns as the
conversation narrows. For a guaranteed sequence, wire the tools into a Fin
Workflow or Procedure instead of relying on auto-invocation.
Answering safely
Everything here is read-only, public data — no patient records, no booking,
no side effects, so there's nothing an assistant can break. When a lookup
fails (unknown slug, unrecognized filter, upstream hiccup) the tool returns a
short plain-language message flagged with isError instead of an error body.
Those messages are written to be relayed to an end user verbatim — don't
retry on them mechanically; the message says whether the input or the timing
was the problem.
Testing by hand
Useful when wiring up a new client and you want to confirm the server — not
your client config — is behaving. MCP speaks JSON-RPC over streamable HTTP,
so plain curl works:
Initialize
curl -s https://developer.mymenopauserx.com/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'The server is stateless — no session header comes back, and none is needed on later requests.
List the tools
curl -s https://developer.mymenopauserx.com/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'You should see exactly six tools.
Call one
curl -s https://developer.mymenopauserx.com/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_providers","arguments":{"state":"OH","limit":2}}}'Responses arrive as a server-sent event stream — the JSON-RPC result is in
the data: line.
For an interactive session, MCP Inspector works out of the box:
npx @modelcontextprotocol/inspector
# transport: Streamable HTTP, URL: https://developer.mymenopauserx.com/api/mcpTroubleshooting
/api/ssereturns 404 — expected. Only streamable HTTP at/api/mcpis enabled; point older SSE-only clients elsewhere or upgrade them.- Client insists on authentication — there is none. Leave token and OAuth fields blank.
- A tool returns a "couldn't look that up" message — that's the friendly error path, safe to show the customer. Check the arguments first (valid state code? real slug?) before assuming an outage.