Mirobody
Lab results to LOINC codes and UCUM units, symptoms and diagnoses to ICPC-3. Offline, no API key.
Description from the maker (original English)
Use an InSync (Qualifacts) patient portal: reads, file transfer, messages and care requests
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
INSYNC_PORTAL, INSYNC_USERNAME, INSYNC_PASSWORD, INSYNC_TRANSPORT, INSYNC_WS_PORT, INSYNC_OUTPUT_DIR, INSYNC_INLINE_DOWNLOADS, FETCHPROXY_WS_HOST, FETCHPROXY_IDENTITY_DIRValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"insync": {
"command": "npx",
"args": [
"-y",
"@chrischall/insync-mcp"
],
"env": {
"INSYNC_PORTAL": "your-value",
"INSYNC_USERNAME": "your-value",
"INSYNC_PASSWORD": "your-value",
"INSYNC_TRANSPORT": "your-value",
"INSYNC_WS_PORT": "your-value",
"INSYNC_OUTPUT_DIR": "your-value",
"INSYNC_INLINE_DOWNLOADS": "your-value",
"FETCHPROXY_WS_HOST": "your-value",
"FETCHPROXY_IDENTITY_DIR": "your-value"
}
}
}
}Run this in your terminal
claude mcp add insync --env INSYNC_PORTAL=your-value --env INSYNC_USERNAME=your-value --env INSYNC_PASSWORD=your-value --env INSYNC_TRANSPORT=your-value --env INSYNC_WS_PORT=your-value --env INSYNC_OUTPUT_DIR=your-value --env INSYNC_INLINE_DOWNLOADS=your-value --env FETCHPROXY_WS_HOST=your-value --env FETCHPROXY_IDENTITY_DIR=your-value -- npx -y @chrischall/insync-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"insync": {
"command": "npx",
"args": [
"-y",
"@chrischall/insync-mcp"
],
"env": {
"INSYNC_PORTAL": "your-value",
"INSYNC_USERNAME": "your-value",
"INSYNC_PASSWORD": "your-value",
"INSYNC_TRANSPORT": "your-value",
"INSYNC_WS_PORT": "your-value",
"INSYNC_OUTPUT_DIR": "your-value",
"INSYNC_INLINE_DOWNLOADS": "your-value",
"FETCHPROXY_WS_HOST": "your-value",
"FETCHPROXY_IDENTITY_DIR": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"insync": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@chrischall/insync-mcp"
],
"env": {
"INSYNC_PORTAL": "your-value",
"INSYNC_USERNAME": "your-value",
"INSYNC_PASSWORD": "your-value",
"INSYNC_TRANSPORT": "your-value",
"INSYNC_WS_PORT": "your-value",
"INSYNC_OUTPUT_DIR": "your-value",
"INSYNC_INLINE_DOWNLOADS": "your-value",
"FETCHPROXY_WS_HOST": "your-value",
"FETCHPROXY_IDENTITY_DIR": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
INSYNC_USERNAME envINSYNC_TRANSPORT envINSYNC_WS_PORT envINSYNC_OUTPUT_DIR envINSYNC_INLINE_DOWNLOADS envFETCHPROXY_WS_HOST envFETCHPROXY_IDENTITY_DIR envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account chrischall, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: INSYNC_PORTAL, INSYNC_PASSWORD
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.3.0) reached the registry 2 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: Mirobody, FHIR MCP Server, Google Health MCP
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Lab results to LOINC codes and UCUM units, symptoms and diagnoses to ICPC-3. Offline, no API key.
MCP server providing seamless access to FHIR APIs for AI tools and healthcare applications
Privacy-first unofficial Google Health API v4 MCP server for health, sleep, activity, HR agents
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
MCP server for an InSync Healthcare (Qualifacts) patient portal — the behavioral-health portals at https:// intouch.insynchcs.com (the owner's is pfbhintouch). It reads appointments, medications, allergies, secure messages, forms, surveys, documents, profile and account balance; downloads portal files; uploads an insurance-card image; and sends secure messages, refill requests, appointment requests and cancellation requests.
This project was developed and is maintained by AI. Use at your own discretion.
It reads personal health information, and only ever from the signed-in user's own account.
This server is not read-only. Alongside the reads it:
readOnly);destructive and confirm-gated (see below);insync_get_message opening an unread message can mark it read, which the practice can see and which has no inverse. That tool is annotated destructive and gated behind allow_mark_read (default false): until you pass it, the tool returns the list-row metadata and a note, and never fetches the detail;destructive, because none can be unsent or withdrawn through this server:| Tool | What it sends | Look up first with |
|---|---|---|
insync_send_message | a new secure message to a practice group | insync_list_message_recipients |
insync_reply_message | a reply to a message (refuses an unread one unless allow_mark_read) | insync_list_messages |
insync_request_refill | a refill request for current medications | insync_get_refill_options |
insync_request_appointment | an appointment request in an open slot (the practice confirms it) | insync_find_appointment_slots |
insync_cancel_appointment | a cancellation request with a reason (the practice reviews it) | insync_list_appointments |
Not built: message attachments and patient signatures on messages, the "flexible window" appointment request, withdrawing a request, payments, and form submission.
| Mode | When | Credentials held |
|---|---|---|
| Bridge-less (default) | INSYNC_USERNAME + INSYNC_PASSWORD set | your portal password, in memory for the process |
| Browser bridge | no credentials configured | none |
Bridge-less signs in server-side with its own cookie jar — no browser, no extension — which is what makes hosting possible. The password login was live-verified on 2026-10-28 against the owner's practice: a single POST to Login/userLogin, no MFA, no device challenge. A rejected sign-in is never retried automatically, because the portal counts failed attempts toward an account lockout. The cookie jar lives in memory for the life of the process; nothing is written to disk.
Browser bridge relays requests through your own signed-in portal tab via the fetchproxy bridge and the ContextMint Bridge extension, reusing that session. It holds no credentials at all — its one virtue — so prefer it unless you specifically want the hosted, bridge-less path.
Selection is automatic: server when both credentials are set, otherwise fetchproxy. INSYNC_TRANSPORT=server|fetchproxy forces one.
The login response carries some object-storage configuration. This server never uses it to talk to object storage directly — all file transfer goes through the portal's own session-authorized endpoints, so every read and write stays under the portal's per-patient authorization. Any such configuration is captured onto the session only, and is scrubbed by value from every tool result, error and log. A download URL is refused unless it stays on *.insynchcs.com.
Every lookup the write tools make — recipients, the reply form, the refill pick lists, facilities, providers, visit types, slots, the cancellation window — was verified live, read-only. The sends are derived from the portal's own JavaScript and partial views. A new message (insync_send_message) and a reply (insync_reply_message) were verified live on 2026-10-28 in owner-supervised tests; the refill, appointment and cancellation sends have not been exercised yet, because each one creates a request the practice acts on. A send that the portal answers with a 5xx, or whose connection drops, is reported as status: "unknown" rather than as an error, so a model checks the matching list before trying again instead of sending twice. See docs/INSYNC-API.md.
The insurance-card upload shape is derived from the portal's own JavaScript and is UNVERIFIED on a live POST: no automated run performs a real upload, because it mutates practice-visible state. An owner-supervised live test confirms it later. The confirm gate, the file vetting and the re-read-after-write guidance are all in place; only the on-the-wire success signal is pending confirmation. See docs/INSYNC-API.md.
Each side of the card arrives by exactly one route: front_path/back_path (a file on this machine — local installs only, refused on a hosted server), front_inline/back_inline ({filename, contentBase64}, for a small image), or front_blob_key/back_blob_key — on a hosted server, call insync_upload_slots for a signed upload URL, PUT the image to it, and pass the returned blobKey. The uploaded copy is deleted only after the portal accepts the card; a rejection or an unconfirmed outcome keeps it.
On a local install a download is written to a private (0600) file and the path returned. On a hosted server it comes back inline when it fits (10 MiB), and otherwise as a short-lived signed download link from the host's blob store — never a path on the runner's disk.
Every write is gated by @chrischall/mcp-utils' confirmWrite, through its defineWrite / registerWrite. The first call sends nothing and returns a preview + a `confirmToken`; only a second call carrying that token — after you approve the preview — sends. The send/request tools may read the portal while previewing (to resolve names and check the slot or recipient); the upload preview reads nothing from the portal. The exact request body (for the upload, the image bytes) and the shown preview (including each image's SHA-256) are bound into the token, so an argument, file or portal state that changed since the preview is refused as DRAFT_CHANGED. MCP_CONFIRM_MODE / MCP_CONFIRM_ELICITATION tune this (see the env table).
{
"mcpServers": { "insync": { "command": "npx", "args": ["-y", "@chrischall/insync-mcp"], "env": { "INSYNC_PORTAL": "https:// intouch.insynchcs.com", "INSYNC_USERNAME": "your-portal-username", "INSYNC_PASSWORD": "your-portal-password" } } } }
Leave INSYNC_USERNAME / INSYNC_PASSWORD out to use the browser bridge instead; that path needs ContextMint Bridge, the fetchproxy browser extension, installed from its releases page, and your portal open and signed in. Then call insync_healthcheck; the first call prints a pair code to approve once in the extension popup.
| Variable | Required | Default | Purpose |
|---|---|---|---|
INSYNC_PORTAL | yes | — | Your practice portal, scheme + host only (https:// intouch.insynchcs.com), no path. The portal is per-practice, so a wrong host reads a different practice. |
INSYNC_USERNAME | bridge-less only | — | Portal username. Set with the password to sign in server-side. |
INSYNC_PASSWORD | bridge-less only | — | Portal password. Never retried on rejection (lockout risk). |
INSYNC_TRANSPORT | no | auto | server or fetchproxy. Default: server when both credentials are set, else fetchproxy. |
INSYNC_WS_PORT | no | 37149 | fetchproxy concentrator port. The whole fleet shares it; override only when hosting. |
INSYNC_OUTPUT_DIR | no | ~/Downloads, ~/Documents | Where downloaded files are written (a path-delimiter list; ~ expands). A per-call dest must resolve inside one of these. |
INSYNC_INLINE_DOWNLOADS | no | false | Local installs: true returns a downloaded file inline (an MCP content block, up to 10 MiB) instead of writing it to disk; a larger file is still saved to disk. A hosted server (detected from MCP_DATA_DIR / the blob store) always delivers inline or by link and ignores this. |
MCP_CONFIRM_MODE | no | ask-user | Confirm-gate mode for every write. ask-user = preview + confirmToken round-trip; auto lets a capable host confirm in one step; an unrecognised value fails closed (refuse). |
MCP_CONFIRM_ELICITATION | no | on | on lets the host confirm a write interactively; off forces the confirmToken round-trip. |
A .env is read for local development; real environment values always win. See .env.example.
Bundled under skills/insync-fpx/ is a lightweight alternative to running this server: the insync-fpx skill reads the same portal from a shell through your signed-in browser tab with the fpx CLI (capture the session once, then curl the endpoints). Use it when you want portal data in a script or without the MCP installed. The MCP is the richer surface; the skill is the quick path.
Every tool except insync_healthcheck publishes a _meta.mint hint (group health) for mcp-host's context groups: inert data to any other client. The three canonical reads — insync_list_appointments (what's on), insync_list_messages (what's new) and insync_list_forms (what's due) — also take view: "brief", one line per item, title — — , inside the untrusted-data envelope. The other view values are unchanged.
The portal is ASP.NET MVC. A signed-out session is never a 401: it is the login page served 200 ( Portal :: Login), an {"isTimeout":true} body, or a 302 to /Login. This server detects that by content and surfaces an actionable "not signed in" error naming the live transport. Every endpoint shape — reads, file transfer and the upload — is documented, keys only (no values, which are PHI), in docs/INSYNC-API.md.
MIT