# Reported issues for mcp

Pod holds 22 of 41 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [mcp](/mcp/mcp-7).

## Most discussed

### Implement the MCP 'search' and 'fetch' tools (currently dummy stubs)

In `packages/server/src/mcp/server.ts`, `search` (L31) and `fetch` (L36) currently return a hardcoded dummy document. From the comment they look like placeholders so ChatGPT will connect, rather than working tools yet.

The only functional tool is `fhir-request` (L51), which returns `JSON.stringify(response)`. For an LLM client this is the core problem: a real patient can have thousands of resources, and a single search can return a large bundle, so dumping the full raw response into the model's

[Read the thread](https://github.com/medplum/medplum/issues/9616) · 2026-06-24 · open · external user · 7 comments

### Recommended way to connect Claude Code (CLI) to a self-hosted MCP server over OAuth?

## Question

Is there a recommended way to connect **Claude Code (the CLI)** to a **self-hosted** Medplum MCP server over OAuth? The docs in `docs/ai/mcp.md` cover the **claude.ai** web connector (hosted `api.medplum.com`, a pre-registered redirect, the Anthropic directory), but we couldn't find guidance for the Claude Code CLI against a self-hosted server, so we worked something out by reading the 5.1.17 source and wanted to check whether it's the intended path.

## What we're doing

We run the

[Read the thread](https://github.com/medplum/medplum/issues/9537) · 2026-06-17 · closed · external user · 2 comments

### Integrate (c)(1) and (b)(11) exploration code into Provider App

> [!NOTE]
> This work is strictly for certification and will not affect production code paths.

## Description

The exploration code for (c)(1) and (b)(11) certification must be moved from the parallel repository (forked from Medplum) into the `medplum-provider` application.

This work supports certification exam preparation. The code should be integrated into the Provider App in a separate branch and should not be merged into `main` at this time. A draft PR may be opened to facilitate review an

[Read the thread](https://github.com/medplum/medplum/issues/7292) · 2025-08-22 · closed · outside contributor · 6 comments

### OAuth RFC 7662 for external auth

The IUA specification describes how a FHIR server can accept an authorization token from an external auth provider, _on every resource request_

https://infoscribe.infoway-inforoute.ca/pages/viewpage.action?pageId=194838753

This generally follows OAuth2.1 standards. However, one step, labeled [ITI-102 Token Introspection](https://profiles.ihe.net/ITI/IUA/index.html#3102-introspect-token-iti-102), seems to rely on a IHE defined introspection standard.

However, the docs are a bit unclear. This m

[Read the thread](https://github.com/medplum/medplum/issues/6355) · 2025-04-11 · closed · outside contributor · 13 comments

### Incorrect Validation Failure on Patient.identifier slice

## Repro

1. Upload the following StructureDefinition

[StructureDefinition-MedplumHealthGorillaPatient.json](https://github.com/medplum/medplum/files/14912211/StructureDefinition-MedplumHealthGorillaPatient.json)

2. Try to save the following `Patient`
```json
{
  "resourceType": "Patient",
  "identifier": [
    {
      "type": {
        "coding": [
          {
            "system": "http://terminology.hl7.org/CodeSystem/v2-0203",
            "code": "MR",
            "display"

[Read the thread](https://github.com/medplum/medplum/issues/4346) · 2024-04-09 · closed · outside contributor · 2 comments

### Agent Ping $push fails when `ping` is not installed

Running the Agent in the `debain:bullseye-slim` image, `ping` is not installed by default. It would be good to check if `ping` is installed before issuing the `$push` - https://github.com/medplum/medplum/blob/v3.0.3/packages/agent/src/app.ts#L284

This leads to an inconsistent error message on the UI
```
Error
"$push" operation timed out. Agent may be unreachable
```

Though the Agent is connected and received the event. Below is the Agent log when trying to ping the docker gateway.
```

[Read the thread](https://github.com/medplum/medplum/issues/4007) · 2024-02-22 · closed · outside contributor · 3 comments

### Bot.runAsUser has no effect when executed via $execute endpoint

As far as I can tell, the `runAsUser` flag only has an effect when the Bot is executed as a result of a subscription. Bots that are executed using the `$execute` endpoint seem to always use the caller's credentials, and any access policy set on the Bot has no effect. Is this intentional, or am I just configuring something incorrectly? It seems out of line with the AccessPolicy strategy described at https://www.medplum.com/docs/bots/consuming-webhooks. Thanks for your help!

[Read the thread](https://github.com/medplum/medplum/issues/3906) · 2024-02-08 · closed · outside contributor · 2 comments

### `pushToAgent` initiates outbound connections

Currently, when `pushToAgent` assumes that an existing connection has been established by the listening device. However, many  listening HL7v2 systems expect the sender to establish the TCP connection. 

This task is to configure an Agent "channel" to initiate a TCP connection to a remote IP/port address, rathen than wait for an inbound connection

[Read the thread](https://github.com/medplum/medplum/issues/3063) · 2023-10-17 · closed · outside contributor · 7 comments

## Most recent

### [React] Component for bullet-separated list

Some components display text delimited by a dot (·), like this: 
> `DOB: 08/20/2000 · MRN: 12345`

There are multiple instances of this existing in the code, enough so that it might make sense to just create a component for it that could handle this with a CSS rule like `li + li::before { content: " · "; };`. It could maybe be called `<BulletSeparatedList />`.

[Read the thread](https://github.com/medplum/medplum/issues/10289) · 2026-08-21 · open · outside contributor · 0 comments

### handleUnauthenticated() wipes all of localStorage on a 401 with no session or refresh token

## Summary

On a 401 with no session or usable refresh token, `MedplumClient` wipes storage before the
app can react — `handleUnauthenticated()` → `clear()` → a bare
`localStorage.clear()`. That destroys keys Medplum doesn't own, and emits a
`storage` event with `key === null`, which the client's *own* listener answers
with `window.location.reload()` in every other tab.

**Version:** `@medplum/core@5.1.7`, browser, default `localStorage` backing.

## Code path

```js
// handleUnauthenticated() —

[Read the thread](https://github.com/medplum/medplum/issues/10262) · 2026-08-20 · open · external user · 1 comment

### Support chained search in MemoryRepository

`MemoryRepository` can't execute chained search parameters, and it fails silently rather than loudly. The parser stores any key containing a `.` verbatim and leaves interpretation to the server (`packages/core/src/search/search.ts:234`), so when the matcher looks that code up in the flat search parameter table it misses and rejects every candidate (`packages/core/src/search/match.ts:48`). A chained query against `MockClient` comes back as an empty searchset instead of an error, which means any t

[Read the thread](https://github.com/medplum/medplum/issues/10258) · 2026-08-19 · closed · outside contributor · 0 comments

### External auth (authorization code) fails on gzip token responses — verifyExternalCode missing Accept-Encoding: identity (same gap as #9554)

## Summary

External identity-provider login via the authorization-code callback (`/auth/external`) fails with:

> Failed to verify code - check your identity provider configuration

whenever the IdP's **token endpoint returns a gzip-compressed response**.

`verifyExternalCode` in `packages/server/src/auth/external.ts` performs the token-exchange `fetch` with only `Accept` and `Content-Type` headers (no `Accept-Encoding`), so Node/undici defaults to sending `Accept-Encoding: gzip`. When the IdP 

[Read the thread](https://github.com/medplum/medplum/issues/9558) · 2026-06-19 · closed · external user · 1 comment

### Bot subscriptions do not generate subscription delivery AuditEvents

## Bug

When a `Subscription` uses a Bot as its channel endpoint (`channel.endpoint = "Bot/<id>"`), the `subscription-audit-event-destination` extension is silently ignored and no subscription delivery `AuditEvent` is ever created — regardless of whether the extension specifies `resource`, `log`, or both.

## Root Cause

In `packages/server/src/workers/subscription.ts`, the `execBot` function calls `executeBot(...)` but never calls `createSubscriptionAuditEvent()`:

```ts
async function execBot(

[Read the thread](https://github.com/medplum/medplum/issues/9385) · 2026-06-02 · closed · outside contributor · 0 comments

### UserSecurityRequest password reset tokens have no time-based expiration and are not superseded by newer requests

## Summary

A [user correctly discovered that](https://discord.com/channels/905144809105260605/1503761739743891609) `UserSecurityRequest` resources used for password reset flows are missing two standard security controls:

1. **No time-based expiration** — reset tokens remain valid indefinitely until used
2. **No supersession** — creating a new reset request does not invalidate prior unused ones for the same user

## Current Behavior

The `auth/setpassword` endpoint validates a reset token only 

[Read the thread](https://github.com/medplum/medplum/issues/9190) · 2026-05-12 · open · outside contributor · 0 comments

### MCP: AI clients (e.g. Claude) don't request offline_access scope, causing frequent session drops

## Problem

AI clients connecting to the Medplum MCP server via OAuth authenticate using the `authorization_code` flow but do not request the `offline_access` scope. As a result, Medplum never issues a refresh token, and the session silently dies when the access token expires (~1 hour).

This is a known gap in how MCP clients implement OAuth, as they initiate the auth flow without `offline_access`, so there is no mechanism for the server to issue or the client to use a refresh token.

## Impact

[Read the thread](https://github.com/medplum/medplum/issues/9183) · 2026-05-12 · closed · outside contributor · 1 comment

### [DoseSpot] - Document DoseSpot Registration Errors

## Issue
Medplum's auto prescriber sync bot stores a RegistrationStatus on the Practitioner resource, but we only document three of the codes as examples on https://www.medplum.com/docs/integration/dosespot/enroll-user#bot-response.:

"Current DoseSpot registration status (e.g., "Pending", "IDPSuccess", "TFAActivatedSuccess"

Document all the different registration status's that an implementer could expect to be stored. They come from `[4.2.10 Registration Status Type]` in medplum-ee and add the

[Read the thread](https://github.com/medplum/medplum/issues/8958) · 2026-04-14 · closed · outside contributor · 0 comments

### MockClient: `medplum.get()` with a bare FHIR path (no `fhir/R4` prefix) returns `null`

## Summary

Calling `medplum.get<Bundle>('Encounter/<id>/_history?_count=500')` in tests returns `null` instead of the expected history Bundle, because the path does not contain the `fhir/R4` prefix required by `MockFetchClient.mockHandler`.

## Root cause

`MockFetchClient.mockHandler` dispatches on the path prefix:

```typescript
// packages/mock/src/client.ts
private async mockHandler(method, path, options) {
  if (path.startsWith('admin/'))       return this.mockAdminHandler(...);
  else if 

[Read the thread](https://github.com/medplum/medplum/issues/8832) · 2026-03-31 · closed · outside contributor · 0 comments

### Subscription rest-hook endpoint URL not validated — SSRF potential

> I've been running automated security reviews across my own repos (sleep medicine / medical device SaaS built on Medplum) and the tooling has been incredibly helpful at catching things I'd missed. I decided to run the same review on the Medplum repo itself — partly to learn from your codebase, partly to give back. Thanks for building such a great project! These issues are just proposals — please check the boxes you agree with.

## Summary

In `packages/server/src/workers/subscription.ts` line 6

[Read the thread](https://github.com/medplum/medplum/issues/8815) · 2026-03-29 · closed · external user · 2 comments

### bcrypt default salt rounds (10) below current OWASP recommendation (12)

> I've been running automated security reviews across my own repos (sleep medicine / medical device SaaS built on Medplum) and the tooling has been incredibly helpful at catching things I'd missed. I decided to run the same review on the Medplum repo itself — partly to learn from your codebase, partly to give back. Thanks for building such a great project! These issues are just proposals — please check the boxes you agree with.

## Summary

In `packages/server/src/config/utils.ts` line 31, the d

[Read the thread](https://github.com/medplum/medplum/issues/8813) · 2026-03-29 · closed · external user · 1 comment

### Default super-admin password fallback in seed.ts

> I've been running automated security reviews across my own repos (sleep medicine / medical device SaaS built on Medplum) and the tooling has been incredibly helpful at catching things I'd missed. I decided to run the same review on the Medplum repo itself — partly to learn from your codebase, partly to give back. Thanks for building such a great project! These issues are just proposals — please check the boxes you agree with.

## Summary

In `packages/server/src/seed.ts` line 49, the `createSu

[Read the thread](https://github.com/medplum/medplum/issues/8808) · 2026-03-29 · closed · external user · 1 comment

### [Feature Request] Improved Diagnostic Visibility for Hl7Connection MLLP Buffer

Debugging "missing" HL7 messages is currently difficult. If a sender sends a malformed MLLP frame (e.g., missing the FS+CR terminator) or if network jitter splits a packet, the Hl7Connection class silently buffers the data while waiting for the terminator.
To the application, it appears as if no traffic is arriving, even when the socket is active.

I would like to introduce an Hl7DiagnosticEvent that uses the existing dispatchEvent architecture.
This event would trigger when:
- New data is appen

[Read the thread](https://github.com/medplum/medplum/issues/8122) · 2025-12-29 · open · external user · 2 comments

### Bot Execution Environment Missing `TextDecoder` vmcontext

### Summary

When a Medplum bot uses a npm package that has a transitive dependency on the `TextDecoder` API (such as recent versions of `@google-cloud/vertexai`), the bot fails to execute on the Medplum server. The `AuditEvent` for the execution shows the error `Error: TextDecoder is not defined`.

This issue does not occur in a standard local Node.js environment (e.g., v24), where `TextDecoder` is globally available. This indicates that the Medplum bot execution environment may be a minimal No

[Read the thread](https://github.com/medplum/medplum/issues/7864) · 2025-11-19 · closed · external user · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/medplum/medplum/issues).
