Skip to main content
Glama
rkirkendall

Medplum MCP Server

by rkirkendall

createCondition

Generate a patient condition or diagnosis by specifying a patient ID, condition code, clinical status, and optional onset or recorded date using the Medplum MCP Server.

Instructions

Creates a new condition or diagnosis for a patient. Requires a patient ID and a condition code.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
clinicalStatusNoThe clinical status of the condition. For example: "active", "inactive", "resolved".
codeYesThe code representing the condition. Must include a coding system, code, and display text.
onsetStringNoEstimated date, state, or age when the condition began (e.g., "about 3 years ago"). Optional.
patientIdYesThe ID of the patient for whom the condition is being created.
recordedDateNoThe date the condition was recorded, in YYYY-MM-DD format. Optional.

Implementation Reference

  • The core handler function that executes the tool logic: validates args, constructs FHIR Condition resource, creates it via Medplum client, handles errors with OperationOutcome.
    export async function createCondition(
      args: CreateConditionArgs,
      client?: MedplumClient,
    ): Promise<Condition | OperationOutcome> {
      const medplumClient = client || medplum;
      await ensureAuthenticated();
      try {
        if (!args.subject || !args.subject.reference) {
          throw new Error('Patient subject reference is required.');
        }
        if (!args.code || !args.code.coding || args.code.coding.length === 0) {
          throw new Error('Condition code with at least one coding is required.');
        }
    
        const conditionResource: Condition = {
          resourceType: 'Condition',
          subject: args.subject,
          code: args.code,
          clinicalStatus: args.clinicalStatus || { coding: [ConditionClinicalStatusCodes.ACTIVE] },
          verificationStatus:
            args.verificationStatus || { coding: [ConditionVerificationStatusCodes.CONFIRMED] },
          category: args.category,
          encounter: args.encounter,
          onsetDateTime: args.onsetDateTime,
          onsetAge: args.onsetAge,
          onsetPeriod: args.onsetPeriod,
          onsetString: args.onsetString,
          recordedDate: args.recordedDate,
          asserter: args.asserter,
        };
    
        // Remove undefined fields to create a clean resource object
        Object.keys(conditionResource).forEach(
          (key) =>
            (conditionResource as any)[key] === undefined && delete (conditionResource as any)[key],
        );
    
        const createdCondition = (await medplumClient.createResource(
          conditionResource,
        )) as Condition;
        console.log('Condition created successfully:', createdCondition.id);
        return createdCondition;
      } catch (error: any) {
        console.error('Error creating Condition:', error);
        const outcome: OperationOutcome = {
          resourceType: 'OperationOutcome',
          issue: [
            {
              severity: 'error',
              code: 'exception',
              diagnostics: `Error creating Condition: ${error.message || 'Unknown error'}`,
            },
          ],
        };
        if (error.outcome) {
          console.error('Server OperationOutcome:', JSON.stringify(error.outcome, null, 2));
          return error.outcome as OperationOutcome;
        }
        return outcome;
      }
    }
  • TypeScript interface defining the input arguments for the createCondition handler.
    export interface CreateConditionArgs {
      subject: Reference<Patient>;
      code: CodeableConcept;
      clinicalStatus?: CodeableConcept;
      verificationStatus?: CodeableConcept;
      category?: CodeableConcept[];
      encounter?: Reference<Encounter>;
      onsetDateTime?: string;
      onsetAge?: Age;
      onsetPeriod?: Period;
      onsetString?: string;
      recordedDate?: string; // ISO 8601 date string
      asserter?: Reference<Patient | Practitioner>;
    }
  • JSON schema definition for the createCondition tool input, used in tool registry.
    name: 'createCondition',
    description:
      'Creates a new condition or diagnosis for a patient. Requires a patient ID and a condition code.',
    input_schema: {
      type: 'object',
      properties: {
        patientId: {
          type: 'string',
          description: 'The ID of the patient for whom the condition is being created.',
        },
        code: {
          type: 'object',
          description:
            'The code representing the condition. Must include a coding system, code, and display text.',
          properties: {
            coding: {
              type: 'array',
              items: {
                type: 'object',
                properties: {
                  system: {
                    type: 'string',
                    description: 'The URI of the coding system (e.g., "http://snomed.info/sct").',
                  },
                  code: { type: 'string', description: 'The code from the system (e.g., "44054006").' },
                  display: {
                    type: 'string',
                    description:
                      'The human-readable display text for the code (e.g., "Type 2 diabetes mellitus").',
                  },
                },
                required: ['system', 'code', 'display'],
              },
            },
            text: { type: 'string', description: 'A human-readable summary of the condition.' },
          },
          required: ['coding', 'text'],
        },
        clinicalStatus: {
          type: 'string',
          description: 'The clinical status of the condition. For example: "active", "inactive", "resolved".',
          enum: ['active', 'recurrence', 'relapse', 'inactive', 'remission', 'resolved'],
        },
        onsetString: {
          type: 'string',
          description:
            'Estimated date, state, or age when the condition began (e.g., "about 3 years ago"). Optional.',
        },
        recordedDate: {
          type: 'string',
          description: 'The date the condition was recorded, in YYYY-MM-DD format. Optional.',
        },
      },
      required: ['patientId', 'code'],
    },
  • src/index.ts:950-988 (registration)
    Tool mapping registry that associates the 'createCondition' string name with the imported handler function for dispatching.
    const toolMapping: Record<string, (...args: any[]) => Promise<any>> = {
      createPatient,
      getPatientById, 
      updatePatient,
      searchPatients,
      searchPractitionersByName,
      createPractitioner,
      getPractitionerById,
      updatePractitioner,
      searchPractitioners,
      createOrganization,
      getOrganizationById,
      updateOrganization,
      searchOrganizations,
      createEncounter,
      getEncounterById,
      updateEncounter,
      searchEncounters,
      createObservation,
      getObservationById,
      updateObservation,
      searchObservations,
      createMedicationRequest,
      getMedicationRequestById,
      updateMedicationRequest,
      searchMedicationRequests,
      createMedication,
      getMedicationById,
      searchMedications,
      createEpisodeOfCare,
      getEpisodeOfCareById,
      updateEpisodeOfCare,
      searchEpisodesOfCare,
      createCondition,
      getConditionById,
      updateCondition,
      searchConditions,
      generalFhirSearch,
    };
  • src/index.ts:1046-1060 (registration)
    Special dispatching logic in the MCP server request handler that adapts LLM-provided args to the handler's expected CreateConditionArgs format.
     } else if (toolName === 'createCondition') {
       // Special handling for createCondition
       const { patientId, code, clinicalStatus, onsetString, recordedDate } = args;
       const createArgs: any = {
         subject: { reference: `Patient/${patientId}` },
         code,
         onsetString,
         recordedDate,
       };
       if (clinicalStatus) {
         const key = (clinicalStatus as string).toUpperCase() as keyof typeof ConditionClinicalStatusCodes;
         createArgs.clinicalStatus = { coding: [ConditionClinicalStatusCodes[key]] };
       }
       result = await toolFunction(createArgs);
    } else if (toolName === 'searchConditions') {

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rkirkendall/medplum-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server