Browser

myatriumhealth-mcp

Try it

Read MyAtriumHealth (Atrium Health's Epic MyChart patient portal) — test results, medications, allergies, immunizations, health issues, visits, goals — from a shell with the fpx CLI (@fetchproxy/cli), by relaying requests through your signed-in Chrome tab. Use when you want your MyChart data in a script or one-shot without running the myatriumhealth-mcp server.

What it does

Read MyAtriumHealth (Atrium Health's Epic MyChart patient portal) — test results, medications, allergies, immunizations, health issues, visits, goals — from a shell with the fpx CLI (@fetchproxy/cli), by relaying requests through your signed-in Chrome tab. Use when you want your MyChart data in a script or one-shot without running the myatriumhealth-mcp server.

The skill document

MyAtriumHealth via fpx

Atrium Health's patient portal is Epic MyChart at my.atriumhealth.org. Its web app talks to a clean JSON API, and this skill drives that same API through your signed-in browser tab.

Why the browser is required: every MyChart cookie is HttpOnly, so the session cannot be read or reproduced outside the browser, and login is MFA-gated. Requests are relayed through the tab; the session cookie is never extracted or stored.

This reads personal health information. It only ever touches the signed-in user's own account.

One-time setup

npm i -g @fetchproxy/cli          # also needs the Transporter Chrome extension

Create the profile with its full scope declared up front — widening scope later invalidates the grant and forces a re-pair:

fpx profile add myatriumhealth --domain atriumhealth.org
fpx profile declare myatriumhealth \
  --cookie '_Host-MyChart_Session' \
  --cookie '__RequestVerificationToken_L215YXRyaXVtaGVhbHRo0' \
  --cookie '_Host-MyChartLocale' --cookie 'MYCPERS' --cookie 'p-MYC-LBPersistence' \
  --capture-header 'cookie@my.atriumhealth.org'

Then sign in to MyAtriumHealth in Chrome and run any command below. The first one prints a pair code — approve it in the Transporter popup. The trust persists.

Use it

source references/mah.sh
mah_signed_in || echo "sign in to MyAtriumHealth in Chrome first"
export MAH_TOKEN="$(mah_token)"      # cache once per shell

mah_api allergies/LoadAllergies | jq '[.dataList[].allergyItem | {name, severe: .isSevere}]'

mah_api [json-body] posts to the modern api/… endpoints (body defaults to {}, which is all most of them need). mah_legacy [querystring] handles the older form-encoded ones (visits).

Every call needs the ASP.NET antiforgery token — mah_token scrapes it from a signed-in page and the helpers attach it. Responses are large (test results 33 KB, medications 30 KB); always project with jq.

See references/endpoints.md for the full endpoint list with ready-to-run, live-verified jq recipes, and references/mah.sh for the helpers.

Check the session, not the status code

MyChart answers an expired session with HTTP 200 whose body is the login page, and the JSON endpoints then quietly return {}. A status check would report success forever. mah_signed_in tests the body — use it when results come back empty. Sessions are short-lived; expect to sign in again between uses.

There is a second, sneakier false green: an empty body. fetchproxy issues requests from inside a tab on the target host, so with no my.atriumhealth.org tab open it relays nothing — and empty text contains no login marker, so a naive "is this the login page?" check reports SIGNED IN for a response that never happened. mah_signed_in checks emptiness first and returns 2 with the real remedy (exit 1 means signed out, 0 means signed in).

Exit codes (fpx)

0 ok · 1 usage · 2 bridge unavailable (extension not connected, or pairing not approved) · 3 bot wall · 4 upstream HTTP error.

Data goes to stdout, pair codes and status to stderr — so | jq stays clean.

Messages

mah_messages [folderTag] reads the Message Center. It is the one endpoint that cannot be called with {}: it needs a five-key body whose PageNonce is the CSP nonce of an /app/* page, and whose externalLoadParams must list the non-local organizations only (filter api/conversations/GetOrganizations on the explicit isLocal flag — passing the local org returns HTTP 500). The helper handles all of that.

api/item-feed/FetchItemFeed still needs parameters that have not been captured.

Related skills

Read a SimplePractice Client Portal (`<practice>.clientsecure.me`) from a shell — appointments, invoices/statements/superbills/receipts, documents to sign, announcements, practice and clinician info — with plain `curl` against its JSON:API, instead of running the simplepractice-mcp server. Sign in headlessly with an emailed magic link, or capture the session cookie from an already-signed-in browser tab with `fpx`. Use when you want Client Portal data without the MCP, in a script, or on a machine where the MCP isn't installed.

Query alltrails.com (trail search, trail detail, reviews, photos, weather, and a signed-in user's saved lists / completed trails / activity feed) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the alltrails-mcp server — one-shot calls through a signed-in browser tab. Use when you want AllTrails data without the MCP, in a script, or on a machine where the MCP isn't installed.

1 installs

Read angi.com (US home-services directory) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the angi-mcp server — find pros by trade and city, read a pro's profile, ratings breakdown and reviews, and list the trade/city taxonomy. Use when you want Angi data without the MCP, in a script, or on a machine where the MCP isn't installed.

1 installs

Read your Jobber Client Hub — the customer portal a service business (pest control, lawn care, HVAC, cleaning) uses to send you appointments, quotes and invoices — from a shell with the fpx CLI (@fetchproxy/cli), instead of running the jobber-mcp server. Use when you want your Jobber data without the MCP, in a script, or on a machine where the MCP isn't installed.

1 installs

Read a SimplePractice Client Portal through the simplepractice-mcp server — upcoming appointments, invoices/statements/superbills/receipts, balance and saved cards, paperwork waiting to be signed, and practice announcements. Use when the user asks about their therapy or healthcare appointments, what they owe a practice, a superbill for insurance, or forms their provider has sent them.

Read Workday HR data (org chart, worker profiles, tasks, pay, benefits, compensation, your app menu) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the workday-mcp server — fetch any *.htmld data endpoint through your own signed-in *.myworkday.com tab (SSO/Ping/Okta/Entra already cleared). Use when you want Workday data without the MCP, in a script, or on a machine where the MCP isn't installed.

1 installs