{
  "data": {
    "similar": [
      {
        "grade": "B",
        "json": "https://www.anchorterminal.com/tools/aidbox.json",
        "name": "Aidbox",
        "score": 64.2,
        "shared": [
          "health.fhir",
          "health.records"
        ],
        "slug": "aidbox"
      },
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/health-gorilla.json",
        "name": "Health Gorilla",
        "score": 59.3,
        "shared": [
          "health.records",
          "health.fhir"
        ],
        "slug": "health-gorilla"
      },
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/redox.json",
        "name": "Redox",
        "score": 58.3,
        "shared": [
          "health.fhir",
          "health.records"
        ],
        "slug": "redox"
      },
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/zus-health.json",
        "name": "Zus Health",
        "score": 56.6,
        "shared": [
          "health.records",
          "health.fhir"
        ],
        "slug": "zus-health"
      },
      {
        "grade": "D",
        "json": "https://www.anchorterminal.com/tools/medblocks.json",
        "name": "Medblocks",
        "score": 52.7,
        "shared": [
          "health.records",
          "health.fhir"
        ],
        "slug": "medblocks"
      },
      {
        "grade": "D",
        "json": "https://www.anchorterminal.com/tools/metriport.json",
        "name": "Metriport Medical API",
        "score": 50.1,
        "shared": [
          "health.records",
          "health.fhir"
        ],
        "slug": "metriport"
      }
    ],
    "tool": {
      "slug": "medplum",
      "name": "Medplum",
      "vendor": "Orangebot, Inc. (dba Medplum)",
      "vendorUrl": "https://www.medplum.com",
      "kind": "http-api",
      "category": "health-data",
      "summary": "Open-source FHIR R4 server and healthcare developer platform from Orangebot, Inc. (dba Medplum). Agents reach patient records through the hosted FHIR REST API at api.medplum.com, a remote MCP server or a self-hosted copy.",
      "url": "https://www.anchorterminal.com/tools/medplum",
      "markdownUrl": "https://www.anchorterminal.com/tools/medplum.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/medplum.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/medplum.json",
      "repo": "https://github.com/medplum/medplum",
      "license": "Apache 2.0 for the server, SDKs and apps in medplum/medplum. The hosted service at api.medplum.com runs under Medplum's terms of service",
      "transports": [
        "http",
        "streamable-http",
        "sse"
      ],
      "remoteUrl": "https://api.medplum.com/mcp/stream",
      "packages": [
        {
          "registry": "npm",
          "name": "@medplum/core"
        }
      ],
      "auth": "oauth",
      "authNotes": "OAuth 2.0 and OpenID Connect. Machine clients use the client credentials grant with a ClientApplication ID and secret created on the Project Admin page, and a POST to https://api.medplum.com/oauth2/token. SMART scopes and AccessPolicy resources limit what each user, bot or client can read or write, including read-only policies. The MCP server uses OAuth with a browser login on first connect. Client assertion, token exchange, on-behalf-of and mTLS are also documented.",
      "pricing": "freemium",
      "pricingNotes": "Hosted plans on medplum.com/pricing (checked 2026-10-14). Free for prototyping, Production $2,000 a month, Premium $6,000 a month, Enterprise by contact. The paid plans include a standard BAA and MSA. Self-hosting the Apache 2.0 server is free. Whether the free plan asks for a card was not established.",
      "priceSummary": "$2000 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs, the pricing page or the repository (checked 2026-10-14).",
        "endpoints": []
      },
      "toolCount": 3,
      "popularity": {
        "githubStars": 2738,
        "npmWeekly": 269965,
        "pypiWeekly": null,
        "asOf": "2026-10-14"
      },
      "docsUrl": "https://www.medplum.com/docs",
      "llmsTxt": "https://www.medplum.com/llms.txt",
      "registryName": "com.medplum/mcp",
      "capabilities": [
        "health.fhir",
        "health.records"
      ],
      "tags": [
        "hosted",
        "open-source",
        "self-hosted",
        "fhir",
        "mcp",
        "oauth",
        "smart-on-fhir",
        "hipaa",
        "soc2",
        "typescript",
        "llms-txt",
        "status-page"
      ],
      "lastRelease": "2026-10-08",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 68.7,
        "grade": "B",
        "agentReady": false,
        "rank": 216,
        "ranked": true,
        "rankOf": 1076,
        "categoryRank": 1,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 73,
          "maintenance": 93,
          "payments": 25,
          "reliability": 75,
          "schema": 82,
          "security": 74,
          "transparency": 72
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "breakdown": [
          {
            "key": "reliability",
            "name": "Reliability",
            "weight": 16,
            "effectiveWeight": 20,
            "score": 75,
            "points": 15,
            "reason": "Read with the hosted lines and scored on the hosted FHIR API at api.medplum.com, which is what an agent would call. The docs name a status page at status.medplum.com with incident history and root cause analyses (20). Its robots.txt disallows every path, so the 90-day record was not read (5). Rate limits are published per IP and tier, with a weighted FHIR interaction quota (15). Every limited response carries a `RateLimit` header with remaining units and reset time, the docs say not to retry before the reset, and conditional create and upsert make writes safe to repeat (15). The docs state a 99.99 per cent monthly SLA with service credits for the production hosted platform (10). The FHIR API is generally available (10)."
          },
          {
            "key": "performance",
            "name": "Performance",
            "weight": 10,
            "effectiveWeight": 0,
            "pending": true,
            "points": 0,
            "reason": "Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes."
          },
          {
            "key": "schema",
            "name": "Schema \u0026 documentation",
            "weight": 13,
            "effectiveWeight": 16.25,
            "score": 82,
            "points": 13.33,
            "reason": "The server generates an OpenAPI 3.1 document (packages/server/src/openapi.ts) and publishes a FHIR CapabilityStatement. The live copies sit on api.medplum.com, which robots.txt disallows, so they were not read (20 of 25). llms.txt indexes 2,600 lines of docs (10). Each FHIR resource and operation has a reference page, and the MCP doc explains when to use each tool (15 of 20). FHIR resources are typed with required fields and value sets, though the MCP tool takes `method` and `path` as free strings and `body` as any JSON (12 of 15). Docs carry curl, TypeScript and Python examples, with errors as FHIR OperationOutcome (12 of 15). Semver and GitHub releases with notes (15). Total 84, less 2 for the loosely typed MCP schema in source, 82."
          },
          {
            "key": "ergonomics",
            "name": "Agent ergonomics",
            "weight": 13,
            "effectiveWeight": 16.25,
            "score": 73,
            "points": 11.86,
            "reason": "FHIR `_count`, `_elements`, `_summary` and `_include` size responses (22 of 25). Cursor and offset paging, chained search and `_filter` (20). Errors are OperationOutcome with HTTP status, and 429s carry the `RateLimit` header (15 of 20). Conditional create and upsert give safe retries, but no idempotency key header and no MCP readOnlyHint or destructiveHint on `fhir-request` (8 of 20). Few required parameters, with the official SDK in TypeScript only and Python shown as raw requests (8 of 15)."
          },
          {
            "key": "security",
            "name": "Security \u0026 auth",
            "weight": 14,
            "effectiveWeight": 17.5,
            "score": 74,
            "points": 12.95,
            "reason": "OAuth 2.0 with client credentials, SMART scopes, client assertion, token exchange and mTLS. Client secrets belong to a ClientApplication that an admin can delete (28 of 30). AccessPolicy resources give read-only access by resource or element, IP access rules and per-member policies. No confirmation step for destructive writes, including through the MCP tool (15 of 20). Records are written by other users and returned to the model, and no prompt-injection guidance was found beyond a caution in the AI coding page (3 of 15). FHIR AuditEvent resources and log streaming on paid plans (12 of 15). security.txt valid with PGP, SOC 2 Type II, advisories published on GitHub, no bug bounty found (16 of 20)."
          },
          {
            "key": "payments",
            "name": "Payments \u0026 pricing",
            "weight": 10,
            "effectiveWeight": 12.5,
            "score": 25,
            "points": 3.13,
            "reason": "Read with the hosted rubric, since the hosted service is what an agent would call. No x402, MPP or L402 (0). Plan prices are public, Production $2,000 and Premium $6,000 a month, with no per-call price (10). A free hosted plan exists for prototyping, and whether sign-up asks for a card was not established (15 of 20). A person registers at app.medplum.com and creates a ClientApplication in a browser (0)."
          },
          {
            "key": "tasks",
            "name": "Task success",
            "weight": 10,
            "effectiveWeight": 0,
            "pending": true,
            "points": 0,
            "reason": "Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored."
          },
          {
            "key": "maintenance",
            "name": "Maintenance \u0026 community",
            "weight": 7,
            "effectiveWeight": 8.75,
            "score": 93,
            "points": 8.14,
            "reason": "v5.2.3 tagged on 8 October 2026 (30). Nine tags between 24 September and 8 October 2026 (20). 571 open issues, with commits landing daily and pull requests reviewed, and Discord plus email support. Reply times were not measured (18 of 25). Listed in the official MCP registry as com.medplum/mcp, and @medplum/core 5.2.3 is current with 269,965 weekly downloads (15). The Build workflow passed on main on 14 October 2026, with CodeQL and OpenSSF Scorecard runs (10)."
          },
          {
            "key": "transparency",
            "name": "Transparency \u0026 trust",
            "weight": 7,
            "effectiveWeight": 8.75,
            "score": 72,
            "points": 6.3,
            "note": "editorial 65, provenance 78",
            "reason": "Apache 2.0 source for the server (30). The privacy policy was last updated on 5 April 2022 and is written for licensed clinicians, the terms on 11 April 2023 grant Medplum a broad licence over user content, and PHI is handled under a BAA. No retention periods were found (12 of 30). A written version policy sets one year active and one year maintenance per major, with security patch deadlines (18 of 20). The docs say hosting runs on AWS across several Availability Zones. No sub-processor list was found (5 of 20)."
          }
        ],
        "assessment": {
          "date": "2026-10-14",
          "basis": "public evidence",
          "confidence": "medium",
          "notes": {
            "ergonomics": "FHIR `_count`, `_elements`, `_summary` and `_include` size responses (22 of 25). Cursor and offset paging, chained search and `_filter` (20). Errors are OperationOutcome with HTTP status, and 429s carry the `RateLimit` header (15 of 20). Conditional create and upsert give safe retries, but no idempotency key header and no MCP readOnlyHint or destructiveHint on `fhir-request` (8 of 20). Few required parameters, with the official SDK in TypeScript only and Python shown as raw requests (8 of 15).",
            "maintenance": "v5.2.3 tagged on 8 October 2026 (30). Nine tags between 24 September and 8 October 2026 (20). 571 open issues, with commits landing daily and pull requests reviewed, and Discord plus email support. Reply times were not measured (18 of 25). Listed in the official MCP registry as com.medplum/mcp, and @medplum/core 5.2.3 is current with 269,965 weekly downloads (15). The Build workflow passed on main on 14 October 2026, with CodeQL and OpenSSF Scorecard runs (10).",
            "payments": "Read with the hosted rubric, since the hosted service is what an agent would call. No x402, MPP or L402 (0). Plan prices are public, Production $2,000 and Premium $6,000 a month, with no per-call price (10). A free hosted plan exists for prototyping, and whether sign-up asks for a card was not established (15 of 20). A person registers at app.medplum.com and creates a ClientApplication in a browser (0).",
            "reliability": "Read with the hosted lines and scored on the hosted FHIR API at api.medplum.com, which is what an agent would call. The docs name a status page at status.medplum.com with incident history and root cause analyses (20). Its robots.txt disallows every path, so the 90-day record was not read (5). Rate limits are published per IP and tier, with a weighted FHIR interaction quota (15). Every limited response carries a `RateLimit` header with remaining units and reset time, the docs say not to retry before the reset, and conditional create and upsert make writes safe to repeat (15). The docs state a 99.99 per cent monthly SLA with service credits for the production hosted platform (10). The FHIR API is generally available (10).",
            "schema": "The server generates an OpenAPI 3.1 document (packages/server/src/openapi.ts) and publishes a FHIR CapabilityStatement. The live copies sit on api.medplum.com, which robots.txt disallows, so they were not read (20 of 25). llms.txt indexes 2,600 lines of docs (10). Each FHIR resource and operation has a reference page, and the MCP doc explains when to use each tool (15 of 20). FHIR resources are typed with required fields and value sets, though the MCP tool takes `method` and `path` as free strings and `body` as any JSON (12 of 15). Docs carry curl, TypeScript and Python examples, with errors as FHIR OperationOutcome (12 of 15). Semver and GitHub releases with notes (15). Total 84, less 2 for the loosely typed MCP schema in source, 82.",
            "security": "OAuth 2.0 with client credentials, SMART scopes, client assertion, token exchange and mTLS. Client secrets belong to a ClientApplication that an admin can delete (28 of 30). AccessPolicy resources give read-only access by resource or element, IP access rules and per-member policies. No confirmation step for destructive writes, including through the MCP tool (15 of 20). Records are written by other users and returned to the model, and no prompt-injection guidance was found beyond a caution in the AI coding page (3 of 15). FHIR AuditEvent resources and log streaming on paid plans (12 of 15). security.txt valid with PGP, SOC 2 Type II, advisories published on GitHub, no bug bounty found (16 of 20).",
            "transparency": "Apache 2.0 source for the server (30). The privacy policy was last updated on 5 April 2022 and is written for licensed clinicians, the terms on 11 April 2023 grant Medplum a broad licence over user content, and PHI is handled under a BAA. No retention periods were found (12 of 30). A written version policy sets one year active and one year maintenance per major, with security patch deadlines (18 of 20). The docs say hosting runs on AWS across several Availability Zones. No sub-processor list was found (5 of 20)."
          },
          "sources": [
            {
              "what": "documentation index for agents",
              "url": "https://www.medplum.com/llms.txt",
              "seen": "2026-10-14"
            },
            {
              "what": "MCP server docs",
              "url": "https://www.medplum.com/docs/ai/mcp",
              "seen": "2026-10-14"
            },
            {
              "what": "MCP server source",
              "url": "https://github.com/medplum/medplum/blob/main/packages/server/src/mcp/server.ts",
              "seen": "2026-10-14"
            },
            {
              "what": "rate limits",
              "url": "https://www.medplum.com/docs/rate-limits",
              "seen": "2026-10-14"
            },
            {
              "what": "uptime and SLA",
              "url": "https://www.medplum.com/docs/uptime",
              "seen": "2026-10-14"
            },
            {
              "what": "version policy",
              "url": "https://www.medplum.com/docs/compliance/versions",
              "seen": "2026-10-14"
            },
            {
              "what": "client credentials",
              "url": "https://www.medplum.com/docs/auth/client-credentials",
              "seen": "2026-10-14"
            },
            {
              "what": "access policies",
              "url": "https://www.medplum.com/docs/access/access-policies",
              "seen": "2026-10-14"
            },
            {
              "what": "conditional create and upsert",
              "url": "https://www.medplum.com/docs/fhir-datastore/working-with-fhir",
              "seen": "2026-10-14"
            },
            {
              "what": "pricing",
              "url": "https://www.medplum.com/pricing",
              "seen": "2026-10-14"
            },
            {
              "what": "security page",
              "url": "https://www.medplum.com/security",
              "seen": "2026-10-14"
            },
            {
              "what": "security.txt",
              "url": "https://www.medplum.com/.well-known/security.txt",
              "seen": "2026-10-14"
            },
            {
              "what": "terms of service",
              "url": "https://www.medplum.com/terms",
              "seen": "2026-10-14"
            },
            {
              "what": "privacy policy",
              "url": "https://www.medplum.com/privacy",
              "seen": "2026-10-14"
            },
            {
              "what": "repository, tags and CI",
              "url": "https://github.com/medplum/medplum",
              "seen": "2026-10-14"
            },
            {
              "what": "security advisories",
              "url": "https://github.com/medplum/medplum/security/advisories",
              "seen": "2026-10-14"
            },
            {
              "what": "official MCP registry entry",
              "url": "https://registry.modelcontextprotocol.io/v0/servers?search=medplum",
              "seen": "2026-10-14"
            },
            {
              "what": "npm downloads",
              "url": "https://api.npmjs.org/downloads/point/last-week/@medplum/core",
              "seen": "2026-10-14"
            }
          ],
          "openQuestions": [
            "unchecked: the incident history at status.medplum.com. Its robots.txt disallows all paths, so it was not fetched",
            "unchecked: the live OpenAPI document and CapabilityStatement on api.medplum.com, whose robots.txt disallows all paths",
            "unchecked: whether the free hosted plan asks for a card at sign-up",
            "unchecked: the domain registration date for medplum.com",
            "GHSA-fjgc-c3pj-xx2c is cited in the MCP source as the reason for an SSRF guard but was not found among the repository's published advisories"
          ]
        },
        "negative": -2,
        "negativeNotes": [
          "2026-07-24: GHSA-m44r-7c5h-m6mj, high severity. The external auth callback accepted redirect URIs that only had to start with a registered one, which could leak authorisation codes cross-origin. Patched in @medplum/core 5.1.6 and disclosed on GitHub (https://github.com/medplum/medplum/security/advisories/GHSA-m44r-7c5h-m6mj). With GHSA-ch8p-j6cm-r7w5 (2 June 2026, client secret exposure in self-hosted dynamic registration), both fixed and disclosed in public, so the deduction is small (-2)."
        ],
        "verdict": "Graded on the hosted FHIR API at api.medplum.com. Rate limits, a `RateLimit` header and a 99.99 per cent SLA are published, AccessPolicy resources allow read-only clients, and an official MCP server sits in the registry. Its main tool can delete records with no annotation, the status page could not be read, and the privacy policy dates from 2022.",
        "bestFor": "An agent working inside a digital health company's own FHIR store, reading and writing patients, observations and appointments under a BAA.",
        "strengths": [
          "Apache 2.0 server with releases about weekly, v5.2.3 on 8 October 2026, and a written version policy",
          "Rate limits published per tier, with a `RateLimit` header giving remaining units and seconds to reset",
          "AccessPolicy resources and SMART scopes allow read-only, per-resource or per-element clients",
          "Official MCP server at api.medplum.com/mcp/stream, listed in the MCP registry as com.medplum/mcp, with OAuth",
          "99.99 per cent monthly SLA with service credits stated for the production hosted platform"
        ],
        "weaknesses": [
          "The MCP `fhir-request` tool can delete or overwrite any resource the token allows, with no readOnlyHint or destructiveHint",
          "The privacy policy was last updated on 5 April 2022 and the terms on 11 April 2023",
          "No sub-processor list or retention periods were found",
          "Two high-severity auth advisories were published and patched in 2026",
          "Official SDK in TypeScript only"
        ],
        "agentNotes": [
          "Use a ClientApplication with an AccessPolicy limited to the resources the task needs, and set `readonly` where no writes are needed",
          "Read the `RateLimit` header and wait for the reset time after a 429. Writes cost 100 quota points, searches 20 and reads 1",
          "Create patients with conditional create (`If-None-Exist`) or upsert on an identifier so a retry doesn't make a duplicate",
          "Pass paths to `fhir-request` relative to the FHIR R4 base, with no leading slash or `/fhir/R4` prefix",
          "Use `Prefer: respond-async` for large bundles. Operations inside the background job don't count against the quota"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 68.7
          }
        ],
        "editorialScores": {
          "ergonomics": 73,
          "maintenance": 93,
          "payments": 25,
          "reliability": 75,
          "schema": 82,
          "security": 74,
          "transparency": 65
        },
        "provenanceScore": 78
      },
      "connect": {
        "install": "npm install @medplum/core",
        "http": "curl -X POST https://api.medplum.com/oauth2/token \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"grant_type=client_credentials\u0026client_id=$MY_CLIENT_ID\u0026client_secret=$MY_CLIENT_SECRET\""
      },
      "letme": {
        "capability": "https://letme.dev/health.fhir",
        "tool": "https://letme.dev/medplum"
      },
      "notable": [
        "The MCP server at https://api.medplum.com/mcp/stream has three tools. `fhir-request` sends any GET, POST, PUT, PATCH or DELETE to the FHIR R4 API, and `search` and `fetch` are stubs kept for ChatGPT compatibility (https://www.medplum.com/docs/ai/mcp)",
        "Rate limits are published per IP (6,000 requests a minute on the free tier, 60,000 on paid) plus a weighted FHIR interaction quota, with a `RateLimit` header on every response (https://www.medplum.com/docs/rate-limits)",
        "The docs state a 99.99 per cent monthly uptime SLA with service credits for the production hosted platform (https://www.medplum.com/docs/uptime)",
        "Two high-severity advisories were published in 2026 and patched, an authorisation code leak in the external auth callback (GHSA-m44r-7c5h-m6mj, 24 July) and a client secret exposure in self-hosted dynamic registration (GHSA-ch8p-j6cm-r7w5, 2 June) (https://github.com/medplum/medplum/security/advisories)",
        "Semver releases about weekly, v5.2.3 on 8 October 2026, with a written version policy of one year active and one year maintenance per major (https://www.medplum.com/docs/compliance/versions)",
        "SOC 2 Type II audit completed, with the report on request, and security.txt valid to February 2027 (https://www.medplum.com/security)"
      ],
      "area": "domain-data",
      "details": [
        {
          "label": "API",
          "value": "FHIR R4 REST at https://api.medplum.com/fhir/R4, with batch and transaction bundles, async bundles (`Prefer: respond-async`), Bulk FHIR export, GraphQL and custom operations. An OpenAPI 3.1 document is generated by the server (packages/server/src/openapi.ts)"
        },
        {
          "label": "MCP server",
          "value": "https://api.medplum.com/mcp/stream (Streamable HTTP) and /mcp/sse. Tools fhir-request, search and fetch. OAuth. Registry name com.medplum/mcp"
        },
        {
          "label": "Rate limits",
          "value": "Per IP per minute, login 5, auth 160, other endpoints 6,000 (free) or 60,000 (paid). FHIR quota points, read 1, search 20, history 10, create, update, patch or delete 100, with a project total of ten times the per-user limit"
        },
        {
          "label": "SLA",
          "value": "99.99 per cent monthly for the production hosted platform, with service credits defined in the customer agreement"
        },
        {
          "label": "Plans",
          "value": "Free, Production $2,000 a month, Premium $6,000 a month, Enterprise by contact. Self-hosted Community free"
        },
        {
          "label": "Versions",
          "value": "Semver, majors yearly in Q4 with one year active and one year maintenance, patches about weekly. Security patches for critical issues within 7 days and high within 14"
        },
        {
          "label": "Certifications",
          "value": "SOC 2 Type II (report on request), standard BAA on paid plans"
        }
      ],
      "unitPrices": [
        {
          "item": "Production plan",
          "unit": "month",
          "usd": 2000,
          "note": "Hosted, BAA included, Growth usage tier"
        },
        {
          "item": "Premium plan",
          "unit": "month",
          "usd": 6000,
          "note": "Hosted, adds lab, medication and HL7 integrations"
        }
      ],
      "provenance": {
        "legalEntity": "Orangebot, Inc.",
        "domain": "medplum.com",
        "domainRegistered": "",
        "endpointOnVendorDomain": true,
        "terms": "https://www.medplum.com/terms",
        "privacy": "https://www.medplum.com/privacy",
        "statusPage": "https://status.medplum.com",
        "changelog": "https://github.com/medplum/medplum/releases",
        "securityTxt": "valid",
        "checked": "2026-10-14",
        "notes": [
          "The pricing and security pages name Orangebot, Inc (dba Medplum).",
          "www.medplum.com/.well-known/security.txt lists security@medplum.com, a PGP key and expires 2027-02-28.",
          "robots.txt on api.medplum.com and status.medplum.com disallows every path for all agents, so the status history and the live OpenAPI document were not read.",
          "The terms of service were last updated 2023-04-11 and the privacy policy 2022-04-05.",
          "The domain registration date was not established."
        ],
        "score": 78,
        "checks": [
          {
            "check": "Legal entity named",
            "value": "Orangebot, Inc.",
            "points": 20,
            "max": 20,
            "state": "ok"
          },
          {
            "check": "Domain age",
            "value": "medplum.com, no registry record we could read",
            "points": 0,
            "max": 15,
            "state": "no"
          },
          {
            "check": "Endpoint on the vendor's domain",
            "value": "api.medplum.com",
            "points": 15,
            "max": 15,
            "state": "ok"
          },
          {
            "check": "Terms of service",
            "value": "read, states 6 of the 7 things a reader expects, and has 1 clause that costs points",
            "points": 7.1,
            "max": 10,
            "state": "part"
          },
          {
            "check": "Privacy policy",
            "value": "read, states 3 of the 8 things a reader expects",
            "points": 6.3,
            "max": 10,
            "state": "part"
          },
          {
            "check": "Status page",
            "value": "status.medplum.com",
            "points": 10,
            "max": 10,
            "state": "ok"
          },
          {
            "check": "Changelog",
            "value": "published",
            "points": 10,
            "max": 10,
            "state": "ok"
          },
          {
            "check": "security.txt",
            "value": "valid",
            "points": 10,
            "max": 10,
            "state": "ok"
          }
        ],
        "policies": [
          {
            "kind": "terms",
            "url": "https://www.medplum.com/terms",
            "state": "read",
            "readAt": "2026-10-14",
            "statedDate": "2023-04-11",
            "words": 7143,
            "points": 7.1,
            "max": 10,
            "expected": [
              {
                "key": "terms.date",
                "label": "Gives the date it was last updated",
                "found": true,
                "quote": "Last Updated: 2023-04-11",
                "says": "Last updated 2023-04-11"
              },
              {
                "key": "terms.law",
                "label": "Names the governing law or courts",
                "found": true,
                "quote": "These Terms and the relationship between you and Medplum shall be governed by the laws of the state of California without regard to its conflict of law provisions.",
                "says": "The law of the State of California"
              },
              {
                "key": "terms.liability",
                "label": "States a limit on its liability",
                "found": true,
                "quote": "TO THE FULLEST EXTENT POSSIBLE BY LAW, OUR MAXIMUM LIABILITY ARISING OUT OF OR IN CONNECTION WITH THE MEDPLUM SERVICE OR YOUR USE OF MEDPLUM CONTENT, REGARDLESS OF THE CAUSE OF ACTION (WHETHER IN CONTRACT, TORT, BREACH OF WARRANTY, OR OTHERWISE), WILL NOT EXCEED $100.",
                "says": "Capped at $100"
              },
              {
                "key": "terms.termination",
                "label": "Says how the agreement or account can be ended",
                "found": true,
                "quote": "You agree that we may terminate your access to the Medplum Service at any time if we are unable at any time to determine or verify your qualifications or credentials."
              },
              {
                "key": "terms.changes",
                "label": "Says how changes to the terms are announced",
                "found": true,
                "quote": "We may revise these Terms at any time by posting an updated version to this web page.",
                "says": "Changes are posted, with no other notice named"
              },
              {
                "key": "terms.use",
                "label": "Lists what users may not do",
                "found": true,
                "quote": "If you do not accept these Terms, you must not use the Medplum Service."
              },
              {
                "key": "terms.sla",
                "label": "Refers to a service level or uptime commitment",
                "found": false
              }
            ],
            "toKnow": [
              {
                "key": "terms.nonotice",
                "label": "Says the terms or the service can change without notice",
                "found": true,
                "quote": "We may change, suspend, or discontinue any aspect of the Medplum Service at any time, including hours of operation or availability of the Medplum Service or any feature, without notice or liability.",
                "costsPoints": true
              },
              {
                "key": "terms.cutoff",
                "label": "Says access can be ended without notice or for any reason",
                "found": true,
                "quote": "We reserve the right to suspend or terminate your account and prevent access to the Medplum Service for any reason, at our discretion."
              },
              {
                "key": "terms.arbitration",
                "label": "Requires arbitration or waives class actions",
                "found": true,
                "quote": "We will use arbitration to resolve any problems, and you cannot join a class action lawsuit or obtain a jury trial for any disputes you have with us related to your use of the Medplum Service."
              },
              {
                "key": "old",
                "label": "Has not been updated for three years or more",
                "found": true,
                "quote": "Last Updated: 2023-04-11"
              }
            ],
            "notes": [
              {
                "date": "2026-10-14",
                "text": "Medplum caps its total liability at 100 US dollars.",
                "quote": "TO THE FULLEST EXTENT POSSIBLE BY LAW, OUR MAXIMUM LIABILITY ARISING OUT OF OR IN CONNECTION WITH THE MEDPLUM SERVICE OR YOUR USE OF MEDPLUM CONTENT, REGARDLESS OF THE CAUSE OF ACTION (WHETHER IN CONTRACT, TORT, BREACH OF WARRANTY, OR OTHERWISE), WILL NOT EXCEED $100."
              },
              {
                "date": "2026-10-14",
                "text": "Users grant Medplum a perpetual licence to use posted content for any purpose, including promoting Medplum.",
                "quote": "However, we may use it for any purpose, including in our marketing materials."
              },
              {
                "date": "2026-10-14",
                "text": "Medical data is archived for seven years from the time it is posted.",
                "quote": "Medical data is archived for 7 years from the time it is posted on Medplum."
              }
            ]
          },
          {
            "kind": "privacy",
            "url": "https://www.medplum.com/privacy",
            "state": "read",
            "readAt": "2026-10-14",
            "statedDate": "2022-04-05",
            "words": 1210,
            "points": 6.3,
            "max": 10,
            "expected": [
              {
                "key": "privacy.date",
                "label": "Gives the date it was last updated",
                "found": true,
                "quote": "Last Updated: 2022-04-05",
                "says": "Last updated 2022-04-05"
              },
              {
                "key": "privacy.collected",
                "label": "Says what personal data is collected",
                "found": false
              },
              {
                "key": "privacy.retention",
                "label": "Says how long data is kept",
                "found": false
              },
              {
                "key": "privacy.processors",
                "label": "Says who else receives the data",
                "found": true,
                "quote": "Except as otherwise disclosed in this Privacy Policy, while you have permitted Medplum to use the information received, Medplum will not share information received from you with third parties unless Medplum has:"
              },
              {
                "key": "privacy.sale",
                "label": "Says whether personal data is sold or shared for advertising",
                "found": false
              },
              {
                "key": "privacy.rights",
                "label": "Says what rights people have over their data",
                "found": true,
                "quote": "You have a right to access, modify, or update information or delete non-required information that Medplum has received about you after you open an account with Medplum and become a user."
              },
              {
                "key": "privacy.contact",
                "label": "Gives a privacy contact",
                "found": false
              },
              {
                "key": "privacy.transfers",
                "label": "Says where data is transferred or stored",
                "found": false
              }
            ],
            "toKnow": [
              {
                "key": "old",
                "label": "Has not been updated for three years or more",
                "found": true,
                "quote": "Last Updated: 2022-04-05"
              }
            ],
            "notes": [
              {
                "date": "2026-10-14",
                "text": "The policy covers physicians' registration data and does not apply to the content of data and files sent through the application.",
                "quote": "It does not apply to the content of the data and files that are transmitted through the Licensed Application."
              }
            ]
          }
        ]
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/medplum.json",
      "live": {
        "slug": "medplum",
        "probe": {
          "target": "https://api.medplum.com/mcp/stream",
          "method": "get",
          "lastAt": "2026-10-14T09:41:57.409301454Z",
          "lastOk": true,
          "lastStatus": 401,
          "lastMs": 255,
          "lastNote": "asks for credentials",
          "authRequired": true,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 256,
          "p95ms24h": 389,
          "samples24h": 17,
          "samples30d": 17,
          "days": [
            {
              "date": "2026-10-14",
              "probes": 17,
              "ok": 17
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.medplum.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-14T08:53:23.189127499Z"
        },
        "updatedAt": "2026-10-14T09:41:57.409301454Z"
      }
    },
    "verify": {
      "accepts": "a page on medplum.com or one of its subdomains, or the README of github.com/medplum/medplum",
      "badgeUrl": "https://www.anchorterminal.com/badges/medplum.svg",
      "body": {
        "slug": "medplum",
        "url": "the page with the badge or the link"
      },
      "docs": "https://www.anchorterminal.com/builders/#verify",
      "effect": "none, it never changes a grade, rank or review",
      "endpoint": "https://www.anchorterminal.com/api/v1/verify",
      "listingUrl": "https://www.anchorterminal.com/tools/medplum",
      "mcpTool": "verify_listing",
      "recheck": "weekly; two failed checks in a row and it lapses, a later pass restores it",
      "snippets": {
        "html": "\u003ca href=\"https://www.anchorterminal.com/tools/medplum\"\u003e\u003cimg src=\"https://www.anchorterminal.com/badges/medplum.svg\" alt=\"Medplum on Anchor Terminal\" height=\"20\"\u003e\u003c/a\u003e",
        "markdown": "[![Medplum on Anchor Terminal](https://www.anchorterminal.com/badges/medplum.svg)](https://www.anchorterminal.com/tools/medplum)",
        "link": "\u003ca href=\"https://www.anchorterminal.com/tools/medplum\"\u003eMedplum on Anchor Terminal\u003c/a\u003e"
      }
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/medplum",
    "json": "https://www.anchorterminal.com/tools/medplum.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/medplum.md",
    "slim": "https://www.anchorterminal.com/tools/medplum.min.md"
  },
  "markdown": "## Overview\n\n**Grade B · 68.7/100 · rank #216 of 1076 · #1 in Health records \u0026 wellness data · not agent-ready · confidence medium**\n\n\n## Assessment\n\nGraded on the hosted FHIR API at api.medplum.com. Rate limits, a `RateLimit` header and a 99.99 per cent SLA are published, AccessPolicy resources allow read-only clients, and an official MCP server sits in the registry. Its main tool can delete records with no annotation, the status page could not be read, and the privacy policy dates from 2022.\n\n## Facts\n\n| Field | Value |\n| --- | --- |\n| Vendor | Orangebot, Inc. (dba Medplum) (https://www.medplum.com) |\n| Kind | HTTP API |\n| Category | Health records \u0026 wellness data (https://www.anchorterminal.com/categories/health-data) |\n| Transport | HTTP, Streamable HTTP, SSE (legacy) |\n| Endpoint | `https://api.medplum.com/mcp/stream` |\n| Auth | OAuth · OAuth 2.0 and OpenID Connect. Machine clients use the client credentials grant with a ClientApplication ID and secret created on the Project Admin page, and a POST to https://api.medplum.com/oauth2/token. SMART scopes and AccessPolicy resources limit what each user, bot or client can read or write, including read-only policies. The MCP server uses OAuth with a browser login on first connect. Client assertion, token exchange, on-behalf-of and mTLS are also documented. |\n| Pricing | Freemium ($2000 / mo) · Hosted plans on medplum.com/pricing (checked 2026-10-14). Free for prototyping, Production $2,000 a month, Premium $6,000 a month, Enterprise by contact. The paid plans include a standard BAA and MSA. Self-hosting the Apache 2.0 server is free. Whether the free plan asks for a card was not established. |\n| x402 | No · No x402, MPP or L402 in the docs, the pricing page or the repository (checked 2026-10-14). |\n| Licence | Apache 2.0 for the server, SDKs and apps in medplum/medplum. The hosted service at api.medplum.com runs under Medplum's terms of service |\n| Tools exposed | 3 |\n| Packages | npm: `@medplum/core` |\n| MCP registry name | `com.medplum/mcp` |\n| Source | https://github.com/medplum/medplum |\n| Docs | https://www.medplum.com/docs |\n| llms.txt | https://www.medplum.com/llms.txt |\n| Last release | 2026-10-08 |\n| GitHub stars | 2,738 (as of 2026-10-14) |\n| npm downloads / week | 269,965 |\n| API | FHIR R4 REST at https://api.medplum.com/fhir/R4, with batch and transaction bundles, async bundles (`Prefer: respond-async`), Bulk FHIR export, GraphQL and custom operations. An OpenAPI 3.1 document is generated by the server (packages/server/src/openapi.ts) |\n| MCP server | https://api.medplum.com/mcp/stream (Streamable HTTP) and /mcp/sse. Tools fhir-request, search and fetch. OAuth. Registry name com.medplum/mcp |\n| Rate limits | Per IP per minute, login 5, auth 160, other endpoints 6,000 (free) or 60,000 (paid). FHIR quota points, read 1, search 20, history 10, create, update, patch or delete 100, with a project total of ten times the per-user limit |\n| SLA | 99.99 per cent monthly for the production hosted platform, with service credits defined in the customer agreement |\n| Plans | Free, Production $2,000 a month, Premium $6,000 a month, Enterprise by contact. Self-hosted Community free |\n| Versions | Semver, majors yearly in Q4 with one year active and one year maintenance, patches about weekly. Security patches for critical issues within 7 days and high within 14 |\n| Certifications | SOC 2 Type II (report on request), standard BAA on paid plans |\n| Capabilities | health.fhir, health.records |\n| Tags | hosted, open-source, self-hosted, fhir, mcp, oauth, smart-on-fhir, hipaa, soc2, typescript, llms-txt, status-page |\n| JSON | https://www.anchorterminal.com/api/v1/tools/medplum.json |\n\n## Score breakdown (methodology v0.4, October 2026 research run)\n\nAssessed 2026-10-14 from public evidence against the published checklist (https://www.anchorterminal.com/benchmark/#checklist). Confidence: medium. Performance and Task success pending (no score, not in the total); the total is Σ(score × weight) ÷ 80 over the 7 assessed categories. \"This run\" is each category's share of the 100 points.\n\n| Category | Weight | This run | Score (0–100) | Points |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% | 20 | 75 | 15.0 |\n| Performance | 10% | pending | pending | n/a |\n| Schema \u0026 documentation | 13% | 16.2 | 82 | 13.3 |\n| Agent ergonomics | 13% | 16.2 | 73 | 11.9 |\n| Security \u0026 auth | 14% | 17.5 | 74 | 12.9 |\n| Payments \u0026 pricing | 10% | 12.5 | 25 | 3.1 |\n| Task success | 10% | pending | pending | n/a |\n| Maintenance \u0026 community | 7% | 8.8 | 93 | 8.1 |\n| Transparency \u0026 trust (editorial 65, provenance 78) | 7% | 8.8 | 72 | 6.3 |\n| Negative events | up to −15 | up to −15 | 2026-07-24: GHSA-m44r-7c5h-m6mj, high severity. The external auth callback accepted redirect URIs that only had to start with a registered one, which could leak authorisation codes cross-origin. Patched in @medplum/core 5.1.6 and disclosed on GitHub (https://github.com/medplum/medplum/security/advisories/GHSA-m44r-7c5h-m6mj). With GHSA-ch8p-j6cm-r7w5 (2 June 2026, client secret exposure in self-hosted dynamic registration), both fixed and disclosed in public, so the deduction is small (-2).  | -2 |\n| **Total** | | | | **68.7 → B** |\n\n### Why each score\n\n- Reliability 75: Read with the hosted lines and scored on the hosted FHIR API at api.medplum.com, which is what an agent would call. The docs name a status page at status.medplum.com with incident history and root cause analyses (20). Its robots.txt disallows every path, so the 90-day record was not read (5). Rate limits are published per IP and tier, with a weighted FHIR interaction quota (15). Every limited response carries a `RateLimit` header with remaining units and reset time, the docs say not to retry before the reset, and conditional create and upsert make writes safe to repeat (15). The docs state a 99.99 per cent monthly SLA with service credits for the production hosted platform (10). The FHIR API is generally available (10).\n- Performance: Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes.\n- Schema \u0026 documentation 82: The server generates an OpenAPI 3.1 document (packages/server/src/openapi.ts) and publishes a FHIR CapabilityStatement. The live copies sit on api.medplum.com, which robots.txt disallows, so they were not read (20 of 25). llms.txt indexes 2,600 lines of docs (10). Each FHIR resource and operation has a reference page, and the MCP doc explains when to use each tool (15 of 20). FHIR resources are typed with required fields and value sets, though the MCP tool takes `method` and `path` as free strings and `body` as any JSON (12 of 15). Docs carry curl, TypeScript and Python examples, with errors as FHIR OperationOutcome (12 of 15). Semver and GitHub releases with notes (15). Total 84, less 2 for the loosely typed MCP schema in source, 82.\n- Agent ergonomics 73: FHIR `_count`, `_elements`, `_summary` and `_include` size responses (22 of 25). Cursor and offset paging, chained search and `_filter` (20). Errors are OperationOutcome with HTTP status, and 429s carry the `RateLimit` header (15 of 20). Conditional create and upsert give safe retries, but no idempotency key header and no MCP readOnlyHint or destructiveHint on `fhir-request` (8 of 20). Few required parameters, with the official SDK in TypeScript only and Python shown as raw requests (8 of 15).\n- Security \u0026 auth 74: OAuth 2.0 with client credentials, SMART scopes, client assertion, token exchange and mTLS. Client secrets belong to a ClientApplication that an admin can delete (28 of 30). AccessPolicy resources give read-only access by resource or element, IP access rules and per-member policies. No confirmation step for destructive writes, including through the MCP tool (15 of 20). Records are written by other users and returned to the model, and no prompt-injection guidance was found beyond a caution in the AI coding page (3 of 15). FHIR AuditEvent resources and log streaming on paid plans (12 of 15). security.txt valid with PGP, SOC 2 Type II, advisories published on GitHub, no bug bounty found (16 of 20).\n- Payments \u0026 pricing 25: Read with the hosted rubric, since the hosted service is what an agent would call. No x402, MPP or L402 (0). Plan prices are public, Production $2,000 and Premium $6,000 a month, with no per-call price (10). A free hosted plan exists for prototyping, and whether sign-up asks for a card was not established (15 of 20). A person registers at app.medplum.com and creates a ClientApplication in a browser (0).\n- Task success: Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored.\n- Maintenance \u0026 community 93: v5.2.3 tagged on 8 October 2026 (30). Nine tags between 24 September and 8 October 2026 (20). 571 open issues, with commits landing daily and pull requests reviewed, and Discord plus email support. Reply times were not measured (18 of 25). Listed in the official MCP registry as com.medplum/mcp, and @medplum/core 5.2.3 is current with 269,965 weekly downloads (15). The Build workflow passed on main on 14 October 2026, with CodeQL and OpenSSF Scorecard runs (10).\n- Transparency \u0026 trust 72: Apache 2.0 source for the server (30). The privacy policy was last updated on 5 April 2022 and is written for licensed clinicians, the terms on 11 April 2023 grant Medplum a broad licence over user content, and PHI is handled under a BAA. No retention periods were found (12 of 30). A written version policy sets one year active and one year maintenance per major, with security patch deadlines (18 of 20). The docs say hosting runs on AWS across several Availability Zones. No sub-processor list was found (5 of 20).\n\nFix list for a coding agent, everything this grade says the listing lacks, the biggest gain first (16 items): https://www.anchorterminal.com/fixes/medplum.md (JSON https://www.anchorterminal.com/fixes/medplum.json)\n\n### What we couldn't check\n\n- unchecked: the incident history at status.medplum.com. Its robots.txt disallows all paths, so it was not fetched\n- unchecked: the live OpenAPI document and CapabilityStatement on api.medplum.com, whose robots.txt disallows all paths\n- unchecked: whether the free hosted plan asks for a card at sign-up\n- unchecked: the domain registration date for medplum.com\n- GHSA-fjgc-c3pj-xx2c is cited in the MCP source as the reason for an SSRF guard but was not found among the repository's published advisories\n\n### Sources\n\n- documentation index for agents: \u003chttps://www.medplum.com/llms.txt\u003e (seen 2026-10-14)\n- MCP server docs: \u003chttps://www.medplum.com/docs/ai/mcp\u003e (seen 2026-10-14)\n- MCP server source: \u003chttps://github.com/medplum/medplum/blob/main/packages/server/src/mcp/server.ts\u003e (seen 2026-10-14)\n- rate limits: \u003chttps://www.medplum.com/docs/rate-limits\u003e (seen 2026-10-14)\n- uptime and SLA: \u003chttps://www.medplum.com/docs/uptime\u003e (seen 2026-10-14)\n- version policy: \u003chttps://www.medplum.com/docs/compliance/versions\u003e (seen 2026-10-14)\n- client credentials: \u003chttps://www.medplum.com/docs/auth/client-credentials\u003e (seen 2026-10-14)\n- access policies: \u003chttps://www.medplum.com/docs/access/access-policies\u003e (seen 2026-10-14)\n- conditional create and upsert: \u003chttps://www.medplum.com/docs/fhir-datastore/working-with-fhir\u003e (seen 2026-10-14)\n- pricing: \u003chttps://www.medplum.com/pricing\u003e (seen 2026-10-14)\n- security page: \u003chttps://www.medplum.com/security\u003e (seen 2026-10-14)\n- security.txt: \u003chttps://www.medplum.com/.well-known/security.txt\u003e (seen 2026-10-14)\n- terms of service: \u003chttps://www.medplum.com/terms\u003e (seen 2026-10-14)\n- privacy policy: \u003chttps://www.medplum.com/privacy\u003e (seen 2026-10-14)\n- repository, tags and CI: \u003chttps://github.com/medplum/medplum\u003e (seen 2026-10-14)\n- security advisories: \u003chttps://github.com/medplum/medplum/security/advisories\u003e (seen 2026-10-14)\n- official MCP registry entry: \u003chttps://registry.modelcontextprotocol.io/v0/servers?search=medplum\u003e (seen 2026-10-14)\n- npm downloads: \u003chttps://api.npmjs.org/downloads/point/last-week/@medplum/core\u003e (seen 2026-10-14)\n\n## Who's behind it (provenance 78/100, checked 2026-10-14)\n\n| Check | Finding | Points |\n| --- | --- | --- |\n| Legal entity named | Orangebot, Inc. | 20/20 |\n| Domain age | medplum.com, no registry record we could read | 0/15 |\n| Endpoint on the vendor's domain | api.medplum.com | 15/15 |\n| Terms of service | read, states 6 of the 7 things a reader expects, and has 1 clause that costs points | 7.1/10 |\n| Privacy policy | read, states 3 of the 8 things a reader expects | 6.3/10 |\n| Status page | status.medplum.com | 10/10 |\n| Changelog | published | 10/10 |\n| security.txt | valid | 10/10 |\n\nThe pricing and security pages name Orangebot, Inc (dba Medplum).\n\nwww.medplum.com/.well-known/security.txt lists security@medplum.com, a PGP key and expires 2027-02-28.\n\nrobots.txt on api.medplum.com and status.medplum.com disallows every path for all agents, so the status history and the live OpenAPI document were not read.\n\nThe terms of service were last updated 2023-04-11 and the privacy policy 2022-04-05.\n\nThe domain registration date was not established.\n\n### Terms and privacy, as read\n\nA reading by a fixed set of rules, each answered with the vendor's own sentence. Not legal advice.\n\n**Terms of service** (https://www.medplum.com/terms), read 2026-10-14, dated 2023-04-11, states 6 of the 7 things a reader expects.\n\n- To know. Says the terms or the service can change without notice (costs points). \"We may change, suspend, or discontinue any aspect of the Medplum Service at any time, including hours of operation or availability of the Medplum Service or any feature, without notice or liability.\"\n- To know. Says access can be ended without notice or for any reason. \"We reserve the right to suspend or terminate your account and prevent access to the Medplum Service for any reason, at our discretion.\"\n- To know. Requires arbitration or waives class actions. \"We will use arbitration to resolve any problems, and you cannot join a class action lawsuit or obtain a jury trial for any disputes you have with us related to your use of the Medplum Service.\"\n- To know. Has not been updated for three years or more. \"Last Updated: 2023-04-11\"\n- Gives the date it was last updated. Last updated 2023-04-11.\n- Names the governing law or courts. The law of the State of California.\n- States a limit on its liability. Capped at $100.\n- Says how changes to the terms are announced. Changes are posted, with no other notice named.\n- Not found in the text. Refers to a service level or uptime commitment.\n- Also in the text (2026-10-14). Medplum caps its total liability at 100 US dollars. \"TO THE FULLEST EXTENT POSSIBLE BY LAW, OUR MAXIMUM LIABILITY ARISING OUT OF OR IN CONNECTION WITH THE MEDPLUM SERVICE OR YOUR USE OF MEDPLUM CONTENT, REGARDLESS OF THE CAUSE OF ACTION (WHETHER IN CONTRACT, TORT, BREACH OF WARRANTY, OR OTHERWISE), WILL NOT EXCEED $100.\"\n- Also in the text (2026-10-14). Users grant Medplum a perpetual licence to use posted content for any purpose, including promoting Medplum. \"However, we may use it for any purpose, including in our marketing materials.\"\n- Also in the text (2026-10-14). Medical data is archived for seven years from the time it is posted. \"Medical data is archived for 7 years from the time it is posted on Medplum.\"\n\n**Privacy policy** (https://www.medplum.com/privacy), read 2026-10-14, dated 2022-04-05, states 3 of the 8 things a reader expects.\n\n- To know. Has not been updated for three years or more. \"Last Updated: 2022-04-05\"\n- Gives the date it was last updated. Last updated 2022-04-05.\n- Not found in the text. Says what personal data is collected.\n- Not found in the text. Says how long data is kept.\n- Not found in the text. Says whether personal data is sold or shared for advertising.\n- Not found in the text. Gives a privacy contact.\n- Not found in the text. Says where data is transferred or stored.\n- Also in the text (2026-10-14). The policy covers physicians' registration data and does not apply to the content of data and files sent through the application. \"It does not apply to the content of the data and files that are transmitted through the Licensed Application.\"\n\n## Live (updated 2026-10-14 09:41 UTC)\n\n- Right now: up, HTTP 401, 255 ms, checked 2026-10-14 09:41 UTC (get on `https://api.medplum.com/mcp/stream`, asks for auth)\n- Uptime 24h 100.0% (17 probes) · 30 days 100.0% (17 probes) · p50 256 ms · p95 389 ms\n- Vendor status page: unknown, no machine-readable status found\n- Always current: https://www.anchorterminal.com/api/v1/live/medplum.json\n\n## Probe metrics\n\nNot measured yet. Our benchmark probes haven't run, so there's no availability, latency or error rate from a run and Performance is pending. Live uptime, where we poll the endpoint, is under Live and doesn't change the score.\n\n## Prices\n\n| Item | Price | Unit | Note |\n| --- | --- | --- | --- |\n| Production plan | $2000 | per month (plan) | Hosted, BAA included, Growth usage tier |\n| Premium plan | $6000 | per month (plan) | Hosted, adds lab, medication and HL7 integrations |\n\nAcross all listings: https://www.anchorterminal.com/prices/index.md\n\n## Strengths\n\n- Apache 2.0 server with releases about weekly, v5.2.3 on 8 October 2026, and a written version policy\n- Rate limits published per tier, with a `RateLimit` header giving remaining units and seconds to reset\n- AccessPolicy resources and SMART scopes allow read-only, per-resource or per-element clients\n- Official MCP server at api.medplum.com/mcp/stream, listed in the MCP registry as com.medplum/mcp, with OAuth\n- 99.99 per cent monthly SLA with service credits stated for the production hosted platform\n\n## Weaknesses\n\n- The MCP `fhir-request` tool can delete or overwrite any resource the token allows, with no readOnlyHint or destructiveHint\n- The privacy policy was last updated on 5 April 2022 and the terms on 11 April 2023\n- No sub-processor list or retention periods were found\n- Two high-severity auth advisories were published and patched in 2026\n- Official SDK in TypeScript only\n\n## Before you call it (notes for agents)\n\n1. Use a ClientApplication with an AccessPolicy limited to the resources the task needs, and set `readonly` where no writes are needed\n2. Read the `RateLimit` header and wait for the reset time after a 429. Writes cost 100 quota points, searches 20 and reads 1\n3. Create patients with conditional create (`If-None-Exist`) or upsert on an identifier so a retry doesn't make a duplicate\n4. Pass paths to `fhir-request` relative to the FHIR R4 base, with no leading slash or `/fhir/R4` prefix\n5. Use `Prefer: respond-async` for large bundles. Operations inside the background job don't count against the quota\n\n## Connect\n\nInstall:\n\n```bash\nnpm install @medplum/core\n```\n\nFirst request:\n\n```bash\ncurl -X POST https://api.medplum.com/oauth2/token \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"grant_type=client_credentials\u0026client_id=$MY_CLIENT_ID\u0026client_secret=$MY_CLIENT_SECRET\"\n```\n\nThrough letme (picks today, calling later): https://letme.dev/medplum (letme picks it for health.fhir, the top-graded tool for the job, letme picks it for health.records, the top-graded tool for the job). letme answers with the pick and how to call it direct; calling through letme (one key, the vendor's own price) comes later. How it works: https://www.anchorterminal.com/letme/index.md\n\n## Similar tools\n\nRanked by shared capabilities, then score. Same-category tools with no shared capability key are listed last.\n\n| Tool | Grade | Score | Rank | Shared capabilities | x402 | Markdown |\n| --- | --- | --- | --- | --- | --- | --- |\n| Aidbox | B | 64.2 | 385 | health.fhir, health.records | no | https://www.anchorterminal.com/tools/aidbox.md |\n| Health Gorilla | C | 59.3 | 583 | health.records, health.fhir | no | https://www.anchorterminal.com/tools/health-gorilla.md |\n| Redox | C | 58.3 | 618 | health.fhir, health.records | no | https://www.anchorterminal.com/tools/redox.md |\n| Zus Health | C | 56.6 | 669 | health.records, health.fhir | no | https://www.anchorterminal.com/tools/zus-health.md |\n| Medblocks | D | 52.7 | 773 | health.records, health.fhir | no | https://www.anchorterminal.com/tools/medblocks.md |\n| Metriport Medical API | D | 50.1 | 833 | health.records, health.fhir | no | https://www.anchorterminal.com/tools/metriport.md |\n\n## Panel reviews (0)\n\nReviewed by the Anchor panel (https://www.anchorterminal.com/reviewers/index.md): .\n\nDesk reviews, written from public documentation, pricing, terms, source and status history on 1 October 2026. No calls made. For a desk review, the outcome says whether the reviewer's questions could be answered from public material: success, partial or failure. How reviews work: https://www.anchorterminal.com/reviews/how-it-works.md\n\n## Notable\n\n- The MCP server at https://api.medplum.com/mcp/stream has three tools. `fhir-request` sends any GET, POST, PUT, PATCH or DELETE to the FHIR R4 API, and `search` and `fetch` are stubs kept for ChatGPT compatibility (source: \u003chttps://www.medplum.com/docs/ai/mcp\u003e)\n- Rate limits are published per IP (6,000 requests a minute on the free tier, 60,000 on paid) plus a weighted FHIR interaction quota, with a `RateLimit` header on every response (source: \u003chttps://www.medplum.com/docs/rate-limits\u003e)\n- The docs state a 99.99 per cent monthly uptime SLA with service credits for the production hosted platform (source: \u003chttps://www.medplum.com/docs/uptime\u003e)\n- Two high-severity advisories were published in 2026 and patched, an authorisation code leak in the external auth callback (GHSA-m44r-7c5h-m6mj, 24 July) and a client secret exposure in self-hosted dynamic registration (GHSA-ch8p-j6cm-r7w5, 2 June) (source: \u003chttps://github.com/medplum/medplum/security/advisories\u003e)\n- Semver releases about weekly, v5.2.3 on 8 October 2026, with a written version policy of one year active and one year maintenance per major (source: \u003chttps://www.medplum.com/docs/compliance/versions\u003e)\n- SOC 2 Type II audit completed, with the report on request, and security.txt valid to February 2027 (source: \u003chttps://www.medplum.com/security\u003e)\n\n- #1 of 12 in Best health record and wellness data APIs for AI agents: https://www.anchorterminal.com/best/health-data/index.md\n- All 63 health comparisons: https://www.anchorterminal.com/compare/health-data/index.md\n\n## Compare\n\n- [Aidbox vs Medplum](https://www.anchorterminal.com/compare/aidbox-vs-medplum.md): B 64.2 vs B 68.7\n- [Medplum vs Metriport Medical API](https://www.anchorterminal.com/compare/medplum-vs-metriport.md): B 68.7 vs D 50.1\n- [Medplum vs Particle Health](https://www.anchorterminal.com/compare/medplum-vs-particle-health.md): B 68.7 vs D 48.6\n- [Medplum vs Redox](https://www.anchorterminal.com/compare/medplum-vs-redox.md): B 68.7 vs C 58.3\n- [Medplum vs ROOK](https://www.anchorterminal.com/compare/medplum-vs-rook.md): B 68.7 vs C 54.9\n- [Medplum vs Terra API](https://www.anchorterminal.com/compare/medplum-vs-terra.md): B 68.7 vs B 65.9\n- [Medplum vs Zus Health](https://www.anchorterminal.com/compare/medplum-vs-zus-health.md): B 68.7 vs C 56.6\n- [1upHealth vs Medplum](https://www.anchorterminal.com/compare/1uphealth-vs-medplum.md): D 46.8 vs B 68.7\n- [Health Gorilla vs Medplum](https://www.anchorterminal.com/compare/health-gorilla-vs-medplum.md): C 59.3 vs B 68.7\n- [Medblocks vs Medplum](https://www.anchorterminal.com/compare/medblocks-vs-medplum.md): D 52.7 vs B 68.7\n\n## Verify this listing\n\nFor the vendor. The badge or a plain link to this page verifies the listing, from a page on medplum.com or one of its subdomains, or the README of github.com/medplum/medplum. It shows the listing is the vendor's and that the vendor knows it's here, and it never changes a grade, rank or review. The vendor sends the page's address to `POST https://www.anchorterminal.com/api/v1/verify` as `{\"slug\": \"medplum\", \"url\": \"…\"}`, or calls the `verify_listing` tool at https://www.anchorterminal.com/mcp. We fetch the page once, then again every week; two failed checks in a row and the verification lapses, and a later pass restores it. What we check: https://www.anchorterminal.com/builders/index.md#verify\n\nHTML badge:\n\n```html\n\u003ca href=\"https://www.anchorterminal.com/tools/medplum\"\u003e\u003cimg src=\"https://www.anchorterminal.com/badges/medplum.svg\" alt=\"Medplum on Anchor Terminal\" height=\"20\"\u003e\u003c/a\u003e\n```\n\nMarkdown badge, for a README:\n\n```markdown\n[![Medplum on Anchor Terminal](https://www.anchorterminal.com/badges/medplum.svg)](https://www.anchorterminal.com/tools/medplum)\n```\n\nPlain link:\n\n```html\n\u003ca href=\"https://www.anchorterminal.com/tools/medplum\"\u003eMedplum on Anchor Terminal\u003c/a\u003e\n```\n\n## Share this listing\n\nFor the vendor. Sharing assets for social media, two PNGs of 1200 × 630 that say Medplum is listed on Anchor Terminal, with the vendor's logo and this page's address and no grade or score.\n\n- Dark: https://www.anchorterminal.com/assets/share/medplum-dark.png\n- Light: https://www.anchorterminal.com/assets/share/medplum-light.png\n- Create a video and download its frames: https://www.anchorterminal.com/assets/listing-video/index.html?listing=medplum\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-14",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Health records \u0026 wellness data",
        "url": "https://www.anchorterminal.com/categories/health-data"
      },
      {
        "name": "Medplum",
        "url": ""
      }
    ],
    "description": "Open-source FHIR R4 server and healthcare developer platform from Orangebot, Inc. (dba Medplum). Agents reach patient records through the hosted FHIR REST API at api.medplum.com, a remote MCP server or a self-hosted copy.",
    "facts": [
      "rank #216 of 1076",
      "OAuth auth",
      "0 desk reviews"
    ],
    "h1": "Medplum",
    "image": "https://www.anchorterminal.com/assets/og/tools-medplum.png",
    "path": "/tools/medplum",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Medplum review (2026): pricing, alternatives and grade B",
    "toc": null,
    "updated": "2026-10-14",
    "url": "https://www.anchorterminal.com/tools/medplum"
  },
  "tokens": {
    "markdown": 6550,
    "slim": 1480
  },
  "version": 1
}
