About FitnessSyncer
FitnessSyncer provides an OAuth-based REST API for applications that need access to users’ health and fitness data from more than 50 sources. Its OpenAPI specification supports code generation, and the project also provides an MCP server.
Key features
- 01Access health and fitness data across sources
- 02Use OAuth-based REST API
- 03Generate application code from OpenAPI specification
- 04Use OAuth authorization and token refresh flows
Use cases
- 01Build an application that accesses aggregated fitness data
- 02Generate API client code from the specification
- 03Authorize access and refresh expired tokens
MCP support
FitnessSyncer also provides an MCP server to help with integrations; the README does not specify its tools or exposed data.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://www.fitnesssyncer.com/services/mcpclaude mcp add --transport http FitnessSyncerAPI https://www.fitnesssyncer.com/services/mcp{"mcpServers":{"FitnessSyncerAPI":{"type":"http","url":"https://www.fitnesssyncer.com/services/mcp"}}}Open in Cursor{"servers":{"FitnessSyncerAPI":{"type":"http","url":"https://www.fitnesssyncer.com/services/mcp"}}}Open in VS Code{"mcpServers":{"FitnessSyncerAPI":{"type":"http","url":"https://www.fitnesssyncer.com/services/mcp"}}}{"mcpServers":{"FitnessSyncerAPI":{"serverUrl":"https://www.fitnesssyncer.com/services/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
https://www.fitnesssyncer.com/services/mcpAuth requiredTools
Details
From the project READMEFitnessSyncer OpenAPI Specification
FitnessSyncer provides an API to help our users access their health and fitness data from over 50 sources. Our OAuth-based REST API allows you to seamlessly get to the data, no matter the source, and concentrate on building their application, not integrating with services.
This contains our OpenAPI specification which allows you to quickly generate code for your applications.
For complete documentation, please review our documentation and create your personal credentials here.
For non-personal usage or for any assistance, please contact us.
We also feature an MCP Server which can also make certain integrations easier. For more information on it, please review our documentation.
Diagrams
Authentication Sequence Diagram
See Authentication Sequence Diagram for all of the parameters and details.
For a scripted example, you can look at fitnesssyncer_oauth_authorization_flow.py
for the authorization flow. Given a --client-id, --client-secret, and --redirect-uri,
it will open a browser window for you to login and take the redirected URL to acquire the
access_token and refresh_token. When the access_token expires, the
fitnesssyncer_oauth_refresh_flow.py script will
acquire a new access_token and refresh_token using the --refresh-token and
--client-id and --client-secret parameters. These do not support PKCE.
sequenceDiagram
participant User
participant Your Application
participant FitnessSyncer
%% https://www.fitnesssyncer.com/api/documentation.html#authorize
Your Application->>User: Send Redirect to FitnessSyncer https://api.fitnesssyncer.com/api/oauth/authorize
User->>FitnessSyncer: Follow Redirect, maybe login, and authorize Your Application to use the User's data.
FitnessSyncer->>User: Send redirect URL with code and state query parameters
User->>Your Application: Follow Redirect with code and state query parameters.
%% https://www.fitnesssyncer.com/api/documentation.html#accessing_token
Your Application->>FitnessSyncer: POST parameters to https://api.fitnesssyncer.com/api/oauth/access_token
FitnessSyncer->>Your Application: Return access_token, refresh_token, expires_in, scope, and user_id values.
Your Application->>Your Application: Use token until it expires
%% https://www.fitnesssyncer.com/api/documentation.html#refreshing_token
Your Application->>FitnessSyncer: POST parameters to https://api.fitnesssyncer.com/api/oauth/access_token
FitnessSyncer->>Your Application: Return access_token, refresh_token, expires_in, scope, and user_id values.
Source and Destination Authentication Sequence Diagram
See Create Data Source, Create Destination, and Provider Authentication
This shows the Source Authentication flow; the Destination Authentication flow is similar.
sequenceDiagram
actor EndUser as End User
participant YourServer as Your Server
participant FitnessSyncer as FitnessSyncer Auth Service
participant FitBit as Fitbit
note right of EndUser: Assumes the user is already authenticated with FitnessSyncer
EndUser ->> YourServer: Add a Data Source such as Fitbit
%% https://www.fitnesssyncer.com/api/documentation.html#data_source_create
YourServer ->> FitnessSyncer: Create new Data Source via PUT to /api/providers/sources/
FitnessSyncer ->> YourServer: Return create id
%% https://www.fitnesssyncer.com/api/documentation.html#provider_list
note right of YourServer: If you do not know the authentication scheme for the selected service, use https://api.fitnesssyncer.com/api/providers/types/ . This example assumes OAuth.
YourServer ->> FitnessSyncer: Set authentication via PUT to /api/providers/sources/{id}/authentication
note right of YourServer: Ensure you set the Redirect URL on this request.
FitnessSyncer ->> YourServer: Return redirect URL
YourServer ->> EndUser: Send Redirect
EndUser ->> Fitbit: Process Redirect
note right of Fitbit: Allow FitnessSyncer access to your Fitbit Account?
Fitbit -> FitnessSyncer: User Authenticated -- follow requested redirect URL.
FitnessSyncer ->> EndUser: Follow requested redirect URL
EndUser ->> YourServer: Authentication complete
Notification Sequence Diagram
There are two models for Notifications. The first is a push notification as denoted here:
sequenceDiagram
participant FitnessSyncer as FitnessSyncer Data Processor
participant YourServers as Your Notification Service
note right of YourServers: You must register for push notifications via e-mail
%% https://www.fitnesssyncer.com/api/documentation.html#notifications_subscribe
YourServers ->> FitnessSyncer: Subscribe User for Notifications
FitnessSyncer ->> YourServers: OK
FitnessSyncer ->> FitnessSyncer: Acquire/Process Data
%% https://www.fitnesssyncer.com/api/documentation.html#notifications
FitnessSyncer ->> YourServers: POST of the changed items
YourServers ->> FitnessSyncer: OK
%% https://www.fitnesssyncer.com/api/documentation.html#data_source_items_get
YourServers ->> FitnessSyncer: Get Updated Data
FitnessSyncer ->> YourServers: Results
The second is a pull notification as denoted here:
sequenceDiagram
participant FitnessSyncer as FitnessSyncer Data Processor
participant YourServers as Your Notification Service
note right of YourServers: You must register for pull notifications via e-mail
%% https://www.fitnesssyncer.com/api/documentation.html#notifications_subscribe
YourServers ->> FitnessSyncer: Subscribe User for Notifications
FitnessSyncer ->> YourServers: OK
FitnessSyncer ->> FitnessSyncer: Acquire/Process Data
%% https://www.fitnesssyncer.com/api/documentation.html#notifications_claims
YourServers ->> FitnessSyncer: Get Notifications via POST to https://api.fitnesssyncer.com/api/notifications/
FitnessSyncer ->> YourServers: Notification Claim
%% https://www.fitnesssyncer.com/api/documentation.html#data_source_items_get
YourServers ->> FitnessSyncer: Get Updated Data
FitnessSyncer ->> YourServers: Results
YourServers ->> YourServers: Handle errors, which are typically reauthentication errors.
%% https://www.fitnesssyncer.com/api/documentation.html#notifications_delete
YourServers ->> FitnessSyncer: Delete Claim via DELETE to https://api.fitnesssyncer.com/api/notifications/claimId
FitnessSyncer ->> YourServers: OK
Data Structure Overview
classDiagram
SyncItemItem ..> SyncItem
SyncItem ..> TaskType
Activity ..> GPSData
GPSData ..> Lap
Lap ..> Point
Point ..> LatLng
Glucose ..> GlucosePoint
Oxygen ..> OxygenPoint
Sleep ..> SleepEvent
Sleep ..> SleepPoint
Temperature ..> TemperaturePoint
ListSourceData ..> SyncItemListItem
ListSyncItems ..> SyncItem
SyncItemListItem ..> SyncItemLinks
SyncItem ..> SyncItemLinks
ListOfSourceData ..> SourceData
SourceDataItem ..> SourceData
ListDestinationTask ..> DestinationTask
DestinationTaskItem ..> DestinationTask
SyncDestination ..> TaskType
SyncDestination ..> ProviderConfig
SourceData ..> ProviderConfig
ProviderConfig ..> MapsProviderConfig
ProviderConfig ..> CsvProviderConfig
CsvProviderConfig ..> CsvColumnMapping
AlertDestination ..> TaskType
ListTaskType ..> TaskType
ProviderList ..> Provider
ProviderAuthentication ..> ProviderAuthenticationItem
ProviderAuthenticationItem ..> ProviderAuthenticationKey
SyncStatusResults ..> SyncStatus
Notification ..> Notifications
Notifications ..> NotificationItem
Notifications ..> NotificationErrorItem
DescriptionResults ..> Description
Description ..> TaskType
LeaderboardList ..> Leaderboard
LeaderboardItem ..> Leaderboard
AnnotationList ..> Annotation
Annotation ..> TaskType
class PowerZones{
+number: base
+number: maxZone1
+number: maxZone2
+number: maxZone3
+number: maxZone4
+number: maxZone5
+number: maxZone6
}
class Error{
+string: error
+string: error_description
+string: argument
+string: item
+string: id
+string: request_id
}
class UserPreferences{
+bool: autosync
+number: bmr
+number: birthdate
+number: age
+bool: canemail
+bool: distanceOverSteps
+bool: privateActivities
+number: heightInMeters
+bool: distanceMetric
+bool: nutritionMetric
+bool: weightMetric
+bool: glucoseMetric
+bool: temperatureCelsius
+bool: waterML
+bool: internationaltime
+bool: weekStartsOnMonday
+string: locale
+string: emailLocale
+string: numericLocale
+string: bodyshape
+string: sex
+string: timezone
+string: timezoneDisplayName
+string: displayname
+number: heartRateLevel1
+number: heartRateLevel2
+number: heartRateLevel3
+number: heartRateLevel4
+number: heartRateLevel5
+number: heartRateAge
+number: heartRateMax
+bool: pro
+bool: beta
+object: powerZones
+number: sleepRatio
+bool: graphSleepByWakeTime
+number: glucoseLow
+number: glucoseHigh
+number: glucosePercent
+bool: bandsBasedOnGlucoseRange
+string[]: hiddenReports
+string[]: hiddenNotebookTypes
}
class SyncItemItem{
+SyncItem: item;
}
class SyncItem{
+string: providerType
+string: device
+string: attribution
+boolean: requiredAttribution
+number: date
+string: itemId
+string: taskId
+string: apiVersion
+string: comment
+string[]: tags
+TaskType: type;
+SyncItemLinks: links;
}
class Activity{
+string: activity
+string: fitnessSyncerActivity
+string: title
+number: distanceKM
+number: duration
+number: calories
+number: bmr
+number: endDate
+number: steps
+number: avgHeartrate
+number: minHeartrate
+number: maxHeartrate
+number: restingHeartrate
+number: avgStressLevel
+number: minStressLevel
+number: maxStressLevel
+number: lowStressDurationSeconds
+number: mediumStressDurationSeconds
+number: highStressDurationSeconds
+number: vo2Max
+number: respiratoryRate
+number: mindfulMinutes
+bool: summary
+number: temperatureCelsius
+number: avgCoreTemperatureCelsius
+number: minCoreTemperatureCelsius
+number: maxCoreTemperatureCelsius
+number: repetitions
+number: weight
+number: rpe
+bool: manual
+number: floorsClimbed
+GPSData: gps;
}
class Allergy{
+string: allergy
+bool: isNegated
+string: treatment
+number: endDate
}
class GPSData{
+string: id
+string: title
+string: sport
+number: date
+Lap[]: lap;
}
class Lap{
+number: start
+number: millis
+number: totalMovingTimeMillis
+number: totalMovingTimeMillisCalc
+number: dist
+number: calories
+number: speed
+number: maxHeart
+number: avgHeart
+number: cadence
+string: sport
+number: notes
+number: hrr
+number: avgCoreTemperature
+number: minCoreTemperature
+number: maxCoreTemperature
+number: avgSmo2
+number: avgLeftRightBalance
+number: avgLeftTorqueEffectiveness
+number: avgRightTorqueEffectiveness
+number: avgLeftPedalSmoothness
+number: avgRightPedalSmoothness
+number: avgCombinedPedalSmoothness
+number: avgLeftPco
+number: avgRightPco
+Point[]: points;
}
class Point{
+number: time
+number: distance
+number: altitude
+number: heartRate
+number: speed
+number: cadence
+number: calories
+number[]: hrv
+number: hrv_sdnn
+number: power
+number: estimatedPower
+number: temperature
+number: coreTemperature
+number: skinTemperature
+number: coreDataQuality
+number: smo2
+number: thb
+number: leftRightBalance
+number: leftTorqueEffectiveness
+number: rightTorqueEffectiveness
+number: leftPedalSmoothness
+number: rightPedalSmoothness
+number: combinedPedalSmoothness
+number: leftPco
+number: rightPco
+number: steps
+number: torque
+number: locationAccuracy
+number: bearing
+number: tilt
+number: pedometerCadence
+number: crankCadence
+number: crankRevolutionDelta
+number: wheelCadence
+number: wheelRevolutionDelta
+bool: moving
+number: stanceTime
+number: legSpringStiffness
+number: stress
+number: formPower
+number: verticalOscilation
+number: vo2Max
+number: respiratoryRate
+LatLng: point;
}
class LatLng{
+number: lat
+number: lng
}
class BodyComposition{
+number: weight
+number: height
+number: fatFreeMass
+number: fatRatio
+number: boneMass
+number: bodyWaterKg
+number: extracellularWater
+number: intracellularWater
+number: visceralFat
+number: bmi
+number: muscleMass
+number: fatMassWeight
+number: bicep
+number: calf
+number: chest
+number: forearm
+number: hips
+number: neck
+number: thigh
+number: waist
+number: caliperChest
+number: caliperMidaxillary
+number: caliperBicep
+number: caliperAbdominal
+number: caliperSuprailiac
+number: caliperThigh
+number: caliperCalf
+number: caliperSubscapular
+number: caliperTricep
+number: caliperLowerBack
}
class BloodPressure{
+number: diastolic
+number: systolic
+number: pulse
+bool: arrhythmia
}
class Cholesterol{
+number: ldl
+number: hdl
+number: totalCholesterol
+number: triglyceride
}
class Condition{
+string: condition
+number: endDate
}
class CycleTracking{
+string: flowLevel
+number: basalBodyTempCelsius
+string: cervicalMucus
+string: ovulationTest
}
class ECG{
+number: durationMs
+number: sampleRateHz
+number[]: samples
+string: leadConfig
+string: classification
+string: classificationRaw
+string: inconclusiveReason
+number: avgHeartRateBpm
+string[]: symptoms
}
class Glucose{
+number: value
+bool: a1c
+string: measurementType
+string: measurementContext
+GlucosePoint[]: entries;
}
class GlucosePoint{
+number: time
+number: value
+string: comment
}
class Medication{
+string: medication
+number: dose
+string: doseUnit
+number: strength
+string: strengthUnit
+number: endDate
}
class Nutrition{
+string: food
+string: meal
+string: mealApproximation
+boolean: hasNutrition
+boolean: hasWater
+number: calories
+number: carbohydrates
+number: fat
+number: fiber
+number: protein
+number: sugar
+number: cholesterol
+number: saturatedFat
+number: sodium
+number: iron
+number: potassium
+number: vitaminA
+number: vitaminC
+number: vitaminD
+number: calcium
+number: glycemicLoad
+number: water
}
class Oxygen{
+number: spo2
+number: pulse
+OxygenPoint[]: entries;
}
class OxygenPoint{
+number: time
+number: spo2
+number: pulse
+string: comment
}
class Sleep{
+number: bedTime
+number: awakeTime
+number: sleepingMinutes
+number: awakenings
+number: efficiency
+number: settlingMinutes
+number: lightSleepMinutes
+number: l2SleepMinutes
+number: l3SleepMinutes
+number: deepSleepMinutes
+number: remSleepMinutes
+number: awakeMinutes
+number: avgHR
+number: avgRR
+number: hrvRmssdEvening
+number: hrvRmssdMorning
+SleepEvent[]: sleepEvents;
+SleepEvent[]: inferredSleepEvents;
+SleepPoint[]: sleepPoints;
}
class SleepEvent{
+string: type
+number: offsetMinutes
+number: durationMinutes
}
class SleepPoint{
+number: time
+number: heartRate
+number: respiratoryRate
+number: hrv_sdnn
}
class Temperature{
+number: temperature
+TemperaturePoint[]: entries;
}
class TemperaturePoint{
+number: time
+number: value
+string: comment
}
class Id{
+string: id
}
class HistoricSync{
+number: start
+number: end
+bool: email
}
class HistoricSyncStatus{
+string: status
+string: summary
+double: percentComplete
+number: queueTime
+number: startPeriod
+number: endPeriod
+number: currentStartPeriod
+number: currentEndPeriod
}
class ListSourceData{
+SyncItemListItem[]: items;
}
class ListSyncItems{
+SyncItem[]: items;
}
class SyncItemListItem{
+string: itemId
+number: date
+SyncItemLinks: links;
}
class SyncItemLinks{
+string: fit
+string: pwx
+string: tcx
+string: kml
+string: kmz
+string: csv
+string: gpx
}
class ListOfSourceData{
+SourceData[]: items;
}
class SourceDataItem{
+SourceData: item;
}
class SourceData{
+String: type
+string: id
+string: name
+string: context
+string: providerType
+string: connectionId
+bool: enabled
+bool: deprecated
+bool: ignoreDailyCalories
+string: lastError
+string: errorCode
+number: date
+string: identifier
+ProviderConfig: providerConfig
}
class ListDestinationTask{
+DestinationTask[]: items;
}
class DestinationTaskItem{
+DestinationTask: item;
}
class DestinationTask{
+string: type
+string: id
+string: name
+string: connectionId
+number: hour
+number: localHour
+string: lastError
+string: errorCode
+number: date
+bool: enabled
}
class SyncDestination{
+string: providerType
+string[]: skipDataFields
+bool: onlyIfNotOnDest
+string: identifier
+TaskType: taskType;
+ProviderConfig: providerConfig
}
class ProviderConfig{
+MapsProviderConfig: maps
+CsvProviderConfig: csv
}
class MapsProviderConfig{
+string: fileFormat
+string: filenameFormat
+string: path
}
class CsvProviderConfig{
+string: separator
+string: quote
+string: comment
+number: startingRow
+string: locale
+string: overrideTimezone
+bool: sumStepsPerDay
+bool: groupByDate
+bool: groupByMeal
+bool: sendSummaryData
+bool: appendToFile
+CsvColumnMapping[]: columns
}
class CsvColumnMapping{
+string: column
+number: index
+string: defaultValue
}
class EmailDestination{
+string: granularity
+string: granularityFriendly
+bool: removeDuplicates
+string: dataView
+string: fileFormat
+string: message
+string: otherEmail
}
class AlertDestination{
+string: alarmType
+number: alarmArgument
+string: reducer
+string: field
+string: comparison
+number: compareTo
+string: message
+string: otherEmail
+TaskType: taskType;
}
class ShoeDestination{
+number: shoes
+number: miles
+number: renotify
+number: sofar
+bool: useHoursInstead
+number: lastNotification
+number: LastNotificationMiles
}
class RefreshDestination{
}
class ReportPDFDestination{
+string: granularity
+string[]: reportIds
+string: message
+string: otherEmail
}
class ListPrintableReports{
+PrintableReport[]: items;
}
class PrintableReport{
+string: id
+string: name
}
class ListTaskType{
+TaskType[]: items;
}
class TaskType{
}
class ProviderList{
+Provider[]: providers;
}
class Provider{
+string: providerType
+string: name
+string: authentication
+bool: beta
+bool: notifications
+bool: cloudStorageMapsProvider
+bool: cloudStorageCsvProvider
+bool: reauthenticateAll
+bool: historicSync
+string[]: compatibleAuthentication
+string: faq
+string: notice
+string: noticeurl
+string: logo
+string: appurl
+bool: ActivityRead
+bool: ActivityWrite
+bool: AllergyRead
+bool: AllergyWrite
+bool: WeightRead
+bool: WeightWrite
+bool: BloodPressureRead
+bool: BloodPressureWrite
+bool: CholesterolRead
+bool: CholesterolWrite
+bool: ConditionRead
+bool: ConditionWrite
+bool: CycleTrackingRead
+bool: CycleTrackingWrite
+bool: ECGRead
+bool: ECGWrite
+bool: GlucoseRead
+bool: GlucoseWrite
+bool: MedicationRead
+bool: MedicationWrite
+bool: NutritionRead
+bool: NutritionWrite
+bool: OxygenRead
+bool: OxygenWrite
+bool: SleepRead
+bool: SleepWrite
+bool: TemperatureRead
+bool: TemperatureWrite
}
class Authentication{
+string: type
}
class AuthenticationUsernamePassword{
+string: username
+string: password
}
class AuthenticationUsernamePasswordKey{
+string: username
+string: password
+string: clientId
+string: clientSecret
}
class AuthenticationIdentifier{
+string: identifier
}
class AuthenticationOAuth{
+string: redirect
}
class AuthenticationOAuthReuse{
+string: id
}
class ProviderAuthentication{
+ProviderAuthenticationItem[]: providers;
}
class ProviderAuthenticationItem{
+string: name
+string: providerType
+ProviderAuthenticationKey[]: keys;
}
class ProviderAuthenticationKey{
+string: name
+string: id
}
class SyncStatusResults{
+SyncStatus[]: results;
}
class SyncStatus{
+boolean: success
+string: id
+string: type
+string: queueStatus
+string: status (deprecated, use queueStatus)
+string: state
+string: info
+number: upTo
+string: update
+string: errorCode
}
class Subscription{
+string: notificationKey
}
class Annotation{
+string: id
+string: dataField
+string: taskType
+number: date
+string: annotation
+number: created
+number: modified
}
class AnnotationList{
+Annotation[]: items;
}
class Notification{
+string: claim
+Notifications: notifications;
}
class Notifications{
+NotificationItem[]: items;
+NotificationErrorItem[]: errors;
}
class NotificationItem{
+string: notificationKey
+string: sourceId
+string: itemId
}
class NotificationErrorItem{
+string: notificationKey
+string: error
+string: providerType
+string: sourceId
+string: destinationId
}
class DescriptionResults{
+Description[]: results;
}
class Description{
+string: key
+string: description
+string: defaultReducer
+bool: isMeasuredType
+bool: metric
+bool: onlyReportSettings
+bool: postProcessed
+bool: isCumulative
+string: measurementType
+string: group
+string: groupDescription
+bool: requiresColumnMapping
+TaskType: taskType;
}
class LeaderboardList{
+Leaderboard[]: own;
+Leaderboard[]: pending;
+Leaderboard[]: accepted;
}
class LeaderboardUser{
+string: user
+string[]: users
+object: teams
}
class LeaderboardItem{
+Leaderboard: item;
}
class Leaderboard{
+string: id
+string: name
+string: description
+string: granularity
+number: userLimit
+bool: email
+bool: anyoneCanSignUp
+bool: chartLineGranularity
+bool: chartTableGranularity
+bool: chartClassicLeaderboard
+bool: relative
+number: groupGoal
+string[]: dataField
+number: startDate
+number: endDate
+string: scoringField
+object: scoringWeights
+string[]: scoringFields
+number: scoringDailyLimit
+string: rankBy
+bool: lowerWins
+bool: hideValues
+bool: teams
+string[]: teamNames
+bool: participantsChooseTeam
+bool: teamSum
+string[]: display
+bool: publicLeaderboard
}
class LeaderboardUserPreferences{
+bool: emailUpdate
}
class LeaderboardData{
+object: data
}
class DashboardRequest{
+bool: includeNotebook
+string[]: sourceIds
+integer[]: activityTypes
+number: customStart
+number: customEnd
+bool: removeDuplicates
+string: reducer
+string: finalReducer
+bool: treatNoDataAsZero
+bool: treatZeroAsNoData
+string: dataView
+string: granularity
+string: labeler
+string[]: dataFields
}
class SessionCreatedResponse{
+string: session
}
class DashboardResponse{
+bool: noData
+string[]: categories
+object[]: series
}
class ResearchUsersList{
+ResearchApiUser[]: users;
}
class ResearchApiUser{
+string: displayName
+string: accessToken
+string: refreshToken
+number: expires
}
%% non-generated
<<abstract>> SyncItem
SyncItem <|-- Activity
SyncItem <|-- Allergy
SyncItem <|-- BodyComposition
SyncItem <|-- BloodPressure
SyncItem <|-- Cholesterol
SyncItem <|-- Condition
SyncItem <|-- CycleTracking
SyncItem <|-- ECG
SyncItem <|-- Glucose
SyncItem <|-- Medication
SyncItem <|-- Oxygen
SyncItem <|-- Sleep
SyncItem <|-- Temperature
<<abstract>> DestinationTask
DestinationTask <|-- SyncDestination
DestinationTask <|-- EmailDestination
DestinationTask <|-- AlertDestination
DestinationTask <|-- ShoeDestination
DestinationTask <|-- RefreshDestination
DestinationTask <|-- ReportPDFDestination
<<abstract>> Authentication
Authentication <|-- AuthenticationUsernamePassword
Authentication <|-- AuthenticationUsernamePasswordKey
Authentication <|-- AuthenticationIdentifier
Authentication <|-- AuthenticationOAuth
Authentication <|-- AuthenticationOAuthReuse
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.