AdvancedMD MCP server icon

AdvancedMD

by AdvancedMD

HIPAA CompliantSOC2 ReadyISO 27001 Ready
Healthcare21 tools

Look up patients, find open slots, book appointments, and work denials and remittances in AdvancedMD from your AI agent. 21 tools, OAuth sign-in, works with any MCP client.

Agentman Certified

Built and operated by Agentman.

Connection checked by Agentman on .

Not listed in Anthropic’s Connectors Directory, which covers third-party connectors.

Connect AdvancedMD via MCP

https://mcp.agentman.ai/advancedmd/mcp

Works in any MCP-compatible client. In Agentman Studio it is one click — no config file to edit.

Use in Agentman

Connect AdvancedMD once and your agents call these tools on their own — on a schedule, in a workflow, with nobody at the keyboard.

Open in Agentman Studio

AdvancedMD Tools & Capabilities (21)

get_date_visitsRead-only

List all visits/appointments for a specific date, with the unique patients scheduled that day. This tool reads the AdvancedMD schedule for one date and returns the deduplicated set of patients (with their insurance coverage). It does NOT create, modify, or cancel anything. Args: - date (string): The date to query, in MM/DD/YYYY or YYYY-MM-DD format (required) - include_ssn (boolean): If true, return full SSNs; default false masks to last 4 digits - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: { "date_inferred": string | null, // Server-reported timestamp for the query "visit_count": number, // Total visits on the date "patient_count": number, // Unique patients (after deduplication) "patients": [ { "patient_id": string, "name": string, "ssn": string, // Masked unless include_ssn is true "insurances": [ ... ] // Insurance/subscriber fields } ] } Note: patients here carry name + ssn only — this endpoint's parser does not populate demographics (firstName/dateOfBirth/…) or responsibleParty. Call get_patient with a patient_id for the full demographics + guarantor + insurance shape. Examples: - Today's visits: {"date": "10/17/2025"} - ISO date, JSON output: {"date": "2025-10-17", "response_format": "json"} - With full SSNs: {"date": "10/17/2025", "include_ssn": true} Error Handling: - Returns AUTH_REQUIRED if AdvancedMD credentials are not configured - Returns API_ERROR on upstream failures

get_patientRead-only

Get full demographics, guarantor, and insurance coverage for a single AdvancedMD patient by ID. This tool reads one patient's demographics, responsible party (guarantor), and insurance/subscriber coverage. It does NOT modify the patient. Args: - patient_id (string): The AdvancedMD patient ID (required) - include_ssn (boolean): If true, return full SSNs (patient, guarantor, and subscribers); default false masks each to last 4 digits - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns (JSON format). Identity/demographic fields are OMITTED when AdvancedMD has no value, so expect a subset of the keys below. All values are strings unless noted. { "patient_id": string, "name": string, // "LAST,FIRST MIDDLE" "firstName": string, "lastName": string, "middleName": string, "dateOfBirth": string, // date-only "YYYY-MM-DD" "gender": string, // AMD sex code, e.g. "M" | "F" "address1": string, "address2": string, "city": string, "state": string, "zipCode": string, "homePhone": string, "workPhone": string, "email": string, "chartNumber": string, "title": string, "maritalStatus": string, // raw AMD lookup code, NOT a label "ssn": string, // masked unless include_ssn is true "changed_at": string, // NOT populated by get_patient (always empty) "created_at": string, // NOT populated by get_patient (always empty) "responsibleParty": { // guarantor / billing party; separate from insurances. Present only when AMD has one. "id": string, "name": string, "accountNumber": string, "dateOfBirth": string, // "YYYY-MM-DD" "gender": string, "ssn": string, // masked unless include_ssn is true "address1": string, "address2": string, "city": string, "state": string, "zipCode": string, "homePhone": string, "email": string }, "insurances": [ // one entry per coverage, ordered by sequenceNumber { "id": string, // plan/coverage id (the id the eligibility flow needs) "sequenceNumber": string, // coverage order ("1" primary, "2" secondary, ...) "coverage": string, // raw AMD lookup code, NOT a label "effectiveStartDate": string, // "YYYY-MM-DD" "effectiveEndDate": string, // "YYYY-MM-DD" "subIdNumber": string, // member id — opaque string, leading zeros are significant "subRelationship": string, // raw AMD lookup code, NOT a label "subHipaaRelationship": string, // raw X12 relationship code, NOT a label "copayDollarAmount": string, // only one of copayDollarAmount / copayPercentageAmount is set "copayPercentageAmount": string, "annualDeductible": string, "deductibleAmountMet": string, "yearEndMonth": string, "lifetimeBenefit": string, "carrier": string, "carName": string, "carCode": string, "carAddress1": string, "carAddress2": string, "carCity": string, "carState": string, "carZipCode": string, "groupName": string, "groupNumber": string, "subFullName": string, "subDOB": string, // subDOB "YYYY-MM-DD" "subGender": string, "subSSN": string, // subSSN masked unless include_ssn is true "subAddress1": string, "subAddress2": string, "subCity": string, "subState": string, "subZipCode": string, "subHomePhone": string, "subEmail": string } ] } Notes: - Date fields (dateOfBirth, effectiveStartDate/EndDate, subDOB, responsibleParty.dateOfBirth) are date-only "YYYY-MM-DD" with no time component. - coverage, subRelationship, subHipaaRelationship, and maritalStatus are RAW AdvancedMD lookup codes, not human labels — treat them as codes and map them yourself if a display string is needed. - changed_at / created_at are part of the shape but are NEVER populated by get_patient (the demographics response has no patient-level timestamps) — do not depend on them. - subIdNumber (member id) is an opaque string; preserve it verbatim, including leading zeros. Examples: - Get a patient: {"patient_id": "12345"} - JSON with full SSNs: {"patient_id": "12345", "include_ssn": true, "response_format": "json"} Error Handling: - Returns NOT_FOUND if the patient ID does not exist - Returns AUTH_REQUIRED if AdvancedMD credentials are not configured - Returns API_ERROR on upstream failures

search_patientsRead-only

Search for AdvancedMD patients by a single criterion. AdvancedMD's patient lookup is intended to be used with ONE criterion at a time (name, phone, chart, SSN, DOB, or visit). Provide first_name/last_name together to search by name. This tool reads only; it does NOT modify data. Matching is PREFIX-based by default; prefix a name value with % for a contains match (e.g. last_name "%son" finds Johnson and Larson). AMD returns at most 50 results per lookup — if you hit 50, narrow the criterion. Args (provide one primary criterion): - first_name (string): Patient first name (combined with last_name for name search) - last_name (string): Patient last name - date_of_birth (string): DOB in MM/DD/YYYY or YYYY-MM-DD format - ssn (string): Patient SSN - chart_id (string): Patient chart number - phone (string): Patient / responsible-party home phone - visit (string): A visit number associated with the patient - exact_match (boolean): If true, only exact name matches (default false = prefix match) - include_ssn (boolean): If true, return full SSNs; default false masks to last 4 digits - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: { "count": number, "patients": [ { "patient_id": string, "name": string, "ssn": string, // Masked unless include_ssn is true "insurances": [ ... ] } ] } Note: search results carry name + ssn only — this lookup does not populate demographics (firstName/dateOfBirth/…) or responsibleParty. Call get_patient with a resulting patient_id for the full demographics + guarantor + insurance shape. Examples: - By name: {"last_name": "Smith", "first_name": "John"} - By chart: {"chart_id": "ABC123"} - By DOB, JSON: {"date_of_birth": "1980-05-01", "response_format": "json"} Error Handling: - Returns INVALID_PARAMS if no search criterion is provided - Returns AUTH_REQUIRED if AdvancedMD credentials are not configured - Returns API_ERROR on upstream failures Note: member_id search is not supported by AdvancedMD (no server-side lookup); a client-side member_id filter is a planned follow-up (PLAN.md §5).

identify_patientRead-only

Identify a caller for a voice/phone workflow. Phone-first, but any single strong criterion works (name, date of birth). This is the FIRST step of most voice interactions: verify who is on the line before doing anything with their PHI. It returns: - status "identified" with a single patient when there is a confident match - status "ambiguous" with a short candidate list and a disambiguation hint (e.g. "ask for date of birth") when several patients match - status "not_found" when nothing matches Args: - phone (string): Caller's phone number (primary identifier for inbound calls) - first_name / last_name (string): Caller name - date_of_birth (string): DOB (MM/DD/YYYY or YYYY-MM-DD) — strong disambiguator - include_ssn (boolean): default false masks SSN to last 4 - response_format ('markdown' | 'json') Always verify identity with a second factor (e.g. date of birth) before reading back any clinical or billing detail.

get_scheduler_setupRead-only

Get the practice's scheduler configuration: providers, columns, and facilities — with the IDs the other scheduler tools need. Call this FIRST when working with the schedule. get_appointments, find_appointment_slots, and book_appointment all require provider ids and/or column ids, and this is how you discover them. Read-only. Args: - response_format ('markdown' | 'json') Returns: - providers: [{ id, code, name, setting }] — profile ids (e.g. "prof3") to book against a provider; the numeric part (3) is what the REST scheduler calls use - columns: [{ id, name, profile, setting }] — bookable-lane ids (e.g. "col2") and their owning provider - facilities:[{ id, code, name }] - pages: [{ id, name, columns }] — scheduler views grouping columns (e.g. one page per office wing) Each setting (null when AMD sends none) carries the working schedule: start/end work hours, slot interval in minutes, workweek (7-char bitmask, Monday first: "1111100" = Mon-Fri, "0000010" = Saturday only), maxapptsperslot, and autoholddays. Use it to know a provider's working days and slot grid BEFORE probing find_appointment_slots. Use a provider's numeric id as provider_ids, and a column's numeric id as column_id, in the other scheduler tools.

get_appointmentsRead-only

List scheduled appointments from a start date, with provider, facility, time, status, and confirmation state. Use this to answer "when is my next appointment?", to read back an upcoming visit, or to drive appointment-reminder / check-in flows. Read-only. AdvancedMD scopes the schedule by provider or column, so you must pass EITHER provider_ids OR column_id (not neither) — otherwise the query is rejected. Args: - start_date (string): First date to include (MM/DD/YYYY or YYYY-MM-DD) (required) - end_date (string): Last date to include, inclusive (optional — omit for a single-day read). With column_id the tool reads each day in the range and merges (AMD's day view is single-day; max 31 days, one AMD call per day). With provider_ids the range is passed to AMD directly. - provider_ids (string[]): One or more provider ids (provider-list view) - column_id (number): A scheduler column id (column/day view) — alternative to provider_ids - facility_id (number): Scope to one facility (optional) - response_format ('markdown' | 'json') Returns appointment records: start time, provider, facility, status, and confirmation/check-in timestamps.

get_patient_balanceRead-only

Get a patient's outstanding balance and a transaction summary. Answers billing questions like "what do I owe?" by summarizing the patient's charge/payment history into an estimated patient-responsible balance. Read-only. Args: - patient_id (string): The AdvancedMD patient ID (required) - response_format ('markdown' | 'json') Returns the outstanding patient balance plus the insurance and total balances, with the underlying payment/write-off totals. Sums are computed from the FULL transaction ledger (all pages — a single-page read undercounts multi-page patients). Direct the caller to the billing office for an authoritative statement.

find_appointment_slotsRead-only

Find bookable open appointment slots (availability), searching forward from a start date so the first results are the NEXT available openings. Use this to answer "when's the next opening?" and to offer a caller specific times. Read-only — it finds openings but does NOT book anything (use book_appointment for that). Args: - start_date (string): Earliest slot to consider (MM/DD/YYYY, YYYY-MM-DD, or ISO date-time) (required) - end_date (string): Latest slot to consider (optional window bound) - provider_ids (number[]): Provider profile ids to search - column_ids (number[]): Scheduler column ids to search - duration (number): Desired appointment length in minutes - days_of_week (string): 7-char Sun..Sat mask, e.g. '0111110' = weekdays - limit (number): Max openings to return (default 5) - response_format ('markdown' | 'json') Each returned slot carries the start time, column id, provider profile id, and duration — the fields book_appointment needs.

book_appointmentActs

Book (create) a new appointment. This is a WRITE that creates a real appointment in the practice schedule. Two-stage safety: 1. confirm=false (default) → returns a PREVIEW of exactly what would be booked, writing nothing. Read this back to the caller to confirm. 2. confirm=true → attempts the booking. If the server is not authorized to write (WRITES_ENABLED off) it still only previews and says so — nothing is created. Args (get column_id / profile_id / start_datetime / duration from a find_appointment_slots result): - patient_id (number): Patient to book for (required) - column_id (number): Scheduler column id (required) - start_datetime (string): ISO 'YYYY-MM-DDThh:mm' (required) - duration (number): Minutes (required) - profile_id (number): Provider profile id (required) - appointment_type_id (number): Appointment type id (required) - facility_id (number): Facility id (optional) - referral_plan_id (number): Referral plan to link to the appointment (optional) - is_telemedicine (boolean): Book as a telehealth appointment (optional) - confirm (boolean): Must be true to actually book (default false = preview) - response_format ('markdown' | 'json') On a conflict (slot taken, outside work-times, inactive provider, over a block, slot full) the tool returns a CONFLICT error naming the specific cause, so you can offer another slot.

get_charge_denialsRead-only

Get every payer adjustment on a patient's charges, with the payer's own reason code (CARC). It answers "why wasn't this claim paid in full?" Each row is one adjustment — the charge, the CPT, the payer, the check it came on, and the reason code with its dollar amount. SCOPE — this is the PAID-CLAIMS view, a floor rather than a total. AdvancedMD attaches reason codes only to posted payments, so a claim the payer fully denied ($0 paid) posts no payment record and does NOT appear here at all. Verified against a practice's real remittances, that blind spot hid ~98% of the appealable dollars. The denials this view cannot see live in the remittances themselves: list them with get_era_reports and read the denied lines (CARC + RARC) with get_era_report. Pair with get_suspect_claims to find claims that may have no remittance at all. Args: - patient_id (string): The AdvancedMD patient ID (required) - since (string, optional): Only adjustments adjudicated on/after this date. Filters on when the payment POSTED, not the date of service — so a recent denial on an old visit is still included. - include_voided (boolean): Include reversals/takebacks. Default false. - response_format ('markdown' | 'json') Each adjustment carries a 'group' — the CARC prefix (CO = contractual obligation, PR = patient responsibility, OA = other adjustment, PI = payer initiated, CR = correction). Interpreting which codes are appealable is left to you: CO-45 is a contractual write-off you cannot appeal, while CO-5 / CO-11 / CO-197 are coding or authorization denials that often can be. Use get_adjustment_codes to look up any code's description. Reads all pages of transaction history (a single-page read undercounts by roughly half). Read-only.

get_suspect_claimsRead-only

Find charges that look DENIED or stalled but carry no reason code — the denials get_charge_denials cannot see. Use this alongside get_charge_denials and the ERA tools, not instead of them. They find different things: - get_charge_denials → claims the payer PAID or adjusted, with the CARC code explaining why - get_era_report → the remittance itself: denied lines with CARC + RARC (why the payer refused) - get_suspect_claims → claims with NOTHING posted — the limbo population: denied with an unposted ERA, stalled, or never billed Why the gap exists: AdvancedMD attaches reason codes only to posted payments. A fully denied line pays $0.00, posts no payment record, and so carries no CARC code. Verified against real remittances, this blind spot hid roughly 85% of a practice's appealable denials. Args: - patient_id (string): The AdvancedMD patient ID (required) - min_age_days (number): Days a claim must have aged before counting as stalled. Default 30. - include_voided (boolean): Include voided charges. Default false. - with_submission_history (boolean): Also fetch how many times each claim was submitted/rebilled. Costs one extra API call per claim — off by default. Turn it on when building a worklist. - max_enrich (number): Cap on enriched claims (default 10), highest balance first. - response_format ('markdown' | 'json') Each claim carries one or more 'reasons': - era_pending_unposted A remittance has ARRIVED but is not posted to the ledger. Strongest signal — the payer has already decided; read the ERA/EOB to learn the reason. - billed_aged_unpaid Billed, aged past the threshold, insurance still owes the full amount, nothing posted. Either denied, lost, or ignored. - billable_never_billed Billable but never submitted — a dropped claim, and pure lost revenue. - resubmitted_still_unpaid Submitted or rebilled more than once and still unpaid. Only appears with with_submission_history. Strong signal: staff have already chased this and the payer still has not paid. IMPORTANT — what this tool cannot tell you: it identifies WHICH claims are stuck, never WHY. The reason codes that explain a denial (e.g. CARC CO-251 with remark N479, "missing primary payer EOB") exist only in the ERA/835 remittance — and this server now reads those: use get_era_reports to find the remittance covering the claim's window (include_archived=true for anything older than ~3.5 weeks; the archive reaches back years) and get_era_report to read the denied lines. For 'era_pending_unposted' claims the payer has already decided — the ERA holds the answer. For the rest, a remittance may not exist at all (lost or ignored claims); that no-ERA population is what this tool alone can surface. Treat these as leads to investigate, not confirmed denials — a claim may also be legitimately pending with a slow payer. Reads all pages of transaction history in both AMD views. Read-only.

get_era_reportsRead-only

List the electronic-remittance / clearinghouse reports AdvancedMD has received — the store where the ERAs (EOBs) live. This is the discovery half of the ERA pair: find report ids here, then read one with get_era_report. The store holds more than remittances — measured titles include "Change Healthcare EOB Report" (CPX primary EOBs), "Change Healthcare Forwarded Carrier EOB Report" (CPR secondary/forwarded copies), "Payor Claim Data", and "Payor Claim Rejections" (front-end rejections that never reached adjudication). Filter by title when you only want EOBs. Retention (measured on a live tenant, 2026-08): AMD auto-archives reports ~3.5 weeks after receipt — they are NOT deleted. The archive reaches back to 2022-07 (~6,500 reports), so there is no retention cliff; pass include_archived=true to see anything older than ~3.5 weeks (costs a second API call). Args: - from_date (string): Start of the date-RECEIVED window, MM/DD/YYYY or YYYY-MM-DD. Date-only — AMD rejects a time component. (required) - to_date (string): End of the window, inclusive. Date-only. (required) - title (string, optional): Filter by report title, e.g. 'EOB Report'. - report_text (string, optional): Server-side full-text search inside report text (slower). - include_archived (boolean): Also query the archive. Default false. - limit (number): Max rows, newest first (default 100). - response_format ('markdown' | 'json') Each row: id (pass to get_era_report), title, date_received, read, parsed, archived. 'read' means something already fetched the report's text — get_era_report does this too, and it is biller-visible (see that tool's warning). 'parsed' means AMD's own posting pipeline consumed the report. Listing is side-effect free; only fetching text flips 'read'. Read-only.

get_era_reportRead-only

Fetch one received remittance report by id and parse it into claims and service lines — the only per-line source of denial reasons (CARC + RARC) in AdvancedMD. The report text is NOT raw X12 835 — the store holds fixed-width clearinghouse renderings. Two layouts parse (verified against a practice's full retrievable history): CPX425 "EOB Report" (primary EOBs — adjustment amounts printed, line-level RARCs) and CPR401 "Forwarded Carrier EOB" (stacked CARCs without amounts, claim-level RARCs, per-row check numbers). Other titles return parse_supported=false — read those with include_raw_text=true. SIDE EFFECT — fetching flips the report's 'read' flag in AMD's Claim Center EDI-Reports screen (measured: 841/841 flipped; there is no un-read API). Billers can see this. Get practice sign-off before sweeping reports staff haven't opened. A line is 'denied' when the payer paid $0.00 with no allowed amount — the population get_charge_denials structurally cannot see. CAUTION on counting: CPR forwarded/secondary reports repeat the SAME adjudication the CPX primary EOB carries — counting both inflates denial totals. Count denials from CPX ("EOB Report") rows; treat CPR rows as corroboration or secondary-payer detail. Args: - report_id (string): From get_era_reports. (required) - denied_only (boolean): Only claims containing a denied line — and only the denied lines of those claims. Default false. - claim_offset / claim_limit (number): Claim-level pagination — full remittances overflow the 25,000-char response limit. next_claim_offset tells you where to resume; null means done. - include_raw_text (boolean): Return raw text instead of parsing, paged in 20,000-char chunks via raw_offset. Default false. - raw_offset (number): Character offset into the raw text. Default 0. - response_format ('markdown' | 'json') Parsed output groups lines into claims (patient, account, ICN, claim status — CLP02-style: 1/2/3 processed, 4 denied, 19 forwarded, 22 reversal). Each line carries CPT+modifiers, DOS, billed/allowed/deduct/coins/paid, CAS adjustments (group + CARC + amount), RARC remarks, the denied flag, and a dedup_key — duplicate remittances are real; identical dedup_keys across reports are the same line delivered twice. Read-only against the ledger, but note the read-flag side effect above.

get_adjustment_codesRead-only

Look up the practice's code tables — adjustment reasons (CARC), remark codes (RARC), write-off codes, and payment codes. Use this to turn a code from get_charge_denials into a description, and to decide for yourself which codes are appealable. Args: - type ('carc' | 'rarc' | 'writeoff' | 'payment'): which table (required) carc — adjustment reason codes: why an amount was not paid rarc — remittance remark codes: extra detail on an adjustment writeoff — the practice's own write-off/adjustment codes payment — payment method codes (e.g. PI = insurance, PP = patient) - search (string, optional): substring filter on code or description - response_format ('markdown' | 'json') Important: these are the PRACTICE's code tables, not the canonical X12 lists. The practice can add and edit entries, so some codes are local (not standard CARC) and some descriptions are placeholders like "DESCRIPTION NOT PROVIDED IN ERA". Treat descriptions as hints, not authoritative definitions. (Of the four underlying endpoints, AMD's Jan 2026 API doc officially documents 'carc' and 'payment'; 'rarc' and 'writeoff' work live but remain undocumented and could change without notice.) Read-only.

get_transaction_historyRead-only

Get a patient's full financial ledger — every charge with its payments, write-offs, balances, and aging. Answers "what's actually outstanding, and what happened to this claim?" Each charge carries its CPT, fee, what was paid, the insurance and patient balances, how many days old it is, and the nested payments (with payer reason codes) and write-offs. Args: - patient_id (string): The AdvancedMD patient ID (required) - from_date / to_date (string, optional): filter by DATE OF SERVICE (not adjudication date) - include_voided (boolean): include voided charges/payments. Default false. - response_format ('markdown' | 'json') Use this for balance and aging questions. If you only need the payer adjustment reasons, get_charge_denials is the same data projected to one row per reason code — call one or the other, not both. To find claims at risk of timely-filing expiry, filter the result for charges where is_billed is true, insurance_balance > 0, and age_days is large. Reads all pages. Read-only.

get_charge_detailRead-only

Get the full billing detail on one charge: the CPT and ICD-10 codes as filed, plus the adjudication result. This is the richest per-charge record. A coding agent audits the codes; a denial agent measures the gap between what was billed and what the payer allowed. Args: - charge_id (string): The AdvancedMD charge ID (required — get one from get_transaction_history or get_charge_denials) - response_format ('markdown' | 'json') Returns the procedure (CPT + modifiers + units), every diagnosis (ICD-10), the billed amount vs. allowed vs. expected, insurance/patient balances and portions, and claim/billing metadata (claim id, date billed, place of service). Field population depends on the claim's age: 'allowed' and 'expected' appear once the payer adjudicates, while 'writeoff_code' and 'claim_id' are often still empty on recently-billed charges. Read-only.

get_claim_statusRead-only

Ask the payer for the live status of a submitted claim (a real-time 276/277 query). Use this for claims that were billed but never paid — it answers "has the payer received this, and what are they doing with it?" Args: - visit_id (string): The AdvancedMD visit ID for the claim (required) - payer_code (string): The carrier code to query, e.g. 'MEDNO' (required — get it from get_charge_denials 'payer_code' or a charge's carrier) - response_format ('markdown' | 'json') Returns the payers on the claim (with policy number and last-billed date) and any status rows, each with a category code, status code, their descriptions, the payment amount, and the payer's internal control number (ICN). Two caveats: this queries the payer in real time, so it is slower than the other billing tools — call it for one claim at a time, never across a list. And not every payer supports electronic status; some return "cannot provide further status electronically". An empty status list means the payer returned no status rows — it does NOT confirm the claim is paid or resolved; check the balance via get_transaction_history before drawing that conclusion. A failed lookup raises an error rather than returning an empty list. Read-only.

get_encountersRead-only

Get a patient's encounter history — the timeline of their visits. Use this to see what care a patient has received and when: the date, the provider, the visit type (e.g. 'DM CONS F/U', 'CONSULTATION'), and whether the encounter is signed. Args: - patient_id (string): The AdvancedMD patient ID (required) - response_format ('markdown' | 'json') Returns historical encounters, not just upcoming appointments. Pair with get_clinical_note_summaries to find the notes attached to that care. Read-only.

get_clinical_documentsRead-only

List the documents in a patient's chart, optionally filtered by term strings you supply. This tool holds no vocabulary of its own — you decide what to look for. Pass types: ['authorization','pre-auth'] to find prior-auth paperwork, ['lab','path report'] for results, ['discharge'] for hospital summaries. Terms match case-insensitively against each document's name, description, and type. Omit types to list everything. Args: - patient_id (string): The AdvancedMD patient ID (required) - types (string[], optional): your filter terms (max 20) - response_format ('markdown' | 'json') Each document reports which of your terms matched, plus its type, date, status, and whether it has been signed or reviewed. Read-only.

get_clinical_note_summariesRead-only

List a patient's clinical notes by header only — id, title, date — without pulling the note text. Use this first to find the note you want, then call get_clinical_note with its id to read the content. Scanning headers is far cheaper than fetching every note. Args: - patient_id (string): The AdvancedMD patient ID (required) - response_format ('markdown' | 'json') Read-only.

get_clinical_noteRead-only

Read one clinical note's full content by id. Args: - note_id (string): The note ID (required — get it from get_clinical_note_summaries) - response_format ('markdown' | 'json') Returns the note's text with its sections preserved, plus the note type, service date, author, and whether it is signed. AdvancedMD stores notes as templated pages and controls; this flattens them into readable text. Read-only.

Read from the server on 2026-09-07, including each tool's own safety annotations.

Frequently asked questions

One tool does. book_appointment creates a real appointment in AdvancedMD and is the only tool declared as acting rather than read-only. The other twenty read: demographics, balances, appointments, claims, remittances, encounters and clinical notes. Nothing cancels or reschedules an existing appointment, and nothing edits a chart, a charge or a claim.

Yes, and that is the point of several tools. get_clinical_note returns a note's full content, get_clinical_documents lists chart documents, and get_patient returns demographics and insurance coverage. Treat every response as protected health information: the connector inherits whatever access the authorised AdvancedMD login already has, and applies no additional filtering of its own.

Start with get_charge_denials, which returns every payer adjustment on a patient's charges together with the payer's own reason codes. Use get_suspect_claims to catch the harder case: charges that look denied or stalled but carry no reason code at all, which conventional denial reports miss because there is nothing to group them under.

Yes. get_claim_status issues a real-time 276/277 query, so the answer comes from the payer rather than from AdvancedMD's stored copy. That distinction matters when a claim's local status is stale. Remittance data arrives separately through get_era_reports and get_era_report, which list and parse the electronic remittance advice the clearinghouse has returned.

By calling find_appointment_slots first, which returns genuinely bookable open availability searching forward from a date, then passing a returned slot to book_appointment. Booking without checking availability risks writing into a slot that is not open. get_scheduler_setup supplies the providers, columns and facilities that both calls need.

Sources

  • Live tools/list handshake against https://mcp.agentman.ai/advancedmd/mcp — 21 tools, 7 September 2026
  • Live prompts/list and resources/list probes — -32601 method not found, 7 September 2026
  • The server's own RFC 9728 descriptor at /.well-known/oauth-protected-resource — 7 September 2026

Server Info

Category
Healthcare
Developer
AdvancedMD
Tools
21
Domain
mcp.agentman.ai

Using Claude Desktop or another MCP client? Setup docs — the connection URL above works anywhere.

Ready to connect AdvancedMD?

Connect AdvancedMD once and your agents call these tools on their own — on a schedule, in a workflow, with nobody at the keyboard.